[Bf-blender-cvs] [6dc19ea] opensubdiv-modifier: OpenSubdiv: Bring more proper evaluation API
Sergey Sharybin
noreply at git.blender.org
Sat Jul 11 20:01:54 CEST 2015
Commit: 6dc19ea93db7048cc937b6b316513c78499f587e
Author: Sergey Sharybin
Date: Thu Jul 9 22:02:46 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rB6dc19ea93db7048cc937b6b316513c78499f587e
OpenSubdiv: Bring more proper evaluation API
Basically seems to work, however there are some issues reported by
the topology sanitier, plus the result of complex meshes is not
really correct.
===================================================================
M intern/opensubdiv/opensubdiv_capi.h
M intern/opensubdiv/opensubdiv_converter.cc
M intern/opensubdiv/opensubdiv_converter.h
M intern/opensubdiv/opensubdiv_evaluator_capi.cc
M source/blender/blenkernel/intern/CCGSubSurf.c
===================================================================
diff --git a/intern/opensubdiv/opensubdiv_capi.h b/intern/opensubdiv/opensubdiv_capi.h
index 7e94156..c3c5608 100644
--- a/intern/opensubdiv/opensubdiv_capi.h
+++ b/intern/opensubdiv/opensubdiv_capi.h
@@ -31,10 +31,8 @@ extern "C" {
#endif
// Types declaration.
-struct OpenSubdiv_EvaluatorDescr;
struct OpenSubdiv_GLMesh;
-typedef struct OpenSubdiv_EvaluatorDescr OpenSubdiv_EvaluatorDescr;
typedef struct OpenSubdiv_GLMesh OpenSubdiv_GLMesh;
#ifdef __cplusplus
@@ -63,9 +61,9 @@ enum {
OPENSUBDIV_SCHEME_LOOP,
};
+/* TODO(sergey): Re-name and avoid bad level data access. */
struct DerivedMesh;
OpenSubdiv_GLMesh *openSubdiv_createOsdGLMeshFromEvaluator(
- //OpenSubdiv_EvaluatorDescr *evaluator_descr,
DerivedMesh *dm,
int evaluator_type,
int level,
@@ -89,8 +87,17 @@ void openSubdiv_osdGLDisplayInit(void);
void openSubdiv_osdGLDisplayDeinit(void);
/* ** Evaluator API ** */
-void openSubdiv_evaluateLimit(//OpenSubdiv_EvaluatorDescr *evaluator_descr,
- DerivedMesh *dm,
+
+struct OpenSubdiv_EvaluatorDescr;
+typedef struct OpenSubdiv_EvaluatorDescr OpenSubdiv_EvaluatorDescr;
+
+/* TODO(sergey): Avoid bad-level data access, */
+OpenSubdiv_EvaluatorDescr *openSubdiv_createEvaluatorDescr(DerivedMesh *dm,
+ int subsurf_level);
+
+void openSubdiv_deleteEvaluatorDescr(OpenSubdiv_EvaluatorDescr *evaluator_descr);
+
+void openSubdiv_evaluateLimit(OpenSubdiv_EvaluatorDescr *evaluator_descr,
int osd_face_index,
float face_u, float face_v,
float P[3],
diff --git a/intern/opensubdiv/opensubdiv_converter.cc b/intern/opensubdiv/opensubdiv_converter.cc
index 3897a26..664867e 100644
--- a/intern/opensubdiv/opensubdiv_converter.cc
+++ b/intern/opensubdiv/opensubdiv_converter.cc
@@ -44,6 +44,7 @@ OpenSubdiv::Sdc::Options OsdBlenderConverter::get_options() const
{
OpenSubdiv::Sdc::Options options;
options.SetVtxBoundaryInterpolation(OpenSubdiv::Sdc::Options::VTX_BOUNDARY_EDGE_ONLY);
+ options.SetFVarLinearInterpolation(OpenSubdiv::Sdc::Options::FVAR_LINEAR_ALL);
return options;
}
@@ -77,16 +78,16 @@ void OsdBlenderConverter::get_coarse_verts(float *coords) const
/* Face relationships. */
int OsdBlenderConverter::get_num_face_verts(int face) const
{
- MPoly *mp = dm_->getPolyArray(dm_);
- MPoly *mpoly = &mp[face];
+ const MPoly *mp = dm_->getPolyArray(dm_);
+ const MPoly *mpoly = &mp[face];
return mpoly->totloop;
}
void OsdBlenderConverter::get_face_verts(int face, int *face_verts) const
{
- MLoop *ml = dm_->getLoopArray(dm_);
- MPoly *mp = dm_->getPolyArray(dm_);
- MPoly *mpoly = &mp[face];
+ const MLoop *ml = dm_->getLoopArray(dm_);
+ const MPoly *mp = dm_->getPolyArray(dm_);
+ const MPoly *mpoly = &mp[face];
for(int i = 0; i < mpoly->totloop; ++i) {
face_verts[i] = ml[mpoly->loopstart + i].v;
}
@@ -94,9 +95,9 @@ void OsdBlenderConverter::get_face_verts(int face, int *face_verts) const
void OsdBlenderConverter::get_face_edges(int face, int *face_edges) const
{
- MLoop *ml = dm_->getLoopArray(dm_);
- MPoly *mp = dm_->getPolyArray(dm_);
- MPoly *mpoly = &mp[face];
+ const MLoop *ml = dm_->getLoopArray(dm_);
+ const MPoly *mp = dm_->getPolyArray(dm_);
+ const MPoly *mpoly = &mp[face];
for(int i = 0; i < mpoly->totloop; ++i) {
face_edges[i] = ml[mpoly->loopstart + i].e;
}
@@ -105,21 +106,21 @@ void OsdBlenderConverter::get_face_edges(int face, int *face_edges) const
/* Edge relationships. */
void OsdBlenderConverter::get_edge_verts(int edge, int *edge_verts) const
{
- MEdge *me = dm_->getEdgeArray(dm_);
- MEdge *medge = &me[edge];
+ const MEdge *me = dm_->getEdgeArray(dm_);
+ const MEdge *medge = &me[edge];
edge_verts[0] = medge->v1;
edge_verts[1] = medge->v2;
}
int OsdBlenderConverter::get_num_edge_faces(int edge) const
{
- MLoop *ml = dm_->getLoopArray(dm_);
- MPoly *mp = dm_->getPolyArray(dm_);
+ const MLoop *ml = dm_->getLoopArray(dm_);
+ const MPoly *mp = dm_->getPolyArray(dm_);
int num = 0;
for (int poly = 0; poly < dm_->getNumPolys(dm_); ++poly) {
- MPoly *mpoly = &mp[poly];
+ const MPoly *mpoly = &mp[poly];
for (int loop = 0; loop < mpoly->totloop; ++loop) {
- MLoop *mloop = &ml[loop + mpoly->loopstart];
+ const MLoop *mloop = &ml[mpoly->loopstart + loop];
if (mloop->e == edge) {
++num;
break;
@@ -131,13 +132,13 @@ int OsdBlenderConverter::get_num_edge_faces(int edge) const
void OsdBlenderConverter::get_edge_faces(int edge, int *edge_faces) const
{
- MLoop *ml = dm_->getLoopArray(dm_);
- MPoly *mp = dm_->getPolyArray(dm_);
+ const MLoop *ml = dm_->getLoopArray(dm_);
+ const MPoly *mp = dm_->getPolyArray(dm_);
int num = 0;
for (int poly = 0; poly < dm_->getNumPolys(dm_); ++poly) {
- MPoly *mpoly = &mp[poly];
+ const MPoly *mpoly = &mp[poly];
for (int loop = 0; loop < mpoly->totloop; ++loop) {
- MLoop *mloop = &ml[loop + mpoly->loopstart];
+ const MLoop *mloop = &ml[mpoly->loopstart + loop];
if (mloop->e == edge) {
edge_faces[num++] = poly;
break;
@@ -149,10 +150,10 @@ void OsdBlenderConverter::get_edge_faces(int edge, int *edge_faces) const
/* Vertex relationships. */
int OsdBlenderConverter::get_num_vert_edges(int vert) const
{
- MEdge *me = dm_->getEdgeArray(dm_);
+ const MEdge *me = dm_->getEdgeArray(dm_);
int num = 0;
for (int edge = 0; edge < dm_->getNumEdges(dm_); ++edge) {
- MEdge *medge = &me[edge];
+ const MEdge *medge = &me[edge];
if (medge->v1 == vert || medge->v2 == vert) {
++num;
}
@@ -162,10 +163,10 @@ int OsdBlenderConverter::get_num_vert_edges(int vert) const
void OsdBlenderConverter::get_vert_edges(int vert, int *vert_edges) const
{
- MEdge *me = dm_->getEdgeArray(dm_);
+ const MEdge *me = dm_->getEdgeArray(dm_);
int num = 0;
for (int edge = 0; edge < dm_->getNumEdges(dm_); ++edge) {
- MEdge *medge = &me[edge];
+ const MEdge *medge = &me[edge];
if (medge->v1 == vert || medge->v2 == vert) {
vert_edges[num++] = edge;
}
@@ -174,13 +175,13 @@ void OsdBlenderConverter::get_vert_edges(int vert, int *vert_edges) const
int OsdBlenderConverter::get_num_vert_faces(int vert) const
{
- MLoop *ml = dm_->getLoopArray(dm_);
- MPoly *mp = dm_->getPolyArray(dm_);
+ const MLoop *ml = dm_->getLoopArray(dm_);
+ const MPoly *mp = dm_->getPolyArray(dm_);
int num = 0;
for (int poly = 0; poly < dm_->getNumPolys(dm_); ++poly) {
- MPoly *mpoly = &mp[poly];
+ const MPoly *mpoly = &mp[poly];
for (int loop = 0; loop < mpoly->totloop; ++loop) {
- MLoop *mloop = &ml[loop + mpoly->loopstart];
+ const MLoop *mloop = &ml[mpoly->loopstart + loop];
if (mloop->v == vert) {
++num;
break;
@@ -192,13 +193,13 @@ int OsdBlenderConverter::get_num_vert_faces(int vert) const
void OsdBlenderConverter::get_vert_faces(int vert, int *vert_faces) const
{
- MLoop *ml = dm_->getLoopArray(dm_);
- MPoly *mp = dm_->getPolyArray(dm_);
+ const MLoop *ml = dm_->getLoopArray(dm_);
+ const MPoly *mp = dm_->getPolyArray(dm_);
int num = 0;
for (int poly = 0; poly < dm_->getNumPolys(dm_); ++poly) {
- MPoly *mpoly = &mp[poly];
+ const MPoly *mpoly = &mp[poly];
for (int loop = 0; loop < mpoly->totloop; ++loop) {
- MLoop *mloop = &ml[loop + mpoly->loopstart];
+ const MLoop *mloop = &ml[mpoly->loopstart + loop];
if (mloop->v == vert) {
vert_faces[num++] = poly;
break;
diff --git a/intern/opensubdiv/opensubdiv_converter.h b/intern/opensubdiv/opensubdiv_converter.h
index c9635ce..208084e 100644
--- a/intern/opensubdiv/opensubdiv_converter.h
+++ b/intern/opensubdiv/opensubdiv_converter.h
@@ -76,27 +76,27 @@ inline bool TopologyRefinerFactory<OsdBlenderConverter>::resizeComponentTopology
const OsdBlenderConverter& conv)
{
/* Faces and face-verts */
- int num_faces = conv.get_num_faces();
+ const int num_faces = conv.get_num_faces();
setNumBaseFaces(refiner, num_faces);
for (int face = 0; face < num_faces; ++face) {
- int num_verts = conv.get_num_face_verts(face);
+ const int num_verts = conv.get_num_face_verts(face);
setNumBaseFaceVertices(refiner, face, num_verts);
}
/* Edges and edge-faces. */
- int num_edges = conv.get_num_edges();
+ const int num_edges = conv.get_num_edges();
setNumBaseEdges(refiner, num_edges);
for (int edge = 0; edge < num_edges; ++edge) {
- int num_faces = conv.get_num_edge_faces(edge);
- setNumBaseEdgeFaces(refiner, edge, num_faces);
+ const int num_edge_faces = conv.get_num_edge_faces(edge);
+ setNumBaseEdgeFaces(refiner, edge, num_edge_faces);
}
/* Vertices and vert-faces and vert-edges/ */
- int num_verts = conv.get_num_verts();
+ const int num_verts = conv.get_num_verts();
setNumBaseVertices(refiner, num_verts);
for (int vert = 0; vert < num_verts; ++vert) {
- int num_edges = conv.get_num_vert_edges(vert),
- num_faces = conv.get_num_vert_faces(vert);
- setNumBaseVertexEdges(refiner, vert, num_edges);
- setNumBaseVertexFaces(refiner, vert, num_faces);
+ const int num_vert_edges = conv.get_num_vert_edges(vert),
+ num_vert_faces = conv.get_num_vert_faces(vert);
+ setNumBaseVertexEdges(refiner, vert, num_vert_edges);
+ setNumBaseVertexFaces(refiner, vert, num_vert_faces);
}
return true;
}
@@ -109,7 +109,7 @@ inline bool TopologyRefinerFactory<OsdBlenderConverter>::assignComponentTopology
using Far::IndexArray;
/* Face relations. */
- int num_faces = conv.get_num_faces();
+ const int num_faces = conv.get_num_faces();
for (int face = 0; face < num_faces; ++face) {
IndexArray dst_face_verts = getBaseFaceVertices(refiner, face);
conv.get_face_verts(face, &dst_face_verts[0]);
@@ -117,7 +117,7 @@ inline bool TopologyRefinerFactory<OsdBlenderConverter>::assignComponentTopology
conv.get_face_edges(face, &dst_face_edges[0]);
}
/* Edge relations. */
- int num_edges = conv.get_num_edges();
+ const int num_edges = conv.get_num_edges();
for (int edge = 0; edge < num_edges; ++edge) {
/* Edge-vertices */
IndexArray dst_edge_verts = getBaseEdgeVertices(refiner, edge);
@@ -127,7 +127,7 @@ inline bool TopologyRefinerFactory<OsdBlenderConverter>::assignComponentTopology
conv.get_edge_faces(edge, &
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list