76#ifdef USE_MODIFIER_VALIDATE
77# define ASSERT_IS_VALID_MESH(mesh) \
78 (BLI_assert((mesh == nullptr) || (BKE_mesh_is_valid(mesh) == true)))
80# define ASSERT_IS_VALID_MESH(mesh)
90 const int totvert = me_deformed->
verts_num;
92 if (totvert == 0 || mesh->verts_num == 0 || mesh->verts_num != totvert) {
138 if (kb && kb->
data) {
168 orco_mesh->vert_positions_for_write().copy_from(orco);
169 orco_mesh->tag_positions_changed();
187 const Mesh *mesh_orco,
190 const int totvert = mesh.verts_num;
197 layer_orco.
copy_from(mesh_orco->vert_positions());
200 layer_orco.
copy_from(mesh.vert_positions());
249 Mesh *mesh_output =
nullptr;
270 if (mesh_component.
get() != input_mesh) {
274 mesh_output = mesh_component.
release();
281 if (mesh_output ==
nullptr) {
294 attributes.remove(
"rest_position");
296 if (positions.sharing_info && positions.varray.is_span()) {
297 attributes.add<
float3>(
"rest_position",
300 *positions.sharing_info));
312 const bool use_deform,
313 const bool need_mapping,
315 const bool use_cache,
316 const bool allow_shared_mesh,
325 Mesh *mesh =
nullptr;
327 Mesh *mesh_deform =
nullptr;
336 Mesh *mesh_orco =
nullptr;
337 Mesh *mesh_orco_cloth =
nullptr;
345 bool multires_applied =
false;
347 const bool sculpt_dyntopo = (sculpt_mode && ob.
sculpt->
bm) && !use_render;
375 if (mesh ==
nullptr) {
384 for (; md; md = md->
next, md_datamask = md_datamask->
next) {
422 bool have_non_onlydeform_modifiers_applied =
false;
423 for (; md; md = md->
next, md_datamask = md_datamask->
next) {
435 have_non_onlydeform_modifiers_applied)
441 if (sculpt_mode && (!has_multires || multires_applied || sculpt_dyntopo)) {
442 bool unsupported =
false;
446 if (!sculpt_dyntopo) {
451 if (sculpt_dyntopo) {
459 unsupported |= multires_applied;
462 if (sculpt_dyntopo) {
495 bool check_for_needs_mapping =
false;
496 if (mesh !=
nullptr) {
497 if (have_non_onlydeform_modifiers_applied ==
false) {
500 check_for_needs_mapping =
true;
506 check_for_needs_mapping =
true;
509 have_non_onlydeform_modifiers_applied =
true;
514 if (check_for_needs_mapping) {
578 if (mesh != mesh_next) {
591 nextmask.
vmask &= ~CD_MASK_ORCO;
609 if (mesh_orco != mesh_next) {
614 mesh_orco = mesh_next;
620 if (!mesh_orco_cloth) {
624 nextmask.
vmask &= ~CD_MASK_CLOTH_ORCO;
635 if (mesh_orco_cloth != mesh_next) {
640 mesh_orco_cloth = mesh_next;
644 mesh->
runtime->deformed_only =
false;
648 multires_applied =
true;
654 for (md = firstmd; md; md = md->
next) {
658 if (mesh ==
nullptr) {
659 if (allow_shared_mesh) {
669 const bool is_own_mesh = (mesh != &mesh_input);
687 if (mesh_orco_cloth) {
702 std::lock_guard
lock{mesh_input.
runtime->eval_mutex};
726 *r_deform = mesh_deform;
728 if (r_geometry_set) {
729 *r_geometry_set =
new GeometrySet(std::move(geometry_set_final));
755 switch (mesh->runtime->wrapper_type) {
757 if (mesh->runtime->edit_data->vert_positions.is_empty()) {
759 mesh->runtime->edit_mesh->bm);
761 return mesh->runtime->edit_data->vert_positions;
764 return mesh->vert_positions_for_write();
782 Mesh *mesh_cage =
nullptr;
789 Mesh *mesh_orco =
nullptr;
815 mesh_input.
runtime->edit_mesh, &final_datamask, &mesh_input);
818 if (r_cage && cageIndex == -1) {
836 bool non_deform_modifier_applied =
false;
837 for (
int i = 0; md; i++, md = md->
next, md_datamask = md_datamask->
next) {
854 if (mesh == mesh_cage) {
859 if (mesh_cage->
runtime->edit_mesh) {
860 mesh->runtime->edit_mesh = mesh_cage->
runtime->edit_mesh;
861 mesh->runtime->is_original_bmesh =
true;
862 mesh->runtime->deformed_only = mesh_cage->
runtime->deformed_only;
863 if (mesh_cage->
runtime->edit_data) {
864 mesh->runtime->edit_data = std::make_unique<EditMeshData>(
865 *mesh_cage->
runtime->edit_data);
879 mesh->tag_positions_changed();
883 non_deform_modifier_applied =
true;
892 mask.vmask &= ~CD_MASK_ORCO;
903 if (mesh_orco && mesh_orco != mesh_next) {
906 mesh_orco = mesh_next;
914 mask = md_datamask->
mask;
933 if (mesh != mesh_next) {
938 mesh->
runtime->deformed_only =
false;
941 if (r_cage && i == cageIndex) {
965 if (r_geometry_set) {
966 *r_geometry_set =
new GeometrySet(std::move(geometry_set_final));
972 const Mesh &mesh_eval)
985 const bool need_mapping)
996 Mesh *mesh_eval =
nullptr, *mesh_deform_eval =
nullptr;
1008 &geometry_set_eval);
1017 const bool is_mesh_eval_owned = (mesh_eval != mesh->
runtime->mesh_eval);
1023 ob.
runtime->geometry_set_eval = geometry_set_eval;
1025 ob.
runtime->mesh_deform_eval = mesh_deform_eval;
1026 ob.
runtime->last_data_mask = dataMask;
1027 ob.
runtime->last_need_mapping = need_mapping;
1033 mesh_eval->
key = mesh->key;
1055 depsgraph, scene, obedit, dataMask, &me_cage, &me_final, &non_mesh_components);
1061 me_final->
runtime->edit_mesh = me_cage->
runtime->edit_mesh = mesh->runtime->edit_mesh;
1069 if (me_final != me_cage) {
1074 const bool is_mesh_eval_owned = (me_final != mesh->
runtime->mesh_eval);
1081 me_final->
key = mesh->key;
1083 obedit.
runtime->editmesh_eval_cage = me_cage;
1085 obedit.
runtime->geometry_set_eval = non_mesh_components;
1087 obedit.
runtime->last_data_mask = dataMask;
1093 bool *r_need_mapping)
1100 if (r_need_mapping) {
1101 *r_need_mapping =
false;
1119 if (r_need_mapping) {
1173 if (mesh->runtime->edit_mesh) {
1187 if (em !=
nullptr) {
1191 BLI_assert_msg(0,
"Request of derformed mesh of object which is in edit mode");
1209 if (!ob->
runtime->mesh_deform_eval ||
1211 (need_mapping && !ob->
runtime->last_need_mapping))
1218 *
depsgraph, *scene, *ob, cddata_masks, need_mapping || ob->
runtime->last_need_mapping);
1221 return ob->
runtime->mesh_deform_eval;
1231 *
depsgraph, *scene, *ob,
true,
false, *dataMask,
false,
false,
nullptr, &result,
nullptr);
1242 *
depsgraph, *scene, *ob,
false,
false, *dataMask,
false,
false,
nullptr, &result,
nullptr);
1253 *
depsgraph, *scene, *ob,
false,
false, *dataMask,
false,
false,
nullptr, &result,
nullptr);
1269 if (!obedit->
runtime->editmesh_eval_cage ||
1278 return obedit->
runtime->editmesh_eval_cage;
1317 if (mesh_eval->
runtime->deformed_only ==
false) {
1320 user_data.
vertexcos =
reinterpret_cast<float(*)[3]
>(r_cos.
data());
1332 const float default_osf[4][2] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}};
1338 const Span<int> corner_verts = mesh.corner_verts();
1344 for (
const int i : faces.index_range()) {
1348 if (
ELEM(face.size(), 3, 4)) {
1349 for (j = 0; j < face.size(); j++, lof++) {
1358 float translate[2], scale[2];
1364 vcos_2d.
resize(face.size());
1365 for (j = 0; j < face.size(); j++) {
1366 mul_v3_m3v3(co, mat, positions[corner_verts[face[j]]]);
1369 for (k = 0; k < 2; k++) {
1370 if (co[k] > max[k]) {
1373 else if (co[k] <
min[k]) {
1384 if (scale[0] == 0.0f) {
1387 if (scale[1] == 0.0f) {
1394 for (j = 0; j < face.size(); j++, lof++) {
void CustomData_set_only_copy(const CustomData *data, eCustomDataMask mask)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
const CustomData_MeshMasks CD_MASK_BAREMESH_ORIGINDEX
void CustomData_MeshMasks_update(CustomData_MeshMasks *mask_dst, const CustomData_MeshMasks *mask_src)
bool CustomData_MeshMasks_are_matching(const CustomData_MeshMasks *mask_ref, const CustomData_MeshMasks *mask_required)
const CustomData_MeshMasks CD_MASK_BAREMESH
void CustomData_free_layers(CustomData *data, eCustomDataType type, int totelem)
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)
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
void BKE_keyblock_convert_from_mesh(const Mesh *mesh, const Key *key, KeyBlock *kb)
KeyBlock * BKE_keyblock_find_by_index(Key *key, int index)
Key * BKE_key_from_object(Object *ob)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
void BKE_id_free(Main *bmain, void *idv)
General operations, lookup, etc. for materials.
void BKE_mesh_copy_parameters_for_eval(Mesh *me_dst, const Mesh *me_src)
void BKE_mesh_tessface_clear(Mesh *mesh)
blender::Array< blender::float3 > BKE_mesh_orco_verts_get(const Object *ob)
void BKE_mesh_orco_verts_transform(Mesh *mesh, blender::MutableSpan< blender::float3 > orco, bool invert)
Mesh * BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num)
Mesh * BKE_mesh_copy_for_eval(const Mesh &source)
void BKE_mesh_free_editmesh(Mesh *mesh)
Mesh * BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const CustomData_MeshMasks *cd_mask_extra, const Mesh *me_settings)
void BKE_mesh_ensure_default_orig_index_customdata(Mesh *mesh)
void BKE_mesh_foreach_mapped_vert(const Mesh *mesh, void(*func)(void *user_data, int index, const float co[3], const float no[3]), void *user_data, MeshForeachFlag flag)
blender::Span< blender::float3 > BKE_mesh_wrapper_vert_coords(const Mesh *mesh)
Mesh * BKE_mesh_wrapper_from_editmesh(std::shared_ptr< BMEditMesh > em, const CustomData_MeshMasks *cd_mask_extra, const Mesh *me_settings)
void BKE_mesh_wrapper_ensure_mdata(Mesh *mesh)
void BKE_mesh_wrapper_tag_positions_changed(Mesh *mesh)
void BKE_modifiers_clear_errors(Object *ob)
bool BKE_modifier_is_enabled(const Scene *scene, ModifierData *md, int required_mode)
int BKE_modifiers_get_cage_index(const Scene *scene, Object *ob, int *r_lastPossibleCageIndex, bool is_virtual)
ModifierData * BKE_modifiers_findby_type(const Object *ob, ModifierType type)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
CDMaskLink * BKE_modifier_calc_data_masks(const Scene *scene, ModifierData *md, CustomData_MeshMasks *final_datamask, int required_mode)
@ eModifierTypeFlag_RequiresOriginalData
bool BKE_modifier_supports_mapping(ModifierData *md)
void BKE_modifier_free_temporary_data(ModifierData *md)
Mesh * BKE_modifier_modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_modifier_deform_vertsEM(ModifierData *md, const ModifierEvalContext *ctx, const BMEditMesh *em, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
ModifierData * BKE_modifiers_get_virtual_modifierlist(const Object *ob, VirtualModifierData *data)
void BKE_modifier_deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
General operations, lookup, etc. for blender objects.
void BKE_object_eval_assign_data(Object *object, ID *data, bool is_owned)
void BKE_object_free_derived_caches(Object *ob)
void BKE_sculpt_update_object_after_eval(Depsgraph *depsgraph, Object *ob_eval)
void BKE_sculpt_update_object_before_eval(Object *ob_eval)
MultiresModifierData * BKE_sculpt_multires_active(const Scene *scene, Object *ob)
bool BKE_paint_select_face_test(const Object *ob)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc)
void axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3])
Normal to x,y matrix.
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
MINLINE void mul_v2_v2(float r[2], const float a[2])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v2_v2(float r[2], const float a[2])
void range_vn_i(int *array_tar, int size, int start)
MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void invert_v2(float r[2])
#define STRNCPY(dst, src)
bool DEG_is_evaluating(const Depsgraph *depsgraph)
@ DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY
bool DEG_is_active(const Depsgraph *depsgraph)
uint32_t DEG_get_eval_flags_for_id(const Depsgraph *graph, const ID *id)
bool DEG_is_evaluated_id(const ID *id)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
eEvaluationMode DEG_get_mode(const Depsgraph *graph)
ViewLayer * DEG_get_evaluated_view_layer(const Depsgraph *graph)
Object * DEG_get_original_object(Object *object)
ID * DEG_get_evaluated_id(const Depsgraph *depsgraph, ID *id)
void DEG_get_customdata_mask_for_object(const Depsgraph *graph, Object *object, CustomData_MeshMasks *r_mask)
@ ID_TAG_COPIED_ON_EVAL_FINAL_RESULT
#define CD_MASK_PROP_BYTE_COLOR
#define CD_MASK_ORIGINDEX
#define CD_MASK_MDEFORMVERT
#define CD_MASK_MVERT_SKIN
#define CD_MASK_PROP_FLOAT2
#define CD_MASK_ORIGSPACE_MLOOP
#define CD_MASK_CLOTH_ORCO
#define OB_MODE_ALL_SCULPT
Object is a sort of wrapper for general info.
@ OB_MODIFIER_FLAG_ADD_REST_POSITION
Read Guarded memory(de)allocation.
Array< float3 > BM_mesh_vert_coords_alloc(BMesh *bm)
constexpr int64_t size() const
constexpr bool is_empty() const
constexpr T * data() const
constexpr void fill(const T &value) const
constexpr void copy_from(Span< T > values) const
constexpr Span slice(int64_t start, int64_t size) const
constexpr bool is_empty() const
void resize(const int64_t new_size)
void ensure_owns_direct_data() override
void replace(Mesh *mesh, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
const Depsgraph * depsgraph
draw_view in_light_buf[] float
void MEM_freeN(void *vmemh)
#define ASSERT_IS_VALID_MESH(mesh)
float3 face_normal_calc(Span< float3 > vert_positions, Span< int > face_verts)
const ShrinkwrapBoundaryData & boundary_cache_ensure(const Mesh &mesh)
static void add_orco_mesh(Object &ob, const BMEditMesh *em, Mesh &mesh, const Mesh *mesh_orco, const eCustomDataType layer)
static Mesh * create_orco_mesh(const Object &ob, const Mesh &mesh, const BMEditMesh *em, eCustomDataType layer)
Mesh * editbmesh_get_eval_cage(Depsgraph *depsgraph, const Scene *scene, Object *obedit, BMEditMesh *em, const CustomData_MeshMasks *dataMask)
static void mesh_build_data(Depsgraph &depsgraph, const Scene &scene, Object &ob, const CustomData_MeshMasks &dataMask, const bool need_mapping)
static void object_get_datamask(const Depsgraph &depsgraph, Object &ob, CustomData_MeshMasks &r_mask, bool *r_need_mapping)
Mesh * mesh_create_eval_no_deform_render(Depsgraph *depsgraph, const Scene *scene, Object *ob, const CustomData_MeshMasks *dataMask)
static void editbmesh_calc_modifiers(Depsgraph &depsgraph, const Scene &scene, Object &ob, const CustomData_MeshMasks &dataMask, Mesh **r_cage, Mesh **r_final, GeometrySet **r_geometry_set)
static void mesh_init_origspace(Mesh &mesh)
Mesh * mesh_create_eval_no_deform(Depsgraph *depsgraph, const Scene *scene, Object *ob, const CustomData_MeshMasks *dataMask)
static Span< float3 > get_orco_coords(const Object &ob, const BMEditMesh *em, eCustomDataType layer_type, Array< float3 > &storage)
static Mesh * modifier_modify_mesh_and_geometry_set(ModifierData *md, const ModifierEvalContext &mectx, Mesh *input_mesh, GeometrySet &geometry_set)
void mesh_eval_to_meshkey(const Mesh *me_deformed, Mesh *mesh, KeyBlock *kb)
static void mesh_calc_finalize(const Mesh &mesh_input, Mesh &mesh_eval)
static void make_vertexcos__mapFunc(void *user_data, int index, const float co[3], const float[3])
bool editbmesh_modifier_is_enabled(const Scene *scene, const Object *ob, ModifierData *md, bool has_prev_mesh)
static void mesh_build_extra_data(const Depsgraph &depsgraph, const Object &ob, const Mesh &mesh_eval)
static void mesh_set_only_copy(Mesh *mesh, const CustomData_MeshMasks *mask)
static MutableSpan< float3 > orco_coord_layer_ensure(Mesh &mesh, const eCustomDataType layer)
Mesh * editbmesh_get_eval_cage_from_orig(Depsgraph *depsgraph, const Scene *scene, Object *obedit, const CustomData_MeshMasks *dataMask)
Mesh * mesh_get_eval_deform(Depsgraph *depsgraph, const Scene *scene, Object *ob, const CustomData_MeshMasks *dataMask)
static void editbmesh_build_data(Depsgraph &depsgraph, const Scene &scene, Object &obedit, CustomData_MeshMasks &dataMask)
void mesh_data_update(Depsgraph &depsgraph, const Scene &scene, Object &ob, const CustomData_MeshMasks &dataMask)
static void mesh_calc_modifiers(Depsgraph &depsgraph, const Scene &scene, Object &ob, const bool use_deform, const bool need_mapping, const CustomData_MeshMasks &dataMask, const bool use_cache, const bool allow_shared_mesh, Mesh **r_deform, Mesh **r_final, GeometrySet **r_geometry_set)
void mesh_get_mapped_verts_coords(Mesh *mesh_eval, MutableSpan< float3 > r_cos)
static MutableSpan< float3 > mesh_wrapper_vert_coords_ensure_for_write(Mesh *mesh)
Mesh * mesh_create_eval_final(Depsgraph *depsgraph, const Scene *scene, Object *ob, const CustomData_MeshMasks *dataMask)
static void set_rest_position(Mesh &mesh)
void isolate_task(const Function &function)
VecBase< float, 3 > float3
CustomData_MeshMasks mask
struct ClothSimSettings * sim_parms
MeshRuntimeHandle * runtime
struct ModifierData * next
void(* modify_geometry_set)(ModifierData *md, const ModifierEvalContext *ctx, blender::bke::GeometrySet *geometry_set)
void(* required_data_mask)(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
void(* deform_verts_EM)(ModifierData *md, const ModifierEvalContext *ctx, const BMEditMesh *em, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
ObjectRuntimeHandle * runtime
struct SculptSession * sculpt
GeometryComponent & get_component_for_write(GeometryComponent::Type component_type)
bool has(const GeometryComponent::Type component_type) const
void ensure_owns_direct_data()
void replace_mesh(Mesh *mesh, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
BLI_bitmap * vertex_visit