[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