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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to