Fix (unreported) Broken rigidbody requirements when adding objects to a RB collection.
We have to ensure objects get expected RB data, when they are added to a RB collection...
This commit is contained in:
parent
4e0291f185
commit
80ad2f8cf6
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue