BGE: Fix T33187 constraints replication for libloaded objects.

Reviewers: Moguri
This commit is contained in:
Porteries Tristan 2015-08-10 22:42:52 +02:00
parent c1506454ec
commit bccc6c393c
Notes: blender-bot 2023-02-14 13:03:10 +01:00
Referenced by issue #33187, LibLoad and physic (Game engine) Blender 2.64a
2 changed files with 29 additions and 4 deletions

View File

@ -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. */

View File

@ -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<KX_GameObject *> 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
*/