rev |
line source |
nuclear@0
|
1 /*
|
nuclear@0
|
2 Open Asset Import Library (assimp)
|
nuclear@0
|
3 ----------------------------------------------------------------------
|
nuclear@0
|
4
|
nuclear@0
|
5 Copyright (c) 2006-2012, assimp team
|
nuclear@0
|
6 All rights reserved.
|
nuclear@0
|
7
|
nuclear@0
|
8 Redistribution and use of this software in source and binary forms,
|
nuclear@0
|
9 with or without modification, are permitted provided that the
|
nuclear@0
|
10 following conditions are met:
|
nuclear@0
|
11
|
nuclear@0
|
12 * Redistributions of source code must retain the above
|
nuclear@0
|
13 copyright notice, this list of conditions and the
|
nuclear@0
|
14 following disclaimer.
|
nuclear@0
|
15
|
nuclear@0
|
16 * Redistributions in binary form must reproduce the above
|
nuclear@0
|
17 copyright notice, this list of conditions and the
|
nuclear@0
|
18 following disclaimer in the documentation and/or other
|
nuclear@0
|
19 materials provided with the distribution.
|
nuclear@0
|
20
|
nuclear@0
|
21 * Neither the name of the assimp team, nor the names of its
|
nuclear@0
|
22 contributors may be used to endorse or promote products
|
nuclear@0
|
23 derived from this software without specific prior
|
nuclear@0
|
24 written permission of the assimp team.
|
nuclear@0
|
25
|
nuclear@0
|
26 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
nuclear@0
|
27 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
nuclear@0
|
28 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
nuclear@0
|
29 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
nuclear@0
|
30 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
nuclear@0
|
31 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
nuclear@0
|
32 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
nuclear@0
|
33 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
nuclear@0
|
34 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
nuclear@0
|
35 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
nuclear@0
|
36 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
nuclear@0
|
37
|
nuclear@0
|
38 ----------------------------------------------------------------------
|
nuclear@0
|
39 */
|
nuclear@0
|
40
|
nuclear@0
|
41 /** @file FBXDocument.h
|
nuclear@0
|
42 * @brief FBX DOM
|
nuclear@0
|
43 */
|
nuclear@0
|
44 #ifndef INCLUDED_AI_FBX_DOCUMENT_H
|
nuclear@0
|
45 #define INCLUDED_AI_FBX_DOCUMENT_H
|
nuclear@0
|
46
|
nuclear@0
|
47 #include <vector>
|
nuclear@0
|
48 #include <map>
|
nuclear@0
|
49 #include <string>
|
nuclear@0
|
50
|
nuclear@0
|
51 #include "FBXProperties.h"
|
nuclear@0
|
52
|
nuclear@0
|
53 namespace Assimp {
|
nuclear@0
|
54 namespace FBX {
|
nuclear@0
|
55
|
nuclear@0
|
56 class Parser;
|
nuclear@0
|
57 class Object;
|
nuclear@0
|
58 struct ImportSettings;
|
nuclear@0
|
59
|
nuclear@0
|
60 class PropertyTable;
|
nuclear@0
|
61 class Document;
|
nuclear@0
|
62 class Material;
|
nuclear@0
|
63 class Geometry;
|
nuclear@0
|
64
|
nuclear@0
|
65 class AnimationCurve;
|
nuclear@0
|
66 class AnimationCurveNode;
|
nuclear@0
|
67 class AnimationLayer;
|
nuclear@0
|
68 class AnimationStack;
|
nuclear@0
|
69
|
nuclear@0
|
70 class Skin;
|
nuclear@0
|
71 class Cluster;
|
nuclear@0
|
72
|
nuclear@0
|
73
|
nuclear@0
|
74 /** Represents a delay-parsed FBX objects. Many objects in the scene
|
nuclear@0
|
75 * are not needed by assimp, so it makes no sense to parse them
|
nuclear@0
|
76 * upfront. */
|
nuclear@0
|
77 class LazyObject
|
nuclear@0
|
78 {
|
nuclear@0
|
79 public:
|
nuclear@0
|
80
|
nuclear@0
|
81 LazyObject(uint64_t id, const Element& element, const Document& doc);
|
nuclear@0
|
82 ~LazyObject();
|
nuclear@0
|
83
|
nuclear@0
|
84 public:
|
nuclear@0
|
85
|
nuclear@0
|
86 const Object* Get(bool dieOnError = false);
|
nuclear@0
|
87
|
nuclear@0
|
88 template <typename T>
|
nuclear@0
|
89 const T* Get(bool dieOnError = false) {
|
nuclear@0
|
90 const Object* const ob = Get(dieOnError);
|
nuclear@0
|
91 return ob ? dynamic_cast<const T*>(ob) : NULL;
|
nuclear@0
|
92 }
|
nuclear@0
|
93
|
nuclear@0
|
94 uint64_t ID() const {
|
nuclear@0
|
95 return id;
|
nuclear@0
|
96 }
|
nuclear@0
|
97
|
nuclear@0
|
98 bool IsBeingConstructed() const {
|
nuclear@0
|
99 return (flags & BEING_CONSTRUCTED) != 0;
|
nuclear@0
|
100 }
|
nuclear@0
|
101
|
nuclear@0
|
102 bool FailedToConstruct() const {
|
nuclear@0
|
103 return (flags & FAILED_TO_CONSTRUCT) != 0;
|
nuclear@0
|
104 }
|
nuclear@0
|
105
|
nuclear@0
|
106 const Element& GetElement() const {
|
nuclear@0
|
107 return element;
|
nuclear@0
|
108 }
|
nuclear@0
|
109
|
nuclear@0
|
110 const Document& GetDocument() const {
|
nuclear@0
|
111 return doc;
|
nuclear@0
|
112 }
|
nuclear@0
|
113
|
nuclear@0
|
114 private:
|
nuclear@0
|
115
|
nuclear@0
|
116 const Document& doc;
|
nuclear@0
|
117 const Element& element;
|
nuclear@0
|
118 boost::scoped_ptr<const Object> object;
|
nuclear@0
|
119
|
nuclear@0
|
120 const uint64_t id;
|
nuclear@0
|
121
|
nuclear@0
|
122 enum Flags {
|
nuclear@0
|
123 BEING_CONSTRUCTED = 0x1,
|
nuclear@0
|
124 FAILED_TO_CONSTRUCT = 0x2
|
nuclear@0
|
125 };
|
nuclear@0
|
126
|
nuclear@0
|
127 unsigned int flags;
|
nuclear@0
|
128 };
|
nuclear@0
|
129
|
nuclear@0
|
130
|
nuclear@0
|
131
|
nuclear@0
|
132 /** Base class for in-memory (DOM) representations of FBX objects */
|
nuclear@0
|
133 class Object
|
nuclear@0
|
134 {
|
nuclear@0
|
135 public:
|
nuclear@0
|
136
|
nuclear@0
|
137 Object(uint64_t id, const Element& element, const std::string& name);
|
nuclear@0
|
138 virtual ~Object();
|
nuclear@0
|
139
|
nuclear@0
|
140 public:
|
nuclear@0
|
141
|
nuclear@0
|
142 const Element& SourceElement() const {
|
nuclear@0
|
143 return element;
|
nuclear@0
|
144 }
|
nuclear@0
|
145
|
nuclear@0
|
146 const std::string& Name() const {
|
nuclear@0
|
147 return name;
|
nuclear@0
|
148 }
|
nuclear@0
|
149
|
nuclear@0
|
150 uint64_t ID() const {
|
nuclear@0
|
151 return id;
|
nuclear@0
|
152 }
|
nuclear@0
|
153
|
nuclear@0
|
154 protected:
|
nuclear@0
|
155 const Element& element;
|
nuclear@0
|
156 const std::string name;
|
nuclear@0
|
157 const uint64_t id;
|
nuclear@0
|
158 };
|
nuclear@0
|
159
|
nuclear@0
|
160
|
nuclear@0
|
161
|
nuclear@0
|
162 /** DOM class for generic FBX NoteAttribute blocks. NoteAttribute's just hold a property table,
|
nuclear@0
|
163 * fixed members are added by deriving classes. */
|
nuclear@0
|
164 class NodeAttribute : public Object
|
nuclear@0
|
165 {
|
nuclear@0
|
166 public:
|
nuclear@0
|
167
|
nuclear@0
|
168 NodeAttribute(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
169 ~NodeAttribute();
|
nuclear@0
|
170
|
nuclear@0
|
171 public:
|
nuclear@0
|
172
|
nuclear@0
|
173 const PropertyTable& Props() const {
|
nuclear@0
|
174 ai_assert(props.get());
|
nuclear@0
|
175 return *props.get();
|
nuclear@0
|
176 }
|
nuclear@0
|
177
|
nuclear@0
|
178 private:
|
nuclear@0
|
179
|
nuclear@0
|
180 boost::shared_ptr<const PropertyTable> props;
|
nuclear@0
|
181 };
|
nuclear@0
|
182
|
nuclear@0
|
183
|
nuclear@0
|
184 /** DOM base class for FBX camera settings attached to a node */
|
nuclear@0
|
185 class CameraSwitcher : public NodeAttribute
|
nuclear@0
|
186 {
|
nuclear@0
|
187 public:
|
nuclear@0
|
188
|
nuclear@0
|
189 CameraSwitcher(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
190 ~CameraSwitcher();
|
nuclear@0
|
191
|
nuclear@0
|
192 public:
|
nuclear@0
|
193
|
nuclear@0
|
194 int CameraID() const {
|
nuclear@0
|
195 return cameraId;
|
nuclear@0
|
196 }
|
nuclear@0
|
197
|
nuclear@0
|
198 const std::string& CameraName() const {
|
nuclear@0
|
199 return cameraName;
|
nuclear@0
|
200 }
|
nuclear@0
|
201
|
nuclear@0
|
202
|
nuclear@0
|
203 const std::string& CameraIndexName() const {
|
nuclear@0
|
204 return cameraIndexName;
|
nuclear@0
|
205 }
|
nuclear@0
|
206
|
nuclear@0
|
207 private:
|
nuclear@0
|
208
|
nuclear@0
|
209 int cameraId;
|
nuclear@0
|
210 std::string cameraName;
|
nuclear@0
|
211 std::string cameraIndexName;
|
nuclear@0
|
212 };
|
nuclear@0
|
213
|
nuclear@0
|
214
|
nuclear@0
|
215 #define fbx_stringize(a) #a
|
nuclear@0
|
216
|
nuclear@0
|
217 #define fbx_simple_property(name, type, default_value) \
|
nuclear@0
|
218 type name() const { \
|
nuclear@0
|
219 return PropertyGet<type>(Props(), fbx_stringize(name), (default_value)); \
|
nuclear@0
|
220 }
|
nuclear@0
|
221
|
nuclear@0
|
222 // XXX improve logging
|
nuclear@0
|
223 #define fbx_simple_enum_property(name, type, default_value) \
|
nuclear@0
|
224 type name() const { \
|
nuclear@0
|
225 const int ival = PropertyGet<int>(Props(), fbx_stringize(name), static_cast<int>(default_value)); \
|
nuclear@0
|
226 if (ival < 0 || ival >= AI_CONCAT(type, _MAX)) { \
|
nuclear@0
|
227 ai_assert(static_cast<int>(default_value) >= 0 && static_cast<int>(default_value) < AI_CONCAT(type, _MAX)); \
|
nuclear@0
|
228 return static_cast<type>(default_value); \
|
nuclear@0
|
229 } \
|
nuclear@0
|
230 return static_cast<type>(ival); \
|
nuclear@0
|
231 }
|
nuclear@0
|
232
|
nuclear@0
|
233
|
nuclear@0
|
234
|
nuclear@0
|
235 /** DOM base class for FBX cameras attached to a node */
|
nuclear@0
|
236 class Camera : public NodeAttribute
|
nuclear@0
|
237 {
|
nuclear@0
|
238 public:
|
nuclear@0
|
239
|
nuclear@0
|
240 Camera(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
241 ~Camera();
|
nuclear@0
|
242
|
nuclear@0
|
243 public:
|
nuclear@0
|
244
|
nuclear@0
|
245 fbx_simple_property(Position, aiVector3D, aiVector3D(0,0,0));
|
nuclear@0
|
246 fbx_simple_property(UpVector, aiVector3D, aiVector3D(0,1,0));
|
nuclear@0
|
247 fbx_simple_property(InterestPosition, aiVector3D, aiVector3D(0,0,0));
|
nuclear@0
|
248
|
nuclear@0
|
249 fbx_simple_property(AspectWidth, float, 1.0f);
|
nuclear@0
|
250 fbx_simple_property(AspectHeight, float, 1.0f);
|
nuclear@0
|
251 fbx_simple_property(FilmWidth, float, 1.0f);
|
nuclear@0
|
252 fbx_simple_property(FilmHeight, float, 1.0f);
|
nuclear@0
|
253
|
nuclear@0
|
254 fbx_simple_property(FilmAspectRatio, float, 1.0f);
|
nuclear@0
|
255 fbx_simple_property(ApertureMode, int, 0);
|
nuclear@0
|
256
|
nuclear@0
|
257 fbx_simple_property(FieldOfView, float, 1.0f);
|
nuclear@0
|
258 fbx_simple_property(FocalLength, float, 1.0f);
|
nuclear@0
|
259
|
nuclear@0
|
260 private:
|
nuclear@0
|
261 };
|
nuclear@0
|
262
|
nuclear@0
|
263
|
nuclear@0
|
264 /** DOM base class for FBX null markers attached to a node */
|
nuclear@0
|
265 class Null : public NodeAttribute
|
nuclear@0
|
266 {
|
nuclear@0
|
267 public:
|
nuclear@0
|
268
|
nuclear@0
|
269 Null(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
270 ~Null();
|
nuclear@0
|
271 };
|
nuclear@0
|
272
|
nuclear@0
|
273
|
nuclear@0
|
274 /** DOM base class for FBX limb node markers attached to a node */
|
nuclear@0
|
275 class LimbNode : public NodeAttribute
|
nuclear@0
|
276 {
|
nuclear@0
|
277 public:
|
nuclear@0
|
278
|
nuclear@0
|
279 LimbNode(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
280 ~LimbNode();
|
nuclear@0
|
281 };
|
nuclear@0
|
282
|
nuclear@0
|
283
|
nuclear@0
|
284 /** DOM base class for FBX lights attached to a node */
|
nuclear@0
|
285 class Light : public NodeAttribute
|
nuclear@0
|
286 {
|
nuclear@0
|
287 public:
|
nuclear@0
|
288
|
nuclear@0
|
289 Light(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
290 ~Light();
|
nuclear@0
|
291
|
nuclear@0
|
292 public:
|
nuclear@0
|
293
|
nuclear@0
|
294 enum Type
|
nuclear@0
|
295 {
|
nuclear@0
|
296 Type_Point,
|
nuclear@0
|
297 Type_Directional,
|
nuclear@0
|
298 Type_Spot,
|
nuclear@0
|
299 Type_Area,
|
nuclear@0
|
300 Type_Volume,
|
nuclear@0
|
301
|
nuclear@0
|
302 Type_MAX // end-of-enum sentinel
|
nuclear@0
|
303 };
|
nuclear@0
|
304
|
nuclear@0
|
305 enum Decay
|
nuclear@0
|
306 {
|
nuclear@0
|
307 Decay_None,
|
nuclear@0
|
308 Decay_Linear,
|
nuclear@0
|
309 Decay_Quadratic,
|
nuclear@0
|
310 Decay_Cubic,
|
nuclear@0
|
311
|
nuclear@0
|
312 Decay_MAX // end-of-enum sentinel
|
nuclear@0
|
313 };
|
nuclear@0
|
314
|
nuclear@0
|
315 public:
|
nuclear@0
|
316
|
nuclear@0
|
317 fbx_simple_property(Color, aiVector3D, aiVector3D(1,1,1));
|
nuclear@0
|
318 fbx_simple_enum_property(LightType, Type, 0);
|
nuclear@0
|
319 fbx_simple_property(CastLightOnObject, bool, false);
|
nuclear@0
|
320 fbx_simple_property(DrawVolumetricLight, bool, true);
|
nuclear@0
|
321 fbx_simple_property(DrawGroundProjection, bool, true);
|
nuclear@0
|
322 fbx_simple_property(DrawFrontFacingVolumetricLight, bool, false);
|
nuclear@0
|
323 fbx_simple_property(Intensity, float, 1.0f);
|
nuclear@0
|
324 fbx_simple_property(InnerAngle, float, 0.0f);
|
nuclear@0
|
325 fbx_simple_property(OuterAngle, float, 45.0f);
|
nuclear@0
|
326 fbx_simple_property(Fog, int, 50);
|
nuclear@0
|
327 fbx_simple_enum_property(DecayType, Decay, 0);
|
nuclear@0
|
328 fbx_simple_property(DecayStart, int, 0);
|
nuclear@0
|
329 fbx_simple_property(FileName, std::string, "");
|
nuclear@0
|
330
|
nuclear@0
|
331 fbx_simple_property(EnableNearAttenuation, bool, false);
|
nuclear@0
|
332 fbx_simple_property(NearAttenuationStart, float, 0.0f);
|
nuclear@0
|
333 fbx_simple_property(NearAttenuationEnd, float, 0.0f);
|
nuclear@0
|
334 fbx_simple_property(EnableFarAttenuation, bool, false);
|
nuclear@0
|
335 fbx_simple_property(FarAttenuationStart, float, 0.0f);
|
nuclear@0
|
336 fbx_simple_property(FarAttenuationEnd, float, 0.0f);
|
nuclear@0
|
337
|
nuclear@0
|
338 fbx_simple_property(CastShadows, bool, true);
|
nuclear@0
|
339 fbx_simple_property(ShadowColor, aiVector3D, aiVector3D(0,0,0));
|
nuclear@0
|
340
|
nuclear@0
|
341 fbx_simple_property(AreaLightShape, int, 0);
|
nuclear@0
|
342
|
nuclear@0
|
343 fbx_simple_property(LeftBarnDoor, float, 20.0f);
|
nuclear@0
|
344 fbx_simple_property(RightBarnDoor, float, 20.0f);
|
nuclear@0
|
345 fbx_simple_property(TopBarnDoor, float, 20.0f);
|
nuclear@0
|
346 fbx_simple_property(BottomBarnDoor, float, 20.0f);
|
nuclear@0
|
347 fbx_simple_property(EnableBarnDoor, bool, true);
|
nuclear@0
|
348
|
nuclear@0
|
349
|
nuclear@0
|
350 private:
|
nuclear@0
|
351 };
|
nuclear@0
|
352
|
nuclear@0
|
353
|
nuclear@0
|
354 /** DOM base class for FBX models (even though its semantics are more "node" than "model" */
|
nuclear@0
|
355 class Model : public Object
|
nuclear@0
|
356 {
|
nuclear@0
|
357 public:
|
nuclear@0
|
358
|
nuclear@0
|
359 Model(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
360 ~Model();
|
nuclear@0
|
361
|
nuclear@0
|
362 public:
|
nuclear@0
|
363
|
nuclear@0
|
364 enum RotOrder
|
nuclear@0
|
365 {
|
nuclear@0
|
366 RotOrder_EulerXYZ = 0,
|
nuclear@0
|
367 RotOrder_EulerXZY,
|
nuclear@0
|
368 RotOrder_EulerYZX,
|
nuclear@0
|
369 RotOrder_EulerYXZ,
|
nuclear@0
|
370 RotOrder_EulerZXY,
|
nuclear@0
|
371 RotOrder_EulerZYX,
|
nuclear@0
|
372
|
nuclear@0
|
373 RotOrder_SphericXYZ,
|
nuclear@0
|
374
|
nuclear@0
|
375 RotOrder_MAX // end-of-enum sentinel
|
nuclear@0
|
376 };
|
nuclear@0
|
377
|
nuclear@0
|
378
|
nuclear@0
|
379 enum TransformInheritance
|
nuclear@0
|
380 {
|
nuclear@0
|
381 TransformInheritance_RrSs = 0,
|
nuclear@0
|
382 TransformInheritance_RSrs,
|
nuclear@0
|
383 TransformInheritance_Rrs,
|
nuclear@0
|
384
|
nuclear@0
|
385 TransformInheritance_MAX // end-of-enum sentinel
|
nuclear@0
|
386 };
|
nuclear@0
|
387
|
nuclear@0
|
388 public:
|
nuclear@0
|
389
|
nuclear@0
|
390 fbx_simple_property(QuaternionInterpolate, int, 0);
|
nuclear@0
|
391
|
nuclear@0
|
392 fbx_simple_property(RotationOffset, aiVector3D, aiVector3D());
|
nuclear@0
|
393 fbx_simple_property(RotationPivot, aiVector3D, aiVector3D());
|
nuclear@0
|
394 fbx_simple_property(ScalingOffset, aiVector3D, aiVector3D());
|
nuclear@0
|
395 fbx_simple_property(ScalingPivot, aiVector3D, aiVector3D());
|
nuclear@0
|
396 fbx_simple_property(TranslationActive, bool, false);
|
nuclear@0
|
397
|
nuclear@0
|
398 fbx_simple_property(TranslationMin, aiVector3D, aiVector3D());
|
nuclear@0
|
399 fbx_simple_property(TranslationMax, aiVector3D, aiVector3D());
|
nuclear@0
|
400
|
nuclear@0
|
401 fbx_simple_property(TranslationMinX, bool, false);
|
nuclear@0
|
402 fbx_simple_property(TranslationMaxX, bool, false);
|
nuclear@0
|
403 fbx_simple_property(TranslationMinY, bool, false);
|
nuclear@0
|
404 fbx_simple_property(TranslationMaxY, bool, false);
|
nuclear@0
|
405 fbx_simple_property(TranslationMinZ, bool, false);
|
nuclear@0
|
406 fbx_simple_property(TranslationMaxZ, bool, false);
|
nuclear@0
|
407
|
nuclear@0
|
408 fbx_simple_enum_property(RotationOrder, RotOrder, 0);
|
nuclear@0
|
409 fbx_simple_property(RotationSpaceForLimitOnly, bool, false);
|
nuclear@0
|
410 fbx_simple_property(RotationStiffnessX, float, 0.0f);
|
nuclear@0
|
411 fbx_simple_property(RotationStiffnessY, float, 0.0f);
|
nuclear@0
|
412 fbx_simple_property(RotationStiffnessZ, float, 0.0f);
|
nuclear@0
|
413 fbx_simple_property(AxisLen, float, 0.0f);
|
nuclear@0
|
414
|
nuclear@0
|
415 fbx_simple_property(PreRotation, aiVector3D, aiVector3D());
|
nuclear@0
|
416 fbx_simple_property(PostRotation, aiVector3D, aiVector3D());
|
nuclear@0
|
417 fbx_simple_property(RotationActive, bool, false);
|
nuclear@0
|
418
|
nuclear@0
|
419 fbx_simple_property(RotationMin, aiVector3D, aiVector3D());
|
nuclear@0
|
420 fbx_simple_property(RotationMax, aiVector3D, aiVector3D());
|
nuclear@0
|
421
|
nuclear@0
|
422 fbx_simple_property(RotationMinX, bool, false);
|
nuclear@0
|
423 fbx_simple_property(RotationMaxX, bool, false);
|
nuclear@0
|
424 fbx_simple_property(RotationMinY, bool, false);
|
nuclear@0
|
425 fbx_simple_property(RotationMaxY, bool, false);
|
nuclear@0
|
426 fbx_simple_property(RotationMinZ, bool, false);
|
nuclear@0
|
427 fbx_simple_property(RotationMaxZ, bool, false);
|
nuclear@0
|
428 fbx_simple_enum_property(InheritType, TransformInheritance, 0);
|
nuclear@0
|
429
|
nuclear@0
|
430 fbx_simple_property(ScalingActive, bool, false);
|
nuclear@0
|
431 fbx_simple_property(ScalingMin, aiVector3D, aiVector3D());
|
nuclear@0
|
432 fbx_simple_property(ScalingMax, aiVector3D, aiVector3D(1.f,1.f,1.f));
|
nuclear@0
|
433 fbx_simple_property(ScalingMinX, bool, false);
|
nuclear@0
|
434 fbx_simple_property(ScalingMaxX, bool, false);
|
nuclear@0
|
435 fbx_simple_property(ScalingMinY, bool, false);
|
nuclear@0
|
436 fbx_simple_property(ScalingMaxY, bool, false);
|
nuclear@0
|
437 fbx_simple_property(ScalingMinZ, bool, false);
|
nuclear@0
|
438 fbx_simple_property(ScalingMaxZ, bool, false);
|
nuclear@0
|
439
|
nuclear@0
|
440 fbx_simple_property(GeometricTranslation, aiVector3D, aiVector3D());
|
nuclear@0
|
441 fbx_simple_property(GeometricRotation, aiVector3D, aiVector3D());
|
nuclear@0
|
442 fbx_simple_property(GeometricScaling, aiVector3D, aiVector3D(1.f, 1.f, 1.f));
|
nuclear@0
|
443
|
nuclear@0
|
444 fbx_simple_property(MinDampRangeX, float, 0.0f);
|
nuclear@0
|
445 fbx_simple_property(MinDampRangeY, float, 0.0f);
|
nuclear@0
|
446 fbx_simple_property(MinDampRangeZ, float, 0.0f);
|
nuclear@0
|
447 fbx_simple_property(MaxDampRangeX, float, 0.0f);
|
nuclear@0
|
448 fbx_simple_property(MaxDampRangeY, float, 0.0f);
|
nuclear@0
|
449 fbx_simple_property(MaxDampRangeZ, float, 0.0f);
|
nuclear@0
|
450
|
nuclear@0
|
451 fbx_simple_property(MinDampStrengthX, float, 0.0f);
|
nuclear@0
|
452 fbx_simple_property(MinDampStrengthY, float, 0.0f);
|
nuclear@0
|
453 fbx_simple_property(MinDampStrengthZ, float, 0.0f);
|
nuclear@0
|
454 fbx_simple_property(MaxDampStrengthX, float, 0.0f);
|
nuclear@0
|
455 fbx_simple_property(MaxDampStrengthY, float, 0.0f);
|
nuclear@0
|
456 fbx_simple_property(MaxDampStrengthZ, float, 0.0f);
|
nuclear@0
|
457
|
nuclear@0
|
458 fbx_simple_property(PreferredAngleX, float, 0.0f);
|
nuclear@0
|
459 fbx_simple_property(PreferredAngleY, float, 0.0f);
|
nuclear@0
|
460 fbx_simple_property(PreferredAngleZ, float, 0.0f);
|
nuclear@0
|
461
|
nuclear@0
|
462 fbx_simple_property(Show, bool, true);
|
nuclear@0
|
463 fbx_simple_property(LODBox, bool, false);
|
nuclear@0
|
464 fbx_simple_property(Freeze, bool, false);
|
nuclear@0
|
465
|
nuclear@0
|
466 public:
|
nuclear@0
|
467
|
nuclear@0
|
468 const std::string& Shading() const {
|
nuclear@0
|
469 return shading;
|
nuclear@0
|
470 }
|
nuclear@0
|
471
|
nuclear@0
|
472 const std::string& Culling() const {
|
nuclear@0
|
473 return culling;
|
nuclear@0
|
474 }
|
nuclear@0
|
475
|
nuclear@0
|
476 const PropertyTable& Props() const {
|
nuclear@0
|
477 ai_assert(props.get());
|
nuclear@0
|
478 return *props.get();
|
nuclear@0
|
479 }
|
nuclear@0
|
480
|
nuclear@0
|
481 /** Get material links */
|
nuclear@0
|
482 const std::vector<const Material*>& GetMaterials() const {
|
nuclear@0
|
483 return materials;
|
nuclear@0
|
484 }
|
nuclear@0
|
485
|
nuclear@0
|
486
|
nuclear@0
|
487 /** Get geometry links */
|
nuclear@0
|
488 const std::vector<const Geometry*>& GetGeometry() const {
|
nuclear@0
|
489 return geometry;
|
nuclear@0
|
490 }
|
nuclear@0
|
491
|
nuclear@0
|
492
|
nuclear@0
|
493 /** Get node attachments */
|
nuclear@0
|
494 const std::vector<const NodeAttribute*>& GetAttributes() const {
|
nuclear@0
|
495 return attributes;
|
nuclear@0
|
496 }
|
nuclear@0
|
497
|
nuclear@0
|
498 public:
|
nuclear@0
|
499
|
nuclear@0
|
500 /** convenience method to check if the node has a Null node marker */
|
nuclear@0
|
501 bool IsNull() const;
|
nuclear@0
|
502
|
nuclear@0
|
503
|
nuclear@0
|
504 private:
|
nuclear@0
|
505
|
nuclear@0
|
506 void ResolveLinks(const Element& element, const Document& doc);
|
nuclear@0
|
507
|
nuclear@0
|
508 private:
|
nuclear@0
|
509
|
nuclear@0
|
510 std::vector<const Material*> materials;
|
nuclear@0
|
511 std::vector<const Geometry*> geometry;
|
nuclear@0
|
512 std::vector<const NodeAttribute*> attributes;
|
nuclear@0
|
513
|
nuclear@0
|
514 std::string shading;
|
nuclear@0
|
515 std::string culling;
|
nuclear@0
|
516 boost::shared_ptr<const PropertyTable> props;
|
nuclear@0
|
517 };
|
nuclear@0
|
518
|
nuclear@0
|
519
|
nuclear@0
|
520
|
nuclear@0
|
521 /** DOM class for generic FBX textures */
|
nuclear@0
|
522 class Texture : public Object
|
nuclear@0
|
523 {
|
nuclear@0
|
524 public:
|
nuclear@0
|
525
|
nuclear@0
|
526 Texture(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
527 ~Texture();
|
nuclear@0
|
528
|
nuclear@0
|
529 public:
|
nuclear@0
|
530
|
nuclear@0
|
531 const std::string& Type() const {
|
nuclear@0
|
532 return type;
|
nuclear@0
|
533 }
|
nuclear@0
|
534
|
nuclear@0
|
535 const std::string& FileName() const {
|
nuclear@0
|
536 return fileName;
|
nuclear@0
|
537 }
|
nuclear@0
|
538
|
nuclear@0
|
539 const std::string& RelativeFilename() const {
|
nuclear@0
|
540 return relativeFileName;
|
nuclear@0
|
541 }
|
nuclear@0
|
542
|
nuclear@0
|
543 const std::string& AlphaSource() const {
|
nuclear@0
|
544 return alphaSource;
|
nuclear@0
|
545 }
|
nuclear@0
|
546
|
nuclear@0
|
547 const aiVector2D& UVTranslation() const {
|
nuclear@0
|
548 return uvTrans;
|
nuclear@0
|
549 }
|
nuclear@0
|
550
|
nuclear@0
|
551 const aiVector2D& UVScaling() const {
|
nuclear@0
|
552 return uvScaling;
|
nuclear@0
|
553 }
|
nuclear@0
|
554
|
nuclear@0
|
555 const PropertyTable& Props() const {
|
nuclear@0
|
556 ai_assert(props.get());
|
nuclear@0
|
557 return *props.get();
|
nuclear@0
|
558 }
|
nuclear@0
|
559
|
nuclear@0
|
560 // return a 4-tuple
|
nuclear@0
|
561 const unsigned int* Crop() const {
|
nuclear@0
|
562 return crop;
|
nuclear@0
|
563 }
|
nuclear@0
|
564
|
nuclear@0
|
565 private:
|
nuclear@0
|
566
|
nuclear@0
|
567 aiVector2D uvTrans;
|
nuclear@0
|
568 aiVector2D uvScaling;
|
nuclear@0
|
569
|
nuclear@0
|
570 std::string type;
|
nuclear@0
|
571 std::string relativeFileName;
|
nuclear@0
|
572 std::string fileName;
|
nuclear@0
|
573 std::string alphaSource;
|
nuclear@0
|
574 boost::shared_ptr<const PropertyTable> props;
|
nuclear@0
|
575
|
nuclear@0
|
576 unsigned int crop[4];
|
nuclear@0
|
577 };
|
nuclear@0
|
578
|
nuclear@0
|
579
|
nuclear@0
|
580 typedef std::fbx_unordered_map<std::string, const Texture*> TextureMap;
|
nuclear@0
|
581
|
nuclear@0
|
582
|
nuclear@0
|
583 /** DOM class for generic FBX materials */
|
nuclear@0
|
584 class Material : public Object
|
nuclear@0
|
585 {
|
nuclear@0
|
586 public:
|
nuclear@0
|
587
|
nuclear@0
|
588 Material(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
589 ~Material();
|
nuclear@0
|
590
|
nuclear@0
|
591 public:
|
nuclear@0
|
592
|
nuclear@0
|
593 const std::string& GetShadingModel() const {
|
nuclear@0
|
594 return shading;
|
nuclear@0
|
595 }
|
nuclear@0
|
596
|
nuclear@0
|
597 bool IsMultilayer() const {
|
nuclear@0
|
598 return multilayer;
|
nuclear@0
|
599 }
|
nuclear@0
|
600
|
nuclear@0
|
601 const PropertyTable& Props() const {
|
nuclear@0
|
602 ai_assert(props.get());
|
nuclear@0
|
603 return *props.get();
|
nuclear@0
|
604 }
|
nuclear@0
|
605
|
nuclear@0
|
606 const TextureMap& Textures() const {
|
nuclear@0
|
607 return textures;
|
nuclear@0
|
608 }
|
nuclear@0
|
609
|
nuclear@0
|
610 private:
|
nuclear@0
|
611
|
nuclear@0
|
612 std::string shading;
|
nuclear@0
|
613 bool multilayer;
|
nuclear@0
|
614 boost::shared_ptr<const PropertyTable> props;
|
nuclear@0
|
615
|
nuclear@0
|
616 TextureMap textures;
|
nuclear@0
|
617 };
|
nuclear@0
|
618
|
nuclear@0
|
619
|
nuclear@0
|
620 /** DOM base class for all kinds of FBX geometry */
|
nuclear@0
|
621 class Geometry : public Object
|
nuclear@0
|
622 {
|
nuclear@0
|
623 public:
|
nuclear@0
|
624
|
nuclear@0
|
625 Geometry(uint64_t id, const Element& element, const std::string& name, const Document& doc);
|
nuclear@0
|
626 ~Geometry();
|
nuclear@0
|
627
|
nuclear@0
|
628 public:
|
nuclear@0
|
629
|
nuclear@0
|
630 /** Get the Skin attached to this geometry or NULL */
|
nuclear@0
|
631 const Skin* const DeformerSkin() const {
|
nuclear@0
|
632 return skin;
|
nuclear@0
|
633 }
|
nuclear@0
|
634
|
nuclear@0
|
635 private:
|
nuclear@0
|
636
|
nuclear@0
|
637 const Skin* skin;
|
nuclear@0
|
638 };
|
nuclear@0
|
639
|
nuclear@0
|
640
|
nuclear@0
|
641 typedef std::vector<int> MatIndexArray;
|
nuclear@0
|
642
|
nuclear@0
|
643
|
nuclear@0
|
644 /** DOM class for FBX geometry of type "Mesh"*/
|
nuclear@0
|
645 class MeshGeometry : public Geometry
|
nuclear@0
|
646 {
|
nuclear@0
|
647
|
nuclear@0
|
648 public:
|
nuclear@0
|
649
|
nuclear@0
|
650 MeshGeometry(uint64_t id, const Element& element, const std::string& name, const Document& doc);
|
nuclear@0
|
651 ~MeshGeometry();
|
nuclear@0
|
652
|
nuclear@0
|
653 public:
|
nuclear@0
|
654
|
nuclear@0
|
655 /** Get a list of all vertex points, non-unique*/
|
nuclear@0
|
656 const std::vector<aiVector3D>& GetVertices() const {
|
nuclear@0
|
657 return vertices;
|
nuclear@0
|
658 }
|
nuclear@0
|
659
|
nuclear@0
|
660 /** Get a list of all vertex normals or an empty array if
|
nuclear@0
|
661 * no normals are specified. */
|
nuclear@0
|
662 const std::vector<aiVector3D>& GetNormals() const {
|
nuclear@0
|
663 return normals;
|
nuclear@0
|
664 }
|
nuclear@0
|
665
|
nuclear@0
|
666 /** Get a list of all vertex tangents or an empty array
|
nuclear@0
|
667 * if no tangents are specified */
|
nuclear@0
|
668 const std::vector<aiVector3D>& GetTangents() const {
|
nuclear@0
|
669 return tangents;
|
nuclear@0
|
670 }
|
nuclear@0
|
671
|
nuclear@0
|
672 /** Get a list of all vertex binormals or an empty array
|
nuclear@0
|
673 * if no binormals are specified */
|
nuclear@0
|
674 const std::vector<aiVector3D>& GetBinormals() const {
|
nuclear@0
|
675 return binormals;
|
nuclear@0
|
676 }
|
nuclear@0
|
677
|
nuclear@0
|
678 /** Return list of faces - each entry denotes a face and specifies
|
nuclear@0
|
679 * how many vertices it has. Vertices are taken from the
|
nuclear@0
|
680 * vertex data arrays in sequential order. */
|
nuclear@0
|
681 const std::vector<unsigned int>& GetFaceIndexCounts() const {
|
nuclear@0
|
682 return faces;
|
nuclear@0
|
683 }
|
nuclear@0
|
684
|
nuclear@0
|
685 /** Get a UV coordinate slot, returns an empty array if
|
nuclear@0
|
686 * the requested slot does not exist. */
|
nuclear@0
|
687 const std::vector<aiVector2D>& GetTextureCoords(unsigned int index) const {
|
nuclear@0
|
688 static const std::vector<aiVector2D> empty;
|
nuclear@0
|
689 return index >= AI_MAX_NUMBER_OF_TEXTURECOORDS ? empty : uvs[index];
|
nuclear@0
|
690 }
|
nuclear@0
|
691
|
nuclear@0
|
692
|
nuclear@0
|
693 /** Get a UV coordinate slot, returns an empty array if
|
nuclear@0
|
694 * the requested slot does not exist. */
|
nuclear@0
|
695 std::string GetTextureCoordChannelName(unsigned int index) const {
|
nuclear@0
|
696 return index >= AI_MAX_NUMBER_OF_TEXTURECOORDS ? "" : uvNames[index];
|
nuclear@0
|
697 }
|
nuclear@0
|
698
|
nuclear@0
|
699 /** Get a vertex color coordinate slot, returns an empty array if
|
nuclear@0
|
700 * the requested slot does not exist. */
|
nuclear@0
|
701 const std::vector<aiColor4D>& GetVertexColors(unsigned int index) const {
|
nuclear@0
|
702 static const std::vector<aiColor4D> empty;
|
nuclear@0
|
703 return index >= AI_MAX_NUMBER_OF_COLOR_SETS ? empty : colors[index];
|
nuclear@0
|
704 }
|
nuclear@0
|
705
|
nuclear@0
|
706
|
nuclear@0
|
707 /** Get per-face-vertex material assignments */
|
nuclear@0
|
708 const MatIndexArray& GetMaterialIndices() const {
|
nuclear@0
|
709 return materials;
|
nuclear@0
|
710 }
|
nuclear@0
|
711
|
nuclear@0
|
712
|
nuclear@0
|
713 /** Convert from a fbx file vertex index (for example from a #Cluster weight) or NULL
|
nuclear@0
|
714 * if the vertex index is not valid. */
|
nuclear@0
|
715 const unsigned int* ToOutputVertexIndex(unsigned int in_index, unsigned int& count) const {
|
nuclear@0
|
716 if(in_index >= mapping_counts.size()) {
|
nuclear@0
|
717 return NULL;
|
nuclear@0
|
718 }
|
nuclear@0
|
719
|
nuclear@0
|
720 ai_assert(mapping_counts.size() == mapping_offsets.size());
|
nuclear@0
|
721 count = mapping_counts[in_index];
|
nuclear@0
|
722
|
nuclear@0
|
723 ai_assert(count != 0);
|
nuclear@0
|
724 ai_assert(mapping_offsets[in_index] + count <= mappings.size());
|
nuclear@0
|
725
|
nuclear@0
|
726 return &mappings[mapping_offsets[in_index]];
|
nuclear@0
|
727 }
|
nuclear@0
|
728
|
nuclear@0
|
729
|
nuclear@0
|
730 /** Determine the face to which a particular output vertex index belongs.
|
nuclear@0
|
731 * This mapping is always unique. */
|
nuclear@0
|
732 unsigned int FaceForVertexIndex(unsigned int in_index) const {
|
nuclear@0
|
733 ai_assert(in_index < vertices.size());
|
nuclear@0
|
734
|
nuclear@0
|
735 // in the current conversion pattern this will only be needed if
|
nuclear@0
|
736 // weights are present, so no need to always pre-compute this table
|
nuclear@0
|
737 if (facesVertexStartIndices.empty()) {
|
nuclear@0
|
738 facesVertexStartIndices.resize(faces.size() + 1, 0);
|
nuclear@0
|
739
|
nuclear@0
|
740 std::partial_sum(faces.begin(), faces.end(), facesVertexStartIndices.begin() + 1);
|
nuclear@0
|
741 facesVertexStartIndices.pop_back();
|
nuclear@0
|
742 }
|
nuclear@0
|
743
|
nuclear@0
|
744 ai_assert(facesVertexStartIndices.size() == faces.size());
|
nuclear@0
|
745 const std::vector<unsigned int>::iterator it = std::upper_bound(
|
nuclear@0
|
746 facesVertexStartIndices.begin(),
|
nuclear@0
|
747 facesVertexStartIndices.end(),
|
nuclear@0
|
748 in_index
|
nuclear@0
|
749 );
|
nuclear@0
|
750
|
nuclear@0
|
751 return static_cast<unsigned int>(std::distance(facesVertexStartIndices.begin(), it - 1));
|
nuclear@0
|
752 }
|
nuclear@0
|
753
|
nuclear@0
|
754 public:
|
nuclear@0
|
755
|
nuclear@0
|
756 private:
|
nuclear@0
|
757
|
nuclear@0
|
758 void ReadLayer(const Scope& layer);
|
nuclear@0
|
759 void ReadLayerElement(const Scope& layerElement);
|
nuclear@0
|
760 void ReadVertexData(const std::string& type, int index, const Scope& source);
|
nuclear@0
|
761
|
nuclear@0
|
762 void ReadVertexDataUV(std::vector<aiVector2D>& uv_out, const Scope& source,
|
nuclear@0
|
763 const std::string& MappingInformationType,
|
nuclear@0
|
764 const std::string& ReferenceInformationType);
|
nuclear@0
|
765
|
nuclear@0
|
766 void ReadVertexDataNormals(std::vector<aiVector3D>& normals_out, const Scope& source,
|
nuclear@0
|
767 const std::string& MappingInformationType,
|
nuclear@0
|
768 const std::string& ReferenceInformationType);
|
nuclear@0
|
769
|
nuclear@0
|
770 void ReadVertexDataColors(std::vector<aiColor4D>& colors_out, const Scope& source,
|
nuclear@0
|
771 const std::string& MappingInformationType,
|
nuclear@0
|
772 const std::string& ReferenceInformationType);
|
nuclear@0
|
773
|
nuclear@0
|
774 void ReadVertexDataTangents(std::vector<aiVector3D>& tangents_out, const Scope& source,
|
nuclear@0
|
775 const std::string& MappingInformationType,
|
nuclear@0
|
776 const std::string& ReferenceInformationType);
|
nuclear@0
|
777
|
nuclear@0
|
778 void ReadVertexDataBinormals(std::vector<aiVector3D>& binormals_out, const Scope& source,
|
nuclear@0
|
779 const std::string& MappingInformationType,
|
nuclear@0
|
780 const std::string& ReferenceInformationType);
|
nuclear@0
|
781
|
nuclear@0
|
782 void ReadVertexDataMaterials(MatIndexArray& materials_out, const Scope& source,
|
nuclear@0
|
783 const std::string& MappingInformationType,
|
nuclear@0
|
784 const std::string& ReferenceInformationType);
|
nuclear@0
|
785
|
nuclear@0
|
786 private:
|
nuclear@0
|
787
|
nuclear@0
|
788 // cached data arrays
|
nuclear@0
|
789 MatIndexArray materials;
|
nuclear@0
|
790 std::vector<aiVector3D> vertices;
|
nuclear@0
|
791 std::vector<unsigned int> faces;
|
nuclear@0
|
792 mutable std::vector<unsigned int> facesVertexStartIndices;
|
nuclear@0
|
793 std::vector<aiVector3D> tangents;
|
nuclear@0
|
794 std::vector<aiVector3D> binormals;
|
nuclear@0
|
795 std::vector<aiVector3D> normals;
|
nuclear@0
|
796
|
nuclear@0
|
797 std::string uvNames[AI_MAX_NUMBER_OF_TEXTURECOORDS];
|
nuclear@0
|
798 std::vector<aiVector2D> uvs[AI_MAX_NUMBER_OF_TEXTURECOORDS];
|
nuclear@0
|
799 std::vector<aiColor4D> colors[AI_MAX_NUMBER_OF_COLOR_SETS];
|
nuclear@0
|
800
|
nuclear@0
|
801 std::vector<unsigned int> mapping_counts;
|
nuclear@0
|
802 std::vector<unsigned int> mapping_offsets;
|
nuclear@0
|
803 std::vector<unsigned int> mappings;
|
nuclear@0
|
804 };
|
nuclear@0
|
805
|
nuclear@0
|
806 typedef std::vector<uint64_t> KeyTimeList;
|
nuclear@0
|
807 typedef std::vector<float> KeyValueList;
|
nuclear@0
|
808
|
nuclear@0
|
809 /** Represents a FBX animation curve (i.e. a 1-dimensional set of keyframes and values therefor) */
|
nuclear@0
|
810 class AnimationCurve : public Object
|
nuclear@0
|
811 {
|
nuclear@0
|
812 public:
|
nuclear@0
|
813
|
nuclear@0
|
814 AnimationCurve(uint64_t id, const Element& element, const std::string& name, const Document& doc);
|
nuclear@0
|
815 ~AnimationCurve();
|
nuclear@0
|
816
|
nuclear@0
|
817 public:
|
nuclear@0
|
818
|
nuclear@0
|
819 /** get list of keyframe positions (time).
|
nuclear@0
|
820 * Invariant: |GetKeys()| > 0 */
|
nuclear@0
|
821 const KeyTimeList& GetKeys() const {
|
nuclear@0
|
822 return keys;
|
nuclear@0
|
823 }
|
nuclear@0
|
824
|
nuclear@0
|
825
|
nuclear@0
|
826 /** get list of keyframe values.
|
nuclear@0
|
827 * Invariant: |GetKeys()| == |GetValues()| && |GetKeys()| > 0*/
|
nuclear@0
|
828 const KeyValueList& GetValues() const {
|
nuclear@0
|
829 return values;
|
nuclear@0
|
830 }
|
nuclear@0
|
831
|
nuclear@0
|
832
|
nuclear@0
|
833 const std::vector<float>& GetAttributes() const {
|
nuclear@0
|
834 return attributes;
|
nuclear@0
|
835 }
|
nuclear@0
|
836
|
nuclear@0
|
837 const std::vector<unsigned int>& GetFlags() const {
|
nuclear@0
|
838 return flags;
|
nuclear@0
|
839 }
|
nuclear@0
|
840
|
nuclear@0
|
841 private:
|
nuclear@0
|
842
|
nuclear@0
|
843 KeyTimeList keys;
|
nuclear@0
|
844 KeyValueList values;
|
nuclear@0
|
845 std::vector<float> attributes;
|
nuclear@0
|
846 std::vector<unsigned int> flags;
|
nuclear@0
|
847 };
|
nuclear@0
|
848
|
nuclear@0
|
849 // property-name -> animation curve
|
nuclear@0
|
850 typedef std::map<std::string, const AnimationCurve*> AnimationCurveMap;
|
nuclear@0
|
851
|
nuclear@0
|
852
|
nuclear@0
|
853 /** Represents a FBX animation curve (i.e. a mapping from single animation curves to nodes) */
|
nuclear@0
|
854 class AnimationCurveNode : public Object
|
nuclear@0
|
855 {
|
nuclear@0
|
856 public:
|
nuclear@0
|
857
|
nuclear@0
|
858 /* the optional whitelist specifies a list of property names for which the caller
|
nuclear@0
|
859 wants animations for. If the curve node does not match one of these, std::range_error
|
nuclear@0
|
860 will be thrown. */
|
nuclear@0
|
861 AnimationCurveNode(uint64_t id, const Element& element, const std::string& name, const Document& doc,
|
nuclear@0
|
862 const char* const * target_prop_whitelist = NULL, size_t whitelist_size = 0);
|
nuclear@0
|
863
|
nuclear@0
|
864 ~AnimationCurveNode();
|
nuclear@0
|
865
|
nuclear@0
|
866 public:
|
nuclear@0
|
867
|
nuclear@0
|
868 const PropertyTable& Props() const {
|
nuclear@0
|
869 ai_assert(props.get());
|
nuclear@0
|
870 return *props.get();
|
nuclear@0
|
871 }
|
nuclear@0
|
872
|
nuclear@0
|
873
|
nuclear@0
|
874 const AnimationCurveMap& Curves() const;
|
nuclear@0
|
875
|
nuclear@0
|
876 /** Object the curve is assigned to, this can be NULL if the
|
nuclear@0
|
877 * target object has no DOM representation or could not
|
nuclear@0
|
878 * be read for other reasons.*/
|
nuclear@0
|
879 const Object* Target() const {
|
nuclear@0
|
880 return target;
|
nuclear@0
|
881 }
|
nuclear@0
|
882
|
nuclear@0
|
883 const Model* TargetAsModel() const {
|
nuclear@0
|
884 return dynamic_cast<const Model*>(target);
|
nuclear@0
|
885 }
|
nuclear@0
|
886
|
nuclear@0
|
887 const NodeAttribute* TargetAsNodeAttribute() const {
|
nuclear@0
|
888 return dynamic_cast<const NodeAttribute*>(target);
|
nuclear@0
|
889 }
|
nuclear@0
|
890
|
nuclear@0
|
891 /** Property of Target() that is being animated*/
|
nuclear@0
|
892 const std::string& TargetProperty() const {
|
nuclear@0
|
893 return prop;
|
nuclear@0
|
894 }
|
nuclear@0
|
895
|
nuclear@0
|
896 private:
|
nuclear@0
|
897
|
nuclear@0
|
898 const Object* target;
|
nuclear@0
|
899 boost::shared_ptr<const PropertyTable> props;
|
nuclear@0
|
900 mutable AnimationCurveMap curves;
|
nuclear@0
|
901
|
nuclear@0
|
902 std::string prop;
|
nuclear@0
|
903 const Document& doc;
|
nuclear@0
|
904 };
|
nuclear@0
|
905
|
nuclear@0
|
906 typedef std::vector<const AnimationCurveNode*> AnimationCurveNodeList;
|
nuclear@0
|
907
|
nuclear@0
|
908
|
nuclear@0
|
909 /** Represents a FBX animation layer (i.e. a list of node animations) */
|
nuclear@0
|
910 class AnimationLayer : public Object
|
nuclear@0
|
911 {
|
nuclear@0
|
912 public:
|
nuclear@0
|
913
|
nuclear@0
|
914
|
nuclear@0
|
915 AnimationLayer(uint64_t id, const Element& element, const std::string& name, const Document& doc);
|
nuclear@0
|
916 ~AnimationLayer();
|
nuclear@0
|
917
|
nuclear@0
|
918 public:
|
nuclear@0
|
919
|
nuclear@0
|
920 const PropertyTable& Props() const {
|
nuclear@0
|
921 ai_assert(props.get());
|
nuclear@0
|
922 return *props.get();
|
nuclear@0
|
923 }
|
nuclear@0
|
924
|
nuclear@0
|
925 /* the optional whitelist specifies a list of property names for which the caller
|
nuclear@0
|
926 wants animations for. Curves not matching this list will not be added to the
|
nuclear@0
|
927 animation layer. */
|
nuclear@0
|
928 AnimationCurveNodeList Nodes(const char* const * target_prop_whitelist = NULL, size_t whitelist_size = 0) const;
|
nuclear@0
|
929
|
nuclear@0
|
930 private:
|
nuclear@0
|
931
|
nuclear@0
|
932 boost::shared_ptr<const PropertyTable> props;
|
nuclear@0
|
933 const Document& doc;
|
nuclear@0
|
934 };
|
nuclear@0
|
935
|
nuclear@0
|
936
|
nuclear@0
|
937 typedef std::vector<const AnimationLayer*> AnimationLayerList;
|
nuclear@0
|
938
|
nuclear@0
|
939
|
nuclear@0
|
940 /** Represents a FBX animation stack (i.e. a list of animation layers) */
|
nuclear@0
|
941 class AnimationStack : public Object
|
nuclear@0
|
942 {
|
nuclear@0
|
943 public:
|
nuclear@0
|
944
|
nuclear@0
|
945 AnimationStack(uint64_t id, const Element& element, const std::string& name, const Document& doc);
|
nuclear@0
|
946 ~AnimationStack();
|
nuclear@0
|
947
|
nuclear@0
|
948 public:
|
nuclear@0
|
949
|
nuclear@0
|
950 fbx_simple_property(LocalStart, uint64_t, 0L);
|
nuclear@0
|
951 fbx_simple_property(LocalStop, uint64_t, 0L);
|
nuclear@0
|
952 fbx_simple_property(ReferenceStart, uint64_t, 0L);
|
nuclear@0
|
953 fbx_simple_property(ReferenceStop, uint64_t, 0L);
|
nuclear@0
|
954
|
nuclear@0
|
955
|
nuclear@0
|
956
|
nuclear@0
|
957 const PropertyTable& Props() const {
|
nuclear@0
|
958 ai_assert(props.get());
|
nuclear@0
|
959 return *props.get();
|
nuclear@0
|
960 }
|
nuclear@0
|
961
|
nuclear@0
|
962
|
nuclear@0
|
963 const AnimationLayerList& Layers() const {
|
nuclear@0
|
964 return layers;
|
nuclear@0
|
965 }
|
nuclear@0
|
966
|
nuclear@0
|
967 private:
|
nuclear@0
|
968
|
nuclear@0
|
969 boost::shared_ptr<const PropertyTable> props;
|
nuclear@0
|
970 AnimationLayerList layers;
|
nuclear@0
|
971 };
|
nuclear@0
|
972
|
nuclear@0
|
973
|
nuclear@0
|
974 /** DOM class for deformers */
|
nuclear@0
|
975 class Deformer : public Object
|
nuclear@0
|
976 {
|
nuclear@0
|
977 public:
|
nuclear@0
|
978
|
nuclear@0
|
979 Deformer(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
980 ~Deformer();
|
nuclear@0
|
981
|
nuclear@0
|
982 public:
|
nuclear@0
|
983
|
nuclear@0
|
984 const PropertyTable& Props() const {
|
nuclear@0
|
985 ai_assert(props.get());
|
nuclear@0
|
986 return *props.get();
|
nuclear@0
|
987 }
|
nuclear@0
|
988
|
nuclear@0
|
989 private:
|
nuclear@0
|
990
|
nuclear@0
|
991 boost::shared_ptr<const PropertyTable> props;
|
nuclear@0
|
992 };
|
nuclear@0
|
993
|
nuclear@0
|
994 typedef std::vector<float> WeightArray;
|
nuclear@0
|
995 typedef std::vector<unsigned int> WeightIndexArray;
|
nuclear@0
|
996
|
nuclear@0
|
997
|
nuclear@0
|
998 /** DOM class for skin deformer clusters (aka subdeformers) */
|
nuclear@0
|
999 class Cluster : public Deformer
|
nuclear@0
|
1000 {
|
nuclear@0
|
1001 public:
|
nuclear@0
|
1002
|
nuclear@0
|
1003 Cluster(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
1004 ~Cluster();
|
nuclear@0
|
1005
|
nuclear@0
|
1006 public:
|
nuclear@0
|
1007
|
nuclear@0
|
1008 /** get the list of deformer weights associated with this cluster.
|
nuclear@0
|
1009 * Use #GetIndices() to get the associated vertices. Both arrays
|
nuclear@0
|
1010 * have the same size (and may also be empty). */
|
nuclear@0
|
1011 const WeightArray& GetWeights() const {
|
nuclear@0
|
1012 return weights;
|
nuclear@0
|
1013 }
|
nuclear@0
|
1014
|
nuclear@0
|
1015 /** get indices into the vertex data of the geometry associated
|
nuclear@0
|
1016 * with this cluster. Use #GetWeights() to get the associated weights.
|
nuclear@0
|
1017 * Both arrays have the same size (and may also be empty). */
|
nuclear@0
|
1018 const WeightIndexArray& GetIndices() const {
|
nuclear@0
|
1019 return indices;
|
nuclear@0
|
1020 }
|
nuclear@0
|
1021
|
nuclear@0
|
1022 /** */
|
nuclear@0
|
1023 const aiMatrix4x4& Transform() const {
|
nuclear@0
|
1024 return transform;
|
nuclear@0
|
1025 }
|
nuclear@0
|
1026
|
nuclear@0
|
1027 const aiMatrix4x4& TransformLink() const {
|
nuclear@0
|
1028 return transformLink;
|
nuclear@0
|
1029 }
|
nuclear@0
|
1030
|
nuclear@0
|
1031 const Model* const TargetNode() const {
|
nuclear@0
|
1032 return node;
|
nuclear@0
|
1033 }
|
nuclear@0
|
1034
|
nuclear@0
|
1035 private:
|
nuclear@0
|
1036
|
nuclear@0
|
1037 WeightArray weights;
|
nuclear@0
|
1038 WeightIndexArray indices;
|
nuclear@0
|
1039
|
nuclear@0
|
1040 aiMatrix4x4 transform;
|
nuclear@0
|
1041 aiMatrix4x4 transformLink;
|
nuclear@0
|
1042
|
nuclear@0
|
1043 const Model* node;
|
nuclear@0
|
1044 };
|
nuclear@0
|
1045
|
nuclear@0
|
1046
|
nuclear@0
|
1047
|
nuclear@0
|
1048 /** DOM class for skin deformers */
|
nuclear@0
|
1049 class Skin : public Deformer
|
nuclear@0
|
1050 {
|
nuclear@0
|
1051 public:
|
nuclear@0
|
1052
|
nuclear@0
|
1053 Skin(uint64_t id, const Element& element, const Document& doc, const std::string& name);
|
nuclear@0
|
1054 ~Skin();
|
nuclear@0
|
1055
|
nuclear@0
|
1056 public:
|
nuclear@0
|
1057
|
nuclear@0
|
1058 float DeformAccuracy() const {
|
nuclear@0
|
1059 return accuracy;
|
nuclear@0
|
1060 }
|
nuclear@0
|
1061
|
nuclear@0
|
1062
|
nuclear@0
|
1063 const std::vector<const Cluster*>& Clusters() const {
|
nuclear@0
|
1064 return clusters;
|
nuclear@0
|
1065 }
|
nuclear@0
|
1066
|
nuclear@0
|
1067 private:
|
nuclear@0
|
1068
|
nuclear@0
|
1069 float accuracy;
|
nuclear@0
|
1070 std::vector<const Cluster*> clusters;
|
nuclear@0
|
1071 };
|
nuclear@0
|
1072
|
nuclear@0
|
1073
|
nuclear@0
|
1074
|
nuclear@0
|
1075 /** Represents a link between two FBX objects. */
|
nuclear@0
|
1076 class Connection
|
nuclear@0
|
1077 {
|
nuclear@0
|
1078 public:
|
nuclear@0
|
1079
|
nuclear@0
|
1080 Connection(uint64_t insertionOrder, uint64_t src, uint64_t dest, const std::string& prop, const Document& doc);
|
nuclear@0
|
1081 ~Connection();
|
nuclear@0
|
1082
|
nuclear@0
|
1083 // note: a connection ensures that the source and dest objects exist, but
|
nuclear@0
|
1084 // not that they have DOM representations, so the return value of one of
|
nuclear@0
|
1085 // these functions can still be NULL.
|
nuclear@0
|
1086 const Object* SourceObject() const;
|
nuclear@0
|
1087 const Object* DestinationObject() const;
|
nuclear@0
|
1088
|
nuclear@0
|
1089 // these, however, are always guaranteed to be valid
|
nuclear@0
|
1090 LazyObject& LazySourceObject() const;
|
nuclear@0
|
1091 LazyObject& LazyDestinationObject() const;
|
nuclear@0
|
1092
|
nuclear@0
|
1093
|
nuclear@0
|
1094 /** return the name of the property the connection is attached to.
|
nuclear@0
|
1095 * this is an empty string for object to object (OO) connections. */
|
nuclear@0
|
1096 const std::string& PropertyName() const {
|
nuclear@0
|
1097 return prop;
|
nuclear@0
|
1098 }
|
nuclear@0
|
1099
|
nuclear@0
|
1100 uint64_t InsertionOrder() const {
|
nuclear@0
|
1101 return insertionOrder;
|
nuclear@0
|
1102 }
|
nuclear@0
|
1103
|
nuclear@0
|
1104 int CompareTo(const Connection* c) const {
|
nuclear@0
|
1105 // note: can't subtract because this would overflow uint64_t
|
nuclear@0
|
1106 if(InsertionOrder() > c->InsertionOrder()) {
|
nuclear@0
|
1107 return 1;
|
nuclear@0
|
1108 }
|
nuclear@0
|
1109 else if(InsertionOrder() < c->InsertionOrder()) {
|
nuclear@0
|
1110 return -1;
|
nuclear@0
|
1111 }
|
nuclear@0
|
1112 return 0;
|
nuclear@0
|
1113 }
|
nuclear@0
|
1114
|
nuclear@0
|
1115 bool Compare(const Connection* c) const {
|
nuclear@0
|
1116 return InsertionOrder() < c->InsertionOrder();
|
nuclear@0
|
1117 }
|
nuclear@0
|
1118
|
nuclear@0
|
1119 public:
|
nuclear@0
|
1120
|
nuclear@0
|
1121 uint64_t insertionOrder;
|
nuclear@0
|
1122 const std::string prop;
|
nuclear@0
|
1123
|
nuclear@0
|
1124 uint64_t src, dest;
|
nuclear@0
|
1125 const Document& doc;
|
nuclear@0
|
1126 };
|
nuclear@0
|
1127
|
nuclear@0
|
1128
|
nuclear@0
|
1129 // XXX again, unique_ptr would be useful. shared_ptr is too
|
nuclear@0
|
1130 // bloated since the objects have a well-defined single owner
|
nuclear@0
|
1131 // during their entire lifetime (Document). FBX files have
|
nuclear@0
|
1132 // up to many thousands of objects (most of which we never use),
|
nuclear@0
|
1133 // so the memory overhead for them should be kept at a minimum.
|
nuclear@0
|
1134 typedef std::map<uint64_t, LazyObject*> ObjectMap;
|
nuclear@0
|
1135 typedef std::fbx_unordered_map<std::string, boost::shared_ptr<const PropertyTable> > PropertyTemplateMap;
|
nuclear@0
|
1136
|
nuclear@0
|
1137
|
nuclear@0
|
1138 typedef std::multimap<uint64_t, const Connection*> ConnectionMap;
|
nuclear@0
|
1139
|
nuclear@0
|
1140
|
nuclear@0
|
1141 /** DOM class for global document settings, a single instance per document can
|
nuclear@0
|
1142 * be accessed via Document.Globals(). */
|
nuclear@0
|
1143 class FileGlobalSettings
|
nuclear@0
|
1144 {
|
nuclear@0
|
1145 public:
|
nuclear@0
|
1146
|
nuclear@0
|
1147 FileGlobalSettings(const Document& doc, boost::shared_ptr<const PropertyTable> props);
|
nuclear@0
|
1148 ~FileGlobalSettings();
|
nuclear@0
|
1149
|
nuclear@0
|
1150 public:
|
nuclear@0
|
1151
|
nuclear@0
|
1152 const PropertyTable& Props() const {
|
nuclear@0
|
1153 ai_assert(props.get());
|
nuclear@0
|
1154 return *props.get();
|
nuclear@0
|
1155 }
|
nuclear@0
|
1156
|
nuclear@0
|
1157 const Document& GetDocument() const {
|
nuclear@0
|
1158 return doc;
|
nuclear@0
|
1159 }
|
nuclear@0
|
1160
|
nuclear@0
|
1161
|
nuclear@0
|
1162 fbx_simple_property(UpAxis, int, 1);
|
nuclear@0
|
1163 fbx_simple_property(UpAxisSign, int, 1);
|
nuclear@0
|
1164 fbx_simple_property(FrontAxis, int, 2);
|
nuclear@0
|
1165 fbx_simple_property(FrontAxisSign, int, 1);
|
nuclear@0
|
1166 fbx_simple_property(CoordAxis, int, 0);
|
nuclear@0
|
1167 fbx_simple_property(CoordAxisSign, int, 1);
|
nuclear@0
|
1168 fbx_simple_property(OriginalUpAxis, int, 0);
|
nuclear@0
|
1169 fbx_simple_property(OriginalUpAxisSign, int, 1);
|
nuclear@0
|
1170 fbx_simple_property(UnitScaleFactor, double, 1);
|
nuclear@0
|
1171 fbx_simple_property(OriginalUnitScaleFactor, double, 1);
|
nuclear@0
|
1172 fbx_simple_property(AmbientColor, aiVector3D, aiVector3D(0,0,0));
|
nuclear@0
|
1173 fbx_simple_property(DefaultCamera, std::string, "");
|
nuclear@0
|
1174
|
nuclear@0
|
1175
|
nuclear@0
|
1176 enum FrameRate {
|
nuclear@0
|
1177 FrameRate_DEFAULT = 0,
|
nuclear@0
|
1178 FrameRate_120 = 1,
|
nuclear@0
|
1179 FrameRate_100 = 2,
|
nuclear@0
|
1180 FrameRate_60 = 3,
|
nuclear@0
|
1181 FrameRate_50 = 4,
|
nuclear@0
|
1182 FrameRate_48 = 5,
|
nuclear@0
|
1183 FrameRate_30 = 6,
|
nuclear@0
|
1184 FrameRate_30_DROP = 7,
|
nuclear@0
|
1185 FrameRate_NTSC_DROP_FRAME = 8,
|
nuclear@0
|
1186 FrameRate_NTSC_FULL_FRAME = 9,
|
nuclear@0
|
1187 FrameRate_PAL = 10,
|
nuclear@0
|
1188 FrameRate_CINEMA = 11,
|
nuclear@0
|
1189 FrameRate_1000 = 12,
|
nuclear@0
|
1190 FrameRate_CINEMA_ND = 13,
|
nuclear@0
|
1191 FrameRate_CUSTOM = 14,
|
nuclear@0
|
1192
|
nuclear@0
|
1193 FrameRate_MAX// end-of-enum sentinel
|
nuclear@0
|
1194 };
|
nuclear@0
|
1195
|
nuclear@0
|
1196 fbx_simple_enum_property(TimeMode, FrameRate, FrameRate_DEFAULT);
|
nuclear@0
|
1197 fbx_simple_property(TimeSpanStart, uint64_t, 0L);
|
nuclear@0
|
1198 fbx_simple_property(TimeSpanStop, uint64_t, 0L);
|
nuclear@0
|
1199 fbx_simple_property(CustomFrameRate, float, -1.0f);
|
nuclear@0
|
1200
|
nuclear@0
|
1201
|
nuclear@0
|
1202 private:
|
nuclear@0
|
1203
|
nuclear@0
|
1204 boost::shared_ptr<const PropertyTable> props;
|
nuclear@0
|
1205 const Document& doc;
|
nuclear@0
|
1206 };
|
nuclear@0
|
1207
|
nuclear@0
|
1208
|
nuclear@0
|
1209
|
nuclear@0
|
1210
|
nuclear@0
|
1211 /** DOM root for a FBX file */
|
nuclear@0
|
1212 class Document
|
nuclear@0
|
1213 {
|
nuclear@0
|
1214 public:
|
nuclear@0
|
1215
|
nuclear@0
|
1216 Document(const Parser& parser, const ImportSettings& settings);
|
nuclear@0
|
1217 ~Document();
|
nuclear@0
|
1218
|
nuclear@0
|
1219 public:
|
nuclear@0
|
1220
|
nuclear@0
|
1221 LazyObject* GetObject(uint64_t id) const;
|
nuclear@0
|
1222
|
nuclear@0
|
1223 bool IsBinary() const {
|
nuclear@0
|
1224 return parser.IsBinary();
|
nuclear@0
|
1225 }
|
nuclear@0
|
1226
|
nuclear@0
|
1227 unsigned int FBXVersion() const {
|
nuclear@0
|
1228 return fbxVersion;
|
nuclear@0
|
1229 }
|
nuclear@0
|
1230
|
nuclear@0
|
1231 const std::string& Creator() const {
|
nuclear@0
|
1232 return creator;
|
nuclear@0
|
1233 }
|
nuclear@0
|
1234
|
nuclear@0
|
1235 // elements (in this order): Uear, Month, Day, Hour, Second, Millisecond
|
nuclear@0
|
1236 const unsigned int* CreationTimeStamp() const {
|
nuclear@0
|
1237 return creationTimeStamp;
|
nuclear@0
|
1238 }
|
nuclear@0
|
1239
|
nuclear@0
|
1240 const FileGlobalSettings& GlobalSettings() const {
|
nuclear@0
|
1241 ai_assert(globals.get());
|
nuclear@0
|
1242 return *globals.get();
|
nuclear@0
|
1243 }
|
nuclear@0
|
1244
|
nuclear@0
|
1245 const PropertyTemplateMap& Templates() const {
|
nuclear@0
|
1246 return templates;
|
nuclear@0
|
1247 }
|
nuclear@0
|
1248
|
nuclear@0
|
1249 const ObjectMap& Objects() const {
|
nuclear@0
|
1250 return objects;
|
nuclear@0
|
1251 }
|
nuclear@0
|
1252
|
nuclear@0
|
1253 const ImportSettings& Settings() const {
|
nuclear@0
|
1254 return settings;
|
nuclear@0
|
1255 }
|
nuclear@0
|
1256
|
nuclear@0
|
1257 const ConnectionMap& ConnectionsBySource() const {
|
nuclear@0
|
1258 return src_connections;
|
nuclear@0
|
1259 }
|
nuclear@0
|
1260
|
nuclear@0
|
1261 const ConnectionMap& ConnectionsByDestination() const {
|
nuclear@0
|
1262 return dest_connections;
|
nuclear@0
|
1263 }
|
nuclear@0
|
1264
|
nuclear@0
|
1265 // note: the implicit rule in all DOM classes is to always resolve
|
nuclear@0
|
1266 // from destination to source (since the FBX object hierarchy is,
|
nuclear@0
|
1267 // with very few exceptions, a DAG, this avoids cycles). In all
|
nuclear@0
|
1268 // cases that may involve back-facing edges in the object graph,
|
nuclear@0
|
1269 // use LazyObject::IsBeingConstructed() to check.
|
nuclear@0
|
1270
|
nuclear@0
|
1271 std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source) const;
|
nuclear@0
|
1272 std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest) const;
|
nuclear@0
|
1273
|
nuclear@0
|
1274 std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source, const char* classname) const;
|
nuclear@0
|
1275 std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest, const char* classname) const;
|
nuclear@0
|
1276
|
nuclear@0
|
1277 std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source,
|
nuclear@0
|
1278 const char* const* classnames, size_t count) const;
|
nuclear@0
|
1279 std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest,
|
nuclear@0
|
1280 const char* const* classnames,
|
nuclear@0
|
1281 size_t count) const;
|
nuclear@0
|
1282
|
nuclear@0
|
1283 const std::vector<const AnimationStack*>& AnimationStacks() const;
|
nuclear@0
|
1284
|
nuclear@0
|
1285 private:
|
nuclear@0
|
1286
|
nuclear@0
|
1287 std::vector<const Connection*> GetConnectionsSequenced(uint64_t id, const ConnectionMap&) const;
|
nuclear@0
|
1288 std::vector<const Connection*> GetConnectionsSequenced(uint64_t id, bool is_src,
|
nuclear@0
|
1289 const ConnectionMap&,
|
nuclear@0
|
1290 const char* const* classnames,
|
nuclear@0
|
1291 size_t count) const;
|
nuclear@0
|
1292
|
nuclear@0
|
1293 private:
|
nuclear@0
|
1294
|
nuclear@0
|
1295 void ReadHeader();
|
nuclear@0
|
1296 void ReadObjects();
|
nuclear@0
|
1297 void ReadPropertyTemplates();
|
nuclear@0
|
1298 void ReadConnections();
|
nuclear@0
|
1299 void ReadGlobalSettings();
|
nuclear@0
|
1300
|
nuclear@0
|
1301 private:
|
nuclear@0
|
1302
|
nuclear@0
|
1303 const ImportSettings& settings;
|
nuclear@0
|
1304
|
nuclear@0
|
1305 ObjectMap objects;
|
nuclear@0
|
1306 const Parser& parser;
|
nuclear@0
|
1307
|
nuclear@0
|
1308 PropertyTemplateMap templates;
|
nuclear@0
|
1309 ConnectionMap src_connections;
|
nuclear@0
|
1310 ConnectionMap dest_connections;
|
nuclear@0
|
1311
|
nuclear@0
|
1312 unsigned int fbxVersion;
|
nuclear@0
|
1313 std::string creator;
|
nuclear@0
|
1314 unsigned int creationTimeStamp[7];
|
nuclear@0
|
1315
|
nuclear@0
|
1316 std::vector<uint64_t> animationStacks;
|
nuclear@0
|
1317 mutable std::vector<const AnimationStack*> animationStacksResolved;
|
nuclear@0
|
1318
|
nuclear@0
|
1319 boost::scoped_ptr<FileGlobalSettings> globals;
|
nuclear@0
|
1320 };
|
nuclear@0
|
1321
|
nuclear@0
|
1322 }
|
nuclear@0
|
1323 }
|
nuclear@0
|
1324
|
nuclear@0
|
1325 #endif
|