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