[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