From 1a9790ae9aca2167e79a0e095ff7f3ee4dbac4ba Mon Sep 17 00:00:00 2001 From: Alexander Gessler Date: Fri, 6 Jul 2012 22:46:19 +0200 Subject: [PATCH] - fbx: read first set of header properties (format version, timestamp etc). --- code/FBXDocument.cpp | 38 ++++++++++++++++++++++++++++++++++++++ code/FBXDocument.h | 20 ++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/code/FBXDocument.cpp b/code/FBXDocument.cpp index b2c84d795..f5ad5bf61 100644 --- a/code/FBXDocument.cpp +++ b/code/FBXDocument.cpp @@ -468,6 +468,12 @@ Document::Document(const Parser& parser, const ImportSettings& settings) : parser(parser) , settings(settings) { + // cannot use array default initialization syntax because vc8 fails on it + for (unsigned int i = 0; i < 7; ++i) { + creationTimeStamp[i] = 0; + } + + ReadHeader(); ReadPropertyTemplates(); // this order is important, connections need parsed objects to check @@ -487,6 +493,38 @@ Document::~Document() } +// ------------------------------------------------------------------------------------------------ +void Document::ReadHeader() +{ + // read ID objects from "Objects" section + const Scope& sc = parser.GetRootScope(); + const Element* const ehead = sc["FBXHeaderExtension"]; + if(!ehead || !ehead->Compound()) { + DOMError("no FBXHeaderExtension dictionary found"); + } + + const Scope& shead = *ehead->Compound(); + fbxVersion = ParseTokenAsInt(GetRequiredToken(GetRequiredElement(shead,"FBXVersion",ehead),0)); + + const Element* const ecreator = shead["Creator"]; + if(ecreator) { + creator = ParseTokenAsString(GetRequiredToken(*ecreator,0)); + } + + const Element* const etimestamp = shead["CreationTimeStamp"]; + if(etimestamp && etimestamp->Compound()) { + const Scope& stimestamp = *etimestamp->Compound(); + creationTimeStamp[0] = ParseTokenAsInt(GetRequiredToken(GetRequiredElement(stimestamp,"Year"),0)); + creationTimeStamp[1] = ParseTokenAsInt(GetRequiredToken(GetRequiredElement(stimestamp,"Month"),0)); + creationTimeStamp[2] = ParseTokenAsInt(GetRequiredToken(GetRequiredElement(stimestamp,"Day"),0)); + creationTimeStamp[3] = ParseTokenAsInt(GetRequiredToken(GetRequiredElement(stimestamp,"Hour"),0)); + creationTimeStamp[4] = ParseTokenAsInt(GetRequiredToken(GetRequiredElement(stimestamp,"Minute"),0)); + creationTimeStamp[5] = ParseTokenAsInt(GetRequiredToken(GetRequiredElement(stimestamp,"Second"),0)); + creationTimeStamp[6] = ParseTokenAsInt(GetRequiredToken(GetRequiredElement(stimestamp,"Millisecond"),0)); + } +} + + // ------------------------------------------------------------------------------------------------ void Document::ReadObjects() { diff --git a/code/FBXDocument.h b/code/FBXDocument.h index 32f34fad2..54005fd3a 100644 --- a/code/FBXDocument.h +++ b/code/FBXDocument.h @@ -477,6 +477,20 @@ public: LazyObject* GetObject(uint64_t id) const; + + unsigned int FBXVersion() const { + return fbxVersion; + } + + const std::string& Creator() const { + return creator; + } + + // elements (in this order): Uear, Month, Day, Hour, Second, Millisecond + const unsigned int* CreationTimeStamp() const { + return creationTimeStamp; + } + const PropertyTemplateMap& Templates() const { return templates; } @@ -502,6 +516,7 @@ public: private: + void ReadHeader(); void ReadObjects(); void ReadPropertyTemplates(); void ReadConnections(); @@ -516,6 +531,11 @@ private: PropertyTemplateMap templates; ConnectionMap src_connections; ConnectionMap dest_connections; + + unsigned int fbxVersion; + std::string creator; + unsigned int creationTimeStamp[7]; + }; }