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