File: FCDSceneNode.h

package info (click to toggle)
0ad 0.0.23.1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 78,292 kB
  • sloc: cpp: 245,166; ansic: 200,249; python: 13,754; sh: 6,104; perl: 4,620; makefile: 977; xml: 810; java: 533; ruby: 229; erlang: 46; pascal: 30; sql: 21; tcl: 4
file content (302 lines) | stat: -rw-r--r-- 14,356 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
/*
	Copyright (C) 2005-2007 Feeling Software Inc.
	Portions of the code are:
	Copyright (C) 2005-2007 Sony Computer Entertainment America
	
	MIT License: http://www.opensource.org/licenses/mit-license.php
*/
/*
	Based on the FS Import classes:
	Copyright (C) 2005-2006 Feeling Software Inc
	Copyright (C) 2005-2006 Autodesk Media Entertainment
	MIT License: http://www.opensource.org/licenses/mit-license.php
*/

/**
	@file FCDSceneNode.h
	This file contains the FCDSceneNode class.
*/

#ifndef _FCD_SCENE_NODE_
#define _FCD_SCENE_NODE_

#ifndef _FCD_ENTITY_H_
#include "FCDocument/FCDEntity.h"
#endif // _FCD_ENTITY_H_
#ifndef _FCD_TRANSFORM_H_
#include "FCDocument/FCDTransform.h" /** @todo Remove this include by moving the FCDTransform::Type enum to FUDaeEnum.h. */
#endif // _FCD_TRANSFORM_H_
#ifndef _FCD_ENTITY_INSTANCE_H_
#include "FCDocument/FCDEntityInstance.h" /** @todo Remove this include by moving the FCDEntityInstance::Type enum to FUDaeEnum.h. */
#endif // _FCD_ENTITY_INSTANCE_H_

class FCDocument;
class FCDEntityInstance;
class FCDSceneNode;
class FCDTransform;

/**
	A COLLADA visual scene node.
	This class is also used to represent COLLADA visual scene entities.

	A visual scene node contains child scene nodes to make a tree.
	A visual scene node may appear multiple times within the scene graph,
	but checks are made to verify that there are no cycles within the graph.

	A visual scene node also contained an ordered list of transformations
	and a list of entity instances.

	NOTE: The GenerateSampledMatrixAnimation function was moved to the
	FCDSceneNodeTools namespace to improve DLL support.

	@ingroup FCDocument
*/
class FCOLLADA_EXPORT FCDSceneNode : public FCDEntity
{
private:
	DeclareObjectType(FCDEntity);

	// Hierarchy and instances
	DeclareParameterTrackList(FCDSceneNode, parents, FC("Parents"));
	DeclareParameterTrackList(FCDSceneNode, children, FC("Child Nodes"));
	DeclareParameterContainer(FCDTransform, transforms, FC("Transforms"));
	DeclareParameterContainer(FCDEntityInstance, instances, FC("Instances"));

	// Visibility parameter.
	// Should be a boolean, but is animated as float.
	DeclareParameterAnimatable(float, FUParameterQualifiers::SIMPLE, visibility, FC("Visibility"));

	// The number of entities that target this node
	uint32 targetCount;

	// Mainly for joints.
	DeclareParameter(fm::string, FUParameterQualifiers::SIMPLE, daeSubId, FC("Sub-id"));

public:
	DeclareFlag(TransformsDirty, 0); /**< Whether the transforms have been dirtied. */
	DeclareFlag(Joint, 1); /**< Whether the scene node is a joint. */
	DeclareFlagCount(2); /**< . */

public:
	/** Constructor: do not use directly.
		Instead, use the FCDSceneNode::AddChild function for child
		visual scene nodes or the FCDLibrary::AddEntity function
		for visual scenes.
		@param document The COLLADA document that owns the scene node. */
	FCDSceneNode(FCDocument* document);

	/** Destructor. */
	virtual ~FCDSceneNode();

	/** Retrieves the type of the entity class.
		@return The type of entity class: SCENE_NODE. */
	virtual Type GetType() const { return SCENE_NODE; }

	/** Retrieves the number of parent nodes for this visual scene node.
		@return The number of parents. */
	inline size_t GetParentCount() const { return parents.size(); };

	/** Retrieves a specific parent of the visual scene node.
		@param index The index of the parent.
		@return The parent visual scene node. This pointer will be NULL if
			the scene node has no parents or if the index is out-of-bounds. */
	inline FCDSceneNode* GetParent(size_t index = 0) { FUAssert(index == 0 || index < parents.size(), return NULL); return (!parents.empty()) ? parents.at(index) : NULL; }
	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. */

	/** Retrieves the list of parents for the visual scene node.
		@return The list of parents. */
	inline const FCDSceneNode** GetParents() const { return parents.begin(); }

	/** Retrieves the number of child nodes for this visual scene node.
		@return The number of children. */
	inline size_t GetChildrenCount() const { return children.size(); };

	/** Retrieves a specific child of the visual scene node.
		@param index The index of the child.
		@return The child scene node. This pointer will be NULL if the
			index is out-of-bounds. */
	inline FCDSceneNode* GetChild(size_t index) { FUAssert(index < children.size(), return NULL); return children.at(index); }
	inline const FCDSceneNode* GetChild(size_t index) const { FUAssert(index < children.size(), return NULL); return children.at(index); } /**< See above. */

	/** Retrieves the list of children of the visual scene node.
		@return The list of child scene nodes. */
	inline const FCDSceneNode** GetChildren() const { return children.begin(); }

	/** Creates a new child scene node.
		@return The new child scene node. */
	FCDSceneNode* AddChildNode();

	/** Attaches a existing scene node to this visual scene node.
		This function will fail if attaching the given scene node
		to this visual scene node creates a cycle within the scene graph.
		@param sceneNode The scene node to attach.
		@return Whether the given scene node was attached to this scene node. */
	bool AddChildNode(FCDSceneNode* sceneNode);

	/** Removes a scene node from this scene node direct child list.
		This function should be used to detach a scene node with multiple parents.
		To completely delete a scene node, you should use the FCDSceneNode::Release function
		on the scene node to delete.
		If the given child node is instanced multiple times within this scene node,
		only the first instance will be removed.
		@param childNode The child node to remove from the direct hierarchy. */
	void RemoveChildNode(FCDSceneNode* childNode);

	/** Retrieves the number of entity instances at this node of the scene graph.
		@return The number of entity instances. */
	inline size_t GetInstanceCount() const { return instances.size(); };

	/** Retrieves a specific entity instance.
		@param index The index of the instance.
		@return The entity instance at the given index. This pointer will be
			NULL if the index is out-of-bounds. */
	inline FCDEntityInstance* GetInstance(size_t index) { FUAssert(index < instances.size(), return NULL); return instances.at(index); }
	inline const FCDEntityInstance* GetInstance(size_t index) const { FUAssert(index < instances.size(), return NULL); return instances.at(index); } /**< See above. */

	/** Retrieves the list of entity instances at this node of the scene graph.
		@return The list of entity instances. */
	inline const FCDEntityInstance** GetInstances() const { return instances.begin(); }

	/** Creates a new entity instance.
		Only geometric entities, controllers, light and cameras
		can be instantiated in the scene graph.
		To instantiate visual scene nodes, use the AddChildNode function.
		@param entity The entity to instantiate. This pointer cannot be NULL.
		@return The entity instance structure. This pointer will be NULL
			if the entity cannot be instantiated here or if the entity is a scene node. */
	FCDEntityInstance* AddInstance(FCDEntity* entity);

	/** Creates a new entity instance.
		Only geometric entities, controllers, light and cameras
		can be instantiated in the scene graph.
		To instantiate visual scene nodes, use the AddChildNode function.
		@param type The type of entity to instantiate. 
		@return The entity instance structure. This pointer will be NULL
			if the entity cannot be instantiated here. */
	FCDEntityInstance* AddInstance(FCDEntity::Type type);

	/** Retrieves the number of transforms for this node of the scene graph.
		@return The number of transforms. */
	inline size_t GetTransformCount() const { return transforms.size(); };

	/** Retrieves a specific transform.
		@param index The index of the transform.
		@return The transform at the given index. This pointer will be NULL
			if the index is out-of-bounds. */
	inline FCDTransform* GetTransform(size_t index) { FUAssert(index < transforms.size(), return NULL); return transforms.at(index); }
	inline const FCDTransform* GetTransform(size_t index) const { FUAssert(index < transforms.size(), return NULL); return transforms.at(index); } /**< See above. */

	/** Retrieves the list of transforms for this node of the scene graph.
		@return The list of transforms. */
	inline const FCDTransform** GetTransforms() const { return transforms.begin(); } /**< See above. */

	/** Creates a new transform for this visual scene node.
		The transforms are processed in order and COLLADA is column-major.
		For row-major matrix stacks, such as DirectX, this implies that the
		transformations will be processed in reverse order.
		By default, a transform is added at the end of the list.
		@param type The type of transform to create.
		@param index The index at which to insert the transform. Set this value to -1
			to indicate that you want this transform at the end of the stack.
		@return The created transform. */
	FCDTransform* AddTransform(FCDTransform::Type type, size_t index = (size_t)-1);

	/** Retrieves the asset information structures that affect
		this entity in its hierarchy.
		@param assets A list of asset information structures to fill in. */
	inline void GetHierarchicalAssets(FCDAssetList& assets) { GetHierarchicalAssets(*(FCDAssetConstList*) &assets); }
	virtual void GetHierarchicalAssets(FCDAssetConstList& assets) const; /**< See above. */

	/** Retrieves the visual scene node with the given id.
		This function looks through the whole sub-tree of visual scene nodes
		for the wanted COLLADA id.
		@param daeId The COLLADA id to look for.
		@return The visual scene node which has the given COLLADA id. This pointer
			will be NULL if no visual scene node can be found with the given COLLADA id. */
	virtual FCDEntity* FindDaeId(const fm::string& daeId) { return const_cast<FCDEntity*>(const_cast<const FCDSceneNode*>(this)->FindDaeId(daeId)); }
	virtual const FCDEntity* FindDaeId(const fm::string& daeId) const; /** < See above. */

	/** Retrieves the optional sub-id of the node.
		This sub-id is neither unique nor guaranteed to exist.
		@return The sub-id of the node. */
	inline const fm::string& GetSubId() const { return daeSubId; }

	/** Sets the sub-id for this node.
		The sub-id of an object is not required to be unique.
		@param id The new sub-id of the node. */
	void SetSubId(const fm::string& id);

	/** Retrieves the visual scene node with the given sub-id.
		This function looks through the whole sub-tree of visual scene nodes
		for the wanted COLLADA sub-id.
		@param subId The COLLADA sub-id to look for.
		@return The visual scene node which has the given COLLADA sub-id. This pointer
			will be NULL if no visual scene node can be found with the given COLLADA sub-id. */
	inline FCDEntity* FindSubId(const fm::string& subId) { return const_cast<FCDEntity*>(const_cast<const FCDSceneNode*>(this)->FindSubId(subId)); }
	const FCDEntity* FindSubId(const fm::string& subId) const; /**< See above. */

	/** Retrieves whether the visual scene node is visible.
		A hidden visual scene node will not be rendered but will
		still affect the world. This parameter is a floating-point value
		because it is animated. It should be intepreted as a Boolean value.
		@return Whether the scene node is visible. */
	inline FCDParameterAnimatableFloat& GetVisibility() { return visibility; }
	inline const FCDParameterAnimatableFloat& GetVisibility() const { return visibility; } /**< See above. */
	inline bool IsVisible() const { return visibility > 0.5f; } /**< See above. */

	/** Sets the visibility of the visual scene node.
		A hidden visual scene node will not be rendered but will
		still affect the world.
		@param isVisible Whether the visual scene node is visible. */
	inline void SetVisibility(bool isVisible) { visibility = isVisible ? 1.0f : 0.0f; }

	/** Retrieves whether this visual scene node is the target of an entity.
		@return Whether this is an entity target. */
	inline bool IsTarget() const { return targetCount > 0; }

	/** Retrieves whether this visual scene node is a joint.
		Joints are called bones in 3dsMax. A joint is a scene node that is used in skinning.
		@return Whether this node is a joint. */
	DEPRECATED(3.05A, GetJointFlag) bool IsJoint() const { return GetJointFlag(); }

	/** Retrieves the local transform for this visual scene node.
		This function does not handle or apply animations.
		@return The local transform. */
	FMMatrix44 ToMatrix() const;

	/** Retrieves the local transform for this visual scene node.
		This is a shortcut to the above function. The above function
		will be deprecated in the future.
		@return The local transform. */
	inline FMMatrix44 CalculateLocalTransform() const { return ToMatrix(); }

	/** Retrieves the world transform for this visual scene node.
		This function is not optimized and will not work with node instances.
		@return The world transform. */
	FMMatrix44 CalculateWorldTransform() const;

	/** Copies the entity information into a clone.
		All the overwriting functions of this function should call this function
		to copy the COLLADA id and the other entity-level information.
		All the up-classes of this class should implement this function.
		The cloned entity may reside in another document.
		@param clone The empty clone. If this pointer is NULL, a new entity
			will be created and you will need to release the returned pointer manually.
		@param cloneChildren Whether to recursively clone this entity's children.
		@return The clone. */
	virtual FCDEntity* Clone(FCDEntity* clone = NULL, bool cloneChildren = false) const;

	/** [INTERNAL] Increments the number of entities target this node.
		To set targets, use the FCDTargetedEntity::SetTarget function. */
	inline void IncrementTargetCount() { ++targetCount; }

	/** [INTERNAL] Decrements the number of entities target this node.
		To set targets, use the FCDTargetedEntity::SetTarget function. */
	inline void DecrementTargetCount() { if (targetCount > 0) --targetCount; }

	/** [INTERNAL] Cleans up the sub identifiers.
		The sub identifiers must be unique with respect to its parent. This method corrects the sub ids if there are conflicts. */
	virtual void CleanSubId();
};

#endif // _FCD_SCENE_NODE_