1 /*
2 Copyright (C) 2005-2007 Feeling Software Inc.
3 Portions of the code are:
4 Copyright (C) 2005-2007 Sony Computer Entertainment America
5
6 MIT License: http://www.opensource.org/licenses/mit-license.php
7 */
8
9 #include "StdAfx.h"
10 #include "FCDocument/FCDocument.h"
11 #include "FCDocument/FCDController.h"
12 #include "FCDocument/FCDEntity.h"
13 #include "FCDocument/FCDForceField.h"
14 #include "FCDocument/FCDPhysicsForceFieldInstance.h"
15 #include "FCDocument/FCDLibrary.h"
16 #include "FCDocument/FCDPhysicsModel.h"
17 #include "FCDocument/FCDPhysicsModelInstance.h"
18 #include "FCDocument/FCDPhysicsRigidBodyInstance.h"
19 #include "FCDocument/FCDPhysicsRigidConstraintInstance.h"
20 #include "FUtils/FUUniqueStringMap.h"
21 #include "FUtils/FUUri.h"
22
23 //
24 // FCDPhysicsModelInstance
25 //
26
27 ImplementObjectType(FCDPhysicsModelInstance);
28 ImplementParameterObjectNoCtr(FCDPhysicsModelInstance, FCDEntityInstance, instances);
29
FCDPhysicsModelInstance(FCDocument * document)30 FCDPhysicsModelInstance::FCDPhysicsModelInstance(FCDocument* document)
31 : FCDEntityInstance(document, NULL, FCDEntity::PHYSICS_MODEL)
32 , InitializeParameterNoArg(instances)
33 {
34 }
35
~FCDPhysicsModelInstance()36 FCDPhysicsModelInstance::~FCDPhysicsModelInstance()
37 {
38 }
39
AddRigidBodyInstance(FCDPhysicsRigidBody * rigidBody)40 FCDPhysicsRigidBodyInstance* FCDPhysicsModelInstance::AddRigidBodyInstance(FCDPhysicsRigidBody* rigidBody)
41 {
42 FCDPhysicsRigidBodyInstance* instance = new FCDPhysicsRigidBodyInstance(GetDocument(), this, rigidBody);
43 instances.push_back(instance);
44 SetNewChildFlag();
45 return instance;
46 }
47
AddRigidConstraintInstance(FCDPhysicsRigidConstraint * rigidConstraint)48 FCDPhysicsRigidConstraintInstance* FCDPhysicsModelInstance::AddRigidConstraintInstance(FCDPhysicsRigidConstraint* rigidConstraint)
49 {
50 FCDPhysicsRigidConstraintInstance* instance = new FCDPhysicsRigidConstraintInstance(GetDocument(), this, rigidConstraint);
51 instances.push_back(instance);
52 SetNewChildFlag();
53 return instance;
54 }
55
AddForceFieldInstance(FCDForceField * forceField)56 FCDPhysicsForceFieldInstance* FCDPhysicsModelInstance::AddForceFieldInstance(FCDForceField* forceField)
57 {
58 FCDEntityInstance* instance = FCDEntityInstanceFactory::CreateInstance(GetDocument(), (FCDSceneNode*) NULL, forceField);
59 instances.push_back(instance);
60 SetNewChildFlag();
61 return (FCDPhysicsForceFieldInstance*)instance;
62 }
63
RemoveInstance(FCDEntityInstance * instance)64 bool FCDPhysicsModelInstance::RemoveInstance(FCDEntityInstance* instance)
65 {
66 SAFE_RELEASE(instance);
67 return true;
68 }
69
Clone(FCDEntityInstance * _clone) const70 FCDEntityInstance* FCDPhysicsModelInstance::Clone(FCDEntityInstance* _clone) const
71 {
72 FCDPhysicsModelInstance* clone = NULL;
73 if (_clone == NULL) _clone = clone = new FCDPhysicsModelInstance(const_cast<FCDocument*>(GetDocument()));
74 else if (_clone->HasType(FCDPhysicsModelInstance::GetClassType())) clone = (FCDPhysicsModelInstance*) _clone;
75
76 Parent::Clone(_clone);
77
78 if (clone != NULL)
79 {
80 for (const FCDEntityInstance** it = instances.begin(); it != instances.end(); ++it)
81 {
82 FCDEntityInstance* clonedInstance = NULL;
83 switch ((*it)->GetEntityType())
84 {
85 case FCDEntity::PHYSICS_RIGID_BODY: clonedInstance = clone->AddRigidBodyInstance(); break;
86 case FCDEntity::PHYSICS_RIGID_CONSTRAINT: clonedInstance = clone->AddRigidConstraintInstance(); break;
87 case FCDEntity::FORCE_FIELD: clonedInstance = clone->AddForceFieldInstance(); break;
88 default: FUFail(break);
89 }
90 if (clonedInstance != NULL) (*it)->Clone(clonedInstance);
91 }
92 }
93 return _clone;
94 }
95
CleanSubId(FUSUniqueStringMap * parentStringMap)96 void FCDPhysicsModelInstance::CleanSubId(FUSUniqueStringMap* parentStringMap)
97 {
98 Parent::CleanSubId(parentStringMap);
99 FUSUniqueStringMap myStringMap;
100
101 size_t subInstanceCount = instances.size();
102 for (size_t i = 0; i < subInstanceCount; ++i)
103 {
104 instances[i]->CleanSubId(&myStringMap);
105 }
106 }
107