diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-05-24 15:37:47 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-05-27 12:00:42 +0300 |
commit | 5dbda33462349a4ac78f08e8ed4ec7922ca7394f (patch) | |
tree | b73b67873cd42dc1a9a927227fd85e9bfb52285e /source/blender/blenkernel/intern/mesh_convert.c | |
parent | 07d3d8c2fd75d633a7d6ba6aab47308860af676c (diff) |
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
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_convert.c')
-rw-r--r-- | source/blender/blenkernel/intern/mesh_convert.c | 66 |
1 files changed, 54 insertions, 12 deletions
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. |