source: NonGTP/FCollada/FCDocument/FCDMaterial.h @ 964

Revision 964, 6.5 KB checked in by igarcia, 19 years ago (diff)
Line 
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 FCDMaterial.h
14        This file contains the FCDMaterail class and the FCDMaterialTechniqueHint structure.
15*/
16
17#ifndef _FCD_MATERIAL_H_
18#define _FCD_MATERIAL_H_
19
20#include "FCDocument/FCDEntity.h"
21
22class FCDocument;
23class FCDEffect;
24class FCDEffectParameter;
25class FCDEffectParameterList;
26
27/**
28        A technique usage hint for a material.
29        This structure contains two strings to help applications
30        choose a technique within the material's instantiated effect
31        according to their application platform.
32*/
33class FCOLLADA_EXPORT FCDMaterialTechniqueHint
34{
35public:
36        fstring platform; /**< A platform semantic. COLLADA defines no platform semantics. */
37        string technique; /**< The sid for the technique to choose for the platform. */
38};
39
40/** A dynamically-sized list of material platform-technique hints. */
41typedef vector<FCDMaterialTechniqueHint> FCDMaterialTechniqueHintList;
42
43/**
44        A COLLADA material.
45
46        A COLLADA material is one of many abstraction level that defines how
47        to render mesh polygon sets. It instantiates an effect and may
48        overrides some of the effect parameters with its own values.
49
50        Unless you care about the construction history or memory, you should probably
51        use the FCDMaterialInstance::FlattenMaterial function.
52
53        @ingroup FCDocument
54*/
55class FCOLLADA_EXPORT FCDMaterial : public FCDEntity
56{
57private:
58        DeclareObjectType;
59        bool ownsEffect;
60        FCDEffect* effect;
61        FCDEffectParameterList* parameters;
62        FCDMaterialTechniqueHintList techniqueHints;
63
64public:
65        /** Constructor: do not use directly.
66                Instead, use the FCDMaterialLibrary::AddMaterial function.
67                @param document The COLLADA document that owns the material. */
68        FCDMaterial(FCDocument* document);
69
70        /** Destructor: do not use directly.
71                The material library will release all the materials when it is
72                released. If you want to remove a material from the material library:
73                use the FCDMaterialLibrary::RemoveMaterial function. */
74        virtual ~FCDMaterial();
75
76        /** Retrieves the entity type for this class. This function is part
77                of the FCDEntity class interface.
78                @return The entity type: MATERIAL. */
79        virtual Type GetType() const { return FCDEntity::MATERIAL; }
80
81        /** Retrieves the effect instantiated for this material.
82                The parameters of the effect may be overwritten by this material.
83                You should either flatten the material using the FlattenMaterial function
84                or verify the parameter values manually using the parameter list accessors.
85                @return The instantiated effect. This pointer will be NULL if the material has no rendering. */
86        FCDEffect* GetEffect() { return effect; }
87        const FCDEffect* GetEffect() const { return effect; } /**< See above. */
88
89        /** Sets the effect instantiated for this material.
90                @param _effect The effect instantiated for this material. */
91        void SetEffect(FCDEffect* _effect) { effect = _effect; }
92
93        /** Retrieves the list of the material platform-technique hints.
94                @return The list of material platform-technique hints. */
95        FCDMaterialTechniqueHintList& GetTechniqueHints() { return techniqueHints; }
96        const FCDMaterialTechniqueHintList& GetTechniqueHints() const { return techniqueHints; } /**< See above. */
97
98        /** Retrieves the list of effect parameter overrides.
99                @return The list of effect parameter overrides. */
100        FCDEffectParameterList* GetParameters() { return parameters; }
101        const FCDEffectParameterList* GetParameters() const { return parameters; } /**< See above. */
102
103        /** Retrieves an effect parameter override. Looks for the effect parameter override with the correct
104                semantic, in order to bind or set its value. This function searches through the material and the
105                level of abstractions below.
106                @param semantic The effect parameter semantic to match.
107                @return The effect parameter override that matches the semantic.
108                        This pointer will be NULL if no effect parameter override matches
109                        the given semantic. */
110        FCDEffectParameter* FindParameterBySemantic(const string& semantic);
111
112        /** Retrieves a subset of the effect parameter override list.
113                Look for the effect parameter overrides with the correct semantic.
114                This function searches through the material and the level of abstractions below.
115                @param semantic The effect parameter semantic to match.
116                @param parameters The list of parameters to fill in. This list is not cleared. */
117        void FindParametersBySemantic(const string& semantic, FCDEffectParameterList& parameters);
118
119        /** Retrieves a subset of the effect parameter override list.
120                Look for the effect parameter overrides with the correct reference.
121                This function searches through the material and the level of abstractions below.
122                @param reference The effect parameter reference to match. In the case of effect
123                        parameter generators, the reference is replaced by the sub-id.
124                @param parameters The list of parameters to fill in. This list is not cleared. */
125        void FindParametersByReference(const string& reference, FCDEffectParameterList& parameters);
126
127        /** [INTERNAL] Clones the material object. Everything is cloned, including the effect parameter.
128                You will need release the cloned material directly, by deleting the pointer.
129                @return The cloned material object. You will must delete this pointer. */
130        FCDMaterial* Clone();
131
132        /** [INTERNAL] Flattens the material, pushing all the effect parameter overrides
133                into the effect parameter generators and moving all the parameters to the
134                effect technique level of abstraction. To flatten the material, use the
135                FCDMaterialInstance::FlattenMaterial function. */
136        void Flatten();
137
138        /** [INTERNAL] Reads in the \<material\> element from a given COLLADA XML tree node.
139                @param materialNode The COLLADA XML tree node.
140                @return The status of the import. If the status is not successful,
141                        it may be dangerous to extract information from the material.*/
142        virtual FUStatus LoadFromXML(xmlNode* materialNode);
143
144        /** [INTERNAL] Writes out the \<material\> element to the given COLLADA XML tree node.
145                @param parentNode The COLLADA XML parent node in which to insert the material declaration.
146                @return The created element XML tree node. */
147        virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
148
149private:
150        void AddParameter(FCDEffectParameter* parameter);
151};
152
153#endif // _FCD_MATERIAL_H_
Note: See TracBrowser for help on using the repository browser.