Blender  V3.3
evaluator_capi.cc
Go to the documentation of this file.
1 // Copyright 2015 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 
20 
21 #include <opensubdiv/osd/glslPatchShaderSource.h>
22 
23 #include "MEM_guardedalloc.h"
24 #include <new>
25 
28 
29 namespace {
30 
31 void setSettings(struct OpenSubdiv_Evaluator *evaluator,
32  const OpenSubdiv_EvaluatorSettings *settings)
33 {
34  evaluator->impl->eval_output->setSettings(settings);
35 }
36 
37 void setCoarsePositions(OpenSubdiv_Evaluator *evaluator,
38  const float *positions,
39  const int start_vertex_index,
40  const int num_vertices)
41 {
42  evaluator->impl->eval_output->setCoarsePositions(positions, start_vertex_index, num_vertices);
43 }
44 
45 void setVertexData(OpenSubdiv_Evaluator *evaluator,
46  const float *vertex_data,
47  const int start_vertex_index,
48  const int num_vertices)
49 {
50  evaluator->impl->eval_output->setVertexData(vertex_data, start_vertex_index, num_vertices);
51 }
52 
53 void setVaryingData(OpenSubdiv_Evaluator *evaluator,
54  const float *varying_data,
55  const int start_vertex_index,
56  const int num_vertices)
57 {
58  evaluator->impl->eval_output->setVaryingData(varying_data, start_vertex_index, num_vertices);
59 }
60 
61 void setFaceVaryingData(OpenSubdiv_Evaluator *evaluator,
62  const int face_varying_channel,
63  const float *face_varying_data,
64  const int start_vertex_index,
65  const int num_vertices)
66 {
67  evaluator->impl->eval_output->setFaceVaryingData(
68  face_varying_channel, face_varying_data, start_vertex_index, num_vertices);
69 }
70 
71 void setCoarsePositionsFromBuffer(OpenSubdiv_Evaluator *evaluator,
72  const void *buffer,
73  const int start_offset,
74  const int stride,
75  const int start_vertex_index,
76  const int num_vertices)
77 {
79  buffer, start_offset, stride, start_vertex_index, num_vertices);
80 }
81 
82 void setVaryingDataFromBuffer(OpenSubdiv_Evaluator *evaluator,
83  const void *buffer,
84  const int start_offset,
85  const int stride,
86  const int start_vertex_index,
87  const int num_vertices)
88 {
90  buffer, start_offset, stride, start_vertex_index, num_vertices);
91 }
92 
93 void setFaceVaryingDataFromBuffer(OpenSubdiv_Evaluator *evaluator,
94  const int face_varying_channel,
95  const void *buffer,
96  const int start_offset,
97  const int stride,
98  const int start_vertex_index,
99  const int num_vertices)
100 {
102  face_varying_channel, buffer, start_offset, stride, start_vertex_index, num_vertices);
103 }
104 
105 void refine(OpenSubdiv_Evaluator *evaluator)
106 {
107  evaluator->impl->eval_output->refine();
108 }
109 
110 void evaluateLimit(OpenSubdiv_Evaluator *evaluator,
111  const int ptex_face_index,
112  const float face_u,
113  const float face_v,
114  float P[3],
115  float dPdu[3],
116  float dPdv[3])
117 {
118  evaluator->impl->eval_output->evaluateLimit(ptex_face_index, face_u, face_v, P, dPdu, dPdv);
119 }
120 
121 void evaluatePatchesLimit(OpenSubdiv_Evaluator *evaluator,
122  const OpenSubdiv_PatchCoord *patch_coords,
123  const int num_patch_coords,
124  float *P,
125  float *dPdu,
126  float *dPdv)
127 {
129  patch_coords, num_patch_coords, P, dPdu, dPdv);
130 }
131 
132 void evaluateVertexData(OpenSubdiv_Evaluator *evaluator,
133  const int ptex_face_index,
134  float face_u,
135  float face_v,
136  float vertex_data[3])
137 {
138  evaluator->impl->eval_output->evaluateVertexData(ptex_face_index, face_u, face_v, vertex_data);
139 }
140 
141 void evaluateVarying(OpenSubdiv_Evaluator *evaluator,
142  const int ptex_face_index,
143  float face_u,
144  float face_v,
145  float varying[3])
146 {
147  evaluator->impl->eval_output->evaluateVarying(ptex_face_index, face_u, face_v, varying);
148 }
149 
150 void evaluateFaceVarying(OpenSubdiv_Evaluator *evaluator,
151  const int face_varying_channel,
152  const int ptex_face_index,
153  float face_u,
154  float face_v,
155  float face_varying[2])
156 {
157  evaluator->impl->eval_output->evaluateFaceVarying(
158  face_varying_channel, ptex_face_index, face_u, face_v, face_varying);
159 }
160 
161 void getPatchMap(struct OpenSubdiv_Evaluator *evaluator,
162  struct OpenSubdiv_Buffer *patch_map_handles,
163  struct OpenSubdiv_Buffer *patch_map_quadtree,
164  int *min_patch_face,
165  int *max_patch_face,
166  int *max_depth,
167  int *patches_are_triangular)
168 {
169  evaluator->impl->eval_output->getPatchMap(patch_map_handles,
170  patch_map_quadtree,
171  min_patch_face,
172  max_patch_face,
173  max_depth,
174  patches_are_triangular);
175 }
176 
177 void fillPatchArraysBuffer(struct OpenSubdiv_Evaluator *evaluator,
178  struct OpenSubdiv_Buffer *patch_array_buffer)
179 {
180  evaluator->impl->eval_output->fillPatchArraysBuffer(patch_array_buffer);
181 }
182 
183 void wrapPatchIndexBuffer(struct OpenSubdiv_Evaluator *evaluator,
184  struct OpenSubdiv_Buffer *patch_index_buffer)
185 {
186  evaluator->impl->eval_output->wrapPatchIndexBuffer(patch_index_buffer);
187 }
188 
189 void wrapPatchParamBuffer(struct OpenSubdiv_Evaluator *evaluator,
190  struct OpenSubdiv_Buffer *patch_param_buffer)
191 {
192  evaluator->impl->eval_output->wrapPatchParamBuffer(patch_param_buffer);
193 }
194 
195 void wrapSrcBuffer(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *src_buffer)
196 {
197  evaluator->impl->eval_output->wrapSrcBuffer(src_buffer);
198 }
199 
200 void wrapSrcVertexDataBuffer(struct OpenSubdiv_Evaluator *evaluator,
201  struct OpenSubdiv_Buffer *src_buffer)
202 {
203  evaluator->impl->eval_output->wrapSrcVertexDataBuffer(src_buffer);
204 }
205 
206 void fillFVarPatchArraysBuffer(struct OpenSubdiv_Evaluator *evaluator,
207  const int face_varying_channel,
208  struct OpenSubdiv_Buffer *patch_array_buffer)
209 {
210  evaluator->impl->eval_output->fillFVarPatchArraysBuffer(face_varying_channel,
211  patch_array_buffer);
212 }
213 
214 void wrapFVarPatchIndexBuffer(struct OpenSubdiv_Evaluator *evaluator,
215  const int face_varying_channel,
216  struct OpenSubdiv_Buffer *patch_index_buffer)
217 {
218  evaluator->impl->eval_output->wrapFVarPatchIndexBuffer(face_varying_channel, patch_index_buffer);
219 }
220 
221 void wrapFVarPatchParamBuffer(struct OpenSubdiv_Evaluator *evaluator,
222  const int face_varying_channel,
223  struct OpenSubdiv_Buffer *patch_param_buffer)
224 {
225  evaluator->impl->eval_output->wrapFVarPatchParamBuffer(face_varying_channel, patch_param_buffer);
226 }
227 
228 void wrapFVarSrcBuffer(struct OpenSubdiv_Evaluator *evaluator,
229  const int face_varying_channel,
230  struct OpenSubdiv_Buffer *src_buffer)
231 {
232  evaluator->impl->eval_output->wrapFVarSrcBuffer(face_varying_channel, src_buffer);
233 }
234 
235 bool hasVertexData(struct OpenSubdiv_Evaluator *evaluator)
236 {
237  return evaluator->impl->eval_output->hasVertexData();
238 }
239 
240 void assignFunctionPointers(OpenSubdiv_Evaluator *evaluator)
241 {
242  evaluator->setSettings = setSettings;
243 
244  evaluator->setCoarsePositions = setCoarsePositions;
245  evaluator->setVertexData = setVertexData;
246  evaluator->setVaryingData = setVaryingData;
247  evaluator->setFaceVaryingData = setFaceVaryingData;
248 
249  evaluator->setCoarsePositionsFromBuffer = setCoarsePositionsFromBuffer;
250  evaluator->setVaryingDataFromBuffer = setVaryingDataFromBuffer;
251  evaluator->setFaceVaryingDataFromBuffer = setFaceVaryingDataFromBuffer;
252 
253  evaluator->refine = refine;
254 
255  evaluator->evaluateLimit = evaluateLimit;
256  evaluator->evaluateVarying = evaluateVarying;
257  evaluator->evaluateVertexData = evaluateVertexData;
258  evaluator->evaluateFaceVarying = evaluateFaceVarying;
259 
260  evaluator->evaluatePatchesLimit = evaluatePatchesLimit;
261 
262  evaluator->getPatchMap = getPatchMap;
263 
264  evaluator->fillPatchArraysBuffer = fillPatchArraysBuffer;
265  evaluator->wrapPatchIndexBuffer = wrapPatchIndexBuffer;
266  evaluator->wrapPatchParamBuffer = wrapPatchParamBuffer;
267  evaluator->wrapSrcBuffer = wrapSrcBuffer;
268  evaluator->wrapSrcVertexDataBuffer = wrapSrcVertexDataBuffer;
269 
270  evaluator->fillFVarPatchArraysBuffer = fillFVarPatchArraysBuffer;
271  evaluator->wrapFVarPatchIndexBuffer = wrapFVarPatchIndexBuffer;
272  evaluator->wrapFVarPatchParamBuffer = wrapFVarPatchParamBuffer;
273  evaluator->wrapFVarSrcBuffer = wrapFVarSrcBuffer;
274 
275  evaluator->hasVertexData = hasVertexData;
276 }
277 
278 } // namespace
279 
281  OpenSubdiv_TopologyRefiner *topology_refiner,
282  eOpenSubdivEvaluator evaluator_type,
283  OpenSubdiv_EvaluatorCache *evaluator_cache)
284 {
285  OpenSubdiv_Evaluator *evaluator = MEM_new<OpenSubdiv_Evaluator>(__func__);
286  assignFunctionPointers(evaluator);
288  topology_refiner, evaluator_type, evaluator_cache ? evaluator_cache->impl : nullptr);
289  evaluator->type = evaluator->impl ? evaluator_type : static_cast<eOpenSubdivEvaluator>(0);
290  return evaluator;
291 }
292 
294 {
296  MEM_delete(evaluator);
297 }
298 
300 {
301  OpenSubdiv_EvaluatorCache *evaluator_cache = MEM_new<OpenSubdiv_EvaluatorCache>(__func__);
302  evaluator_cache->impl = openSubdiv_createEvaluatorCacheInternal(evaluator_type);
303  return evaluator_cache;
304 }
305 
307 {
308  if (!evaluator_cache) {
309  return;
310  }
311 
313  MEM_delete(evaluator_cache);
314 }
315 
317 {
318  /* Using a global string to avoid dealing with memory allocation/ownership. */
319  static std::string patch_basis_source;
320  if (patch_basis_source.empty()) {
321  patch_basis_source = OpenSubdiv::Osd::GLSLPatchShaderSource::GetPatchBasisShaderSource();
322  }
323  return patch_basis_source.c_str();
324 }
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei stride
Read Guarded memory(de)allocation.
void setVaryingData(const float *varying_data, const int start_vertex_index, const int num_vertices)
void wrapSrcBuffer(OpenSubdiv_Buffer *src_buffer)
void wrapFVarSrcBuffer(const int face_varying_channel, OpenSubdiv_Buffer *src_buffer)
void evaluatePatchesLimit(const OpenSubdiv_PatchCoord *patch_coords, const int num_patch_coords, float *P, float *dPdu, float *dPdv)
void wrapPatchIndexBuffer(OpenSubdiv_Buffer *patch_index_buffer)
void fillPatchArraysBuffer(OpenSubdiv_Buffer *patch_arrays_buffer)
void setSettings(const OpenSubdiv_EvaluatorSettings *settings)
void wrapPatchParamBuffer(OpenSubdiv_Buffer *patch_param_buffer)
void evaluateLimit(const int ptex_face_index, float face_u, float face_v, float P[3], float dPdu[3], float dPdv[3])
void evaluateFaceVarying(const int face_varying_channel, const int ptes_face_index, float face_u, float face_v, float face_varying[2])
void setFaceVaryingData(const int face_varying_channel, const float *varying_data, const int start_vertex_index, const int num_vertices)
void getPatchMap(OpenSubdiv_Buffer *patch_map_handles, OpenSubdiv_Buffer *patch_map_quadtree, int *min_patch_face, int *max_patch_face, int *max_depth, int *patches_are_triangular)
void wrapFVarPatchIndexBuffer(const int face_varying_channel, OpenSubdiv_Buffer *patch_index_buffer)
void fillFVarPatchArraysBuffer(const int face_varying_channel, OpenSubdiv_Buffer *patch_arrays_buffer)
void wrapSrcVertexDataBuffer(OpenSubdiv_Buffer *src_buffer)
void evaluateVertexData(const int ptes_face_index, float face_u, float face_v, float data[])
void setCoarsePositionsFromBuffer(const void *buffer, const int start_offset, const int stride, const int start_vertex_index, const int num_vertices)
void wrapFVarPatchParamBuffer(const int face_varying_channel, OpenSubdiv_Buffer *patch_param_buffer)
void setVaryingDataFromBuffer(const void *buffer, const int start_offset, const int stride, const int start_vertex_index, const int num_vertices)
void evaluateVarying(const int ptes_face_index, float face_u, float face_v, float varying[3])
void setFaceVaryingDataFromBuffer(const int face_varying_channel, const void *buffer, const int start_offset, const int stride, const int start_vertex_index, const int num_vertices)
void setVertexData(const float *data, const int start_vertex_index, const int num_vertices)
void setCoarsePositions(const float *positions, const int start_vertex_index, const int num_vertices)
void openSubdiv_deleteEvaluatorCacheInternal(OpenSubdiv_EvaluatorCacheImpl *evaluator_cache)
OpenSubdiv_EvaluatorCacheImpl * openSubdiv_createEvaluatorCacheInternal(eOpenSubdivEvaluator evaluator_type)
OpenSubdiv_Evaluator * openSubdiv_createEvaluatorFromTopologyRefiner(OpenSubdiv_TopologyRefiner *topology_refiner, eOpenSubdivEvaluator evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache)
void openSubdiv_deleteEvaluatorCache(OpenSubdiv_EvaluatorCache *evaluator_cache)
const char * openSubdiv_getGLSLPatchBasisSource(void)
void openSubdiv_deleteEvaluator(OpenSubdiv_Evaluator *evaluator)
OpenSubdiv_EvaluatorCache * openSubdiv_createEvaluatorCache(eOpenSubdivEvaluator evaluator_type)
OpenSubdiv_EvaluatorImpl * openSubdiv_createEvaluatorInternal(OpenSubdiv_TopologyRefiner *topology_refiner, eOpenSubdivEvaluator evaluator_type, OpenSubdiv_EvaluatorCacheImpl *evaluator_cache_descr)
void openSubdiv_deleteEvaluatorInternal(OpenSubdiv_EvaluatorImpl *evaluator)
ccl_global float * buffer
static float P(float k)
Definition: math_interp.c:25
MutableSpan< float3 > positions
eOpenSubdivEvaluator
struct OpenSubdiv_EvaluatorCacheImpl * impl
blender::opensubdiv::EvalOutputAPI * eval_output
void(* wrapSrcVertexDataBuffer)(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *src_buffer)
bool(* hasVertexData)(struct OpenSubdiv_Evaluator *evaluator)
void(* fillFVarPatchArraysBuffer)(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, struct OpenSubdiv_Buffer *patch_array_buffer)
void(* setVertexData)(struct OpenSubdiv_Evaluator *evaluator, const float *data, const int start_vertex_index, const int num_vertices)
void(* setVaryingDataFromBuffer)(struct OpenSubdiv_Evaluator *evaluator, const void *buffer, const int start_offset, const int stride, const int start_vertex_index, const int num_vertices)
void(* getPatchMap)(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *patch_map_handles, struct OpenSubdiv_Buffer *patch_map_quadtree, int *min_patch_face, int *max_patch_face, int *max_depth, int *patches_are_triangular)
void(* setVaryingData)(struct OpenSubdiv_Evaluator *evaluator, const float *varying_data, const int start_vertex_index, const int num_vertices)
void(* setCoarsePositionsFromBuffer)(struct OpenSubdiv_Evaluator *evaluator, const void *buffer, const int start_offset, const int stride, const int start_vertex_index, const int num_vertices)
void(* setCoarsePositions)(struct OpenSubdiv_Evaluator *evaluator, const float *positions, const int start_vertex_index, const int num_vertices)
void(* evaluateLimit)(struct OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, float P[3], float dPdu[3], float dPdv[3])
void(* wrapPatchIndexBuffer)(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *patch_index_buffer)
void(* setFaceVaryingDataFromBuffer)(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const void *buffer, const int start_offset, const int stride, const int start_vertex_index, const int num_vertices)
void(* setFaceVaryingData)(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const float *face_varying_data, const int start_vertex_index, const int num_vertices)
void(* fillPatchArraysBuffer)(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *patch_array_buffer)
struct OpenSubdiv_EvaluatorImpl * impl
void(* wrapFVarSrcBuffer)(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, struct OpenSubdiv_Buffer *src_buffer)
void(* wrapPatchParamBuffer)(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *patch_param_buffer)
void(* evaluateVertexData)(struct OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, float data[])
void(* wrapFVarPatchParamBuffer)(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, struct OpenSubdiv_Buffer *patch_param_buffer)
void(* evaluateFaceVarying)(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const int ptex_face_index, float face_u, float face_v, float face_varying[2])
void(* wrapFVarPatchIndexBuffer)(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, struct OpenSubdiv_Buffer *patch_index_buffer)
void(* wrapSrcBuffer)(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *src_buffer)
void(* evaluateVarying)(struct OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, float varying[3])
void(* evaluatePatchesLimit)(struct OpenSubdiv_Evaluator *evaluator, const struct OpenSubdiv_PatchCoord *patch_coords, const int num_patch_coords, float *P, float *dPdu, float *dPdv)
void(* refine)(struct OpenSubdiv_Evaluator *evaluator)
void(* setSettings)(struct OpenSubdiv_Evaluator *evaluator, const OpenSubdiv_EvaluatorSettings *settings)