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 Based on the FS Import classes:
10 Copyright (C) 2005-2006 Feeling Software Inc
11 Copyright (C) 2005-2006 Autodesk Media Entertainment
12 MIT License: http://www.opensource.org/licenses/mit-license.php
13 */
14
15 #include "StdAfx.h"
16 #include "FCDocument/FCDocument.h"
17 #include "FCDocument/FCDEffectParameter.h"
18 #include "FCDocument/FCDEffectParameterFactory.h"
19 #include "FCDocument/FCDExtra.h"
20 #include "FCDocument/FCDGeometry.h"
21 #include "FCDocument/FCDGeometryMesh.h"
22 #include "FCDocument/FCDGeometryPolygons.h"
23 #include "FCDocument/FCDController.h"
24 #include "FCDocument/FCDGeometryMesh.h"
25 #include "FCDocument/FCDGeometryPolygons.h"
26 #include "FCDocument/FCDMaterial.h"
27 #include "FCDocument/FCDMaterialInstance.h"
28
29 //
30 // FCDMaterialInstanceBind
31 //
32
33 ImplementObjectType(FCDMaterialInstanceBind);
34
FCDMaterialInstanceBind()35 FCDMaterialInstanceBind::FCDMaterialInstanceBind()
36 : FUParameterizable()
37 , InitializeParameterNoArg(semantic)
38 , InitializeParameterNoArg(target)
39 {
40 }
41
~FCDMaterialInstanceBind()42 FCDMaterialInstanceBind::~FCDMaterialInstanceBind()
43 {
44 }
45
46 //
47 // FCDMaterialInstanceBindVertexInput
48 //
49
50 ImplementObjectType(FCDMaterialInstanceBindVertexInput);
51
FCDMaterialInstanceBindVertexInput()52 FCDMaterialInstanceBindVertexInput::FCDMaterialInstanceBindVertexInput()
53 : FUParameterizable()
54 , InitializeParameterNoArg(semantic)
55 , InitializeParameter(inputSemantic, FUDaeGeometryInput::TEXCOORD)
56 , InitializeParameter(inputSet, 0)
57 {
58 }
59
~FCDMaterialInstanceBindVertexInput()60 FCDMaterialInstanceBindVertexInput::~FCDMaterialInstanceBindVertexInput()
61 {
62 }
63
64 //
65 // FCDMaterialInstance
66 //
67
68 ImplementObjectType(FCDMaterialInstance);
ImplementParameterObjectNoArg(FCDMaterialInstance,FCDMaterialInstanceBind,bindings)69 ImplementParameterObjectNoArg(FCDMaterialInstance, FCDMaterialInstanceBind, bindings)
70 ImplementParameterObjectNoArg(FCDMaterialInstance, FCDMaterialInstanceBindVertexInput, vertexBindings)
71 ImplementParameterObjectNoArg(FCDMaterialInstance, FCDMaterialInstanceBindTextureSurface, texSurfBindings)
72
73 FCDMaterialInstance::FCDMaterialInstance(FCDocument* document, FCDEntityInstance* _parent)
74 : FCDEntityInstance(document, _parent->GetParent(), FCDEntity::MATERIAL), parent(_parent)
75 , InitializeParameterNoArg(semantic)
76 , InitializeParameterNoArg(bindings)
77 , InitializeParameterNoArg(vertexBindings)
78 {
79 }
80
~FCDMaterialInstance()81 FCDMaterialInstance::~FCDMaterialInstance()
82 {
83 parent = NULL;
84 }
85
GetGeometryTarget()86 FCDObject* FCDMaterialInstance::GetGeometryTarget()
87 {
88 if (parent != NULL && parent->GetEntity() != NULL)
89 {
90 FCDEntity* e = parent->GetEntity();
91 if (e->HasType(FCDController::GetClassType()))
92 {
93 e = ((FCDController*) e)->GetBaseGeometry();
94 }
95 if (e->HasType(FCDGeometry::GetClassType()))
96 {
97 FCDGeometry* geometry = (FCDGeometry*) e;
98 if (geometry->IsMesh())
99 {
100 FCDGeometryMesh* mesh = geometry->GetMesh();
101 size_t polygonsCount = mesh->GetPolygonsCount();
102 for (size_t i = 0; i < polygonsCount; ++i)
103 {
104 FCDGeometryPolygons* polygons = mesh->GetPolygons(i);
105 if (IsEquivalent(polygons->GetMaterialSemantic(), semantic))
106 {
107 return polygons;
108 }
109 }
110 }
111 }
112 }
113 return NULL;
114 }
115
116
FindBinding(const char * semantic)117 const FCDMaterialInstanceBind* FCDMaterialInstance::FindBinding(const char* semantic)
118 {
119 for (const FCDMaterialInstanceBind** it = (const FCDMaterialInstanceBind**) bindings.begin(); it != bindings.end(); ++it)
120 {
121 if (IsEquivalent((*it)->semantic, semantic)) return (*it);
122 }
123 return NULL;
124 }
125
AddVertexInputBinding()126 FCDMaterialInstanceBindVertexInput* FCDMaterialInstance::AddVertexInputBinding()
127 {
128 FCDMaterialInstanceBindVertexInput* out = new FCDMaterialInstanceBindVertexInput();
129 vertexBindings.push_back(out);
130 SetNewChildFlag();
131 return vertexBindings.back();
132 }
133
AddVertexInputBinding(const char * semantic,FUDaeGeometryInput::Semantic inputSemantic,int32 inputSet)134 FCDMaterialInstanceBindVertexInput* FCDMaterialInstance::AddVertexInputBinding(const char* semantic, FUDaeGeometryInput::Semantic inputSemantic, int32 inputSet)
135 {
136 FCDMaterialInstanceBindVertexInput* vbinding = AddVertexInputBinding();
137 vbinding->semantic = semantic;
138 vbinding->inputSemantic = inputSemantic;
139 vbinding->inputSet = inputSet;
140 return vbinding;
141 }
142
FindVertexInputBinding(const char * semantic) const143 const FCDMaterialInstanceBindVertexInput* FCDMaterialInstance::FindVertexInputBinding(const char* semantic) const
144 {
145 for (const FCDMaterialInstanceBindVertexInput** it = vertexBindings.begin(); it != vertexBindings.end(); ++it)
146 {
147 if (IsEquivalent((*it)->semantic, semantic)) return (*it);
148 }
149 return NULL;
150 }
151
AddBinding()152 FCDMaterialInstanceBind* FCDMaterialInstance::AddBinding()
153 {
154 FCDMaterialInstanceBind* out = new FCDMaterialInstanceBind();
155 bindings.push_back(out);
156 SetNewChildFlag();
157 return bindings.back();
158 }
159
AddBinding(const char * semantic,const char * target)160 FCDMaterialInstanceBind* FCDMaterialInstance::AddBinding(const char* semantic, const char* target)
161 {
162 FCDMaterialInstanceBind* binding = AddBinding();
163 binding->semantic = semantic;
164 binding->target = target;
165 return binding;
166 }
167
RemoveBinding(size_t index)168 void FCDMaterialInstance::RemoveBinding(size_t index)
169 {
170 FUAssert(index < bindings.size(), return);
171 bindings.erase(index);
172 }
173
Clone(FCDEntityInstance * _clone) const174 FCDEntityInstance* FCDMaterialInstance::Clone(FCDEntityInstance* _clone) const
175 {
176 FCDMaterialInstance* clone = NULL;
177 if (_clone == NULL) clone = new FCDMaterialInstance(const_cast<FCDocument*>(GetDocument()), NULL);
178 else if (!_clone->HasType(FCDMaterialInstance::GetClassType())) return Parent::Clone(_clone);
179 else clone = (FCDMaterialInstance*) _clone;
180
181 Parent::Clone(clone);
182
183 // Clone the bindings and the semantic information.
184 clone->semantic = semantic;
185 size_t bindingCount = bindings.size();
186 for (size_t b = 0; b < bindingCount; ++b)
187 {
188 const FCDMaterialInstanceBind* bind = bindings[b];
189 clone->AddBinding(*bind->semantic, *bind->target);
190 }
191 bindingCount = vertexBindings.size();
192 for (size_t b = 0; b < bindingCount; ++b)
193 {
194 const FCDMaterialInstanceBindVertexInput* bind = vertexBindings[b];
195 clone->AddVertexInputBinding(*bind->semantic, (FUDaeGeometryInput::Semantic) *bind->inputSemantic, *bind->inputSet);
196 }
197 return clone;
198 }
199