Blender
V3.3
|
#include "multires_reshape.h"
#include "MEM_guardedalloc.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_task.h"
#include "BKE_customdata.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_multires.h"
#include "BKE_subdiv.h"
#include "BKE_subdiv_ccg.h"
#include "BKE_subdiv_eval.h"
#include "BKE_subdiv_foreach.h"
#include "BKE_subdiv_mesh.h"
#include "DEG_depsgraph_query.h"
Go to the source code of this file.
Classes | |
struct | ForeachGridCoordinateTaskData |
Displacement, space conversion | |
typedef void(* | ForeachGridCoordinateCallback) (const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, void *userdata_v) |
typedef struct ForeachGridCoordinateTaskData | ForeachGridCoordinateTaskData |
void | multires_reshape_store_original_grids (MultiresReshapeContext *reshape_context) |
static void | foreach_grid_face_coordinate_task (void *__restrict userdata_v, const int face_index, const TaskParallelTLS *__restrict UNUSED(tls)) |
static void | foreach_grid_coordinate (const MultiresReshapeContext *reshape_context, const int level, ForeachGridCoordinateCallback callback, void *userdata_v) |
static void | object_grid_element_to_tangent_displacement (const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, void *UNUSED(userdata_v)) |
void | multires_reshape_object_grids_to_tangent_displacement (const MultiresReshapeContext *reshape_context) |
typedef void(* ForeachGridCoordinateCallback) (const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, void *userdata_v) |
Definition at line 617 of file multires_reshape_util.c.
typedef struct ForeachGridCoordinateTaskData ForeachGridCoordinateTaskData |
Definition at line 518 of file multires_reshape_util.c.
References BKE_subdiv_grid_size_from_level(), MDisps::disps, float(), MDisps::level, MEM_calloc_arrayN, MEM_freeN, NULL, and MDisps::totdisp.
Referenced by ensure_displacement_grid().
|
static |
Definition at line 728 of file multires_reshape_util.c.
References add_v3_v3v3(), D(), ReshapeGridElement::displacement, mul_v3_m3v3(), multires_reshape_evaluate_limit_at_grid(), multires_reshape_grid_element_for_grid_coord(), and P().
Referenced by multires_reshape_assign_final_coords_from_mdisps().
|
static |
Definition at line 751 of file multires_reshape_util.c.
References add_v3_v3v3(), D(), ReshapeGridElement::displacement, ReshapeConstGridElement::displacement, ReshapeGridElement::mask, ReshapeConstGridElement::mask, mul_v3_m3v3(), multires_reshape_evaluate_limit_at_grid(), multires_reshape_grid_element_for_grid_coord(), multires_reshape_orig_grid_element_for_grid_coord(), NULL, and P().
Referenced by multires_reshape_assign_final_elements_from_orig_mdisps().
|
static |
Definition at line 110 of file multires_reshape_util.c.
References MultiresReshapeContext::base_mesh, BKE_subdiv_face_ptex_offset_get(), BLI_assert, context_init_grid_pointers(), context_init_lookup(), MultiresReshapeContext::face_ptex_offset, NULL, and MultiresReshapeContext::subdiv.
Referenced by multires_reshape_context_create_from_base_mesh(), multires_reshape_context_create_from_ccg(), multires_reshape_context_create_from_object(), and multires_reshape_context_create_from_subdiv().
|
static |
Definition at line 103 of file multires_reshape_util.c.
References MultiresReshapeContext::base_mesh, CD_GRID_PAINT_MASK, CD_MDISPS, CustomData_get_layer(), MultiresReshapeContext::grid_paint_masks, Mesh::ldata, and MultiresReshapeContext::mdisps.
Referenced by context_init_commoon().
|
static |
Definition at line 66 of file multires_reshape_util.c.
References MultiresReshapeContext::base_mesh, MultiresReshapeContext::face_start_grid_index, MultiresReshapeContext::grid_to_face_index, MEM_malloc_arrayN, Mesh::mpoly, MultiresReshapeContext::num_grids, MultiresReshapeContext::ptex_start_grid_index, MPoly::totloop, and Mesh::totpoly.
Referenced by context_init_commoon().
|
static |
Definition at line 121 of file multires_reshape_util.c.
References MultiresReshapeContext::mdisps, and NULL.
Referenced by context_verify_or_free().
|
static |
Definition at line 130 of file multires_reshape_util.c.
References context_is_valid(), is_valid, and multires_reshape_context_free().
Referenced by multires_reshape_context_create_from_base_mesh(), multires_reshape_context_create_from_ccg(), multires_reshape_context_create_from_object(), and multires_reshape_context_create_from_subdiv().
|
static |
Definition at line 61 of file multires_reshape_util.c.
Referenced by multires_reshape_context_create_from_base_mesh(), multires_reshape_context_create_from_ccg(), multires_reshape_context_create_from_object(), and multires_reshape_context_create_from_subdiv().
Definition at line 532 of file multires_reshape_util.c.
References allocate_displacement_grid(), MDisps::disps, MDisps::level, and NULL.
Referenced by ensure_displacement_grids().
Definition at line 540 of file multires_reshape_util.c.
References CD_MDISPS, CustomData_get_layer(), ensure_displacement_grid(), Mesh::ldata, mesh, and Mesh::totloop.
Referenced by multires_reshape_ensure_grids().
Definition at line 549 of file multires_reshape_util.c.
References BKE_subdiv_grid_size_from_level(), CD_GRID_PAINT_MASK, CustomData_get_layer(), GridPaintMask::data, Mesh::ldata, GridPaintMask::level, MEM_calloc_arrayN, MEM_freeN, mesh, NULL, and Mesh::totloop.
Referenced by multires_reshape_ensure_grids().
|
static |
Definition at line 664 of file multires_reshape_util.c.
References MultiresReshapeContext::base_mesh, BKE_subdiv_grid_size_from_level(), BLI_parallel_range_settings_defaults(), BLI_task_parallel_range(), callback, data, float(), foreach_grid_face_coordinate_task(), TaskParallelSettings::min_iter_per_thread, and Mesh::totpoly.
Referenced by multires_reshape_assign_final_coords_from_mdisps(), multires_reshape_assign_final_elements_from_orig_mdisps(), and multires_reshape_object_grids_to_tangent_displacement().
|
static |
Definition at line 631 of file multires_reshape_util.c.
References data, MultiresReshapeContext::face_start_grid_index, float(), GridCoord::grid_index, Mesh::mpoly, MPoly::totloop, GridCoord::u, GridCoord::v, v, x, and y.
Referenced by foreach_grid_coordinate().
void multires_reshape_assign_final_coords_from_mdisps | ( | const MultiresReshapeContext * | reshape_context | ) |
Reads and writes to the current mesh CD_MDISPS.
Definition at line 744 of file multires_reshape_util.c.
References assign_final_coords_from_mdisps(), foreach_grid_coordinate(), MultiresReshapeContext::level, NULL, and MultiresReshapeContext::top.
Referenced by multires_do_versions_simple_to_catmull_clark(), multiresModifier_base_apply(), and multiresModifier_rebuild_subdiv().
void multires_reshape_assign_final_elements_from_orig_mdisps | ( | const MultiresReshapeContext * | reshape_context | ) |
Reads from original #CD_MIDTSPS, writes to the current mesh CD_MDISPS.
Definition at line 774 of file multires_reshape_util.c.
References assign_final_elements_from_orig_mdisps(), foreach_grid_coordinate(), MultiresReshapeContext::level, NULL, and MultiresReshapeContext::top.
Referenced by multiresModifier_subdivide_to_level().
bool multires_reshape_context_create_from_base_mesh | ( | MultiresReshapeContext * | reshape_context, |
Depsgraph * | depsgraph, | ||
Object * | object, | ||
MultiresModifierData * | mmd | ||
) |
Definition at line 139 of file multires_reshape_util.c.
References MultiresReshapeContext::base_mesh, BKE_subdiv_grid_size_from_level(), context_init_commoon(), context_verify_or_free(), context_zero(), Object::data, DEG_get_evaluated_scene(), MultiresReshapeContext::depsgraph, depsgraph, MultiresReshapeContext::grid_size, MultiresReshapeContext::level, MultiresReshapeContext::mmd, multires_get_level(), multires_reshape_create_subdiv(), MultiresReshapeContext::need_free_subdiv, NULL, MultiresReshapeContext::object, MultiresReshapeContext::reshape, MultiresReshapeContext::subdiv, MultiresReshapeContext::top, and MultiresModifierData::totlvl.
Referenced by multiresModifier_rebuild_subdiv().
bool multires_reshape_context_create_from_ccg | ( | MultiresReshapeContext * | reshape_context, |
SubdivCCG * | subdiv_ccg, | ||
Mesh * | base_mesh, | ||
int | top_level | ||
) |
Definition at line 207 of file multires_reshape_util.c.
References MultiresReshapeContext::base_mesh, BKE_subdiv_grid_size_from_level(), context_init_commoon(), context_verify_or_free(), context_zero(), MultiresReshapeContext::grid_size, SubdivCCG::level, MultiresReshapeContext::level, MultiresReshapeContext::need_free_subdiv, MultiresReshapeContext::reshape, SubdivCCG::subdiv, MultiresReshapeContext::subdiv, and MultiresReshapeContext::top.
Referenced by multiresModifier_reshapeFromCCG().
bool multires_reshape_context_create_from_modifier | ( | MultiresReshapeContext * | reshape_context, |
struct Object * | object, | ||
struct MultiresModifierData * | mmd, | ||
int | top_level | ||
) |
Definition at line 231 of file multires_reshape_util.c.
References multires_reshape_context_create_from_subdiv(), multires_reshape_create_subdiv(), MultiresReshapeContext::need_free_subdiv, NULL, and result.
Referenced by multires_do_versions_simple_to_catmull_clark(), multires_subdivide_create_tangent_displacement_linear_grids(), and multiresModifier_subdivide_to_level().
bool multires_reshape_context_create_from_object | ( | MultiresReshapeContext * | reshape_context, |
struct Depsgraph * | depsgraph, | ||
struct Object * | object, | ||
struct MultiresModifierData * | mmd | ||
) |
Definition at line 172 of file multires_reshape_util.c.
References MultiresReshapeContext::base_mesh, BKE_subdiv_grid_size_from_level(), CD_CREASE, MultiresReshapeContext::cd_vertex_crease, context_init_commoon(), context_verify_or_free(), context_zero(), CustomData_get_layer(), Object::data, DEG_get_evaluated_scene(), MultiresReshapeContext::depsgraph, depsgraph, MultiresReshapeContext::grid_size, MultiresReshapeContext::level, MultiresReshapeContext::mmd, multires_get_level(), multires_reshape_create_subdiv(), MultiresReshapeContext::need_free_subdiv, MultiresReshapeContext::object, MultiresReshapeContext::reshape, MultiresReshapeContext::subdiv, MultiresReshapeContext::top, MultiresModifierData::totlvl, and Mesh::vdata.
Referenced by multiresModifier_base_apply(), multiresModifier_rebuild_subdiv(), and multiresModifier_reshapeFromVertcos().
bool multires_reshape_context_create_from_subdiv | ( | MultiresReshapeContext * | reshape_context, |
struct Object * | object, | ||
struct MultiresModifierData * | mmd, | ||
struct Subdiv * | subdiv, | ||
int | top_level | ||
) |
Definition at line 246 of file multires_reshape_util.c.
References MultiresReshapeContext::base_mesh, BKE_subdiv_grid_size_from_level(), context_init_commoon(), context_verify_or_free(), context_zero(), Object::data, MultiresReshapeContext::grid_size, MultiresReshapeContext::level, MultiresReshapeContext::mmd, MultiresReshapeContext::need_free_subdiv, MultiresReshapeContext::reshape, MultiresReshapeContext::subdiv, MultiresReshapeContext::top, and MultiresModifierData::totlvl.
Referenced by multires_do_versions_simple_to_catmull_clark(), and multires_reshape_context_create_from_modifier().
void multires_reshape_context_free | ( | MultiresReshapeContext * | reshape_context | ) |
Definition at line 302 of file multires_reshape_util.c.
References BKE_subdiv_free(), MultiresReshapeContext::face_start_grid_index, MultiresReshapeContext::grid_to_face_index, MEM_SAFE_FREE, multires_reshape_free_original_grids(), MultiresReshapeContext::need_free_subdiv, MultiresReshapeContext::ptex_start_grid_index, and MultiresReshapeContext::subdiv.
Referenced by context_verify_or_free(), multires_do_versions_simple_to_catmull_clark(), multires_subdivide_create_tangent_displacement_linear_grids(), multiresModifier_base_apply(), multiresModifier_rebuild_subdiv(), multiresModifier_reshapeFromCCG(), multiresModifier_reshapeFromVertcos(), and multiresModifier_subdivide_to_level().
Subdiv* multires_reshape_create_subdiv | ( | Depsgraph * | depsgraph, |
Object * | object, | ||
const MultiresModifierData * | mmd | ||
) |
Definition at line 36 of file multires_reshape_util.c.
References BKE_multires_subdiv_settings_init(), BKE_subdiv_eval_begin_from_mesh(), BKE_subdiv_free(), BKE_subdiv_new_from_mesh(), CD_MASK_BAREMESH, Object::data, DEG_get_evaluated_object(), DEG_get_evaluated_scene(), depsgraph, mesh_get_eval_deform(), NULL, and SUBDIV_EVALUATOR_TYPE_CPU.
Referenced by multires_reshape_context_create_from_base_mesh(), multires_reshape_context_create_from_modifier(), and multires_reshape_context_create_from_object().
Make sure custom data is allocated for the given level.
Definition at line 572 of file multires_reshape_util.c.
References ensure_displacement_grids(), ensure_mask_grids(), and mesh.
Referenced by multires_subdivide_create_tangent_displacement_linear_grids(), multiresModifier_reshapeFromCCG(), multiresModifier_reshapeFromVertcos(), and multiresModifier_subdivide_to_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] | ||
) |
Evaluate limit surface created from base mesh. This is the limit surface which defines tangent space for MDisps.
Definition at line 494 of file multires_reshape_util.c.
References BKE_subdiv_eval_limit_point_and_derivatives(), GridCoord::grid_index, multires_reshape_grid_coord_to_ptex(), multires_reshape_grid_to_corner(), multires_reshape_grid_to_face_index(), multires_reshape_tangent_matrix_for_corner(), PTexCoord::ptex_face_index, MultiresReshapeContext::subdiv, PTexCoord::u, and PTexCoord::v.
Referenced by assign_final_coords_from_mdisps(), assign_final_elements_from_orig_mdisps(), evaluate_final_original_point(), multires_reshape_apply_base_update_mesh_coords(), object_grid_element_to_tangent_displacement(), and reshape_subdiv_refine_orig_P().
void multires_reshape_free_original_grids | ( | MultiresReshapeContext * | reshape_context | ) |
Definition at line 274 of file multires_reshape_util.c.
References GridPaintMask::data, MDisps::disps, MultiresReshapeContext::grid_paint_masks, MultiresReshapeContext::mdisps, MEM_SAFE_FREE, NULL, MultiresReshapeContext::num_grids, and MultiresReshapeContext::orig.
Referenced by multires_reshape_context_free(), and multiresModifier_subdivide_to_level().
PTexCoord multires_reshape_grid_coord_to_ptex | ( | const MultiresReshapeContext * | reshape_context, |
const GridCoord * | grid_coord | ||
) |
Convert normalized coordinate within a grid to a normalized coordinate within a PTEX face.
Definition at line 360 of file multires_reshape_util.c.
References BKE_subdiv_grid_uv_to_ptex_face_uv(), BKE_subdiv_ptex_face_uv_to_grid_uv(), BKE_subdiv_rotate_grid_to_quad(), GridCoord::grid_index, multires_reshape_grid_to_corner(), multires_reshape_grid_to_face_index(), multires_reshape_grid_to_ptex_index(), multires_reshape_is_quad_face(), PTexCoord::ptex_face_index, GridCoord::u, PTexCoord::u, GridCoord::v, and PTexCoord::v.
Referenced by multires_reshape_evaluate_limit_at_grid().
ReshapeGridElement multires_reshape_grid_element_for_grid_coord | ( | const MultiresReshapeContext * | reshape_context, |
const GridCoord * | grid_coord | ||
) |
Get grid elements which are to be reshaped at a given or PTEX coordinate. The data is coming from final custom mdata layers.
Definition at line 426 of file multires_reshape_util.c.
References GridPaintMask::data, ReshapeGridElement::displacement, MDisps::disps, GridCoord::grid_index, MultiresReshapeContext::grid_paint_masks, MultiresReshapeContext::grid_size, ReshapeGridElement::mask, MultiresReshapeContext::mdisps, NULL, MultiresReshapeContext::top, GridCoord::u, and GridCoord::v.
Referenced by assign_final_coords_from_mdisps(), assign_final_elements_from_orig_mdisps(), evaluate_higher_grid_positions_callback(), evaluate_higher_grid_positions_with_details_callback(), linear_grid_element_final_get(), multires_reshape_assign_final_coords_from_ccg(), multires_reshape_grid_element_for_ptex_coord(), multires_reshape_vertcos_foreach_single_vertex(), object_grid_element_to_tangent_displacement(), and reshape_subdiv_refine_final_P().
ReshapeGridElement multires_reshape_grid_element_for_ptex_coord | ( | const MultiresReshapeContext * | reshape_context, |
const PTexCoord * | ptex_coord | ||
) |
Definition at line 449 of file multires_reshape_util.c.
References multires_reshape_grid_element_for_grid_coord(), and multires_reshape_ptex_coord_to_grid().
int multires_reshape_grid_to_corner | ( | const MultiresReshapeContext * | reshape_context, |
int | grid_index | ||
) |
For the given grid index get corner of a face it was created for.
Definition at line 333 of file multires_reshape_util.c.
References BLI_assert, MultiresReshapeContext::face_start_grid_index, and multires_reshape_grid_to_face_index().
Referenced by multires_reshape_evaluate_limit_at_grid(), multires_reshape_grid_coord_to_ptex(), multires_reshape_grid_to_ptex_index(), and reshape_subdiv_evaluate_limit_at_grid().
int multires_reshape_grid_to_face_index | ( | const MultiresReshapeContext * | reshape_context, |
int | grid_index | ||
) |
For the given grid index get index of face it was created for.
Definition at line 321 of file multires_reshape_util.c.
References BLI_assert, and MultiresReshapeContext::grid_to_face_index.
Referenced by foreach_vertex(), multires_reshape_evaluate_limit_at_grid(), multires_reshape_grid_coord_to_ptex(), multires_reshape_grid_to_corner(), multires_reshape_grid_to_ptex_index(), multires_reshape_vertcos_foreach_vertex(), and reshape_subdiv_evaluate_limit_at_grid().
int multires_reshape_grid_to_ptex_index | ( | const MultiresReshapeContext * | reshape_context, |
int | grid_index | ||
) |
For the given grid index get index of corresponding PTEX face.
Definition at line 351 of file multires_reshape_util.c.
References MultiresReshapeContext::face_ptex_offset, multires_reshape_grid_to_corner(), multires_reshape_grid_to_face_index(), and multires_reshape_is_quad_face().
Referenced by multires_reshape_grid_coord_to_ptex().
bool multires_reshape_is_quad_face | ( | const MultiresReshapeContext * | reshape_context, |
int | face_index | ||
) |
Definition at line 345 of file multires_reshape_util.c.
References MultiresReshapeContext::base_mesh, Mesh::mpoly, and MPoly::totloop.
Referenced by multires_reshape_grid_coord_to_ptex(), multires_reshape_grid_to_ptex_index(), multires_reshape_ptex_coord_to_grid(), and multires_reshape_tangent_matrix_for_corner().
void multires_reshape_object_grids_to_tangent_displacement | ( | const MultiresReshapeContext * | reshape_context | ) |
Definition at line 710 of file multires_reshape_util.c.
References foreach_grid_coordinate(), MultiresReshapeContext::level, NULL, object_grid_element_to_tangent_displacement(), and MultiresReshapeContext::top.
Referenced by multires_do_versions_simple_to_catmull_clark(), multires_subdivide_create_tangent_displacement_linear_grids(), multiresModifier_base_apply(), multiresModifier_rebuild_subdiv(), multiresModifier_reshapeFromCCG(), multiresModifier_reshapeFromVertcos(), and multiresModifier_subdivide_to_level().
ReshapeConstGridElement multires_reshape_orig_grid_element_for_grid_coord | ( | const MultiresReshapeContext * | reshape_context, |
const GridCoord * | grid_coord | ||
) |
Get original grid element for the given coordinate.
Definition at line 456 of file multires_reshape_util.c.
References BKE_subdiv_grid_size_from_level(), copy_v3_v3(), GridPaintMask::data, ReshapeConstGridElement::displacement, MDisps::disps, GridCoord::grid_index, MultiresReshapeContext::grid_paint_masks, MDisps::level, GridPaintMask::level, ReshapeConstGridElement::mask, MultiresReshapeContext::mdisps, NULL, MultiresReshapeContext::orig, GridCoord::u, and GridCoord::v.
Referenced by assign_final_elements_from_orig_mdisps(), evaluate_final_original_point(), linear_grid_element_orig_get(), multires_reshape_apply_base_update_mesh_coords(), propagate_linear_data_delta(), and reshape_subdiv_refine_orig_P().
GridCoord multires_reshape_ptex_coord_to_grid | ( | const MultiresReshapeContext * | reshape_context, |
const PTexCoord * | ptex_coord | ||
) |
Convert a normalized coordinate within a PTEX face to a normalized coordinate within a grid.
Definition at line 387 of file multires_reshape_util.c.
References BKE_subdiv_ptex_face_uv_to_grid_uv(), BKE_subdiv_rotate_quad_to_corner(), GridCoord::grid_index, MultiresReshapeContext::grid_to_face_index, multires_reshape_is_quad_face(), PTexCoord::ptex_face_index, MultiresReshapeContext::ptex_start_grid_index, GridCoord::u, PTexCoord::u, GridCoord::v, and PTexCoord::v.
Referenced by foreach_vertex(), multires_reshape_grid_element_for_ptex_coord(), and multires_reshape_vertcos_foreach_vertex().
void multires_reshape_store_original_grids | ( | MultiresReshapeContext * | reshape_context | ) |
Store original grid data, so then it's possible to calculate delta from it and add high-frequency content on top of reshaped grids.
Definition at line 584 of file multires_reshape_util.c.
References GridPaintMask::data, MDisps::disps, MultiresReshapeContext::grid_paint_masks, MultiresReshapeContext::mdisps, MEM_dupallocN, NULL, MultiresReshapeContext::num_grids, and MultiresReshapeContext::orig.
Referenced by multires_do_versions_simple_to_catmull_clark(), multiresModifier_base_apply(), multiresModifier_rebuild_subdiv(), multiresModifier_reshapeFromCCG(), multiresModifier_reshapeFromVertcos(), and multiresModifier_subdivide_to_level().
void multires_reshape_tangent_matrix_for_corner | ( | const MultiresReshapeContext * | reshape_context, |
int | face_index, | ||
int | corner, | ||
const float | dPdu[3], | ||
const float | dPdv[3], | ||
float | r_tangent_matrix[3][3] | ||
) |
Calculate tangent matrix which converts displacement to a object vector. Is calculated for the given surface derivatives at a given base face corner.
Definition at line 412 of file multires_reshape_util.c.
References BKE_multires_construct_tangent_matrix(), and multires_reshape_is_quad_face().
Referenced by multires_reshape_evaluate_limit_at_grid(), and reshape_subdiv_evaluate_limit_at_grid().
|
static |
Definition at line 686 of file multires_reshape_util.c.
References copy_v3_v3(), D(), ReshapeGridElement::displacement, invert_m3_m3(), mul_v3_m3v3(), multires_reshape_evaluate_limit_at_grid(), multires_reshape_grid_element_for_grid_coord(), P(), and sub_v3_v3v3().
Referenced by multires_reshape_object_grids_to_tangent_displacement().