[Bf-blender-cvs] [d810263] opensubdiv-modifier: OpenSubdiv: Move converters into a dedicated file in blenkernel

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


Commit: d81026340b8d04c71f3365a8849c627255bc93ff
Author: Sergey Sharybin
Date:   Wed Jul 15 16:59:16 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rBd81026340b8d04c71f3365a8849c627255bc93ff

OpenSubdiv: Move converters into a dedicated file in blenkernel

Those converters are likely to become bigger and will also need to implement
at least one more converter. Keeping all this code in a single file will be
rather messy.

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

M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/CCGSubSurf_intern.h
M	source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
A	source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c

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

diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 3527f68..070be87 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -63,6 +63,7 @@ set(SRC
 	intern/CCGSubSurf.c
 	intern/CCGSubSurf_legacy.c
 	intern/CCGSubSurf_opensubdiv.c
+	intern/CCGSubSurf_opensubdiv_converter.c
 	intern/CCGSubSurf_util.c
 	intern/DerivedMesh.c
 	intern/action.c
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_intern.h b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
index 0f3adb2..dc5d9a1 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_intern.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
@@ -263,6 +263,15 @@ void ccgSubSurf__sync_legacy(CCGSubSurf *ss);
 
 void ccgSubSurf__sync_opensubdiv(CCGSubSurf *ss);
 
+/* * CCGSubSurf_opensubdiv_converter.c * */
+
+struct OpenSubdiv_Converter;
+
+void ccgSubSurf_converter_setup_from_derivedmesh(
+        CCGSubSurf *ss,
+        struct DerivedMesh *dm,
+        struct OpenSubdiv_Converter *converter);
+
 /* * CCGSubSurf_util.c * */
 
 #ifdef DUMP_RESULT_GRIDS
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
index 2f5179a..45fa45e 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
@@ -44,229 +44,6 @@
 
 #define OSD_LOG if (false) printf
 
-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)
-{
-	DerivedMesh *dm = converter->user_data;
-	return dm->getNumPolys(dm);
-}
-
-static int conv_dm_get_num_edges(const OpenSubdiv_Converter *converter)
-{
-	DerivedMesh *dm = converter->user_data;
-	return dm->getNumEdges(dm);
-}
-
-static int conv_dm_get_num_verts(const OpenSubdiv_Converter *converter)
-{
-	DerivedMesh *dm = converter->user_data;
-	return dm->getNumVerts(dm);
-}
-
-static int conv_dm_get_num_face_verts(const OpenSubdiv_Converter *converter,
-                                      int face)
-{
-	DerivedMesh *dm = converter->user_data;
-	const MPoly *mp = dm->getPolyArray(dm);
-	const MPoly *mpoly = &mp[face];
-	return mpoly->totloop;
-}
-
-static void conv_dm_get_face_verts(const OpenSubdiv_Converter *converter,
-                                   int face,
-                                   int *face_verts)
-{
-	DerivedMesh *dm = converter->user_data;
-	const MLoop *ml = dm->getLoopArray(dm);
-	const MPoly *mp = dm->getPolyArray(dm);
-	const MPoly *mpoly = &mp[face];
-	int loop;
-	for(loop = 0; loop < mpoly->totloop; loop++) {
-		face_verts[loop] = ml[mpoly->loopstart + loop].v;
-	}
-}
-
-static void conv_dm_get_face_edges(const OpenSubdiv_Converter *converter,
-                                   int face,
-                                   int *face_edges)
-{
-	DerivedMesh *dm = converter->user_data;
-	const MLoop *ml = dm->getLoopArray(dm);
-	const MPoly *mp = dm->getPolyArray(dm);
-	const MPoly *mpoly = &mp[face];
-	int loop;
-	for(loop = 0; loop < mpoly->totloop; loop++) {
-		face_edges[loop] = ml[mpoly->loopstart + loop].e;
-	}
-}
-
-static void conv_dm_get_edge_verts(const OpenSubdiv_Converter *converter,
-                                   int edge,
-                                   int *edge_verts)
-{
-	DerivedMesh *dm = converter->user_data;
-	const MEdge *me = dm->getEdgeArray(dm);
-	const MEdge *medge = &me[edge];
-	edge_verts[0] = medge->v1;
-	edge_verts[1] = medge->v2;
-}
-
-static int conv_dm_get_num_edge_faces(const OpenSubdiv_Converter *converter,
-                                      int edge)
-{
-	DerivedMesh *dm = converter->user_data;
-	const MLoop *ml = dm->getLoopArray(dm);
-	const MPoly *mp = dm->getPolyArray(dm);
-	int num = 0, poly;
-	for (poly = 0; poly < dm->getNumPolys(dm); poly++) {
-		const MPoly *mpoly = &mp[poly];
-		int loop;
-		for (loop = 0; loop < mpoly->totloop; loop++) {
-			const MLoop *mloop = &ml[mpoly->loopstart + loop];
-			if (mloop->e == edge) {
-				++num;
-				break;
-			}
-		}
-	}
-	return num;
-}
-
-static void conv_dm_get_edge_faces(const OpenSubdiv_Converter *converter,
-                                   int edge,
-                                   int *edge_faces)
-{
-	DerivedMesh *dm = converter->user_data;
-	const MLoop *ml = dm->getLoopArray(dm);
-	const MPoly *mp = dm->getPolyArray(dm);
-	int num = 0, poly;
-	for (poly = 0; poly < dm->getNumPolys(dm); poly++) {
-		const MPoly *mpoly = &mp[poly];
-		int loop;
-		for (loop = 0; loop < mpoly->totloop; loop++) {
-			const MLoop *mloop = &ml[mpoly->loopstart + loop];
-			if (mloop->e == edge) {
-				edge_faces[num++] = poly;
-				break;
-			}
-		}
-	}
-}
-
-static int conv_dm_get_num_vert_edges(const OpenSubdiv_Converter *converter,
-                                      int vert)
-{
-	DerivedMesh *dm = converter->user_data;
-	const MEdge *me = dm->getEdgeArray(dm);
-	int num = 0, edge;
-	for (edge = 0; edge < dm->getNumEdges(dm); edge++) {
-		const MEdge *medge = &me[edge];
-		if (medge->v1 == vert || medge->v2 == vert) {
-			++num;
-		}
-	}
-	return num;
-}
-
-static void conv_dm_get_vert_edges(const OpenSubdiv_Converter *converter,
-                                   int vert,
-                                   int *vert_edges)
-{
-	DerivedMesh *dm = converter->user_data;
-	const MEdge *me = dm->getEdgeArray(dm);
-	int num = 0, edge;
-	for (edge = 0; edge < dm->getNumEdges(dm); edge++) {
-		const MEdge *medge = &me[edge];
-		if (medge->v1 == vert || medge->v2 == vert) {
-			vert_edges[num++] = edge;
-		}
-	}
-}
-
-static int conv_dm_get_num_vert_faces(const OpenSubdiv_Converter *converter,
-                                      int vert)
-{
-	DerivedMesh *dm = converter->user_data;
-	const MLoop *ml = dm->getLoopArray(dm);
-	const MPoly *mp = dm->getPolyArray(dm);
-	int num = 0, poly;
-	for (poly = 0; poly < dm->getNumPolys(dm); poly++) {
-		const MPoly *mpoly = &mp[poly];
-		int loop;
-		for (loop = 0; loop < mpoly->totloop; loop++) {
-			const MLoop *mloop = &ml[mpoly->loopstart + loop];
-			if (mloop->v == vert) {
-				++num;
-				break;
-			}
-		}
-	}
-	return num;
-}
-
-static void conv_dm_get_vert_faces(const OpenSubdiv_Converter *converter,
-                                   int vert,
-                                   int *vert_faces)
-{
-	DerivedMesh *dm = converter->user_data;
-	const MLoop *ml = dm->getLoopArray(dm);
-	const MPoly *mp = dm->getPolyArray(dm);
-	int num = 0, poly;
-	for (poly = 0; poly < dm->getNumPolys(dm); poly++) {
-		const MPoly *mpoly = &mp[poly];
-		int loop;
-		for (loop = 0; loop < mpoly->totloop; loop++) {
-			const MLoop *mloop = &ml[mpoly->loopstart + loop];
-			if (mloop->v == vert) {
-				vert_faces[num++] = poly;
-				break;
-			}
-		}
-	}
-}
-
-static void converter_setup_from_derivedmesh(
-        CCGSubSurf *ss,
-        DerivedMesh *dm,
-        OpenSubdiv_Converter *converter)
-{
-	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;
-	converter->get_num_verts = conv_dm_get_num_verts;
-
-	converter->get_num_face_verts = conv_dm_get_num_face_verts;
-	converter->get_face_verts = conv_dm_get_face_verts;
-	converter->get_face_edges = conv_dm_get_face_edges;
-
-	converter->get_edge_verts = conv_dm_get_edge_verts;
-	converter->get_num_edge_faces = conv_dm_get_num_edge_faces;
-	converter->get_edge_faces = conv_dm_get_edge_faces;
-
-	converter->get_num_vert_edges = conv_dm_get_num_vert_edges;
-	converter->get_vert_edges = conv_dm_get_vert_edges;
-	converter->get_num_vert_faces = conv_dm_get_num_vert_faces;
-	converter->get_vert_faces = conv_dm_get_vert_faces;
-
-	converter->user_data = dm;
-}
-
 static bool ccgSubSurf_checkDMTopologyChanged(DerivedMesh *dm, DerivedMesh *dm2)
 {
 	const int num_verts = dm->getNumVerts(dm);
@@ -385,7 +162,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, ss->dm, &converter);
+		ccgSubSurf_converter_setup_from_derivedmesh(ss, ss->dm, &converter);
 		topology_refiner = openSubdiv_createTopologyRefinerDescr(&converter);
 		ss->osd_mesh = openSubdiv_createOsdGLMeshFromTopologyRefiner(
 		        topology_refiner,
@@ -586,7 +363,7 @@ static bool opensubdiv_createEvaluator(CCGSubSurf *ss)
 {
 	OpenSubdiv_Converter converter;
 	OpenSubdiv_TopologyRefinerDescr *topology_refiner;
-	converter_setup_from_derivedmesh(ss, ss->dm, &converter);
+	ccgSubSurf_converter_setup_from_derivedmesh(ss, ss->dm, &converter);
 	topology_refiner = openSubdiv_createTopologyRefinerDescr(&converter);
 	ss->osd_compute = U.opensubdiv_compute_type;
 	ss->osd_evaluator =
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
new file mode 100644
index 0000000..2194264
--- /dev/null
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
@@ -0,0 +1,271 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to th

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list