Depsgraph: Cleanup, split build_object() a bit
This commit is contained in:
parent
f3fa5c1258
commit
f2842ac65e
Notes:
blender-bot
2023-02-14 09:38:57 +01:00
Referenced by issue #53381, Inaccurate results when saving MaterialIDs to OpenEXR and loading them back into Blender
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue