[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