12#define DNA_DEPRECATED_ALLOW
47 0, 4, 9, 25, 81, 289, 1089, 4225, 16641, 66049, 263169, 1050625, 4198401, 16785409};
49 0, 2, 3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097};
88 for (
int y = 0;
y < new_gridsize;
y++) {
89 for (
int x = 0;
x < new_gridsize;
x++) {
90 const int old_value =
BLI_BITMAP_TEST(old_hidden, factor *
y * old_gridsize +
x * factor);
107 modifier_ctx.
object = object_eval;
113 if (
result == deformed_mesh) {
125 Object object_for_eval = blender::dna::shallow_copy(*object_eval);
127 object_for_eval.
runtime = &runtime;
129 object_for_eval.
data =
object->data;
130 object_for_eval.
sculpt =
nullptr;
141 &virtual_modifier_data);
143 Mesh *base_mesh =
static_cast<Mesh *
>(
object->data);
161 return deformed_verts;
196 if (!mmd && use_first) {
209 const bool ignore_simplify)
218 if (ignore_simplify) {
230 mmd->
lvl = std::clamp<char>(std::max<char>(mmd->
lvl, lvl), 0, mmd->
totlvl);
251 if (
object ==
nullptr) {
264 if (subdiv_ccg ==
nullptr) {
272 if (
object ==
nullptr || object->
sculpt ==
nullptr) {
288 if (subdiv_ccg ==
nullptr) {
296 Mesh *mesh =
static_cast<Mesh *
>(
object->data);
332 if (
object ==
nullptr || object->
sculpt ==
nullptr) {
357 for (
const int i :
faces.index_range()) {
358 for (
const int corner :
faces[
i]) {
359 const MDisps *md = &mdisp[corner];
365 const int side = (1 << (totlvl - 1)) + 1;
366 const int lvl_totdisp = side * side;
367 if (md->
totdisp == lvl_totdisp) {
370 if (md->
totdisp < lvl_totdisp) {
426 skip = (sizeA - 1) / (sizeB - 1);
428 for (j = 0,
y = 0;
y < sizeB;
y++) {
429 for (
x = 0;
x < sizeB;
x++, j++) {
430 copy_v3_v3(gridA[
y * skip * sizeA +
x * skip], gridB[j]);
435 skip = (sizeB - 1) / (sizeA - 1);
437 for (j = 0,
y = 0;
y < sizeA;
y++) {
438 for (
x = 0;
x < sizeA;
x++, j++) {
439 copy_v3_v3(gridA[j], gridB[
y * skip * sizeB +
x * skip]);
449 if (level < gpm->level) {
453 for (
int y = 0;
y < gridsize;
y++) {
454 for (
int x = 0;
x < gridsize;
x++) {
469 const int levels = mmd->
totlvl - lvl;
475 mdisps =
static_cast<MDisps *
>(
482 if (mdisps && levels > 0) {
487 for (
const int i :
faces.index_range()) {
488 for (
const int corner :
faces[
i]) {
489 MDisps *mdisp = &mdisps[corner];
494 if (mdisp->
disps !=
nullptr) {
495 float (*ndisps)[3] = disps;
508 mdisp->
disps = disps;
533 const int levels = mmd->
totlvl - lvl;
542 if (mdisps && levels > 0 && direction == 1) {
556 if (sculpt_session ==
nullptr) {
560 if (subdiv_ccg ==
nullptr) {
570 const int st_max = st - 1;
571 float d[4][3], d2[2][3];
602 const float urat = u -
x;
603 const float vrat =
v -
y;
604 const float uopp = 1 - urat;
648 if (mmd_src && mmd_dst) {
655 Mesh *mesh =
static_cast<Mesh *
>(
object->data);
660 for (
int j = 0; j < grid->
totdisp; j++) {
669 const float smat[3][3])
672 if (mmd ==
nullptr || mmd->
totlvl == 0) {
676 Mesh *mesh =
static_cast<Mesh *
>(
object->data);
698 const int side = (1 << (lvl - 1)) + 1;
699 if ((s->
totdisp % (side * side)) == 0) {
700 return s->
totdisp / (side * side);
720 float smat[3][3], tmat[3][3], mat[3][3];
776 if (mdisps ==
nullptr) {
777 mdisps =
static_cast<MDisps *
>(
783 for (
int i = 0;
i < totloop; ++
i) {
784 if (mdisps[
i].level != top_level) {
793 mdisps[
i].
level = top_level;
int CCG_grid_factor(int low_level, int high_level)
int CCG_grid_size(const int level)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
void CustomData_external_remove(CustomData *data, ID *id, eCustomDataType type, int totelem)
void CustomData_external_read(CustomData *data, ID *id, eCustomDataMask mask, int totelem)
const CustomData_MeshMasks CD_MASK_BAREMESH
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
void CustomData_external_reload(CustomData *data, ID *id, eCustomDataMask mask, int totelem)
bool CustomData_external_test(CustomData *data, eCustomDataType type)
bool CustomData_free_layer_active(CustomData *data, eCustomDataType type)
Mesh * BKE_mesh_copy_for_eval(const Mesh &source)
Mesh * BKE_mesh_from_object(Object *ob)
bool BKE_modifier_is_enabled(const Scene *scene, ModifierData *md, int required_mode)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
bool BKE_modifier_deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
ModifierData * BKE_modifiers_get_virtual_modifierlist(const Object *ob, VirtualModifierData *data)
@ MOD_APPLY_IGNORE_SIMPLIFY
@ MULTIRES_HIDDEN_MODIFIED
@ MULTIRES_COORDS_MODIFIED
void multiresModifier_subdivide_to_level(Object *object, MultiresModifierData *mmd, int top_level, MultiresSubdivideModeType mode)
bool multiresModifier_reshapeFromCCG(int tot_level, Mesh *coarse_mesh, SubdivCCG *subdiv_ccg)
General operations, lookup, etc. for blender objects.
void BKE_object_scale_to_mat3(const Object *ob, float r_mat[3][3])
float paint_grid_paint_mask(const GridPaintMask *gpm, uint level, uint x, uint y)
void BKE_sculptsession_free_pbvh(Object &object)
A BVH for high poly meshes.
int get_render_subsurf_level(const RenderData *r, int lvl, bool for_render)
void BKE_subdiv_ccg_average_stitch_faces(SubdivCCG &subdiv_ccg, const blender::IndexMask &face_mask)
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_SET(_bitmap, _index, _set)
#define LISTBASE_FOREACH(type, var, list)
MINLINE int square_i(int a)
float mat3_to_scale(const float mat[3][3])
bool is_uniform_scaled_m3(const float m[3][3])
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
bool invert_m3(float mat[3][3])
MINLINE void mul_v3_fl(float r[3], float f)
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])
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
eEvaluationMode DEG_get_mode(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.
void BM_data_layer_free(BMesh *bm, CustomData *data, int type)
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v
BPy_StructRNA * depsgraph
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
static void multires_grid_paint_mask_downsample(GridPaintMask *gpm, const int level)
void multires_topology_changed(Mesh *mesh)
void multires_force_external_reload(Object *object)
void multires_customdata_delete(Mesh *mesh)
static const int multires_grid_tot[]
void multiresModifier_prepare_join(Depsgraph *depsgraph, Scene *scene, Object *ob, Object *to_ob)
blender::Array< blender::float3 > BKE_multires_create_deformed_base_mesh_vert_coords(Depsgraph *depsgraph, Object *object, MultiresModifierData *mmd)
static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst)
void multires_ensure_external_read(Mesh *mesh, const int top_level)
void multires_mark_as_modified(Depsgraph *depsgraph, Object *object, const MultiresModifiedFlags flags)
MultiresModifierData * find_multires_modifier_before(Scene *scene, ModifierData *lastmd)
static void multires_apply_smat(Depsgraph *, Scene *scene, Object *object, const float smat[3][3])
void multires_flush_sculpt_updates(Object *object)
Mesh * BKE_multires_create_mesh(Depsgraph *depsgraph, Object *object, MultiresModifierData *mmd)
static void multires_set_tot_mdisps(Mesh *mesh, const int lvl)
void multiresModifier_scale_disp(Depsgraph *depsgraph, Scene *scene, Object *ob)
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, const MultiresModifierData *mmd_src, MultiresModifierData *mmd_dst)
static const int multires_side_tot[]
void multires_set_tot_level(Object *ob, MultiresModifierData *mmd, const int lvl)
static void multires_del_higher(MultiresModifierData *mmd, Object *ob, const int lvl)
static int get_levels_from_disps(Object *ob)
void multires_stitch_grids(Object *ob)
static void multires_apply_uniform_scale(Object *object, const float scale)
void multiresModifier_del_levels(MultiresModifierData *mmd, Scene *scene, Object *ob, const int direction)
void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *ob)
static void multires_copy_grid(float(*gridA)[3], float(*gridB)[3], const int sizeA, const int sizeB)
int multires_mdisp_corners(const MDisps *s)
void multires_force_sculpt_rebuild(Object *object)
static void multires_ccg_mark_as_modified(SubdivCCG *subdiv_ccg, const MultiresModifiedFlags flags)
static BLI_bitmap * multires_mdisps_downsample_hidden(const BLI_bitmap *old_hidden, const int old_level, const int new_level)
void multiresModifier_ensure_external_read(Mesh *mesh, const MultiresModifierData *mmd)
MultiresModifierData * get_multires_modifier(Scene *scene, Object *ob, const bool use_first)
int multires_get_level(const Scene *scene, const Object *ob, const MultiresModifierData *mmd, const bool render, const bool ignore_simplify)
pbvh::Tree * pbvh_get(Object &object)
Mesh * mesh_get_eval_deform(Depsgraph *depsgraph, const Scene *scene, Object *ob, const CustomData_MeshMasks *dataMask)
MeshRuntimeHandle * runtime
struct ModifierData * next
struct ModifierData * prev
Mesh *(* modify_mesh)(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
ObjectRuntimeHandle * runtime
struct SculptSession * sculpt
struct SculptSession::@300305335361021334214041350300054316061376210174 multires
MultiresModifierData * modifier
blender::OffsetIndices< int > faces
struct SubdivCCG::@013326174356303061066227044362260371376134015325 dirty