[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