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

Revision 964, 11.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        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 FCDSceneNode.h
14        This file contains the FCDSceneNode class.
15*/
16
17#ifndef _FCD_SCENE_NODE_
18#define _FCD_SCENE_NODE_
19
20#include "FCDocument/FCDEntity.h"
21#include "FCDocument/FCDTransform.h" /** @todo Remove this include by moving the FCDTransform::Type enum to FUDaeEnum.h. */
22#include "FCDocument/FCDEntityInstance.h" /** @todo Remove this include by moving the FCDEntityInstance::Type enum to FUDaeEnum.h. */
23
24class FCDocument;
25class FCDEntityInstance;
26class FCDSceneNode;
27class FCDTransform;
28class FCDExtra;
29class FCDTRotation;
30class FCDTTranslation;
31class FCDTScale;
32class FCDTSkew;
33class FCDTLookAt;
34class FCDTMatrix;
35
36typedef vector<FCDSceneNode*> FCDSceneNodeList; /**< A dynamically-sized array of scene nodes. */
37typedef vector<FCDEntityInstance*> FCDEntityInstanceList; /**< A dynamically-sized array of entitiy instances. */
38typedef vector<FCDTransform*> FCDTransformList; /**< A dynamically-sized array of transforms. */
39
40/**
41        A COLLADA visual scene node.
42        This class is also used to represent COLLADA visual scene entities.
43
44        A visual scene node contains child scene nodes to make a tree.
45        A visual scene node may appear multiple times within the scene graph,
46        but checks are made to verify that there are no cycles within the graph.
47
48        A visual scene node also contained an ordered list of transformations
49        and a list of entity instances.
50
51        @ingroup FCDocument
52*/
53class FCOLLADA_EXPORT FCDSceneNode : public FCDEntity
54{
55private:
56        DeclareObjectType;
57        FCDSceneNodeList parents;
58        FCDSceneNodeList children;
59        FCDTransformList transforms;
60        FCDEntityInstanceList instances;
61
62        // Visibility parameter. Should be a boolean, but is animated
63        float visibility; // Maya-specific
64
65        // The number of entities that target this node
66        uint32 targetCount;
67
68        // Whether this node is a joint.
69        bool isJoint;
70
71public:
72        /** Constructor: do not use directly.
73                Instead, use the FCDSceneNode::AddChild function for child
74                visual scene nodes or the FCDLibrary::AddEntity function
75                for visual scenes.
76                @param document The COLLADA document that owns the scene node. */
77        FCDSceneNode(FCDocument* document);
78
79        /** Destructor: do not use directly.
80                Instead, use the FCDSceneNode::ReleaseChild function for visual
81                scene nodes or the FCDLibrary::ReleaseEntity function for visual scenes. */
82        virtual ~FCDSceneNode();
83
84        /** Retrieves the type of the entity class.
85                @return The type of entity class: SCENE_NODE. */
86        inline virtual Type GetType() const { return SCENE_NODE; }
87
88        /** Retrieves the number of parent nodes for this visual scene node.
89                @return The number of parents. */
90        inline size_t GetParentCount() const { return parents.size(); };
91
92        /** Retrieves a specific parent of the visual scene node.
93                @param index The index of the parent.
94                @return The parent visual scene node. This pointer will be NULL if
95                        the scene node has no parents or if the index is out-of-bounds. */
96        inline FCDSceneNode* GetParent(size_t index = 0) { FUAssert(index == 0 || index < parents.size(), return NULL); return (!parents.empty()) ? parents.at(index) : NULL; }
97        inline const FCDSceneNode* GetParent(size_t index = 0) const { FUAssert(index == 0 || index < parents.size(), return NULL); return (!parents.empty()) ? parents.at(index) : NULL; } /**< See above. */
98
99        /** Retrieves the number of child nodes for this visual scene node.
100                @return The number of children. */
101        inline size_t GetChildrenCount() const { return children.size(); };
102
103        /** Retrieves a specific child of the visual scene node.
104                @param index The index of the child.
105                @return The child scene node. This pointer will be NULL if the
106                        index is out-of-bounds. */
107        inline FCDSceneNode* GetChild(size_t index) { FUAssert(index < children.size(), return NULL); return children.at(index); }
108        inline const FCDSceneNode* GetChild(size_t index) const { FUAssert(index < children.size(), return NULL); return children.at(index); } /**< See above. */
109
110        /** Retrieves the list of children of the visual scene node.
111                @return The list of child scene nodes. */
112        inline FCDSceneNodeList& GetChildren() { return children; }
113        inline const FCDSceneNodeList& GetChildren() const { return children; } /**< See above. */
114
115        /** Creates a new child scene node.
116                @return The new child scene node. */
117        FCDSceneNode* AddChildNode();
118
119        /** Attaches a existing scene node to this visual scene node.
120                This function will fail if attaching the given scene node
121                to this visual scene node creates a cycle within the scene graph.
122                @param sceneNode The scene node to attach.
123                @return Whether the given scene node was attached to this scene node. */
124        bool AddChildNode(FCDSceneNode* sceneNode);
125
126        /** Retrieves the number of entity instances at this node of the scene graph.
127                @return The number of entity instances. */
128        inline size_t GetInstanceCount() const { return instances.size(); };
129
130        /** Retrieves a specific entity instance.
131                @param index The index of the instance.
132                @return The entity instance at the given index. This pointer will be
133                        NULL if the index is out-of-bounds. */
134        inline FCDEntityInstance* GetInstance(size_t index) { FUAssert(index < instances.size(), return NULL); return instances.at(index); }
135        inline const FCDEntityInstance* GetInstance(size_t index) const { FUAssert(index < instances.size(), return NULL); return instances.at(index); } /**< See above. */
136
137        /** Retrieves the list of entity instances at this node of the scene graph.
138                @return The list of entity instances. */
139        inline FCDEntityInstanceList& GetInstances() { return instances; }
140        inline const FCDEntityInstanceList& GetInstances() const { return instances; } /**< See above. */
141
142        /** Creates a new entity instance.
143                Only geometric entities, controllers, light and cameras
144                can be instantiated in the scene graph.
145                To instantiate visual scene nodes, use the AddChildNode function.
146                @param entity The entity to instantiate. Set this pointer to NULL
147                        to instantiate an external entity.
148                @return The entity instance structure. This pointer will be NULL
149                        if the entity cannot be instantiated here. */
150        FCDEntityInstance* AddInstance(FCDEntity* entity);
151
152        /** Releases an entity instance.
153                @param instance The entity instance to release. */
154        void ReleaseInstance(FCDEntityInstance* instance);
155
156        /** Retrieves the number of transforms for this node of the scene graph.
157                @return The number of transforms. */
158        inline size_t GetTransformCount() const { return transforms.size(); };
159
160        /** Retrieves a specific transform.
161                @param index The index of the transform.
162                @return The transform at the given index. This pointer will be NULL
163                        if the index is out-of-bounds. */
164        inline FCDTransform* GetTransform(size_t index) { FUAssert(index < transforms.size(), return NULL); return transforms.at(index); }
165        inline const FCDTransform* GetTransform(size_t index) const { FUAssert(index < transforms.size(), return NULL); return transforms.at(index); } /**< See above. */
166
167        /** Retrieves the list of transforms for this node of the scene graph.
168                @return The list of transforms. */
169        inline FCDTransformList& GetTransforms() { return transforms; }
170        inline const FCDTransformList& GetTransforms() const { return transforms; } /**< See above. */
171
172        /** Creates a new transform for this visual scene node.
173                The transforms are processed in order and COLLADA is column-major.
174                For row-major matrix stacks, such as DirectX, this implies that the
175                transformations will be processed in reverse order.
176                By default, a transform is added at the end of the list.
177                @param type The type of transform to create.
178                @param index The index at which to insert the transform. Set this value to -1
179                        to indicate that you want this transform at the end of the stack.
180                @return The created transform. */
181        FCDTransform* AddTransform(FCDTransform::Type type, size_t index = (size_t)-1);
182
183        /** Releases a transform affecting this visual scene node.
184                @param transform The transform to release. */
185        void ReleaseTransform(FCDTransform* transform);
186
187
188        /** Retrieves the visual scene node with the given id.
189                This function looks through the whole tree of visual scene nodes
190                for the wanted COLLADA id.
191                @param daeId The COLLADA id to look for.
192                @return The visual scene node which has the given COLLADA id. This pointer
193                        will be NULL if no visual scene node can be found with the given COLLADA id. */
194        virtual FCDEntity* FindDaeId(const string& daeId);
195
196        /** Retrieves whether the visual scene node is visible.
197                A hidden visual scene node will not be rendered but will
198                still affect the world. This parameter is a floating-point value
199                because it is animated. It should be intepreted as a Boolean value.
200                @return Whether the scene node is visible. */
201        inline float& GetVisibility() { return visibility; }
202        inline const float& GetVisibility() const { return visibility; } /**< See above. */
203
204        /** Sets the visibility of the visual scene node.
205                A hidden visual scene node will not be rendered but will
206                still affect the world.
207                @param isVisible Whether the visual scene node is visible. */
208        inline void SetVisibility(bool isVisible) { visibility = isVisible; }
209
210        /** Retrieves whether this visual scene node is the target of an entity.
211                @return Whether this is an entity target. */
212        inline bool IsTarget() const { return targetCount > 0; }
213
214        /** Retrieves whether this visual scene node is a joint.
215                Joints are called bones in 3dsMax. A joint is a scene node that is used in skinning.
216                @return Whether this node is a joint. */
217        bool IsJoint() const { return isJoint; }
218
219        /** Sets whether a visual scene node is a joint.
220                Joints are called bones in 3dsMax. A joint is a scene node that is used in skinning.
221                @param _isJoint Whether this node is a joint. */
222        void SetJointFlag(bool _isJoint) { isJoint = _isJoint; }
223
224        /** Retrieves the local transform for this visual scene node.
225                This function does not handle or apply animations.
226                @return The local transform. */
227        FMMatrix44 ToMatrix() const;
228
229        /** Generates a list of local transform samples for this visual scene node.
230                This function will <b>permanently</b> modify the transforms of this visual scene node.
231                @param keys A list of key inputs that will be filled in with the sample times.
232                @param values A list of matrices that will be filled in with the sampled local transforms. */
233        void GenerateSampledMatrixAnimation(FloatList& keys, FMMatrix44List& values);
234
235        /** [INTERNAL] Increments the number of entities target this node.
236                To set targets, use the FCDTargetedEntity::SetTarget function. */
237        inline void IncrementTargetCount() { ++targetCount; }
238
239        /** [INTERNAL] Decrements the number of entities target this node.
240                To set targets, use the FCDTargetedEntity::SetTarget function. */
241        inline void DecrementTargetCount() { if (targetCount > 0) --targetCount; }
242
243        /** [INTERNAL] Reads in the visual scene node from a given COLLADA XML tree node.
244                @param sceneNode The COLLADA XML tree node.
245                @return The status of the import. If the status is not successful,
246                        it may be dangerous to extract information from the node.*/
247        virtual FUStatus LoadFromXML(xmlNode* sceneNode);
248
249        /** [INTERNAL] Writes out the visual scene node to the given COLLADA XML tree node.
250                @param parentNode The COLLADA XML parent node in which to insert the node.
251                @return The created XML tree node. */
252        virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
253
254private:
255        FUStatus LoadFromExtra();
256        void BindMaterial(xmlNode* node);
257        void WriteToNodeXML(xmlNode* node, bool isVisualScene) const;
258};
259
260#endif // _FCD_SCENE_NODE_
Note: See TracBrowser for help on using the repository browser.