Blender V4.3
multires_reshape.hh File Reference
#include "BLI_math_vector_types.hh"
#include "BLI_offset_indices.hh"
#include "BLI_span.hh"
#include "BLI_sys_types.h"
#include "BLI_virtual_array.hh"
#include "BKE_multires.hh"

Go to the source code of this file.

Classes

struct  MultiresReshapeContext
 
struct  GridCoord
 
struct  PTexCoord
 
struct  ReshapeGridElement
 
struct  ReshapeConstGridElement
 

Namespaces

namespace  blender
 
namespace  blender::bke
 
namespace  blender::bke::subdiv
 

Functions

blender::bke::subdiv::Subdivmultires_reshape_create_subdiv (Depsgraph *depsgraph, Object *object, const MultiresModifierData *mmd)
 
bool multires_reshape_context_create_from_object (MultiresReshapeContext *reshape_context, Depsgraph *depsgraph, Object *object, MultiresModifierData *mmd)
 
bool multires_reshape_context_create_from_base_mesh (MultiresReshapeContext *reshape_context, Depsgraph *depsgraph, Object *object, MultiresModifierData *mmd)
 
bool multires_reshape_context_create_from_ccg (MultiresReshapeContext *reshape_context, SubdivCCG *subdiv_ccg, Mesh *base_mesh, int top_level)
 
bool multires_reshape_context_create_from_modifier (MultiresReshapeContext *reshape_context, Object *object, MultiresModifierData *mmd, int top_level)
 
bool multires_reshape_context_create_from_subdiv (MultiresReshapeContext *reshape_context, Object *object, MultiresModifierData *mmd, blender::bke::subdiv::Subdiv *subdiv, int top_level)
 
void multires_reshape_free_original_grids (MultiresReshapeContext *reshape_context)
 
void multires_reshape_context_free (MultiresReshapeContext *reshape_context)
 
int multires_reshape_grid_to_face_index (const MultiresReshapeContext *reshape_context, int grid_index)
 
int multires_reshape_grid_to_corner (const MultiresReshapeContext *reshape_context, int grid_index)
 
bool multires_reshape_is_quad_face (const MultiresReshapeContext *reshape_context, int face_index)
 
int multires_reshape_grid_to_ptex_index (const MultiresReshapeContext *reshape_context, int grid_index)
 
PTexCoord multires_reshape_grid_coord_to_ptex (const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord)
 
GridCoord multires_reshape_ptex_coord_to_grid (const MultiresReshapeContext *reshape_context, const PTexCoord *ptex_coord)
 
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])
 
ReshapeGridElement multires_reshape_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)
 
ReshapeConstGridElement multires_reshape_orig_grid_element_for_grid_coord (const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord)
 
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])
 
void multires_reshape_ensure_grids (Mesh *mesh, int level)
 
bool multires_reshape_assign_final_coords_from_vertcos (const MultiresReshapeContext *reshape_context, const float(*vert_coords)[3], int num_vert_coords)
 
bool multires_reshape_assign_final_coords_from_ccg (const MultiresReshapeContext *reshape_context, SubdivCCG *subdiv_ccg)
 
void multires_reshape_assign_final_coords_from_mdisps (const MultiresReshapeContext *reshape_context)
 
void multires_reshape_assign_final_elements_from_orig_mdisps (const MultiresReshapeContext *reshape_context)
 
void multires_reshape_smooth_object_grids_with_details (const MultiresReshapeContext *reshape_context)
 
void multires_reshape_smooth_object_grids (const MultiresReshapeContext *reshape_context, enum eMultiresSubdivideModeType mode)
 
void multires_reshape_store_original_grids (MultiresReshapeContext *reshape_context)
 
void multires_reshape_object_grids_to_tangent_displacement (const MultiresReshapeContext *reshape_context)
 
void multires_reshape_apply_base_update_mesh_coords (MultiresReshapeContext *reshape_context)
 
void multires_reshape_apply_base_refit_base_mesh (MultiresReshapeContext *reshape_context)
 
void multires_reshape_apply_base_refine_from_base (MultiresReshapeContext *reshape_context)
 
void multires_reshape_apply_base_refine_from_deform (MultiresReshapeContext *reshape_context)
 

Function Documentation

◆ multires_reshape_apply_base_refine_from_base()

void multires_reshape_apply_base_refine_from_base ( MultiresReshapeContext * reshape_context)

Refine subdivision surface to the new positions of the base mesh.

Definition at line 136 of file multires_reshape_apply_base.cc.

References MultiresReshapeContext::base_mesh, blender::bke::subdiv::eval_refine_from_mesh(), and MultiresReshapeContext::subdiv.

Referenced by multiresModifier_base_apply().

◆ multires_reshape_apply_base_refine_from_deform()

void multires_reshape_apply_base_refine_from_deform ( MultiresReshapeContext * reshape_context)

Refine subdivision surface to the new positions of the deformed mesh (base mesh with all modifiers leading the multi-res applied).

Note
Will re-evaluate all leading modifiers, so it's not cheap.

Definition at line 142 of file multires_reshape_apply_base.cc.

References MultiresReshapeContext::base_mesh, BKE_multires_create_deformed_base_mesh_vert_coords(), BLI_assert, depsgraph, MultiresReshapeContext::depsgraph, blender::bke::subdiv::eval_refine_from_mesh(), MultiresReshapeContext::mmd, MultiresReshapeContext::object, and MultiresReshapeContext::subdiv.

Referenced by multiresModifier_base_apply().

◆ multires_reshape_apply_base_refit_base_mesh()

◆ multires_reshape_apply_base_update_mesh_coords()

void multires_reshape_apply_base_update_mesh_coords ( MultiresReshapeContext * reshape_context)

Update mesh coordinates to the final positions of displacement in object space. This is effectively desired position of base mesh vertices after canceling out displacement.

Note
Expects that mesh's CD_MDISPS has been set to object space positions.

Definition at line 22 of file multires_reshape_apply_base.cc.

References add_v3_v3v3(), MultiresReshapeContext::base_corner_verts, MultiresReshapeContext::base_mesh, MultiresReshapeContext::base_positions, ReshapeConstGridElement::displacement, GridCoord::grid_index, blender::Span< T >::index_range(), mul_v3_m3v3(), multires_reshape_evaluate_limit_at_grid(), multires_reshape_orig_grid_element_for_grid_coord(), P, GridCoord::u, and GridCoord::v.

Referenced by multiresModifier_base_apply().

◆ multires_reshape_assign_final_coords_from_ccg()

bool multires_reshape_assign_final_coords_from_ccg ( const MultiresReshapeContext * reshape_context,
SubdivCCG * subdiv_ccg )

Store final object-space coordinates in the displacement grids. The reason why displacement grids are used for storage is based on memory footprint optimization.

Note
Displacement grids to be at least at a reshape level.
Returns
truth if all coordinates have been updated.

Definition at line 18 of file multires_reshape_ccg.cc.

References BKE_subdiv_ccg_key(), BLI_assert, ReshapeGridElement::displacement, float, GridCoord::grid_index, MultiresReshapeContext::grid_size, SubdivCCG::grids_num, blender::Array< T, InlineBufferCapacity, Allocator >::is_empty(), MultiresReshapeContext::level, ReshapeGridElement::mask, SubdivCCG::masks, multires_reshape_grid_element_for_grid_coord(), SubdivCCG::positions, MultiresReshapeContext::reshape, GridCoord::u, GridCoord::v, v, x, and y.

Referenced by multiresModifier_reshapeFromCCG().

◆ multires_reshape_assign_final_coords_from_mdisps()

void multires_reshape_assign_final_coords_from_mdisps ( const MultiresReshapeContext * reshape_context)

◆ multires_reshape_assign_final_coords_from_vertcos()

bool multires_reshape_assign_final_coords_from_vertcos ( const MultiresReshapeContext * reshape_context,
const float(*) vert_coords[3],
int num_vert_coords )

◆ multires_reshape_assign_final_elements_from_orig_mdisps()

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 825 of file multires_reshape_util.cc.

References assign_final_elements_from_orig_mdisps(), foreach_grid_coordinate(), MultiresReshapeContext::level, and MultiresReshapeContext::top.

Referenced by multiresModifier_subdivide_to_level().

◆ multires_reshape_context_create_from_base_mesh()

◆ multires_reshape_context_create_from_ccg()

◆ multires_reshape_context_create_from_modifier()

◆ multires_reshape_context_create_from_object()

◆ multires_reshape_context_create_from_subdiv()

◆ multires_reshape_context_free()

◆ multires_reshape_create_subdiv()

blender::bke::subdiv::Subdiv * multires_reshape_create_subdiv ( Depsgraph * depsgraph,
Object * object,
const MultiresModifierData * mmd )

Create subdivision surface descriptor which is configured for surface evaluation at a given multi-res modifier.

Definition at line 35 of file multires_reshape_util.cc.

References BKE_multires_subdiv_settings_init(), CD_MASK_BAREMESH, DEG_get_evaluated_object(), DEG_get_evaluated_scene(), and depsgraph.

Referenced by multires_reshape_context_create_from_base_mesh(), multires_reshape_context_create_from_modifier(), and multires_reshape_context_create_from_object().

◆ multires_reshape_ensure_grids()

void multires_reshape_ensure_grids ( Mesh * mesh,
int level )

◆ multires_reshape_evaluate_limit_at_grid()

◆ multires_reshape_free_original_grids()

◆ multires_reshape_grid_coord_to_ptex()

◆ multires_reshape_grid_element_for_grid_coord()

◆ multires_reshape_grid_element_for_ptex_coord()

ReshapeGridElement multires_reshape_grid_element_for_ptex_coord ( const MultiresReshapeContext * reshape_context,
const PTexCoord * ptex_coord )

◆ multires_reshape_grid_to_corner()

int multires_reshape_grid_to_corner ( const MultiresReshapeContext * reshape_context,
int grid_index )

◆ multires_reshape_grid_to_face_index()

int multires_reshape_grid_to_face_index ( const MultiresReshapeContext * reshape_context,
int grid_index )

◆ multires_reshape_grid_to_ptex_index()

int multires_reshape_grid_to_ptex_index ( const MultiresReshapeContext * reshape_context,
int grid_index )

◆ multires_reshape_is_quad_face()

◆ multires_reshape_object_grids_to_tangent_displacement()

◆ multires_reshape_orig_grid_element_for_grid_coord()

◆ multires_reshape_ptex_coord_to_grid()

◆ multires_reshape_smooth_object_grids()

void multires_reshape_smooth_object_grids ( const MultiresReshapeContext * reshape_context,
enum eMultiresSubdivideModeType mode )

Operates on a displacement grids (CD_MDISPS) which contains object space-coordinates stored for the reshape level.

Makes it so surface on top level looks smooth. Details are not preserved

Definition at line 1471 of file multires_reshape_smooth.cc.

References MultiresReshapeContext::level, MultiresReshapeContext::reshape, MultiresReshapeContext::top, and UNUSED_VARS.

Referenced by multiresModifier_subdivide_to_level().

◆ multires_reshape_smooth_object_grids_with_details()

void multires_reshape_smooth_object_grids_with_details ( const MultiresReshapeContext * reshape_context)

Operates on a displacement grids (CD_MDISPS) which contains object space coordinates stored for the reshape level.

The result is grids which are defining mesh with a smooth surface and details starting from reshape level up to top level added back from original displacement grids.

Definition at line 1435 of file multires_reshape_smooth.cc.

References blender::bke::subdiv::Settings::is_simple, MultiresReshapeContext::level, MULTIRES_SUBDIVIDE_CATMULL_CLARK, MULTIRES_SUBDIVIDE_SIMPLE, MultiresReshapeContext::reshape, blender::bke::subdiv::Subdiv::settings, MultiresReshapeContext::subdiv, MultiresReshapeContext::top, and UNUSED_VARS.

Referenced by multiresModifier_reshapeFromCCG(), multiresModifier_reshapeFromVertcos(), and multiresModifier_subdivide_to_level().

◆ multires_reshape_store_original_grids()

◆ multires_reshape_tangent_matrix_for_corner()

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 459 of file multires_reshape_util.cc.

References BKE_multires_construct_tangent_matrix(), and multires_reshape_is_quad_face().

Referenced by multires_reshape_evaluate_limit_at_grid().