Faster way to 'weld' geometry?
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 10/08/2004 at 11:45, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 8.503
Platform: Windows ;
Language(s) : C++ ;---------
Here is the method that I'm using to 'weld' two PolygonSelections together (no change of vertices - just reassigning indices of duplicate points) :// Weld Geometry (remove seams) void PoserCharacter::WeldGeometry(void) { ParentChild *w; PoserBase *c, *p; LONG seg,i,a,b,seg2,j,a2,b2; LONG *fi, *fj, *fid, *fjd; Polygon* polys; Vector* verts; BaseSelect *bs, *bs2; SelectionTag *group, *group2; polys = (static_cast<PolygonObject*>baseObject)->GetPolygon(); verts = (static_cast<PolygonObject*>baseObject)->GetPoint(); for (w = weld; w != NULL; w = (ParentChild* )w->GetNext()) { if ((c = w->GetChild()) == NULL) continue; if ((group = c->GetGroup()) == NULL) continue; if ((p = w->GetParent()) == NULL) continue; if ((group2 = p->GetGroup()) == NULL) continue; bs = group->GetBaseSelect(); bs2 = group2->GetBaseSelect(); seg=0; while (bs->GetRange(seg++,&a;,&b;)) { for (i=a; i<=b; ++i) { seg2=0; while (bs2->GetRange(seg2++, &a2;, &b2;)) { for (j = a2; j<=b2; ++j) { for (fi = &(polys _.a), fid = fi+5; fi != fid; fi++) { for (fj = &(polys[j].a), fjd = fj+5; fj != fjd; fj++) { if ((*fi != *fj) && (verts[*fi] == verts[*fj])) *fj = *fi; } } } } } } } }
Is there a better way to do this?
Thanks,
Robert -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 10/08/2004 at 12:19, xxxxxxxx wrote:
Ahhhh, shucks. Nevermind again. Found a faster solution, just required some pressure waiting for a response to get it.
So, instead of going through every BaseSelect for every BaseSelect, I'm creating a substitution array for the vertices, then when one is encountered in a BaseSelect, the substitution replaces the value:
void PoserCharacter::WeldGeometry(void) { LONG seg, i, a, b; LONG *fi, *fid, *subs; Polygon* polys; Vector* verts; BaseSelect *bs; SelectionTag *group; ParentChild *w; PoserBase *c; polys = ((PolygonObject* )baseObject)->GetPolygon(); verts = ((PolygonObject* )baseObject)->GetPoint(); seg = ((PolygonObject* )baseObject)->GetPointCount(); // Assign substitutions if vertices are same if ((subs = (LONG* )GeAlloc(sizeof(LONG)*seg)) == NULL) throw ErrorException(ERROR_MEMORY, NULL); for (i = 0; i < seg; i++) subs _= -1; for (i = 0; i < seg; i++) { for (a = i+1; a < seg; a++) { if ((subs[a] < 0) && (verts[a] == verts _)) subs[a] = i; } } for (w = weld; w != NULL; w = (ParentChild* )w->GetNext()) { if ((c = w->GetChild()) == NULL) continue; if ((group = c->GetGroup()) == NULL) continue; bs = group->GetBaseSelect(); seg=0; while (bs->GetRange(seg++,&a;,&b;)) { for (i=a; i<=b; ++i) { for (fi = &(polys _.a), fid = fi+5; fi != fid; fi++) { if (subs[*fi] != -1) *fi = subs[*fi]; } } } } GeFree(subs); }
Robert