12#define DNA_DEPRECATED_ALLOW
48 0, 4, 9, 25, 81, 289, 1089, 4225, 16641, 66049, 263169, 1050625, 4198401, 16785409};
50 0, 2, 3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097};
66 if (
BMEditMesh *em = mesh->runtime->edit_mesh.get()) {
99 int yh, xh, xl, yl, xo, yo, hi_ndx;
105 if (lo_level == hi_level) {
112 offset = 1 << (hi_level - lo_level - 1);
115 for (yl = 0; yl < lo_gridsize; yl++) {
116 for (xl = 0; xl < lo_gridsize; xl++) {
120 for (yo = -offset; yo <= offset; yo++) {
121 yh = yl * factor + yo;
122 if (yh < 0 || yh >= hi_gridsize) {
126 for (xo = -offset; xo <= offset; xo++) {
127 xh = xl * factor + xo;
128 if (xh < 0 || xh >= hi_gridsize) {
132 hi_ndx = yh * hi_gridsize + xh;
138 if (lo_val != prev_hidden[hi_ndx]) {
163 int x,
y, factor, old_value;
169 for (y = 0; y < new_gridsize; y++) {
170 for (x = 0; x < new_gridsize; x++) {
171 old_value =
BLI_BITMAP_TEST(old_hidden, factor * y * old_gridsize + x * factor);
191 for (
const int i : faces.index_range()) {
192 for (j = 0; j < faces[i].size(); j++) {
193 int g = gridOffset[i] + j;
194 const MDisps *md = &mdisps[g];
213 if (md->
level >= new_level) {
232 modifier_ctx.object = object_eval;
238 if (result == deformed_mesh) {
250 Object object_for_eval = blender::dna::shallow_copy(*object_eval);
252 object_for_eval.
runtime = &runtime;
254 object_for_eval.
data =
object->data;
255 object_for_eval.
sculpt =
nullptr;
266 &virtual_modifier_data);
268 Mesh *base_mesh =
static_cast<Mesh *
>(
object->data);
286 return deformed_verts;
293 for (md = lastmd; md; md = md->
prev) {
322 if (!mmd && use_first) {
335 bool ignore_simplify)
344 if (ignore_simplify) {
356 mmd->
lvl = std::clamp<char>(std::max<char>(mmd->
lvl, lvl), 0, mmd->
totlvl);
375 if (
object ==
nullptr) {
387 SubdivCCG *subdiv_ccg = mesh->runtime->subdiv_ccg.get();
388 if (subdiv_ccg ==
nullptr) {
396 if (
object ==
nullptr || object->sculpt ==
nullptr) {
412 if (subdiv_ccg ==
nullptr) {
420 Mesh *mesh =
static_cast<Mesh *
>(
object->data);
456 if (
object ==
nullptr || object->sculpt ==
nullptr) {
481 for (
const int i : faces.index_range()) {
482 for (
const int corner : faces[i]) {
483 const MDisps *md = &mdisp[corner];
489 int side = (1 << (totlvl - 1)) + 1;
490 int lvl_totdisp = side * side;
491 if (md->
totdisp == lvl_totdisp) {
494 if (md->
totdisp < lvl_totdisp) {
514 if (
BMEditMesh *em = mesh->runtime->edit_mesh.get()) {
536 for (i = 0; i < mesh->corners_num; i++, mdisps++) {
548 for (i = 0; i < totloop; i++) {
550 float(*disps)[3] =
static_cast<float(*)[3]
>(
553 if (mdisps[i].disps) {
557 if (mdisps[i].level && mdisps[i].hidden) {
561 mdisps[i].
disps = disps;
563 mdisps[i].
level = lvl;
572 skip = (sizeA - 1) / (sizeB - 1);
574 for (j = 0, y = 0; y < sizeB; y++) {
575 for (x = 0; x < sizeB; x++, j++) {
576 copy_v3_v3(gridA[y * skip * sizeA + x * skip], gridB[j]);
581 skip = (sizeB - 1) / (sizeA - 1);
583 for (j = 0, y = 0; y < sizeA; y++) {
584 for (x = 0; x < sizeA; x++, j++) {
585 copy_v3_v3(gridA[j], gridB[y * skip * sizeB + x * skip]);
598 for (j = 0, y = 0; y < keyB->
grid_size; y++) {
599 for (x = 0; x < keyB->
grid_size; x++, j++) {
609 for (j = 0, y = 0; y < keyA->
grid_size; y++) {
610 for (x = 0; x < keyA->
grid_size; x++, j++) {
623 if (level < gpm->level) {
625 float *data =
static_cast<float *
>(
629 for (y = 0; y < gridsize; y++) {
630 for (x = 0; x < gridsize; x++) {
645 int levels = mmd->
totlvl - lvl;
651 mdisps =
static_cast<MDisps *
>(
658 if (mdisps && levels > 0) {
663 for (
const int i : faces.index_range()) {
664 for (
const int corner : faces[i]) {
665 MDisps *mdisp = &mdisps[corner];
666 float(*disps)[3], (*ndisps)[3], (*hdisps)[3];
669 disps =
static_cast<float(*)[3]
>(
672 if (mdisp->
disps !=
nullptr) {
674 hdisps = mdisp->
disps;
686 mdisp->
disps = disps;
711 int levels = mmd->
totlvl - lvl;
720 if (mdisps && levels > 0 && direction == 1) {
732 bool alloc_paint_mask,
743 if (alloc_paint_mask) {
757 bool alloc_paint_mask,
781 if (alloc_paint_mask) {
807 else if (axis == 1) {
855 CCGElem **gridData = tdata->
gridData;
864 int dSkip = tdata->
dSkip;
866 const int numVerts = faces[pidx].size();
867 int S,
x,
y, gIndex = gridOffset[pidx];
869 for (S = 0; S < numVerts; S++, gIndex++) {
870 GridPaintMask *gpm = grid_paint_mask ? &grid_paint_mask[gIndex] :
nullptr;
871 MDisps *mdisp = &mdisps[faces[pidx][S]];
872 CCGElem *grid = gridData[gIndex];
873 CCGElem *subgrid = subGridData[gIndex];
874 float(*dispgrid)[3] =
nullptr;
876 dispgrid = mdisp->
disps;
884 gpm->
data =
static_cast<float *
>(
888 for (y = 0; y < gridSize; y++) {
889 for (x = 0; x < gridSize; x++) {
892 float *data = dispgrid[dGridSize * y * dSkip + x * dSkip];
893 float mat[3][3], disp[3], d[3],
mask;
930 gpm->
data[y * gridSize +
x] = std::clamp(mask, 0.0f, 1.0f);
950 CCGElem **gridData, **subGridData;
957 int i, gridSize, dGridSize, dSkip;
958 int totloop, faces_num;
964 mdisps =
static_cast<MDisps *
>(
970 totloop = mesh->corners_num;
971 faces_num = mesh->faces_num;
976 mdisps =
static_cast<MDisps *
>(
989 subGridData = (oldGridData) ? oldGridData : gridData;
992 dSkip = (dGridSize - 1) / (gridSize - 1);
1001 for (i = 0; i < totloop; i++) {
1002 if (mdisps[i].disps ==
nullptr) {
1014 data.gridData = gridData;
1015 data.subGridData = subGridData;
1018 data.mdisps = mdisps;
1019 data.grid_paint_mask = grid_paint_mask;
1020 data.gridOffset = gridOffset;
1021 data.gridSize = gridSize;
1022 data.dGridSize = dGridSize;
1054 CCGElem **highGridData, **lowGridData, **subGridData, **gridData, *diffGrid;
1055 CCGKey highGridKey, lowGridKey;
1057 int i, j, numGrids, highGridSize, lowGridSize;
1094 subGridData =
static_cast<CCGElem **
>(
1096 diffGrid =
static_cast<CCGElem *
>(
1099 for (i = 0; i < numGrids; i++) {
1101 subGridData[i] =
static_cast<CCGElem *
>(
1104 subGridData[i], highGridData[i], highGridKey.
elem_size * highGridSize * highGridSize);
1107 for (j = 0; j < lowGridSize * lowGridSize; j++) {
1130 for (i = 0; i < numGrids; i++) {
1176 for (i = 0; i < mesh->corners_num; i++) {
1199 if (ob ==
nullptr) {
1203 if (sculpt_session ==
nullptr) {
1207 if (subdiv_ccg ==
nullptr) {
1221 CCGElem **gridData, **subGridData;
1226 int i, gridSize, numGrids;
1256 numGrids = result->getNumGrids(result);
1257 gridSize = result->getGridSize(result);
1258 gridData = result->getGridData(result);
1259 result->getGridKey(result, &key);
1261 subGridData =
static_cast<CCGElem **
>(
1264 for (i = 0; i < numGrids; i++) {
1265 subGridData[i] =
static_cast<CCGElem *
>(
1267 memcpy(subGridData[i], gridData[i], key.
elem_size * gridSize * gridSize);
1282 for (i = 0; i < numGrids; i++) {
1293 const int st_max = st - 1;
1294 float urat, vrat, uopp;
1295 float d[4][3], d2[2][3];
1297 if (!disps || isnan(u) || isnan(
v)) {
1372 if (mmd_src && mmd_dst) {
1382 for (
int i = 0; i < mesh->corners_num; i++) {
1383 MDisps *grid = &mdisps[i];
1384 for (
int j = 0; j < grid->totdisp; j++) {
1393 const float smat[3][3])
1396 if (mmd ==
nullptr || mmd->
totlvl == 0) {
1422 int side = (1 << (lvl - 1)) + 1;
1423 if ((s->totdisp % (side * side)) == 0) {
1424 return s->totdisp / (side * side);
1444 float smat[3][3], tmat[3][3], mat[3][3];
1458 MDisps *mdisp =
nullptr, *cur =
nullptr;
1462 mdisp =
static_cast<MDisps *
>(
1470 for (i = 0; i < mesh->corners_num; i++, cur++) {
1478 for (i = 0; i < mesh->corners_num; i++, mdisp++) {
1483 mdisp->
disps =
static_cast<float(*)[3]
>(
1502 if (mdisps ==
nullptr) {
1503 mdisps =
static_cast<MDisps *
>(
1507 const int totloop = mesh->corners_num;
1509 for (
int i = 0; i < totloop; ++i) {
1510 if (mdisps[i].level != top_level) {
1519 mdisps[i].
level = top_level;
1532 const int face_size,
const int face_side,
const float u,
const float v,
float *x,
float *y)
1534 const float offset = face_side * 0.5f - 0.5f;
1537 if (face_size == 4) {
1538 if (u <= offset &&
v <= offset) {
1541 else if (u > offset &&
v <= offset) {
1544 else if (u > offset &&
v > offset) {
1547 else if (u <= offset && v >= offset) {
1568 else if (face_size == 3) {
1569 int grid_size = offset;
1570 float w = (face_side - 1) - u -
v;
1573 if (u >=
v && u >=
w) {
1578 else if (
v >= u &&
v >=
w) {
1589 W1 /= (face_side - 1);
1590 W2 /= (face_side - 1);
1592 *x = (1 - (2 * W1) / (1 - W2)) * grid_size;
1593 *y = (1 - (2 * W2) / (1 - W1)) * grid_size;
1604 for (i = 0; i < poly->totloop; i++) {
1605 float len =
len_v3v3(
nullptr, positions[corner_verts[poly->loopstart + i]]);
1606 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)
bool CustomData_free_layer_active(CustomData *data, eCustomDataType type, 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)
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)
ModifierData * BKE_modifiers_get_virtual_modifierlist(const Object *ob, VirtualModifierData *data)
@ MOD_APPLY_IGNORE_SIMPLIFY
void BKE_modifier_deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
void multiresModifier_subdivide_to_level(Object *object, MultiresModifierData *mmd, int top_level, eMultiresSubdivideModeType mode)
@ MULTIRES_USE_RENDER_PARAMS
@ MULTIRES_ALLOC_PAINT_MASK
@ MULTIRES_IGNORE_SIMPLIFY
bool multiresModifier_reshapeFromCCG(int tot_level, Mesh *coarse_mesh, SubdivCCG *subdiv_ccg)
@ MULTIRES_SUBDIVIDE_CATMULL_CLARK
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)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
@ 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)
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
const Depsgraph * depsgraph
draw_view in_light_buf[] float
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
ccl_device_inline float2 floor(const float2 a)
ccl_device_inline float4 mask(const int4 mask, const float4 a)
static BLI_bitmap * multires_mdisps_upsample_hidden(BLI_bitmap *lo_hidden, int lo_level, int hi_level, const BLI_bitmap *prev_hidden)
static void multires_copy_grid(float(*gridA)[3], float(*gridB)[3], int sizeA, int sizeB)
void multires_topology_changed(Mesh *mesh)
void multires_force_external_reload(Object *object)
static void multires_set_tot_mdisps(Mesh *mesh, int lvl)
void multires_customdata_delete(Mesh *mesh)
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 const int multires_grid_tot[]
static void multires_grid_paint_mask_downsample(GridPaintMask *gpm, int level)
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_modifier_update_mdisps(DerivedMesh *dm, Scene *scene)
MultiresModifierData * find_multires_modifier_before(Scene *scene, ModifierData *lastmd)
static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl)
void multiresModifier_del_levels(MultiresModifierData *mmd, Scene *scene, Object *ob, int direction)
static void multires_ccg_mark_as_modified(SubdivCCG *subdiv_ccg, MultiresModifiedFlags 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 multires_mdisps_subdivide_hidden(MDisps *md, int new_level)
static BLI_bitmap * multires_mdisps_downsample_hidden(const BLI_bitmap *old_hidden, int old_level, int new_level)
MultiresModifierData * get_multires_modifier(Scene *scene, Object *ob, bool use_first)
void multires_flush_sculpt_updates(Object *object)
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)
Mesh * BKE_multires_create_mesh(Depsgraph *depsgraph, Object *object, MultiresModifierData *mmd)
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[]
static void multires_output_hidden_to_ccgdm(CCGDerivedMesh *ccgdm, Mesh *mesh, int level)
static int get_levels_from_disps(Object *ob)
void multires_stitch_grids(Object *ob)
DerivedMesh * multires_make_derived_from_derived(DerivedMesh *dm, MultiresModifierData *mmd, Scene *scene, Object *ob, MultiresFlags flags)
static void multires_apply_uniform_scale(Object *object, const float scale)
int mdisp_rot_face_to_crn(const int face_size, const int face_side, const float u, const float v, float *x, float *y)
void multires_ensure_external_read(Mesh *mesh, int top_level)
void multires_mark_as_modified(Depsgraph *depsgraph, Object *object, MultiresModifiedFlags 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 DerivedMesh * multires_dm_create_local(Scene *scene, Object *ob, DerivedMesh *dm, int lvl, int totlvl, bool alloc_paint_mask, MultiresFlags flags)
int multires_mdisp_corners(const MDisps *s)
void multires_force_sculpt_rebuild(Object *object)
void multires_modifier_update_hidden(DerivedMesh *dm)
void multires_set_tot_level(Object *ob, MultiresModifierData *mmd, int lvl)
static void multires_copy_dm_grid(CCGElem *gridA, CCGElem *gridB, CCGKey *keyA, CCGKey *keyB)
void multiresModifier_ensure_external_read(Mesh *mesh, const MultiresModifierData *mmd)
static void multires_reallocate_mdisps(int totloop, MDisps *mdisps, int lvl)
int multires_get_level(const Scene *scene, const Object *ob, const MultiresModifierData *mmd, bool render, 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
MultiresModifiedFlags modified_flags
unsigned int ** gridHidden
struct CCGDerivedMesh::@69 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)
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::@48 multires
MultiresModifierData * modifier
struct SubdivCCG::@64 dirty
blender::OffsetIndices< int > faces