ASE bugfixes.
git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@98 67173fc5-114c-0410-ac8e-9d2fd5bffc1fpull/1/head
parent
028a543ddb
commit
f5be0b0475
|
@ -215,7 +215,7 @@ void ASEImporter::GenerateDefaultMaterial()
|
||||||
this->mParser->m_vMaterials.push_back ( ASE::Material() );
|
this->mParser->m_vMaterials.push_back ( ASE::Material() );
|
||||||
ASE::Material& mat = this->mParser->m_vMaterials.back();
|
ASE::Material& mat = this->mParser->m_vMaterials.back();
|
||||||
|
|
||||||
mat.mDiffuse = aiColor3D(0.5f,0.5f,0.5f);
|
mat.mDiffuse = aiColor3D(0.6f,0.6f,0.6f);
|
||||||
mat.mSpecular = aiColor3D(1.0f,1.0f,1.0f);
|
mat.mSpecular = aiColor3D(1.0f,1.0f,1.0f);
|
||||||
mat.mAmbient = aiColor3D(0.05f,0.05f,0.05f);
|
mat.mAmbient = aiColor3D(0.05f,0.05f,0.05f);
|
||||||
mat.mShading = Dot3DSFile::Gouraud;
|
mat.mShading = Dot3DSFile::Gouraud;
|
||||||
|
@ -409,12 +409,24 @@ void ASEImporter::BuildNodes()
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (szMyName[0].length() == szMyName2[1].length() &&
|
if (szMyName[1].length() == szMyName2[0].length() &&
|
||||||
0 == ASSIMP_stricmp ( szMyName[1].c_str(), szMyName2[0].c_str()))
|
0 == ASSIMP_stricmp ( szMyName[1].c_str(), szMyName2[0].c_str()))
|
||||||
{
|
{
|
||||||
bKnowParent = true;
|
bKnowParent = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if there is another mesh with the same unknown parent
|
||||||
|
// that has already been handled and added to the list
|
||||||
|
if (i2 < i)
|
||||||
|
{
|
||||||
|
if (szMyName[1].length() == szMyName2[1].length() &&
|
||||||
|
0 == ASSIMP_stricmp ( szMyName[1].c_str(), szMyName2[1].c_str()))
|
||||||
|
{
|
||||||
|
bKnowParent = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!bKnowParent)
|
if (!bKnowParent)
|
||||||
{
|
{
|
||||||
|
@ -430,19 +442,38 @@ void ASEImporter::BuildNodes()
|
||||||
apcNodes.push_back(pcScene->mRootNode->mChildren[i]);
|
apcNodes.push_back(pcScene->mRootNode->mChildren[i]);
|
||||||
|
|
||||||
delete[] pcScene->mRootNode->mChildren;
|
delete[] pcScene->mRootNode->mChildren;
|
||||||
for (std::vector<unsigned int>::const_iterator
|
for (std::vector<unsigned int>::/*const_*/iterator
|
||||||
i = aiList.begin();
|
i = aiList.begin();
|
||||||
i != aiList.end();++i)
|
i != aiList.end();++i)
|
||||||
{
|
{
|
||||||
std::string* szMyName = (std::string*)pcScene->mMeshes[*i]->mColors[1];
|
std::string* szMyName = (std::string*)pcScene->mMeshes[*i]->mColors[1];
|
||||||
if (!szMyName)continue;
|
if (!szMyName)continue;
|
||||||
|
|
||||||
|
#if 0 // moved to the scope above
|
||||||
|
for (std::vector<unsigned int>::iterator
|
||||||
|
a = i+1;
|
||||||
|
a != aiList.end();++a)
|
||||||
|
{
|
||||||
|
std::string* szMyName2 = (std::string*)pcScene->mMeshes[*i]->mColors[1];
|
||||||
|
if (!szMyName)continue;
|
||||||
|
if (0 == ASSIMP_stricmp(szMyName2->c_str(),szMyName->c_str()))
|
||||||
|
{
|
||||||
|
a = aiList.erase(a);
|
||||||
|
if (a == aiList.end())break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DefaultLogger::get()->info("Generating dummy node: " + szMyName[1] + ". "
|
||||||
|
"This node is not defined in the ASE file, but referenced as "
|
||||||
|
"parent node.");
|
||||||
|
|
||||||
// the parent is not known, so we can assume that we must add
|
// the parent is not known, so we can assume that we must add
|
||||||
// this node to the root node of the whole scene
|
// this node to the root node of the whole scene
|
||||||
aiNode* pcNode = new aiNode();
|
aiNode* pcNode = new aiNode();
|
||||||
pcNode->mParent = pcScene->mRootNode;
|
pcNode->mParent = pcScene->mRootNode;
|
||||||
pcNode->mName.Set(szMyName[1]);
|
pcNode->mName.Set(szMyName[1]);
|
||||||
this->AddNodes(pcNode,szMyName[1].c_str());
|
this->AddNodes(pcScene,pcNode,pcNode->mName.data);
|
||||||
apcNodes.push_back(pcNode);
|
apcNodes.push_back(pcNode);
|
||||||
}
|
}
|
||||||
pcScene->mRootNode->mChildren = new aiNode*[apcNodes.size()];
|
pcScene->mRootNode->mChildren = new aiNode*[apcNodes.size()];
|
||||||
|
@ -468,7 +499,7 @@ void ASEImporter::BuildNodes()
|
||||||
pc->mNumChildren = 0;
|
pc->mNumChildren = 0;
|
||||||
delete pc;
|
delete pc;
|
||||||
}
|
}
|
||||||
else if (0 == pcScene->mRootNode->mNumChildren)
|
else if (!pcScene->mRootNode->mNumChildren)
|
||||||
{
|
{
|
||||||
throw new ImportErrorException("No nodes loaded. The ASE/ASK file is either empty or corrupt");
|
throw new ImportErrorException("No nodes loaded. The ASE/ASK file is either empty or corrupt");
|
||||||
}
|
}
|
||||||
|
@ -528,6 +559,7 @@ void ASEImporter::BuildUniqueRepresentation(ASE::Mesh& mesh)
|
||||||
for (unsigned int n = 0; n < 3;++n,++iCurrent)
|
for (unsigned int n = 0; n < 3;++n,++iCurrent)
|
||||||
{
|
{
|
||||||
mPositions[iCurrent] = mesh.mPositions[(*i).mIndices[n]];
|
mPositions[iCurrent] = mesh.mPositions[(*i).mIndices[n]];
|
||||||
|
std::swap(mPositions[iCurrent].z,mPositions[iCurrent].y); // DX-to-OGL
|
||||||
|
|
||||||
// add texture coordinates
|
// add texture coordinates
|
||||||
for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS;++c)
|
for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS;++c)
|
||||||
|
@ -535,6 +567,7 @@ void ASEImporter::BuildUniqueRepresentation(ASE::Mesh& mesh)
|
||||||
if (!mesh.amTexCoords[c].empty())
|
if (!mesh.amTexCoords[c].empty())
|
||||||
{
|
{
|
||||||
amTexCoords[c][iCurrent] = mesh.amTexCoords[c][(*i).amUVIndices[c][n]];
|
amTexCoords[c][iCurrent] = mesh.amTexCoords[c][(*i).amUVIndices[c][n]];
|
||||||
|
amTexCoords[c][iCurrent].y = 1.0f - amTexCoords[c][iCurrent].y; // DX-to-OGL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// add vertex colors
|
// add vertex colors
|
||||||
|
@ -546,6 +579,7 @@ void ASEImporter::BuildUniqueRepresentation(ASE::Mesh& mesh)
|
||||||
if (!mesh.mNormals.empty())
|
if (!mesh.mNormals.empty())
|
||||||
{
|
{
|
||||||
mNormals[iCurrent] = mesh.mNormals[(*i).mIndices[n]];
|
mNormals[iCurrent] = mesh.mNormals[(*i).mIndices[n]];
|
||||||
|
std::swap(mNormals[iCurrent].z,mNormals[iCurrent].y); // DX-to-OGL
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle bone vertices
|
// handle bone vertices
|
||||||
|
@ -1073,7 +1107,9 @@ void ASEImporter::BuildMaterialIndices()
|
||||||
if (this->mParser->m_vMaterials[iMat].bNeed)
|
if (this->mParser->m_vMaterials[iMat].bNeed)
|
||||||
{
|
{
|
||||||
// convert it to the aiMaterial layout
|
// convert it to the aiMaterial layout
|
||||||
this->ConvertMaterial(this->mParser->m_vMaterials[iMat]);
|
ASE::Material& mat = this->mParser->m_vMaterials[iMat];
|
||||||
|
this->ConvertMaterial(mat);
|
||||||
|
TextureTransform::ApplyScaleNOffset(mat);
|
||||||
++pcScene->mNumMaterials;
|
++pcScene->mNumMaterials;
|
||||||
}
|
}
|
||||||
for (unsigned int iSubMat = 0; iSubMat < this->mParser->m_vMaterials[
|
for (unsigned int iSubMat = 0; iSubMat < this->mParser->m_vMaterials[
|
||||||
|
@ -1082,7 +1118,9 @@ void ASEImporter::BuildMaterialIndices()
|
||||||
if (this->mParser->m_vMaterials[iMat].avSubMaterials[iSubMat].bNeed)
|
if (this->mParser->m_vMaterials[iMat].avSubMaterials[iSubMat].bNeed)
|
||||||
{
|
{
|
||||||
// convert it to the aiMaterial layout
|
// convert it to the aiMaterial layout
|
||||||
this->ConvertMaterial(this->mParser->m_vMaterials[iMat].avSubMaterials[iSubMat]);
|
ASE::Material& mat = this->mParser->m_vMaterials[iMat].avSubMaterials[iSubMat];
|
||||||
|
this->ConvertMaterial(mat);
|
||||||
|
TextureTransform::ApplyScaleNOffset(mat);
|
||||||
++pcScene->mNumMaterials;
|
++pcScene->mNumMaterials;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1172,6 +1210,24 @@ void ASEImporter::BuildMaterialIndices()
|
||||||
// Generate normal vectors basing on smoothing groups
|
// Generate normal vectors basing on smoothing groups
|
||||||
void ASEImporter::GenerateNormals(ASE::Mesh& mesh)
|
void ASEImporter::GenerateNormals(ASE::Mesh& mesh)
|
||||||
{
|
{
|
||||||
|
if (!mesh.mNormals.empty())
|
||||||
|
{
|
||||||
|
// check whether there are uninitialized normals. If there are
|
||||||
|
// some, skip all normals from the file and compute them on our own
|
||||||
|
for (std::vector<aiVector3D>::const_iterator
|
||||||
|
qq = mesh.mNormals.begin();
|
||||||
|
qq != mesh.mNormals.end();++qq)
|
||||||
|
{
|
||||||
|
if (is_qnan((*qq).x))
|
||||||
|
{
|
||||||
|
DefaultLogger::get()->warn("Normals were specified in the file, "
|
||||||
|
"but not all vertices seem to have normals assigned. The "
|
||||||
|
"whole normal set will be recomputed.");
|
||||||
|
mesh.mNormals.clear();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (mesh.mNormals.empty())
|
if (mesh.mNormals.empty())
|
||||||
{
|
{
|
||||||
// need to calculate normals ...
|
// need to calculate normals ...
|
||||||
|
|
|
@ -190,7 +190,7 @@ bool Parser::SkipToNextToken()
|
||||||
}
|
}
|
||||||
else bLastWasEndLine = false;
|
else bLastWasEndLine = false;
|
||||||
if ('*' == me || '}' == me || '{' == me)return true;
|
if ('*' == me || '}' == me || '{' == me)return true;
|
||||||
else if ('\0' == me)return false;
|
if ('\0' == me)return false;
|
||||||
|
|
||||||
++this->m_szFile;
|
++this->m_szFile;
|
||||||
}
|
}
|
||||||
|
@ -1551,7 +1551,8 @@ void Parser::ParseLV3MeshCFaceListBlock(unsigned int iNumFaces, ASE::Mesh& mesh)
|
||||||
void Parser::ParseLV3MeshNormalListBlock(ASE::Mesh& sMesh)
|
void Parser::ParseLV3MeshNormalListBlock(ASE::Mesh& sMesh)
|
||||||
{
|
{
|
||||||
// allocate enough storage for the normals
|
// allocate enough storage for the normals
|
||||||
sMesh.mNormals.resize(sMesh.mPositions.size());
|
sMesh.mNormals.resize(sMesh.mPositions.size(),
|
||||||
|
aiVector3D( std::numeric_limits<float>::quiet_NaN(), 0.0f, 0.0f));
|
||||||
int iDepth = 0;
|
int iDepth = 0;
|
||||||
|
|
||||||
// we need the *MESH_VERTEXNORMAL blocks, ignore the face normals
|
// we need the *MESH_VERTEXNORMAL blocks, ignore the face normals
|
||||||
|
|
Loading…
Reference in New Issue