Hi, Forgot to alter the commit message: the proper name of argument is preserve_all_data_layers.
Sorry for the confusion. On Mon, May 27, 2019 at 11:01 AM Sergey Sharybin <[email protected]> wrote: > Commit: 5dbda33462349a4ac78f08e8ed4ec7922ca7394f > Author: Sergey Sharybin > Date: Fri May 24 14:37:47 2019 +0200 > Branches: master > https://developer.blender.org/rB5dbda33462349a4ac78f08e8ed4ec7922ca7394f > > Depsgraph API: Allow preserving custom data layers > > This commit extends dependency graph API with an argument which > denotes that all custom data layers are to be preserved. This > forces modifier stack re-evaluation with more inclusive mask. > > Far from ideal, since this might fail in certain configurations > with indirectly used objects which might be missing layers needed > for the current object evaluation. But this is how it worked for > a long time, so should be good enough for until more sophisticated > solution is found. > > In order to use this new behavior two things are to be passed: > > - Pass keep_all_data_layers=True > - Pass a valid dependency graph. > > The dependency graph is only needed if keep_all_data_layers=True > and is NOT to be passed if keep_all_data_layers=False. > > If keep_all_data_layers=True the dependency graph MUST be passed. > > Reviewers: mont29, brecht > > Reviewed By: mont29 > > Maniphest Tasks: T64994, T64794 > > Differential Revision: https://developer.blender.org/D4940 > > =================================================================== > > M intern/cycles/blender/blender_util.h > M source/blender/blenkernel/BKE_mesh.h > M source/blender/blenkernel/BKE_object.h > M source/blender/blenkernel/intern/mesh_convert.c > M source/blender/blenkernel/intern/object.c > M source/blender/editors/object/object_bake_api.c > M > source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp > M source/blender/makesrna/intern/rna_main_api.c > M source/blender/makesrna/intern/rna_object_api.c > > =================================================================== > > diff --git a/intern/cycles/blender/blender_util.h > b/intern/cycles/blender/blender_util.h > index 972d7296727..69e55d67532 100644 > --- a/intern/cycles/blender/blender_util.h > +++ b/intern/cycles/blender/blender_util.h > @@ -75,11 +75,13 @@ static inline BL::Mesh object_to_mesh(BL::BlendData & > /*data*/, > * UV are not empty. */ > if (mesh.is_editmode() || > (mesh.use_auto_smooth() && subdivision_type == > Mesh::SUBDIVISION_NONE)) { > - mesh = object.to_mesh(); > + BL::Depsgraph depsgraph(PointerRNA_NULL); > + mesh = object.to_mesh(false, depsgraph); > } > } > else { > - mesh = object.to_mesh(); > + BL::Depsgraph depsgraph(PointerRNA_NULL); > + mesh = object.to_mesh(false, depsgraph); > } > > #if 0 > diff --git a/source/blender/blenkernel/BKE_mesh.h > b/source/blender/blenkernel/BKE_mesh.h > index c410946f438..54fbda1fa31 100644 > --- a/source/blender/blenkernel/BKE_mesh.h > +++ b/source/blender/blenkernel/BKE_mesh.h > @@ -209,11 +209,22 @@ float (*BKE_mesh_vertexCos_get(const struct Mesh > *me, int *r_numVerts))[3]; > void BKE_mesh_split_faces(struct Mesh *mesh, bool free_loop_normals); > > /* Create new mesh from the given object at its current state. > - * The owner of this mesh is unknown, it is up to the caller to decide. */ > -struct Mesh *BKE_mesh_new_from_object(struct Object *object); > + * The owner of this mesh is unknown, it is up to the caller to decide. > + * > + * If preserve_all_data_layers is truth then the modifier stack is > re-evaluated to ensure it > + * preserves all possible custom data layers. > + * > + * NOTE: Dependency graph argument is required when > preserve_all_data_layers is truth, and is > + * ignored otherwise. */ > +struct Mesh *BKE_mesh_new_from_object(struct Depsgraph *depsgraph, > + struct Object *object, > + bool preserve_all_data_layers); > > /* This is a version of BKE_mesh_new_from_object() which stores mesh in > the given main database. */ > -struct Mesh *BKE_mesh_new_from_object_to_bmain(struct Main *bmain, struct > Object *object); > +struct Mesh *BKE_mesh_new_from_object_to_bmain(struct Main *bmain, > + struct Depsgraph > *depsgraph, > + struct Object *object, > + bool > preserve_all_data_layers); > > struct Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph > *depsgraph, > struct Scene *scene, > diff --git a/source/blender/blenkernel/BKE_object.h > b/source/blender/blenkernel/BKE_object.h > index aa4d9696527..df1ac0e4081 100644 > --- a/source/blender/blenkernel/BKE_object.h > +++ b/source/blender/blenkernel/BKE_object.h > @@ -400,8 +400,16 @@ bool > BKE_object_empty_image_data_is_visible_in_view3d(const struct Object *ob, > * The result is owned by the object. > * > * The mesh will be freed when object is re-evaluated or is destroyed. It > is possible to force to > - * clear memory sued by this mesh by calling BKE_object_to_mesh_clear(). > */ > -struct Mesh *BKE_object_to_mesh(struct Object *object); > + * clear memory sued by this mesh by calling BKE_object_to_mesh_clear(). > + * > + * If preserve_all_data_layers is truth then the modifier stack is > re-evaluated to ensure it > + * preserves all possible custom data layers. > + * > + * NOTE: Dependency graph argument is required when > preserve_all_data_layers is truth, and is > + * ignored otherwise. */ > +struct Mesh *BKE_object_to_mesh(struct Depsgraph *depsgraph, > + struct Object *object, > + bool preserve_all_data_layers); > > void BKE_object_to_mesh_clear(struct Object *object); > > diff --git a/source/blender/blenkernel/intern/mesh_convert.c > b/source/blender/blenkernel/intern/mesh_convert.c > index 461adc823b9..c7ddb8628f9 100644 > --- a/source/blender/blenkernel/intern/mesh_convert.c > +++ b/source/blender/blenkernel/intern/mesh_convert.c > @@ -1082,17 +1082,11 @@ static Mesh *mesh_new_from_mball_object(Object > *object) > return mesh_result; > } > > -static Mesh *mesh_new_from_mesh_object(Object *object) > +static Mesh *mesh_new_from_mesh(Object *object, Mesh *mesh) > { > - Mesh *mesh_input = object->data; > - /* If we are in edit mode, use evaluated mesh from edit structure, > matching to what > - * viewport is using for visualization. */ > - if (mesh_input->edit_mesh != NULL && > mesh_input->edit_mesh->mesh_eval_final) { > - mesh_input = mesh_input->edit_mesh->mesh_eval_final; > - } > Mesh *mesh_result = NULL; > BKE_id_copy_ex(NULL, > - &mesh_input->id, > + &mesh->id, > (ID **)&mesh_result, > LIB_ID_CREATE_NO_MAIN | LIB_ID_CREATE_NO_USER_REFCOUNT); > /* NOTE: Materials should already be copied. */ > @@ -1101,7 +1095,52 @@ static Mesh *mesh_new_from_mesh_object(Object > *object) > return mesh_result; > } > > -Mesh *BKE_mesh_new_from_object(Object *object) > +static Mesh *mesh_new_from_mesh_object_with_layers(Depsgraph *depsgraph, > Object *object) > +{ > + if (DEG_is_original_id(&object->id)) { > + return mesh_new_from_mesh(object, (Mesh *)object->data); > + } > + > + if (depsgraph == NULL) { > + return NULL; > + } > + > + Object object_for_eval = *object; > + if (object_for_eval.runtime.mesh_orig != NULL) { > + object_for_eval.data = object_for_eval.runtime.mesh_orig; > + } > + > + Scene *scene = DEG_get_evaluated_scene(depsgraph); > + CustomData_MeshMasks mask = CD_MASK_MESH; > + Mesh *result; > + > + if (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER) { > + result = mesh_create_eval_final_render(depsgraph, scene, > &object_for_eval, &mask); > + } > + else { > + result = mesh_create_eval_final_view(depsgraph, scene, > &object_for_eval, &mask); > + } > + > + return result; > +} > + > +static Mesh *mesh_new_from_mesh_object(Depsgraph *depsgraph, > + Object *object, > + bool preserve_all_data_layers) > +{ > + if (preserve_all_data_layers) { > + return mesh_new_from_mesh_object_with_layers(depsgraph, object); > + } > + Mesh *mesh_input = object->data; > + /* If we are in edit mode, use evaluated mesh from edit structure, > matching to what > + * viewport is using for visualization. */ > + if (mesh_input->edit_mesh != NULL && > mesh_input->edit_mesh->mesh_eval_final) { > + mesh_input = mesh_input->edit_mesh->mesh_eval_final; > + } > + return mesh_new_from_mesh(object, mesh_input); > +} > + > +Mesh *BKE_mesh_new_from_object(Depsgraph *depsgraph, Object *object, bool > preserve_all_data_layers) > { > Mesh *new_mesh = NULL; > switch (object->type) { > @@ -1114,7 +1153,7 @@ Mesh *BKE_mesh_new_from_object(Object *object) > new_mesh = mesh_new_from_mball_object(object); > break; > case OB_MESH: > - new_mesh = mesh_new_from_mesh_object(object); > + new_mesh = mesh_new_from_mesh_object(depsgraph, object, > preserve_all_data_layers); > break; > default: > /* Object does not have geometry data. */ > @@ -1144,9 +1183,12 @@ static int > foreach_libblock_make_original_and_usercount_callback(void *user_data > return IDWALK_RET_NOP; > } > > -Mesh *BKE_mesh_new_from_object_to_bmain(Main *bmain, Object *object) > +Mesh *BKE_mesh_new_from_object_to_bmain(Main *bmain, > + Depsgraph *depsgraph, > + Object *object, > + bool preserve_all_data_layers) > { > - Mesh *mesh = BKE_mesh_new_from_object(object); > + Mesh *mesh = BKE_mesh_new_from_object(depsgraph, object, > preserve_all_data_layers); > > /* Make sure mesh only points original datablocks, also increase users > of materials and other > * possibly referenced data-blocks. > diff --git a/source/blender/blenkernel/intern/object.c > b/source/blender/blenkernel/intern/object.c > index 85ca9cb26b9..fcb1066b633 100644 > --- a/source/blender/blenkernel/intern/object.c > +++ b/source/blender/blenkernel/intern/object.c > @@ -4499,11 +4499,11 @@ void BKE_object_update_select_id(struct Main > *bmain) > } > } > > -Mesh *BKE_object_to_mesh(Object *object) > +Mesh *BKE_object_to_mesh(Depsgraph *depsgraph, Object *object, bool > preserve_all_data_layers) > { > BKE_object_to_mesh_clear(object); > > - Mesh *mesh = BKE_mesh_new_from_object(object); > + Mesh *mesh = BKE_mesh_new_from_object(depsgraph, object, > preserve_all_data_layers); > object->runtime.object_as_temp_mesh = mesh; > return mesh; > } > diff --git a/source/blender/editors/object/object_bake_api.c > b/source/blender/editors/object/object_bake_api.c > index f87342a14ad..2f5a4b44412 100644 > --- a/source/blender/editors/object/object_bake_api.c > +++ b/source/blender/editors/object/object_bake_api.c > @@ -707,7 +707,7 @@ static size_t initialize_internal_images(BakeImages > *bake_images, ReportList *re > /* create new mesh with edit mode changes and modifiers applied */ > static Mesh *bake_mesh_new_from_object(Object *object) > { > - Mesh *me = BKE_object_to_mesh(object); > + Mesh *me = BKE_object_to_mesh(NULL, object, false); > > if (me->flag & ME_AUTOSMOOTH) { > BKE_mesh_split_faces(me, true); > @@ -946,7 +946,7 @@ static int bake(Render *re, > md = md_next; > } > > - me_cage = BKE_object_to_mesh(ob_low_eval); > + me_cage = BKE_object_to_mesh(NULL, ob_low_eval, false); > RE_bake_pixels_populate(me_cage, pixel_array_low, num_pixels, > &bake_images, uv_layer); > } > > @@ -965,7 +965,7 @@ static int bake(Render *re, > highpoly[i].ob_eval = DEG_get_evaluated_object(depsgraph, ob_iter); > highpoly[i].ob_eval->restrictflag &= ~OB_RESTRICT_RENDER; > highpoly[i].ob_eval->base_flag |= (BASE_VISIBLE | > BASE_ENABLED_RENDER); > - highpoly[i].me = BKE_object_to_mesh(highpoly[i].ob_eval); > + highpoly[i].me = BKE_object_to_mesh(NULL, highpoly[i].ob_eval, > false); > > /* lowpoly to highpoly transformation matrix */ > copy_m4_m4(highpoly[i].obmat, highpoly[i].ob->obmat); > @@ -1088,7 +1088,7 @@ static int bake(Render *re, > } > > /* Evaluate modifiers again. */ > - me_nores = BKE_object_to_mesh(ob_low_eval); > + me_nores = BKE_object_to_mesh(NULL, ob_low_eval, false); > RE_bake_pixels_populate(me_nores, pixel_array_low, num_pixels, > &bake_images, uv_layer); > > RE_bake_normal_world_to_tangent(pixel_array_low, > dif > > @@ Diff output truncated at 10240 characters. @@ > > _______________________________________________ > Bf-blender-cvs mailing list > [email protected] > https://lists.blender.org/mailman/listinfo/bf-blender-cvs > -- With best regards, Sergey Sharybin _______________________________________________ Bf-committers mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-committers
