forked from blender/blender
index-of-nearest-104619 #2
@ -62,98 +62,8 @@ using blender::MutableSpan;
|
|||||||
using blender::Span;
|
using blender::Span;
|
||||||
using blender::StringRefNull;
|
using blender::StringRefNull;
|
||||||
|
|
||||||
/* Define for cases when you want extra validation of mesh
|
|
||||||
* after certain modifications.
|
|
||||||
*/
|
|
||||||
// #undef VALIDATE_MESH
|
|
||||||
|
|
||||||
#ifdef VALIDATE_MESH
|
|
||||||
# define ASSERT_IS_VALID_MESH(mesh) \
|
|
||||||
(BLI_assert((mesh == nullptr) || (BKE_mesh_is_valid(mesh) == true)))
|
|
||||||
#else
|
|
||||||
# define ASSERT_IS_VALID_MESH(mesh)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static CLG_LogRef LOG = {"bke.mesh_convert"};
|
static CLG_LogRef LOG = {"bke.mesh_convert"};
|
||||||
|
|
||||||
static void poly_edgehash_insert(EdgeHash *ehash, const Span<int> poly_verts)
|
|
||||||
{
|
|
||||||
int i = poly_verts.size();
|
|
||||||
|
|
||||||
int next = 0; /* first loop */
|
|
||||||
int poly_corner = (i - 1); /* last loop */
|
|
||||||
|
|
||||||
while (i-- != 0) {
|
|
||||||
BLI_edgehash_reinsert(ehash, poly_verts[poly_corner], poly_verts[next], nullptr);
|
|
||||||
|
|
||||||
poly_corner = next;
|
|
||||||
next++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Specialized function to use when we _know_ existing edges don't overlap with poly edges.
|
|
||||||
*/
|
|
||||||
static void make_edges_mdata_extend(Mesh &mesh)
|
|
||||||
{
|
|
||||||
int totedge = mesh.totedge;
|
|
||||||
|
|
||||||
const blender::OffsetIndices polys = mesh.polys();
|
|
||||||
const Span<int> corner_verts = mesh.corner_verts();
|
|
||||||
MutableSpan<int> corner_edges = mesh.corner_edges_for_write();
|
|
||||||
|
|
||||||
const int eh_reserve = max_ii(totedge, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(mesh.totpoly));
|
|
||||||
EdgeHash *eh = BLI_edgehash_new_ex(__func__, eh_reserve);
|
|
||||||
|
|
||||||
for (const int i : polys.index_range()) {
|
|
||||||
poly_edgehash_insert(eh, corner_verts.slice(polys[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
const int totedge_new = BLI_edgehash_len(eh);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
/* ensure that there's no overlap! */
|
|
||||||
if (totedge_new) {
|
|
||||||
for (const blender::int2 &edge : mesh.edges()) {
|
|
||||||
BLI_assert(BLI_edgehash_haskey(eh, edge[0], edge[1]) == false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (totedge_new) {
|
|
||||||
/* The only layer should be edges, so no other layers need to be initialized. */
|
|
||||||
BLI_assert(mesh.edata.totlayer == 1);
|
|
||||||
CustomData_realloc(&mesh.edata, totedge, totedge + totedge_new);
|
|
||||||
mesh.totedge += totedge_new;
|
|
||||||
MutableSpan<blender::int2> edges = mesh.edges_for_write();
|
|
||||||
blender::int2 *edge = &edges[totedge];
|
|
||||||
|
|
||||||
EdgeHashIterator *ehi;
|
|
||||||
uint e_index = totedge;
|
|
||||||
for (ehi = BLI_edgehashIterator_new(eh); BLI_edgehashIterator_isDone(ehi) == false;
|
|
||||||
BLI_edgehashIterator_step(ehi), ++edge, e_index++) {
|
|
||||||
BLI_edgehashIterator_getKey(ehi, &(*edge)[0], &(*edge)[1]);
|
|
||||||
BLI_edgehashIterator_setValue(ehi, POINTER_FROM_UINT(e_index));
|
|
||||||
}
|
|
||||||
BLI_edgehashIterator_free(ehi);
|
|
||||||
|
|
||||||
for (const int i : polys.index_range()) {
|
|
||||||
const IndexRange poly = polys[i];
|
|
||||||
int corner = poly.start();
|
|
||||||
int corner_prev = poly.start() + (poly.size() - 1);
|
|
||||||
int j;
|
|
||||||
for (j = 0; j < poly.size(); j++, corner++) {
|
|
||||||
/* lookup hashed edge index */
|
|
||||||
corner_edges[corner_prev] = POINTER_AS_UINT(
|
|
||||||
BLI_edgehash_lookup(eh, corner_verts[corner_prev], corner_verts[corner]));
|
|
||||||
corner_prev = corner;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BLI_edgehash_free(eh, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispbase)
|
static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispbase)
|
||||||
{
|
{
|
||||||
using namespace blender::bke;
|
using namespace blender::bke;
|
||||||
@ -393,7 +303,7 @@ static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispba
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (totpoly) {
|
if (totpoly) {
|
||||||
make_edges_mdata_extend(*mesh);
|
BKE_mesh_calc_edges(mesh, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
material_indices.finish();
|
material_indices.finish();
|
||||||
|
Loading…
Reference in New Issue
Block a user