Fix 3DS instances loading, fixes #151

pull/217/head
Martin Büchler 2014-01-30 02:39:04 +01:00
parent 3cc4ece11e
commit 9f10553601
3 changed files with 66 additions and 31 deletions

View File

@ -467,12 +467,14 @@ void Discreet3DSImporter::AddNodeToGraph(aiScene* pcSOut,aiNode* pcOut,
const unsigned int iIndex = iArray[i]; const unsigned int iIndex = iArray[i];
aiMesh* const mesh = pcSOut->mMeshes[iIndex]; aiMesh* const mesh = pcSOut->mMeshes[iIndex];
if (mesh->mColors[1] == NULL)
{
// Transform the vertices back into their local space // Transform the vertices back into their local space
// fixme: consider computing normals after this, so we don't need to transform them // fixme: consider computing normals after this, so we don't need to transform them
const aiVector3D* const pvEnd = mesh->mVertices+mesh->mNumVertices; const aiVector3D* const pvEnd = mesh->mVertices + mesh->mNumVertices;
aiVector3D* pvCurrent = mesh->mVertices, *t2 = mesh->mNormals; aiVector3D* pvCurrent = mesh->mVertices, *t2 = mesh->mNormals;
for (;pvCurrent != pvEnd;++pvCurrent,++t2) { for (; pvCurrent != pvEnd; ++pvCurrent, ++t2) {
*pvCurrent = mInv * (*pvCurrent); *pvCurrent = mInv * (*pvCurrent);
*t2 = mInvTransposed * (*t2); *t2 = mInvTransposed * (*t2);
} }
@ -481,7 +483,7 @@ void Discreet3DSImporter::AddNodeToGraph(aiScene* pcSOut,aiNode* pcOut,
if (imesh->mMat.Determinant() < 0.0f) if (imesh->mMat.Determinant() < 0.0f)
{ {
/* we *must* have normals */ /* we *must* have normals */
for (pvCurrent = mesh->mVertices,t2 = mesh->mNormals;pvCurrent != pvEnd;++pvCurrent,++t2) { for (pvCurrent = mesh->mVertices, t2 = mesh->mNormals; pvCurrent != pvEnd; ++pvCurrent, ++t2) {
pvCurrent->x *= -1.f; pvCurrent->x *= -1.f;
t2->x *= -1.f; t2->x *= -1.f;
} }
@ -489,19 +491,34 @@ void Discreet3DSImporter::AddNodeToGraph(aiScene* pcSOut,aiNode* pcOut,
} }
// Handle pivot point // Handle pivot point
if(pivot.x || pivot.y || pivot.z) if (pivot.x || pivot.y || pivot.z)
{ {
for (pvCurrent = mesh->mVertices;pvCurrent != pvEnd;++pvCurrent) { for (pvCurrent = mesh->mVertices; pvCurrent != pvEnd; ++pvCurrent) {
*pvCurrent -= pivot; *pvCurrent -= pivot;
} }
} }
mesh->mColors[1] = (aiColor4D*)1;
}
else
mesh->mColors[1] = (aiColor4D*)1;
// Setup the mesh index // Setup the mesh index
pcOut->mMeshes[i] = iIndex; pcOut->mMeshes[i] = iIndex;
} }
} }
// Setup the name of the node // Setup the name of the node
// First instance keeps its name otherwise something might break, all others will be postfixed with their instance number
if (pcIn->mInstanceNumber > 1)
{
char tmp[12];
ASSIMP_itoa10(tmp, pcIn->mInstanceNumber);
std::string tempStr = pcIn->mName + "_inst_";
tempStr += tmp;
pcOut->mName.Set(tempStr);
}
else
pcOut->mName.Set(pcIn->mName); pcOut->mName.Set(pcIn->mName);
// Now build the transformation matrix of the node // Now build the transformation matrix of the node
@ -784,9 +801,12 @@ void Discreet3DSImporter::GenerateNodeGraph(aiScene* pcOut)
AddNodeToGraph(pcOut, pcOut->mRootNode, mRootNode,m); AddNodeToGraph(pcOut, pcOut->mRootNode, mRootNode,m);
} }
// We used the first vertex color set to store some emporary values so we need to cleanup here // We used the first and second vertex color set to store some temporary values so we need to cleanup here
for (unsigned int a = 0; a < pcOut->mNumMeshes;++a) for (unsigned int a = 0; a < pcOut->mNumMeshes; ++a)
{
pcOut->mMeshes[a]->mColors[0] = NULL; pcOut->mMeshes[a]->mColors[0] = NULL;
pcOut->mMeshes[a]->mColors[1] = NULL;
}
pcOut->mRootNode->mTransformation = aiMatrix4x4( pcOut->mRootNode->mTransformation = aiMatrix4x4(
1.f,0.f,0.f,0.f, 1.f,0.f,0.f,0.f,

View File

@ -481,6 +481,7 @@ struct Node
: mHierarchyPos (0) : mHierarchyPos (0)
, mHierarchyIndex (0) , mHierarchyIndex (0)
, mInstanceCount (1)
{ {
static int iCnt = 0; static int iCnt = 0;
@ -510,6 +511,9 @@ struct Node
//! Name of the node //! Name of the node
std::string mName; std::string mName;
//! InstanceNumber of the node
int32_t mInstanceNumber;
//! Dummy nodes: real name to be combined with the $$$DUMMY //! Dummy nodes: real name to be combined with the $$$DUMMY
std::string mDummyName; std::string mDummyName;
@ -539,6 +543,9 @@ struct Node
//! Pivot position loaded from the file //! Pivot position loaded from the file
aiVector3D vPivot; aiVector3D vPivot;
//instance count, will be kept only for the first node
int32_t mInstanceCount;
//! Add a child node, setup the right parent node for it //! Add a child node, setup the right parent node for it
//! \param pc Node to be 'adopted' //! \param pc Node to be 'adopted'
inline Node& push_back(Node* pc) inline Node& push_back(Node* pc)

View File

@ -659,14 +659,22 @@ void Discreet3DSImporter::ParseHierarchyChunk(uint16_t parent)
// Now find out whether we have this node already (target animation channels // Now find out whether we have this node already (target animation channels
// are stored with a separate object ID) // are stored with a separate object ID)
D3DS::Node* pcNode = FindNode(mRootNode,name); D3DS::Node* pcNode = FindNode(mRootNode,name);
if (pcNode) int instanceNumber = 1;
if ( pcNode)
{
// if the source is not a CHUNK_TRACKINFO block it wont be an object instance
if (parent != Discreet3DS::CHUNK_TRACKINFO)
{ {
// Make this node the current node
mCurrentNode = pcNode; mCurrentNode = pcNode;
break; break;
} }
pcNode->mInstanceCount++;
instanceNumber = pcNode->mInstanceCount;
}
pcNode = new D3DS::Node(); pcNode = new D3DS::Node();
pcNode->mName = name; pcNode->mName = name;
pcNode->mInstanceNumber = instanceNumber;
// There are two unknown values which we can safely ignore // There are two unknown values which we can safely ignore
stream->IncPtr(4); stream->IncPtr(4);