[Bf-blender-cvs] [dbf42a4] opensubdiv-modifier: OpenSubdiv: Simplify conversion and avoid temp arrays in there

Sergey Sharybin noreply at git.blender.org
Sat Jul 11 20:01:49 CEST 2015


Commit: dbf42a4dc0c14d2f6fb591275e81f408a4d51c68
Author: Sergey Sharybin
Date:   Wed Jul 8 16:48:13 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rBdbf42a4dc0c14d2f6fb591275e81f408a4d51c68

OpenSubdiv: Simplify conversion and avoid temp arrays in there

It's still not really final implementation, need to get rid of bad level
includes still.

===================================================================

M	intern/opensubdiv/opensubdiv_converter.cc
M	intern/opensubdiv/opensubdiv_converter.h

===================================================================

diff --git a/intern/opensubdiv/opensubdiv_converter.cc b/intern/opensubdiv/opensubdiv_converter.cc
index 2e56c1e..2bc740e 100644
--- a/intern/opensubdiv/opensubdiv_converter.cc
+++ b/intern/opensubdiv/opensubdiv_converter.cc
@@ -70,39 +70,33 @@ int OsdBlenderConverter::get_num_face_verts(int face) const
 	return mpoly->totloop;
 }
 
-const int *OsdBlenderConverter::get_face_verts(int face) const
+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];
-	static int indices[64];
 	for(int i = 0; i < mpoly->totloop; ++i) {
-		indices[i] = ml[mpoly->loopstart + i].v;
+		face_verts[i] = ml[mpoly->loopstart + i].v;
 	}
-	return indices;
 }
 
-const int *OsdBlenderConverter::get_face_edges(int face) 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];
-	static int indices[64];
 	for(int i = 0; i < mpoly->totloop; ++i) {
-		indices[i] = ml[mpoly->loopstart + i].e;
+		face_edges[i] = ml[mpoly->loopstart + i].e;
 	}
-	return indices;
 }
 
 /* Edge relationships. */
-const int *OsdBlenderConverter::get_edge_verts(int edge) const
+void OsdBlenderConverter::get_edge_verts(int edge, int *edge_verts) const
 {
 	MEdge *me = dm_->getEdgeArray(dm_);
 	MEdge *medge = &me[edge];
-	static int indices[64];
-	indices[0] = medge->v1;
-	indices[1] = medge->v2;
-	return indices;
+	edge_verts[0] = medge->v1;
+	edge_verts[1] = medge->v2;
 }
 
 int OsdBlenderConverter::get_num_edge_faces(int edge) const
@@ -123,9 +117,8 @@ int OsdBlenderConverter::get_num_edge_faces(int edge) const
 	return num;
 }
 
-const int *OsdBlenderConverter::get_edge_faces(int edge) const
+void OsdBlenderConverter::get_edge_faces(int edge, int *edge_faces) const
 {
-	static int indices[64];
 	MLoop *ml = dm_->getLoopArray(dm_);
 	MPoly *mp = dm_->getPolyArray(dm_);
 	int num = 0;
@@ -134,12 +127,11 @@ const int *OsdBlenderConverter::get_edge_faces(int edge) const
 		for (int loop = 0; loop < mpoly->totloop; ++loop) {
 			MLoop *mloop = &ml[loop + mpoly->loopstart];
 			if (mloop->e == edge) {
-				indices[num++] = poly;
+				edge_faces[num++] = poly;
 				break;
 			}
 		}
 	}
-	return indices;
 }
 
 /* Vertex relationships. */
@@ -156,18 +148,16 @@ int OsdBlenderConverter::get_num_vert_edges(int vert) const
 	return num;
 }
 
-const int *OsdBlenderConverter::get_vert_edges(int vert) const
+void OsdBlenderConverter::get_vert_edges(int vert, int *vert_edges) const
 {
-	static int indices[64];
 	MEdge *me = dm_->getEdgeArray(dm_);
 	int num = 0;
 	for (int edge = 0; edge < dm_->getNumEdges(dm_); ++edge) {
 		MEdge *medge = &me[edge];
 		if (medge->v1 == vert || medge->v2 == vert) {
-			indices[num++] = edge;
+			vert_edges[num++] = edge;
 		}
 	}
-	return indices;
 }
 
 int OsdBlenderConverter::get_num_vert_faces(int vert) const
@@ -188,9 +178,8 @@ int OsdBlenderConverter::get_num_vert_faces(int vert) const
 	return num;
 }
 
-const int *OsdBlenderConverter::get_vert_faces(int vert) const
+void OsdBlenderConverter::get_vert_faces(int vert, int *vert_faces) const
 {
-	static int indices[64];
 	MLoop *ml = dm_->getLoopArray(dm_);
 	MPoly *mp = dm_->getPolyArray(dm_);
 	int num = 0;
@@ -199,10 +188,9 @@ const int *OsdBlenderConverter::get_vert_faces(int vert) const
 		for (int loop = 0; loop < mpoly->totloop; ++loop) {
 			MLoop *mloop = &ml[loop + mpoly->loopstart];
 			if (mloop->v == vert) {
-				indices[num++] = poly;
+				vert_faces[num++] = poly;
 				break;
 			}
 		}
 	}
-	return indices;
 }
diff --git a/intern/opensubdiv/opensubdiv_converter.h b/intern/opensubdiv/opensubdiv_converter.h
index d4c77ed..6914773 100644
--- a/intern/opensubdiv/opensubdiv_converter.h
+++ b/intern/opensubdiv/opensubdiv_converter.h
@@ -46,19 +46,19 @@ public:
 
 	/* Face relationships. */
 	int get_num_face_verts(int face) const;
-	const int *get_face_verts(int face) const;
-	const int *get_face_edges(int face) const;
+	void get_face_verts(int face, int *face_verts) const;
+	void get_face_edges(int face, int *face_edges) const;
 
 	/* Edge relationships. */
-	const int *get_edge_verts(int edge) const;
+	void get_edge_verts(int edge, int *edge_verts) const;
 	int get_num_edge_faces(int edge) const;
-	const int *get_edge_faces(int edge) const;
+	void get_edge_faces(int edge, int *edge_faces) const;
 
 	/* Vertex relationships. */
 	int get_num_vert_edges(int vert) const;
-	const int *get_vert_edges(int vert) const;
+	void get_vert_edges(int vert, int *vert_edges) const;
 	int get_num_vert_faces(int vert) const;
-	const int *get_vert_faces(int vert) const;
+	void get_vert_faces(int vert, int *vert_faces) const;
 
 private:
 	struct DerivedMesh *dm_;
@@ -68,7 +68,6 @@ namespace OpenSubdiv {
 namespace OPENSUBDIV_VERSION {
 namespace Far {
 
-/* Based on tutorial from OpenSubdiv which is Apache 2.0 license. */
 template <>
 inline bool TopologyRefinerFactory<OsdBlenderConverter>::resizeComponentTopology(
         TopologyRefiner& refiner,
@@ -89,9 +88,9 @@ inline bool TopologyRefinerFactory<OsdBlenderConverter>::resizeComponentTopology
 		setNumBaseEdgeFaces(refiner, edge, num_faces);
 	}
 	/* Vertices and vert-faces and vert-edges/ */
-	int nverts = conv.get_num_verts();
-	setNumBaseVertices(refiner, nverts);
-	for (int vert = 0; vert < nverts; ++vert) {
+	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);
@@ -111,48 +110,29 @@ inline bool TopologyRefinerFactory<OsdBlenderConverter>::assignComponentTopology
 	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]);
 		IndexArray dst_face_edges = getBaseFaceEdges(refiner, face);
-		const int *face_verts = conv.get_face_verts(face);
-		const int *face_edges = conv.get_face_edges(face);
-		int num_face_verts = conv.get_num_face_verts(face);
-		for (int vert = 0; vert < num_face_verts; ++vert) {
-			dst_face_verts[vert] = face_verts[vert];
-			dst_face_edges[vert] = face_edges[vert];
-		}
+		conv.get_face_edges(face, &dst_face_edges[0]);
 	}
 	/* Edge relations. */
 	int num_edges = conv.get_num_edges();
 	for (int edge = 0; edge < num_edges; ++edge) {
-		/*  Edge-vertices */
+		/* Edge-vertices */
 		IndexArray dst_edge_verts = getBaseEdgeVertices(refiner, edge);
-		const int *edge_vetrs = conv.get_edge_verts(edge);
-		dst_edge_verts[0] = edge_vetrs[0];
-		dst_edge_verts[1] = edge_vetrs[1];
-		/*  Edge-faces */
+		conv.get_edge_verts(edge, &dst_edge_verts[0]);
+		/* Edge-faces */
 		IndexArray dst_edge_faces = getBaseEdgeFaces(refiner, edge);
-		int num_edge_faces = conv.get_num_edge_faces(edge);
-		const int *edge_faces = conv.get_edge_faces(edge);
-		for (int face = 0; face < num_edge_faces; ++face) {
-			dst_edge_faces[face] = edge_faces[face];
-		}
+		conv.get_edge_faces(edge, &dst_edge_faces[0]);
 	}
 	/* Vertex relations */
 	int num_verts = conv.get_num_verts();
 	for (int vert = 0; vert < num_verts; ++vert) {
 		/* Vert-Faces */
 		IndexArray dst_vert_faces = getBaseVertexFaces(refiner, vert);
-		int num_vet_faces = conv.get_num_vert_faces(vert);
-		const int *vert_faces = conv.get_vert_faces(vert);
-		for (int face = 0; face < num_vet_faces; ++face) {
-			dst_vert_faces[face] = vert_faces[face];
-		}
+		conv.get_vert_faces(vert, &dst_vert_faces[0]);
 		/* Vert-Edges */
 		IndexArray dst_vert_edges = getBaseVertexEdges(refiner, vert);
-		int num_verets_edges = conv.get_num_vert_edges(vert);
-		const int *vert_edges = conv.get_vert_edges(vert);
-		for (int edge = 0; edge < num_verets_edges; ++edge) {
-			dst_vert_edges[edge] = vert_edges[edge];
-		}
+		conv.get_vert_edges(vert, &dst_vert_edges[0]);
 	}
 	populateBaseLocalIndices(refiner);
 	return true;




More information about the Bf-blender-cvs mailing list