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;

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

Reply via email to