diff --git a/code/FBXDocument.cpp b/code/FBXDocument.cpp index 242f52c7a..dfc76033d 100644 --- a/code/FBXDocument.cpp +++ b/code/FBXDocument.cpp @@ -215,6 +215,22 @@ Object::~Object() } +// ------------------------------------------------------------------------------------------------ +FileGlobalSettings::FileGlobalSettings(const Document& doc, boost::shared_ptr props) +: doc(doc) +, props(props) +{ + +} + + +// ------------------------------------------------------------------------------------------------ +FileGlobalSettings::~FileGlobalSettings() +{ + +} + + // ------------------------------------------------------------------------------------------------ Document::Document(const Parser& parser, const ImportSettings& settings) : settings(settings) @@ -228,6 +244,8 @@ Document::Document(const Parser& parser, const ImportSettings& settings) ReadHeader(); ReadPropertyTemplates(); + ReadGlobalSettings(); + // this order is important, connections need parsed objects to check // whether connections are ok or not. Objects may not be evaluated yet, // though, since this may require valid connections. @@ -283,6 +301,25 @@ void Document::ReadHeader() } } +// ------------------------------------------------------------------------------------------------ +void Document::ReadGlobalSettings() +{ + const Scope& sc = parser.GetRootScope(); + const Element* const ehead = sc["GlobalSettings"]; + if(!ehead || !ehead->Compound()) { + DOMError("no GlobalSettings dictionary found"); + } + + const Element* Properties70 = (*ehead->Compound())["Properties70"]; + if(!Properties70) { + DOMError("GlobalSettings dictionary contains no property table"); + } + + globals.reset(new FileGlobalSettings(*this, boost::make_shared( + *Properties70,boost::shared_ptr(static_cast(NULL)) + ))); +} + // ------------------------------------------------------------------------------------------------ void Document::ReadObjects() @@ -456,7 +493,8 @@ LazyObject* Document::GetObject(uint64_t id) const #define MAX_CLASSNAMES 6 // ------------------------------------------------------------------------------------------------ -std::vector Document::GetConnectionsSequenced(uint64_t id, const ConnectionMap& conns) const +std::vector Document::GetConnectionsSequenced(uint64_t id, + const ConnectionMap& conns) const { std::vector temp; @@ -475,7 +513,11 @@ std::vector Document::GetConnectionsSequenced(uint64_t id, co // ------------------------------------------------------------------------------------------------ -std::vector Document::GetConnectionsSequenced(uint64_t id, bool is_src, const ConnectionMap& conns, const char* const* classnames, size_t count) const +std::vector Document::GetConnectionsSequenced(uint64_t id, bool is_src, + const ConnectionMap& conns, + const char* const* classnames, + size_t count) const + { ai_assert(classnames); ai_assert(count != 0 && count <= MAX_CLASSNAMES); @@ -530,7 +572,8 @@ std::vector Document::GetConnectionsBySourceSequenced(uint64_ // ------------------------------------------------------------------------------------------------ -std::vector Document::GetConnectionsBySourceSequenced(uint64_t dest, const char* classname) const +std::vector Document::GetConnectionsBySourceSequenced(uint64_t dest, + const char* classname) const { const char* arr[] = {classname}; return GetConnectionsBySourceSequenced(dest, arr,1); @@ -539,14 +582,16 @@ std::vector Document::GetConnectionsBySourceSequenced(uint64_ // ------------------------------------------------------------------------------------------------ -std::vector Document::GetConnectionsBySourceSequenced(uint64_t source, const char* const* classnames, size_t count) const +std::vector Document::GetConnectionsBySourceSequenced(uint64_t source, + const char* const* classnames, size_t count) const { return GetConnectionsSequenced(source, true, ConnectionsBySource(),classnames, count); } // ------------------------------------------------------------------------------------------------ -std::vector Document::GetConnectionsByDestinationSequenced(uint64_t dest, const char* classname) const +std::vector Document::GetConnectionsByDestinationSequenced(uint64_t dest, + const char* classname) const { const char* arr[] = {classname}; return GetConnectionsByDestinationSequenced(dest, arr,1); @@ -561,14 +606,18 @@ std::vector Document::GetConnectionsByDestinationSequenced(ui // ------------------------------------------------------------------------------------------------ -std::vector Document::GetConnectionsByDestinationSequenced(uint64_t dest, const char* const* classnames, size_t count) const +std::vector Document::GetConnectionsByDestinationSequenced(uint64_t dest, + const char* const* classnames, size_t count) const + { return GetConnectionsSequenced(dest, false, ConnectionsByDestination(),classnames, count); } // ------------------------------------------------------------------------------------------------ -Connection::Connection(uint64_t insertionOrder, uint64_t src, uint64_t dest, const std::string& prop, const Document& doc) +Connection::Connection(uint64_t insertionOrder, uint64_t src, uint64_t dest, const std::string& prop, + const Document& doc) + : insertionOrder(insertionOrder) , prop(prop) , src(src) diff --git a/code/FBXDocument.h b/code/FBXDocument.h index 07f474955..63f779ddc 100644 --- a/code/FBXDocument.h +++ b/code/FBXDocument.h @@ -1099,6 +1099,77 @@ public: typedef std::multimap ConnectionMap; +/** DOM class for global document settings, a single instance per document can + * be accessed via Document.Globals(). */ +class FileGlobalSettings +{ +public: + + FileGlobalSettings(const Document& doc, boost::shared_ptr 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_TIME_MODE_COUNT = 15, + + 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 props; + const Document& doc; +}; + + + + /** DOM root for a FBX file */ class Document { @@ -1128,6 +1199,11 @@ public: return creationTimeStamp; } + const FileGlobalSettings& GlobalSettings() const { + ai_assert(globals.get()); + return *globals.get(); + } + const PropertyTemplateMap& Templates() const { return templates; } @@ -1182,6 +1258,7 @@ private: void ReadObjects(); void ReadPropertyTemplates(); void ReadConnections(); + void ReadGlobalSettings(); private: @@ -1200,6 +1277,8 @@ private: std::vector animationStacks; mutable std::vector animationStacksResolved; + + boost::scoped_ptr globals; }; }