1 | /*
|
---|
2 | Copyright (C) 2005-2006 Feeling Software Inc.
|
---|
3 | MIT License: http://www.opensource.org/licenses/mit-license.php
|
---|
4 | */
|
---|
5 | /*
|
---|
6 | Based on the FS Import classes:
|
---|
7 | Copyright (C) 2005-2006 Feeling Software Inc
|
---|
8 | Copyright (C) 2005-2006 Autodesk Media Entertainment
|
---|
9 | MIT License: http://www.opensource.org/licenses/mit-license.php
|
---|
10 | */
|
---|
11 |
|
---|
12 | /**
|
---|
13 | @file FCDEffectStandard.h
|
---|
14 | This file contains the FCDEffectStandard class.
|
---|
15 | */
|
---|
16 |
|
---|
17 | #ifndef _FCD_MATERIAL_STANDARD_H_
|
---|
18 | #define _FCD_MATERIAL_STANDARD_H_
|
---|
19 |
|
---|
20 | #include "FUtils/FUDaeEnum.h"
|
---|
21 | #include "FCDocument/FCDEffectProfile.h"
|
---|
22 |
|
---|
23 | class FCDocument;
|
---|
24 | class FCDEffect;
|
---|
25 | class FCDEffectParameter;
|
---|
26 | class FCDTexture;
|
---|
27 | class FCDEffectParameterList;
|
---|
28 |
|
---|
29 | /** A dynamically-sized array of texture objects. */
|
---|
30 | typedef vector<FCDTexture*> FCDTextureList;
|
---|
31 |
|
---|
32 | /**
|
---|
33 | A COMMON profile effect description.
|
---|
34 |
|
---|
35 | The COMMON effect profile holds the information necessary
|
---|
36 | to render your polygon sets using the well-defined lighting models.
|
---|
37 |
|
---|
38 | COLLADA supports four lighting models: constant, Lambert, Phong and Blinn.
|
---|
39 |
|
---|
40 | @ingroup FCDEffect
|
---|
41 | */
|
---|
42 | class FCOLLADA_EXPORT FCDEffectStandard : public FCDEffectProfile
|
---|
43 | {
|
---|
44 | public:
|
---|
45 | /** The list of the lighting models supported by the COMMON profile of COLLADA. */
|
---|
46 | enum LightingType
|
---|
47 | {
|
---|
48 | /** The constant lighting model.
|
---|
49 | This lighting model uses the emissive color everywhere, without
|
---|
50 | any complex lighting calculations. It also uses the translucency
|
---|
51 | factor and the translucency color, by multiplying them together
|
---|
52 | and applying them to your standard alpha channel according to the
|
---|
53 | final lighting color.*/
|
---|
54 | CONSTANT,
|
---|
55 |
|
---|
56 | /** The Lambert lighting model.
|
---|
57 | This lighting model improves on the constant lighting model by
|
---|
58 | using the dot-product between the normalized light vectors and the
|
---|
59 | polygon normals to determine how much light should affect each polygon.
|
---|
60 | This value is multiplied to the diffuse color and (1 + the ambient color). */
|
---|
61 | LAMBERT,
|
---|
62 |
|
---|
63 | /** The Phong lighting model.
|
---|
64 | This lighting model improves on the Lambert lighting model by
|
---|
65 | calculating how much light is reflected by the polygons into the viewer's eye.
|
---|
66 | For this calculation, the shininess, the specular color and the reflectivity is used. */
|
---|
67 | PHONG,
|
---|
68 |
|
---|
69 | /** The Blinn lighting model.
|
---|
70 | This lighting model improves on the Lambert lighting model by
|
---|
71 | calculating how much light is reflected by the polygons into the viewer's eye.
|
---|
72 | For this calculation, the shininess, the specular color and the reflectivity is used. */
|
---|
73 | BLINN,
|
---|
74 |
|
---|
75 | /** Not a valid lighting model. */
|
---|
76 | UNKNOWN
|
---|
77 | };
|
---|
78 |
|
---|
79 | private:
|
---|
80 | DeclareObjectType;
|
---|
81 | LightingType type;
|
---|
82 | FCDTextureList* textureBuckets;
|
---|
83 |
|
---|
84 | // Common material parameter: Emission
|
---|
85 | FMVector3 emissionColor;
|
---|
86 | float emissionFactor; // Max-specific
|
---|
87 |
|
---|
88 | // Common material parameter: Translucency
|
---|
89 | FMVector3 translucencyColor;
|
---|
90 | float translucencyFactor;
|
---|
91 |
|
---|
92 | // Lambert material parameters
|
---|
93 | FMVector3 diffuseColor;
|
---|
94 | FMVector3 ambientColor;
|
---|
95 |
|
---|
96 | // Phong material parameters: Specular
|
---|
97 | FMVector3 specularColor;
|
---|
98 | float specularFactor; // Max-specific
|
---|
99 | float shininess;
|
---|
100 |
|
---|
101 | // Phong material parameter: Reflectivity
|
---|
102 | FMVector3 reflectivityColor; // Maya-specific
|
---|
103 | float reflectivityFactor; // Maya-specific
|
---|
104 |
|
---|
105 | // Geometry modifier
|
---|
106 | bool isFaceted; // Max-specific
|
---|
107 | bool isDoubleSided; // Max-specific for now
|
---|
108 | bool isWireframe; // Max-specific
|
---|
109 | bool isFaceMap; // Max-specific
|
---|
110 | bool isEmissionFactor; // Max-specific
|
---|
111 |
|
---|
112 | public:
|
---|
113 | /** Constructor: do not use directly. Instead, use the FCDEffect::AddProfile function
|
---|
114 | with the FUDaeProfileType::COMMON parameter.
|
---|
115 | @param document The COLLADA document that owns this effect profile.
|
---|
116 | @param parent The effect that contains this profile. */
|
---|
117 | FCDEffectStandard(FCDocument* document, FCDEffect* parent);
|
---|
118 |
|
---|
119 | /** Destructor: do not use directly.
|
---|
120 | Instead, use the FCDEffect::ReleaseProfile function. */
|
---|
121 | virtual ~FCDEffectStandard();
|
---|
122 |
|
---|
123 | /** Retrieves the lighting model to be used for this profile.
|
---|
124 | @return The lighting model. */
|
---|
125 | inline LightingType GetLightingType() const { return type; }
|
---|
126 |
|
---|
127 | /** Sets the lighting model to be used for this profile.
|
---|
128 | Note that which parameters are exported depends on the lighting model.
|
---|
129 | @param _type The lighting model. */
|
---|
130 | inline void SetLightingType(LightingType _type) { type = _type; }
|
---|
131 |
|
---|
132 | /** Retrieves the profile type for this effect.
|
---|
133 | This function is a part of the FCDEffectProfile interface and allows you
|
---|
134 | to up-cast an effect profile pointer safely to this class.
|
---|
135 | @return The profile type: COMMON. */
|
---|
136 | virtual FUDaeProfileType::Type GetType() const { return FUDaeProfileType::COMMON; }
|
---|
137 |
|
---|
138 | /** Retrieves the list of textures belonging to a specific channel.
|
---|
139 | @param bucket A texture channel index. This index should match one
|
---|
140 | of the values in the FUDaeTextureChannel enum.
|
---|
141 | @return The list of textures for this channel. */
|
---|
142 | const FCDTextureList& GetTextureBucket(uint32 bucket) const;
|
---|
143 |
|
---|
144 | /** Retrieves the number of textures belonging to a specific channel.
|
---|
145 | @param bucket A texture channel index. This index should match one
|
---|
146 | of the values in the FUDaeTextureChannel enum.
|
---|
147 | @return The number of textures in that channel. */
|
---|
148 | size_t GetTextureCount(uint32 bucket) const { FUAssert(bucket < FUDaeTextureChannel::COUNT, return 0); return textureBuckets[bucket].size(); }
|
---|
149 |
|
---|
150 | /** Retrieves a texture
|
---|
151 | @param bucket A texture channel index. This index should match one
|
---|
152 | of the values in the FUDaeTextureChannel enum.
|
---|
153 | @param index The index of a texture within this channel.
|
---|
154 | @return The texture. This pointer will be NULL if either the bucket or the index is out-of-bounds. */
|
---|
155 | inline FCDTexture* GetTexture(uint32 bucket, size_t index) { FUAssert(index < GetTextureCount(bucket), return NULL); return textureBuckets[bucket].at(index); }
|
---|
156 | inline const FCDTexture* GetTexture(uint32 bucket, size_t index) const { FUAssert(index < GetTextureCount(bucket), return NULL); return textureBuckets[bucket].at(index); } /**< See above. */
|
---|
157 |
|
---|
158 | /** Adds a texture to a specific channel.
|
---|
159 | @param bucket A texture channel index. This index should match one
|
---|
160 | of the values in the FUDaeTextureChannel enum.
|
---|
161 | @return The new texture. This pointer will be NULL if the bucket is out-of-bounds. */
|
---|
162 | FCDTexture* AddTexture(uint32 bucket);
|
---|
163 |
|
---|
164 | /** Releases a texture contained within this effect profile.
|
---|
165 | @param texture The texture to release. */
|
---|
166 | void ReleaseTexture(FCDTexture* texture);
|
---|
167 |
|
---|
168 | /** Retrieves the base translucency color.
|
---|
169 | This value must be multiplied with the translucency factor
|
---|
170 | to get the real translucency color.
|
---|
171 | This value is used in all lighting models.
|
---|
172 | @return The base translucency color. */
|
---|
173 | inline const FMVector3& GetTranslucencyColor() const { return translucencyColor; }
|
---|
174 |
|
---|
175 | /** Sets the base translucency color.
|
---|
176 | @param color The base translucency color. */
|
---|
177 | inline void SetTranslucencyColor(const FMVector3& color) { translucencyColor = color; }
|
---|
178 |
|
---|
179 | /** Retrieves the translucency factor.
|
---|
180 | This value must be multiplied with the translucency color
|
---|
181 | to get the real translucency color.
|
---|
182 | This value is used in all lighting models.
|
---|
183 | @return The translucency factor. */
|
---|
184 | inline const float& GetTranslucencyFactor() const { return translucencyFactor; }
|
---|
185 |
|
---|
186 | /** Sets the translucency factor.
|
---|
187 | @param factor The translucency factor. */
|
---|
188 | inline void SetTranslucencyFactor(float factor) { translucencyFactor = factor; }
|
---|
189 |
|
---|
190 | /** Retrieves the flat opacity.
|
---|
191 | This is a calculated value and will not take into consideration any animations
|
---|
192 | that affect either the base translucency color or the translucency factor.
|
---|
193 | This value can be used in all lighting models.
|
---|
194 | @return The flat opacity. */
|
---|
195 | float GetOpacity() const;
|
---|
196 |
|
---|
197 | /** Retrieves the base emission/self-illumination color.
|
---|
198 | This value must be multiplied with the emission factor to get the real emission color.
|
---|
199 | This value is used in all lighting models.
|
---|
200 | @return The base emission color. */
|
---|
201 | inline const FMVector3& GetEmissionColor() const { return emissionColor; }
|
---|
202 |
|
---|
203 | /** Sets the base emission/self-illumination color.
|
---|
204 | @param color The base emission color. */
|
---|
205 | inline void SetEmissionColor(const FMVector3& color) { emissionColor = color; }
|
---|
206 |
|
---|
207 | /** Retrieves the emission/self-illumination factor.
|
---|
208 | This value must be multiplied with the base emission color to get the real emission color.
|
---|
209 | @return The emission factor. */
|
---|
210 | inline const float& GetEmissionFactor() const { return emissionFactor; }
|
---|
211 |
|
---|
212 | /** Sets the emission/self-illumination factor.
|
---|
213 | @param factor The emission factor. */
|
---|
214 | inline void SetEmissionFactor(float factor) { emissionFactor = factor; }
|
---|
215 |
|
---|
216 | /** Retrieves whether the emission factor was used, rather than the emission color.
|
---|
217 | This value is used in conjunction with 3dsMax, in which the self-illumination color
|
---|
218 | and the self-illumination factor are mutually exclusive.
|
---|
219 | @return Whether the emission factor is to be used. */
|
---|
220 | inline bool IsEmissionFactor() const { return isEmissionFactor; }
|
---|
221 |
|
---|
222 | /** Sets whether the emission factor is to be used, rather than the emission color.
|
---|
223 | This value is used in conjunction with 3dsMax, in which the self-illumination color
|
---|
224 | and the self-illumination factor are mutually exclusive.
|
---|
225 | @param useFactor Whether the emission factor should be used. */
|
---|
226 | inline void SetIsEmissionFactor(bool useFactor) { isEmissionFactor = useFactor; }
|
---|
227 |
|
---|
228 | /** Retrieves the diffuse color.
|
---|
229 | This value is used in the Lambert lighting model.
|
---|
230 | @return The diffuse color. */
|
---|
231 | inline const FMVector3& GetDiffuseColor() const { return diffuseColor; }
|
---|
232 |
|
---|
233 | /** Sets the diffuse color.
|
---|
234 | @param color The diffuse color. */
|
---|
235 | inline void SetDiffuseColor(const FMVector3& color) { diffuseColor = color; }
|
---|
236 |
|
---|
237 | /** Retrieves the ambient color.
|
---|
238 | This value is used in the Lambert lighting model.
|
---|
239 | @return The ambient color. */
|
---|
240 | inline const FMVector3& GetAmbientColor() const { return ambientColor; }
|
---|
241 |
|
---|
242 | /** Sets the ambient color.
|
---|
243 | @param color The ambient color. */
|
---|
244 | inline void SetAmbientColor(const FMVector3& color) { ambientColor = color; }
|
---|
245 |
|
---|
246 | /** Retrieves the base specular color.
|
---|
247 | This value must be multiplied with the specular factor
|
---|
248 | to get the real specular color.
|
---|
249 | This value is used in the Phong and Blinn lighting models.
|
---|
250 | @return The specular color. */
|
---|
251 | inline const FMVector3& GetSpecularColor() const { return specularColor; }
|
---|
252 |
|
---|
253 | /** Sets the specular color.
|
---|
254 | @param color The specular color. */
|
---|
255 | inline void SetSpecularColor(const FMVector3& color) { specularColor = color; }
|
---|
256 |
|
---|
257 | /** Retrieves the specular factor.
|
---|
258 | This value must be multiplied with the base specular color
|
---|
259 | to get the real specular color.
|
---|
260 | This value is used in the Phong and Blinn lighting models.
|
---|
261 | @return The specular factor. */
|
---|
262 | inline const float& GetSpecularFactor() const { return specularFactor; }
|
---|
263 |
|
---|
264 | /** Sets the specular factor.
|
---|
265 | @param factor The specular factor. */
|
---|
266 | inline void SetSpecularFactor(float factor) { specularFactor = factor; }
|
---|
267 |
|
---|
268 | /** Retrieves the specular shininess.
|
---|
269 | This value represents the exponent to which you must raise
|
---|
270 | the dot-product between the view vector and reflected light vectors:
|
---|
271 | as such, it is usually a number greater than 1.
|
---|
272 | This value is used in the Phong and Blinn lighting models.
|
---|
273 | @return The specular shininess. */
|
---|
274 | inline const float& GetShininess() const { return shininess; }
|
---|
275 |
|
---|
276 | /** Sets the specular shininess.
|
---|
277 | This value represents the exponent to which you must raise
|
---|
278 | the dot-product between the view vector and reflected light vectors:
|
---|
279 | as such, it is usually a number greater than 1.
|
---|
280 | @param _shininess The specular shininess. */
|
---|
281 | inline void SetShininess(float _shininess) { shininess = _shininess; }
|
---|
282 |
|
---|
283 | /** Retrieves the base reflectivity color.
|
---|
284 | This value must be multiplied to the reflectivity factor to
|
---|
285 | get the real reflectivity color.
|
---|
286 | This value is used in the Phong and Blinn lighting models.
|
---|
287 | @return The base reflectivity color. */
|
---|
288 | inline const FMVector3& GetReflectivityColor() const { return reflectivityColor; }
|
---|
289 |
|
---|
290 | /** Sets the base reflectivity color.
|
---|
291 | @param color The base reflectivity color. */
|
---|
292 | inline void SetReflectivityColor(const FMVector3& color) { reflectivityColor = color; }
|
---|
293 |
|
---|
294 | /** Retrieves the reflectivity factor.
|
---|
295 | This value must be multiplied to the base reflectivity color
|
---|
296 | to get the real reflectivity color.
|
---|
297 | This value is used in the Phong and Blinn lighting models.
|
---|
298 | @return The reflectivity factor. */
|
---|
299 | inline const float& GetReflectivityFactor() const { return reflectivityFactor; }
|
---|
300 |
|
---|
301 | /** Sets the reflectivity factor.
|
---|
302 | @param factor The reflectivity factor. */
|
---|
303 | inline void SetReflectivityFactor(float factor) { reflectivityFactor = factor; }
|
---|
304 |
|
---|
305 | /** Retrieves the flat reflectivity.
|
---|
306 | This is a calculated value and will not take into consideration any animations
|
---|
307 | that affect either the base reflectivity color or the reflectivity factor.
|
---|
308 | This value can be used in the Phong and Blinn lighting models.
|
---|
309 | @return The flat reflectivity. */
|
---|
310 | float GetReflectivity() const;
|
---|
311 |
|
---|
312 | /** Retrieves the 'faceted' flag.
|
---|
313 | This flag is used in conjunction with 3dsMax. It represents whether all the edges
|
---|
314 | of the polygon sets using this effect profile should be hard. The final result
|
---|
315 | of using this flag is a mesh where all the faces stand out.
|
---|
316 | @return The status of the 'faceted' flag. */
|
---|
317 | inline bool GetFacetedFlag() const { return isFaceted; }
|
---|
318 |
|
---|
319 | /** Sets the 'faceted' flag.
|
---|
320 | This flag is used in conjunction with 3dsMax. It represents whether all the edges
|
---|
321 | of the polygon sets using this effect profile should be hard. The final result
|
---|
322 | of using this flag is a mesh where all the faces stand out.
|
---|
323 | @param flag The status of the 'faceted' flag. */
|
---|
324 | inline void SetFacetedFlag(bool flag) { isFaceted = flag; }
|
---|
325 |
|
---|
326 | /** Retrieves the 'double-sided' flag.
|
---|
327 | This flag is used in conjunction with 3dsMax. It represents whether all the faces
|
---|
328 | of the polygon sets should be treated as two-sided and have normals in both directions.
|
---|
329 | @return The status of the 'double-sided' flag. */
|
---|
330 | inline bool GetDoubleSidedFlag() const { return isDoubleSided; }
|
---|
331 |
|
---|
332 | /** Sets the 'double-sided' flag.
|
---|
333 | This flag is used in conjunction with 3dsMax. It represents whether all the faces
|
---|
334 | of the polygon sets should be treated as two-sided and have normals in both directions.
|
---|
335 | @param flag The status of the 'double-sided' flag. */
|
---|
336 | inline bool SetDoubleSidedFlag(bool flag) { isDoubleSided = flag; }
|
---|
337 |
|
---|
338 | /** Retrieves the 'wireframe' flag.
|
---|
339 | This flag is used in conjunction with 3dsMax. It represents whether all the edges
|
---|
340 | of the polygon sets should be rendered, rather than the faces.
|
---|
341 | @return The status of the 'wireframe' flag. */
|
---|
342 | inline bool GetWireframeFlag() const { return isWireframe; }
|
---|
343 |
|
---|
344 | /** Sets the 'wireframe' flag.
|
---|
345 | This flag is used in conjunction with 3dsMax. It represents whether all the edges
|
---|
346 | of the polygon sets should be rendered, rather than the faces.
|
---|
347 | @param flag The status of the 'wireframe' flag. */
|
---|
348 | inline bool SetWireframeFlag(bool flag) { isWireframe = flag; }
|
---|
349 |
|
---|
350 | /** Retrieves the 'face-map' flag.
|
---|
351 | This is a pure 3dsMax flag and I have no idea what it does.
|
---|
352 | @return The status of the 'face-map' flag. */
|
---|
353 | inline bool GetFaceMapFlag() const { return isFaceMap; }
|
---|
354 |
|
---|
355 | /** Sets the 'face-map' flag.
|
---|
356 | This is a pure 3dsMax flag and I have no idea what it does.
|
---|
357 | @param flag The status of the 'face-map' flag. */
|
---|
358 | inline void SetFaceMapFlag(bool flag) { isFaceMap = flag; }
|
---|
359 |
|
---|
360 | /** Retrieves an effect parameter.
|
---|
361 | Looks for the effect parameter with the correct semantic, in order to bind or override its value.
|
---|
362 | This function searches through the effect profile and the level of abstractions below.
|
---|
363 | @param semantic The effect parameter semantic to match.
|
---|
364 | @return The effect parameter that matches the semantic. This pointer may be
|
---|
365 | NULL if no effect parameter matches the given semantic. */
|
---|
366 | virtual FCDEffectParameter* FindParameterBySemantic(const string& semantic);
|
---|
367 |
|
---|
368 | /** Retrieves a subset of the effect parameter list.
|
---|
369 | Look for effect parameters with the correct semantic.
|
---|
370 | This function searches through the effect profile and the level of abstractions below.
|
---|
371 | @param semantic The effect parameter semantic to match.
|
---|
372 | @param parameters The list of parameters to fill in. This list is not cleared. */
|
---|
373 | virtual void FindParametersBySemantic(const string& semantic, FCDEffectParameterList& parameters);
|
---|
374 |
|
---|
375 | /** Retrieves a subset of the effect parameter list.
|
---|
376 | Look for effect parameters with the correct reference.
|
---|
377 | This function searches through the effect profile and the level of abstractions below.
|
---|
378 | @param reference The effect parameter reference to match. In the case of effect
|
---|
379 | parameter, the reference is replaced by the sub-id.
|
---|
380 | @param parameters The list of parameters to fill in. This list is not cleared. */
|
---|
381 | virtual void FindParametersByReference(const string& reference, FCDEffectParameterList& parameters);
|
---|
382 |
|
---|
383 | /** [INTERNAL] Clones the COMMON profile effect.
|
---|
384 | You will need release the cloned effect directly, by deleting the pointer.
|
---|
385 | @param newParent The effect that contains the cloned effect profile.
|
---|
386 | @return The cloned effect profile. You will must delete this pointer. */
|
---|
387 | virtual FCDEffectProfile* Clone(FCDEffect* newParent);
|
---|
388 |
|
---|
389 | /** [INTERNAL] Flattens the profile.
|
---|
390 | Does nothing on the common profile. */
|
---|
391 | virtual void Flatten() {}
|
---|
392 |
|
---|
393 | /** [INTERNAL] Reads in the \<profile_COMMON\> element from a given COLLADA XML tree node.
|
---|
394 | For COLLADA 1.3 backward-compatibility, this function can also read in \<material\> elements.
|
---|
395 | @param baseNode The COLLADA XML tree node.
|
---|
396 | @return The status of the import. If the status is not successful,
|
---|
397 | it may be dangerous to extract information from the effect profile.*/
|
---|
398 | virtual FUStatus LoadFromXML(xmlNode* baseNode);
|
---|
399 |
|
---|
400 | /** [INTERNAL] Writes out the \<profile_COMMON\> element to the given COLLADA XML tree node.
|
---|
401 | @param parentNode The COLLADA XML parent node in which to insert the effect profile.
|
---|
402 | @return The created element XML tree node. */
|
---|
403 | virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
|
---|
404 |
|
---|
405 | private:
|
---|
406 | xmlNode* WriteColorTextureParameterToXML(xmlNode* parentNode, const char* parameterNodeName, const FMVector3& value, const FCDTextureList& textureBucket) const;
|
---|
407 | xmlNode* WriteFloatTextureParameterToXML(xmlNode* parentNode, const char* parameterNodeName, const float& value, const FCDTextureList& textureBucket) const;
|
---|
408 | xmlNode* WriteTextureParameterToXML(xmlNode* parentNode, const FCDTextureList& textureBucket) const;
|
---|
409 |
|
---|
410 | FUStatus ParseColorTextureParameter(xmlNode* parameterNode, FMVector3& value, FCDTextureList& textureBucket);
|
---|
411 | FUStatus ParseFloatTextureParameter(xmlNode* parameterNode, float& value, FCDTextureList& textureBucket);
|
---|
412 | FUStatus ParseSimpleTextureParameter(xmlNode* parameterNode, FCDTextureList& textureBucket);
|
---|
413 | };
|
---|
414 |
|
---|
415 | #endif //_FCD_MATERIAL_STANDARD_H_
|
---|
416 |
|
---|