diff options
-rw-r--r-- | source/blender/blenkernel/BKE_rigidbody.h | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/collection.c | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/rigidbody.c | 18 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_280.c | 2 |
4 files changed, 30 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h index 4d652326a14..9a5f3c31264 100644 --- a/source/blender/blenkernel/BKE_rigidbody.h +++ b/source/blender/blenkernel/BKE_rigidbody.h @@ -37,9 +37,11 @@ struct RigidBodyWorld; struct RigidBodyOb; +struct Collection; struct Depsgraph; -struct Scene; +struct Main; struct Object; +struct Scene; /* -------------- */ /* Memory Management */ @@ -70,6 +72,9 @@ struct RigidBodyCon *BKE_rigidbody_create_constraint(struct Scene *scene, struct void BKE_rigidbody_objects_collection_validate(struct Scene *scene, struct RigidBodyWorld *rbw); void BKE_rigidbody_constraints_collection_validate(struct Scene *scene, struct RigidBodyWorld *rbw); +/* Ensure object added to collection gets RB data if that collection is a RB one. */ +void BKE_rigidbody_main_collection_object_add(struct Main *bmain, struct Collection *collection, struct Object *object); + /* copy */ struct RigidBodyWorld *BKE_rigidbody_world_copy(struct RigidBodyWorld *rbw, const int flag); void BKE_rigidbody_world_groups_relink(struct RigidBodyWorld *rbw); diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index 9b68c61e016..33287d5a2f8 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -42,6 +42,7 @@ #include "BKE_library.h" #include "BKE_main.h" #include "BKE_object.h" +#include "BKE_rigidbody.h" #include "BKE_scene.h" #include "DNA_ID.h" @@ -515,6 +516,10 @@ static bool collection_object_add(Main *bmain, Collection *collection, Object *o DEG_id_tag_update_ex(bmain, &collection->id, ID_RECALC_COPY_ON_WRITE); } + if ((flag & LIB_ID_CREATE_NO_MAIN) == 0) { + BKE_rigidbody_main_collection_object_add(bmain, collection, ob); + } + return true; } diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index aa5051e25cd..7d4bd74389e 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -61,6 +61,7 @@ #include "BKE_layer.h" #include "BKE_library.h" #include "BKE_library_query.h" +#include "BKE_main.h" #include "BKE_mesh.h" #include "BKE_mesh_runtime.h" #include "BKE_object.h" @@ -1173,6 +1174,23 @@ void BKE_rigidbody_constraints_collection_validate(Scene *scene, RigidBodyWorld } } +void BKE_rigidbody_main_collection_object_add(Main *bmain, Collection *collection, Object *object) +{ + for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) { + RigidBodyWorld *rbw = scene->rigidbody_world; + + if (rbw == NULL) { + continue; + } + + if (rbw->group == collection && object->type == OB_MESH && object->rigidbody_object == NULL) { + object->rigidbody_object = BKE_rigidbody_create_object(scene, object, RBO_TYPE_ACTIVE); + } + if (rbw->constraints == collection && object->rigidbody_constraint == NULL) { + object->rigidbody_constraint = BKE_rigidbody_create_constraint(scene, object, RBC_TYPE_FIXED); + } + } +} /* ************************************** */ /* Utilities API */ diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index 237e1387a4e..e2ac0f16e34 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -918,7 +918,7 @@ void do_versions_after_linking_280(Main *bmain) BKE_paint_toolslots_init_from_main(bmain); } - if (!MAIN_VERSION_ATLEAST(bmain, 280, 36)) { + if (!MAIN_VERSION_ATLEAST(bmain, 280, 38)) { /* Ensure we get valid rigidbody object/constraint data in relevant collections' objects. */ for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) { RigidBodyWorld *rbw = scene->rigidbody_world; |