[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