vrshoot

annotate libs/assimp/FBXDocument.h @ 0:b2f14e535253

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 01 Feb 2014 19:58:19 +0200
parents
children
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