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 FCDMorphController.h
|
---|
14 | This file contains the FCDMorphController and the FCDMorphTarget classes.
|
---|
15 | */
|
---|
16 |
|
---|
17 | #ifndef _FCD_MORPH_CONTROLLER_H_
|
---|
18 | #define _FCD_MORPH_CONTROLLER_H_
|
---|
19 |
|
---|
20 | #include "FUtils/FUDaeEnum.h"
|
---|
21 | #include "FCDocument/FCDObject.h"
|
---|
22 |
|
---|
23 | class FCDocument;
|
---|
24 | class FCDController;
|
---|
25 | class FCDGeometry;
|
---|
26 | class FCDMorphController;
|
---|
27 |
|
---|
28 | /**
|
---|
29 | A COLLADA morph target.
|
---|
30 | A morph target is just a geometric entity with a weight assigned.
|
---|
31 | The weight may be animated.
|
---|
32 | */
|
---|
33 | class FCOLLADA_EXPORT FCDMorphTarget : public FCDObject
|
---|
34 | {
|
---|
35 | private:
|
---|
36 | DeclareObjectType;
|
---|
37 | FCDMorphController* parent;
|
---|
38 | FCDGeometry* geometry;
|
---|
39 | float weight;
|
---|
40 |
|
---|
41 | public:
|
---|
42 | /** Constructor: do not use directly.
|
---|
43 | Instead, use the FCDMorphController::AddTarget function.
|
---|
44 | @param document The COLLADA document that owns the morph target.
|
---|
45 | @param parent The morph controller that contains the morph target. */
|
---|
46 | FCDMorphTarget(FCDocument* document, FCDMorphController* parent);
|
---|
47 |
|
---|
48 | /** Destructor. */
|
---|
49 | virtual ~FCDMorphTarget();
|
---|
50 |
|
---|
51 | /** Retrieves the morph controller which contains this target.
|
---|
52 | @return The parent morpher. */
|
---|
53 | FCDMorphController* GetParent() { return parent; }
|
---|
54 | const FCDMorphController* GetParent() const { return parent; } /**< See above. */
|
---|
55 |
|
---|
56 | /** Retrieves the target geometry.
|
---|
57 | This is what the morphed geometry should look like if
|
---|
58 | the morphing weight is set to 1.0f.
|
---|
59 | @return The target geometry. */
|
---|
60 | FCDGeometry* GetGeometry() { return geometry; }
|
---|
61 | const FCDGeometry* GetGeometry() const { return geometry; } /**< See above. */
|
---|
62 |
|
---|
63 | /** Sets the target geometry.
|
---|
64 | This is what the morphed geometry should look like if
|
---|
65 | the morphing weight is set to 1.0f. As such, the target geometry
|
---|
66 | should be similar to the base target geometry. You can verify
|
---|
67 | this using the FCDMorphController::IsSimilar function.
|
---|
68 | @param geometry The target geometry. */
|
---|
69 | void SetGeometry(FCDGeometry* geometry);
|
---|
70 |
|
---|
71 | /** Retrieves the morphing weight.
|
---|
72 | @return The morphing weight. */
|
---|
73 | float& GetWeight() { return weight; }
|
---|
74 | const float& GetWeight() const { return weight; } /**< See above. */
|
---|
75 |
|
---|
76 | /** Sets the morphing weight.
|
---|
77 | This function has no impact on any animations that target the morphing weight.
|
---|
78 | @param _weight The morphing weight. */
|
---|
79 | void SetWeight(float _weight) { weight = _weight; }
|
---|
80 |
|
---|
81 | /** Retrieves whether the morphing weight is animated.
|
---|
82 | @return Whether the morphing weight is animated. */
|
---|
83 | bool IsAnimated() const;
|
---|
84 |
|
---|
85 | /** Retrieves the animation associated with the morphing weight.
|
---|
86 | @return The animated value associated with the morphing weight.
|
---|
87 | This pointer will be NULL if the morphing weight is not animated. */
|
---|
88 | FCDAnimated* GetAnimatedWeight();
|
---|
89 | const FCDAnimated* GetAnimatedWeight() const; /**< See above. */
|
---|
90 | };
|
---|
91 |
|
---|
92 | /** A dynamically-sized array of morph targets. */
|
---|
93 | typedef vector<FCDMorphTarget*> FCDMorphTargetList;
|
---|
94 |
|
---|
95 | /**
|
---|
96 | A COLLADA morpher.
|
---|
97 |
|
---|
98 | A morpher holds a base geometry and a set of morph targets
|
---|
99 | that contains a geometry and a weight. The geometry must be similar to the
|
---|
100 | base geometry and the weights are used to interpolate the vertex positions
|
---|
101 | of the base geometry. To be similar, two meshes must have the same number of
|
---|
102 | vertices and two splines must have the same number of control points.
|
---|
103 | The morphing weights can be animated.
|
---|
104 |
|
---|
105 | There are two interpolation functions defined in COLLADA.
|
---|
106 | See the FUDaeMorphMethod::Method enumerated type for more information.
|
---|
107 |
|
---|
108 | @see FCDMorphTarget FUDaeMorphMethod
|
---|
109 | @ingroup FCDGeometry
|
---|
110 | */
|
---|
111 | class FCOLLADA_EXPORT FCDMorphController : public FCDObject
|
---|
112 | {
|
---|
113 | private:
|
---|
114 | DeclareObjectType;
|
---|
115 | FCDController* parent;
|
---|
116 | FCDocument* document;
|
---|
117 |
|
---|
118 | FUDaeMorphMethod::Method method;
|
---|
119 | FCDEntity* baseTarget;
|
---|
120 | FCDMorphTargetList morphTargets;
|
---|
121 |
|
---|
122 | public:
|
---|
123 | /** Constructor: do not use directly.
|
---|
124 | Instead, use the FCDController::CreateMorphController function.
|
---|
125 | @param document The COLLADA document that owns the morpher.
|
---|
126 | @param parent The COLLADA controller that contains this morpher. */
|
---|
127 | FCDMorphController(FCDocument* document, FCDController* parent);
|
---|
128 |
|
---|
129 | /** Destructor: do not use directly.
|
---|
130 | Instead, release the parent controller or create a new skin/morpher. */
|
---|
131 | virtual ~FCDMorphController();
|
---|
132 |
|
---|
133 | /** Retrieves the base entity controlled by this morpher.
|
---|
134 | This entity may be a geometry or another controller.
|
---|
135 | @return The base target. */
|
---|
136 | FCDEntity* GetBaseTarget() { return baseTarget; }
|
---|
137 | const FCDEntity* GetBaseTarget() const { return baseTarget; } /**< See above. */
|
---|
138 |
|
---|
139 | /** Sets the base entity controlled by this morpher.
|
---|
140 | This entity may be a geometry or another controller.
|
---|
141 | Since the morph targets must be similar to this entity,
|
---|
142 | all the morph targets that are not similar to the new base entity will be removed.
|
---|
143 | @param entity The new base entity. */
|
---|
144 | void SetBaseTarget(FCDEntity* entity);
|
---|
145 |
|
---|
146 | /** Retrieves the list of the morph targets.
|
---|
147 | All the morph target geometries should be similar to the base entity.
|
---|
148 | @return The morph targets. */
|
---|
149 | FCDMorphTargetList& GetTargets() { return morphTargets; }
|
---|
150 | const FCDMorphTargetList& GetTargets() const { return morphTargets; } /**< See above. */
|
---|
151 |
|
---|
152 | /** Retrieves the number of morph targets.
|
---|
153 | @return The number of morph targets. */
|
---|
154 | size_t GetTargetCount() const { return morphTargets.size(); }
|
---|
155 |
|
---|
156 | /** Retrieves a specific morph target.
|
---|
157 | @param index The index of the morph target.
|
---|
158 | @return The morph target. This pointer will be NULL if the index is out-of-bounds. */
|
---|
159 | FCDMorphTarget* GetTarget(size_t index) { FUAssert(index < GetTargetCount(), return NULL); return morphTargets.at(index); }
|
---|
160 | const FCDMorphTarget* GetTarget(size_t index) const { FUAssert(index < GetTargetCount(), return NULL); return morphTargets.at(index); } /**< See above. */
|
---|
161 |
|
---|
162 | /** Adds a new morph target.
|
---|
163 | @param geometry The morph target geometry.
|
---|
164 | @param weight The morphing weight.
|
---|
165 | @return The new morph target. */
|
---|
166 | FCDMorphTarget* AddTarget(FCDGeometry* geometry = NULL, float weight = 0.0f);
|
---|
167 |
|
---|
168 | /** Releases a morph target used in this morpher.
|
---|
169 | @param target The morph target to release. */
|
---|
170 | void ReleaseTarget(FCDMorphTarget* target);
|
---|
171 |
|
---|
172 | /** Retrieves the method used to interpolate between the different morph targets.
|
---|
173 | @return The interpolation method. */
|
---|
174 | FUDaeMorphMethod::Method GetMethod() const { return method; }
|
---|
175 |
|
---|
176 | /** Sets the method used to interpolate between the different morph targets.
|
---|
177 | @param _method The interpolation method. */
|
---|
178 | void SetMethod(FUDaeMorphMethod::Method _method) { method = _method; }
|
---|
179 |
|
---|
180 | /** Retrieves whether a given entity is similar to the base target.
|
---|
181 | Entities must be similar to be able to morph between them.
|
---|
182 | @param entity An entity.
|
---|
183 | @return Whether the given entity is similar to the base target. */
|
---|
184 | bool IsSimilar(FCDEntity* entity);
|
---|
185 |
|
---|
186 | /** [INTERNAL] Reads in the \<morph\> element from a given COLLADA XML tree node.
|
---|
187 | @param morphNode The COLLADA XML tree node.
|
---|
188 | @return The status of the import. If the status is not successful,
|
---|
189 | it may be dangerous to extract information from the morpher.*/
|
---|
190 | FUStatus LoadFromXML(xmlNode* morphNode);
|
---|
191 |
|
---|
192 | /** [INTERNAL] Writes out the \<morph\> element to the given COLLADA XML tree node.
|
---|
193 | @param parentNode The COLLADA XML parent node in which to insert the morphing information.
|
---|
194 | @return The created element XML tree node. */
|
---|
195 | xmlNode* WriteToXML(xmlNode* parentNode) const;
|
---|
196 |
|
---|
197 | /** [INTERNAL] Links the controller with its entities.
|
---|
198 | Since geometries are loaded before the controllers, no linkage is necessary.
|
---|
199 | @return The status of the linkage: always successful. */
|
---|
200 | FUStatus Link();
|
---|
201 | };
|
---|
202 |
|
---|
203 | #endif // _FCD_MORPH_CONTROLLER_H_
|
---|
204 |
|
---|