12#define DNA_DEPRECATED_ALLOW
50 0, 4, 9, 25, 81, 289, 1089, 4225, 16641, 66049, 263169, 1050625, 4198401, 16785409};
52 0, 2, 3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097};
104 if (lo_level == hi_level) {
111 const int offset = 1 << (hi_level - lo_level - 1);
114 for (
int yl = 0; yl < lo_gridsize; yl++) {
115 for (
int xl = 0; xl < lo_gridsize; xl++) {
119 for (
int yo = -offset; yo <= offset; yo++) {
120 const int yh = yl * factor + yo;
121 if (yh < 0 || yh >= hi_gridsize) {
125 for (
int xo = -offset; xo <= offset; xo++) {
126 const int xh = xl * factor + xo;
127 if (xh < 0 || xh >= hi_gridsize) {
131 const int hi_ndx = yh * hi_gridsize + xh;
137 if (lo_val != prev_hidden[hi_ndx]) {
166 for (
int y = 0;
y < new_gridsize;
y++) {
167 for (
int x = 0;
x < new_gridsize;
x++) {
168 const int old_value =
BLI_BITMAP_TEST(old_hidden, factor *
y * old_gridsize +
x * factor);
186 for (
const int i :
faces.index_range()) {
187 for (
int j = 0; j <
faces[
i].size(); j++) {
188 int g = gridOffset[
i] + j;
189 const MDisps *md = &mdisps[g];
206 if (md->
level >= new_level) {
225 modifier_ctx.
object = object_eval;
231 if (
result == deformed_mesh) {
243 Object object_for_eval = blender::dna::shallow_copy(*object_eval);
245 object_for_eval.
runtime = &runtime;
247 object_for_eval.
data =
object->data;
248 object_for_eval.
sculpt =
nullptr;
259 &virtual_modifier_data);
261 Mesh *base_mesh =
static_cast<Mesh *
>(
object->data);
279 return deformed_verts;
314 if (!mmd && use_first) {
327 const bool ignore_simplify)
336 if (ignore_simplify) {
348 mmd->
lvl = std::clamp<char>(std::max<char>(mmd->
lvl, lvl), 0, mmd->
totlvl);
369 if (
object ==
nullptr) {
382 if (subdiv_ccg ==
nullptr) {
390 if (
object ==
nullptr || object->
sculpt ==
nullptr) {
406 if (subdiv_ccg ==
nullptr) {
414 Mesh *mesh =
static_cast<Mesh *
>(
object->data);
450 if (
object ==
nullptr || object->
sculpt ==
nullptr) {
475 for (
const int i :
faces.index_range()) {
476 for (
const int corner :
faces[
i]) {
477 const MDisps *md = &mdisp[corner];
483 const int side = (1 << (totlvl - 1)) + 1;
484 const int lvl_totdisp = side * side;
485 if (md->
totdisp == lvl_totdisp) {
488 if (md->
totdisp < lvl_totdisp) {
540 for (
int i = 0;
i < totloop;
i++) {
544 if (mdisps[
i].disps) {
548 if (mdisps[
i].level && mdisps[
i].hidden) {
566 skip = (sizeA - 1) / (sizeB - 1);
568 for (j = 0,
y = 0;
y < sizeB;
y++) {
569 for (
x = 0;
x < sizeB;
x++, j++) {
570 copy_v3_v3(gridA[
y * skip * sizeA +
x * skip], gridB[j]);
575 skip = (sizeB - 1) / (sizeA - 1);
577 for (j = 0,
y = 0;
y < sizeA;
y++) {
578 for (
x = 0;
x < sizeA;
x++, j++) {
579 copy_v3_v3(gridA[j], gridB[
y * skip * sizeB +
x * skip]);
617 if (level < gpm->level) {
621 for (
int y = 0;
y < gridsize;
y++) {
622 for (
int x = 0;
x < gridsize;
x++) {
637 const int levels = mmd->
totlvl - lvl;
643 mdisps =
static_cast<MDisps *
>(
650 if (mdisps && levels > 0) {
655 for (
const int i :
faces.index_range()) {
656 for (
const int corner :
faces[
i]) {
657 MDisps *mdisp = &mdisps[corner];
662 if (mdisp->
disps !=
nullptr) {
663 float(*ndisps)[3] = disps;
664 float(*hdisps)[3] = mdisp->
disps;
676 mdisp->
disps = disps;
701 const int levels = mmd->
totlvl - lvl;
710 if (mdisps && levels > 0 && direction == 1) {
722 const bool alloc_paint_mask,
733 if (alloc_paint_mask) {
744 const bool is_simple,
745 const bool is_optimal,
746 const bool is_plain_uv,
747 const bool alloc_paint_mask,
748 const bool for_render,
771 if (alloc_paint_mask) {
782 const CCGKey &key,
const int x,
const int y,
const int axis, CCGElem *grid,
float t[3])
798 else if (axis == 1) {
816 float mat[3][3],
const CCGKey &key,
const int x,
const int y, CCGElem *grid)
847 CCGElem **gridData = tdata->
gridData;
854 const int gridSize = tdata->
gridSize;
856 const int dSkip = tdata->
dSkip;
858 const int numVerts =
faces[pidx].size();
859 int gIndex = gridOffset[pidx];
861 for (
int S = 0; S < numVerts; S++, gIndex++) {
862 GridPaintMask *gpm = grid_paint_mask ? &grid_paint_mask[gIndex] :
nullptr;
864 CCGElem *grid = gridData[gIndex];
865 CCGElem *subgrid = subGridData[gIndex];
866 float(*dispgrid)[3] = mdisp->
disps;
877 for (
int y = 0;
y < gridSize;
y++) {
878 for (
int x = 0;
x < gridSize;
x++) {
881 float *
data = dispgrid[dGridSize *
y * dSkip +
x * dSkip];
882 float mat[3][3], disp[3], d[3];
920 gpm->
data[
y * gridSize +
x] = std::clamp(
mask, 0.0f, 1.0f);
940 CCGElem **oldGridData,
948 int totloop, faces_num;
954 mdisps =
static_cast<MDisps *
>(
966 mdisps =
static_cast<MDisps *
>(
980 CCGElem **subGridData = (oldGridData) ? oldGridData : gridData;
983 const int dSkip = (dGridSize - 1) / (gridSize - 1);
992 for (
int i = 0;
i < totloop;
i++) {
993 if (mdisps[
i].disps ==
nullptr) {
1005 data.gridData = gridData;
1006 data.subGridData = subGridData;
1009 data.mdisps = mdisps;
1010 data.grid_paint_mask = grid_paint_mask;
1011 data.gridOffset = gridOffset;
1012 data.gridSize = gridSize;
1013 data.dGridSize = dGridSize;
1039 CCGKey highGridKey, lowGridKey;
1066 const int highGridSize = highdm->
getGridSize(highdm);
1067 CCGElem **highGridData = highdm->
getGridData(highdm);
1069 const int lowGridSize = lowdm->
getGridSize(lowdm);
1070 CCGElem **lowGridData = lowdm->
getGridData(lowdm);
1077 CCGElem *diffGrid =
static_cast<CCGElem *
>(
1080 for (
int i = 0;
i < numGrids;
i++) {
1082 subGridData[
i] =
static_cast<CCGElem *
>(
1085 subGridData[
i], highGridData[
i], highGridKey.
elem_size * highGridSize * highGridSize);
1088 for (
int j = 0; j < lowGridSize * lowGridSize; j++) {
1098 MEM_freeN(
static_cast<void *
>(diffGrid));
1111 for (
int i = 0;
i < numGrids;
i++) {
1112 MEM_freeN(
static_cast<void *
>(subGridData[
i]));
1177 if (ob ==
nullptr) {
1181 if (sculpt_session ==
nullptr) {
1185 if (subdiv_ccg ==
nullptr) {
1240 for (
int i = 0;
i < numGrids;
i++) {
1241 subGridData[
i] =
static_cast<CCGElem *
>(
1243 memcpy(subGridData[
i], gridData[
i], key.
elem_size * gridSize * gridSize);
1258 for (
int i = 0;
i < numGrids;
i++) {
1259 MEM_freeN(
static_cast<void *
>(subGridData[
i]));
1268 const int st_max = st - 1;
1269 float d[4][3], d2[2][3];
1300 const float urat = u -
x;
1301 const float vrat =
v -
y;
1302 const float uopp = 1 - urat;
1346 if (mmd_src && mmd_dst) {
1353 Mesh *mesh =
static_cast<Mesh *
>(
object->data);
1358 for (
int j = 0; j < grid->
totdisp; j++) {
1367 const float smat[3][3])
1370 if (mmd ==
nullptr || mmd->
totlvl == 0) {
1374 Mesh *mesh =
static_cast<Mesh *
>(
object->data);
1396 const int side = (1 << (lvl - 1)) + 1;
1397 if ((s->
totdisp % (side * side)) == 0) {
1398 return s->
totdisp / (side * side);
1418 float smat[3][3], tmat[3][3], mat[3][3];
1474 if (mdisps ==
nullptr) {
1475 mdisps =
static_cast<MDisps *
>(
1481 for (
int i = 0;
i < totloop; ++
i) {
1482 if (mdisps[
i].level != top_level) {
1491 mdisps[
i].
level = top_level;
1504 const int face_size,
const int face_side,
const float u,
const float v,
float *
x,
float *
y)
1506 const float offset = face_side * 0.5f - 0.5f;
1509 if (face_size == 4) {
1510 if (u <= offset &&
v <= offset) {
1513 else if (u > offset &&
v <= offset) {
1516 else if (u > offset &&
v > offset) {
1519 else if (u <= offset && v >= offset) {
1540 else if (face_size == 3) {
1541 int grid_size = offset;
1542 float w = (face_side - 1) - u -
v;
1545 if (u >=
v && u >=
w) {
1550 else if (
v >= u &&
v >=
w) {
1561 W1 /= (face_side - 1);
1562 W2 /= (face_side - 1);
1564 *
x = (1 - (2 * W1) / (1 - W2)) * grid_size;
1565 *
y = (1 - (2 * W2) / (1 - W1)) * grid_size;
1576 for (
i = 0;
i < poly->totloop;
i++) {
1577 float len =
len_v3v3(
nullptr, positions[corner_verts[poly->loopstart +
i]]);
1578 if (
len < mindist) {
blender::float3 & CCG_grid_elem_no(const CCGKey &key, CCGElem *elem, int x, int y)
blender::float3 & CCG_grid_elem_co(const CCGKey &key, CCGElem *elem, int x, int y)
blender::float3 & CCG_elem_offset_co(const CCGKey &key, CCGElem *elem, int offset)
float & CCG_grid_elem_mask(const CCGKey &key, CCGElem *elem, int x, int y)
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)
DerivedMesh * CDDM_from_mesh(Mesh *mesh)
void DM_set_only_copy(DerivedMesh *dm, const CustomData_MeshMasks *mask)
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
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)
int BKE_ccg_gridsize(int level)
@ MULTIRES_HIDDEN_MODIFIED
@ MULTIRES_COORDS_MODIFIED
@ SUBSURF_ALLOC_PAINT_MASK
@ SUBSURF_USE_RENDER_PARAMS
@ SUBSURF_IGNORE_SIMPLIFY
DerivedMesh * subsurf_make_derived_from_derived(DerivedMesh *dm, SubsurfModifierData *smd, const Scene *scene, float(*vertCos)[3], SubsurfFlags flags)
int BKE_ccg_factor(int low_level, int high_level)
#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_v3_m3v3(float r[3], const float M[3][3], const float a[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 float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[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)
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
MINLINE void sub_v4_v4v4(float r[4], const float a[4], const float b[4])
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)
CCGError ccgSubSurf_updateFromFaces(CCGSubSurf *ss, int lvl, CCGFace **effectedF, int numEffectedF)
CCGError ccgSubSurf_stitchFaces(CCGSubSurf *ss, int lvl, CCGFace **effectedF, int numEffectedF)
CCGError ccgSubSurf_updateNormals(CCGSubSurf *ss, CCGFace **effectedF, int numEffectedF)
CCGError ccgSubSurf_updateLevels(CCGSubSurf *ss, int lvl, CCGFace **effectedF, int numEffectedF)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
eEvaluationMode DEG_get_mode(const Depsgraph *graph)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ eMultiresModifierFlag_ControlEdges
@ eSubsurfModifierFlag_ControlEdges
@ SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES
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
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
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)
static void grid_tangent_matrix(float mat[3][3], const CCGKey &key, const int x, const int y, CCGElem *grid)
void multires_customdata_delete(Mesh *mesh)
static DerivedMesh * multires_dm_create_local(Scene *scene, Object *ob, DerivedMesh *dm, const int lvl, const int totlvl, const bool alloc_paint_mask, MultiresFlags flags)
static const int multires_grid_tot[]
static void multires_reallocate_mdisps(const int totloop, MDisps *mdisps, const int lvl)
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)
static void multires_output_hidden_to_ccgdm(CCGDerivedMesh *ccgdm, Mesh *mesh, const int level)
void multires_mark_as_modified(Depsgraph *depsgraph, Object *object, const MultiresModifiedFlags flags)
void multires_modifier_update_mdisps(DerivedMesh *dm, Scene *scene)
MultiresModifierData * find_multires_modifier_before(Scene *scene, ModifierData *lastmd)
DerivedMesh * multires_make_derived_from_derived(DerivedMesh *dm, MultiresModifierData *mmd, Scene *scene, Object *ob, const MultiresFlags flags)
static void multires_apply_smat(Depsgraph *, Scene *scene, Object *object, const float smat[3][3])
static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *mesh, DerivedMesh *dm2, DispOp op, CCGElem **oldGridData, int totlvl)
static void grid_tangent(const CCGKey &key, const int x, const int y, const int axis, CCGElem *grid, float t[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)
int mdisp_rot_face_to_crn(const int face_size, const int face_side, const float u, const float v, float *x, float *y)
static void multires_mdisps_subdivide_hidden(MDisps *md, const int new_level)
static DerivedMesh * subsurf_dm_create_local(Scene *scene, Object *ob, DerivedMesh *dm, const int lvl, const bool is_simple, const bool is_optimal, const bool is_plain_uv, const bool alloc_paint_mask, const bool for_render, SubsurfFlags flags)
void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *ob)
static void multires_disp_run_cb(void *__restrict userdata, const int pidx, const TaskParallelTLS *__restrict)
static BLI_bitmap * multires_mdisps_upsample_hidden(BLI_bitmap *lo_hidden, const int lo_level, const int hi_level, const BLI_bitmap *prev_hidden)
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 multires_modifier_update_hidden(DerivedMesh *dm)
static void multires_copy_dm_grid(CCGElem *gridA, CCGElem *gridB, CCGKey *keyA, CCGKey *keyB)
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)
MultiresModifierData * mmd
unsigned int ** gridHidden
struct CCGDerivedMesh::@034012374027241015073363241270150027266233110365 multires
int(* getGridSize)(DerivedMesh *dm)
int *(* getPolyArray)(DerivedMesh *dm)
int(* getNumPolys)(DerivedMesh *dm)
int(* getNumGrids)(DerivedMesh *dm)
int *(* getGridOffset)(DerivedMesh *dm)
CCGElem **(* getGridData)(DerivedMesh *dm)
void(* release)(DerivedMesh *dm)
void(* getGridKey)(DerivedMesh *dm, CCGKey *key)
int(* getNumLoops)(DerivedMesh *dm)
MeshRuntimeHandle * runtime
struct ModifierData * next
struct ModifierData * prev
Mesh *(* modify_mesh)(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
GridPaintMask * grid_paint_mask
blender::OffsetIndices< int > faces
ObjectRuntimeHandle * runtime
struct SculptSession * sculpt
struct SculptSession::@323057044041335216000265171165256227034374206114 multires
MultiresModifierData * modifier
blender::OffsetIndices< int > faces
struct SubdivCCG::@040000264272255355151225144226302131071016047240 dirty