diff --git a/code/FBXDocument.cpp b/code/FBXDocument.cpp index f36113fdc..59dddfabf 100644 --- a/code/FBXDocument.cpp +++ b/code/FBXDocument.cpp @@ -363,9 +363,10 @@ boost::shared_ptr GetPropertyTable(const Document& doc, using namespace Util; // ------------------------------------------------------------------------------------------------ -LazyObject::LazyObject(const Element& element, const Document& doc) +LazyObject::LazyObject(uint64_t id, const Element& element, const Document& doc) : doc(doc) , element(element) +, id(id) { } @@ -401,17 +402,22 @@ const Object* LazyObject::Get() DOMError(err,&element); } + // XXX prevent recursive calls + // this needs to be relatively fast since it happens a lot, // so avoid constructing strings all the time. const char* obtype = key.begin(); const size_t length = static_cast(key.end()-key.begin()); if (!strncmp(obtype,"Geometry",length)) { if (!strcmp(classtag.c_str(),"Mesh")) { - object.reset(new MeshGeometry(element,name,doc.Settings())); + object.reset(new MeshGeometry(id,element,name,doc.Settings())); } } else if (!strncmp(obtype,"Material",length)) { - object.reset(new Material(element,doc,name)); + object.reset(new Material(id,element,doc,name)); + } + else if (!strncmp(obtype,"Texture",length)) { + object.reset(new Texture(id,element,doc,name)); } if (!object.get()) { @@ -422,9 +428,10 @@ const Object* LazyObject::Get() } // ------------------------------------------------------------------------------------------------ -Object::Object(const Element& element, const std::string& name) +Object::Object(uint64_t id, const Element& element, const std::string& name) : element(element) , name(name) +, id(id) { } @@ -437,8 +444,8 @@ Object::~Object() // ------------------------------------------------------------------------------------------------ -Geometry::Geometry(const Element& element, const std::string& name) -: Object(element,name) +Geometry::Geometry(uint64_t id, const Element& element, const std::string& name) +: Object(id, element,name) { } @@ -498,7 +505,7 @@ void Document::ReadObjects() DOMError(err,el.second); } - objects[id] = new LazyObject(*el.second, *this); + objects[id] = new LazyObject(id, *el.second, *this); // DEBUG - evaluate all objects const Object* o = objects[id]->Get(); } diff --git a/code/FBXDocument.h b/code/FBXDocument.h index 790eca3af..51a3de448 100644 --- a/code/FBXDocument.h +++ b/code/FBXDocument.h @@ -66,7 +66,7 @@ class LazyObject { public: - LazyObject(const Element& element, const Document& doc); + LazyObject(uint64_t id, const Element& element, const Document& doc); ~LazyObject(); public: @@ -79,11 +79,17 @@ public: return ob ? dynamic_cast(ob) : NULL; } + uint64_t ID() const { + return id; + } + private: const Document& doc; const Element& element; boost::scoped_ptr object; + + const uint64_t id; }; @@ -93,7 +99,7 @@ class Object { public: - Object(const Element& element, const std::string& name); + Object(uint64_t id, const Element& element, const std::string& name); virtual ~Object(); public: @@ -106,9 +112,14 @@ public: return name; } + uint64_t ID() const { + return id; + } + protected: const Element& element; const std::string name; + const uint64_t id; }; @@ -119,7 +130,7 @@ class Texture : public Object { public: - Texture(const Element& element, const Document& doc, const std::string& name); + Texture(uint64_t id, const Element& element, const Document& doc, const std::string& name); ~Texture(); public: @@ -181,7 +192,7 @@ class Material : public Object { public: - Material(const Element& element, const Document& doc, const std::string& name); + Material(uint64_t id, const Element& element, const Document& doc, const std::string& name); ~Material(); public: @@ -218,7 +229,7 @@ class Geometry : public Object { public: - Geometry(const Element& element, const std::string& name); + Geometry(uint64_t id, const Element& element, const std::string& name); ~Geometry(); }; @@ -229,7 +240,7 @@ class MeshGeometry : public Geometry public: - MeshGeometry(const Element& element, const std::string& name, const ImportSettings& settings); + MeshGeometry(uint64_t id, const Element& element, const std::string& name, const ImportSettings& settings); ~MeshGeometry(); public: diff --git a/code/FBXMaterial.cpp b/code/FBXMaterial.cpp index bf2edded0..56bef45d4 100644 --- a/code/FBXMaterial.cpp +++ b/code/FBXMaterial.cpp @@ -58,8 +58,8 @@ namespace FBX { using namespace Util; // ------------------------------------------------------------------------------------------------ -Material::Material(const Element& element, const Document& doc, const std::string& name) -: Object(element,name) +Material::Material(uint64_t id, const Element& element, const Document& doc, const std::string& name) +: Object(id,element,name) { const Scope& sc = GetRequiredScope(element); @@ -92,6 +92,9 @@ Material::Material(const Element& element, const Document& doc, const std::strin } props = GetPropertyTable(doc,templateName,element,sc); + + // resolve texture links + doc.GetConnectionsByDestinationSequenced(ID()); } @@ -102,8 +105,8 @@ Material::~Material() // ------------------------------------------------------------------------------------------------ -Texture::Texture(const Element& element, const Document& doc, const std::string& name) -: Object(element,name) +Texture::Texture(uint64_t id, const Element& element, const Document& doc, const std::string& name) +: Object(id,element,name) , uvScaling(1.0f,1.0f) { const Scope& sc = GetRequiredScope(element); diff --git a/code/FBXMeshGeometry.cpp b/code/FBXMeshGeometry.cpp index a3bfaedeb..d066ed0e7 100644 --- a/code/FBXMeshGeometry.cpp +++ b/code/FBXMeshGeometry.cpp @@ -58,8 +58,8 @@ namespace FBX { using namespace Util; // ------------------------------------------------------------------------------------------------ -MeshGeometry::MeshGeometry(const Element& element, const std::string& name, const ImportSettings& settings) -: Geometry(element,name) +MeshGeometry::MeshGeometry(uint64_t id, const Element& element, const std::string& name, const ImportSettings& settings) +: Geometry(id, element,name) { const Scope* sc = element.Compound(); if (!sc) {