diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-05-30 12:49:45 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-05-30 12:49:45 +0300 |
commit | edc1e65809d1c622a15dbe60330947149db4776f (patch) | |
tree | aa17ba7f970f25d1ebf4378a85993dae90af39f3 /source/blender | |
parent | 6afa0a7a50fdd579c4545a8b7718e79d4a6a78be (diff) |
Add deformed evaluated mesh to object
This is a first step to have correspondence of legacy derivedDeform
within a new formulation. Only base ground for now to support file
reading, copy-on-write remapping and such.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 10 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 1 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc | 106 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_object_types.h | 4 |
5 files changed, 79 insertions, 44 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index ab9af27bec3..f5c36550193 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -295,6 +295,8 @@ void BKE_object_data_relink(struct Object *ob); struct MovieClip *BKE_object_movieclip_get(struct Scene *scene, struct Object *ob, bool use_default); +void BKE_object_runtime_reset(struct Object *object); + /* this function returns a superset of the scenes selection based on relationships */ typedef enum eObRelationTypes { diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 6fa8caba582..71ed9211064 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -352,6 +352,13 @@ void BKE_object_free_derived_caches(Object *ob) MEM_freeN(mesh_eval); ob->runtime.mesh_eval = NULL; } + if (ob->runtime.mesh_deform_eval != NULL) { + Mesh *mesh_deform_eval = ob->runtime.mesh_deform_eval; + BKE_mesh_free(mesh_deform_eval); + BKE_libblock_free_data(&mesh_deform_eval->id, false); + MEM_freeN(mesh_deform_eval); + ob->runtime.mesh_deform_eval = NULL; + } BKE_object_free_curve_cache(ob); } @@ -3344,6 +3351,9 @@ MovieClip *BKE_object_movieclip_get(Scene *scene, Object *ob, bool use_default) return clip; } +void BKE_object_runtime_reset(Object *object) { + memset(&object->runtime, 0, sizeof(object->runtime)); +} /* * Find an associated Armature object diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index bc4b8daf0d3..00e22cbb911 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -5523,6 +5523,7 @@ static void direct_link_object(FileData *fd, Object *ob) ob->bb = NULL; ob->derivedDeform = NULL; ob->derivedFinal = NULL; + BKE_object_runtime_reset(ob); BLI_listbase_clear(&ob->gpulamp); BLI_listbase_clear(&ob->drawdata); link_list(fd, &ob->pc_ids); diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc index 4d9f1f6b977..ad7467ffbdc 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc @@ -693,6 +693,64 @@ static void deg_update_copy_on_write_animation(const Depsgraph *depsgraph, IDWALK_NOP); } +typedef struct ObjectRuntimeBackup { + CurveCache *curve_cache; + Object_Runtime runtime; + short base_flag; +} ObjectRuntimeBackup; + +/* Make a backup of object's evaluation runtime data, additionally + * male object to be safe for free without invalidating backed up + * pointers. + */ +static void deg_backup_object_runtime( + Object *object, + ObjectRuntimeBackup *object_runtime_backup) +{ + /* Store evaluated mesh, and make sure we don't free it. */ + Mesh *mesh_eval = object->runtime.mesh_eval; + object_runtime_backup->runtime = object->runtime; + BKE_object_runtime_reset(object); + /* Currently object update will override actual object->data + * to an evaluated version. Need to make sure we don't have + * data set to evaluated one before free anything. + */ + if (mesh_eval != NULL && object->data == mesh_eval) { + object->data = mesh_eval->id.orig_id; + } + /* Store curve cache and make sure we don't free it. */ + object_runtime_backup->curve_cache = object->curve_cache; + object->curve_cache = NULL; + /* Make a backup of base flags. */ + object_runtime_backup->base_flag = object->base_flag; +} + +static void deg_restore_object_runtime( + Object *object, + const ObjectRuntimeBackup *object_runtime_backup) +{ + object->runtime = object_runtime_backup->runtime; + if (object->runtime.mesh_eval != NULL) { + Mesh *mesh_eval = object->runtime.mesh_eval; + /* Do same thing as object update: override actual object data + * pointer with evaluated datablock. + */ + if (object->type == OB_MESH) { + object->data = mesh_eval; + /* Evaluated mesh simply copied edit_btmesh pointer from + * original mesh during update, need to make sure no dead + * pointers are left behind. + */ + Mesh *mesh = ((Mesh *)mesh_eval->id.orig_id); + mesh_eval->edit_btmesh = mesh->edit_btmesh; + } + } + if (object_runtime_backup->curve_cache != NULL) { + object->curve_cache = object_runtime_backup->curve_cache; + } + object->base_flag = object_runtime_backup->base_flag; +} + ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph, const IDDepsNode *id_node) { @@ -716,9 +774,7 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph, */ ListBase gpumaterial_backup; ListBase *gpumaterial_ptr = NULL; - Mesh *mesh_eval = NULL; - CurveCache *curve_cache = NULL; - short base_flag = 0; + ObjectRuntimeBackup object_runtime_backup = {NULL}; if (check_datablock_expanded(id_cow)) { switch (id_type) { case ID_MA: @@ -753,28 +809,9 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph, break; } case ID_OB: - { - Object *object = (Object *)id_cow; - /* Store evaluated mesh, make sure we don't free it. */ - mesh_eval = object->runtime.mesh_eval; - object->runtime.mesh_eval = NULL; - /* Currently object update will override actual object->data - * to an evaluated version. Need to make sure we don't have - * data set to evaluated one before free anything. - */ - if (mesh_eval != NULL) { - if (object->data == mesh_eval) { - object->data = mesh_eval->id.orig_id; - } - } - /* Store curve cache and make sure we don't free it. */ - curve_cache = object->curve_cache; - object->curve_cache = NULL; - - /* Make a backup of base flags. */ - base_flag = object->base_flag; + deg_backup_object_runtime((Object *)id_cow, + &object_runtime_backup); break; - } default: break; } @@ -790,26 +827,7 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph, *gpumaterial_ptr = gpumaterial_backup; } if (id_type == ID_OB) { - Object *object = (Object *)id_cow; - if (mesh_eval != NULL) { - object->runtime.mesh_eval = mesh_eval; - /* Do same thing as object update: override actual object data - * pointer with evaluated datablock. - */ - if (object->type == OB_MESH) { - object->data = mesh_eval; - /* Evaluated mesh simply copied edit_btmesh pointer from - * original mesh during update, need to make sure no dead - * pointers are left behind. - */ - mesh_eval->edit_btmesh = - ((Mesh *)mesh_eval->id.orig_id)->edit_btmesh; - } - } - if (curve_cache != NULL) { - object->curve_cache = curve_cache; - } - object->base_flag = base_flag; + deg_restore_object_runtime((Object *)id_cow, &object_runtime_backup); } return id_cow; } diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index e525a4fae0c..daff6ab0baa 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -149,6 +149,10 @@ typedef struct Object_Runtime { * It has all modifiers applied. */ struct Mesh *mesh_eval; + /* Mesh structure created during object evaluation. + * It has deforemation only modifiers applied on it. + */ + struct Mesh *mesh_deform_eval; } Object_Runtime; typedef struct Object { |