[Bf-blender-cvs] [7f35cc5] opensubdiv-modifier: OpenSubdiv: Add check for changing crease

Sergey Sharybin noreply at git.blender.org
Wed Aug 6 13:06:49 CEST 2014


Commit: 7f35cc52aea7d04954af6dc8a3b1646ca681774e
Author: Sergey Sharybin
Date:   Wed Aug 6 16:54:35 2014 +0600
Branches: opensubdiv-modifier
https://developer.blender.org/rB7f35cc52aea7d04954af6dc8a3b1646ca681774e

OpenSubdiv: Add check for changing crease

For now it re-creates topology from scratch, not sure we
can re-use previous topology at all in such cases. would
need to check with OpenSubdiv documentation.

This could make framerate of playback slower.

===================================================================

M	intern/opensubdiv/opensubdiv_capi.cc
M	intern/opensubdiv/opensubdiv_capi.h
M	source/blender/blenkernel/intern/CCGSubSurf.c

===================================================================

diff --git a/intern/opensubdiv/opensubdiv_capi.cc b/intern/opensubdiv/opensubdiv_capi.cc
index 9743908..e353801 100644
--- a/intern/opensubdiv/opensubdiv_capi.cc
+++ b/intern/opensubdiv/opensubdiv_capi.cc
@@ -316,7 +316,7 @@ static void get_partition_per_face(OsdHbrMesh &hmesh,
 }
 
 /* TODO(sergey): It might be good to have in evaluator_capi. */
-void openSubdiv_EvlauatorClearTags(
+void openSubdiv_evlauatorClearTags(
     OpenSubdiv_EvaluatorDescr *evaluator_descr)
 {
 	OsdUtilSubdivTopology *topology =
@@ -329,7 +329,7 @@ void openSubdiv_EvlauatorClearTags(
 	topology->tagData.stringArgs.clear();
 }
 
-void openSubdiv_EvaluatorSetEdgeSharpness(
+void openSubdiv_evaluatorSetEdgeSharpness(
     OpenSubdiv_EvaluatorDescr *evaluator_descr,
     int v0, int v1,
     float sharpness)
@@ -342,6 +342,15 @@ void openSubdiv_EvaluatorSetEdgeSharpness(
 	topology->tagData.AddCrease(indices, 2, &sharpness, 1);
 }
 
+const float *openSubdiv_evaluatorGetFloatTagArgs(
+    OpenSubdiv_EvaluatorDescr *evaluator_descr)
+{
+	OsdUtilSubdivTopology *topology =
+	    (OsdUtilSubdivTopology *)openSubdiv_getEvaluatorTopologyDescr(
+	        evaluator_descr);
+	return &topology->tagData.floatArgs[0];
+}
+
 struct OpenSubdiv_GLMesh *openSubdiv_createOsdGLMeshFromEvaluator(
     OpenSubdiv_EvaluatorDescr *evaluator_descr,
     int controller_type,
diff --git a/intern/opensubdiv/opensubdiv_capi.h b/intern/opensubdiv/opensubdiv_capi.h
index 8b6f759..e4ce48e 100644
--- a/intern/opensubdiv/opensubdiv_capi.h
+++ b/intern/opensubdiv/opensubdiv_capi.h
@@ -63,14 +63,17 @@ enum {
 	OPENSUBDIV_SCHEME_LOOP,
 };
 
-void openSubdiv_EvlauatorClearTags(
+void openSubdiv_evlauatorClearTags(
     OpenSubdiv_EvaluatorDescr *evaluator_descr);
 
-void openSubdiv_EvaluatorSetEdgeSharpness(
+void openSubdiv_evaluatorSetEdgeSharpness(
     OpenSubdiv_EvaluatorDescr *evaluator_descr,
     int v0, int v1,
     float sharpness);
 
+const float *openSubdiv_evaluatorGetFloatTagArgs(
+    OpenSubdiv_EvaluatorDescr *evaluator_descr);
+
 OpenSubdiv_GLMesh *openSubdiv_createOsdGLMeshFromEvaluator(
     OpenSubdiv_EvaluatorDescr *evaluator_descr,
     int controller_type,
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index d15862c..d6c0c62 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -2538,11 +2538,11 @@ static bool opensubdiv_initEvaluator(CCGSubSurf *ss)
 		}
 	}
 
-	openSubdiv_EvlauatorClearTags(ss->osd_evaluator);
+	openSubdiv_evlauatorClearTags(ss->osd_evaluator);
 	for (i = 0; i < ss->eMap->curSize; i++) {
 		CCGEdge *e = (CCGEdge *) ss->eMap->buckets[i];
 		for (; e; e = e->next) {
-			openSubdiv_EvaluatorSetEdgeSharpness(
+			openSubdiv_evaluatorSetEdgeSharpness(
 			        ss->osd_evaluator,
 			        e->v0->osd_index,
 			        e->v1->osd_index,
@@ -2631,6 +2631,8 @@ static bool check_topology_changed(CCGSubSurf *ss)
 	    num_nverts;
 	int *indices, *nverts;
 	int i, index, osd_face_index;
+	const float *float_args =
+	        openSubdiv_evaluatorGetFloatTagArgs(ss->osd_evaluator);
 
 	/* If compute type changes, need to re-create GL Mesh.
 	 * For now let's do evaluator as well, will optimize
@@ -2680,6 +2682,19 @@ static bool check_topology_changed(CCGSubSurf *ss)
 		}
 	}
 
+	/* For now we consider crease changes as a topology changes. */
+	/* TODO(sergey): Currently optimized for creases only, if more
+	 * tags are added this will break.
+	 */
+	for (i = 0, index = 0; i < ss->eMap->curSize; i++) {
+		CCGEdge *e = (CCGEdge *) ss->eMap->buckets[i];
+		for (; e; e = e->next, index++) {
+			if (e->crease != float_args[index]) {
+				return true;
+			}
+		}
+	}
+
 	return false;
 }




More information about the Bf-blender-cvs mailing list