summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/assimp/code/FBXDocument.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/assimp/code/FBXDocument.h')
-rw-r--r--src/3rdparty/assimp/code/FBXDocument.h1776
1 files changed, 783 insertions, 993 deletions
diff --git a/src/3rdparty/assimp/code/FBXDocument.h b/src/3rdparty/assimp/code/FBXDocument.h
index 9dd5c79dd..62d463bab 100644
--- a/src/3rdparty/assimp/code/FBXDocument.h
+++ b/src/3rdparty/assimp/code/FBXDocument.h
@@ -2,11 +2,11 @@
Open Asset Import Library (assimp)
----------------------------------------------------------------------
-Copyright (c) 2006-2012, assimp team
+Copyright (c) 2006-2016, assimp team
All rights reserved.
-Redistribution and use of this software in source and binary forms,
-with or without modification, are permitted provided that the
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
following conditions are met:
* Redistributions of source code must retain the above
@@ -23,16 +23,16 @@ following conditions are met:
derived from this software without specific prior
written permission of the assimp team.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------
@@ -44,31 +44,36 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef INCLUDED_AI_FBX_DOCUMENT_H
#define INCLUDED_AI_FBX_DOCUMENT_H
-#include <vector>
-#include <map>
-#include <string>
-
+#include <numeric>
+#include <stdint.h>
+#include <assimp/mesh.h>
#include "FBXProperties.h"
+#include "FBXParser.h"
+
+#define _AI_CONCAT(a,b) a ## b
+#define AI_CONCAT(a,b) _AI_CONCAT(a,b)
namespace Assimp {
namespace FBX {
- class Parser;
- class Object;
- struct ImportSettings;
+class Parser;
+class Object;
+struct ImportSettings;
+
+class PropertyTable;
+class Document;
+class Material;
+class Geometry;
- class PropertyTable;
- class Document;
- class Material;
- class Geometry;
+class Video;
- class AnimationCurve;
- class AnimationCurveNode;
- class AnimationLayer;
- class AnimationStack;
+class AnimationCurve;
+class AnimationCurveNode;
+class AnimationLayer;
+class AnimationStack;
- class Skin;
- class Cluster;
+class Skin;
+class Cluster;
/** Represents a delay-parsed FBX objects. Many objects in the scene
@@ -77,54 +82,52 @@ namespace FBX {
class LazyObject
{
public:
-
- LazyObject(uint64_t id, const Element& element, const Document& doc);
- ~LazyObject();
+ LazyObject(uint64_t id, const Element& element, const Document& doc);
+ ~LazyObject();
public:
- const Object* Get(bool dieOnError = false);
+ const Object* Get(bool dieOnError = false);
- template <typename T>
- const T* Get(bool dieOnError = false) {
- const Object* const ob = Get(dieOnError);
- return ob ? dynamic_cast<const T*>(ob) : NULL;
- }
+ template <typename T>
+ const T* Get(bool dieOnError = false) {
+ const Object* const ob = Get(dieOnError);
+ return ob ? dynamic_cast<const T*>(ob) : NULL;
+ }
- uint64_t ID() const {
- return id;
- }
+ uint64_t ID() const {
+ return id;
+ }
- bool IsBeingConstructed() const {
- return (flags & BEING_CONSTRUCTED) != 0;
- }
+ bool IsBeingConstructed() const {
+ return (flags & BEING_CONSTRUCTED) != 0;
+ }
- bool FailedToConstruct() const {
- return (flags & FAILED_TO_CONSTRUCT) != 0;
- }
+ bool FailedToConstruct() const {
+ return (flags & FAILED_TO_CONSTRUCT) != 0;
+ }
- const Element& GetElement() const {
- return element;
- }
+ const Element& GetElement() const {
+ return element;
+ }
- const Document& GetDocument() const {
- return doc;
- }
+ const Document& GetDocument() const {
+ return doc;
+ }
private:
+ const Document& doc;
+ const Element& element;
+ std::unique_ptr<const Object> object;
- const Document& doc;
- const Element& element;
- boost::scoped_ptr<const Object> object;
-
- const uint64_t id;
+ const uint64_t id;
- enum Flags {
- BEING_CONSTRUCTED = 0x1,
- FAILED_TO_CONSTRUCT = 0x2
- };
+ enum Flags {
+ BEING_CONSTRUCTED = 0x1,
+ FAILED_TO_CONSTRUCT = 0x2
+ };
- unsigned int flags;
+ unsigned int flags;
};
@@ -133,28 +136,26 @@ private:
class Object
{
public:
+ Object(uint64_t id, const Element& element, const std::string& name);
- Object(uint64_t id, const Element& element, const std::string& name);
- virtual ~Object();
+ virtual ~Object();
-public:
-
- const Element& SourceElement() const {
- return element;
- }
+ const Element& SourceElement() const {
+ return element;
+ }
- const std::string& Name() const {
- return name;
- }
+ const std::string& Name() const {
+ return name;
+ }
- uint64_t ID() const {
- return id;
- }
+ uint64_t ID() const {
+ return id;
+ }
protected:
- const Element& element;
- const std::string name;
- const uint64_t id;
+ const Element& element;
+ const std::string name;
+ const uint64_t id;
};
@@ -164,20 +165,16 @@ protected:
class NodeAttribute : public Object
{
public:
+ NodeAttribute(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~NodeAttribute();
- NodeAttribute(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~NodeAttribute();
-
-public:
-
- const PropertyTable& Props() const {
- ai_assert(props.get());
- return *props.get();
- }
+ const PropertyTable& Props() const {
+ ai_assert(props.get());
+ return *props.get();
+ }
private:
-
- boost::shared_ptr<const PropertyTable> props;
+ std::shared_ptr<const PropertyTable> props;
};
@@ -185,79 +182,69 @@ private:
class CameraSwitcher : public NodeAttribute
{
public:
+ CameraSwitcher(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~CameraSwitcher();
- CameraSwitcher(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~CameraSwitcher();
-
-public:
-
- int CameraID() const {
- return cameraId;
- }
-
- const std::string& CameraName() const {
- return cameraName;
- }
+ int CameraID() const {
+ return cameraId;
+ }
+ const std::string& CameraName() const {
+ return cameraName;
+ }
- const std::string& CameraIndexName() const {
- return cameraIndexName;
- }
+ const std::string& CameraIndexName() const {
+ return cameraIndexName;
+ }
private:
-
- int cameraId;
- std::string cameraName;
- std::string cameraIndexName;
+ int cameraId;
+ std::string cameraName;
+ std::string cameraIndexName;
};
#define fbx_stringize(a) #a
#define fbx_simple_property(name, type, default_value) \
- type name() const { \
- return PropertyGet<type>(Props(), fbx_stringize(name), (default_value)); \
- }
+ type name() const { \
+ return PropertyGet<type>(Props(), fbx_stringize(name), (default_value)); \
+ }
// XXX improve logging
#define fbx_simple_enum_property(name, type, default_value) \
- type name() const { \
- const int ival = PropertyGet<int>(Props(), fbx_stringize(name), static_cast<int>(default_value)); \
- if (ival < 0 || ival >= AI_CONCAT(type, _MAX)) { \
- ai_assert(static_cast<int>(default_value) >= 0 && static_cast<int>(default_value) < AI_CONCAT(type, _MAX)); \
- return static_cast<type>(default_value); \
- } \
- return static_cast<type>(ival); \
+ type name() const { \
+ const int ival = PropertyGet<int>(Props(), fbx_stringize(name), static_cast<int>(default_value)); \
+ if (ival < 0 || ival >= AI_CONCAT(type, _MAX)) { \
+ ai_assert(static_cast<int>(default_value) >= 0 && static_cast<int>(default_value) < AI_CONCAT(type, _MAX)); \
+ return static_cast<type>(default_value); \
+ } \
+ return static_cast<type>(ival); \
}
-
/** DOM base class for FBX cameras attached to a node */
class Camera : public NodeAttribute
{
public:
-
- Camera(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~Camera();
+ Camera(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~Camera();
public:
+ fbx_simple_property(Position, aiVector3D, aiVector3D(0,0,0))
+ fbx_simple_property(UpVector, aiVector3D, aiVector3D(0,1,0))
+ fbx_simple_property(InterestPosition, aiVector3D, aiVector3D(0,0,0))
- fbx_simple_property(Position, aiVector3D, aiVector3D(0,0,0));
- fbx_simple_property(UpVector, aiVector3D, aiVector3D(0,1,0));
- fbx_simple_property(InterestPosition, aiVector3D, aiVector3D(0,0,0));
-
- fbx_simple_property(AspectWidth, float, 1.0f);
- fbx_simple_property(AspectHeight, float, 1.0f);
- fbx_simple_property(FilmWidth, float, 1.0f);
- fbx_simple_property(FilmHeight, float, 1.0f);
-
- fbx_simple_property(FilmAspectRatio, float, 1.0f);
- fbx_simple_property(ApertureMode, int, 0);
+ fbx_simple_property(AspectWidth, float, 1.0f)
+ fbx_simple_property(AspectHeight, float, 1.0f)
+ fbx_simple_property(FilmWidth, float, 1.0f)
+ fbx_simple_property(FilmHeight, float, 1.0f)
- fbx_simple_property(FieldOfView, float, 1.0f);
- fbx_simple_property(FocalLength, float, 1.0f);
+ fbx_simple_property(FilmAspectRatio, float, 1.0f)
+ fbx_simple_property(ApertureMode, int, 0)
-private:
+ fbx_simple_property(FieldOfView, float, 1.0f)
+ fbx_simple_property(FocalLength, float, 1.0f)
};
@@ -265,9 +252,8 @@ private:
class Null : public NodeAttribute
{
public:
-
- Null(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~Null();
+ Null(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~Null();
};
@@ -275,9 +261,8 @@ public:
class LimbNode : public NodeAttribute
{
public:
-
- LimbNode(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~LimbNode();
+ LimbNode(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~LimbNode();
};
@@ -285,69 +270,63 @@ public:
class Light : public NodeAttribute
{
public:
-
- Light(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~Light();
+ Light(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~Light();
public:
-
- enum Type
- {
- Type_Point,
- Type_Directional,
- Type_Spot,
- Type_Area,
- Type_Volume,
-
- Type_MAX // end-of-enum sentinel
- };
-
- enum Decay
- {
- Decay_None,
- Decay_Linear,
- Decay_Quadratic,
- Decay_Cubic,
-
- Decay_MAX // end-of-enum sentinel
- };
+ enum Type
+ {
+ Type_Point,
+ Type_Directional,
+ Type_Spot,
+ Type_Area,
+ Type_Volume,
+
+ Type_MAX // end-of-enum sentinel
+ };
+
+ enum Decay
+ {
+ Decay_None,
+ Decay_Linear,
+ Decay_Quadratic,
+ Decay_Cubic,
+
+ Decay_MAX // end-of-enum sentinel
+ };
public:
-
- fbx_simple_property(Color, aiVector3D, aiVector3D(1,1,1));
- fbx_simple_enum_property(LightType, Type, 0);
- fbx_simple_property(CastLightOnObject, bool, false);
- fbx_simple_property(DrawVolumetricLight, bool, true);
- fbx_simple_property(DrawGroundProjection, bool, true);
- fbx_simple_property(DrawFrontFacingVolumetricLight, bool, false);
- fbx_simple_property(Intensity, float, 1.0f);
- fbx_simple_property(InnerAngle, float, 0.0f);
- fbx_simple_property(OuterAngle, float, 45.0f);
- fbx_simple_property(Fog, int, 50);
- fbx_simple_enum_property(DecayType, Decay, 0);
- fbx_simple_property(DecayStart, int, 0);
- fbx_simple_property(FileName, std::string, "");
-
- fbx_simple_property(EnableNearAttenuation, bool, false);
- fbx_simple_property(NearAttenuationStart, float, 0.0f);
- fbx_simple_property(NearAttenuationEnd, float, 0.0f);
- fbx_simple_property(EnableFarAttenuation, bool, false);
- fbx_simple_property(FarAttenuationStart, float, 0.0f);
- fbx_simple_property(FarAttenuationEnd, float, 0.0f);
-
- fbx_simple_property(CastShadows, bool, true);
- fbx_simple_property(ShadowColor, aiVector3D, aiVector3D(0,0,0));
-
- fbx_simple_property(AreaLightShape, int, 0);
-
- fbx_simple_property(LeftBarnDoor, float, 20.0f);
- fbx_simple_property(RightBarnDoor, float, 20.0f);
- fbx_simple_property(TopBarnDoor, float, 20.0f);
- fbx_simple_property(BottomBarnDoor, float, 20.0f);
- fbx_simple_property(EnableBarnDoor, bool, true);
-
-
-private:
+ fbx_simple_property(Color, aiVector3D, aiVector3D(1,1,1))
+ fbx_simple_enum_property(LightType, Type, 0)
+ fbx_simple_property(CastLightOnObject, bool, false)
+ fbx_simple_property(DrawVolumetricLight, bool, true)
+ fbx_simple_property(DrawGroundProjection, bool, true)
+ fbx_simple_property(DrawFrontFacingVolumetricLight, bool, false)
+ fbx_simple_property(Intensity, float, 1.0f)
+ fbx_simple_property(InnerAngle, float, 0.0f)
+ fbx_simple_property(OuterAngle, float, 45.0f)
+ fbx_simple_property(Fog, int, 50)
+ fbx_simple_enum_property(DecayType, Decay, 0)
+ fbx_simple_property(DecayStart, int, 0)
+ fbx_simple_property(FileName, std::string, "")
+
+ fbx_simple_property(EnableNearAttenuation, bool, false)
+ fbx_simple_property(NearAttenuationStart, float, 0.0f)
+ fbx_simple_property(NearAttenuationEnd, float, 0.0f)
+ fbx_simple_property(EnableFarAttenuation, bool, false)
+ fbx_simple_property(FarAttenuationStart, float, 0.0f)
+ fbx_simple_property(FarAttenuationEnd, float, 0.0f)
+
+ fbx_simple_property(CastShadows, bool, true)
+ fbx_simple_property(ShadowColor, aiVector3D, aiVector3D(0,0,0))
+
+ fbx_simple_property(AreaLightShape, int, 0)
+
+ fbx_simple_property(LeftBarnDoor, float, 20.0f)
+ fbx_simple_property(RightBarnDoor, float, 20.0f)
+ fbx_simple_property(TopBarnDoor, float, 20.0f)
+ fbx_simple_property(BottomBarnDoor, float, 20.0f)
+ fbx_simple_property(EnableBarnDoor, bool, true)
};
@@ -355,563 +334,415 @@ private:
class Model : public Object
{
public:
-
- Model(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~Model();
+ Model(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~Model();
public:
+ enum RotOrder
+ {
+ RotOrder_EulerXYZ = 0,
+ RotOrder_EulerXZY,
+ RotOrder_EulerYZX,
+ RotOrder_EulerYXZ,
+ RotOrder_EulerZXY,
+ RotOrder_EulerZYX,
- enum RotOrder
- {
- RotOrder_EulerXYZ = 0,
- RotOrder_EulerXZY,
- RotOrder_EulerYZX,
- RotOrder_EulerYXZ,
- RotOrder_EulerZXY,
- RotOrder_EulerZYX,
-
- RotOrder_SphericXYZ,
+ RotOrder_SphericXYZ,
- RotOrder_MAX // end-of-enum sentinel
- };
+ RotOrder_MAX // end-of-enum sentinel
+ };
- enum TransformInheritance
- {
- TransformInheritance_RrSs = 0,
- TransformInheritance_RSrs,
- TransformInheritance_Rrs,
+ enum TransformInheritance
+ {
+ TransformInheritance_RrSs = 0,
+ TransformInheritance_RSrs,
+ TransformInheritance_Rrs,
- TransformInheritance_MAX // end-of-enum sentinel
- };
+ TransformInheritance_MAX // end-of-enum sentinel
+ };
public:
-
- fbx_simple_property(QuaternionInterpolate, int, 0);
-
- fbx_simple_property(RotationOffset, aiVector3D, aiVector3D());
- fbx_simple_property(RotationPivot, aiVector3D, aiVector3D());
- fbx_simple_property(ScalingOffset, aiVector3D, aiVector3D());
- fbx_simple_property(ScalingPivot, aiVector3D, aiVector3D());
- fbx_simple_property(TranslationActive, bool, false);
-
- fbx_simple_property(TranslationMin, aiVector3D, aiVector3D());
- fbx_simple_property(TranslationMax, aiVector3D, aiVector3D());
-
- fbx_simple_property(TranslationMinX, bool, false);
- fbx_simple_property(TranslationMaxX, bool, false);
- fbx_simple_property(TranslationMinY, bool, false);
- fbx_simple_property(TranslationMaxY, bool, false);
- fbx_simple_property(TranslationMinZ, bool, false);
- fbx_simple_property(TranslationMaxZ, bool, false);
-
- fbx_simple_enum_property(RotationOrder, RotOrder, 0);
- fbx_simple_property(RotationSpaceForLimitOnly, bool, false);
- fbx_simple_property(RotationStiffnessX, float, 0.0f);
- fbx_simple_property(RotationStiffnessY, float, 0.0f);
- fbx_simple_property(RotationStiffnessZ, float, 0.0f);
- fbx_simple_property(AxisLen, float, 0.0f);
-
- fbx_simple_property(PreRotation, aiVector3D, aiVector3D());
- fbx_simple_property(PostRotation, aiVector3D, aiVector3D());
- fbx_simple_property(RotationActive, bool, false);
-
- fbx_simple_property(RotationMin, aiVector3D, aiVector3D());
- fbx_simple_property(RotationMax, aiVector3D, aiVector3D());
-
- fbx_simple_property(RotationMinX, bool, false);
- fbx_simple_property(RotationMaxX, bool, false);
- fbx_simple_property(RotationMinY, bool, false);
- fbx_simple_property(RotationMaxY, bool, false);
- fbx_simple_property(RotationMinZ, bool, false);
- fbx_simple_property(RotationMaxZ, bool, false);
- fbx_simple_enum_property(InheritType, TransformInheritance, 0);
-
- fbx_simple_property(ScalingActive, bool, false);
- fbx_simple_property(ScalingMin, aiVector3D, aiVector3D());
- fbx_simple_property(ScalingMax, aiVector3D, aiVector3D(1.f,1.f,1.f));
- fbx_simple_property(ScalingMinX, bool, false);
- fbx_simple_property(ScalingMaxX, bool, false);
- fbx_simple_property(ScalingMinY, bool, false);
- fbx_simple_property(ScalingMaxY, bool, false);
- fbx_simple_property(ScalingMinZ, bool, false);
- fbx_simple_property(ScalingMaxZ, bool, false);
-
- fbx_simple_property(GeometricTranslation, aiVector3D, aiVector3D());
- fbx_simple_property(GeometricRotation, aiVector3D, aiVector3D());
- fbx_simple_property(GeometricScaling, aiVector3D, aiVector3D(1.f, 1.f, 1.f));
-
- fbx_simple_property(MinDampRangeX, float, 0.0f);
- fbx_simple_property(MinDampRangeY, float, 0.0f);
- fbx_simple_property(MinDampRangeZ, float, 0.0f);
- fbx_simple_property(MaxDampRangeX, float, 0.0f);
- fbx_simple_property(MaxDampRangeY, float, 0.0f);
- fbx_simple_property(MaxDampRangeZ, float, 0.0f);
-
- fbx_simple_property(MinDampStrengthX, float, 0.0f);
- fbx_simple_property(MinDampStrengthY, float, 0.0f);
- fbx_simple_property(MinDampStrengthZ, float, 0.0f);
- fbx_simple_property(MaxDampStrengthX, float, 0.0f);
- fbx_simple_property(MaxDampStrengthY, float, 0.0f);
- fbx_simple_property(MaxDampStrengthZ, float, 0.0f);
-
- fbx_simple_property(PreferredAngleX, float, 0.0f);
- fbx_simple_property(PreferredAngleY, float, 0.0f);
- fbx_simple_property(PreferredAngleZ, float, 0.0f);
-
- fbx_simple_property(Show, bool, true);
- fbx_simple_property(LODBox, bool, false);
- fbx_simple_property(Freeze, bool, false);
+ fbx_simple_property(QuaternionInterpolate, int, 0)
+
+ fbx_simple_property(RotationOffset, aiVector3D, aiVector3D())
+ fbx_simple_property(RotationPivot, aiVector3D, aiVector3D())
+ fbx_simple_property(ScalingOffset, aiVector3D, aiVector3D())
+ fbx_simple_property(ScalingPivot, aiVector3D, aiVector3D())
+ fbx_simple_property(TranslationActive, bool, false)
+
+ fbx_simple_property(TranslationMin, aiVector3D, aiVector3D())
+ fbx_simple_property(TranslationMax, aiVector3D, aiVector3D())
+
+ fbx_simple_property(TranslationMinX, bool, false)
+ fbx_simple_property(TranslationMaxX, bool, false)
+ fbx_simple_property(TranslationMinY, bool, false)
+ fbx_simple_property(TranslationMaxY, bool, false)
+ fbx_simple_property(TranslationMinZ, bool, false)
+ fbx_simple_property(TranslationMaxZ, bool, false)
+
+ fbx_simple_enum_property(RotationOrder, RotOrder, 0)
+ fbx_simple_property(RotationSpaceForLimitOnly, bool, false)
+ fbx_simple_property(RotationStiffnessX, float, 0.0f)
+ fbx_simple_property(RotationStiffnessY, float, 0.0f)
+ fbx_simple_property(RotationStiffnessZ, float, 0.0f)
+ fbx_simple_property(AxisLen, float, 0.0f)
+
+ fbx_simple_property(PreRotation, aiVector3D, aiVector3D())
+ fbx_simple_property(PostRotation, aiVector3D, aiVector3D())
+ fbx_simple_property(RotationActive, bool, false)
+
+ fbx_simple_property(RotationMin, aiVector3D, aiVector3D())
+ fbx_simple_property(RotationMax, aiVector3D, aiVector3D())
+
+ fbx_simple_property(RotationMinX, bool, false)
+ fbx_simple_property(RotationMaxX, bool, false)
+ fbx_simple_property(RotationMinY, bool, false)
+ fbx_simple_property(RotationMaxY, bool, false)
+ fbx_simple_property(RotationMinZ, bool, false)
+ fbx_simple_property(RotationMaxZ, bool, false)
+ fbx_simple_enum_property(InheritType, TransformInheritance, 0)
+
+ fbx_simple_property(ScalingActive, bool, false)
+ fbx_simple_property(ScalingMin, aiVector3D, aiVector3D())
+ fbx_simple_property(ScalingMax, aiVector3D, aiVector3D(1.f,1.f,1.f))
+ fbx_simple_property(ScalingMinX, bool, false)
+ fbx_simple_property(ScalingMaxX, bool, false)
+ fbx_simple_property(ScalingMinY, bool, false)
+ fbx_simple_property(ScalingMaxY, bool, false)
+ fbx_simple_property(ScalingMinZ, bool, false)
+ fbx_simple_property(ScalingMaxZ, bool, false)
+
+ fbx_simple_property(GeometricTranslation, aiVector3D, aiVector3D())
+ fbx_simple_property(GeometricRotation, aiVector3D, aiVector3D())
+ fbx_simple_property(GeometricScaling, aiVector3D, aiVector3D(1.f, 1.f, 1.f))
+
+ fbx_simple_property(MinDampRangeX, float, 0.0f)
+ fbx_simple_property(MinDampRangeY, float, 0.0f)
+ fbx_simple_property(MinDampRangeZ, float, 0.0f)
+ fbx_simple_property(MaxDampRangeX, float, 0.0f)
+ fbx_simple_property(MaxDampRangeY, float, 0.0f)
+ fbx_simple_property(MaxDampRangeZ, float, 0.0f)
+
+ fbx_simple_property(MinDampStrengthX, float, 0.0f)
+ fbx_simple_property(MinDampStrengthY, float, 0.0f)
+ fbx_simple_property(MinDampStrengthZ, float, 0.0f)
+ fbx_simple_property(MaxDampStrengthX, float, 0.0f)
+ fbx_simple_property(MaxDampStrengthY, float, 0.0f)
+ fbx_simple_property(MaxDampStrengthZ, float, 0.0f)
+
+ fbx_simple_property(PreferredAngleX, float, 0.0f)
+ fbx_simple_property(PreferredAngleY, float, 0.0f)
+ fbx_simple_property(PreferredAngleZ, float, 0.0f)
+
+ fbx_simple_property(Show, bool, true)
+ fbx_simple_property(LODBox, bool, false)
+ fbx_simple_property(Freeze, bool, false)
public:
+ const std::string& Shading() const {
+ return shading;
+ }
- const std::string& Shading() const {
- return shading;
- }
-
- const std::string& Culling() const {
- return culling;
- }
+ const std::string& Culling() const {
+ return culling;
+ }
- const PropertyTable& Props() const {
- ai_assert(props.get());
- return *props.get();
- }
+ const PropertyTable& Props() const {
+ ai_assert(props.get());
+ return *props.get();
+ }
- /** Get material links */
- const std::vector<const Material*>& GetMaterials() const {
- return materials;
- }
+ /** Get material links */
+ const std::vector<const Material*>& GetMaterials() const {
+ return materials;
+ }
- /** Get geometry links */
- const std::vector<const Geometry*>& GetGeometry() const {
- return geometry;
- }
+ /** Get geometry links */
+ const std::vector<const Geometry*>& GetGeometry() const {
+ return geometry;
+ }
- /** Get node attachments */
- const std::vector<const NodeAttribute*>& GetAttributes() const {
- return attributes;
- }
+ /** Get node attachments */
+ const std::vector<const NodeAttribute*>& GetAttributes() const {
+ return attributes;
+ }
-public:
-
- /** convenience method to check if the node has a Null node marker */
- bool IsNull() const;
+ /** convenience method to check if the node has a Null node marker */
+ bool IsNull() const;
private:
-
- void ResolveLinks(const Element& element, const Document& doc);
+ void ResolveLinks(const Element& element, const Document& doc);
private:
+ std::vector<const Material*> materials;
+ std::vector<const Geometry*> geometry;
+ std::vector<const NodeAttribute*> attributes;
- std::vector<const Material*> materials;
- std::vector<const Geometry*> geometry;
- std::vector<const NodeAttribute*> attributes;
-
- std::string shading;
- std::string culling;
- boost::shared_ptr<const PropertyTable> props;
+ std::string shading;
+ std::string culling;
+ std::shared_ptr<const PropertyTable> props;
};
/** DOM class for generic FBX textures */
class Texture : public Object
{
public:
-
- Texture(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~Texture();
+ Texture(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~Texture();
public:
+ const std::string& Type() const {
+ return type;
+ }
- const std::string& Type() const {
- return type;
- }
+ const std::string& FileName() const {
+ return fileName;
+ }
- const std::string& FileName() const {
- return fileName;
- }
+ const std::string& RelativeFilename() const {
+ return relativeFileName;
+ }
- const std::string& RelativeFilename() const {
- return relativeFileName;
- }
+ const std::string& AlphaSource() const {
+ return alphaSource;
+ }
- const std::string& AlphaSource() const {
- return alphaSource;
- }
+ const aiVector2D& UVTranslation() const {
+ return uvTrans;
+ }
- const aiVector2D& UVTranslation() const {
- return uvTrans;
- }
+ const aiVector2D& UVScaling() const {
+ return uvScaling;
+ }
- const aiVector2D& UVScaling() const {
- return uvScaling;
- }
+ const PropertyTable& Props() const {
+ ai_assert(props.get());
+ return *props.get();
+ }
- const PropertyTable& Props() const {
- ai_assert(props.get());
- return *props.get();
- }
+ // return a 4-tuple
+ const unsigned int* Crop() const {
+ return crop;
+ }
- // return a 4-tuple
- const unsigned int* Crop() const {
- return crop;
- }
+ const Video* Media() const {
+ return media;
+ }
private:
+ aiVector2D uvTrans;
+ aiVector2D uvScaling;
- aiVector2D uvTrans;
- aiVector2D uvScaling;
+ std::string type;
+ std::string relativeFileName;
+ std::string fileName;
+ std::string alphaSource;
+ std::shared_ptr<const PropertyTable> props;
- std::string type;
- std::string relativeFileName;
- std::string fileName;
- std::string alphaSource;
- boost::shared_ptr<const PropertyTable> props;
+ unsigned int crop[4];
- unsigned int crop[4];
+ const Video* media;
};
/** DOM class for layered FBX textures */
class LayeredTexture : public Object
{
public:
+ LayeredTexture(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~LayeredTexture();
+
+ //Can only be called after construction of the layered texture object due to construction flag.
+ void fillTexture(const Document& doc);
+
+ enum BlendMode
+ {
+ BlendMode_Translucent,
+ BlendMode_Additive,
+ BlendMode_Modulate,
+ BlendMode_Modulate2,
+ BlendMode_Over,
+ BlendMode_Normal,
+ BlendMode_Dissolve,
+ BlendMode_Darken,
+ BlendMode_ColorBurn,
+ BlendMode_LinearBurn,
+ BlendMode_DarkerColor,
+ BlendMode_Lighten,
+ BlendMode_Screen,
+ BlendMode_ColorDodge,
+ BlendMode_LinearDodge,
+ BlendMode_LighterColor,
+ BlendMode_SoftLight,
+ BlendMode_HardLight,
+ BlendMode_VividLight,
+ BlendMode_LinearLight,
+ BlendMode_PinLight,
+ BlendMode_HardMix,
+ BlendMode_Difference,
+ BlendMode_Exclusion,
+ BlendMode_Subtract,
+ BlendMode_Divide,
+ BlendMode_Hue,
+ BlendMode_Saturation,
+ BlendMode_Color,
+ BlendMode_Luminosity,
+ BlendMode_Overlay,
+ BlendMode_BlendModeCount
+ };
+
+ const Texture* getTexture() const
+ {
+ return texture;
+ }
+
+ BlendMode GetBlendMode()
+ {
+ return blendMode;
+ }
+
+ float Alpha()
+ {
+ return alpha;
+ }
- LayeredTexture(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~LayeredTexture();
-
- //Can only be called after construction of the layered texture object due to construction flag.
- void fillTexture(const Document& doc);
-
- enum BlendMode
- {
- BlendMode_Translucent,
- BlendMode_Additive,
- BlendMode_Modulate,
- BlendMode_Modulate2,
- BlendMode_Over,
- BlendMode_Normal,
- BlendMode_Dissolve,
- BlendMode_Darken,
- BlendMode_ColorBurn,
- BlendMode_LinearBurn,
- BlendMode_DarkerColor,
- BlendMode_Lighten,
- BlendMode_Screen,
- BlendMode_ColorDodge,
- BlendMode_LinearDodge,
- BlendMode_LighterColor,
- BlendMode_SoftLight,
- BlendMode_HardLight,
- BlendMode_VividLight,
- BlendMode_LinearLight,
- BlendMode_PinLight,
- BlendMode_HardMix,
- BlendMode_Difference,
- BlendMode_Exclusion,
- BlendMode_Subtract,
- BlendMode_Divide,
- BlendMode_Hue,
- BlendMode_Saturation,
- BlendMode_Color,
- BlendMode_Luminosity,
- BlendMode_Overlay,
- BlendMode_BlendModeCount
- };
-
- const Texture* getTexture() const
- {
- return texture;
- }
- BlendMode GetBlendMode()
- {
- return blendMode;
- }
- float Alpha()
- {
- return alpha;
- }
private:
- const Texture* texture;
- BlendMode blendMode;
- float alpha;
+ const Texture* texture;
+ BlendMode blendMode;
+ float alpha;
};
typedef std::fbx_unordered_map<std::string, const Texture*> TextureMap;
typedef std::fbx_unordered_map<std::string, const LayeredTexture*> LayeredTextureMap;
-/** DOM class for generic FBX materials */
-class Material : public Object
+/** DOM class for generic FBX videos */
+class Video : public Object
{
public:
-
- Material(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~Material();
+ Video(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~Video();
public:
-
- const std::string& GetShadingModel() const {
- return shading;
- }
-
- bool IsMultilayer() const {
- return multilayer;
- }
-
- const PropertyTable& Props() const {
- ai_assert(props.get());
- return *props.get();
- }
-
- const TextureMap& Textures() const {
- return textures;
- }
-
- const LayeredTextureMap& LayeredTextures() const {
- return layeredTextures;
- }
+ const std::string& Type() const {
+ return type;
+ }
+
+ const std::string& FileName() const {
+ return fileName;
+ }
+
+ const std::string& RelativeFilename() const {
+ return relativeFileName;
+ }
+
+ const PropertyTable& Props() const {
+ ai_assert(props.get());
+ return *props.get();
+ }
+
+ const uint8_t* Content() const {
+ ai_assert(content);
+ return content;
+ }
+
+ const uint32_t ContentLength() const {
+ return contentLength;
+ }
+
+ uint8_t* RelinquishContent() {
+ uint8_t* ptr = content;
+ content = 0;
+ return ptr;
+ }
private:
+ std::string type;
+ std::string relativeFileName;
+ std::string fileName;
+ std::shared_ptr<const PropertyTable> props;
- std::string shading;
- bool multilayer;
- boost::shared_ptr<const PropertyTable> props;
-
- TextureMap textures;
- LayeredTextureMap layeredTextures;
+ uint32_t contentLength;
+ uint8_t* content;
};
-
-/** DOM base class for all kinds of FBX geometry */
-class Geometry : public Object
-{
-public:
-
- Geometry(uint64_t id, const Element& element, const std::string& name, const Document& doc);
- ~Geometry();
-
-public:
-
- /** Get the Skin attached to this geometry or NULL */
- const Skin* const DeformerSkin() const {
- return skin;
- }
-
-private:
-
- const Skin* skin;
-};
-
-
-typedef std::vector<int> MatIndexArray;
-
-
-/** DOM class for FBX geometry of type "Mesh"*/
-class MeshGeometry : public Geometry
+/** DOM class for generic FBX materials */
+class Material : public Object
{
-
public:
+ Material(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~Material();
- MeshGeometry(uint64_t id, const Element& element, const std::string& name, const Document& doc);
- ~MeshGeometry();
-
-public:
-
- /** Get a list of all vertex points, non-unique*/
- const std::vector<aiVector3D>& GetVertices() const {
- return vertices;
- }
-
- /** Get a list of all vertex normals or an empty array if
- * no normals are specified. */
- const std::vector<aiVector3D>& GetNormals() const {
- return normals;
- }
-
- /** Get a list of all vertex tangents or an empty array
- * if no tangents are specified */
- const std::vector<aiVector3D>& GetTangents() const {
- return tangents;
- }
-
- /** Get a list of all vertex binormals or an empty array
- * if no binormals are specified */
- const std::vector<aiVector3D>& GetBinormals() const {
- return binormals;
- }
-
- /** Return list of faces - each entry denotes a face and specifies
- * how many vertices it has. Vertices are taken from the
- * vertex data arrays in sequential order. */
- const std::vector<unsigned int>& GetFaceIndexCounts() const {
- return faces;
- }
-
- /** Get a UV coordinate slot, returns an empty array if
- * the requested slot does not exist. */
- const std::vector<aiVector2D>& GetTextureCoords(unsigned int index) const {
- static const std::vector<aiVector2D> empty;
- return index >= AI_MAX_NUMBER_OF_TEXTURECOORDS ? empty : uvs[index];
- }
-
-
- /** Get a UV coordinate slot, returns an empty array if
- * the requested slot does not exist. */
- std::string GetTextureCoordChannelName(unsigned int index) const {
- return index >= AI_MAX_NUMBER_OF_TEXTURECOORDS ? "" : uvNames[index];
- }
-
- /** Get a vertex color coordinate slot, returns an empty array if
- * the requested slot does not exist. */
- const std::vector<aiColor4D>& GetVertexColors(unsigned int index) const {
- static const std::vector<aiColor4D> empty;
- return index >= AI_MAX_NUMBER_OF_COLOR_SETS ? empty : colors[index];
- }
-
-
- /** Get per-face-vertex material assignments */
- const MatIndexArray& GetMaterialIndices() const {
- return materials;
- }
-
-
- /** Convert from a fbx file vertex index (for example from a #Cluster weight) or NULL
- * if the vertex index is not valid. */
- const unsigned int* ToOutputVertexIndex(unsigned int in_index, unsigned int& count) const {
- if(in_index >= mapping_counts.size()) {
- return NULL;
- }
-
- ai_assert(mapping_counts.size() == mapping_offsets.size());
- count = mapping_counts[in_index];
-
- ai_assert(count != 0);
- ai_assert(mapping_offsets[in_index] + count <= mappings.size());
-
- return &mappings[mapping_offsets[in_index]];
- }
-
-
- /** Determine the face to which a particular output vertex index belongs.
- * This mapping is always unique. */
- unsigned int FaceForVertexIndex(unsigned int in_index) const {
- ai_assert(in_index < vertices.size());
-
- // in the current conversion pattern this will only be needed if
- // weights are present, so no need to always pre-compute this table
- if (facesVertexStartIndices.empty()) {
- facesVertexStartIndices.resize(faces.size() + 1, 0);
-
- std::partial_sum(faces.begin(), faces.end(), facesVertexStartIndices.begin() + 1);
- facesVertexStartIndices.pop_back();
- }
-
- ai_assert(facesVertexStartIndices.size() == faces.size());
- const std::vector<unsigned int>::iterator it = std::upper_bound(
- facesVertexStartIndices.begin(),
- facesVertexStartIndices.end(),
- in_index
- );
-
- return static_cast<unsigned int>(std::distance(facesVertexStartIndices.begin(), it - 1));
- }
-
-public:
-
-private:
-
- void ReadLayer(const Scope& layer);
- void ReadLayerElement(const Scope& layerElement);
- void ReadVertexData(const std::string& type, int index, const Scope& source);
+ const std::string& GetShadingModel() const {
+ return shading;
+ }
- void ReadVertexDataUV(std::vector<aiVector2D>& uv_out, const Scope& source,
- const std::string& MappingInformationType,
- const std::string& ReferenceInformationType);
+ bool IsMultilayer() const {
+ return multilayer;
+ }
- void ReadVertexDataNormals(std::vector<aiVector3D>& normals_out, const Scope& source,
- const std::string& MappingInformationType,
- const std::string& ReferenceInformationType);
+ const PropertyTable& Props() const {
+ ai_assert(props.get());
+ return *props.get();
+ }
- void ReadVertexDataColors(std::vector<aiColor4D>& colors_out, const Scope& source,
- const std::string& MappingInformationType,
- const std::string& ReferenceInformationType);
+ const TextureMap& Textures() const {
+ return textures;
+ }
- void ReadVertexDataTangents(std::vector<aiVector3D>& tangents_out, const Scope& source,
- const std::string& MappingInformationType,
- const std::string& ReferenceInformationType);
-
- void ReadVertexDataBinormals(std::vector<aiVector3D>& binormals_out, const Scope& source,
- const std::string& MappingInformationType,
- const std::string& ReferenceInformationType);
-
- void ReadVertexDataMaterials(MatIndexArray& materials_out, const Scope& source,
- const std::string& MappingInformationType,
- const std::string& ReferenceInformationType);
+ const LayeredTextureMap& LayeredTextures() const {
+ return layeredTextures;
+ }
private:
+ std::string shading;
+ bool multilayer;
+ std::shared_ptr<const PropertyTable> props;
- // cached data arrays
- MatIndexArray materials;
- std::vector<aiVector3D> vertices;
- std::vector<unsigned int> faces;
- mutable std::vector<unsigned int> facesVertexStartIndices;
- std::vector<aiVector3D> tangents;
- std::vector<aiVector3D> binormals;
- std::vector<aiVector3D> normals;
-
- std::string uvNames[AI_MAX_NUMBER_OF_TEXTURECOORDS];
- std::vector<aiVector2D> uvs[AI_MAX_NUMBER_OF_TEXTURECOORDS];
- std::vector<aiColor4D> colors[AI_MAX_NUMBER_OF_COLOR_SETS];
-
- std::vector<unsigned int> mapping_counts;
- std::vector<unsigned int> mapping_offsets;
- std::vector<unsigned int> mappings;
+ TextureMap textures;
+ LayeredTextureMap layeredTextures;
};
-typedef std::vector<uint64_t> KeyTimeList;
+typedef std::vector<int64_t> KeyTimeList;
typedef std::vector<float> KeyValueList;
/** Represents a FBX animation curve (i.e. a 1-dimensional set of keyframes and values therefor) */
class AnimationCurve : public Object
{
public:
+ AnimationCurve(uint64_t id, const Element& element, const std::string& name, const Document& doc);
+ virtual ~AnimationCurve();
- AnimationCurve(uint64_t id, const Element& element, const std::string& name, const Document& doc);
- ~AnimationCurve();
-
-public:
-
- /** get list of keyframe positions (time).
- * Invariant: |GetKeys()| > 0 */
- const KeyTimeList& GetKeys() const {
- return keys;
- }
+ /** get list of keyframe positions (time).
+ * Invariant: |GetKeys()| > 0 */
+ const KeyTimeList& GetKeys() const {
+ return keys;
+ }
- /** get list of keyframe values.
- * Invariant: |GetKeys()| == |GetValues()| && |GetKeys()| > 0*/
- const KeyValueList& GetValues() const {
- return values;
- }
+ /** get list of keyframe values.
+ * Invariant: |GetKeys()| == |GetValues()| && |GetKeys()| > 0*/
+ const KeyValueList& GetValues() const {
+ return values;
+ }
- const std::vector<float>& GetAttributes() const {
- return attributes;
- }
+ const std::vector<float>& GetAttributes() const {
+ return attributes;
+ }
- const std::vector<unsigned int>& GetFlags() const {
- return flags;
- }
+ const std::vector<unsigned int>& GetFlags() const {
+ return flags;
+ }
private:
-
- KeyTimeList keys;
- KeyValueList values;
- std::vector<float> attributes;
- std::vector<unsigned int> flags;
+ KeyTimeList keys;
+ KeyValueList values;
+ std::vector<float> attributes;
+ std::vector<unsigned int> flags;
};
// property-name -> animation curve
@@ -922,53 +753,49 @@ typedef std::map<std::string, const AnimationCurve*> AnimationCurveMap;
class AnimationCurveNode : public Object
{
public:
+ /* the optional white list specifies a list of property names for which the caller
+ wants animations for. If the curve node does not match one of these, std::range_error
+ will be thrown. */
+ AnimationCurveNode(uint64_t id, const Element& element, const std::string& name, const Document& doc,
+ const char* const * target_prop_whitelist = NULL, size_t whitelist_size = 0);
- /* the optional whitelist specifies a list of property names for which the caller
- wants animations for. If the curve node does not match one of these, std::range_error
- will be thrown. */
- AnimationCurveNode(uint64_t id, const Element& element, const std::string& name, const Document& doc,
- const char* const * target_prop_whitelist = NULL, size_t whitelist_size = 0);
-
- ~AnimationCurveNode();
-
-public:
+ virtual ~AnimationCurveNode();
- const PropertyTable& Props() const {
- ai_assert(props.get());
- return *props.get();
- }
+ const PropertyTable& Props() const {
+ ai_assert(props.get());
+ return *props.get();
+ }
- const AnimationCurveMap& Curves() const;
+ const AnimationCurveMap& Curves() const;
- /** Object the curve is assigned to, this can be NULL if the
- * target object has no DOM representation or could not
- * be read for other reasons.*/
- const Object* Target() const {
- return target;
- }
+ /** Object the curve is assigned to, this can be NULL if the
+ * target object has no DOM representation or could not
+ * be read for other reasons.*/
+ const Object* Target() const {
+ return target;
+ }
- const Model* TargetAsModel() const {
- return dynamic_cast<const Model*>(target);
- }
+ const Model* TargetAsModel() const {
+ return dynamic_cast<const Model*>(target);
+ }
- const NodeAttribute* TargetAsNodeAttribute() const {
- return dynamic_cast<const NodeAttribute*>(target);
- }
+ const NodeAttribute* TargetAsNodeAttribute() const {
+ return dynamic_cast<const NodeAttribute*>(target);
+ }
- /** Property of Target() that is being animated*/
- const std::string& TargetProperty() const {
- return prop;
- }
+ /** Property of Target() that is being animated*/
+ const std::string& TargetProperty() const {
+ return prop;
+ }
private:
+ const Object* target;
+ std::shared_ptr<const PropertyTable> props;
+ mutable AnimationCurveMap curves;
- const Object* target;
- boost::shared_ptr<const PropertyTable> props;
- mutable AnimationCurveMap curves;
-
- std::string prop;
- const Document& doc;
+ std::string prop;
+ const Document& doc;
};
typedef std::vector<const AnimationCurveNode*> AnimationCurveNodeList;
@@ -978,27 +805,22 @@ typedef std::vector<const AnimationCurveNode*> AnimationCurveNodeList;
class AnimationLayer : public Object
{
public:
+ AnimationLayer(uint64_t id, const Element& element, const std::string& name, const Document& doc);
+ virtual ~AnimationLayer();
-
- AnimationLayer(uint64_t id, const Element& element, const std::string& name, const Document& doc);
- ~AnimationLayer();
-
-public:
-
- const PropertyTable& Props() const {
- ai_assert(props.get());
- return *props.get();
- }
+ const PropertyTable& Props() const {
+ ai_assert(props.get());
+ return *props.get();
+ }
- /* the optional whitelist specifies a list of property names for which the caller
- wants animations for. Curves not matching this list will not be added to the
- animation layer. */
- AnimationCurveNodeList Nodes(const char* const * target_prop_whitelist = NULL, size_t whitelist_size = 0) const;
+ /* the optional white list specifies a list of property names for which the caller
+ wants animations for. Curves not matching this list will not be added to the
+ animation layer. */
+ AnimationCurveNodeList Nodes(const char* const * target_prop_whitelist = NULL, size_t whitelist_size = 0) const;
private:
-
- boost::shared_ptr<const PropertyTable> props;
- const Document& doc;
+ std::shared_ptr<const PropertyTable> props;
+ const Document& doc;
};
@@ -1009,33 +831,27 @@ typedef std::vector<const AnimationLayer*> AnimationLayerList;
class AnimationStack : public Object
{
public:
-
- AnimationStack(uint64_t id, const Element& element, const std::string& name, const Document& doc);
- ~AnimationStack();
+ AnimationStack(uint64_t id, const Element& element, const std::string& name, const Document& doc);
+ virtual ~AnimationStack();
public:
+ fbx_simple_property(LocalStart, int64_t, 0L)
+ fbx_simple_property(LocalStop, int64_t, 0L)
+ fbx_simple_property(ReferenceStart, int64_t, 0L)
+ fbx_simple_property(ReferenceStop, int64_t, 0L)
- fbx_simple_property(LocalStart, uint64_t, 0L);
- fbx_simple_property(LocalStop, uint64_t, 0L);
- fbx_simple_property(ReferenceStart, uint64_t, 0L);
- fbx_simple_property(ReferenceStop, uint64_t, 0L);
-
-
+ const PropertyTable& Props() const {
+ ai_assert(props.get());
+ return *props.get();
+ }
- const PropertyTable& Props() const {
- ai_assert(props.get());
- return *props.get();
- }
-
-
- const AnimationLayerList& Layers() const {
- return layers;
- }
+ const AnimationLayerList& Layers() const {
+ return layers;
+ }
private:
-
- boost::shared_ptr<const PropertyTable> props;
- AnimationLayerList layers;
+ std::shared_ptr<const PropertyTable> props;
+ AnimationLayerList layers;
};
@@ -1043,20 +859,16 @@ private:
class Deformer : public Object
{
public:
+ Deformer(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~Deformer();
- Deformer(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~Deformer();
-
-public:
-
- const PropertyTable& Props() const {
- ai_assert(props.get());
- return *props.get();
- }
+ const PropertyTable& Props() const {
+ ai_assert(props.get());
+ return *props.get();
+ }
private:
-
- boost::shared_ptr<const PropertyTable> props;
+ std::shared_ptr<const PropertyTable> props;
};
typedef std::vector<float> WeightArray;
@@ -1067,48 +879,44 @@ typedef std::vector<unsigned int> WeightIndexArray;
class Cluster : public Deformer
{
public:
-
- Cluster(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~Cluster();
-
-public:
-
- /** get the list of deformer weights associated with this cluster.
- * Use #GetIndices() to get the associated vertices. Both arrays
- * have the same size (and may also be empty). */
- const WeightArray& GetWeights() const {
- return weights;
- }
-
- /** get indices into the vertex data of the geometry associated
- * with this cluster. Use #GetWeights() to get the associated weights.
- * Both arrays have the same size (and may also be empty). */
- const WeightIndexArray& GetIndices() const {
- return indices;
- }
-
- /** */
- const aiMatrix4x4& Transform() const {
- return transform;
- }
-
- const aiMatrix4x4& TransformLink() const {
- return transformLink;
- }
-
- const Model* const TargetNode() const {
- return node;
- }
+ Cluster(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~Cluster();
+
+ /** get the list of deformer weights associated with this cluster.
+ * Use #GetIndices() to get the associated vertices. Both arrays
+ * have the same size (and may also be empty). */
+ const WeightArray& GetWeights() const {
+ return weights;
+ }
+
+ /** get indices into the vertex data of the geometry associated
+ * with this cluster. Use #GetWeights() to get the associated weights.
+ * Both arrays have the same size (and may also be empty). */
+ const WeightIndexArray& GetIndices() const {
+ return indices;
+ }
+
+ /** */
+ const aiMatrix4x4& Transform() const {
+ return transform;
+ }
+
+ const aiMatrix4x4& TransformLink() const {
+ return transformLink;
+ }
+
+ const Model* TargetNode() const {
+ return node;
+ }
private:
+ WeightArray weights;
+ WeightIndexArray indices;
- WeightArray weights;
- WeightIndexArray indices;
+ aiMatrix4x4 transform;
+ aiMatrix4x4 transformLink;
- aiMatrix4x4 transform;
- aiMatrix4x4 transformLink;
-
- const Model* node;
+ const Model* node;
};
@@ -1117,93 +925,87 @@ private:
class Skin : public Deformer
{
public:
+ Skin(uint64_t id, const Element& element, const Document& doc, const std::string& name);
+ virtual ~Skin();
+
+ float DeformAccuracy() const {
+ return accuracy;
+ }
- Skin(uint64_t id, const Element& element, const Document& doc, const std::string& name);
- ~Skin();
+ const std::vector<const Cluster*>& Clusters() const {
+ return clusters;
+ }
+private:
+ float accuracy;
+ std::vector<const Cluster*> clusters;
+};
+
+/** Represents a link between two FBX objects. */
+class Connection
+{
public:
+ Connection(uint64_t insertionOrder, uint64_t src, uint64_t dest, const std::string& prop, const Document& doc);
+ ~Connection();
- float DeformAccuracy() const {
- return accuracy;
- }
+ // note: a connection ensures that the source and dest objects exist, but
+ // not that they have DOM representations, so the return value of one of
+ // these functions can still be NULL.
+ const Object* SourceObject() const;
+ const Object* DestinationObject() const;
+ // these, however, are always guaranteed to be valid
+ LazyObject& LazySourceObject() const;
+ LazyObject& LazyDestinationObject() const;
- const std::vector<const Cluster*>& Clusters() const {
- return clusters;
- }
-private:
+ /** return the name of the property the connection is attached to.
+ * this is an empty string for object to object (OO) connections. */
+ const std::string& PropertyName() const {
+ return prop;
+ }
- float accuracy;
- std::vector<const Cluster*> clusters;
-};
+ uint64_t InsertionOrder() const {
+ return insertionOrder;
+ }
+ int CompareTo(const Connection* c) const {
+ ai_assert( NULL != c );
+ // note: can't subtract because this would overflow uint64_t
+ if(InsertionOrder() > c->InsertionOrder()) {
+ return 1;
+ }
+ else if(InsertionOrder() < c->InsertionOrder()) {
+ return -1;
+ }
+ return 0;
+ }
-/** Represents a link between two FBX objects. */
-class Connection
-{
-public:
+ bool Compare(const Connection* c) const {
+ ai_assert( NULL != c );
- Connection(uint64_t insertionOrder, uint64_t src, uint64_t dest, const std::string& prop, const Document& doc);
- ~Connection();
-
- // note: a connection ensures that the source and dest objects exist, but
- // not that they have DOM representations, so the return value of one of
- // these functions can still be NULL.
- const Object* SourceObject() const;
- const Object* DestinationObject() const;
-
- // these, however, are always guaranteed to be valid
- LazyObject& LazySourceObject() const;
- LazyObject& LazyDestinationObject() const;
-
-
- /** return the name of the property the connection is attached to.
- * this is an empty string for object to object (OO) connections. */
- const std::string& PropertyName() const {
- return prop;
- }
-
- uint64_t InsertionOrder() const {
- return insertionOrder;
- }
-
- int CompareTo(const Connection* c) const {
- // note: can't subtract because this would overflow uint64_t
- if(InsertionOrder() > c->InsertionOrder()) {
- return 1;
- }
- else if(InsertionOrder() < c->InsertionOrder()) {
- return -1;
- }
- return 0;
- }
-
- bool Compare(const Connection* c) const {
- return InsertionOrder() < c->InsertionOrder();
- }
+ return InsertionOrder() < c->InsertionOrder();
+ }
public:
+ uint64_t insertionOrder;
+ const std::string prop;
- uint64_t insertionOrder;
- const std::string prop;
-
- uint64_t src, dest;
- const Document& doc;
+ uint64_t src, dest;
+ const Document& doc;
};
-
- // XXX again, unique_ptr would be useful. shared_ptr is too
- // bloated since the objects have a well-defined single owner
- // during their entire lifetime (Document). FBX files have
- // up to many thousands of objects (most of which we never use),
- // so the memory overhead for them should be kept at a minimum.
- typedef std::map<uint64_t, LazyObject*> ObjectMap;
- typedef std::fbx_unordered_map<std::string, boost::shared_ptr<const PropertyTable> > PropertyTemplateMap;
+// XXX again, unique_ptr would be useful. shared_ptr is too
+// bloated since the objects have a well-defined single owner
+// during their entire lifetime (Document). FBX files have
+// up to many thousands of objects (most of which we never use),
+// so the memory overhead for them should be kept at a minimum.
+typedef std::map<uint64_t, LazyObject*> ObjectMap;
+typedef std::fbx_unordered_map<std::string, std::shared_ptr<const PropertyTable> > PropertyTemplateMap;
- typedef std::multimap<uint64_t, const Connection*> ConnectionMap;
+typedef std::multimap<uint64_t, const Connection*> ConnectionMap;
/** DOM class for global document settings, a single instance per document can
@@ -1211,183 +1013,171 @@ public:
class FileGlobalSettings
{
public:
-
- FileGlobalSettings(const Document& doc, boost::shared_ptr<const PropertyTable> props);
- ~FileGlobalSettings();
-
-public:
-
- const PropertyTable& Props() const {
- ai_assert(props.get());
- return *props.get();
- }
-
- const Document& GetDocument() const {
- return doc;
- }
-
-
- fbx_simple_property(UpAxis, int, 1);
- fbx_simple_property(UpAxisSign, int, 1);
- fbx_simple_property(FrontAxis, int, 2);
- fbx_simple_property(FrontAxisSign, int, 1);
- fbx_simple_property(CoordAxis, int, 0);
- fbx_simple_property(CoordAxisSign, int, 1);
- fbx_simple_property(OriginalUpAxis, int, 0);
- fbx_simple_property(OriginalUpAxisSign, int, 1);
- fbx_simple_property(UnitScaleFactor, double, 1);
- fbx_simple_property(OriginalUnitScaleFactor, double, 1);
- fbx_simple_property(AmbientColor, aiVector3D, aiVector3D(0,0,0));
- fbx_simple_property(DefaultCamera, std::string, "");
-
-
- enum FrameRate {
- FrameRate_DEFAULT = 0,
- FrameRate_120 = 1,
- FrameRate_100 = 2,
- FrameRate_60 = 3,
- FrameRate_50 = 4,
- FrameRate_48 = 5,
- FrameRate_30 = 6,
- FrameRate_30_DROP = 7,
- FrameRate_NTSC_DROP_FRAME = 8,
- FrameRate_NTSC_FULL_FRAME = 9,
- FrameRate_PAL = 10,
- FrameRate_CINEMA = 11,
- FrameRate_1000 = 12,
- FrameRate_CINEMA_ND = 13,
- FrameRate_CUSTOM = 14,
-
- FrameRate_MAX// end-of-enum sentinel
- };
-
- fbx_simple_enum_property(TimeMode, FrameRate, FrameRate_DEFAULT);
- fbx_simple_property(TimeSpanStart, uint64_t, 0L);
- fbx_simple_property(TimeSpanStop, uint64_t, 0L);
- fbx_simple_property(CustomFrameRate, float, -1.0f);
-
+ FileGlobalSettings(const Document& doc, std::shared_ptr<const PropertyTable> props);
+ ~FileGlobalSettings();
+
+ const PropertyTable& Props() const {
+ ai_assert(props.get());
+ return *props.get();
+ }
+
+ const Document& GetDocument() const {
+ return doc;
+ }
+
+ fbx_simple_property(UpAxis, int, 1)
+ fbx_simple_property(UpAxisSign, int, 1)
+ fbx_simple_property(FrontAxis, int, 2)
+ fbx_simple_property(FrontAxisSign, int, 1)
+ fbx_simple_property(CoordAxis, int, 0)
+ fbx_simple_property(CoordAxisSign, int, 1)
+ fbx_simple_property(OriginalUpAxis, int, 0)
+ fbx_simple_property(OriginalUpAxisSign, int, 1)
+ fbx_simple_property(UnitScaleFactor, double, 1)
+ fbx_simple_property(OriginalUnitScaleFactor, double, 1)
+ fbx_simple_property(AmbientColor, aiVector3D, aiVector3D(0,0,0))
+ fbx_simple_property(DefaultCamera, std::string, "")
+
+
+ enum FrameRate {
+ FrameRate_DEFAULT = 0,
+ FrameRate_120 = 1,
+ FrameRate_100 = 2,
+ FrameRate_60 = 3,
+ FrameRate_50 = 4,
+ FrameRate_48 = 5,
+ FrameRate_30 = 6,
+ FrameRate_30_DROP = 7,
+ FrameRate_NTSC_DROP_FRAME = 8,
+ FrameRate_NTSC_FULL_FRAME = 9,
+ FrameRate_PAL = 10,
+ FrameRate_CINEMA = 11,
+ FrameRate_1000 = 12,
+ FrameRate_CINEMA_ND = 13,
+ FrameRate_CUSTOM = 14,
+
+ FrameRate_MAX// end-of-enum sentinel
+ };
+
+ fbx_simple_enum_property(TimeMode, FrameRate, FrameRate_DEFAULT)
+ fbx_simple_property(TimeSpanStart, uint64_t, 0L)
+ fbx_simple_property(TimeSpanStop, uint64_t, 0L)
+ fbx_simple_property(CustomFrameRate, float, -1.0f)
private:
-
- boost::shared_ptr<const PropertyTable> props;
- const Document& doc;
+ std::shared_ptr<const PropertyTable> props;
+ const Document& doc;
};
/** DOM root for a FBX file */
-class Document
+class Document
{
public:
+ Document(const Parser& parser, const ImportSettings& settings);
+ ~Document();
- Document(const Parser& parser, const ImportSettings& settings);
- ~Document();
+ LazyObject* GetObject(uint64_t id) const;
-public:
-
- LazyObject* GetObject(uint64_t id) const;
+ bool IsBinary() const {
+ return parser.IsBinary();
+ }
- bool IsBinary() const {
- return parser.IsBinary();
- }
+ unsigned int FBXVersion() const {
+ return fbxVersion;
+ }
- unsigned int FBXVersion() const {
- return fbxVersion;
- }
+ const std::string& Creator() const {
+ return creator;
+ }
- const std::string& Creator() const {
- return creator;
- }
+ // elements (in this order): Year, Month, Day, Hour, Second, Millisecond
+ const unsigned int* CreationTimeStamp() const {
+ return creationTimeStamp;
+ }
- // elements (in this order): Uear, Month, Day, Hour, Second, Millisecond
- const unsigned int* CreationTimeStamp() const {
- return creationTimeStamp;
- }
+ const FileGlobalSettings& GlobalSettings() const {
+ ai_assert(globals.get());
+ return *globals.get();
+ }
- const FileGlobalSettings& GlobalSettings() const {
- ai_assert(globals.get());
- return *globals.get();
- }
+ const PropertyTemplateMap& Templates() const {
+ return templates;
+ }
- const PropertyTemplateMap& Templates() const {
- return templates;
- }
+ const ObjectMap& Objects() const {
+ return objects;
+ }
- const ObjectMap& Objects() const {
- return objects;
- }
+ const ImportSettings& Settings() const {
+ return settings;
+ }
- const ImportSettings& Settings() const {
- return settings;
- }
+ const ConnectionMap& ConnectionsBySource() const {
+ return src_connections;
+ }
- const ConnectionMap& ConnectionsBySource() const {
- return src_connections;
- }
+ const ConnectionMap& ConnectionsByDestination() const {
+ return dest_connections;
+ }
- const ConnectionMap& ConnectionsByDestination() const {
- return dest_connections;
- }
+ // note: the implicit rule in all DOM classes is to always resolve
+ // from destination to source (since the FBX object hierarchy is,
+ // with very few exceptions, a DAG, this avoids cycles). In all
+ // cases that may involve back-facing edges in the object graph,
+ // use LazyObject::IsBeingConstructed() to check.
- // note: the implicit rule in all DOM classes is to always resolve
- // from destination to source (since the FBX object hierarchy is,
- // with very few exceptions, a DAG, this avoids cycles). In all
- // cases that may involve back-facing edges in the object graph,
- // use LazyObject::IsBeingConstructed() to check.
+ std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source) const;
+ std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest) const;
- std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source) const;
- std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest) const;
+ std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source, const char* classname) const;
+ std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest, const char* classname) const;
- std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source, const char* classname) const;
- std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest, const char* classname) const;
+ std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source,
+ const char* const* classnames, size_t count) const;
+ std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest,
+ const char* const* classnames,
+ size_t count) const;
- std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source,
- const char* const* classnames, size_t count) const;
- std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest,
- const char* const* classnames,
- size_t count) const;
-
- const std::vector<const AnimationStack*>& AnimationStacks() const;
+ const std::vector<const AnimationStack*>& AnimationStacks() const;
private:
-
- std::vector<const Connection*> GetConnectionsSequenced(uint64_t id, const ConnectionMap&) const;
- std::vector<const Connection*> GetConnectionsSequenced(uint64_t id, bool is_src,
- const ConnectionMap&,
- const char* const* classnames,
- size_t count) const;
+ std::vector<const Connection*> GetConnectionsSequenced(uint64_t id, const ConnectionMap&) const;
+ std::vector<const Connection*> GetConnectionsSequenced(uint64_t id, bool is_src,
+ const ConnectionMap&,
+ const char* const* classnames,
+ size_t count) const;
private:
-
- void ReadHeader();
- void ReadObjects();
- void ReadPropertyTemplates();
- void ReadConnections();
- void ReadGlobalSettings();
+ void ReadHeader();
+ void ReadObjects();
+ void ReadPropertyTemplates();
+ void ReadConnections();
+ void ReadGlobalSettings();
private:
+ const ImportSettings& settings;
- const ImportSettings& settings;
-
- ObjectMap objects;
- const Parser& parser;
+ ObjectMap objects;
+ const Parser& parser;
- PropertyTemplateMap templates;
- ConnectionMap src_connections;
- ConnectionMap dest_connections;
+ PropertyTemplateMap templates;
+ ConnectionMap src_connections;
+ ConnectionMap dest_connections;
- unsigned int fbxVersion;
- std::string creator;
- unsigned int creationTimeStamp[7];
+ unsigned int fbxVersion;
+ std::string creator;
+ unsigned int creationTimeStamp[7];
- std::vector<uint64_t> animationStacks;
- mutable std::vector<const AnimationStack*> animationStacksResolved;
+ std::vector<uint64_t> animationStacks;
+ mutable std::vector<const AnimationStack*> animationStacksResolved;
- boost::scoped_ptr<FileGlobalSettings> globals;
+ std::unique_ptr<FileGlobalSettings> globals;
};
-}
-}
+} // Namespace FBX
+} // Namespace Assimp
-#endif
+#endif // INCLUDED_AI_FBX_DOCUMENT_H