[Bf-blender-cvs] [ea9e815] opensubdiv-modifier: OpenSubdiv: Bring back simple subdivision scheme

Sergey Sharybin noreply at git.blender.org
Thu Jul 16 12:56:04 CEST 2015


Commit: ea9e8158628ffa2a0c748756ab44a8ebd031cc8d
Author: Sergey Sharybin
Date:   Wed Jul 15 16:51:40 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rBea9e8158628ffa2a0c748756ab44a8ebd031cc8d

OpenSubdiv: Bring back simple subdivision scheme

Uses OpenSubdiv on GPU but on CPU it falls back to legacy code due to
some issues in the OpenSubdiv's evaluator which doesn't work for bilinear
subdivision type.

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

M	intern/opensubdiv/opensubdiv_evaluator_capi.cc
M	source/blender/blenkernel/intern/CCGSubSurf.c
M	source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c

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

diff --git a/intern/opensubdiv/opensubdiv_evaluator_capi.cc b/intern/opensubdiv/opensubdiv_evaluator_capi.cc
index 8aa1c88..3179b79 100644
--- a/intern/opensubdiv/opensubdiv_evaluator_capi.cc
+++ b/intern/opensubdiv/opensubdiv_evaluator_capi.cc
@@ -524,6 +524,10 @@ OpenSubdiv_EvaluatorDescr *openSubdiv_createEvaluatorDescr(
 
 	/* Apply adaptive refinement to the mesh so that we can use the
 	 * limit evaluation API features.
+	 *
+	 * TODO(sergey): Once OpenSubdiv supports uniform meshes in limit
+	 * evlauation we need to switch to uniform here, which will match
+	 * original Blender subsurf.
 	 */
 	TopologyRefiner::AdaptiveOptions options(subsurf_level);
 	refiner->RefineAdaptive(options);
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 045d6ea..2725b66 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -848,7 +848,10 @@ CCGError ccgSubSurf_syncFace(CCGSubSurf *ss, CCGFaceHDL fHDL, int numVerts, CCGV
 static void ccgSubSurf__sync(CCGSubSurf *ss)
 {
 #ifdef WITH_OPENSUBDIV
-	if (true) {
+	/* TODO(sergey): This is because OSD evaluator does not support
+	 * bilinear subdivision scheme at this moment.
+	 */
+	if (ss->meshIFC.simpleSubdiv == false || ss->skip_grids == true) {
 		ccgSubSurf__sync_opensubdiv(ss);
 	}
 	else
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
index 47b01c0..2f5179a 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
@@ -44,12 +44,18 @@
 
 #define OSD_LOG if (false) printf
 
-static OpenSubdiv_SchemeType conv_dm_get_type(
+static OpenSubdiv_SchemeType conv_dm_get_catmark_type(
         const OpenSubdiv_Converter *UNUSED(converter))
 {
 	return OSD_SCHEME_CATMARK;
 }
 
+static OpenSubdiv_SchemeType conv_dm_get_bilinear_type(
+        const OpenSubdiv_Converter *UNUSED(converter))
+{
+	return OSD_SCHEME_BILINEAR;
+}
+
 /* TODO(sergey): Move converters API to own file for clearity of code. */
 static int conv_dm_get_num_faces(const OpenSubdiv_Converter *converter)
 {
@@ -232,10 +238,14 @@ static void conv_dm_get_vert_faces(const OpenSubdiv_Converter *converter,
 }
 
 static void converter_setup_from_derivedmesh(
+        CCGSubSurf *ss,
         DerivedMesh *dm,
         OpenSubdiv_Converter *converter)
 {
-	converter->get_type = conv_dm_get_type;
+	if (ss->meshIFC.simpleSubdiv)
+		converter->get_type = conv_dm_get_bilinear_type;
+	else
+		converter->get_type = conv_dm_get_catmark_type;
 
 	converter->get_num_faces = conv_dm_get_num_faces;
 	converter->get_num_edges = conv_dm_get_num_edges;
@@ -375,7 +385,7 @@ bool ccgSubSurf_prepareGLMesh(CCGSubSurf *ss, bool use_osd_glsl)
 	if (ss->osd_mesh == NULL) {
 		OpenSubdiv_Converter converter;
 		OpenSubdiv_TopologyRefinerDescr *topology_refiner;
-		converter_setup_from_derivedmesh(ss->dm, &converter);
+		converter_setup_from_derivedmesh(ss, ss->dm, &converter);
 		topology_refiner = openSubdiv_createTopologyRefinerDescr(&converter);
 		ss->osd_mesh = openSubdiv_createOsdGLMeshFromTopologyRefiner(
 		        topology_refiner,
@@ -576,7 +586,7 @@ static bool opensubdiv_createEvaluator(CCGSubSurf *ss)
 {
 	OpenSubdiv_Converter converter;
 	OpenSubdiv_TopologyRefinerDescr *topology_refiner;
-	converter_setup_from_derivedmesh(ss->dm, &converter);
+	converter_setup_from_derivedmesh(ss, ss->dm, &converter);
 	topology_refiner = openSubdiv_createTopologyRefinerDescr(&converter);
 	ss->osd_compute = U.opensubdiv_compute_type;
 	ss->osd_evaluator =




More information about the Bf-blender-cvs mailing list