68 *reshape_context = {};
77 int num_ptex_faces = 0;
78 for (
const int face_index :
faces.index_range()) {
79 const int num_corners =
faces[face_index].size();
81 num_grids += num_corners;
82 num_ptex_faces += (num_corners == 4) ? 1 : num_corners;
87 for (
int face_index = 0, grid_index = 0, ptex_index = 0; face_index <
faces.size(); ++face_index)
89 const int num_corners =
faces[face_index].size();
90 const int num_face_ptex_faces = (num_corners == 4) ? 1 : num_corners;
91 for (
int i = 0;
i < num_face_ptex_faces; ++
i) {
94 for (
int corner = 0; corner < num_corners; ++corner, ++grid_index) {
97 ptex_index += num_face_ptex_faces;
127 if (reshape_context->
mdisps ==
nullptr) {
150 const bool use_render_params =
false;
156 reshape_context->
mmd = mmd;
160 reshape_context->
base_edges = base_mesh->edges();
161 reshape_context->
base_faces = base_mesh->faces();
166 if (!reshape_context->
subdiv) {
172 scene_eval,
object, mmd, use_render_params,
true);
194 const bool use_render_params =
false;
200 reshape_context->
mmd = mmd;
204 reshape_context->
base_edges = base_mesh->edges();
205 reshape_context->
base_faces = base_mesh->faces();
210 if (!reshape_context->
subdiv) {
216 scene_eval,
object, mmd, use_render_params,
true);
241 reshape_context->
base_edges = base_mesh->edges();
242 reshape_context->
base_faces = base_mesh->faces();
253 reshape_context->
top.
level = top_level;
270 reshape_context,
object, mmd,
subdiv, top_level);
289 reshape_context->
mmd = mmd;
292 reshape_context->
base_edges = base_mesh->edges();
293 reshape_context->
base_faces = base_mesh->faces();
307 reshape_context->
top.
level = top_level;
320 if (orig_mdisps ==
nullptr && orig_grid_paint_masks ==
nullptr) {
324 const int num_grids = reshape_context->
num_grids;
325 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
326 if (orig_mdisps !=
nullptr) {
327 MDisps *orig_grid = &orig_mdisps[grid_index];
330 if (orig_grid_paint_masks !=
nullptr) {
331 GridPaintMask *orig_paint_mask_grid = &orig_grid_paint_masks[grid_index];
362 BLI_assert(grid_index < reshape_context->num_grids);
373 BLI_assert(grid_index < reshape_context->num_grids);
384 return reshape_context->
base_faces[face_index].size() == 4;
393 return reshape_context->
face_ptex_offset[face_index] + (is_quad ? 0 : corner);
404 float corner_u, corner_v;
406 grid_coord->
u, grid_coord->
v, &corner_u, &corner_v);
412 float grid_u, grid_v;
415 corner, grid_u, grid_v, &ptex_coord.
u, &ptex_coord.
v);
418 ptex_coord.
u = corner_u;
419 ptex_coord.
v = corner_v;
436 ptex_coord->
u, ptex_coord->
v, &grid_coord.
u, &grid_coord.
v);
440 grid_coord.
u = ptex_coord->
u;
441 grid_coord.
v = ptex_coord->
v;
443 grid_coord.
grid_index = start_grid_index + corner_delta;
446 grid_coord.
u, grid_coord.
v, &grid_coord.
u, &grid_coord.
v);
452 const int face_index,
461 const int tangent_corner = is_quad ? corner : 0;
471 const int grid_x = lround(grid_coord->
u * (grid_size - 1));
472 const int grid_y = lround(grid_coord->
v * (grid_size - 1));
473 const int grid_element_index = grid_y * grid_size + grid_x;
475 if (reshape_context->
mdisps !=
nullptr) {
478 displacement_grid->
disps[grid_element_index]);
483 grid_element.
mask = &grid_paint_mask->
data[grid_element_index];
502 if (mdisps !=
nullptr) {
504 if (displacement_grid->
disps !=
nullptr) {
506 const int grid_x = lround(grid_coord->
u * (grid_size - 1));
507 const int grid_y = lround(grid_coord->
v * (grid_size - 1));
508 const int grid_element_index = grid_y * grid_size + grid_x;
514 if (grid_paint_masks !=
nullptr) {
516 if (paint_mask_grid->
data !=
nullptr) {
518 const int grid_x = lround(grid_coord->
u * (grid_size - 1));
519 const int grid_y = lround(grid_coord->
v * (grid_size - 1));
520 const int grid_element_index = grid_y * grid_size + grid_x;
521 grid_element.
mask = paint_mask_grid->
data[grid_element_index];
551 reshape_context, face_index, corner, dPdu, dPdv, r_tangent_matrix);
563 const int grid_area = grid_size * grid_size;
565 if (displacement_grid->
disps !=
nullptr) {
569 displacement_grid->
disps = disps;
570 displacement_grid->
totdisp = grid_area;
571 displacement_grid->
level = level;
576 if (displacement_grid->
disps !=
nullptr && displacement_grid->
level >= level) {
584 const int num_grids =
mesh->corners_num;
587 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
596 if (grid_paint_masks ==
nullptr) {
599 const int num_grids =
mesh->corners_num;
601 const int grid_area = grid_size * grid_size;
602 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
603 GridPaintMask *grid_paint_mask = &grid_paint_masks[grid_index];
604 if (grid_paint_mask->
level >= level) {
607 grid_paint_mask->
level = level;
608 if (grid_paint_mask->
data) {
635 if (grid_paint_masks !=
nullptr) {
639 const int num_grids = reshape_context->
num_grids;
640 for (
int grid_index = 0; grid_index < num_grids; grid_index++) {
641 MDisps *orig_grid = &orig_mdisps[grid_index];
646 if (orig_grid->
disps !=
nullptr) {
649 if (orig_grid_paint_masks !=
nullptr) {
650 GridPaintMask *orig_paint_mask_grid = &orig_grid_paint_masks[grid_index];
651 if (orig_paint_mask_grid->
data !=
nullptr) {
652 orig_paint_mask_grid->
data =
static_cast<float *
>(
677 const int face_index,
685 const int grid_size =
data->grid_size;
686 const float grid_size_1_inv = 1.0f / (
float(grid_size) - 1.0f);
688 const int num_corners =
faces[face_index].size();
690 for (
int corner = 0; corner < num_corners; ++corner, ++grid_index) {
691 for (
int y = 0;
y < grid_size; ++
y) {
692 const float v =
float(
y) * grid_size_1_inv;
693 for (
int x = 0;
x < grid_size; ++
x) {
694 const float u =
float(
x) * grid_size_1_inv;
701 data->callback(
data->reshape_context, &grid_coord,
data->callback_userdata_v);
714 data.reshape_context = reshape_context;
716 data.grid_size_1_inv = 1.0f / (
float(
data.grid_size) - 1.0f);
717 data.callback = callback;
718 data.callback_userdata_v = userdata_v;
725 const int num_faces = base_mesh->
faces_num;
738 reshape_context, grid_coord,
P, tangent_matrix);
777 reshape_context, grid_coord,
P, tangent_matrix);
801 reshape_context, grid_coord,
P, tangent_matrix);
813 if (grid_element.
mask !=
nullptr) {
814 *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(blender::float3x3 &tangent_matrix, const blender::float3 &dPdu, const blender::float3 &dPdv, int corner)
int multires_get_level(const Scene *scene, const Object *ob, const MultiresModifierData *mmd, bool render, bool ignore_simplify)
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
void reinitialize(const int64_t new_size)
GAttributeReader lookup(const StringRef attribute_id) const
void * MEM_calloc_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)
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_tangent_matrix_for_corner(const MultiresReshapeContext *reshape_context, const int face_index, const int corner, const blender::float3 &dPdu, const blender::float3 &dPdv, blender::float3x3 &r_tangent_matrix)
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)
void(*)(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, void *userdata_v) ForeachGridCoordinateCallback
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)
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)
void multires_reshape_evaluate_base_mesh_limit_at_grid(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, blender::float3 &r_P, blender::float3x3 &r_tangent_matrix)
static void ensure_mask_grids(Mesh *mesh, const int level)
bool multires_reshape_context_create_from_ccg(MultiresReshapeContext *reshape_context, SubdivCCG *subdiv_ccg, Mesh *base_mesh, int top_level)
void free(Subdiv *subdiv)
bool eval_begin_from_mesh(Subdiv *subdiv, const Mesh *mesh, eSubdivEvaluatorType evaluator_type, Span< float3 > coarse_vert_positions={}, OpenSubdiv_EvaluatorCache *evaluator_cache=nullptr)
BLI_INLINE void rotate_grid_to_quad(int corner, float grid_u, float grid_v, float *r_quad_u, float *r_quad_v)
Subdiv * new_from_mesh(const Settings *settings, const Mesh *mesh)
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)
void eval_limit_point_and_derivatives(Subdiv *subdiv, int ptex_face_index, float u, float v, float3 &r_P, float3 &r_dPdu, float3 &r_dPdv)
@ SUBDIV_EVALUATOR_TYPE_CPU
Span< int > face_ptex_offset_get(Subdiv *subdiv)
Mesh * mesh_get_eval_deform(Depsgraph *depsgraph, const Scene *scene, Object *ob, const CustomData_MeshMasks *dataMask)
CartesianBasis invert(const CartesianBasis &basis)
VecBase< T, 3 > transform_direction(const MatBase< T, 3, 3 > &mat, const VecBase< T, 3 > &direction)
MatBase< float, 3, 3 > float3x3
VecBase< float, 3 > float3
void * callback_userdata_v
ForeachGridCoordinateCallback callback
const MultiresReshapeContext * reshape_context
struct MultiresReshapeContext::@114377305000353127144042327223234020156043120202 reshape
blender::bke::subdiv::Subdiv * subdiv
blender::Span< int > face_ptex_offset
struct MultiresReshapeContext::@204160262355230072153262361266331214205042063262 top
blender::VArraySpan< float > cd_vertex_crease
blender::Array< int > ptex_start_grid_index
blender::Span< int > base_corner_edges
GridPaintMask * grid_paint_masks
blender::VArraySpan< float > cd_edge_crease
struct MultiresReshapeContext::@224024350043126210016356042105244264040105373265 orig
blender::OffsetIndices< int > base_faces
blender::Span< blender::int2 > base_edges
blender::Array< int > face_start_grid_index
blender::Span< blender::float3 > base_positions
blender::Span< int > base_corner_verts
blender::Array< int > grid_to_face_index
MultiresModifierData * mmd
blender::float3 displacement
blender::float3 * displacement
blender::bke::subdiv::Subdiv * subdiv