Cleanup: remove WITH_RAYOPTIMIZATION
[blender.git] / intern / opensubdiv / opensubdiv_topology_refiner_capi.h
1 // Copyright 2018 Blender Foundation. All rights reserved.
2 //
3 // This program is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU General Public License
5 // as published by the Free Software Foundation; either version 2
6 // of the License, or (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software Foundation,
15 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 //
17 // Author: Sergey Sharybin
18
19 #ifndef OPENSUBDIV_TOPOLOGY_REFINER_CAPI_H_
20 #define OPENSUBDIV_TOPOLOGY_REFINER_CAPI_H_
21
22 #include <stdint.h>  // for bool
23
24 #include "opensubdiv_capi_type.h"
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29
30 struct OpenSubdiv_Converter;
31 struct OpenSubdiv_TopologyRefinerInternal;
32
33 // Those settings don't really belong to OpenSubdiv's topology refiner, but
34 // we are keeping track of them on our side of topology refiner. This is to
35 // make it possible to ensure we are not trying to abuse same OpenSubdiv's
36 // topology refiner with different subdivision levels or with different
37 // adaptive settings.
38 typedef struct OpenSubdiv_TopologyRefinerSettings {
39   bool is_adaptive;
40   int level;
41 } OpenSubdiv_TopologyRefinerSettings;
42
43 typedef struct OpenSubdiv_TopologyRefiner {
44   // Query subdivision level the refiner is created for.
45   int (*getSubdivisionLevel)(const struct OpenSubdiv_TopologyRefiner *topology_refiner);
46   bool (*getIsAdaptive)(const struct OpenSubdiv_TopologyRefiner *topology_refiner);
47
48   // NOTE: All queries are querying base level.
49   //
50   // TODO(sergey): Consider making it more obvious in function naming,
51   // but since it's unlikely (or at least, will be uncommon use) for API
52   // which queries final geometry, we should be fine with this name for
53   // now.
54
55   //////////////////////////////////////////////////////////////////////////////
56   // Query basic topology information from base level.
57
58   int (*getNumVertices)(const struct OpenSubdiv_TopologyRefiner *topology_refiner);
59   int (*getNumEdges)(const struct OpenSubdiv_TopologyRefiner *topology_refiner);
60   int (*getNumFaces)(const struct OpenSubdiv_TopologyRefiner *topology_refiner);
61
62   int (*getNumFaceVertices)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
63                             const int face_index);
64   void (*getFaceVertices)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
65                           const int face_index,
66                           int *face_vertices_indices);
67
68   int (*getNumFaceEdges)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
69                          const int face_index);
70   void (*getFaceEdges)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
71                        const int face_index,
72                        int *face_edges_indices);
73   void (*getEdgeVertices)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
74                           const int edge_index,
75                           int edge_vertices_indices[2]);
76
77   int (*getNumVertexEdges)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
78                            const int vertex_index);
79   void (*getVertexEdges)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
80                          const int vertex_index,
81                          int *vertex_edges_indices);
82
83   //////////////////////////////////////////////////////////////////////////////
84   // PTex face geometry queries.
85
86   // Ptex face corresponds to OpenSubdiv's internal "patch" and to Blender's
87   // subdivision grid. The rule commes as:
88   // - Triangle face consist of 3 ptex faces, ordered in the order of
89   //   face-vertices.
90   // - Quad face consists of a single ptex face.
91   // - N-gons (similar to triangle) consists of N ptex faces, ordered same
92   //   way as for triangle.
93   int (*getNumFacePtexFaces)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
94                              const int face_index);
95   int (*getNumPtexFaces)(const struct OpenSubdiv_TopologyRefiner *topology_refiner);
96
97   // Initialize a per-base-face offset measured in ptex face indices.
98   //
99   // Basically, face_ptex_offset[base_face_index] is a total number of ptex
100   // faces created for bases faces [0 .. base_face_index - 1].
101   //
102   // The array must contain at least total number of ptex faces elements.
103   void (*fillFacePtexIndexOffset)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
104                                   int *face_ptex_index_offset);
105
106   //////////////////////////////////////////////////////////////////////////////
107   // Face-varying data.
108
109   // Number of face-varying channels (or how they are called in Blender layers).
110   int (*getNumFVarChannels)(const struct OpenSubdiv_TopologyRefiner *topology_refiner);
111   // Get face-varying interpolation type.
112   OpenSubdiv_FVarLinearInterpolation (*getFVarLinearInterpolation)(
113       const struct OpenSubdiv_TopologyRefiner *topology_refiner);
114   // Get total number of face-varying values in a particular channel.
115   int (*getNumFVarValues)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
116                           const int channel);
117   // Get face-varying value indices associated with a particular face.
118   //
119   // This is an array of indices inside of face-varying array, array elements
120   // are aligned with face corners (or loops in Blender terminology).
121   const int *(*getFaceFVarValueIndices)(const struct OpenSubdiv_TopologyRefiner *topology_refiner,
122                                         const int face_index,
123                                         const int channel);
124
125   //////////////////////////////////////////////////////////////////////////////
126   // Internal use.
127
128   // Internal storage for the use in this module only.
129   //
130   // Tease: Contains actual OpenSubdiv's refiner and (optionally) some other
131   // data and state needed for an internbal use.
132   struct OpenSubdiv_TopologyRefinerInternal *internal;
133 } OpenSubdiv_TopologyRefiner;
134
135 // NOTE: Will return NULL in cases of bad topology.
136 // NOTE: Mesh without faces is considered a bad topology.
137 OpenSubdiv_TopologyRefiner *openSubdiv_createTopologyRefinerFromConverter(
138     struct OpenSubdiv_Converter *converter, const OpenSubdiv_TopologyRefinerSettings *settings);
139
140 void openSubdiv_deleteTopologyRefiner(OpenSubdiv_TopologyRefiner *topology_refiner);
141
142 // Compare given topology refiner with converter. Returns truth if topology
143 // refiner matches given converter, false otherwise.
144 //
145 // This allows users to construct converter (which is supposed to be cheap)
146 // and compare with existing refiner before going into more computationally
147 // complicated parts of subdivision process.
148 bool openSubdiv_topologyRefinerCompareWithConverter(
149     const OpenSubdiv_TopologyRefiner *topology_refiner,
150     const struct OpenSubdiv_Converter *converter);
151
152 #ifdef __cplusplus
153 }
154 #endif
155
156 #endif  // OPENSUBDIV_TOPOLOGY_REFINER_CAPI_H_