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

Revision 964, 16.8 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/**
7        @file FCDExtra.h
8        This file contains the FCDExtra class and its sub-classes:
9        FCDENode, FCDETechnique and FCDEAttribute.
10*/
11
12#ifndef _FCD_EXTRA_H_
13#define _FCD_EXTRA_H_
14
15#include "FCDocument/FCDObject.h"
16
17class FCDAnimated;
18class FCDAnimatedCustom;
19class FCDETechnique;
20class FCDENode;
21
22/**
23        An extra tree attribute.
24        Contains a name and a value string.
25*/
26struct FCDEAttribute
27{
28        string name; /**< The attribute name. Must be provided. */
29        fstring value; /**< The attribute value. Is optional. */
30};
31
32typedef vector<FCDETechnique*> FCDETechniqueList; /**< A dynamically-sized array of extra tree techniques. */
33typedef vector<FCDENode*> FCDENodeList; /**< A dynamically-sized array of extra tree nodes. */
34typedef vector<FCDEAttribute*> FCDEAttributeList; /**< A dynamically-sized array of extra tree attributes. */
35
36/**
37        A COLLADA extra tree.
38
39        An extra tree contains the user-defined COLLADA information
40        contained within \<extra\> elements. For this, the extra tree
41        root simply contains a list of techniques. Each technique
42        belongs to a different application-specific profile.
43*/
44class FCOLLADA_EXPORT FCDExtra : public FCDObject
45{
46private:
47        DeclareObjectType;
48        FCDETechniqueList techniques;
49
50public:
51        /** Constructor: do not use directly.
52                The structures that contain extra trees will create them.
53                @param document The COLLADA document that owns the extra tree. */
54        FCDExtra(FCDocument* document);
55
56        /** Destructor: do not use directly.
57                The structures that contain extra trees will release them. */
58        virtual ~FCDExtra();
59
60        /** Retrieves the list of techniques contained by this extra tree.
61                @return The list of techniques. */
62        FCDETechniqueList& GetTechniques() { return techniques; }
63        const FCDETechniqueList& GetTechniques() const { return techniques; } /**< See above. */
64
65        /** Retrieves the number of techniques contained by this extra tree.
66                @return The number of techniques. */
67        size_t GetTechniqueCount() const { return techniques.size(); }
68
69        /** Retrieves a specific technique contained by this extra tree.
70                @param index The index of the technique.
71                @return The technique. This pointer will be NULL if the
72                        index is out-of-bounds. */
73        FCDETechnique* GetTechnique(size_t index) { FUAssert(index < techniques.size(), return NULL); return techniques.at(index); }
74        const FCDETechnique* GetTechnique(size_t index) const { FUAssert(index < techniques.size(), return NULL); return techniques.at(index); } /**< See above. */
75
76        /** Adds a new application-specific profile technique to the extra tree.
77                If the given application-specific profile already exists
78                within the extra tree, the old technique will be returned.
79                @param profile The application-specific profile name.
80                @return A technique for this application-specific profile. */
81        FCDETechnique* AddTechnique(const char* profile);
82        inline FCDETechnique* AddTechnique(const string& profile) { return AddTechnique(profile.c_str()); } /**< See above. */
83
84        /** Releases a technique contained within the extra tree.
85                @param technique The technique to release. */
86        void ReleaseTechnique(FCDETechnique* technique);
87
88        /** Retrieves a specific technique contained by this extra tree.
89                @param profile The application-specific profile name of the technique.
90                @return The technique that matches the profile name. This pointer may
91                        be NULL if no technique matches the profile name. */
92        FCDETechnique* FindTechnique(const char* profile);
93        const FCDETechnique* FindTechnique(const char* profile) const; /**< See above. */
94        inline FCDETechnique* FindTechnique(const string& profile) { return FindTechnique(profile.c_str()); } /**< See above. */
95        inline const FCDETechnique* FindTechnique(const string& profile) const { return FindTechnique(profile.c_str()); } /**< See above. */
96
97        /** Retrieves the extra tree node that has a given element name.
98                This function searches for the extra tree node within all the
99                techniques.
100                @param name An element name.
101                @return The extra tree node that matches the element name. This pointer
102                        will be NULL if no extra tree node matches the element name. */
103        FCDENode* FindRootNode(const char* name);
104        const FCDENode* FindRootNode(const char* name) const; /**< See above. */
105        inline FCDENode* FindRootNode(const string& name) { return FindRootNode(name.c_str()); } /**< See above. */
106        inline const FCDENode* FindRootNode(const string& name) const { return FindRootNode(name.c_str()); } /**< See above. */
107
108        /** [INTERNAL] Reads in the extra tree from a given COLLADA XML tree node.
109                @param extraNode The COLLADA \<extra\> element XML tree node.
110                @return The status of the import. If the status is not successful,
111                        it may be dangerous to extract information from the entity.*/
112        FUStatus LoadFromXML(xmlNode* extraNode);
113
114        /** [INTERNAL] Writes out the extra tree to the given COLLADA XML tree node.
115                @param parentNode The COLLADA XML parent node in which to insert the \<extra\> element.
116                @return The created element XML tree node. */
117        xmlNode* WriteToXML(xmlNode* parentNode) const;
118};
119
120/**
121        A COLLADA extra tree node.
122
123        The extra tree node is a hierarchical structure that contains child
124        extra tree nodes as well as attributes. If the extra tree node is a leaf
125        of the tree, it may contain textual content.
126
127        The extra tree node leaf may be animated, if it has the 'sid' attribute.
128*/
129class FCOLLADA_EXPORT FCDENode : public FCDObject
130{
131private:
132        DeclareObjectType;
133
134        string name;
135        fstring content;
136
137        FCDENode* parent;
138        FCDENodeList children;
139        FCDEAttributeList attributes;
140
141        FCDAnimatedCustom* animated;
142
143public:
144        /** Constructor: do not use directly.
145                Instead, call the FCDENode::AddChild function of the parent within the hierarchy.
146                @param document The COLLADA document that owns the extra tree node.
147                @param parent The extra tree node that contains this extra tree node. */
148        FCDENode(FCDocument* document, FCDENode* parent);
149
150        /** Destructor: do not use directly.
151                Instead, for hierarchical nodes: call the Release function
152                or the parent's ReleaseChildNode function and for techniques:
153                call the FCDExtra::ReleaseTechnique function. */
154        virtual ~FCDENode();
155
156        /** Releases this extra tree node.
157                This function is a shortcut to the parent's FCDENode::ReleaseChildNode function. */
158        void Release();
159
160        /** Retrieves the name of the extra tree node.
161                The name of the extra tree node is the name of the equivalent XML tree node.
162                @return The name of the extra tree node. */
163        inline const char* GetName() const { return name.c_str(); }
164
165        /** Sets the name of the extra tree node.
166                The name of the extra tree node is the name of the equivalent XML tree node.
167                @param _name The name of the extra tree node. */
168        inline void SetName(const char* _name) { name = _name; }
169        inline void SetName(const string& _name) { name = _name; } /**< See above. */
170
171        /** Retrieves the textual content of the extra tree node.
172                This value is only valid for extra tree node that have no children,
173                as COLLADA doesn't allow for mixed-content.
174                @return The textual content of the extra tree node. */
175        const fchar* GetContent() const { return content.c_str(); }
176
177        /** Sets the textual content of the extra tree node.
178                This function will release all the child node of this extra tree node,
179                as COLLADA doesn't allow for mixed-content.
180                @param _content The textual content. */
181        void SetContent(const fchar* _content);
182        inline void SetContent(const fstring& _content) { return SetContent(_content.c_str()); } /**< See above. */
183
184        /** Retrieves the animated values associated with this extra tree node.
185                Extra tree node leaves may be animated. If this extra tree node leaf
186                is animated, this animated value will contain the animation curves.
187                @return The animated value. */
188        FCDAnimatedCustom* GetAnimated() { return animated; }
189        const FCDAnimatedCustom* GetAnimated() const { return animated; } /**< See above. */
190
191        /** Retrieves the parent of an extra tree node.
192                The hierarchy cannot be changed dynamically. If you to move an extra tree node,
193                you will need to clone it manually and release the old extra tree node.
194                @return The parent extra tree node within the hierarchy. This pointer
195                        will be NULL if the extra tree node is a extra tree technique. */
196        FCDENode* GetParent() { return parent; }
197        const FCDENode* GetParent() const { return parent; } /**< See above. */
198
199        /** Retrieves the children of an extra tree node.
200                @return The list of child extra tree nodes. */
201        FCDENodeList& GetChildNodes() { return children; }
202        const FCDENodeList& GetChildNodes() const { return children; } /**< See above. */
203
204        /** Retrieves the number of children of an extra tree node.
205                @return The number of children. */
206        size_t GetChildNodeCount() const { return children.size(); }
207
208        /** Retrieves a specific child extra tree node.
209                @param index The index of the child extra tree node.
210                @return The child extra tree node. This pointer will be NULL if the index
211                        is out-of-bounds. */
212        FCDENode* GetChildNode(size_t index) { FUAssert(index < children.size(), return NULL); return children.at(index); }
213        const FCDENode* GetChildNode(size_t index) const { FUAssert(index < children.size(), return NULL); return children.at(index); } /**< See above. */
214
215        /** Adds a new child extra tree to this extra tree node.
216                @return The new child extra tree node. */
217        FCDENode* AddChildNode();
218
219        /** Releases a child extra tree node of this extra tree node.
220                @param childNode The child to release. */
221        void ReleaseChildNode(FCDENode* childNode);
222
223        /** Retrieves the child extra tree node with the given name.
224                @param name A name.
225                @return The child extra tree node that matches the given name.
226                        This pointer will be NULL if no child extra tree node matches
227                        the given name. */
228        FCDENode* FindChildNode(const char* name);
229        const FCDENode* FindChildNode(const char* name) const; /**< See above. */
230        inline FCDENode* FindChildNode(const string& name) { return FindChildNode(name.c_str()); } /**< See above. */
231        inline const FCDENode* FindChildNode(const string& name) const { return FindChildNode(name.c_str()); } /**< See above. */
232
233        /** Retrieves the child extra tree node with the given name.
234                This function is used for COLLADA 1.3 backward compatibility,
235                where all parameters were described as \<param name='X'>value\</param\>.
236                So, if the child extra tree node with the name 'X' as searched for:
237                both the above COLLADA 1.3 parameter and the COLLADA 1.4+
238                \<X\>value\</X\> parameters will be returned.
239                @param name The parameter name.
240                @return The first child extra tree node holding the wanted parameter within the hierarchy.
241                        This pointer will be NULL to indicate that no parameter matches the given name. */
242        FCDENode* FindParameter(const char* name);
243
244        /** Retrieves a list of all the parameters contained within the hierarchy.
245                This function is used for COLLADA 1.3 backward compatibility,
246                where all parameters were described as \<param name='X'>value\</param\>.
247                In COLLADA 1.4+, the same parameter should be described as: \<X\>value\</X\>.
248                Using this function, both parameters would be returned with the name 'X'.
249                @param nodes The list of parameters to fill in. This list is not emptied by the function.
250                @param names The list of names of the parameters. This list is not emptied by the function. */
251        void FindParameters(FCDENodeList& nodes, StringList& names);
252
253        /** Retrieves the list of attributes for this extra tree node.
254                @return The list of attributes. */
255        FCDEAttributeList& GetAttributes() { return attributes; }
256        const FCDEAttributeList& GetAttributes() const { return attributes; } /**< See above. */
257
258        /** Retrieves the number of attributes for this extra tree node.
259                @return The number of attributes. */
260        size_t GetAttributeCount() const { return attributes.size(); }
261
262        /** Retrieves a specific attribute of this extra tree node.
263                @param index The index.
264                @return The attribute at this index. This pointer will be NULL
265                        if the index is out-of-bounds. */
266        FCDEAttribute* GetAttribute(size_t index) { FUAssert(index < attributes.size(), return NULL); return attributes.at(index); }
267        const FCDEAttribute* GetAttribute(size_t index) const { FUAssert(index < attributes.size(), return NULL); return attributes.at(index); } /**< See above. */
268
269        /** Adds a new attribute to this extra tree node.
270                If an attribute with the same name already exists, this function simply
271                assigns the new value to the existing attribute and returns the existing attribute.
272                @param _name The name of the attribute.
273                @param _value The value of the attribute.
274                @return The new attribute. */
275        FCDEAttribute* AddAttribute(const char* _name, const fchar* _value);
276        inline FCDEAttribute* AddAttribute(const string& _name, const fchar* _value) { return AddAttribute(_name.c_str(), _value); } /**< See above. */
277        inline FCDEAttribute* AddAttribute(const char* _name, const fstring& _value) { return AddAttribute(_name, _value.c_str()); } /**< See above. */
278        inline FCDEAttribute* AddAttribute(const string& _name, const fstring& _value) { return AddAttribute(_name.c_str(), _value.c_str()); } /**< See above. */
279        template <typename T> inline FCDEAttribute* AddAttribute(const char* _name, const T& _value) { return AddAttribute(_name, TO_FSTRING(_value)); } /**< See above. */
280        template <typename T> inline FCDEAttribute* AddAttribute(const string& _name, const T& _value) { return AddAttribute(_name.c_str(), TO_FSTRING(_value)); } /**< See above. */
281
282        /** Releases an attribute of this extra tree node.
283                @param attribute The attribute to release. */
284        void ReleaseAttribute(FCDEAttribute* attribute);
285
286        /** Retrieve the attribute of this extra tree node with the given name.
287                Attribute names are unique within an extra tree node.
288                @param name The attribute name.
289                @return The attribute that matches the name. This pointer will be NULL if
290                        there is no attribute with the given name. */
291        FCDEAttribute* FindAttribute(const char* name);
292        const FCDEAttribute* FindAttribute(const char* name) const; /**< See above. */
293
294        /** [INTERNAL] Reads in the extra tree node from a given COLLADA XML tree node.
295                @param customNode The COLLADA XML tree node.
296                @return The status of the import. If the status is not successful,
297                        it may be dangerous to extract information from the extra tree node.*/
298        virtual FUStatus LoadFromXML(xmlNode* customNode);
299
300        /** [INTERNAL] Writes out the extra tree node to the given COLLADA XML tree node.
301                @param parentNode The COLLADA XML parent node in which to insert the extra tree node.
302                @return The created element XML tree node. */
303        virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
304
305protected:
306        /** [INTERNAL] Reads in the children nodes of the extra tree node.
307                Used by the FCDETechnique class exclusively.
308                @param customNode The COLLADA XML tree node.
309                @return The status of the import. If the status is not successful,
310                        it may be dangerous to extract information from the extra tree node.*/
311        FUStatus ReadChildrenFromXML(xmlNode* customNode);
312
313        /** [INTERNAL] Writes out the children nodes of extra tree node.
314                Used by the FCDETechnique class exclusively.
315                @param customNode The COLLADA XML node for the extra tree node. */
316        void WriteChildrenToXML(xmlNode* customNode) const;
317};
318
319/**
320        A COLLADA extra tree technique.
321
322        For convenience, this extra tree technique is based on top of the FCDENode class.
323        An extra tree technique is the root of the extra tree specific to
324        the profile of an application.
325
326        @ingroup FCDocument
327*/
328class FCOLLADA_EXPORT FCDETechnique : public FCDENode
329{
330private:
331        DeclareObjectType;
332
333        string profile;
334
335public:
336        /** Constructor: do not use directly.
337                Instead, use the FCDExtra::AddTechnique function.
338                @param document The COLLADA document that owns the technique.
339                @param profile The application-specific profile name. */
340        FCDETechnique(FCDocument* document, const char* profile);
341
342        /** Destructor: do not use directly.
343                Instead, release a technique using the FCDExtra::ReleaseTechnique function. */
344        virtual ~FCDETechnique();
345
346        /** Retrieves the name of the application-specific profile of the technique.
347                @return The name of the application-specific profile. */
348        const char* GetProfile() const { return profile.c_str(); }
349
350        /** [INTERNAL] Reads in the extra tree technique from a given COLLADA XML tree node.
351                @param techniqueNode The COLLADA XML tree node.
352                @return The status of the import. If the status is not successful,
353                        it may be dangerous to extract information from the extra tree technique.*/
354        virtual FUStatus LoadFromXML(xmlNode* techniqueNode);
355
356        /** [INTERNAL] Writes out the extra tree technique to the given COLLADA XML tree node.
357                @param parentNode The COLLADA XML parent node in which to insert the extra tree technique.
358                @return The created element XML tree node. */
359        virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
360};
361
362#endif // _FCD_EXTRA_H_
Note: See TracBrowser for help on using the repository browser.