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

Revision 964, 10.7 KB checked in by igarcia, 18 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 FCDEffectProfileFX.h
14        This file declares the FCDEffectProfileFX class.
15*/
16
17#ifndef _FCD_EFFECT_PROFILE_FX_H_
18#define _FCD_EFFECT_PROFILE_FX_H_
19
20#include "FUtils/FUDaeEnum.h"
21#include "FCDocument/FCDEffectProfile.h"
22
23class FCDocument;
24class FCDEffect;
25class FCDEffectCode;
26class FCDEffectParameter;
27class FCDEffectParameterSurface;
28class FCDEffectTechnique;
29class FCDEffectParameterList;
30
31typedef vector<FCDEffectTechnique*> FCDEffectTechniqueList; /**< A dynamically-sized array of effect techniques. */
32typedef vector<FCDEffectCode*> FCDEffectCodeList; /**< A dynamically-sized array of effect code inclusion. */
33
34/**
35        A general effect profile description.
36
37        The general effect profile contains all the information necessary
38        to implement the advanced effect profiles, such as CG, HLSL, GLSL and GLES.
39        Since these effect profiles contains extremely similar information, they
40        use the same description structure. For the COMMON profile,
41        see the FCDEffectStandard class.
42
43        You should use the GetType function to figure out which profile this structure
44        addresses. You can then retrieve one or many of the FCDEffectTechnique objects
45        that describe how to render for this profile. You may want to check the
46        FCDEffectMaterialTechniqueHint objects at the FCDMaterial level, in order to
47        determine which technique(s) to use for your platform. At the profile
48        level of abstraction, parameters may be generated within the FCDEffectParamterList.
49
50        @ingroup FCDEffect
51*/
52class FCOLLADA_EXPORT FCDEffectProfileFX : public FCDEffectProfile
53{
54private:
55        DeclareObjectType;
56        FUDaeProfileType::Type type;
57        string includeFilename;
58        fstring platform;
59
60        FCDEffectCodeList codes;
61        FCDEffectTechniqueList techniques;
62        FCDEffectParameterList* parameters;
63
64public:
65        /** Constructor: do not use directly. Instead, use the FCDEffect::AddProfile function.
66                @param document The COLLADA document which owns the effect profile.
67                @param parent The effect which contains this profile.
68                @param type The type of profile. */
69        FCDEffectProfileFX(FCDocument* document, FCDEffect* parent, FUDaeProfileType::Type type);
70
71        /** Destructor: do not use directly. Instead, use the FCDEffect:RemoveProfile function. */
72        virtual ~FCDEffectProfileFX();
73
74        /** Retrieves the profile type for this effect.
75                This function is a part of the FCDEffectProfile interface and allows you
76                to up-cast an effect profile pointer safely to this class.
77                @return The profile type. This should never be the value: 'COMMON',
78                        but all other profiles currently derive from this class. */
79        virtual FUDaeProfileType::Type GetType() const { return type; }
80
81        /** @deprecated Retrieves the filename of the file that contains the code for this effect profile.
82                Instead, look through the FCDEffectCode object, using the GetCodeList function and retrieve
83                the correct object and its filename string.
84                @return The filename of the file to import. */
85        const string& GetIncludeFilename() const { return includeFilename; }
86
87        /** Retrieves the name of the platform in which to use the effect profile.
88                This parameter is very optional.
89                @return The platform name. */
90        const fstring& GetPlatform() const { return platform; }
91
92        /** Sets the name of the platform in which to use the effect profile.
93                This parameter is very optional.
94                @param _platform The platform name. */
95        void SetPlatform(fstring& _platform) { platform = _platform; }
96
97        /** Retrieves the list of techniques contained within this effect profile.
98                You may want to check the FCDEffectMaterialTechniqueHint objects at the FCDMaterial level,
99                in order to determine which technique(s) to use for your platform.
100                @return The list of inner techniques. */
101        FCDEffectTechniqueList& GetTechniqueList() { return techniques; }
102        const FCDEffectTechniqueList& GetTechniqueList() const { return techniques; } /**< See above. */
103
104        /** Retrieves the number of techniques contained within this effect profile.
105                @return The number of inner techniques. */
106        size_t GetTechniqueCount() const { return techniques.size(); }
107
108        /** Retrieves a technique contained within this effect profile.
109                You may want to check the FCDEffectMaterialTechniqueHint objects at the FCDMaterial level,
110                in order to determine which technique(s) to use for your platform.
111                @param index The index of the technique.
112                @return The inner technique. This pointer will be NULL if the index is out-of-bounds. */
113        FCDEffectTechnique* GetTechnique(size_t index) { FUAssert(index < GetTechniqueCount(), return NULL); return techniques.at(index); }
114        const FCDEffectTechnique* GetTechnique(size_t index) const { FUAssert(index < GetTechniqueCount(), return NULL); return techniques.at(index); } /**< See above. */
115
116        /** Adds a new technique to this effect profile.
117                @return The new technique object. */
118        FCDEffectTechnique* AddTechnique();
119
120        /** Releases a technique contained within this effect profile.
121                @param technique The technique to release. */
122        void ReleaseTechnique(FCDEffectTechnique* technique);
123
124        /** Retrieves the list of code inclusions.
125                @return The list of code inclusions. */         
126        FCDEffectCodeList& GetCodeList() { return codes; }
127        const FCDEffectCodeList& GetCodeList() const { return codes; } /**< See above. */
128
129        /** Retrieves the number of code inclusions contained within the effect profile.
130                @return The number of code inclusions. */
131        size_t GetCodeCount() const { return codes.size(); }
132
133        /** Retrieves a code inclusion contained within the effect profile.
134                @param index The index of the code inclusion.
135                @return The code inclusion. This pointer will be NULL if the index is out-of-bounds. */
136        FCDEffectCode* GetCode(size_t index) { FUAssert(index < GetCodeCount(), return NULL); return codes.at(index); }
137        const FCDEffectCode* GetCode(size_t index) const { FUAssert(index < GetCodeCount(), return NULL); return codes.at(index); } /**< See above. */
138
139        /** Retrieves the code inclusion with the given sub-id.
140                @param sid A COLLADA sub-id.
141                @return The code inclusion with the given sub-id. This pointer will be NULL,
142                        if there are no code inclusions that match the given sub-id. */
143        FCDEffectCode* FindCode(const string& sid);
144        const FCDEffectCode* FindCode(const string& sid) const; /**< See above. */
145
146        /** Adds a new code inclusion to this effect profile.
147                @return The new code inclusion. */
148        FCDEffectCode* AddCode();
149
150        /** Releases a code inclusion contained within this effect profile.
151                @param code The code inclusion to release. */
152        void ReleaseCode(FCDEffectCode* code);
153
154        /** Retrieves the list of effect parameters contained within the effect profile.
155                At this level of abstraction, there should be only effect parameter generators.
156                @return The list of effect parameters. */
157        FCDEffectParameterList* GetParameters() { return parameters; }
158        const FCDEffectParameterList* GetParameters() const { return parameters; } /**< See above. */
159
160        /** [INTERNAL] Inserts an existing parameter into the list of effect parameters
161                at this abstraction level. This function is used during the flattening of a material.
162                @param parameter The effect parameter to insert. */
163        void AddParameter(FCDEffectParameter* parameter);
164
165        /** Retrieves an effect parameter.
166                Looks for the effect parameter with the correct reference, in order to bind or override its value.
167                This function searches through the effect profile and the level of abstractions below.
168                @param reference The reference to match. In the case of effect parameter generators,
169                        the sub-id is used to match.
170                @return The first effect parameter that matches the reference.
171                        This pointer will be NULL if no effect parameter matches the given semantic. */
172        const FCDEffectParameter* FindParameter(const char* reference) const;
173
174        /** Retrieves an effect parameter.
175                Looks for the effect parameter with the correct semantic, in order to bind or override its value.
176                This function searches through the effect profile and the level of abstractions below.
177                @param semantic The effect parameter semantic to match.
178                @return The first effect parameter that matches the semantic.
179                        This pointer will be NULL if no effect parameter matches the given semantic. */
180        virtual FCDEffectParameter* FindParameterBySemantic(const string& semantic);
181
182        /** Retrieves a subset of the effect parameter list.
183                Look for the effect parameter generators with the correct semantic.
184                This function searches through the effect profile and the level of abstractions below.
185                @param semantic The effect parameter semantic to match.
186                @param parameters The list of parameters to fill in. This list is not cleared. */
187        virtual void FindParametersBySemantic(const string& semantic, FCDEffectParameterList& parameters);
188
189        /** Retrieves a subset of the effect parameter list.
190                Look for the effect parameter generators with the correct reference.
191                This function searches through the effect profile and the level of abstractions below.
192                @param reference The effect parameter reference to match. In the case of effect
193                        parameter generators, the reference is replaced by the sub-id.
194                @param parameters The list of parameters to fill in. This list is not cleared. */
195        virtual void FindParametersByReference(const string& reference, FCDEffectParameterList& parameters);
196
197        /** [INTERNAL] Clones the full effect profile.
198                @param newParent The effect that will contain the cloned profile.
199                @return The cloned profile. This pointer will never be NULL. */
200        virtual FCDEffectProfile* Clone(FCDEffect* newParent);
201
202        /** [INTERNAL] Flattens this effect profile. Pushes all the effect parameter overrides
203                into the effect parameter generators and moves all the parameters to the
204                effect technique level of abstraction. To flatten the material, use the
205                FCDMaterialInstance::FlattenMaterial function. */
206        virtual void Flatten();
207
208        /** [INTERNAL] Reads in the effect profile from a given COLLADA XML tree node.
209                @param profileNode The COLLADA XML tree node.
210                @return The status of the import. If the status is not successful,
211                        it may be dangerous to extract information from the effect profile.*/
212        virtual FUStatus LoadFromXML(xmlNode* profileNode);
213
214        /** [INTERNAL] Writes out the effect profile to the given COLLADA XML tree node.
215                @param parentNode The COLLADA XML parent node in which to insert the material declaration.
216                @return The created element XML tree node. */
217        virtual xmlNode* WriteToXML(xmlNode* parentNode)  const;
218};
219
220#endif // _FCD_EFFECT_PROFILE_H_
Note: See TracBrowser for help on using the repository browser.