[Bf-committers] [Bf-blender-cvs] [5dbda334623] master: Depsgraph API: Allow preserving custom data layers
Sergey Sharybin
sergey.vfx at gmail.com
Mon May 27 11:19:28 CEST 2019
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 <noreply at git.blender.org>
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
> Bf-blender-cvs at blender.org
> https://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
--
With best regards, Sergey Sharybin
More information about the Bf-committers
mailing list