[Bf-blender-cvs] [8f4b99f] opensubdiv-modifier: OpenSubdiv: Initial support of crease

Sergey Sharybin noreply at git.blender.org
Wed Aug 6 12:25:17 CEST 2014


Commit: 8f4b99f2e1bce453cd4b90873d78146d4e2e8a1d
Author: Sergey Sharybin
Date:   Wed Aug 6 16:18:40 2014 +0600
Branches: opensubdiv-modifier
https://developer.blender.org/rB8f4b99f2e1bce453cd4b90873d78146d4e2e8a1d

OpenSubdiv: Initial support of crease

For now only works for display viewport and it's not dynamically
updating.

Dynamic update will be solved from Blender side, but rendering
is more tricky because it uses evaluator API which seems to
ignore crease tags currently.

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

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 9b4c0aa..9743908 100644
--- a/intern/opensubdiv/opensubdiv_capi.cc
+++ b/intern/opensubdiv/opensubdiv_capi.cc
@@ -315,6 +315,33 @@ static void get_partition_per_face(OsdHbrMesh &hmesh,
 	}
 }
 
+/* TODO(sergey): It might be good to have in evaluator_capi. */
+void openSubdiv_EvlauatorClearTags(
+    OpenSubdiv_EvaluatorDescr *evaluator_descr)
+{
+	OsdUtilSubdivTopology *topology =
+	    (OsdUtilSubdivTopology *)openSubdiv_getEvaluatorTopologyDescr(
+	        evaluator_descr);
+
+	topology->tagData.tags.clear();
+	topology->tagData.intArgs.clear();
+	topology->tagData.floatArgs.clear();
+	topology->tagData.stringArgs.clear();
+}
+
+void openSubdiv_EvaluatorSetEdgeSharpness(
+    OpenSubdiv_EvaluatorDescr *evaluator_descr,
+    int v0, int v1,
+    float sharpness)
+{
+	OsdUtilSubdivTopology *topology =
+	    (OsdUtilSubdivTopology *)openSubdiv_getEvaluatorTopologyDescr(
+	        evaluator_descr);
+	int indices[] = {v0, v1};
+
+	topology->tagData.AddCrease(indices, 2, &sharpness, 1);
+}
+
 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 4727cfd..8b6f759 100644
--- a/intern/opensubdiv/opensubdiv_capi.h
+++ b/intern/opensubdiv/opensubdiv_capi.h
@@ -63,6 +63,14 @@ enum {
 	OPENSUBDIV_SCHEME_LOOP,
 };
 
+void openSubdiv_EvlauatorClearTags(
+    OpenSubdiv_EvaluatorDescr *evaluator_descr);
+
+void openSubdiv_EvaluatorSetEdgeSharpness(
+    OpenSubdiv_EvaluatorDescr *evaluator_descr,
+    int v0, int v1,
+    float sharpness);
+
 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 c196ac6..d15862c 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -2538,6 +2538,18 @@ static bool opensubdiv_initEvaluator(CCGSubSurf *ss)
 		}
 	}
 
+	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(
+			        ss->osd_evaluator,
+			        e->v0->osd_index,
+			        e->v1->osd_index,
+			        e->crease);
+		}
+	}
+
 	/* Do feature adaptive refinement and get ready to update
 	 * coarse points and evaluate.
 	 */




More information about the Bf-blender-cvs mailing list