2
0
Эх сурвалжийг харах

- fbx: read first set of header properties (format version, timestamp etc).

Alexander Gessler 13 жил өмнө
parent
commit
1a9790ae9a

+ 38 - 0
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()
 {

+ 20 - 0
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];
+
 };
 
 }