[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