diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-11-23 14:01:31 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-11-23 14:01:31 +0300 |
commit | f2842ac65ea28e38af45ca8202a1b0d3fcd6c172 (patch) | |
tree | 3e783a336ff5995acde8babef5c1fd09c52a1b2e /source/blender | |
parent | f3fa5c1258d2fb08b83e080b99172ccc0dc1d67a (diff) |
Depsgraph: Cleanup, split build_object() a bit
Diffstat (limited to 'source/blender')
4 files changed, 128 insertions, 132 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 60150eda0bf..838afbbdbbb 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -335,74 +335,26 @@ void DepsgraphNodeBuilder::build_object(Base *base, Object *object) } object->id.tag |= LIB_TAG_DOIT; object->customdata_mask = 0; - - /* Standard components. */ + /* Transform. */ build_object_transform(object); - + /* Parent. */ if (object->parent != NULL) { build_object(NULL, object->parent); } + /* Modifiers. */ if (object->modifiers.first != NULL) { BuilderWalkUserData data; data.builder = this; modifiers_foreachObjectLink(object, modifier_walk, &data); } + /* Constraints. */ if (object->constraints.first != NULL) { BuilderWalkUserData data; data.builder = this; BKE_constraints_id_loop(&object->constraints, constraint_walk, &data); } - /* Object data. */ - if (object->data != NULL) { - /* type-specific data... */ - switch (object->type) { - case OB_MESH: /* Geometry */ - case OB_CURVE: - case OB_FONT: - case OB_SURF: - case OB_MBALL: - case OB_LATTICE: - build_obdata_geom(object); - /* TODO(sergey): Only for until we support granular - * update of curves. - */ - if (object->type == OB_FONT) { - Curve *curve = (Curve *)object->data; - if (curve->textoncurve) { - id_node->eval_flags |= DAG_EVAL_NEED_CURVE_PATH; - } - } - break; - - case OB_ARMATURE: /* Pose */ - if (ID_IS_LINKED(object) && object->proxy_from != NULL) { - build_proxy_rig(object); - } - else { - build_rig(object); - } - break; - - case OB_LAMP: /* Lamp */ - build_lamp(object); - break; - - case OB_CAMERA: /* Camera */ - build_camera(object); - break; - - default: - { - ID *obdata = (ID *)object->data; - if ((obdata->tag & LIB_TAG_DOIT) == 0) { - build_animdata(obdata); - } - break; - } - } - } - + build_object_data(object); /* Build animation data, * * Do it now because it's possible object data will affect @@ -410,29 +362,75 @@ void DepsgraphNodeBuilder::build_object(Base *base, Object *object) * pose for proxy. */ build_animdata(&object->id); - - /* particle systems */ + /* Particle systems. */ if (object->particlesystem.first != NULL) { build_particles(object); } - /* Grease pencil. */ if (object->gpd != NULL) { build_gpencil(object->gpd); } - /* Object that this is a proxy for. */ if (object->proxy) { object->proxy->proxy_from = object; build_object(base, object->proxy); } - /* Object dupligroup. */ if (object->dup_group != NULL) { build_group(base, object->dup_group); } } +void DepsgraphNodeBuilder::build_object_data(Object *object) +{ + if (object->data == NULL) { + return; + } + IDDepsNode *id_node = graph_->find_id_node(&object->id); + /* type-specific data... */ + switch (object->type) { + case OB_MESH: /* Geometry */ + case OB_CURVE: + case OB_FONT: + case OB_SURF: + case OB_MBALL: + case OB_LATTICE: + build_obdata_geom(object); + /* TODO(sergey): Only for until we support granular + * update of curves. + */ + if (object->type == OB_FONT) { + Curve *curve = (Curve *)object->data; + if (curve->textoncurve) { + id_node->eval_flags |= DAG_EVAL_NEED_CURVE_PATH; + } + } + break; + case OB_ARMATURE: + if (ID_IS_LINKED(object) && object->proxy_from != NULL) { + build_proxy_rig(object); + } + else { + build_rig(object); + } + break; + case OB_LAMP: + build_lamp(object); + break; + case OB_CAMERA: + build_camera(object); + break; + default: + { + ID *obdata = (ID *)object->data; + if ((obdata->tag & LIB_TAG_DOIT) == 0) { + build_animdata(obdata); + } + break; + } + } +} + void DepsgraphNodeBuilder::build_object_transform(Object *object) { OperationDepsNode *op_node; diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index cd1355558ea..2fa9ba01cc7 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -121,6 +121,7 @@ struct DepsgraphNodeBuilder { void build_scene(Scene *scene); void build_group(Base *base, Group *group); void build_object(Base *base, Object *object); + void build_object_data(Object *object); void build_object_transform(Object *object); void build_object_constraints(Object *object); void build_pose_constraints(Object *object, bPoseChannel *pchan); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 3520c518c36..67faa59bbc3 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -438,54 +438,57 @@ void DepsgraphRelationBuilder::build_object(Object *object) return; } object->id.tag |= LIB_TAG_DOIT; - /* Object Transforms */ - eDepsOperation_Code base_op = (object->parent) ? DEG_OPCODE_TRANSFORM_PARENT : DEG_OPCODE_TRANSFORM_LOCAL; + eDepsOperation_Code base_op = (object->parent) ? DEG_OPCODE_TRANSFORM_PARENT + : DEG_OPCODE_TRANSFORM_LOCAL; OperationKey base_op_key(&object->id, DEG_NODE_TYPE_TRANSFORM, base_op); - - OperationKey local_transform_key(&object->id, DEG_NODE_TYPE_TRANSFORM, DEG_OPCODE_TRANSFORM_LOCAL); - OperationKey parent_transform_key(&object->id, DEG_NODE_TYPE_TRANSFORM, DEG_OPCODE_TRANSFORM_PARENT); - OperationKey final_transform_key(&object->id, DEG_NODE_TYPE_TRANSFORM, DEG_OPCODE_TRANSFORM_FINAL); - - OperationKey ob_ubereval_key(&object->id, DEG_NODE_TYPE_TRANSFORM, DEG_OPCODE_TRANSFORM_OBJECT_UBEREVAL); - - /* parenting */ + OperationKey local_transform_key(&object->id, + DEG_NODE_TYPE_TRANSFORM, + DEG_OPCODE_TRANSFORM_LOCAL); + OperationKey parent_transform_key(&object->id, + DEG_NODE_TYPE_TRANSFORM, + DEG_OPCODE_TRANSFORM_PARENT); + OperationKey final_transform_key(&object->id, + DEG_NODE_TYPE_TRANSFORM, + DEG_OPCODE_TRANSFORM_FINAL); + OperationKey ob_ubereval_key(&object->id, + DEG_NODE_TYPE_TRANSFORM, + DEG_OPCODE_TRANSFORM_OBJECT_UBEREVAL); + /* Parenting. */ if (object->parent != NULL) { - /* parent relationship */ + /* Parent relationship. */ build_object_parent(object); - - /* local -> parent */ - add_relation(local_transform_key, parent_transform_key, "[ObLocal -> ObParent]"); + /* Local -> parent. */ + add_relation(local_transform_key, + parent_transform_key, + "[ObLocal -> ObParent]"); } - + /* Modifiers. */ if (object->modifiers.first != NULL) { BuilderWalkUserData data; data.builder = this; modifiers_foreachObjectLink(object, modifier_walk, &data); } + /* Constraints. */ if (object->constraints.first != NULL) { BuilderWalkUserData data; data.builder = this; BKE_constraints_id_loop(&object->constraints, constraint_walk, &data); } - - /* object constraints */ + /* Object constraints. */ if (object->constraints.first != NULL) { OperationKey constraint_key(&object->id, DEG_NODE_TYPE_TRANSFORM, DEG_OPCODE_TRANSFORM_CONSTRAINTS); - - /* constraint relations */ + /* Constraint relations. */ build_constraints(&object->id, DEG_NODE_TYPE_TRANSFORM, "", &object->constraints, NULL); - /* operation order */ add_relation(base_op_key, constraint_key, "[ObBase-> Constraint Stack]"); add_relation(constraint_key, final_transform_key, "[ObConstraints -> Done]"); - // XXX add_relation(constraint_key, ob_ubereval_key, "Temp Ubereval"); add_relation(ob_ubereval_key, final_transform_key, "Temp Ubereval"); @@ -503,72 +506,23 @@ void DepsgraphRelationBuilder::build_object(Object *object) } add_relation(ob_ubereval_key, final_transform_key, "Temp Ubereval"); } - - /* AnimData */ + /* Animation data */ build_animdata(&object->id); - // XXX: This should be hooked up by the build_animdata code if (needs_animdata_node(&object->id)) { ComponentKey adt_key(&object->id, DEG_NODE_TYPE_ANIMATION); add_relation(adt_key, local_transform_key, "Object Animation"); } - - /* object data */ - if (object->data) { - ID *obdata_id = (ID *)object->data; - - /* object data animation */ - build_animdata(obdata_id); - - /* type-specific data... */ - switch (object->type) { - case OB_MESH: /* Geometry */ - case OB_CURVE: - case OB_FONT: - case OB_SURF: - case OB_MBALL: - case OB_LATTICE: - { - build_obdata_geom(object); - break; - } - - case OB_ARMATURE: /* Pose */ - if (ID_IS_LINKED(object) && object->proxy_from != NULL) { - build_proxy_rig(object); - } - else { - build_rig(object); - } - break; - - case OB_LAMP: /* Lamp */ - build_lamp(object); - break; - - case OB_CAMERA: /* Camera */ - build_camera(object); - break; - } - - Key *key = BKE_key_from_object(object); - if (key != NULL) { - ComponentKey geometry_key((ID *)object->data, DEG_NODE_TYPE_GEOMETRY); - ComponentKey key_key(&key->id, DEG_NODE_TYPE_GEOMETRY); - add_relation(key_key, geometry_key, "Shapekeys"); - } - } - + /* Object data. */ + build_object_data(object); /* Particle systems. */ if (object->particlesystem.first != NULL) { build_particles(object); } - /* Grease pencil. */ if (object->gpd != NULL) { build_gpencil(object->gpd); } - /* Object that this is a proxy for. */ if (object->proxy != NULL) { object->proxy->proxy_from = object; @@ -580,13 +534,55 @@ void DepsgraphRelationBuilder::build_object(Object *object) ComponentKey proxy_pose_key(&object->proxy->id, DEG_NODE_TYPE_EVAL_POSE); add_relation(ob_pose_key, proxy_pose_key, "Proxy"); } - /* Object dupligroup. */ if (object->dup_group != NULL) { build_group(object, object->dup_group); } } +void DepsgraphRelationBuilder::build_object_data(Object *object) +{ + if (object->data == NULL) { + return; + } + ID *obdata_id = (ID *)object->data; + /* Object data animation. */ + build_animdata(obdata_id); + /* type-specific data. */ + switch (object->type) { + case OB_MESH: + case OB_CURVE: + case OB_FONT: + case OB_SURF: + case OB_MBALL: + case OB_LATTICE: + { + build_obdata_geom(object); + break; + } + case OB_ARMATURE: + if (ID_IS_LINKED(object) && object->proxy_from != NULL) { + build_proxy_rig(object); + } + else { + build_rig(object); + } + break; + case OB_LAMP: + build_lamp(object); + break; + case OB_CAMERA: + build_camera(object); + break; + } + Key *key = BKE_key_from_object(object); + if (key != NULL) { + ComponentKey geometry_key((ID *)object->data, DEG_NODE_TYPE_GEOMETRY); + ComponentKey key_key(&key->id, DEG_NODE_TYPE_GEOMETRY); + add_relation(key_key, geometry_key, "Shapekeys"); + } +} + void DepsgraphRelationBuilder::build_object_parent(Object *object) { /* XXX: for now, need to use the component key (not just direct to the parent op), diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index 3be7472dbfc..2bb087a1359 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -187,6 +187,7 @@ struct DepsgraphRelationBuilder void build_scene(Scene *scene); void build_group(Object *object, Group *group); void build_object(Object *object); + void build_object_data(Object *object); void build_object_parent(Object *object); void build_constraints(ID *id, eDepsNode_Type component_type, |