Blender V4.3
opensubdiv_evaluator_capi.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2013 Blender Foundation
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include <cstdint> // for uint64_t
8
10
13struct OpenSubdiv_EvaluatorInternal;
15namespace blender::opensubdiv {
16class TopologyRefinerImpl;
17}
18
20 // Number of smoothly interpolated vertex data channels.
22};
23
24// Callback type for doing input/output operations on buffers.
25// Useful to abstract GPU buffers.
27 // Bind the buffer to the GPU.
28 void (*bind_gpu)(const OpenSubdiv_Buffer *buffer);
29
30 // Allocate the buffer directly on the host for the given size in bytes. This has to return
31 // a pointer to the newly allocated memory.
32 void *(*alloc)(const OpenSubdiv_Buffer *buffer, const unsigned int size);
33
34 // Allocate the buffer directly on the device for the given size in bytes.
35 void (*device_alloc)(const OpenSubdiv_Buffer *buffer, const unsigned int size);
36
37 // Update the given range of the buffer with new data.
38 void (*device_update)(const OpenSubdiv_Buffer *buffer,
39 unsigned int start,
40 unsigned int len,
41 const void *data);
42
43 // Wrap an existing GPU buffer, given its device handle, into the client's buffer type for
44 // read-only use.
46
47 // Offset in the buffer where the data starts, if a single buffer is used for multiple data
48 // channels.
50
51 // Pointer to the client buffer data, which is modified or initialized through the various
52 // callbacks.
53 void *data;
54};
55
57 // Set settings for data buffers used.
59 const OpenSubdiv_EvaluatorSettings *settings);
60
61 // Set coarse positions from a continuous array of coordinates.
63 const float *positions,
64 const int start_vertex_index,
65 const int num_vertices);
66 // Set vertex data from a continuous array of coordinates.
68 const float *data,
69 const int start_vertex_index,
70 const int num_vertices);
71 // Set varying data from a continuous array of data.
73 const float *varying_data,
74 const int start_vertex_index,
75 const int num_vertices);
76 // Set face varying data from a continuous array of data.
77 //
78 // TODO(sergey): Find a better name for vertex here. It is not the vertex of
79 // geometry, but a vertex of UV map.
81 const int face_varying_channel,
82 const float *face_varying_data,
83 const int start_vertex_index,
84 const int num_vertices);
85
86 // Set coarse vertex position from a continuous memory buffer where
87 // first coordinate starts at offset of `start_offset` and there is `stride`
88 // bytes between adjacent vertex coordinates.
90 const void *buffer,
91 const int start_offset,
92 const int stride,
93 const int start_vertex_index,
94 const int num_vertices);
95 // Set varying data from a continuous memory buffer where
96 // first coordinate starts at offset of `start_offset` and there is `stride`
97 // bytes between adjacent vertex coordinates.
99 const void *buffer,
100 const int start_offset,
101 const int stride,
102 const int start_vertex_index,
103 const int num_vertices);
104 // Set face varying data from a continuous memory buffer where
105 // first coordinate starts at offset of `start_offset` and there is `stride`
106 // bytes between adjacent vertex coordinates.
107 //
108 // TODO(sergey): Find a better name for vertex here. It is not the vertex of
109 // geometry, but a vertex of UV map.
111 const int face_varying_channel,
112 const void *buffer,
113 const int start_offset,
114 const int stride,
115 const int start_vertex_index,
116 const int num_vertices);
117
118 // Refine after coarse positions update.
119 void (*refine)(OpenSubdiv_Evaluator *evaluator);
120
121 // Evaluate given ptex face at given bilinear coordinate.
122 // If derivatives are NULL, they will not be evaluated.
124 const int ptex_face_index,
125 float face_u,
126 float face_v,
127 float P[3],
128 float dPdu[3],
129 float dPdv[3]);
130
131 // Evaluate vertex data at a given bilinear coordinate of given ptex face.
133 const int ptex_face_index,
134 float face_u,
135 float face_v,
136 float data[]);
137
138 // Evaluate varying data at a given bilinear coordinate of given ptex face.
140 const int ptex_face_index,
141 float face_u,
142 float face_v,
143 float varying[3]);
144
145 // Evaluate face-varying data at a given bilinear coordinate of given
146 // ptex face.
148 const int face_varying_channel,
149 const int ptex_face_index,
150 float face_u,
151 float face_v,
152 float face_varying[2]);
153
154 // Batched evaluation of multiple input coordinates.
155
156 // Evaluate limit surface.
157 // If derivatives are NULL, they will not be evaluated.
158 //
159 // NOTE: Output arrays must point to a memory of size float[3]*num_patch_coords.
161 const OpenSubdiv_PatchCoord *patch_coords,
162 const int num_patch_coords,
163 float *P,
164 float *dPdu,
165 float *dPdv);
166
167 // Copy the patch map to the given buffers, and output some topology information.
169 OpenSubdiv_Buffer *patch_map_handles,
170 OpenSubdiv_Buffer *patch_map_quadtree,
171 int *min_patch_face,
172 int *max_patch_face,
173 int *max_depth,
174 int *patches_are_triangular);
175
176 // Fill the given buffer with data from the evaluator's patch array buffer.
178 OpenSubdiv_Buffer *patch_array_buffer);
179
180 // Fill the given buffer with data from the evaluator's patch index buffer.
182 OpenSubdiv_Buffer *patch_index_buffer);
183
184 // Fill the given buffer with data from the evaluator's patch parameter buffer.
186 OpenSubdiv_Buffer *patch_param_buffer);
187
188 // Fill the given buffer with data from the evaluator's source buffer.
189 void (*wrapSrcBuffer)(OpenSubdiv_Evaluator *evaluator, OpenSubdiv_Buffer *src_buffer);
190
191 // Fill the given buffer with data from the evaluator's extra source buffer.
193
194 // Fill the given buffer with data from the evaluator's face varying patch array buffer.
196 const int face_varying_channel,
197 OpenSubdiv_Buffer *patch_array_buffer);
198
199 // Fill the given buffer with data from the evaluator's face varying patch index buffer.
201 const int face_varying_channel,
202 OpenSubdiv_Buffer *patch_index_buffer);
203
204 // Fill the given buffer with data from the evaluator's face varying patch parameter buffer.
206 const int face_varying_channel,
207 OpenSubdiv_Buffer *patch_param_buffer);
208
209 // Fill the given buffer with data from the evaluator's face varying source buffer.
211 const int face_varying_channel,
212 OpenSubdiv_Buffer *src_buffer);
213
214 // Return true if the evaluator has source vertex data set.
216
217 // Implementation of the evaluator.
219
220 // Type of the evaluator.
222};
223
225 // Implementation of the evaluator cache.
227};
228
231 eOpenSubdivEvaluator evaluator_type,
232 OpenSubdiv_EvaluatorCache *evaluator_cache);
233
235
237
239
240// Return the GLSL source code from the OpenSubDiv library used for patch evaluation.
241// This function is not thread-safe.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
int len
eOpenSubdivEvaluator
void openSubdiv_deleteEvaluatorCache(OpenSubdiv_EvaluatorCache *evaluator_cache)
const char * openSubdiv_getGLSLPatchBasisSource()
OpenSubdiv_Evaluator * openSubdiv_createEvaluatorFromTopologyRefiner(blender::opensubdiv::TopologyRefinerImpl *topology_refiner, eOpenSubdivEvaluator evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache)
void openSubdiv_deleteEvaluator(OpenSubdiv_Evaluator *evaluator)
OpenSubdiv_EvaluatorCache * openSubdiv_createEvaluatorCache(eOpenSubdivEvaluator evaluator_type)
unsigned __int64 uint64_t
Definition stdint.h:90
void(* device_update)(const OpenSubdiv_Buffer *buffer, unsigned int start, unsigned int len, const void *data)
void(* bind_gpu)(const OpenSubdiv_Buffer *buffer)
void(* wrap_device_handle)(const OpenSubdiv_Buffer *buffer, uint64_t device_ptr)
void(* device_alloc)(const OpenSubdiv_Buffer *buffer, const unsigned int size)
OpenSubdiv_EvaluatorCacheImpl * impl
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)
uint64_t device_ptr
Definition util/types.h:45