35 switch (evaluator_type) {
83static void set_coarse_positions(Subdiv *subdiv,
88 if (verts_no_face.
count == 0) {
90 evaluator,
reinterpret_cast<const float *
>(positions.data()), 0, positions.size());
95 int used_vert_count = 0;
96 for (
const int vert : positions.index_range()) {
100 used_vert_positions[used_vert_count] = positions[vert];
104 reinterpret_cast<const float *
>(used_vert_positions.data()),
106 used_vert_positions.size());
110struct FaceVaryingDataFromUVContext {
111 opensubdiv::TopologyRefinerImpl *topology_refiner;
113 OffsetIndices<int>
faces;
114 const float (*mloopuv)[2];
119static void set_face_varying_data_from_uv_task(
void *__restrict userdata,
120 const int face_index,
123 FaceVaryingDataFromUVContext *ctx =
static_cast<FaceVaryingDataFromUVContext *
>(userdata);
124 opensubdiv::TopologyRefinerImpl *topology_refiner = ctx->topology_refiner;
125 const int layer_index = ctx->layer_index;
126 const float(*mluv)[2] = &ctx->mloopuv[ctx->faces[face_index].start()];
131 const OpenSubdiv::Vtr::ConstIndexArray uv_indices =
132 topology_refiner->base_level().GetFaceFVarValues(face_index, layer_index);
133 for (
int vertex_index = 0; vertex_index < uv_indices.size(); vertex_index++, mluv++) {
134 copy_v2_v2(ctx->buffer[uv_indices[vertex_index]], *mluv);
138static void set_face_varying_data_from_uv(Subdiv *subdiv,
140 const float (*mloopuv)[2],
141 const int layer_index)
143 opensubdiv::TopologyRefinerImpl *topology_refiner = subdiv->topology_refiner;
145 const int num_faces = topology_refiner->base_level().GetNumFaces();
146 const float(*mluv)[2] = mloopuv;
148 const int num_fvar_values = topology_refiner->base_level().GetNumFVarValues(layer_index);
150 float(*buffer)[2] =
static_cast<float(*)[2]
>(
151 MEM_mallocN(
sizeof(
float[2]) * num_fvar_values, __func__));
153 FaceVaryingDataFromUVContext ctx;
154 ctx.topology_refiner = topology_refiner;
155 ctx.layer_index = layer_index;
158 ctx.faces = mesh->faces();
166 0, num_faces, &ctx, set_face_varying_data_from_uv_task, ¶llel_range_settings);
168 evaluator->
setFaceVaryingData(evaluator, layer_index, &buffer[0][0], 0, num_fvar_values);
173static void set_vertex_data_from_orco(Subdiv *subdiv,
const Mesh *mesh)
175 const float(*orco)[3] =
static_cast<const float(*)[3]
>(
177 const float(*cloth_orco)[3] =
static_cast<const float(*)[3]
>(
180 if (orco || cloth_orco) {
183 const int num_verts = topology_refiner->
base_level().GetNumVertices();
185 if (orco && cloth_orco) {
187 for (
int i = 0; i < num_verts; i++) {
199 else if (cloth_orco) {
200 evaluator->
setVertexData(evaluator, cloth_orco[0], 0, num_verts);
220#ifdef WITH_OPENSUBDIV
222 get_mesh_evaluator_settings(&settings, mesh);
223 if (!
eval_begin(subdiv, evaluator_type, evaluator_cache, &settings)) {
228 UNUSED_VARS(subdiv, mesh, coarse_vert_positions, evaluator_type, evaluator_cache);
237#ifdef WITH_OPENSUBDIV
244 set_coarse_positions(subdiv,
245 coarse_vert_positions.
is_empty() ? mesh->vert_positions() :
246 coarse_vert_positions,
247 mesh->verts_no_face());
251 for (
int layer_index = 0; layer_index < num_uv_layers; layer_index++) {
252 const float(*mloopuv)[2] =
static_cast<const float(*)[2]
>(
254 set_face_varying_data_from_uv(subdiv, mesh, mloopuv, layer_index);
257 set_vertex_data_from_orco(subdiv, mesh);
285 Subdiv *subdiv,
const int ptex_face_index,
const float u,
const float v,
float r_P[3])
291 const int ptex_face_index,
311 if (r_dPdu !=
nullptr && r_dPdv !=
nullptr) {
315 u * 0.999f + 0.0005f,
316 v * 0.999f + 0.0005f,
325 const int ptex_face_index,
331 float dPdu[3], dPdv[3];
338 Subdiv *subdiv,
const int ptex_face_index,
const float u,
const float v,
float r_vertex_data[])
344 const int face_varying_channel,
345 const int ptex_face_index,
348 float r_face_varying[2])
351 subdiv->
evaluator, face_varying_channel, ptex_face_index, u,
v, r_face_varying);
355 const int ptex_face_index,
371 Subdiv *subdiv,
const int ptex_face_index,
const float u,
const float v,
float r_P[3])
374 float dPdu[3], dPdv[3], D[3];
CustomData interface, see also DNA_customdata_types.h.
const void * CustomData_get_layer_n(const CustomData *data, eCustomDataType type, int n)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
int CustomData_number_of_layers(const CustomData *data, eCustomDataType type)
#define BLI_assert_msg(a, msg)
MINLINE bool equals_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert * v
constexpr bool is_empty() const
const OpenSubdiv::Far::TopologyLevel & base_level() const
OpenSubdiv::Far::TopologyRefiner * topology_refiner
draw_view in_light_buf[] float
OpenSubdiv_Evaluator * openSubdiv_createEvaluatorFromTopologyRefiner(blender::opensubdiv::TopologyRefinerImpl *topology_refiner, eOpenSubdivEvaluator evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void eval_init_displacement(Subdiv *subdiv)
void eval_vertex_data(Subdiv *subdiv, const int ptex_face_index, const float u, const float v, float r_vertex_data[])
bool eval_begin_from_mesh(Subdiv *subdiv, const Mesh *mesh, Span< float3 > coarse_vert_positions, eSubdivEvaluatorType evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache)
void eval_limit_point(Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3])
void eval_displacement(Subdiv *subdiv, int ptex_face_index, float u, float v, const float dPdu[3], const float dPdv[3], float r_D[3])
void eval_limit_point_and_derivatives(Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3], float r_dPdu[3], float r_dPdv[3])
void eval_limit_point_and_normal(Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3], float r_N[3])
bool eval_begin(Subdiv *subdiv, eSubdivEvaluatorType evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache, const OpenSubdiv_EvaluatorSettings *settings)
void eval_face_varying(Subdiv *subdiv, int face_varying_channel, int ptex_face_index, float u, float v, float r_face_varying[2])
void stats_reset(SubdivStats *stats, StatsValue value)
static eOpenSubdivEvaluator opensubdiv_evalutor_from_subdiv_evaluator_type(eSubdivEvaluatorType evaluator_type)
@ SUBDIV_EVALUATOR_TYPE_GPU
@ SUBDIV_EVALUATOR_TYPE_CPU
void stats_begin(SubdivStats *stats, StatsValue value)
void stats_end(SubdivStats *stats, StatsValue value)
bool eval_refine_from_mesh(Subdiv *subdiv, const Mesh *mesh, Span< float3 > coarse_vert_positions)
@ SUBDIV_STATS_EVALUATOR_CREATE
@ SUBDIV_STATS_EVALUATOR_REFINE
void eval_final_point(Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3])
@ OPENSUBDIV_EVALUATOR_GPU
@ OPENSUBDIV_EVALUATOR_CPU
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(* setCoarsePositions)(OpenSubdiv_Evaluator *evaluator, const float *positions, const int start_vertex_index, const int num_vertices)
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(* setFaceVaryingData)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const float *face_varying_data, const int start_vertex_index, const int num_vertices)
void(* setSettings)(OpenSubdiv_Evaluator *evaluator, const OpenSubdiv_EvaluatorSettings *settings)
void(* setVertexData)(OpenSubdiv_Evaluator *evaluator, const float *data, const int start_vertex_index, const int num_vertices)
blender::BitVector is_loose_bits
void(* eval_displacement)(Displacement *displacement, int ptex_face_index, float u, float v, const float dPdu[3], const float dPdv[3], float r_D[3])
void(* initialize)(Displacement *displacement)
Displacement * displacement_evaluator
OpenSubdiv_Evaluator * evaluator
blender::opensubdiv::TopologyRefinerImpl * topology_refiner