[Bf-blender-cvs] [4a3f06c] opensubdiv-modifier: OpenSubdiv: Initial support for edge sharpness

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


Commit: 4a3f06c6892ff9b2872bf1a33579b672448be58c
Author: Sergey Sharybin
Date:   Thu Jul 16 12:32:28 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rB4a3f06c6892ff9b2872bf1a33579b672448be58c

OpenSubdiv: Initial support for edge sharpness

Basically it works fine, just needs some tweaks to weight calculation
to make it matching with old subdivision code.

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

M	intern/opensubdiv/opensubdiv_converter.cc
M	intern/opensubdiv/opensubdiv_converter_capi.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.cc b/intern/opensubdiv/opensubdiv_converter.cc
index a75649d..be6e1db 100644
--- a/intern/opensubdiv/opensubdiv_converter.cc
+++ b/intern/opensubdiv/opensubdiv_converter.cc
@@ -166,10 +166,10 @@ inline bool TopologyRefinerFactory<OpenSubdiv_Converter>::assignComponentTags(
         TopologyRefiner& refiner,
         const OpenSubdiv_Converter& conv)
 {
-	/* TODO(sergey): Use real sharpness. */
 	int num_edges = conv.get_num_edges(&conv);
 	for (int edge = 0; edge < num_edges; ++edge) {
-		setBaseEdgeSharpness(refiner, edge, 0.0f);
+		float sharpness = conv.get_edge_sharpness(&conv, edge);
+		setBaseEdgeSharpness(refiner, edge, sharpness);
 	}
 	return true;
 }
@@ -295,6 +295,13 @@ int openSubdiv_topologyRefnerCompareConverter(
 			}
 		}
 	}
-	/* TODO(sergey): Edge crease comparison. */
+	/* Compare sharpness. */
+	for (int edge = 0; edge < num_edges; ++edge) {
+		float sharpness = base_level.GetEdgeSharpness(edge);
+		float conv_sharpness = converter->get_edge_sharpness(converter, edge);
+		if (sharpness != conv_sharpness) {
+			return false;
+		}
+	}
 	return true;
 }
diff --git a/intern/opensubdiv/opensubdiv_converter_capi.h b/intern/opensubdiv/opensubdiv_converter_capi.h
index f5d8a7e..b39d18b 100644
--- a/intern/opensubdiv/opensubdiv_converter_capi.h
+++ b/intern/opensubdiv/opensubdiv_converter_capi.h
@@ -70,6 +70,8 @@ typedef struct OpenSubdiv_Converter {
 	void (*get_edge_faces)(const OpenSubdiv_Converter *converter,
 	                       int edge,
 	                       int *edge_faces);
+	float (*get_edge_sharpness)(const OpenSubdiv_Converter *converter,
+	                            int edge);
 
 	/* Vertex relationships. */
 	int (*get_num_vert_edges)(const OpenSubdiv_Converter *converter, int vert);
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
index d812e0b..df10c55 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
@@ -108,6 +108,19 @@ static bool compare_ccg_derivedmesh_topology(CCGSubSurf *ss, DerivedMesh *dm)
 	}
 
 	/* TODO(sergey): Crease topology changes detection. */
+	{
+		CCGEdgeIterator ccg_edge_iter;
+		for (ccgSubSurf_initEdgeIterator(ss, &ccg_edge_iter);
+		     !ccgEdgeIterator_isStopped(&ccg_edge_iter);
+		     ccgEdgeIterator_next(&ccg_edge_iter))
+		{
+			/* const */ CCGEdge *ccg_edge = ccgEdgeIterator_getCurrent(&ccg_edge_iter);
+			const int edge_index = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
+			if (ccg_edge->crease != medge[edge_index].crease) {
+				return false;
+			}
+		}
+	}
 
 	return true;
 }
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
index 2b41761..6400490 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
@@ -168,6 +168,14 @@ 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;
+	const MEdge *medge = dm->getEdgeArray(dm);
+	return (float)medge[edge].crease / 255.0f;
+}
+
 static int conv_dm_get_num_vert_edges(const OpenSubdiv_Converter *converter,
                                       int vert)
 {
@@ -261,6 +269,7 @@ void ccgSubSurf_converter_setup_from_derivedmesh(
 	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_edge_sharpness = conv_dm_get_edge_sharpness;
 
 	converter->get_num_vert_edges = conv_dm_get_num_vert_edges;
 	converter->get_vert_edges = conv_dm_get_vert_edges;
@@ -374,6 +383,14 @@ static void conv_ccg_get_edge_faces(const OpenSubdiv_Converter *converter,
 	}
 }
 
+static float conv_ccg_get_edge_sharpness(const OpenSubdiv_Converter *converter,
+                                         int edge)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, SET_INT_IN_POINTER(edge));
+	return ccg_edge->crease;
+}
+
 static int conv_ccg_get_num_vert_edges(const OpenSubdiv_Converter *converter,
                                        int vert)
 {
@@ -434,6 +451,7 @@ void ccgSubSurf_converter_setup_from_ccg(CCGSubSurf *ss,
 	converter->get_edge_verts = conv_ccg_get_edge_verts;
 	converter->get_num_edge_faces = conv_ccg_get_num_edge_faces;
 	converter->get_edge_faces = conv_ccg_get_edge_faces;
+	converter->get_edge_sharpness = conv_ccg_get_edge_sharpness;
 
 	converter->get_num_vert_edges = conv_ccg_get_num_vert_edges;
 	converter->get_vert_edges = conv_ccg_get_vert_edges;




More information about the Bf-blender-cvs mailing list