Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-05-30 12:49:45 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-05-30 12:49:45 +0300
commitedc1e65809d1c622a15dbe60330947149db4776f (patch)
treeaa17ba7f970f25d1ebf4378a85993dae90af39f3 /source
parent6afa0a7a50fdd579c4545a8b7718e79d4a6a78be (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')
-rw-r--r--source/blender/blenkernel/BKE_object.h2
-rw-r--r--source/blender/blenkernel/intern/object.c10
-rw-r--r--source/blender/blenloader/intern/readfile.c1
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc106
-rw-r--r--source/blender/makesdna/DNA_object_types.h4
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 {