diff options
Diffstat (limited to 'src/3rdparty/assimp/code/FBXDocument.h')
-rw-r--r-- | src/3rdparty/assimp/code/FBXDocument.h | 1776 |
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 |