68 *reshape_context = {};
76 "face_start_grid_index");
78 int num_ptex_faces = 0;
79 for (
const int face_index :
faces.index_range()) {
80 const int num_corners =
faces[face_index].size();
82 num_grids += num_corners;
83 num_ptex_faces += (num_corners == 4) ? 1 : num_corners;
87 "grid_to_face_index");
89 "ptex_start_grid_index");
90 for (
int face_index = 0, grid_index = 0, ptex_index = 0; face_index <
faces.size(); ++face_index)
92 const int num_corners =
faces[face_index].size();
93 const int num_face_ptex_faces = (num_corners == 4) ? 1 : num_corners;
94 for (
int i = 0;
i < num_face_ptex_faces; ++
i) {
97 for (
int corner = 0; corner < num_corners; ++corner, ++grid_index) {
100 ptex_index += num_face_ptex_faces;
130 if (reshape_context->
mdisps ==
nullptr) {
153 const bool use_render_params =
false;
159 reshape_context->
mmd = mmd;
163 reshape_context->
base_edges = base_mesh->edges();
164 reshape_context->
base_faces = base_mesh->faces();
169 if (!reshape_context->
subdiv) {
175 scene_eval,
object, mmd, use_render_params,
true);
197 const bool use_render_params =
false;
203 reshape_context->
mmd = mmd;
207 reshape_context->
base_edges = base_mesh->edges();
208 reshape_context->
base_faces = base_mesh->faces();
213 if (!reshape_context->
subdiv) {
219 scene_eval,
object, mmd, use_render_params,
true);
244 reshape_context->
base_edges = base_mesh->edges();
245 reshape_context->
base_faces = base_mesh->faces();
256 reshape_context->
top.
level = top_level;
273 reshape_context,
object, mmd,
subdiv, top_level);
292 reshape_context->
mmd = mmd;
295 reshape_context->
base_edges = base_mesh->edges();
296 reshape_context->
base_faces = base_mesh->faces();
310 reshape_context->
top.
level = top_level;
323 if (orig_mdisps ==
nullptr && orig_grid_paint_masks ==
nullptr) {
327 const int num_grids = reshape_context->
num_grids;
328 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
329 if (orig_mdisps !=
nullptr) {
330 MDisps *orig_grid = &orig_mdisps[grid_index];
333 if (orig_grid_paint_masks !=
nullptr) {
334 GridPaintMask *orig_paint_mask_grid = &orig_grid_paint_masks[grid_index];
369 BLI_assert(grid_index < reshape_context->num_grids);
380 BLI_assert(grid_index < reshape_context->num_grids);
391 return reshape_context->
base_faces[face_index].size() == 4;
400 return reshape_context->
face_ptex_offset[face_index] + (is_quad ? 0 : corner);
411 float corner_u, corner_v;
413 grid_coord->
u, grid_coord->
v, &corner_u, &corner_v);
419 float grid_u, grid_v;
422 corner, grid_u, grid_v, &ptex_coord.
u, &ptex_coord.
v);
425 ptex_coord.
u = corner_u;
426 ptex_coord.
v = corner_v;
443 ptex_coord->
u, ptex_coord->
v, &grid_coord.
u, &grid_coord.
v);
447 grid_coord.
u = ptex_coord->
u;
448 grid_coord.
v = ptex_coord->
v;
450 grid_coord.
grid_index = start_grid_index + corner_delta;
453 grid_coord.
u, grid_coord.
v, &grid_coord.
u, &grid_coord.
v);
459 const int face_index,
463 float r_tangent_matrix[3][3])
468 const int tangent_corner = is_quad ? corner : 0;
478 const int grid_x = lround(grid_coord->
u * (grid_size - 1));
479 const int grid_y = lround(grid_coord->
v * (grid_size - 1));
480 const int grid_element_index = grid_y * grid_size + grid_x;
482 if (reshape_context->
mdisps !=
nullptr) {
489 grid_element.
mask = &grid_paint_mask->
data[grid_element_index];
508 if (mdisps !=
nullptr) {
510 if (displacement_grid->
disps !=
nullptr) {
512 const int grid_x = lround(grid_coord->
u * (grid_size - 1));
513 const int grid_y = lround(grid_coord->
v * (grid_size - 1));
514 const int grid_element_index = grid_y * grid_size + grid_x;
520 if (grid_paint_masks !=
nullptr) {
522 if (paint_mask_grid->
data !=
nullptr) {
524 const int grid_x = lround(grid_coord->
u * (grid_size - 1));
525 const int grid_y = lround(grid_coord->
v * (grid_size - 1));
526 const int grid_element_index = grid_y * grid_size + grid_x;
527 grid_element.
mask = paint_mask_grid->
data[grid_element_index];
543 float r_tangent_matrix[3][3])
545 float dPdu[3], dPdv[3];
555 reshape_context, face_index, corner, dPdu, dPdv, r_tangent_matrix);
567 const int grid_area = grid_size * grid_size;
569 if (displacement_grid->
disps !=
nullptr) {
573 displacement_grid->
disps = disps;
574 displacement_grid->
totdisp = grid_area;
575 displacement_grid->
level = level;
580 if (displacement_grid->
disps !=
nullptr && displacement_grid->
level >= level) {
588 const int num_grids =
mesh->corners_num;
591 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
600 if (grid_paint_masks ==
nullptr) {
603 const int num_grids =
mesh->corners_num;
605 const int grid_area = grid_size * grid_size;
606 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
607 GridPaintMask *grid_paint_mask = &grid_paint_masks[grid_index];
608 if (grid_paint_mask->
level >= level) {
611 grid_paint_mask->
level = level;
612 if (grid_paint_mask->
data) {
639 if (grid_paint_masks !=
nullptr) {
643 const int num_grids = reshape_context->
num_grids;
644 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
645 MDisps *orig_grid = &orig_mdisps[grid_index];
650 if (orig_grid->
disps !=
nullptr) {
653 if (orig_grid_paint_masks !=
nullptr) {
654 GridPaintMask *orig_paint_mask_grid = &orig_grid_paint_masks[grid_index];
655 if (orig_paint_mask_grid->
data !=
nullptr) {
656 orig_paint_mask_grid->
data =
static_cast<float *
>(
681 const int face_index,
689 const int grid_size =
data->grid_size;
690 const float grid_size_1_inv = 1.0f / (float(grid_size) - 1.0f);
692 const int num_corners =
faces[face_index].size();
694 for (
int corner = 0; corner < num_corners; ++corner, ++grid_index) {
695 for (
int y = 0;
y < grid_size; ++
y) {
696 const float v = float(
y) * grid_size_1_inv;
697 for (
int x = 0;
x < grid_size; ++
x) {
698 const float u = float(
x) * grid_size_1_inv;
705 data->callback(
data->reshape_context, &grid_coord,
data->callback_userdata_v);
718 data.reshape_context = reshape_context;
720 data.grid_size_1_inv = 1.0f / (float(
data.grid_size) - 1.0f);
721 data.callback = callback;
722 data.callback_userdata_v = userdata_v;
729 const int num_faces = base_mesh->
faces_num;
740 float tangent_matrix[3][3];
743 float inv_tangent_matrix[3][3];
781 float tangent_matrix[3][3];
804 float tangent_matrix[3][3];
817 if (grid_element.
mask !=
nullptr) {
818 *grid_element.
mask = orig_grid_element.
mask;
CustomData interface, see also DNA_customdata_types.h.
const CustomData_MeshMasks CD_MASK_BAREMESH
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
void BKE_multires_subdiv_settings_init(blender::bke::subdiv::Settings *settings, const MultiresModifierData *mmd)
BLI_INLINE void BKE_multires_construct_tangent_matrix(float tangent_matrix[3][3], const float dPdu[3], const float dPdv[3], int corner)
int multires_get_level(const Scene *scene, const Object *ob, const MultiresModifierData *mmd, bool render, bool ignore_simplify)
bool invert_m3_m3(float inverse[3][3], const float mat[3][3])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[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)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v
BPy_StructRNA * depsgraph
GAttributeReader lookup(const StringRef attribute_id) const
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
int multires_reshape_grid_to_face_index(const MultiresReshapeContext *reshape_context, int grid_index)
void multires_reshape_assign_final_elements_from_orig_mdisps(const MultiresReshapeContext *reshape_context)
static void ensure_displacement_grids(Mesh *mesh, const int grid_level)
bool multires_reshape_is_quad_face(const MultiresReshapeContext *reshape_context, int face_index)
void multires_reshape_assign_final_coords_from_mdisps(const MultiresReshapeContext *reshape_context)
static void context_init_grid_pointers(MultiresReshapeContext *reshape_context)
bool multires_reshape_context_create_from_object(MultiresReshapeContext *reshape_context, Depsgraph *depsgraph, Object *object, MultiresModifierData *mmd)
static void object_grid_element_to_tangent_displacement(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, void *)
bool multires_reshape_context_create_from_subdiv(MultiresReshapeContext *reshape_context, Object *object, MultiresModifierData *mmd, blender::bke::subdiv::Subdiv *subdiv, int top_level)
static bool context_verify_or_free(MultiresReshapeContext *reshape_context)
ReshapeGridElement multires_reshape_grid_element_for_grid_coord(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord)
int multires_reshape_grid_to_ptex_index(const MultiresReshapeContext *reshape_context, int grid_index)
static void context_init_lookup(MultiresReshapeContext *reshape_context)
PTexCoord multires_reshape_grid_coord_to_ptex(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord)
void multires_reshape_context_free(MultiresReshapeContext *reshape_context)
void multires_reshape_store_original_grids(MultiresReshapeContext *reshape_context)
static void assign_final_coords_from_mdisps(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, void *)
static void assign_final_elements_from_orig_mdisps(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, void *)
static void allocate_displacement_grid(MDisps *displacement_grid, const int level)
static void context_init_common(MultiresReshapeContext *reshape_context)
int multires_reshape_grid_to_corner(const MultiresReshapeContext *reshape_context, int grid_index)
void multires_reshape_tangent_matrix_for_corner(const MultiresReshapeContext *reshape_context, const int face_index, const int corner, const float dPdu[3], const float dPdv[3], float r_tangent_matrix[3][3])
static void foreach_grid_face_coordinate_task(void *__restrict userdata_v, const int face_index, const TaskParallelTLS *__restrict)
void multires_reshape_ensure_grids(Mesh *mesh, const int level)
void multires_reshape_free_original_grids(MultiresReshapeContext *reshape_context)
static void foreach_grid_coordinate(const MultiresReshapeContext *reshape_context, const int level, ForeachGridCoordinateCallback callback, void *userdata_v)
blender::bke::subdiv::Subdiv * multires_reshape_create_subdiv(Depsgraph *depsgraph, Object *object, const MultiresModifierData *mmd)
static void context_zero(MultiresReshapeContext *reshape_context)
bool multires_reshape_context_create_from_modifier(MultiresReshapeContext *reshape_context, Object *object, MultiresModifierData *mmd, int top_level)
void multires_reshape_object_grids_to_tangent_displacement(const MultiresReshapeContext *reshape_context)
bool multires_reshape_context_create_from_base_mesh(MultiresReshapeContext *reshape_context, Depsgraph *depsgraph, Object *object, MultiresModifierData *mmd)
ReshapeConstGridElement multires_reshape_orig_grid_element_for_grid_coord(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord)
void(*)(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, void *userdata_v) ForeachGridCoordinateCallback
ReshapeGridElement multires_reshape_grid_element_for_ptex_coord(const MultiresReshapeContext *reshape_context, const PTexCoord *ptex_coord)
static void ensure_displacement_grid(MDisps *displacement_grid, const int level)
static bool context_is_valid(MultiresReshapeContext *reshape_context)
GridCoord multires_reshape_ptex_coord_to_grid(const MultiresReshapeContext *reshape_context, const PTexCoord *ptex_coord)
static void ensure_mask_grids(Mesh *mesh, const int level)
void multires_reshape_evaluate_limit_at_grid(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, float r_P[3], float r_tangent_matrix[3][3])
bool multires_reshape_context_create_from_ccg(MultiresReshapeContext *reshape_context, SubdivCCG *subdiv_ccg, Mesh *base_mesh, int top_level)
void free(Subdiv *subdiv)
BLI_INLINE void rotate_grid_to_quad(int corner, float grid_u, float grid_v, float *r_quad_u, float *r_quad_v)
bool eval_begin_from_mesh(Subdiv *subdiv, const Mesh *mesh, Span< float3 > coarse_vert_positions, eSubdivEvaluatorType evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache)
Subdiv * new_from_mesh(const Settings *settings, const Mesh *mesh)
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])
BLI_INLINE void grid_uv_to_ptex_face_uv(float grid_u, float grid_v, float *r_ptex_u, float *r_ptex_v)
BLI_INLINE void ptex_face_uv_to_grid_uv(float ptex_u, float ptex_v, float *r_grid_u, float *r_grid_v)
BLI_INLINE int grid_size_from_level(int level)
BLI_INLINE int rotate_quad_to_corner(float quad_u, float quad_v, float *r_corner_u, float *r_corner_v)
@ SUBDIV_EVALUATOR_TYPE_CPU
int * face_ptex_offset_get(Subdiv *subdiv)
Mesh * mesh_get_eval_deform(Depsgraph *depsgraph, const Scene *scene, Object *ob, const CustomData_MeshMasks *dataMask)
void * callback_userdata_v
ForeachGridCoordinateCallback callback
const MultiresReshapeContext * reshape_context
blender::bke::subdiv::Subdiv * subdiv
int * face_start_grid_index
blender::VArraySpan< float > cd_vertex_crease
int * ptex_start_grid_index
struct MultiresReshapeContext::@353367171114205274077335143006231101327222307123 orig
blender::Span< int > base_corner_edges
GridPaintMask * grid_paint_masks
blender::VArraySpan< float > cd_edge_crease
blender::OffsetIndices< int > base_faces
blender::Span< blender::int2 > base_edges
blender::Span< blender::float3 > base_positions
blender::Span< int > base_corner_verts
struct MultiresReshapeContext::@211325377142251356170051242004336165165277317332 reshape
MultiresModifierData * mmd
struct MultiresReshapeContext::@211264142214320354014015357273374070352161135110 top
blender::bke::subdiv::Subdiv * subdiv