Fix more cases of evaluated mesh being built for non-COW objects.
This commit is contained in:
@@ -2004,6 +2004,10 @@ static void mesh_build_data(
|
||||
{
|
||||
BLI_assert(ob->type == OB_MESH);
|
||||
|
||||
/* Evaluated meshes aren't supposed to be created on original instances. If you do,
|
||||
* they aren't cleaned up properly on mode switch, causing crashes, e.g T58150. */
|
||||
BLI_assert(ob->id.tag & LIB_TAG_COPIED_ON_WRITE);
|
||||
|
||||
BKE_object_free_derived_caches(ob);
|
||||
BKE_object_sculpt_modifiers_changed(ob);
|
||||
|
||||
@@ -2153,9 +2157,6 @@ DerivedMesh *mesh_get_derived_final(
|
||||
Mesh *mesh_get_eval_final(
|
||||
struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask)
|
||||
{
|
||||
/* Evaluation meshes on original instances aren't cleaned up properly, causing crashes. */
|
||||
BLI_assert(ob->id.tag & LIB_TAG_COPIED_ON_WRITE);
|
||||
|
||||
/* if there's no evaluated mesh or the last data mask used doesn't include
|
||||
* the data we need, rebuild the derived mesh
|
||||
*/
|
||||
@@ -2205,9 +2206,9 @@ Mesh *mesh_get_eval_deform(struct Depsgraph *depsgraph, Scene *scene, Object *ob
|
||||
|
||||
if (!ob->runtime.mesh_deform_eval ||
|
||||
((dataMask & ob->lastDataMask) != dataMask) ||
|
||||
(need_mapping != ob->lastNeedMapping))
|
||||
(need_mapping && !ob->lastNeedMapping))
|
||||
{
|
||||
mesh_build_data(depsgraph, scene, ob, dataMask, false, need_mapping);
|
||||
mesh_build_data(depsgraph, scene, ob, dataMask | ob->lastDataMask, false, need_mapping || ob->lastNeedMapping);
|
||||
}
|
||||
|
||||
return ob->runtime.mesh_deform_eval;
|
||||
|
||||
@@ -815,10 +815,12 @@ void BKE_mesh_to_curve_nurblist(const Mesh *me, ListBase *nurblist, const int ed
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
|
||||
void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *UNUSED(scene), Object *ob)
|
||||
{
|
||||
/* make new mesh data from the original copy */
|
||||
Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_MESH);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
Mesh *me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, CD_MASK_MESH);
|
||||
ListBase nurblist = {NULL, NULL};
|
||||
|
||||
BKE_mesh_to_curve_nurblist(me_eval, &nurblist, 0);
|
||||
|
||||
@@ -1408,7 +1408,7 @@ PBVH *BKE_sculpt_object_pbvh_ensure(Depsgraph *depsgraph, Object *ob)
|
||||
}
|
||||
else if (ob->type == OB_MESH) {
|
||||
Mesh *me_eval_deform = mesh_get_eval_deform(
|
||||
depsgraph, DEG_get_evaluated_scene(depsgraph), ob, CD_MASK_BAREMESH);
|
||||
depsgraph, DEG_get_evaluated_scene(depsgraph), object_eval, CD_MASK_BAREMESH);
|
||||
pbvh = build_pbvh_from_regular_mesh(ob, me_eval_deform);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
#include "BKE_subsurf.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
#include "ED_armature.h"
|
||||
#include "ED_mesh.h"
|
||||
@@ -249,7 +250,7 @@ static void envelope_bone_weighting(
|
||||
}
|
||||
|
||||
static void add_verts_to_dgroups(
|
||||
ReportList *reports, Depsgraph *depsgraph, Scene *scene, Object *ob, Object *par,
|
||||
ReportList *reports, Depsgraph *depsgraph, Scene *UNUSED(scene), Object *ob, Object *par,
|
||||
int heat, const bool mirror)
|
||||
{
|
||||
/* This functions implements the automatic computation of vertex group
|
||||
@@ -375,7 +376,9 @@ static void add_verts_to_dgroups(
|
||||
|
||||
if (wpmode) {
|
||||
/* if in weight paint mode, use final verts from evaluated mesh */
|
||||
Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
Mesh *me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH);
|
||||
|
||||
BKE_mesh_foreach_mapped_vert_coords_get(me_eval, verts, mesh->totvert);
|
||||
vertsfilled = 1;
|
||||
|
||||
@@ -664,7 +664,10 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
|
||||
selme = (Mesh *)ob_iter->data;
|
||||
|
||||
if (selme->totvert == me->totvert) {
|
||||
me_deformed = mesh_get_eval_deform(depsgraph, scene, ob_iter, CD_MASK_BAREMESH);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob_iter);
|
||||
|
||||
me_deformed = mesh_get_eval_deform(depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH);
|
||||
|
||||
if (!me_deformed) {
|
||||
continue;
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
#include "BKE_report.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
#include "RNA_access.h"
|
||||
#include "RNA_define.h"
|
||||
@@ -133,13 +134,15 @@ static const EnumPropertyItem *dt_layers_select_src_itemf(
|
||||
}
|
||||
else if (data_type == DT_TYPE_UV) {
|
||||
Object *ob_src = CTX_data_active_object(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
|
||||
if (ob_src) {
|
||||
Mesh *me_eval;
|
||||
int num_data, i;
|
||||
|
||||
me_eval = mesh_get_eval_final(depsgraph, scene, ob_src, CD_MASK_BAREMESH | CD_MLOOPUV);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
|
||||
|
||||
me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_src_eval, CD_MASK_BAREMESH | CD_MLOOPUV);
|
||||
num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPUV);
|
||||
|
||||
RNA_enum_item_add_separator(&item, &totitem);
|
||||
@@ -153,13 +156,15 @@ static const EnumPropertyItem *dt_layers_select_src_itemf(
|
||||
}
|
||||
else if (data_type == DT_TYPE_VCOL) {
|
||||
Object *ob_src = CTX_data_active_object(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
|
||||
if (ob_src) {
|
||||
Mesh *me_eval;
|
||||
int num_data, i;
|
||||
|
||||
me_eval = mesh_get_eval_final(depsgraph, scene, ob_src, CD_MASK_BAREMESH | CD_MLOOPCOL);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
|
||||
|
||||
me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_src_eval, CD_MASK_BAREMESH | CD_MLOOPCOL);
|
||||
num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPCOL);
|
||||
|
||||
RNA_enum_item_add_separator(&item, &totitem);
|
||||
@@ -338,9 +343,9 @@ static bool data_transfer_exec_is_object_valid(
|
||||
|
||||
static int data_transfer_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob_src = ED_object_active_context(C);
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
|
||||
ListBase ctx_objects;
|
||||
CollectionPointerLink *ctx_ob_dst;
|
||||
@@ -404,12 +409,15 @@ static int data_transfer_exec(bContext *C, wmOperator *op)
|
||||
}
|
||||
|
||||
if (data_transfer_exec_is_object_valid(op, ob_src, ob_dst, reverse_transfer)) {
|
||||
Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
|
||||
|
||||
if (space_transform) {
|
||||
BLI_SPACE_TRANSFORM_SETUP(space_transform, ob_dst, ob_src);
|
||||
Object *ob_dst_eval = DEG_get_evaluated_object(depsgraph, ob_dst);
|
||||
BLI_SPACE_TRANSFORM_SETUP(space_transform, ob_dst_eval, ob_src_eval);
|
||||
}
|
||||
|
||||
if (BKE_object_data_transfer_mesh(
|
||||
depsgraph, scene, ob_src, ob_dst, data_type, use_create,
|
||||
depsgraph, scene_eval, ob_src_eval, ob_dst, data_type, use_create,
|
||||
map_vert_mode, map_edge_mode, map_loop_mode, map_poly_mode,
|
||||
space_transform, use_auto_transform,
|
||||
max_distance, ray_radius, islands_precision,
|
||||
@@ -605,9 +613,9 @@ static bool datalayout_transfer_poll(bContext *C)
|
||||
|
||||
static int datalayout_transfer_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob_act = ED_object_active_context(C);
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
DataTransferModifierData *dtmd;
|
||||
|
||||
dtmd = (DataTransferModifierData *)edit_modifier_property_get(op, ob_act, eModifierType_DataTransfer);
|
||||
@@ -624,7 +632,9 @@ static int datalayout_transfer_exec(bContext *C, wmOperator *op)
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
BKE_object_data_transfer_layout(depsgraph, scene, ob_src, ob_dst, dtmd->data_types, use_delete,
|
||||
Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
|
||||
|
||||
BKE_object_data_transfer_layout(depsgraph, scene_eval, ob_src_eval, ob_dst, dtmd->data_types, use_delete,
|
||||
dtmd->layers_select_src, dtmd->layers_select_dst);
|
||||
|
||||
DEG_id_tag_update(&ob_dst->id, OB_RECALC_DATA);
|
||||
@@ -649,12 +659,14 @@ static int datalayout_transfer_exec(bContext *C, wmOperator *op)
|
||||
layers_select_dst[fromto_idx] = layers_dst;
|
||||
}
|
||||
|
||||
Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
|
||||
|
||||
data_transfer_exec_preprocess_objects(C, op, ob_src, &ctx_objects, false);
|
||||
|
||||
for (ctx_ob_dst = ctx_objects.first; ctx_ob_dst; ctx_ob_dst = ctx_ob_dst->next) {
|
||||
Object *ob_dst = ctx_ob_dst->ptr.data;
|
||||
if (data_transfer_exec_is_object_valid(op, ob_src, ob_dst, false)) {
|
||||
BKE_object_data_transfer_layout(depsgraph, scene, ob_src, ob_dst, data_type, use_delete,
|
||||
BKE_object_data_transfer_layout(depsgraph, scene_eval, ob_src_eval, ob_dst, data_type, use_delete,
|
||||
layers_select_src, layers_select_dst);
|
||||
}
|
||||
|
||||
|
||||
@@ -1741,7 +1741,10 @@ static Object *modifier_skin_armature_create(Depsgraph *depsgraph, Main *bmain,
|
||||
int *emap_mem;
|
||||
int v;
|
||||
|
||||
me_eval_deform = mesh_get_eval_deform(depsgraph, scene, skin_ob, CD_MASK_BAREMESH);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, skin_ob);
|
||||
|
||||
me_eval_deform = mesh_get_eval_deform(depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH);
|
||||
mvert = me_eval_deform->mvert;
|
||||
|
||||
/* add vertex weights to original mesh */
|
||||
|
||||
@@ -3564,7 +3564,7 @@ static void intersect_dm_quad_weights(const float v1[3], const float v2[3], cons
|
||||
}
|
||||
|
||||
/** Check intersection with an evaluated mesh. */
|
||||
static int particle_intersect_mesh(Depsgraph *depsgraph, Scene *scene, Object *ob, Mesh *mesh,
|
||||
static int particle_intersect_mesh(Depsgraph *depsgraph, Scene *UNUSED(scene), Object *ob, Mesh *mesh,
|
||||
float *vert_cos,
|
||||
const float co1[3], const float co2[3],
|
||||
float *min_d, int *min_face, float *min_w,
|
||||
@@ -3580,9 +3580,12 @@ static int particle_intersect_mesh(Depsgraph *depsgraph, Scene *scene, Object *o
|
||||
if (mesh == NULL) {
|
||||
psys_disable_all(ob);
|
||||
|
||||
mesh = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
|
||||
mesh = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH);
|
||||
if (mesh == NULL) {
|
||||
mesh = mesh_get_eval_deform(depsgraph, scene, ob, CD_MASK_BAREMESH);
|
||||
mesh = mesh_get_eval_deform(depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH);
|
||||
}
|
||||
|
||||
psys_enable_all(ob);
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
#include "BKE_mesh_runtime.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
#include "ED_screen.h"
|
||||
#include "ED_view3d.h"
|
||||
@@ -103,11 +104,13 @@ static void vpaint_proj_dm_map_cosnos_init__map_cb(
|
||||
}
|
||||
|
||||
static void vpaint_proj_dm_map_cosnos_init(
|
||||
struct Depsgraph *depsgraph, Scene *scene, Object *ob,
|
||||
struct Depsgraph *depsgraph, Scene *UNUSED(scene), Object *ob,
|
||||
struct VertProjHandle *vp_handle)
|
||||
{
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
Mesh *me = ob->data;
|
||||
Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH | CD_MASK_ORIGINDEX);
|
||||
Mesh *me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH | CD_MASK_ORIGINDEX);
|
||||
|
||||
memset(vp_handle->vcosnos, 0, sizeof(*vp_handle->vcosnos) * me->totvert);
|
||||
BKE_mesh_foreach_mapped_vert(me_eval, vpaint_proj_dm_map_cosnos_init__map_cb, vp_handle, MESH_FOREACH_USE_NORMAL);
|
||||
@@ -168,10 +171,11 @@ static void vpaint_proj_dm_map_cosnos_update(
|
||||
{
|
||||
struct VertProjUpdate vp_update = {vp_handle, ar, mval_fl};
|
||||
|
||||
Scene *scene = vp_handle->scene;
|
||||
Object *ob = vp_handle->ob;
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
Mesh *me = ob->data;
|
||||
Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH | CD_MASK_ORIGINDEX);
|
||||
Mesh *me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH | CD_MASK_ORIGINDEX);
|
||||
|
||||
/* quick sanity check - we shouldn't have to run this if there are no modifiers */
|
||||
BLI_assert(BLI_listbase_is_empty(&ob->modifiers) == false);
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
#include "BKE_colortools.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
#include "WM_api.h"
|
||||
#include "WM_types.h"
|
||||
@@ -786,7 +787,10 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op)
|
||||
|
||||
ED_view3d_init_mats_rv3d(ob, ar->regiondata);
|
||||
|
||||
Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, scene->customdata_mask | CD_MASK_ORIGINDEX);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
|
||||
Mesh *me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, scene->customdata_mask | CD_MASK_ORIGINDEX);
|
||||
if (data.is_init) {
|
||||
data.vert_visit = BLI_BITMAP_NEW(me->totvert, __func__);
|
||||
|
||||
|
||||
@@ -119,7 +119,10 @@ void meshobject_foreachScreenVert(
|
||||
foreachScreenObjectVert_userData data;
|
||||
Mesh *me;
|
||||
|
||||
me = mesh_get_eval_deform(vc->depsgraph, vc->scene, vc->obact, CD_MASK_BAREMESH);
|
||||
Scene *scene_eval = DEG_get_evaluated_scene(vc->depsgraph);
|
||||
Object *ob_eval = DEG_get_evaluated_object(vc->depsgraph, vc->obact);
|
||||
|
||||
me = mesh_get_eval_deform(vc->depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH);
|
||||
|
||||
ED_view3d_check_mats_rv3d(vc->rv3d);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user