Blender V4.3
evaluator_capi.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2015 Blender Foundation
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later
4 *
5 * Author: Sergey Sharybin. */
6
8
9#include <opensubdiv/osd/glslPatchShaderSource.h>
10
11#include "MEM_guardedalloc.h"
12#include <new>
13
16
17static void setSettings(struct OpenSubdiv_Evaluator *evaluator,
18 const OpenSubdiv_EvaluatorSettings *settings)
19{
20 evaluator->impl->eval_output->setSettings(settings);
21}
22
24 const float *positions,
25 const int start_vertex_index,
26 const int num_vertices)
27{
28 evaluator->impl->eval_output->setCoarsePositions(positions, start_vertex_index, num_vertices);
29}
30
31static void setVertexData(OpenSubdiv_Evaluator *evaluator,
32 const float *vertex_data,
33 const int start_vertex_index,
34 const int num_vertices)
35{
36 evaluator->impl->eval_output->setVertexData(vertex_data, start_vertex_index, num_vertices);
37}
38
39static void setVaryingData(OpenSubdiv_Evaluator *evaluator,
40 const float *varying_data,
41 const int start_vertex_index,
42 const int num_vertices)
43{
44 evaluator->impl->eval_output->setVaryingData(varying_data, start_vertex_index, num_vertices);
45}
46
48 const int face_varying_channel,
49 const float *face_varying_data,
50 const int start_vertex_index,
51 const int num_vertices)
52{
54 face_varying_channel, face_varying_data, start_vertex_index, num_vertices);
55}
56
58 const void *buffer,
59 const int start_offset,
60 const int stride,
61 const int start_vertex_index,
62 const int num_vertices)
63{
65 buffer, start_offset, stride, start_vertex_index, num_vertices);
66}
67
69 const void *buffer,
70 const int start_offset,
71 const int stride,
72 const int start_vertex_index,
73 const int num_vertices)
74{
76 buffer, start_offset, stride, start_vertex_index, num_vertices);
77}
78
80 const int face_varying_channel,
81 const void *buffer,
82 const int start_offset,
83 const int stride,
84 const int start_vertex_index,
85 const int num_vertices)
86{
88 face_varying_channel, buffer, start_offset, stride, start_vertex_index, num_vertices);
89}
90
91static void refine(OpenSubdiv_Evaluator *evaluator)
92{
93 evaluator->impl->eval_output->refine();
94}
95
96static void evaluateLimit(OpenSubdiv_Evaluator *evaluator,
97 const int ptex_face_index,
98 const float face_u,
99 const float face_v,
100 float P[3],
101 float dPdu[3],
102 float dPdv[3])
103{
104 evaluator->impl->eval_output->evaluateLimit(ptex_face_index, face_u, face_v, P, dPdu, dPdv);
105}
106
108 const OpenSubdiv_PatchCoord *patch_coords,
109 const int num_patch_coords,
110 float *P,
111 float *dPdu,
112 float *dPdv)
113{
115 patch_coords, num_patch_coords, P, dPdu, dPdv);
116}
117
119 const int ptex_face_index,
120 float face_u,
121 float face_v,
122 float vertex_data[3])
123{
124 evaluator->impl->eval_output->evaluateVertexData(ptex_face_index, face_u, face_v, vertex_data);
125}
126
128 const int ptex_face_index,
129 float face_u,
130 float face_v,
131 float varying[3])
132{
133 evaluator->impl->eval_output->evaluateVarying(ptex_face_index, face_u, face_v, varying);
134}
135
137 const int face_varying_channel,
138 const int ptex_face_index,
139 float face_u,
140 float face_v,
141 float face_varying[2])
142{
144 face_varying_channel, ptex_face_index, face_u, face_v, face_varying);
145}
146
147static void getPatchMap(struct OpenSubdiv_Evaluator *evaluator,
148 struct OpenSubdiv_Buffer *patch_map_handles,
149 struct OpenSubdiv_Buffer *patch_map_quadtree,
150 int *min_patch_face,
151 int *max_patch_face,
152 int *max_depth,
153 int *patches_are_triangular)
154{
155 evaluator->impl->eval_output->getPatchMap(patch_map_handles,
156 patch_map_quadtree,
157 min_patch_face,
158 max_patch_face,
159 max_depth,
160 patches_are_triangular);
161}
162
163static void fillPatchArraysBuffer(struct OpenSubdiv_Evaluator *evaluator,
164 struct OpenSubdiv_Buffer *patch_array_buffer)
165{
166 evaluator->impl->eval_output->fillPatchArraysBuffer(patch_array_buffer);
167}
168
169static void wrapPatchIndexBuffer(struct OpenSubdiv_Evaluator *evaluator,
170 struct OpenSubdiv_Buffer *patch_index_buffer)
171{
172 evaluator->impl->eval_output->wrapPatchIndexBuffer(patch_index_buffer);
173}
174
175static void wrapPatchParamBuffer(struct OpenSubdiv_Evaluator *evaluator,
176 struct OpenSubdiv_Buffer *patch_param_buffer)
177{
178 evaluator->impl->eval_output->wrapPatchParamBuffer(patch_param_buffer);
179}
180
181static void wrapSrcBuffer(struct OpenSubdiv_Evaluator *evaluator,
182 struct OpenSubdiv_Buffer *src_buffer)
183{
184 evaluator->impl->eval_output->wrapSrcBuffer(src_buffer);
185}
186
187static void wrapSrcVertexDataBuffer(struct OpenSubdiv_Evaluator *evaluator,
188 struct OpenSubdiv_Buffer *src_buffer)
189{
190 evaluator->impl->eval_output->wrapSrcVertexDataBuffer(src_buffer);
191}
192
194 const int face_varying_channel,
195 struct OpenSubdiv_Buffer *patch_array_buffer)
196{
197 evaluator->impl->eval_output->fillFVarPatchArraysBuffer(face_varying_channel,
198 patch_array_buffer);
199}
200
201static void wrapFVarPatchIndexBuffer(struct OpenSubdiv_Evaluator *evaluator,
202 const int face_varying_channel,
203 struct OpenSubdiv_Buffer *patch_index_buffer)
204{
205 evaluator->impl->eval_output->wrapFVarPatchIndexBuffer(face_varying_channel, patch_index_buffer);
206}
207
208static void wrapFVarPatchParamBuffer(struct OpenSubdiv_Evaluator *evaluator,
209 const int face_varying_channel,
210 struct OpenSubdiv_Buffer *patch_param_buffer)
211{
212 evaluator->impl->eval_output->wrapFVarPatchParamBuffer(face_varying_channel, patch_param_buffer);
213}
214
215static void wrapFVarSrcBuffer(struct OpenSubdiv_Evaluator *evaluator,
216 const int face_varying_channel,
217 struct OpenSubdiv_Buffer *src_buffer)
218{
219 evaluator->impl->eval_output->wrapFVarSrcBuffer(face_varying_channel, src_buffer);
220}
221
222static bool hasVertexData(struct OpenSubdiv_Evaluator *evaluator)
223{
224 return evaluator->impl->eval_output->hasVertexData();
225}
226
228{
229 evaluator->setSettings = setSettings;
230
232 evaluator->setVertexData = setVertexData;
233 evaluator->setVaryingData = setVaryingData;
235
239
240 evaluator->refine = refine;
241
242 evaluator->evaluateLimit = evaluateLimit;
243 evaluator->evaluateVarying = evaluateVarying;
246
248
249 evaluator->getPatchMap = getPatchMap;
250
254 evaluator->wrapSrcBuffer = wrapSrcBuffer;
256
261
262 evaluator->hasVertexData = hasVertexData;
263}
264
267 eOpenSubdivEvaluator evaluator_type,
268 OpenSubdiv_EvaluatorCache *evaluator_cache)
269{
270 OpenSubdiv_Evaluator *evaluator = MEM_new<OpenSubdiv_Evaluator>(__func__);
271 assignFunctionPointers(evaluator);
273 topology_refiner, evaluator_type, evaluator_cache ? evaluator_cache->impl : nullptr);
274 evaluator->type = evaluator->impl ? evaluator_type : static_cast<eOpenSubdivEvaluator>(0);
275 return evaluator;
276}
277
279{
281 MEM_delete(evaluator);
282}
283
285{
286 OpenSubdiv_EvaluatorCache *evaluator_cache = MEM_new<OpenSubdiv_EvaluatorCache>(__func__);
287 evaluator_cache->impl = openSubdiv_createEvaluatorCacheInternal(evaluator_type);
288 return evaluator_cache;
289}
290
292{
293 if (!evaluator_cache) {
294 return;
295 }
296
298 MEM_delete(evaluator_cache);
299}
300
302{
303 /* Using a global string to avoid dealing with memory allocation/ownership. */
304 static std::string patch_basis_source;
305 if (patch_basis_source.empty()) {
306 patch_basis_source = OpenSubdiv::Osd::GLSLPatchShaderSource::GetPatchBasisShaderSource();
307 }
308 return patch_basis_source.c_str();
309}
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)
OpenSubdiv_EvaluatorCacheImpl * openSubdiv_createEvaluatorCacheInternal(eOpenSubdivEvaluator evaluator_type)
void openSubdiv_deleteEvaluatorCacheInternal(OpenSubdiv_EvaluatorCacheImpl *evaluator_cache)
static void fillFVarPatchArraysBuffer(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, struct OpenSubdiv_Buffer *patch_array_buffer)
static void setFaceVaryingDataFromBuffer(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)
static void fillPatchArraysBuffer(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *patch_array_buffer)
static void evaluateVertexData(OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, float vertex_data[3])
static void wrapFVarSrcBuffer(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, struct OpenSubdiv_Buffer *src_buffer)
static void setVaryingDataFromBuffer(OpenSubdiv_Evaluator *evaluator, const void *buffer, const int start_offset, const int stride, const int start_vertex_index, const int num_vertices)
void openSubdiv_deleteEvaluatorCache(OpenSubdiv_EvaluatorCache *evaluator_cache)
static void wrapPatchParamBuffer(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *patch_param_buffer)
static void refine(OpenSubdiv_Evaluator *evaluator)
static void setCoarsePositionsFromBuffer(OpenSubdiv_Evaluator *evaluator, const void *buffer, const int start_offset, const int stride, const int start_vertex_index, const int num_vertices)
static 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)
static void evaluateLimit(OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, const float face_u, const float face_v, float P[3], float dPdu[3], float dPdv[3])
static void setFaceVaryingData(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const float *face_varying_data, const int start_vertex_index, const int num_vertices)
static void wrapFVarPatchIndexBuffer(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, struct OpenSubdiv_Buffer *patch_index_buffer)
static void evaluatePatchesLimit(OpenSubdiv_Evaluator *evaluator, const OpenSubdiv_PatchCoord *patch_coords, const int num_patch_coords, float *P, float *dPdu, float *dPdv)
static void evaluateVarying(OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, float varying[3])
static void evaluateFaceVarying(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const int ptex_face_index, float face_u, float face_v, float face_varying[2])
static void setSettings(struct OpenSubdiv_Evaluator *evaluator, const OpenSubdiv_EvaluatorSettings *settings)
static void wrapPatchIndexBuffer(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *patch_index_buffer)
static void assignFunctionPointers(OpenSubdiv_Evaluator *evaluator)
static void wrapFVarPatchParamBuffer(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, struct OpenSubdiv_Buffer *patch_param_buffer)
static bool hasVertexData(struct OpenSubdiv_Evaluator *evaluator)
static void wrapSrcBuffer(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *src_buffer)
OpenSubdiv_Evaluator * openSubdiv_createEvaluatorFromTopologyRefiner(blender::opensubdiv::TopologyRefinerImpl *topology_refiner, eOpenSubdivEvaluator evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache)
static void setVertexData(OpenSubdiv_Evaluator *evaluator, const float *vertex_data, const int start_vertex_index, const int num_vertices)
static void wrapSrcVertexDataBuffer(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *src_buffer)
static void setCoarsePositions(OpenSubdiv_Evaluator *evaluator, const float *positions, const int start_vertex_index, const int num_vertices)
const char * openSubdiv_getGLSLPatchBasisSource(void)
void openSubdiv_deleteEvaluator(OpenSubdiv_Evaluator *evaluator)
static void setVaryingData(OpenSubdiv_Evaluator *evaluator, const float *varying_data, const int start_vertex_index, const int num_vertices)
OpenSubdiv_EvaluatorCache * openSubdiv_createEvaluatorCache(eOpenSubdivEvaluator evaluator_type)
void openSubdiv_deleteEvaluatorInternal(OpenSubdiv_EvaluatorImpl *evaluator)
OpenSubdiv_EvaluatorImpl * openSubdiv_createEvaluatorInternal(blender::opensubdiv::TopologyRefinerImpl *topology_refiner, eOpenSubdivEvaluator evaluator_type, OpenSubdiv_EvaluatorCacheImpl *evaluator_cache_descr)
eOpenSubdivEvaluator
OpenSubdiv_EvaluatorCacheImpl * impl
blender::opensubdiv::EvalOutputAPI * eval_output
void(* evaluateLimit)(OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, float P[3], float dPdu[3], float dPdv[3])
void(* evaluateVertexData)(OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, float data[])
void(* setVaryingDataFromBuffer)(OpenSubdiv_Evaluator *evaluator, const void *buffer, const int start_offset, const int stride, const int start_vertex_index, const int num_vertices)
void(* setCoarsePositions)(OpenSubdiv_Evaluator *evaluator, const float *positions, const int start_vertex_index, const int num_vertices)
void(* evaluatePatchesLimit)(OpenSubdiv_Evaluator *evaluator, const OpenSubdiv_PatchCoord *patch_coords, const int num_patch_coords, float *P, float *dPdu, float *dPdv)
void(* wrapFVarPatchIndexBuffer)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, OpenSubdiv_Buffer *patch_index_buffer)
void(* refine)(OpenSubdiv_Evaluator *evaluator)
void(* evaluateFaceVarying)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const int ptex_face_index, float face_u, float face_v, float face_varying[2])
void(* wrapPatchIndexBuffer)(OpenSubdiv_Evaluator *evaluator, OpenSubdiv_Buffer *patch_index_buffer)
void(* wrapFVarSrcBuffer)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, OpenSubdiv_Buffer *src_buffer)
void(* fillPatchArraysBuffer)(OpenSubdiv_Evaluator *evaluator, OpenSubdiv_Buffer *patch_array_buffer)
void(* setFaceVaryingData)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const float *face_varying_data, const int start_vertex_index, const int num_vertices)
void(* evaluateVarying)(OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, float varying[3])
OpenSubdiv_EvaluatorImpl * impl
bool(* hasVertexData)(OpenSubdiv_Evaluator *evaluator)
void(* setVaryingData)(OpenSubdiv_Evaluator *evaluator, const float *varying_data, const int start_vertex_index, const int num_vertices)
void(* getPatchMap)(OpenSubdiv_Evaluator *evaluator, 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(* wrapSrcVertexDataBuffer)(OpenSubdiv_Evaluator *evaluator, OpenSubdiv_Buffer *src_buffer)
void(* setFaceVaryingDataFromBuffer)(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(* wrapPatchParamBuffer)(OpenSubdiv_Evaluator *evaluator, OpenSubdiv_Buffer *patch_param_buffer)
void(* setSettings)(OpenSubdiv_Evaluator *evaluator, const OpenSubdiv_EvaluatorSettings *settings)
void(* wrapFVarPatchParamBuffer)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, OpenSubdiv_Buffer *patch_param_buffer)
void(* wrapSrcBuffer)(OpenSubdiv_Evaluator *evaluator, OpenSubdiv_Buffer *src_buffer)
void(* fillFVarPatchArraysBuffer)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, OpenSubdiv_Buffer *patch_array_buffer)
void(* setCoarsePositionsFromBuffer)(OpenSubdiv_Evaluator *evaluator, const void *buffer, const int start_offset, const int stride, const int start_vertex_index, const int num_vertices)
void(* setVertexData)(OpenSubdiv_Evaluator *evaluator, const float *data, const int start_vertex_index, const int num_vertices)