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. @@

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

Reply via email to