Blender  V3.3
Classes | Macros | Typedefs | Enumerations | Functions | Variables
multires.c File Reference
#include "MEM_guardedalloc.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_bitmap.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_task.h"
#include "BLI_utildefines.h"
#include "BKE_ccg.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_editmesh.h"
#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
#include "BKE_mesh_runtime.h"
#include "BKE_modifier.h"
#include "BKE_multires.h"
#include "BKE_paint.h"
#include "BKE_pbvh.h"
#include "BKE_scene.h"
#include "BKE_subdiv_ccg.h"
#include "BKE_subsurf.h"
#include "BKE_object.h"
#include "CCGSubSurf.h"
#include "DEG_depsgraph_query.h"
#include "multires_reshape.h"
#include <math.h>
#include <string.h>

Go to the source code of this file.

Classes

struct  MultiresThreadedData
 

Macros

#define DNA_DEPRECATED_ALLOW
 

Typedefs

typedef struct MultiresThreadedData MultiresThreadedData
 

Enumerations

enum  DispOp { APPLY_DISPLACEMENTS , CALC_DISPLACEMENTS , ADD_DISPLACEMENTS }
 

Functions

static void multiresModifier_disp_run (DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, CCGElem **oldGridData, int totlvl)
 
void multires_customdata_delete (Mesh *me)
 
static BLI_bitmapmultires_mdisps_upsample_hidden (BLI_bitmap *lo_hidden, int lo_level, int hi_level, const BLI_bitmap *prev_hidden)
 
static BLI_bitmapmultires_mdisps_downsample_hidden (const BLI_bitmap *old_hidden, int old_level, int new_level)
 
static void multires_output_hidden_to_ccgdm (CCGDerivedMesh *ccgdm, Mesh *me, int level)
 
static void multires_mdisps_subdivide_hidden (MDisps *md, int new_level)
 
MeshBKE_multires_create_mesh (struct Depsgraph *depsgraph, Object *object, MultiresModifierData *mmd)
 
float(* BKE_multires_create_deformed_base_mesh_vert_coords (struct Depsgraph *depsgraph, struct Object *object, struct MultiresModifierData *mmd, int *r_num_deformed_verts))[3]
 
MultiresModifierDatafind_multires_modifier_before (Scene *scene, ModifierData *lastmd)
 
MultiresModifierDataget_multires_modifier (Scene *scene, Object *ob, bool use_first)
 
int multires_get_level (const Scene *scene, const Object *ob, const MultiresModifierData *mmd, bool render, bool ignore_simplify)
 
void multires_set_tot_level (Object *ob, MultiresModifierData *mmd, int lvl)
 
static void multires_ccg_mark_as_modified (SubdivCCG *subdiv_ccg, MultiresModifiedFlags flags)
 
void multires_mark_as_modified (Depsgraph *depsgraph, Object *object, MultiresModifiedFlags flags)
 
void multires_flush_sculpt_updates (Object *object)
 
void multires_force_sculpt_rebuild (Object *object)
 
void multires_force_external_reload (Object *object)
 
static int get_levels_from_disps (Object *ob)
 
void multiresModifier_set_levels_from_disps (MultiresModifierData *mmd, Object *ob)
 
static void multires_set_tot_mdisps (Mesh *me, int lvl)
 
static void multires_reallocate_mdisps (int totloop, MDisps *mdisps, int lvl)
 
static void multires_copy_grid (float(*gridA)[3], float(*gridB)[3], int sizeA, int sizeB)
 
static void multires_copy_dm_grid (CCGElem *gridA, CCGElem *gridB, CCGKey *keyA, CCGKey *keyB)
 
static void multires_grid_paint_mask_downsample (GridPaintMask *gpm, int level)
 
static void multires_del_higher (MultiresModifierData *mmd, Object *ob, int lvl)
 
void multiresModifier_del_levels (MultiresModifierData *mmd, Scene *scene, Object *ob, int direction)
 
static DerivedMeshmultires_dm_create_local (Scene *scene, Object *ob, DerivedMesh *dm, int lvl, int totlvl, bool alloc_paint_mask, int flags)
 
static DerivedMeshsubsurf_dm_create_local (Scene *scene, Object *ob, DerivedMesh *dm, int lvl, bool is_simple, bool is_optimal, bool is_plain_uv, bool alloc_paint_mask, bool for_render, SubsurfFlags flags)
 
static void grid_tangent (const CCGKey *key, int x, int y, int axis, CCGElem *grid, float t[3])
 
static void grid_tangent_matrix (float mat[3][3], const CCGKey *key, int x, int y, CCGElem *grid)
 
static void multires_disp_run_cb (void *__restrict userdata, const int pidx, const TaskParallelTLS *__restrict UNUSED(tls))
 
void multires_modifier_update_mdisps (struct DerivedMesh *dm, Scene *scene)
 
void multires_modifier_update_hidden (DerivedMesh *dm)
 
void multires_stitch_grids (Object *ob)
 
DerivedMeshmultires_make_derived_from_derived (DerivedMesh *dm, MultiresModifierData *mmd, Scene *scene, Object *ob, MultiresFlags flags)
 
void old_mdisps_bilinear (float out[3], float(*disps)[3], const int st, float u, float v)
 
void multiresModifier_sync_levels_ex (Object *ob_dst, MultiresModifierData *mmd_src, MultiresModifierData *mmd_dst)
 
static void multires_sync_levels (Scene *scene, Object *ob_src, Object *ob_dst)
 
static void multires_apply_uniform_scale (Object *object, const float scale)
 
static void multires_apply_smat (struct Depsgraph *UNUSED(depsgraph), Scene *scene, Object *object, const float smat[3][3])
 
int multires_mdisp_corners (const MDisps *s)
 
void multiresModifier_scale_disp (struct Depsgraph *depsgraph, Scene *scene, Object *ob)
 
void multiresModifier_prepare_join (struct Depsgraph *depsgraph, Scene *scene, Object *ob, Object *to_ob)
 
void multires_topology_changed (Mesh *me)
 
void multires_ensure_external_read (struct Mesh *mesh, int top_level)
 
void multiresModifier_ensure_external_read (struct Mesh *mesh, const MultiresModifierData *mmd)
 
int mdisp_rot_face_to_crn (struct MVert *UNUSED(mvert), struct MPoly *mpoly, struct MLoop *UNUSED(mloop), const struct MLoopTri *UNUSED(lt), const int face_side, const float u, const float v, float *x, float *y)
 

Variables

static const int multires_grid_tot []
 
static const int multires_side_tot []
 

Macro Definition Documentation

◆ DNA_DEPRECATED_ALLOW

#define DNA_DEPRECATED_ALLOW

Definition at line 11 of file multires.c.

Typedef Documentation

◆ MultiresThreadedData

Enumeration Type Documentation

◆ DispOp

enum DispOp
Enumerator
APPLY_DISPLACEMENTS 
CALC_DISPLACEMENTS 
ADD_DISPLACEMENTS 

Definition at line 56 of file multires.c.

Function Documentation

◆ BKE_multires_create_deformed_base_mesh_vert_coords()

float(* BKE_multires_create_deformed_base_mesh_vert_coords ( struct Depsgraph depsgraph,
struct Object object,
struct MultiresModifierData mmd,
int *  r_num_deformed_verts 
) )[3]

◆ BKE_multires_create_mesh()

Mesh* BKE_multires_create_mesh ( struct Depsgraph depsgraph,
struct Object object,
struct MultiresModifierData mmd 
)

◆ find_multires_modifier_before()

MultiresModifierData* find_multires_modifier_before ( Scene scene,
ModifierData lastmd 
)

◆ get_levels_from_disps()

static int get_levels_from_disps ( Object ob)
static

◆ get_multires_modifier()

MultiresModifierData* get_multires_modifier ( struct Scene scene,
struct Object ob,
bool  use_first 
)

used for applying scale on mdisps layer and syncing subdivide levels when joining objects.

Parameters
use_firstreturn first multi-res modifier if all multi-res'es are disabled.

Definition at line 317 of file multires.c.

References BKE_modifier_is_enabled(), eModifierMode_Realtime, eModifierType_Multires, ListBase::first, Object::modifiers, ModifierData::next, NULL, scene, and ModifierData::type.

Referenced by BKE_sculpt_get_first_deform_matrices(), join_mesh_single(), multires_apply_smat(), multires_sync_levels(), multiresbake_check(), multiresbake_create_hiresdm(), and multiresbake_create_loresdm().

◆ grid_tangent()

static void grid_tangent ( const CCGKey key,
int  x,
int  y,
int  axis,
CCGElem grid,
float  t[3] 
)
static

Definition at line 782 of file multires.c.

References CCG_grid_elem_co(), CCGKey::grid_size, sub_v3_v3v3(), t, x, and y.

Referenced by grid_tangent_matrix().

◆ grid_tangent_matrix()

static void grid_tangent_matrix ( float  mat[3][3],
const CCGKey key,
int  x,
int  y,
CCGElem grid 
)
static

Definition at line 815 of file multires.c.

References CCG_grid_elem_no(), copy_v3_v3(), grid_tangent(), normalize_v3(), x, and y.

Referenced by multires_disp_run_cb().

◆ mdisp_rot_face_to_crn()

int mdisp_rot_face_to_crn ( struct MVert UNUSEDmvert,
struct MPoly mpoly,
struct MLoop UNUSEDmloop,
const struct MLoopTri UNUSEDlt,
const int  face_side,
const float  u,
const float  v,
float x,
float y 
)

Definition at line 1517 of file multires.c.

References len, len_v3v3(), MPoly::loopstart, NULL, offset, MPoly::totloop, v, w(), x, and y.

◆ multires_apply_smat()

static void multires_apply_smat ( struct Depsgraph UNUSEDdepsgraph,
Scene scene,
Object object,
const float  smat[3][3] 
)
static

◆ multires_apply_uniform_scale()

static void multires_apply_uniform_scale ( Object object,
const float  scale 
)
static

◆ multires_ccg_mark_as_modified()

static void multires_ccg_mark_as_modified ( SubdivCCG subdiv_ccg,
MultiresModifiedFlags  flags 
)
static

◆ multires_copy_dm_grid()

static void multires_copy_dm_grid ( CCGElem gridA,
CCGElem gridB,
CCGKey keyA,
CCGKey keyB 
)
static

Definition at line 583 of file multires.c.

References CCG_elem_offset_co(), CCGKey::elem_size, CCGKey::grid_size, x, and y.

Referenced by multires_modifier_update_mdisps().

◆ multires_copy_grid()

static void multires_copy_grid ( float(*)  gridA[3],
float(*)  gridB[3],
int  sizeA,
int  sizeB 
)
static

Definition at line 559 of file multires.c.

References copy_v3_v3(), x, and y.

Referenced by multires_del_higher().

◆ multires_customdata_delete()

void multires_customdata_delete ( Mesh me)

◆ multires_del_higher()

static void multires_del_higher ( MultiresModifierData mmd,
Object ob,
int  lvl 
)
static

◆ multires_disp_run_cb()

static void multires_disp_run_cb ( void *__restrict  userdata,
const int  pidx,
const TaskParallelTLS *__restrict   UNUSEDtls 
)
static

◆ multires_dm_create_local()

static DerivedMesh* multires_dm_create_local ( Scene scene,
Object ob,
DerivedMesh dm,
int  lvl,
int  totlvl,
bool  alloc_paint_mask,
int  flags 
)
static

◆ multires_ensure_external_read()

void multires_ensure_external_read ( struct Mesh mesh,
int  top_level 
)

Makes sure data from an external file is fully read.

Since the multi-res data files only contain displacement vectors without knowledge about subdivision level some extra work is needed. Namely make is to all displacement grids have proper level and number of displacement vectors set.

Definition at line 1482 of file multires.c.

References CD_DEFAULT, CD_MASK_MDISPS, CD_MDISPS, CustomData_add_layer(), CustomData_external_read(), CustomData_external_test(), CustomData_get_layer(), Mesh::id, Mesh::ldata, MDisps::level, MEM_SAFE_FREE, mesh, multires_grid_tot, NULL, MDisps::totdisp, and Mesh::totloop.

Referenced by multiresModifier_ensure_external_read(), and multiresModifier_reshapeFromCCG().

◆ multires_flush_sculpt_updates()

void multires_flush_sculpt_updates ( Object object)

◆ multires_force_external_reload()

void multires_force_external_reload ( Object object)

◆ multires_force_sculpt_rebuild()

void multires_force_sculpt_rebuild ( Object object)

◆ multires_get_level()

int multires_get_level ( const Scene scene,
const Object ob,
const MultiresModifierData mmd,
bool  render,
bool  ignore_simplify 
)

◆ multires_grid_paint_mask_downsample()

static void multires_grid_paint_mask_downsample ( GridPaintMask gpm,
int  level 
)
static

◆ multires_make_derived_from_derived()

DerivedMesh* multires_make_derived_from_derived ( DerivedMesh dm,
MultiresModifierData mmd,
Scene scene,
Object ob,
MultiresFlags  flags 
)

◆ multires_mark_as_modified()

void multires_mark_as_modified ( Depsgraph depsgraph,
Object object,
MultiresModifiedFlags  flags 
)

◆ multires_mdisp_corners()

int multires_mdisp_corners ( const MDisps s)

Definition at line 1406 of file multires.c.

References MDisps::totdisp.

◆ multires_mdisps_downsample_hidden()

static BLI_bitmap* multires_mdisps_downsample_hidden ( const BLI_bitmap old_hidden,
int  old_level,
int  new_level 
)
static

◆ multires_mdisps_subdivide_hidden()

static void multires_mdisps_subdivide_hidden ( MDisps md,
int  new_level 
)
static

◆ multires_mdisps_upsample_hidden()

static BLI_bitmap* multires_mdisps_upsample_hidden ( BLI_bitmap lo_hidden,
int  lo_level,
int  hi_level,
const BLI_bitmap prev_hidden 
)
static

◆ multires_modifier_update_hidden()

void multires_modifier_update_hidden ( DerivedMesh dm)

◆ multires_modifier_update_mdisps()

void multires_modifier_update_mdisps ( struct DerivedMesh dm,
Scene scene 
)

◆ multires_output_hidden_to_ccgdm()

static void multires_output_hidden_to_ccgdm ( CCGDerivedMesh ccgdm,
Mesh me,
int  level 
)
static

◆ multires_reallocate_mdisps()

static void multires_reallocate_mdisps ( int  totloop,
MDisps mdisps,
int  lvl 
)
static

◆ multires_set_tot_level()

void multires_set_tot_level ( Object ob,
MultiresModifierData mmd,
int  lvl 
)

◆ multires_set_tot_mdisps()

static void multires_set_tot_mdisps ( Mesh me,
int  lvl 
)
static

◆ multires_stitch_grids()

void multires_stitch_grids ( Object ob)

◆ multires_sync_levels()

static void multires_sync_levels ( Scene scene,
Object ob_src,
Object ob_dst 
)
static

◆ multires_topology_changed()

void multires_topology_changed ( struct Mesh me)

Update multi-res data after topology changing.

Definition at line 1448 of file multires.c.

References CD_MASK_MDISPS, CD_MDISPS, CustomData_external_read(), CustomData_get_layer(), MDisps::disps, Mesh::id, Mesh::ldata, MEM_calloc_arrayN, NULL, MDisps::totdisp, and Mesh::totloop.

Referenced by BM_mesh_bm_to_me().

◆ multiresModifier_del_levels()

void multiresModifier_del_levels ( struct MultiresModifierData mmd,
struct Scene scene,
struct Object object,
int  direction 
)

◆ multiresModifier_disp_run()

static void multiresModifier_disp_run ( DerivedMesh dm,
Mesh me,
DerivedMesh dm2,
DispOp  op,
CCGElem **  oldGridData,
int  totlvl 
)
static

◆ multiresModifier_ensure_external_read()

void multiresModifier_ensure_external_read ( struct Mesh mesh,
const MultiresModifierData mmd 
)

◆ multiresModifier_prepare_join()

void multiresModifier_prepare_join ( struct Depsgraph depsgraph,
Scene scene,
Object ob,
Object to_ob 
)

◆ multiresModifier_scale_disp()

void multiresModifier_scale_disp ( struct Depsgraph depsgraph,
Scene scene,
Object ob 
)

Definition at line 1421 of file multires.c.

References BKE_object_scale_to_mat3(), depsgraph, multires_apply_smat(), and scene.

Referenced by apply_objects_internal().

◆ multiresModifier_set_levels_from_disps()

void multiresModifier_set_levels_from_disps ( struct MultiresModifierData mmd,
struct Object ob 
)

◆ multiresModifier_sync_levels_ex()

void multiresModifier_sync_levels_ex ( struct Object ob_dst,
struct MultiresModifierData mmd_src,
struct MultiresModifierData mmd_dst 
)

If ob_src and ob_dst both have multi-res modifiers, synchronize them such that ob_dst has the same total number of levels as ob_src.

Definition at line 1330 of file multires.c.

References multires_del_higher(), MULTIRES_SUBDIVIDE_CATMULL_CLARK, multiresModifier_subdivide_to_level(), and MultiresModifierData::totlvl.

Referenced by BKE_object_copy_modifier(), and multires_sync_levels().

◆ old_mdisps_bilinear()

void old_mdisps_bilinear ( float  out[3],
float(*)  disps[3],
const int  st,
float  u,
float  v 
)

◆ subsurf_dm_create_local()

static DerivedMesh* subsurf_dm_create_local ( Scene scene,
Object ob,
DerivedMesh dm,
int  lvl,
bool  is_simple,
bool  is_optimal,
bool  is_plain_uv,
bool  alloc_paint_mask,
bool  for_render,
SubsurfFlags  flags 
)
static

Variable Documentation

◆ multires_grid_tot

const int multires_grid_tot[]
static
Initial value:
= {
0, 4, 9, 25, 81, 289, 1089, 4225, 16641, 66049, 263169, 1050625, 4198401, 16785409}

Definition at line 50 of file multires.c.

Referenced by multires_del_higher(), multires_ensure_external_read(), multires_reallocate_mdisps(), and multires_set_tot_mdisps().

◆ multires_side_tot

const int multires_side_tot[]
static
Initial value:
= {
0, 2, 3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097}

Definition at line 52 of file multires.c.

Referenced by multires_del_higher(), and multiresModifier_disp_run().