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