- fbx: add utility functions to filter connections to other objects by their type.
parent
4f6dbac919
commit
5db5634494
|
@ -734,14 +734,15 @@ LazyObject* Document::GetObject(uint64_t id) const
|
||||||
return it == objects.end() ? NULL : (*it).second;
|
return it == objects.end() ? NULL : (*it).second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_CLASSNAMES 6
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
std::vector<const Connection*> Document::GetConnectionsBySourceSequenced(uint64_t source) const
|
std::vector<const Connection*> Document::GetConnectionsSequenced(uint64_t id, const ConnectionMap& conns) const
|
||||||
{
|
{
|
||||||
std::vector<const Connection*> temp;
|
std::vector<const Connection*> temp;
|
||||||
|
|
||||||
const std::pair<ConnectionMap::const_iterator,ConnectionMap::const_iterator> range =
|
const std::pair<ConnectionMap::const_iterator,ConnectionMap::const_iterator> range =
|
||||||
ConnectionsBySource().equal_range(source);
|
conns.equal_range(id);
|
||||||
|
|
||||||
temp.reserve(std::distance(range.first,range.second));
|
temp.reserve(std::distance(range.first,range.second));
|
||||||
for (ConnectionMap::const_iterator it = range.first; it != range.second; ++it) {
|
for (ConnectionMap::const_iterator it = range.first; it != range.second; ++it) {
|
||||||
|
@ -754,22 +755,74 @@ std::vector<const Connection*> Document::GetConnectionsBySourceSequenced(uint64_
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<const Connection*> Document::GetConnectionsSequenced(uint64_t id, const ConnectionMap& conns, const char* const* classnames, size_t count) const
|
||||||
|
{
|
||||||
|
ai_assert(classnames);
|
||||||
|
ai_assert(count != 0 && count <= MAX_CLASSNAMES);
|
||||||
|
|
||||||
|
size_t lenghts[MAX_CLASSNAMES];
|
||||||
|
|
||||||
|
const size_t c = count;
|
||||||
|
for (size_t i = 0; i < c; ++i) {
|
||||||
|
lenghts[i] = strlen(classnames[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<const Connection*> temp;
|
||||||
|
|
||||||
|
const std::pair<ConnectionMap::const_iterator,ConnectionMap::const_iterator> range =
|
||||||
|
conns.equal_range(id);
|
||||||
|
|
||||||
|
temp.reserve(std::distance(range.first,range.second));
|
||||||
|
for (ConnectionMap::const_iterator it = range.first; it != range.second; ++it) {
|
||||||
|
const Token& key = (*it).second->LazyDestinationObject().GetElement().KeyToken();
|
||||||
|
const char* obtype = key.begin();
|
||||||
|
|
||||||
|
for (size_t i = 0; i < c; ++i) {
|
||||||
|
ai_assert(classnames[i]);
|
||||||
|
if(!strncmp(classnames[i],obtype,lenghts[i])) {
|
||||||
|
obtype = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(obtype) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp.push_back((*it).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::sort(temp.begin(), temp.end(), std::mem_fun(&Connection::Compare));
|
||||||
|
return temp; // NRVO should handle this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<const Connection*> Document::GetConnectionsBySourceSequenced(uint64_t source) const
|
||||||
|
{
|
||||||
|
return GetConnectionsSequenced(source, ConnectionsBySource());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<const Connection*> Document::GetConnectionsBySourceSequenced(uint64_t source, const char* const* classnames, size_t count) const
|
||||||
|
{
|
||||||
|
return GetConnectionsSequenced(source, ConnectionsBySource(),classnames, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
std::vector<const Connection*> Document::GetConnectionsByDestinationSequenced(uint64_t dest) const
|
std::vector<const Connection*> Document::GetConnectionsByDestinationSequenced(uint64_t dest) const
|
||||||
{
|
{
|
||||||
std::vector<const Connection*> temp;
|
return GetConnectionsSequenced(dest, ConnectionsByDestination());
|
||||||
|
|
||||||
const std::pair<ConnectionMap::const_iterator,ConnectionMap::const_iterator> 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::Compare));
|
|
||||||
|
|
||||||
return temp; // NRVO should handle this
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<const Connection*> Document::GetConnectionsByDestinationSequenced(uint64_t dest, const char* const* classnames, size_t count) const
|
||||||
|
{
|
||||||
|
return GetConnectionsSequenced(dest, ConnectionsByDestination(),classnames, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -89,6 +89,14 @@ public:
|
||||||
return being_constructed;
|
return being_constructed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Element& GetElement() const {
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Document& GetDocument() const {
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
const Document& doc;
|
const Document& doc;
|
||||||
|
@ -669,8 +677,16 @@ public:
|
||||||
std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source) const;
|
std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source) const;
|
||||||
std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest) const;
|
std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest) const;
|
||||||
|
|
||||||
|
std::vector<const Connection*> GetConnectionsBySourceSequenced(uint64_t source, const char* const* classnames, size_t count) const;
|
||||||
|
std::vector<const Connection*> GetConnectionsByDestinationSequenced(uint64_t dest, const char* const* classnames, size_t count) const;
|
||||||
|
|
||||||
const std::vector<const AnimationStack*>& AnimationStacks() const;
|
const std::vector<const AnimationStack*>& AnimationStacks() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
std::vector<const Connection*> GetConnectionsSequenced(uint64_t id, const ConnectionMap&) const;
|
||||||
|
std::vector<const Connection*> GetConnectionsSequenced(uint64_t id, const ConnectionMap&, const char* const* classnames, size_t count) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void ReadHeader();
|
void ReadHeader();
|
||||||
|
|
Loading…
Reference in New Issue