[Bf-blender-cvs] [d8907b9] opensubdiv-modifier: OpenSubdiv: Do proper weigting of sharpness for GPU backed

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


Commit: d8907b96537e7b29935eca99387f6bcac003921a
Author: Sergey Sharybin
Date:   Thu Jul 16 12:47:43 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rBd8907b96537e7b29935eca99387f6bcac003921a

OpenSubdiv: Do proper weigting of sharpness for GPU backed

CPU evaluation still needs some tweaks, but before we can do compatible
creasing we need to switch to uniform refinement.

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

M	intern/opensubdiv/opensubdiv_converter_capi.h
M	source/blender/blenkernel/intern/CCGSubSurf_intern.h
M	source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
M	source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c

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

diff --git a/intern/opensubdiv/opensubdiv_converter_capi.h b/intern/opensubdiv/opensubdiv_converter_capi.h
index b39d18b..df2fb57 100644
--- a/intern/opensubdiv/opensubdiv_converter_capi.h
+++ b/intern/opensubdiv/opensubdiv_converter_capi.h
@@ -83,6 +83,7 @@ typedef struct OpenSubdiv_Converter {
 	                       int vert,
 	                       int *vert_faces);
 
+	void (*free_user_data)(const OpenSubdiv_Converter *converter);
 	void *user_data;
 } OpenSubdiv_Converter;
 
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_intern.h b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
index 372cdec..95ea914 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_intern.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
@@ -316,6 +316,9 @@ void ccgSubSurf_converter_setup_from_ccg(
         CCGSubSurf *ss,
         struct OpenSubdiv_Converter *converter);
 
+void ccgSubSurf_converter_free(
+        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 df10c55..cf937a7 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
@@ -129,6 +129,7 @@ static bool compare_osd_derivedmesh_topology(CCGSubSurf *ss, DerivedMesh *dm)
 {
 	const OpenSubdiv_TopologyRefinerDescr *topology_refiner;
 	OpenSubdiv_Converter converter;
+	bool result;
 	if (ss->osd_mesh == NULL && ss->osd_topology_refiner == NULL) {
 		return true;
 	}
@@ -139,8 +140,10 @@ static bool compare_osd_derivedmesh_topology(CCGSubSurf *ss, DerivedMesh *dm)
 		topology_refiner = openSubdiv_getGLMeshTopologyRefiner(ss->osd_mesh);
 	}
 	ccgSubSurf_converter_setup_from_derivedmesh(ss, dm, &converter);
-	return openSubdiv_topologyRefnerCompareConverter(topology_refiner,
-	                                                 &converter);
+	result = openSubdiv_topologyRefnerCompareConverter(topology_refiner,
+	                                                   &converter);
+	ccgSubSurf_converter_free(&converter);
+	return result;
 }
 
 static bool opensubdiv_is_topology_changed(CCGSubSurf *ss, DerivedMesh *dm)
@@ -435,6 +438,7 @@ static bool opensubdiv_createEvaluator(CCGSubSurf *ss)
 	OpenSubdiv_TopologyRefinerDescr *topology_refiner;
 	ccgSubSurf_converter_setup_from_ccg(ss, &converter);
 	topology_refiner = openSubdiv_createTopologyRefinerDescr(&converter);
+	ccgSubSurf_converter_free(&converter);
 	ss->osd_evaluator =
 	        openSubdiv_createEvaluatorDescr(topology_refiner,
 	                                        ss->subdivLevels);
@@ -807,6 +811,7 @@ void ccgSubSurf_prepareTopologyRefiner(CCGSubSurf *ss, DerivedMesh *dm)
 		ccgSubSurf_converter_setup_from_derivedmesh(ss, dm, &converter);
 		/* TODO(sergey): Remove possibly previously allocated refiner. */
 		ss->osd_topology_refiner = openSubdiv_createTopologyRefinerDescr(&converter);
+		ccgSubSurf_converter_free(&converter);
 	}
 
 	/* Update number of grids, needed for thinhs liek final faces
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
index 6400490..b7d065a 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
@@ -44,44 +44,51 @@
  * Converter from DerivedMesh.
  */
 
+typedef struct ConvDMStorage {
+	CCGSubSurf *ss;
+	DerivedMesh *dm;
+} ConvDMStorage;
+
 /* TODO(sergey): Optimize this by using mesh_map, so we don't
  * do full mesh lookup for every geometry primitive.
  */
 
-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))
+static OpenSubdiv_SchemeType conv_dm_get_type(
+        const OpenSubdiv_Converter *converter)
 {
-	return OSD_SCHEME_BILINEAR;
+	ConvDMStorage *storage = converter->user_data;
+	if (storage->ss->meshIFC.simpleSubdiv)
+		return OSD_SCHEME_BILINEAR;
+	else
+		return OSD_SCHEME_CATMARK;
 }
 
 static int conv_dm_get_num_faces(const OpenSubdiv_Converter *converter)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	return dm->getNumPolys(dm);
 }
 
 static int conv_dm_get_num_edges(const OpenSubdiv_Converter *converter)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	return dm->getNumEdges(dm);
 }
 
 static int conv_dm_get_num_verts(const OpenSubdiv_Converter *converter)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	return dm->getNumVerts(dm);
 }
 
 static int conv_dm_get_num_face_verts(const OpenSubdiv_Converter *converter,
                                       int face)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	const MPoly *mp = dm->getPolyArray(dm);
 	const MPoly *mpoly = &mp[face];
 	return mpoly->totloop;
@@ -91,7 +98,8 @@ static void conv_dm_get_face_verts(const OpenSubdiv_Converter *converter,
                                    int face,
                                    int *face_verts)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	const MLoop *ml = dm->getLoopArray(dm);
 	const MPoly *mp = dm->getPolyArray(dm);
 	const MPoly *mpoly = &mp[face];
@@ -105,7 +113,8 @@ static void conv_dm_get_face_edges(const OpenSubdiv_Converter *converter,
                                    int face,
                                    int *face_edges)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	const MLoop *ml = dm->getLoopArray(dm);
 	const MPoly *mp = dm->getPolyArray(dm);
 	const MPoly *mpoly = &mp[face];
@@ -119,7 +128,8 @@ static void conv_dm_get_edge_verts(const OpenSubdiv_Converter *converter,
                                    int edge,
                                    int *edge_verts)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	const MEdge *me = dm->getEdgeArray(dm);
 	const MEdge *medge = &me[edge];
 	edge_verts[0] = medge->v1;
@@ -129,7 +139,8 @@ static void conv_dm_get_edge_verts(const OpenSubdiv_Converter *converter,
 static int conv_dm_get_num_edge_faces(const OpenSubdiv_Converter *converter,
                                       int edge)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	const MLoop *ml = dm->getLoopArray(dm);
 	const MPoly *mp = dm->getPolyArray(dm);
 	int num = 0, poly;
@@ -151,7 +162,8 @@ static void conv_dm_get_edge_faces(const OpenSubdiv_Converter *converter,
                                    int edge,
                                    int *edge_faces)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	const MLoop *ml = dm->getLoopArray(dm);
 	const MPoly *mp = dm->getPolyArray(dm);
 	int num = 0, poly;
@@ -171,15 +183,18 @@ static void conv_dm_get_edge_faces(const OpenSubdiv_Converter *converter,
 static float conv_dm_get_edge_sharpness(const OpenSubdiv_Converter *converter,
                                         int edge)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
+	CCGSubSurf *ss = storage->ss;
 	const MEdge *medge = dm->getEdgeArray(dm);
-	return (float)medge[edge].crease / 255.0f;
+	return (float)medge[edge].crease / 255.0f * ss->subdivLevels;
 }
 
 static int conv_dm_get_num_vert_edges(const OpenSubdiv_Converter *converter,
                                       int vert)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	const MEdge *me = dm->getEdgeArray(dm);
 	int num = 0, edge;
 	for (edge = 0; edge < dm->getNumEdges(dm); edge++) {
@@ -195,7 +210,8 @@ static void conv_dm_get_vert_edges(const OpenSubdiv_Converter *converter,
                                    int vert,
                                    int *vert_edges)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	const MEdge *me = dm->getEdgeArray(dm);
 	int num = 0, edge;
 	for (edge = 0; edge < dm->getNumEdges(dm); edge++) {
@@ -209,7 +225,8 @@ static void conv_dm_get_vert_edges(const OpenSubdiv_Converter *converter,
 static int conv_dm_get_num_vert_faces(const OpenSubdiv_Converter *converter,
                                       int vert)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	const MLoop *ml = dm->getLoopArray(dm);
 	const MPoly *mp = dm->getPolyArray(dm);
 	int num = 0, poly;
@@ -231,7 +248,8 @@ static void conv_dm_get_vert_faces(const OpenSubdiv_Converter *converter,
                                    int vert,
                                    int *vert_faces)
 {
-	DerivedMesh *dm = converter->user_data;
+	ConvDMStorage *storage = converter->user_data;
+	DerivedMesh *dm = storage->dm;
 	const MLoop *ml = dm->getLoopArray(dm);
 	const MPoly *mp = dm->getPolyArray(dm);
 	int num = 0, poly;
@@ -248,15 +266,19 @@ static void conv_dm_get_vert_faces(const OpenSubdiv_Converter *converter,
 	}
 }
 
+static void conv_dm_free_user_data(const OpenSubdiv_Converter *converter)
+{
+	MEM_freeN(converter->user_data);
+}
+
 void ccgSubSurf_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 = c

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list