diff --git a/code/FBXDocument.cpp b/code/FBXDocument.cpp index e66de9c58..f36113fdc 100644 --- a/code/FBXDocument.cpp +++ b/code/FBXDocument.cpp @@ -45,6 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_FBX_IMPORTER +#include + #include "FBXParser.h" #include "FBXDocument.h" #include "FBXUtil.h" @@ -612,6 +614,42 @@ LazyObject* Document::GetObject(uint64_t id) const return it == objects.end() ? NULL : (*it).second; } +// ------------------------------------------------------------------------------------------------ +std::vector Document::GetConnectionsBySourceSequenced(uint64_t source) const +{ + std::vector temp; + + const std::pair range = + ConnectionsBySource().equal_range(source); + + temp.reserve(std::distance(range.first,range.second)); + for (ConnectionMap::const_iterator it = range.first; it != range.second; ++it) { + temp.push_back((*it).second); + } + + std::sort(temp.begin(), temp.end(), std::mem_fun(&Connection::CompareTo)); + + return temp; // NRVO should handle this +} + + +// ------------------------------------------------------------------------------------------------ +std::vector Document::GetConnectionsByDestinationSequenced(uint64_t dest) const +{ + std::vector temp; + + const std::pair range = + ConnectionsByDestination().equal_range(dest); + + temp.reserve(std::distance(range.first,range.second)); + for (ConnectionMap::const_iterator it = range.first; it != range.second; ++it) { + temp.push_back((*it).second); + } + + std::sort(temp.begin(), temp.end(), std::mem_fun(&Connection::CompareTo)); + + return temp; // NRVO should handle this +} // ------------------------------------------------------------------------------------------------ Connection::Connection(uint64_t insertionOrder, uint64_t src, uint64_t dest, const std::string& prop, const Document& doc) diff --git a/code/FBXDocument.h b/code/FBXDocument.h index 2ad53ae94..790eca3af 100644 --- a/code/FBXDocument.h +++ b/code/FBXDocument.h @@ -358,6 +358,17 @@ public: return insertionOrder; } + int CompareTo(const Connection* c) const { + // note: can't subtract because this would overflow uint64_t + if(InsertionOrder() > c->InsertionOrder()) { + return 1; + } + else if(InsertionOrder() < c->InsertionOrder()) { + return -1; + } + return 0; + } + public: uint64_t insertionOrder; @@ -379,6 +390,7 @@ public: typedef std::multimap ConnectionMap; + /** DOM root for a FBX file */ class Document { @@ -411,6 +423,9 @@ public: return dest_connections; } + std::vector GetConnectionsBySourceSequenced(uint64_t source) const; + std::vector GetConnectionsByDestinationSequenced(uint64_t dest) const; + private: void ReadObjects();