48 base_mesh = (
Mesh *)object->data;
53 subdiv::Subdiv *subdiv = subdiv::new_from_mesh(&subdiv_settings, base_mesh);
57 if (!subdiv::eval_begin_from_mesh(
58 subdiv, base_mesh, {}, subdiv::SUBDIV_EVALUATOR_TYPE_CPU,
nullptr))
68 *reshape_context = {};
75 const int num_faces = base_mesh->
faces_num;
80 int num_ptex_faces = 0;
81 for (
int face_index = 0; face_index < num_faces; ++face_index) {
82 const int num_corners = faces[face_index].size();
84 num_grids += num_corners;
85 num_ptex_faces += (num_corners == 4) ? 1 : num_corners;
92 for (
int face_index = 0, grid_index = 0, ptex_index = 0; face_index < num_faces; ++face_index) {
93 const int num_corners = faces[face_index].size();
94 const int num_face_ptex_faces = (num_corners == 4) ? 1 : num_corners;
95 for (
int i = 0; i < num_face_ptex_faces; ++i) {
98 for (
int corner = 0; corner < num_corners; ++corner, ++grid_index) {
101 ptex_index += num_face_ptex_faces;
131 if (reshape_context->
mdisps ==
nullptr) {
154 const bool use_render_params =
false;
156 Mesh *base_mesh = (
Mesh *)object->data;
159 reshape_context->
object = object;
160 reshape_context->
mmd = mmd;
164 reshape_context->
base_edges = base_mesh->edges();
165 reshape_context->
base_faces = base_mesh->faces();
170 if (!reshape_context->
subdiv) {
176 scene_eval,
object, mmd, use_render_params,
true);
198 const bool use_render_params =
false;
200 Mesh *base_mesh = (
Mesh *)object->data;
203 reshape_context->
object = object;
204 reshape_context->
mmd = mmd;
208 reshape_context->
base_edges = base_mesh->edges();
209 reshape_context->
base_faces = base_mesh->faces();
214 if (!reshape_context->
subdiv) {
220 scene_eval,
object, mmd, use_render_params,
true);
228 reshape_context->
cd_vertex_crease = *attributes.lookup<
float>(
"crease_vert", AttrDomain::Point);
229 reshape_context->
cd_edge_crease = *attributes.lookup<
float>(
"crease_edge", AttrDomain::Edge);
245 reshape_context->
base_edges = base_mesh->edges();
246 reshape_context->
base_faces = base_mesh->faces();
257 reshape_context->
top.
level = top_level;
274 reshape_context,
object, mmd, subdiv, top_level);
291 Mesh *base_mesh = (
Mesh *)object->data;
293 reshape_context->
mmd = mmd;
296 reshape_context->
base_edges = base_mesh->edges();
297 reshape_context->
base_faces = base_mesh->faces();
302 reshape_context->
cd_vertex_crease = *attributes.lookup<
float>(
"crease_vert", AttrDomain::Point);
304 reshape_context->
subdiv = subdiv;
311 reshape_context->
top.
level = top_level;
324 if (orig_mdisps ==
nullptr && orig_grid_paint_masks ==
nullptr) {
328 const int num_grids = reshape_context->
num_grids;
329 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
330 if (orig_mdisps !=
nullptr) {
331 MDisps *orig_grid = &orig_mdisps[grid_index];
334 if (orig_grid_paint_masks !=
nullptr) {
335 GridPaintMask *orig_paint_mask_grid = &orig_grid_paint_masks[grid_index];
370 BLI_assert(grid_index < reshape_context->num_grids);
381 BLI_assert(grid_index < reshape_context->num_grids);
392 return reshape_context->
base_faces[face_index].size() == 4;
401 return reshape_context->
face_ptex_offset[face_index] + (is_quad ? 0 : corner);
412 float corner_u, corner_v;
414 grid_coord->
u, grid_coord->
v, &corner_u, &corner_v);
420 float grid_u, grid_v;
423 corner, grid_u, grid_v, &ptex_coord.
u, &ptex_coord.
v);
426 ptex_coord.
u = corner_u;
427 ptex_coord.
v = corner_v;
444 ptex_coord->
u, ptex_coord->
v, &grid_coord.
u, &grid_coord.
v);
448 grid_coord.
u = ptex_coord->
u;
449 grid_coord.
v = ptex_coord->
v;
451 grid_coord.
grid_index = start_grid_index + corner_delta;
454 grid_coord.
u, grid_coord.
v, &grid_coord.
u, &grid_coord.
v);
460 const int face_index,
464 float r_tangent_matrix[3][3])
469 const int tangent_corner = is_quad ? corner : 0;
479 const int grid_x = lround(grid_coord->
u * (grid_size - 1));
480 const int grid_y = lround(grid_coord->
v * (grid_size - 1));
481 const int grid_element_index = grid_y * grid_size + grid_x;
483 if (reshape_context->
mdisps !=
nullptr) {
490 grid_element.
mask = &grid_paint_mask->
data[grid_element_index];
509 if (mdisps !=
nullptr) {
511 if (displacement_grid->
disps !=
nullptr) {
513 const int grid_x = lround(grid_coord->
u * (grid_size - 1));
514 const int grid_y = lround(grid_coord->
v * (grid_size - 1));
515 const int grid_element_index = grid_y * grid_size + grid_x;
521 if (grid_paint_masks !=
nullptr) {
523 if (paint_mask_grid->
data !=
nullptr) {
525 const int grid_x = lround(grid_coord->
u * (grid_size - 1));
526 const int grid_y = lround(grid_coord->
v * (grid_size - 1));
527 const int grid_element_index = grid_y * grid_size + grid_x;
528 grid_element.
mask = paint_mask_grid->
data[grid_element_index];
544 float r_tangent_matrix[3][3])
546 float dPdu[3], dPdv[3];
550 subdiv, ptex_coord.
ptex_face_index, ptex_coord.
u, ptex_coord.
v, r_P, dPdu, dPdv);
556 reshape_context, face_index, corner, dPdu, dPdv, r_tangent_matrix);
568 const int grid_area = grid_size * grid_size;
569 float(*disps)[3] =
static_cast<float(*)[3]
>(
571 if (displacement_grid->
disps !=
nullptr) {
575 displacement_grid->
disps = disps;
576 displacement_grid->
totdisp = grid_area;
577 displacement_grid->
level = level;
582 if (displacement_grid->
disps !=
nullptr && displacement_grid->
level >= level) {
590 const int num_grids = mesh->corners_num;
593 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
602 if (grid_paint_masks ==
nullptr) {
605 const int num_grids = mesh->corners_num;
607 const int grid_area = grid_size * grid_size;
608 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
609 GridPaintMask *grid_paint_mask = &grid_paint_masks[grid_index];
610 if (grid_paint_mask->
level >= level) {
613 grid_paint_mask->
level = level;
614 if (grid_paint_mask->
data) {
618 grid_paint_mask->
data =
static_cast<float *
>(
642 if (grid_paint_masks !=
nullptr) {
646 const int num_grids = reshape_context->
num_grids;
647 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
648 MDisps *orig_grid = &orig_mdisps[grid_index];
653 if (orig_grid->
disps !=
nullptr) {
656 if (orig_grid_paint_masks !=
nullptr) {
657 GridPaintMask *orig_paint_mask_grid = &orig_grid_paint_masks[grid_index];
658 if (orig_paint_mask_grid->
data !=
nullptr) {
659 orig_paint_mask_grid->
data =
static_cast<float *
>(
684 const int face_index,
692 const int grid_size = data->grid_size;
693 const float grid_size_1_inv = 1.0f / (
float(grid_size) - 1.0f);
695 const int num_corners = faces[face_index].size();
697 for (
int corner = 0; corner < num_corners; ++corner, ++grid_index) {
698 for (
int y = 0; y < grid_size; ++
y) {
699 const float v =
float(y) * grid_size_1_inv;
700 for (
int x = 0; x < grid_size; ++
x) {
701 const float u =
float(x) * grid_size_1_inv;
708 data->callback(data->reshape_context, &grid_coord, data->callback_userdata_v);
723 data.grid_size_1_inv = 1.0f / (
float(data.grid_size) - 1.0f);
725 data.callback_userdata_v = userdata_v;
732 const int num_faces = base_mesh->
faces_num;
743 float tangent_matrix[3][3];
746 float inv_tangent_matrix[3][3];
784 float tangent_matrix[3][3];
807 float tangent_matrix[3][3];
820 if (grid_element.
mask !=
nullptr) {
821 *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)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert * v
const Depsgraph * depsgraph
DEGForeachIDComponentCallback callback
draw_view in_light_buf[] float
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_dupallocN)(const 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)
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)
int * face_ptex_offset_get(Subdiv *subdiv)
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
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
struct MultiresReshapeContext::@92 top
struct MultiresReshapeContext::@91 reshape
blender::Span< int > base_corner_verts
MultiresModifierData * mmd
struct MultiresReshapeContext::@93 orig
blender::bke::subdiv::Subdiv * subdiv