[Bf-blender-cvs] [8196b9d7bca] blender2.8: OpenSubdiv: Add extra base level queries to topology refiner

Sergey Sharybin noreply at git.blender.org
Thu Sep 20 16:11:28 CEST 2018


Commit: 8196b9d7bcab5557f71a87c4bf334cc8ae099cd6
Author: Sergey Sharybin
Date:   Thu Sep 20 11:45:22 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB8196b9d7bcab5557f71a87c4bf334cc8ae099cd6

OpenSubdiv: Add extra base level queries to topology refiner

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

M	intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
M	intern/opensubdiv/opensubdiv_topology_refiner_capi.h

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

diff --git a/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc b/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
index e334a4b0871..6ac8a67e3e6 100644
--- a/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
+++ b/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
@@ -64,6 +64,14 @@ int getNumFaces(const OpenSubdiv_TopologyRefiner* topology_refiner) {
 ////////////////////////////////////////////////////////////////////////////////
 // PTex face geometry queries.
 
+static void convertArrayToRaw(
+    const OpenSubdiv::Far::ConstIndexArray& array,
+    int* raw_array) {
+  for (int i = 0; i < array.size(); ++i) {
+    raw_array[i] = array[i];
+  }
+}
+
 int getNumFaceVertices(const OpenSubdiv_TopologyRefiner* topology_refiner,
                        const int face_index) {
   const OpenSubdiv::Far::TopologyLevel* base_level =
@@ -71,6 +79,44 @@ int getNumFaceVertices(const OpenSubdiv_TopologyRefiner* topology_refiner,
   return base_level->GetFaceVertices(face_index).size();
 }
 
+void getFaceVertices(const OpenSubdiv_TopologyRefiner* topology_refiner,
+                     const int face_index,
+                     int* face_vertices_indices) {
+  const OpenSubdiv::Far::TopologyLevel* base_level =
+      getOSDTopologyBaseLevel(topology_refiner);
+  OpenSubdiv::Far::ConstIndexArray array =
+      base_level->GetFaceVertices(face_index);
+  convertArrayToRaw(array, face_vertices_indices);
+}
+
+int getNumFaceEdges(const OpenSubdiv_TopologyRefiner* topology_refiner,
+                    const int face_index) {
+  const OpenSubdiv::Far::TopologyLevel* base_level =
+      getOSDTopologyBaseLevel(topology_refiner);
+  return base_level->GetFaceEdges(face_index).size();
+}
+
+void getFaceEdges(const OpenSubdiv_TopologyRefiner* topology_refiner,
+                  const int face_index,
+                  int* face_edges_indices) {
+  const OpenSubdiv::Far::TopologyLevel* base_level =
+      getOSDTopologyBaseLevel(topology_refiner);
+  OpenSubdiv::Far::ConstIndexArray array = base_level->GetFaceEdges(face_index);
+  convertArrayToRaw(array, face_edges_indices);
+}
+
+void getEdgeVertices(const OpenSubdiv_TopologyRefiner* topology_refiner,
+                     const int edge_index,
+                     int edge_vertices_indices[2]) {
+  const OpenSubdiv::Far::TopologyLevel* base_level =
+      getOSDTopologyBaseLevel(topology_refiner);
+  OpenSubdiv::Far::ConstIndexArray array =
+      base_level->GetEdgeVertices(edge_index);
+  assert(array.size() == 2);
+  edge_vertices_indices[0] = array[0];
+  edge_vertices_indices[1] = array[1];
+}
+
 int getNumFacePtexFaces(const OpenSubdiv_TopologyRefiner* topology_refiner,
                         const int face_index) {
   const int num_face_vertices =
@@ -147,6 +193,10 @@ void assignFunctionPointers(OpenSubdiv_TopologyRefiner* topology_refiner) {
   topology_refiner->getNumEdges = getNumEdges;
   topology_refiner->getNumFaces = getNumFaces;
   topology_refiner->getNumFaceVertices = getNumFaceVertices;
+  topology_refiner->getFaceVertices = getFaceVertices;
+  topology_refiner->getNumFaceEdges = getNumFaceEdges;
+  topology_refiner->getFaceEdges = getFaceEdges;
+  topology_refiner->getEdgeVertices = getEdgeVertices;
   // PTex face geometry.
   topology_refiner->getNumFacePtexFaces = getNumFacePtexFaces;
   topology_refiner->getNumPtexFaces = getNumPtexFaces;
diff --git a/intern/opensubdiv/opensubdiv_topology_refiner_capi.h b/intern/opensubdiv/opensubdiv_topology_refiner_capi.h
index fe4db0ca67c..771eb8d62a8 100644
--- a/intern/opensubdiv/opensubdiv_topology_refiner_capi.h
+++ b/intern/opensubdiv/opensubdiv_topology_refiner_capi.h
@@ -66,6 +66,21 @@ typedef struct OpenSubdiv_TopologyRefiner {
   int (*getNumFaceVertices)(
       const struct OpenSubdiv_TopologyRefiner* topology_refiner,
       const int face_index);
+  void (*getFaceVertices)(
+      const struct OpenSubdiv_TopologyRefiner* topology_refiner,
+      const int face_index,
+      int* face_vertices_indices);
+  int (*getNumFaceEdges)(
+      const struct OpenSubdiv_TopologyRefiner* topology_refiner,
+      const int face_index);
+  void (*getFaceEdges)(
+      const struct OpenSubdiv_TopologyRefiner* topology_refiner,
+      const int face_index,
+      int* face_edges_indices);
+  void (*getEdgeVertices)(
+      const struct OpenSubdiv_TopologyRefiner* topology_refiner,
+      const int edge_index,
+      int edge_vertices_indices[2]);
 
   //////////////////////////////////////////////////////////////////////////////
   // PTex face geometry queries.



More information about the Bf-blender-cvs mailing list