[Bf-blender-cvs] [04499af] opensubdiv-modifier: OpenSubdiv: Bring back topology checker
Sergey Sharybin
noreply at git.blender.org
Sat Jul 11 20:02:30 CEST 2015
Commit: 04499afd59f54a2e842be3957dde1840c94424c0
Author: Sergey Sharybin
Date: Sat Jul 11 19:02:33 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rB04499afd59f54a2e842be3957dde1840c94424c0
OpenSubdiv: Bring back topology checker
It's now implemented for derived meshes, still needs to support crease checks.
===================================================================
M source/blender/blenkernel/intern/CCGSubSurf.c
===================================================================
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index e019a3a..248691f 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -2312,10 +2312,45 @@ static void ccgSubSurf__dumpCoords(CCGSubSurf *ss)
# define OSD_LOG if (false) printf
+static bool ccgSubSurf_checkDMTopologyChanged(DerivedMesh *dm, DerivedMesh *dm2)
+{
+ const int num_verts = dm->getNumVerts(dm);
+ const int num_polys = dm->getNumPolys(dm);
+ const MPoly *mpoly = dm->getPolyArray(dm);
+ const MPoly *mpoly2 = dm2->getPolyArray(dm2);
+ const MLoop *mloop = dm->getLoopArray(dm);
+ const MLoop *mloop2 = dm2->getLoopArray(dm2);
+ int poly_index;
+
+ /* Quick tests based on the number of verts and facces. */
+ if (num_verts != dm2->getNumVerts(dm2) ||
+ num_polys != dm2->getNumPolys(dm2))
+ {
+ return true;
+ }
+
+ /* Rather slow check for faces topology change. */
+ for (poly_index = 0; poly_index < num_polys; poly_index++, mpoly++, mpoly2++) {
+ int S;
+ if (mpoly->totloop != mpoly2->totloop) {
+ return true;
+ }
+ for (S = 0; S < mpoly->totloop; ++S) {
+ if (mloop[mpoly->loopstart + S].v != mloop2[mpoly2->loopstart + S].v) {
+ return true;
+ }
+ }
+ }
+ /* TODO(sergey): Check whether crease changed. */
+ return false;
+}
+
void ccgSubSurf_setDerivedMesh(CCGSubSurf *ss, DerivedMesh *dm)
{
if (ss->dm != NULL) {
- /* TODO(sergey): Add topology comparison here. */
+ if (ccgSubSurf_checkDMTopologyChanged(ss->dm, dm)) {
+ ss->osd_topology_changed = true;
+ }
ss->dm->needsFree = 1;
ss->dm->release(ss->dm);
}
More information about the Bf-blender-cvs
mailing list