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
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-01-28 18:38:12 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-01-28 18:39:55 +0300
commit55e171be3349b22ada9b84d36067d0a6f00db7f7 (patch)
tree101e6bb837e05342ce11b8396f3c8c51ec22f197
parenta8c0a57fc3eb0f8c3aeeb2de083a0e06b06cef7e (diff)
Fix T60566: Warnings in rigid body and certain conrfiguration
Was visible when constraint object is not directly visible via view layers, need to indirectly pull it into the graph.
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc49
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc23
2 files changed, 39 insertions, 33 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 29a31ef4f98..d44e41168a0 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -1061,37 +1061,28 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene)
/* Create nodes --------------------------------------------------------- */
/* XXX: is this the right component, or do we want to use another one
- * instead?
- */
-
- /* init/rebuild operation */
- /*OperationDepsNode *init_node =*/ add_operation_node(
- &scene->id, DEG_NODE_TYPE_TRANSFORM,
- function_bind(BKE_rigidbody_rebuild_sim, _1, scene_cow),
- DEG_OPCODE_RIGIDBODY_REBUILD);
+ * instead? */
- /* do-sim operation */
- // XXX: what happens if we need to split into several groups?
+ /* Init/rebuild operation. */
+ add_operation_node(&scene->id, DEG_NODE_TYPE_TRANSFORM,
+ function_bind(BKE_rigidbody_rebuild_sim, _1, scene_cow),
+ DEG_OPCODE_RIGIDBODY_REBUILD);
+ /* Do-sim operation. */
OperationDepsNode *sim_node = add_operation_node(
&scene->id, DEG_NODE_TYPE_TRANSFORM,
function_bind(BKE_rigidbody_eval_simulation, _1, scene_cow),
DEG_OPCODE_RIGIDBODY_SIM);
-
- /* XXX: For now, the sim node is the only one that really matters here.
- * If any other sims get added later, we may have to remove these hacks...
- */
+ sim_node->set_as_entry();
+ sim_node->set_as_exit();
sim_node->owner->entry_operation = sim_node;
- sim_node->owner->exit_operation = sim_node;
-
- /* objects - simulation participants */
- if (rbw->group) {
+ /* Objects - simulation participants. */
+ if (rbw->group != NULL) {
build_collection(NULL, rbw->group);
-
FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(rbw->group, object)
{
- if (object->type != OB_MESH)
+ if (object->type != OB_MESH) {
continue;
-
+ }
/* 2) create operation for flushing results */
/* object's transform component - where the rigidbody operation
* lives. */
@@ -1105,6 +1096,22 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene)
}
FOREACH_COLLECTION_OBJECT_RECURSIVE_END;
}
+ /* Constraints. */
+ if (rbw->constraints != NULL) {
+ FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(rbw->constraints, object)
+ {
+ RigidBodyCon *rbc = object->rigidbody_constraint;
+ if (rbc == NULL || rbc->ob1 == NULL || rbc->ob2 == NULL) {
+ /* When either ob1 or ob2 is NULL, the constraint doesn't work. */
+ continue;
+ }
+ /* Make sure indirectly linked objects are fully built. */
+ build_object(-1, object, DEG_ID_LINKED_INDIRECTLY, false);
+ build_object(-1, rbc->ob1, DEG_ID_LINKED_INDIRECTLY, false);
+ build_object(-1, rbc->ob2, DEG_ID_LINKED_INDIRECTLY, false);
+ }
+ FOREACH_COLLECTION_OBJECT_RECURSIVE_END;
+ }
}
void DepsgraphNodeBuilder::build_particle_systems(Object *object,
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 27d8a414b37..42229a43428 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -1622,7 +1622,7 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene)
add_relation(time_src_key, init_key, "TimeSrc -> Rigidbody Reset/Rebuild (Optional)");
/* objects - simulation participants */
- if (rbw->group) {
+ if (rbw->group != NULL) {
build_collection(NULL, NULL, rbw->group);
FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(rbw->group, object)
@@ -1684,9 +1684,8 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene)
}
FOREACH_COLLECTION_OBJECT_RECURSIVE_END;
}
-
- /* constraints */
- if (rbw->constraints) {
+ /* Constraints. */
+ if (rbw->constraints != NULL) {
FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(rbw->constraints, object)
{
RigidBodyCon *rbc = object->rigidbody_constraint;
@@ -1694,19 +1693,19 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene)
/* When either ob1 or ob2 is NULL, the constraint doesn't work. */
continue;
}
-
- /* final result of the constraint object's transform controls how the
- * constraint affects the physics sim for these objects
- */
+ /* Make sure indirectly linked objects are fully built. */
+ build_object(NULL, object);
+ build_object(NULL, rbc->ob1);
+ build_object(NULL, rbc->ob2);
+ /* final result of the constraint object's transform controls how
+ * the constraint affects the physics sim for these objects. */
ComponentKey trans_key(&object->id, DEG_NODE_TYPE_TRANSFORM);
OperationKey ob1_key(&rbc->ob1->id, DEG_NODE_TYPE_TRANSFORM, DEG_OPCODE_RIGIDBODY_TRANSFORM_COPY);
OperationKey ob2_key(&rbc->ob2->id, DEG_NODE_TYPE_TRANSFORM, DEG_OPCODE_RIGIDBODY_TRANSFORM_COPY);
-
- /* - constrained-objects sync depends on the constraint-holder */
+ /* Constrained-objects sync depends on the constraint-holder. */
add_relation(trans_key, ob1_key, "RigidBodyConstraint -> RBC.Object_1");
add_relation(trans_key, ob2_key, "RigidBodyConstraint -> RBC.Object_2");
-
- /* - ensure that sim depends on this constraint's transform */
+ /* Ensure that sim depends on this constraint's transform. */
add_relation(trans_key, sim_key, "RigidBodyConstraint Transform -> RB Simulation");
}
FOREACH_COLLECTION_OBJECT_RECURSIVE_END;