From bccc6c393c70cc6466f044917348fb50d43ef021 Mon Sep 17 00:00:00 2001 From: Porteries Tristan Date: Mon, 10 Aug 2015 22:42:52 +0200 Subject: BGE: Fix T33187 constraints replication for libloaded objects. Reviewers: Moguri --- .../Converter/BL_BlenderDataConversion.cpp | 8 ++++++- source/gameengine/Ketsji/KX_Scene.cpp | 25 +++++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 2de3ea0a87c..3d94b029d8b 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -2318,7 +2318,13 @@ void BL_ConvertBlenderObjects(struct Main* maggie, /* Store constraints of grouped and instanced objects for all layers */ gameobj->AddConstraint(dat); - + + /** if it's during libload we only add constraints in the object but + * doesn't create it. Constraint will be replicated later in scene->MergeScene + */ + if (libloading) + continue; + /* Skipped already converted constraints. * This will happen when a group instance is made from a linked group instance * and both are on the active layer. */ diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 83126e88ce5..37ef44dafe2 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -2064,6 +2064,28 @@ bool KX_Scene::MergeScene(KX_Scene *other) MergeScene_GameObject(gameobj, this, other); } + if (env) { + env->MergeEnvironment(env_other); + CListValue *otherObjects = other->GetObjectList(); + + // List of all physics objects to merge (needed by ReplicateConstraints). + std::vector physicsObjects; + for (unsigned int i = 0; i < otherObjects->GetCount(); ++i) { + KX_GameObject *gameobj = (KX_GameObject *)otherObjects->GetValue(i); + if (gameobj->GetPhysicsController()) { + physicsObjects.push_back(gameobj); + } + } + + for (unsigned int i = 0; i < physicsObjects.size(); ++i) { + KX_GameObject *gameobj = physicsObjects[i]; + // Replicate all constraints in the right physics environment. + gameobj->GetPhysicsController()->ReplicateConstraints(gameobj, physicsObjects); + gameobj->ClearConstraints(); + } + } + + GetTempObjectList()->MergeList(other->GetTempObjectList()); other->GetTempObjectList()->ReleaseAndRemoveAll(); @@ -2079,9 +2101,6 @@ bool KX_Scene::MergeScene(KX_Scene *other) GetLightList()->MergeList(other->GetLightList()); other->GetLightList()->ReleaseAndRemoveAll(); - if (env) - env->MergeEnvironment(env_other); - /* move materials across, assume they both use the same scene-converters * Do this after lights are merged so materials can use the lights in shaders */ -- cgit v1.2.3