From 6f49c4518cc254ff6bdaac86958ba69d86384d26 Mon Sep 17 00:00:00 2001 From: aramis_acg Date: Sat, 9 Aug 2008 22:39:57 +0000 Subject: [PATCH] Added first working version of a MDC loader; no further features like compressed frames tested at the moment. Added config options for keyframe loading, this has been tested with MDL7 only (atm). Some refactoring, a few files are much cleaner and smaller now. RemoveRedundantMats step does now remove unreferenced materials. git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@103 67173fc5-114c-0410-ac8e-9d2fd5bffc1f --- code/3DSConverter.cpp | 119 +++---- code/3DSHelper.h | 18 +- code/3DSLoader.cpp | 79 ++--- code/3DSLoader.h | 14 +- code/ASELoader.cpp | 48 +-- code/ASELoader.h | 7 +- code/ASEParser.cpp | 1 + code/CalcTangentsProcess.cpp | 16 +- code/CalcTangentsProcess.h | 35 +- code/GenVertexNormalsProcess.cpp | 30 +- code/GenVertexNormalsProcess.h | 33 +- code/Importer.cpp | 4 +- code/LimitBoneWeightsProcess.cpp | 6 +- code/LimitBoneWeightsProcess.h | 11 +- code/MD2Loader.cpp | 2 +- code/MD3Loader.cpp | 515 ++++++++++++++--------------- code/MD3Loader.h | 12 +- code/MDCFileData.h | 15 +- code/MDCLoader.cpp | 476 +++++++++++++++++++++++++++ code/MDCLoader.h | 132 ++++++++ code/MDCNormalTable.h | 299 +++++++++++++++++ code/MDLLoader.cpp | 525 ++++++++++++++---------------- code/MDLLoader.h | 8 + code/RemoveRedundantMaterials.cpp | 10 + code/SplitLargeMeshes.cpp | 33 +- code/ValidateDataStructure.cpp | 12 +- include/aiConfig.h | 21 ++ include/aiMesh.h | 9 +- tools/assimp_view/assimp_view.aps | Bin 354312 -> 390688 bytes tools/assimp_view/assimp_view.rc | 24 +- tools/assimp_view/banner.bmp | Bin 108054 -> 144054 bytes tools/assimp_view/banner_pure.bmp | Bin 84054 -> 108054 bytes workspaces/vc8/assimp.vcproj | 44 ++- 33 files changed, 1723 insertions(+), 835 deletions(-) create mode 100644 code/MDCLoader.cpp create mode 100644 code/MDCLoader.h create mode 100644 code/MDCNormalTable.h diff --git a/code/3DSConverter.cpp b/code/3DSConverter.cpp index 6730bdae7..ed1a84680 100644 --- a/code/3DSConverter.cpp +++ b/code/3DSConverter.cpp @@ -59,6 +59,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; +#ifdef _MSC_VER +# define sprintf sprintf_s +#endif // ------------------------------------------------------------------------------------------------ void Dot3DSImporter::ReplaceDefaultMaterial() @@ -113,8 +116,7 @@ void Dot3DSImporter::ReplaceDefaultMaterial() { (*a) = iIndex; ++iCnt; - DefaultLogger::get()->warn("Material index overflow in 3DS file. Assigning " - "default material ..."); + DefaultLogger::get()->warn("Material index overflow in 3DS file. Using default material"); } } } @@ -157,58 +159,36 @@ void Dot3DSImporter::CheckIndices(Dot3DS::Mesh* sMesh) // ------------------------------------------------------------------------------------------------ void Dot3DSImporter::MakeUnique(Dot3DS::Mesh* sMesh) { - std::vector vNew; - vNew.resize(sMesh->mFaces.size() * 3); - - std::vector vNew2; - - // TODO: Remove this step. By maintaining a small LUT it - // would be possible to do this directly in the parsing step unsigned int iBase = 0; - if (0 != sMesh->mTexCoords.size()) + std::vector vNew; + std::vector vNew2; + + vNew.resize(sMesh->mFaces.size() * 3); + if (sMesh->mTexCoords.size())vNew2.resize(sMesh->mFaces.size() * 3); + + for (unsigned int i = 0; i < sMesh->mFaces.size();++i) { - vNew2.resize(sMesh->mFaces.size() * 3); - for (unsigned int i = 0; i < sMesh->mFaces.size();++i) + uint32_t iTemp1,iTemp2; + + // positions + vNew[iBase] = sMesh->mPositions[sMesh->mFaces[i].mIndices[2]]; + iTemp1 = iBase++; + vNew[iBase] = sMesh->mPositions[sMesh->mFaces[i].mIndices[1]]; + iTemp2 = iBase++; + vNew[iBase] = sMesh->mPositions[sMesh->mFaces[i].mIndices[0]]; + + // texture coordinates + if (sMesh->mTexCoords.size()) { - uint32_t iTemp1,iTemp2; - - // position and texture coordinates - vNew[iBase] = sMesh->mPositions[sMesh->mFaces[i].mIndices[2]]; - vNew2[iBase] = sMesh->mTexCoords[sMesh->mFaces[i].mIndices[2]]; - iTemp1 = iBase++; - - vNew[iBase] = sMesh->mPositions[sMesh->mFaces[i].mIndices[1]]; - vNew2[iBase] = sMesh->mTexCoords[sMesh->mFaces[i].mIndices[1]]; - iTemp2 = iBase++; - - vNew[iBase] = sMesh->mPositions[sMesh->mFaces[i].mIndices[0]]; - vNew2[iBase] = sMesh->mTexCoords[sMesh->mFaces[i].mIndices[0]]; - sMesh->mFaces[i].mIndices[2] = iBase++; - - sMesh->mFaces[i].mIndices[0] = iTemp1; - sMesh->mFaces[i].mIndices[1] = iTemp2; + vNew2[iTemp1] = sMesh->mTexCoords[sMesh->mFaces[i].mIndices[2]]; + vNew2[iTemp2] = sMesh->mTexCoords[sMesh->mFaces[i].mIndices[1]]; + vNew2[iBase] = sMesh->mTexCoords[sMesh->mFaces[i].mIndices[0]]; } - } - else - { - for (unsigned int i = 0; i < sMesh->mFaces.size();++i) - { - uint32_t iTemp1,iTemp2; - // position only - vNew[iBase] = sMesh->mPositions[sMesh->mFaces[i].mIndices[2]]; - iTemp1 = iBase++; - - vNew[iBase] = sMesh->mPositions[sMesh->mFaces[i].mIndices[1]]; - iTemp2 = iBase++; - - vNew[iBase] = sMesh->mPositions[sMesh->mFaces[i].mIndices[0]]; - sMesh->mFaces[i].mIndices[2] = iBase++; - - sMesh->mFaces[i].mIndices[0] = iTemp1; - sMesh->mFaces[i].mIndices[1] = iTemp2; - } + sMesh->mFaces[i].mIndices[2] = iBase++; + sMesh->mFaces[i].mIndices[0] = iTemp1; + sMesh->mFaces[i].mIndices[1] = iTemp2; } sMesh->mPositions = vNew; sMesh->mTexCoords = vNew2; @@ -400,7 +380,7 @@ void Dot3DSImporter::ConvertMaterial(Dot3DS::Material& oldMat, } // store the name of the material itself, too - if( oldMat.mName.length() > 0) + if( oldMat.mName.length()) { aiString tex; tex.Set( oldMat.mName); @@ -430,14 +410,19 @@ void Dot3DSImporter::ConvertMeshes(aiScene* pcOut) a != (*i).mFaceMaterials.end();++a,++iNum) { // check range + // FIX: shouldn't be necessary anymore, has been moved to ReplaceDefaultMaterial() +#if 0 if ((*a) >= this->mScene->mMaterials.size()) { DefaultLogger::get()->error("3DS face material index is out of range"); // use the last material instead + // TODO: assign the default material index aiSplit[this->mScene->mMaterials.size()-1].push_back(iNum); } - else aiSplit[*a].push_back(iNum); + else +#endif + aiSplit[*a].push_back(iNum); } // now generate submeshes bool bFirst = true; @@ -455,14 +440,14 @@ void Dot3DSImporter::ConvertMeshes(aiScene* pcOut) avOutMeshes.push_back(p_pcOut); // convert vertices - p_pcOut->mNumVertices = (unsigned int)aiSplit[p].size()*3; p_pcOut->mNumFaces = (unsigned int)aiSplit[p].size(); + p_pcOut->mNumVertices = p_pcOut->mNumFaces*3; // allocate enough storage for faces p_pcOut->mFaces = new aiFace[p_pcOut->mNumFaces]; iFaceCnt += p_pcOut->mNumFaces; - if (p_pcOut->mNumVertices != 0) + if (p_pcOut->mNumVertices) { p_pcOut->mVertices = new aiVector3D[p_pcOut->mNumVertices]; p_pcOut->mNormals = new aiVector3D[p_pcOut->mNumVertices]; @@ -489,7 +474,7 @@ void Dot3DSImporter::ConvertMeshes(aiScene* pcOut) } } // convert texture coordinates - if ((*i).mTexCoords.size() != 0) + if ((*i).mTexCoords.size()) { p_pcOut->mTextureCoords[0] = new aiVector3D[p_pcOut->mNumVertices]; @@ -525,17 +510,13 @@ void Dot3DSImporter::ConvertMeshes(aiScene* pcOut) pcOut->mMeshes[a] = avOutMeshes[a]; } - if (0 == iFaceCnt) - { + if (!iFaceCnt) throw new ImportErrorException("No faces loaded. The mesh is empty"); - } // for each material in the scene we need to setup the UV source // set for each texture for (unsigned int a = 0; a < pcOut->mNumMaterials;++a) - { TextureTransform::SetupMatUVSrc( pcOut->mMaterials[a], &this->mScene->mMaterials[a] ); - } return; } // ------------------------------------------------------------------------------------------------ @@ -551,7 +532,9 @@ void Dot3DSImporter::AddNodeToGraph(aiScene* pcSOut,aiNode* pcOut,Dot3DS::Node* const Dot3DS::Mesh* pcMesh = (const Dot3DS::Mesh*)pcSOut->mMeshes[a]->mColors[0]; ai_assert(NULL != pcMesh); - if (0 == ASSIMP_stricmp(pcIn->mName.c_str(),pcMesh->mName.c_str())) + // do case independent comparisons here, just for safety + if (pcIn->mName.length() == pcMesh->mName.length() && + !ASSIMP_stricmp(pcIn->mName.c_str(),pcMesh->mName.c_str())) { iArray.push_back(a); } @@ -560,7 +543,8 @@ void Dot3DSImporter::AddNodeToGraph(aiScene* pcSOut,aiNode* pcOut,Dot3DS::Node* { aiMatrix4x4& mTrafo = ((Dot3DS::Mesh*)pcSOut->mMeshes[iArray[0]]->mColors[0])->mMat; aiMatrix4x4 mInv = mTrafo; - mInv.Inverse(); + if (!this->configSkipPivot) + mInv.Inverse(); pcOut->mName.Set(pcIn->mName); pcOut->mNumMeshes = (unsigned int)iArray.size(); @@ -575,7 +559,7 @@ void Dot3DSImporter::AddNodeToGraph(aiScene* pcSOut,aiNode* pcOut,Dot3DS::Node* const aiVector3D* const pvEnd = mesh->mVertices+mesh->mNumVertices; aiVector3D* pvCurrent = mesh->mVertices; - if(pivot.x || pivot.y || pivot.z) + if(pivot.x || pivot.y || pivot.z && !this->configSkipPivot) { while (pvCurrent != pvEnd) { @@ -593,18 +577,12 @@ void Dot3DSImporter::AddNodeToGraph(aiScene* pcSOut,aiNode* pcOut,Dot3DS::Node* while (pvCurrent != pvEnd) { std::swap( pvCurrent->y, pvCurrent->z ); - //pvCurrent->y *= -1.0f; ++pvCurrent; } } pcOut->mMeshes[i] = iIndex; } } - /*else - { - DefaultLogger::get()->warn("A node that is not a dummy does not " - "reference a valid mesh."); - }*/ } pcOut->mTransformation = aiMatrix4x4(); pcOut->mNumChildren = (unsigned int)pcIn->mChildren.size(); @@ -636,8 +614,7 @@ void Dot3DSImporter::GenerateNodeGraph(aiScene* pcOut) // unsigned int iCnt = 0; - DefaultLogger::get()->warn("No hierarchy information has been " - "found in the file. A flat hierarchy tree is built ..."); + DefaultLogger::get()->warn("No hierarchy information has been found in the file. "); pcOut->mRootNode->mNumChildren = pcOut->mNumMeshes; pcOut->mRootNode->mChildren = new aiNode* [ pcOut->mNumMeshes ]; @@ -654,11 +631,7 @@ void Dot3DSImporter::GenerateNodeGraph(aiScene* pcOut) char szBuffer[128]; int iLen; -#if _MSC_VER >= 1400 - iLen = sprintf_s(szBuffer,"UNNAMED_%i",i); -#else iLen = sprintf(szBuffer,"UNNAMED_%i",i); -#endif ai_assert(0 < iLen); ::memcpy(pcNode->mName.data,szBuffer,iLen); pcNode->mName.data[iLen] = '\0'; diff --git a/code/3DSHelper.h b/code/3DSHelper.h index be6959ecd..b4a190fc6 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -120,8 +120,8 @@ public: enum { - // ************************************************************** - // Base chunks which can be found everywhere in the file + // ******************************************************************** + // Basic chunks which can be found everywhere in the file CHUNK_VERSION = 0x0002, CHUNK_RGBF = 0x0010, // float4 R; float4 G; float4 B CHUNK_RGBB = 0x0011, // int1 R; int1 G; int B @@ -132,7 +132,7 @@ public: CHUNK_PERCENTW = 0x0030, // int2 percentage CHUNK_PERCENTF = 0x0031, // float4 percentage - // ************************************************************** + // ******************************************************************** // Unknown and ignored. Possibly a chunk used by PROJ ( // Discreet 3DS max Project File)? @@ -162,7 +162,7 @@ public: CHUNK_BIT_MAP = 0x1100, CHUNK_BIT_MAP_EXISTS = 0x1101, - // ************************************************************** + // ******************************************************************** // Viewport related stuff. Ignored CHUNK_DEFAULT_VIEW = 0x3000, CHUNK_VIEW_TOP = 0x3010, @@ -173,7 +173,7 @@ public: CHUNK_VIEW_BACK = 0x3060, CHUNK_VIEW_USER = 0x3070, CHUNK_VIEW_CAMERA = 0x3080, - // ************************************************************** + // ******************************************************************** // Mesh chunks CHUNK_OBJBLOCK = 0x4000, @@ -196,7 +196,7 @@ public: // to the root node's transformation matrix CHUNK_MASTER_SCALE = 0x0100, - // ************************************************************** + // ******************************************************************** // Material chunks CHUNK_MAT_MATERIAL = 0xAFFF, @@ -280,7 +280,7 @@ public: // Specifies whether a materail requires two-sided rendering CHUNK_MAT_TWO_SIDE = 0xA081, - // ************************************************************** + // ******************************************************************** // Main keyframer chunk. Contains translation/rotation/scaling data CHUNK_KEYFRAMER = 0xB000, @@ -293,7 +293,7 @@ public: CHUNK_TRACKROTATE = 0xB021, CHUNK_TRACKSCALE = 0xB022, - // ************************************************************** + // ******************************************************************** // Keyframes for various other stuff in the file // Ignored CHUNK_AMBIENTKEY = 0xB001, @@ -308,7 +308,7 @@ public: CHUNK_TRACKLIGTGT = 0xB006, CHUNK_TRACKSPOTL = 0xB007, CHUNK_FRAMES = 0xB008 - // ************************************************************** + // ******************************************************************** }; }; diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index eccb07b13..4a4bcc229 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -55,6 +55,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../include/aiMesh.h" #include "../include/aiScene.h" #include "../include/aiAssert.h" +#include "../include/assimp.hpp" // boost headers #include @@ -99,6 +100,12 @@ bool Dot3DSImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler) co return false; } // ------------------------------------------------------------------------------------------------ +// Setup configuration properties +void Dot3DSImporter::SetupProperties(const Importer* pImp) +{ + this->configSkipPivot = pImp->GetProperty(AI_CONFIG_IMPORT_3DS_IGNORE_PIVOT,0) ? true : false; +} +// ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. void Dot3DSImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) @@ -144,48 +151,46 @@ void Dot3DSImporter::InternReadFile( try { this->ParseMainChunk(iRemaining); + + // Generate an unique set of vertices/indices for + // all meshes contained in the file + for (std::vector::iterator + i = this->mScene->mMeshes.begin(); + i != this->mScene->mMeshes.end();++i) + { + // TODO: see function body + this->CheckIndices(&(*i)); + this->MakeUnique(&(*i)); + + // first generate normals for the mesh + this->GenNormals(&(*i)); + } + + // Apply scaling and offsets to all texture coordinates + TextureTransform::ApplyScaleNOffset(this->mScene->mMaterials); + + // Replace all occurences of the default material with a valid material. + // Generate it if no material containing DEFAULT in its name has been + // found in the file + this->ReplaceDefaultMaterial(); + + // Convert the scene from our internal representation to an aiScene object + this->ConvertScene(pScene); + + // Generate the node graph for the scene. This is a little bit + // tricky since we'll need to split some meshes into submeshes + this->GenerateNodeGraph(pScene); + + // Now apply a master scaling factor to the scene + this->ApplyMasterScale(pScene); + } catch ( ImportErrorException* ex) { - delete[] this->mBuffer; + delete[] this->mBuffer;AI_DEBUG_INVALIDATE_PTR(this->mBuffer); throw ex; - }; - - // Generate an unique set of vertices/indices for - // all meshes contained in the file - for (std::vector::iterator - i = this->mScene->mMeshes.begin(); - i != this->mScene->mMeshes.end();++i) - { - // TODO: see function body - this->CheckIndices(&(*i)); - this->MakeUnique(&(*i)); - - // first generate normals for the mesh - this->GenNormals(&(*i)); } - - // Apply scaling and offsets to all texture coordinates - TextureTransform::ApplyScaleNOffset(this->mScene->mMaterials); - - // Replace all occurences of the default material with a valid material. - // Generate it if no material containing DEFAULT in its name has been - // found in the file - this->ReplaceDefaultMaterial(); - - // Convert the scene from our internal representation to an aiScene object - this->ConvertScene(pScene); - - // Generate the node graph for the scene. This is a little bit - // tricky since we'll need to split some meshes into submeshes - this->GenerateNodeGraph(pScene); - - // Now apply a master scaling factor to the scene - this->ApplyMasterScale(pScene); - - delete[] this->mBuffer; - delete this->mScene; - return; + delete[] this->mBuffer;AI_DEBUG_INVALIDATE_PTR(this->mBuffer); } // ------------------------------------------------------------------------------------------------ void Dot3DSImporter::ApplyMasterScale(aiScene* pScene) diff --git a/code/3DSLoader.h b/code/3DSLoader.h index a0a1c4f95..f32f9084c 100644 --- a/code/3DSLoader.h +++ b/code/3DSLoader.h @@ -43,8 +43,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_3DSIMPORTER_H_INC #define AI_3DSIMPORTER_H_INC -#include - #include "BaseImporter.h" #include "../include/aiTypes.h" @@ -73,11 +71,19 @@ protected: ~Dot3DSImporter(); public: + // ------------------------------------------------------------------- /** Returns whether the class can handle the format of the given file. * See BaseImporter::CanRead() for details. */ bool CanRead( const std::string& pFile, IOSystem* pIOHandler) const; + // ------------------------------------------------------------------- + /** Called prior to ReadFile(). + * The function is a request to the importer to update its configuration + * basing on the Importer's configuration property list. + */ + void SetupProperties(const Importer* pImp); + protected: // ------------------------------------------------------------------- @@ -233,6 +239,10 @@ protected: protected: + + /** Configuration option: skip pivot chunks */ + bool configSkipPivot; + /** Buffer to hold the loaded file */ unsigned char* mBuffer; diff --git a/code/ASELoader.cpp b/code/ASELoader.cpp index 0ae153c94..f36e2cd84 100644 --- a/code/ASELoader.cpp +++ b/code/ASELoader.cpp @@ -109,14 +109,11 @@ void ASEImporter::InternReadFile( // Check whether we can read from the file if( file.get() == NULL) - { throw new ImportErrorException( "Failed to open ASE file " + pFile + "."); - } size_t fileSize = file->FileSize(); std::string::size_type pos = pFile.find_last_of('.'); std::string extension = pFile.substr( pos); - this->mIsAsk = (extension[3] == 'k' || extension[3] == 'K'); // allocate storage and copy the contents of the file to a memory buffer // (terminate it with zero) @@ -144,11 +141,7 @@ void ASEImporter::InternReadFile( { if ((*i).bSkip)continue; - // transform all vertices into worldspace - // world2obj transform is specified in the - // transformation matrix of a scenegraph node this->TransformVertices(*i); - // now we need to create proper meshes from the import we need to // split them by materials, build valid vertex/face lists ... this->BuildUniqueRepresentation(*i); @@ -215,7 +208,7 @@ void ASEImporter::GenerateDefaultMaterial() this->mParser->m_vMaterials.push_back ( ASE::Material() ); ASE::Material& mat = this->mParser->m_vMaterials.back(); - mat.mDiffuse = aiColor3D(0.6f,0.6f,0.6f); + mat.mDiffuse = aiColor3D(0.6f,0.6f,0.6f); mat.mSpecular = aiColor3D(1.0f,1.0f,1.0f); mat.mAmbient = aiColor3D(0.05f,0.05f,0.05f); mat.mShading = Dot3DSFile::Gouraud; @@ -449,21 +442,6 @@ void ASEImporter::BuildNodes() std::string* szMyName = (std::string*)pcScene->mMeshes[*i]->mColors[1]; if (!szMyName)continue; -#if 0 // moved to the scope above - for (std::vector::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."); @@ -604,19 +582,6 @@ void ASEImporter::BuildUniqueRepresentation(ASE::Mesh& mesh) for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS;++c) mesh.amTexCoords[c] = amTexCoords[c]; - - // now need to transform all vertices with the inverse of their - // transformation matrix ... - //aiMatrix4x4 mInverse = mesh.mTransform; - //mInverse.Inverse(); - - //for (std::vector::iterator - // i = mesh.mPositions.begin(); - // i != mesh.mPositions.end();++i) - //{ - // (*i) = mInverse * (*i); - //} - return; } // ------------------------------------------------------------------------------------------------ @@ -1066,7 +1031,7 @@ void ASEImporter::ConvertMeshes(ASE::Mesh& mesh, std::vector& avOutMesh pc->mName.Set(mesh.mBones[jfkennedy].mName); pc->mNumWeights = (unsigned int)avBonesOut[jfkennedy].size(); pc->mWeights = new aiVertexWeight[pc->mNumWeights]; - memcpy(pc->mWeights,&avBonesOut[jfkennedy][0], + ::memcpy(pc->mWeights,&avBonesOut[jfkennedy][0], sizeof(aiVertexWeight) * pc->mNumWeights); ++pcBone; } @@ -1246,9 +1211,8 @@ void ASEImporter::GenerateNormals(ASE::Mesh& mesh) aiVector3D pDelta2 = *pV3 - *pV1; aiVector3D vNor = pDelta1 ^ pDelta2; - mesh.mNormals[face.mIndices[0]] = vNor; - mesh.mNormals[face.mIndices[1]] = vNor; - mesh.mNormals[face.mIndices[2]] = vNor; + for (unsigned int i = 0; i < 3;++i) + mesh.mNormals[face.mIndices[i]] = vNor; } // calculate the position bounds so we have a reliable epsilon to @@ -1287,15 +1251,13 @@ void ASEImporter::GenerateNormals(ASE::Mesh& mesh) posEpsilon,poResult); aiVector3D vNormals; - float fDiv = 0.0f; for (std::vector::const_iterator a = poResult.begin(); a != poResult.end();++a) { vNormals += mesh.mNormals[(*a)]; - fDiv += 1.0f; } - vNormals /= fDiv; + vNormals.Normalize(); avNormals[(*i).mIndices[c]] = vNormals; poResult.clear(); } diff --git a/code/ASELoader.h b/code/ASELoader.h index c2d849664..86f4e2edc 100644 --- a/code/ASELoader.h +++ b/code/ASELoader.h @@ -114,8 +114,6 @@ protected: * \param mesh Mesh to work on */ void TransformVertices(ASE::Mesh& mesh); - - // ------------------------------------------------------------------- /** Create one-material-per-mesh meshes ;-) * \param mesh Mesh to work with * \param Receives the list of all created meshes @@ -168,13 +166,10 @@ protected: /** Buffer to hold the loaded file */ unsigned char* mBuffer; - /** true if this is an .ask file */ - bool mIsAsk; - /** Scene to be filled */ aiScene* pcScene; }; } // end of namespace Assimp -#endif // AI_3DSIMPORTER_H_INC \ No newline at end of file +#endif // AI_3DSIMPORTER_H_INC diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index aeac3caae..6036221b1 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -794,6 +794,7 @@ void Parser::ParseLV1GeometryObjectBlock(ASE::Mesh& mesh) { this->m_szFile+=9; this->ParseLV2NodeTransformBlock(mesh);continue; + //mesh.mTransform.Transpose(); } // mesh data if (0 == strncmp(this->m_szFile,"*MESH" ,5) && diff --git a/code/CalcTangentsProcess.cpp b/code/CalcTangentsProcess.cpp index 8fa0a9a00..aad7e345b 100644 --- a/code/CalcTangentsProcess.cpp +++ b/code/CalcTangentsProcess.cpp @@ -56,6 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../include/aiPostProcess.h" #include "../include/aiMesh.h" #include "../include/aiScene.h" +#include "../include/assimp.hpp" using namespace Assimp; @@ -80,6 +81,16 @@ bool CalcTangentsProcess::IsActive( unsigned int pFlags) const return (pFlags & aiProcess_CalcTangentSpace) != 0; } +// ------------------------------------------------------------------------------------------------ +// Executes the post processing step on the given imported data. +void CalcTangentsProcess::SetupProperties(const Importer* pImp) +{ + // get the current value of the property + this->configMaxAngle = pImp->GetProperty(AI_CONFIG_PP_CT_MAX_SMOOTHING_ANGLE,45000) / 1000.0f; + this->configMaxAngle = std::max(std::min(this->configMaxAngle,180.0f),0.0f); + this->configMaxAngle *= 0.0174532925f; +} + // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. void CalcTangentsProcess::Execute( aiScene* pScene) @@ -213,7 +224,6 @@ bool CalcTangentsProcess::ProcessMesh( aiMesh* pMesh) vertexFinder.FindPositions( origPos, posEpsilon, verticesFound); // look among them for other vertices sharing the same normal and a close-enough tangent/bitangent - static const float MAX_DIFF_ANGLE = 0.701f; for( unsigned int b = 0; b < verticesFound.size(); b++) { unsigned int idx = verticesFound[b]; @@ -221,9 +231,9 @@ bool CalcTangentsProcess::ProcessMesh( aiMesh* pMesh) continue; if( meshNorm[idx] * origNorm < angleEpsilon) continue; - if( meshTang[idx] * origTang < MAX_DIFF_ANGLE) + if( acosf( meshTang[idx] * origTang) > this->configMaxAngle) continue; - if( meshBitang[idx] * origBitang < MAX_DIFF_ANGLE) + if( acosf( meshBitang[idx] * origBitang) > this->configMaxAngle) continue; // it's similar enough -> add it to the smoothing group diff --git a/code/CalcTangentsProcess.h b/code/CalcTangentsProcess.h index 35c116b45..60bc35cb2 100644 --- a/code/CalcTangentsProcess.h +++ b/code/CalcTangentsProcess.h @@ -70,26 +70,39 @@ protected: public: // ------------------------------------------------------------------- - /** Returns whether the processing step is present in the given flag field. - * @param pFlags The processing flags the importer was called with. A bitwise - * combination of #aiPostProcessSteps. - * @return true if the process is present in this flag fields, false if not. + /** Returns whether the processing step is present in the given flag. + * @param pFlags The processing flags the importer was called with. + * A bitwise combination of #aiPostProcessSteps. + * @return true if the process is present in this flag fields, + * false if not. */ bool IsActive( unsigned int pFlags) const; + // ------------------------------------------------------------------- + /** Called prior to ExecuteOnScene(). + * The function is a request to the process to update its configuration + * basing on the Importer's configuration property list. + */ + void SetupProperties(const Importer* pImp); + +protected: + + // ------------------------------------------------------------------- + /** Calculates tangents and bitangents for a specific mesh. + * @param pMesh The mesh to process. + */ + bool ProcessMesh( aiMesh* pMesh); + // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. - * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ void Execute( aiScene* pScene); -protected: - // ------------------------------------------------------------------- - /** Calculates tangents and bitangents for the given mesh - * @param pMesh The mesh to process. - */ - bool ProcessMesh( aiMesh* pMesh); +private: + + /** Configuration option: maximum smoothing angle, in radians*/ + float configMaxAngle; }; } // end of namespace Assimp diff --git a/code/GenVertexNormalsProcess.cpp b/code/GenVertexNormalsProcess.cpp index d471731b1..5c879f439 100644 --- a/code/GenVertexNormalsProcess.cpp +++ b/code/GenVertexNormalsProcess.cpp @@ -48,6 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../include/aiPostProcess.h" #include "../include/aiMesh.h" #include "../include/aiScene.h" +#include "../include/assimp.hpp" using namespace Assimp; @@ -70,7 +71,15 @@ bool GenVertexNormalsProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_GenSmoothNormals) != 0; } - +// ------------------------------------------------------------------------------------------------ +// Executes the post processing step on the given imported data. +void GenVertexNormalsProcess::SetupProperties(const Importer* pImp) +{ + // get the current value of the property + this->configMaxAngle = pImp->GetProperty(AI_CONFIG_PP_GSN_MAX_SMOOTHING_ANGLE,180000) / 1000.0f; + this->configMaxAngle = std::max(std::min(this->configMaxAngle,180.0f),0.0f); + this->configMaxAngle *= 0.0174532925f; +} // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. void GenVertexNormalsProcess::Execute( aiScene* pScene) @@ -111,14 +120,10 @@ bool GenVertexNormalsProcess::GenMeshVertexNormals (aiMesh* pMesh) aiVector3D pDelta1 = *pV2 - *pV1; aiVector3D pDelta2 = *pV3 - *pV1; aiVector3D vNor = pDelta1 ^ pDelta2; - - /*if (face.mIndices[1] > face.mIndices[2]) - vNor *= -1.0f;*/ + vNor.Normalize(); for (unsigned int i = 0;i < face.mNumIndices;++i) - { pMesh->mNormals[face.mIndices[i]] = vNor; - } } // calculate the position bounds so we have a reliable epsilon to @@ -135,10 +140,14 @@ bool GenVertexNormalsProcess::GenMeshVertexNormals (aiMesh* pMesh) } const float posEpsilon = (maxVec - minVec).Length() * 1e-5f; + // set up a SpatialSort to quickly find all vertices close to a given position SpatialSort vertexFinder( pMesh->mVertices, pMesh->mNumVertices, sizeof( aiVector3D)); std::vector verticesFound; + const float fLimit = (AI_MESH_SMOOTHING_ANGLE_NOT_SET == pMesh->mMaxSmoothingAngle + ? this->configMaxAngle : pMesh->mMaxSmoothingAngle); + aiVector3D* pcNew = new aiVector3D[pMesh->mNumVertices]; for (unsigned int i = 0; i < pMesh->mNumVertices;++i) { @@ -148,12 +157,19 @@ bool GenVertexNormalsProcess::GenMeshVertexNormals (aiMesh* pMesh) vertexFinder.FindPositions( posThis, posEpsilon, verticesFound); aiVector3D pcNor; + unsigned int div = 0; for (unsigned int a = 0; a < verticesFound.size(); ++a) { unsigned int vidx = verticesFound[a]; + + // check whether the angle between the two normals is not too large + if (acosf(pMesh->mNormals[vidx] * pMesh->mNormals[i]) > fLimit) + continue; + pcNor += pMesh->mNormals[vidx]; + ++div; } - pcNor /= (float) verticesFound.size(); + pcNor.Normalize(); pcNew[i] = pcNor; } delete[] pMesh->mNormals; diff --git a/code/GenVertexNormalsProcess.h b/code/GenVertexNormalsProcess.h index 4eee32ae7..5ae9ed2a5 100644 --- a/code/GenVertexNormalsProcess.h +++ b/code/GenVertexNormalsProcess.h @@ -38,7 +38,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** @file Defines a post processing step to compute vertex normals for all loaded vertizes */ +/** @file Defines a post processing step to compute vertex normals + for all loaded vertizes */ #ifndef AI_GENVERTEXNORMALPROCESS_H_INC #define AI_GENVERTEXNORMALPROCESS_H_INC @@ -48,7 +49,7 @@ class GenNormalsTest; namespace Assimp { // --------------------------------------------------------------------------- -/** The GenFaceNormalsProcess computes vertex normals for all vertizes of all meshes +/** The GenFaceNormalsProcess computes vertex normals for all vertizes */ class ASSIMP_API GenVertexNormalsProcess : public BaseProcess { @@ -64,12 +65,20 @@ protected: public: // ------------------------------------------------------------------- - /** Returns whether the processing step is present in the given flag field. - * @param pFlags The processing flags the importer was called with. A bitwise - * combination of #aiPostProcessSteps. - * @return true if the process is present in this flag fields, false if not. + /** Returns whether the processing step is present in the given flag. + * @param pFlags The processing flags the importer was called with. + * A bitwise combination of #aiPostProcessSteps. + * @return true if the process is present in this flag fields, + * false if not. */ bool IsActive( unsigned int pFlags) const; + + // ------------------------------------------------------------------- + /** Called prior to ExecuteOnScene(). + * The function is a request to the process to update its configuration + * basing on the Importer's configuration property list. + */ + void SetupProperties(const Importer* pImp); // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. @@ -78,9 +87,19 @@ public: */ void Execute( aiScene* pScene); +protected: + + // ------------------------------------------------------------------- + /** Computes normals for a specific mesh + * @param pcMesh Mesh + * @return true if vertex normals have been computed + */ + bool GenMeshVertexNormals (aiMesh* pcMesh); private: - bool GenMeshVertexNormals (aiMesh* pcMesh); + + /** Configuration option: maximum smoothing angle, in radians*/ + float configMaxAngle; }; }; // end of namespace Assimp diff --git a/code/Importer.cpp b/code/Importer.cpp index b8184c2fa..8cae3f3b1 100644 --- a/code/Importer.cpp +++ b/code/Importer.cpp @@ -93,10 +93,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #if (!defined AI_BUILD_NO_MDR_IMPORTER) # include "MDRLoader.h" #endif +#endif #if (!defined AI_BUILD_NO_MDC_IMPORTER) # include "MDCLoader.h" #endif -#endif #if (!defined AI_BUILD_NO_MD5_IMPORTER) # include "MD5Loader.h" #endif @@ -202,10 +202,10 @@ Importer::Importer() : #if (!defined AI_BUILD_NO_MDR_IMPORTER) mImporter.push_back( new MDRImporter()); #endif +#endif #if (!defined AI_BUILD_NO_MDC_IMPORTER) mImporter.push_back( new MDCImporter()); #endif -#endif #if (!defined AI_BUILD_NO_MD5_IMPORTER) mImporter.push_back( new MD5Importer()); #endif diff --git a/code/LimitBoneWeightsProcess.cpp b/code/LimitBoneWeightsProcess.cpp index 15a01d1e7..841a46e71 100644 --- a/code/LimitBoneWeightsProcess.cpp +++ b/code/LimitBoneWeightsProcess.cpp @@ -88,11 +88,7 @@ void LimitBoneWeightsProcess::Execute( aiScene* pScene) void LimitBoneWeightsProcess::SetupProperties(const Importer* pImp) { // get the current value of the property - if(0xffffffff == (this->mMaxWeights = pImp->GetProperty( - AI_CONFIG_PP_LBW_MAX_WEIGHTS,0xffffffff))) - { - this->mMaxWeights = AI_LMW_MAX_WEIGHTS; - } + this->mMaxWeights = pImp->GetProperty(AI_CONFIG_PP_LBW_MAX_WEIGHTS,AI_LMW_MAX_WEIGHTS); } // ------------------------------------------------------------------------------------------------ diff --git a/code/LimitBoneWeightsProcess.h b/code/LimitBoneWeightsProcess.h index f32c946fc..4572985d7 100644 --- a/code/LimitBoneWeightsProcess.h +++ b/code/LimitBoneWeightsProcess.h @@ -83,10 +83,11 @@ protected: public: // ------------------------------------------------------------------- - /** Returns whether the processing step is present in the given flag field. - * @param pFlags The processing flags the importer was called with. A bitwise - * combination of #aiPostProcessSteps. - * @return true if the process is present in this flag fields, false if not. + /** Returns whether the processing step is present in the given flag. + * @param pFlags The processing flags the importer was called with. + * A bitwise combination of #aiPostProcessSteps. + * @return true if the process is present in this flag fields, + * false if not. */ bool IsActive( unsigned int pFlags) const; @@ -95,7 +96,7 @@ public: * The function is a request to the process to update its configuration * basing on the Importer's configuration property list. */ - virtual void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer* pImp); protected: diff --git a/code/MD2Loader.cpp b/code/MD2Loader.cpp index 2a2a353a3..0e8b11b23 100644 --- a/code/MD2Loader.cpp +++ b/code/MD2Loader.cpp @@ -169,7 +169,7 @@ void MD2Importer::ValidateHeader( ) if (this->m_pcHeader->numVertices > AI_MD2_MAX_VERTS) DefaultLogger::get()->warn("The model contains more vertices than Quake 2 supports"); - if (this->m_pcHeader->numFrames >= this->configFrameID ) + if (this->m_pcHeader->numFrames <= this->configFrameID ) throw new ImportErrorException("The requested frame is not existing the file"); } diff --git a/code/MD3Loader.cpp b/code/MD3Loader.cpp index 25e4a4e08..fc74f4c43 100644 --- a/code/MD3Loader.cpp +++ b/code/MD3Loader.cpp @@ -93,28 +93,26 @@ bool MD3Importer::CanRead( const std::string& pFile, IOSystem* pIOHandler) const void MD3Importer::ValidateHeaderOffsets() { // check magic number - if (this->m_pcHeader->IDENT != AI_MD3_MAGIC_NUMBER_BE && - this->m_pcHeader->IDENT != AI_MD3_MAGIC_NUMBER_LE) + if (pcHeader->IDENT != AI_MD3_MAGIC_NUMBER_BE && + pcHeader->IDENT != AI_MD3_MAGIC_NUMBER_LE) throw new ImportErrorException( "Invalid MD3 file: Magic bytes not found"); // check file format version - if (this->m_pcHeader->VERSION > 15) + if (pcHeader->VERSION > 15) DefaultLogger::get()->warn( "Unsupported MD3 file version. Continuing happily ..."); // check some values whether they are valid - if (!this->m_pcHeader->NUM_FRAMES) - throw new ImportErrorException( "Invalid MD3 file: NUM_FRAMES is 0"); - if (!this->m_pcHeader->NUM_SURFACES) + if (!pcHeader->NUM_SURFACES) throw new ImportErrorException( "Invalid md3 file: NUM_SURFACES is 0"); - if (this->m_pcHeader->OFS_FRAMES >= this->fileSize || - this->m_pcHeader->OFS_SURFACES >= this->fileSize || - this->m_pcHeader->OFS_EOF > this->fileSize) + if (pcHeader->OFS_FRAMES >= fileSize || + pcHeader->OFS_SURFACES >= fileSize || + pcHeader->OFS_EOF > fileSize) { throw new ImportErrorException("Invalid MD3 header: some offsets are outside the file"); } - if (this->m_pcHeader->NUM_FRAMES >= this->configFrameID ) + if (pcHeader->NUM_FRAMES <= this->configFrameID ) throw new ImportErrorException("The requested frame is not existing the file"); } // ------------------------------------------------------------------------------------------------ @@ -123,10 +121,10 @@ void MD3Importer::ValidateSurfaceHeaderOffsets(const MD3::Surface* pcSurf) // calculate the relative offset of the surface int32_t ofs = int32_t((const unsigned char*)pcSurf-this->mBuffer); - if (pcSurf->OFS_TRIANGLES + ofs + pcSurf->NUM_TRIANGLES * sizeof(MD3::Triangle) > this->fileSize || - pcSurf->OFS_SHADERS + ofs + pcSurf->NUM_SHADER * sizeof(MD3::Shader) > this->fileSize || - pcSurf->OFS_ST + ofs + pcSurf->NUM_VERTICES * sizeof(MD3::TexCoord) > this->fileSize || - pcSurf->OFS_XYZNORMAL + ofs + pcSurf->NUM_VERTICES * sizeof(MD3::Vertex) > this->fileSize) + if (pcSurf->OFS_TRIANGLES + ofs + pcSurf->NUM_TRIANGLES * sizeof(MD3::Triangle) > fileSize || + pcSurf->OFS_SHADERS + ofs + pcSurf->NUM_SHADER * sizeof(MD3::Shader) > fileSize || + pcSurf->OFS_ST + ofs + pcSurf->NUM_VERTICES * sizeof(MD3::TexCoord) > fileSize || + pcSurf->OFS_XYZNORMAL + ofs + pcSurf->NUM_VERTICES * sizeof(MD3::Vertex) > fileSize) { throw new ImportErrorException("Invalid MD3 surface header: some offsets are outside the file"); } @@ -170,310 +168,279 @@ void MD3Importer::InternReadFile( throw new ImportErrorException( "MD3 File is too small."); // allocate storage and copy the contents of the file to a memory buffer - this->mBuffer = new unsigned char[fileSize]; - file->Read( (void*)mBuffer, 1, fileSize); + std::vector mBuffer2 (fileSize); + file->Read( &mBuffer2[0], 1, fileSize); + mBuffer = &mBuffer2[0]; - try + pcHeader = (BE_NCONST MD3::Header*)mBuffer; + +#ifdef AI_BUILD_BIG_ENDIAN + + ByteSwap::Swap4(&pcHeader->VERSION); + ByteSwap::Swap4(&pcHeader->FLAGS); + ByteSwap::Swap4(&pcHeader->IDENT); + ByteSwap::Swap4(&pcHeader->NUM_FRAMES); + ByteSwap::Swap4(&pcHeader->NUM_SKINS); + ByteSwap::Swap4(&pcHeader->NUM_SURFACES); + ByteSwap::Swap4(&pcHeader->NUM_TAGS); + ByteSwap::Swap4(&pcHeader->OFS_EOF); + ByteSwap::Swap4(&pcHeader->OFS_FRAMES); + ByteSwap::Swap4(&pcHeader->OFS_SURFACES); + ByteSwap::Swap4(&pcHeader->OFS_TAGS); + +#endif + + // validate the header + this->ValidateHeaderOffsets(); + + // now navigate to the list of surfaces + const MD3::Surface* pcSurfaces = (const MD3::Surface*)(mBuffer + pcHeader->OFS_SURFACES); + + // allocate output storage + pScene->mNumMeshes = pcHeader->NUM_SURFACES; + pScene->mMeshes = new aiMesh*[pScene->mNumMeshes]; + + pScene->mNumMaterials = pcHeader->NUM_SURFACES; + pScene->mMaterials = new aiMaterial*[pScene->mNumMeshes]; + + // if an exception is thrown before the meshes are allocated -> + // otherwise the pointer value would be invalid and delete would crash + ::memset(pScene->mMeshes,0,pScene->mNumMeshes*sizeof(aiMesh*)); + ::memset(pScene->mMaterials,0,pScene->mNumMaterials*sizeof(aiMaterial*)); + + unsigned int iNum = pcHeader->NUM_SURFACES; + unsigned int iNumMaterials = 0; + unsigned int iDefaultMatIndex = 0xFFFFFFFF; + while (iNum-- > 0) { - this->m_pcHeader = (const MD3::Header*)this->mBuffer; - #ifdef AI_BUILD_BIG_ENDIAN - ByteSwap::Swap4(&m_pcHeader->VERSION); - ByteSwap::Swap4(&m_pcHeader->FLAGS); - ByteSwap::Swap4(&m_pcHeader->IDENT); - ByteSwap::Swap4(&m_pcHeader->NUM_FRAMES); - ByteSwap::Swap4(&m_pcHeader->NUM_SKINS); - ByteSwap::Swap4(&m_pcHeader->NUM_SURFACES); - ByteSwap::Swap4(&m_pcHeader->NUM_TAGS); - ByteSwap::Swap4(&m_pcHeader->OFS_EOF); - ByteSwap::Swap4(&m_pcHeader->OFS_FRAMES); - ByteSwap::Swap4(&m_pcHeader->OFS_SURFACES); - ByteSwap::Swap4(&m_pcHeader->OFS_TAGS); + ByteSwap::Swap4(pcSurfaces->FLAGS); + ByteSwap::Swap4(pcSurfaces->IDENT); + ByteSwap::Swap4(pcSurfaces->NUM_FRAMES); + ByteSwap::Swap4(pcSurfaces->NUM_SHADER); + ByteSwap::Swap4(pcSurfaces->NUM_TRIANGLES); + ByteSwap::Swap4(pcSurfaces->NUM_VERTICES); + ByteSwap::Swap4(pcSurfaces->OFS_END); + ByteSwap::Swap4(pcSurfaces->OFS_SHADERS); + ByteSwap::Swap4(pcSurfaces->OFS_ST); + ByteSwap::Swap4(pcSurfaces->OFS_TRIANGLES); + ByteSwap::Swap4(pcSurfaces->OFS_XYZNORMAL); #endif - // validate the header - this->ValidateHeaderOffsets(); + // validate the surface + this->ValidateSurfaceHeaderOffsets(pcSurfaces); - // now navigate to the list of surfaces - const MD3::Surface* pcSurfaces = (const MD3::Surface*) - (this->mBuffer + this->m_pcHeader->OFS_SURFACES); + // navigate to the vertex list of the surface + const MD3::Vertex* pcVertices = (const MD3::Vertex*) + (((uint8_t*)pcSurfaces) + pcSurfaces->OFS_XYZNORMAL); - // allocate output storage - pScene->mNumMeshes = this->m_pcHeader->NUM_SURFACES; - pScene->mMeshes = new aiMesh*[pScene->mNumMeshes]; + // navigate to the triangle list of the surface + const MD3::Triangle* pcTriangles = (const MD3::Triangle*) + (((uint8_t*)pcSurfaces) + pcSurfaces->OFS_TRIANGLES); - pScene->mNumMaterials = this->m_pcHeader->NUM_SURFACES; - pScene->mMaterials = new aiMaterial*[pScene->mNumMeshes]; + // navigate to the texture coordinate list of the surface + const MD3::TexCoord* pcUVs = (const MD3::TexCoord*) + (((uint8_t*)pcSurfaces) + pcSurfaces->OFS_ST); - // if an exception is thrown before the meshes are allocated -> - // otherwise the pointer value would be invalid and delete would crash - ::memset(pScene->mMeshes,0,pScene->mNumMeshes*sizeof(aiMesh*)); - ::memset(pScene->mMaterials,0,pScene->mNumMaterials*sizeof(aiMaterial*)); + // navigate to the shader list of the surface + const MD3::Shader* pcShaders = (const MD3::Shader*) + (((uint8_t*)pcSurfaces) + pcSurfaces->OFS_SHADERS); - unsigned int iNum = this->m_pcHeader->NUM_SURFACES; - unsigned int iNumMaterials = 0; - unsigned int iDefaultMatIndex = 0xFFFFFFFF; - while (iNum-- > 0) + // if the submesh is empty ignore it + if (0 == pcSurfaces->NUM_VERTICES || 0 == pcSurfaces->NUM_TRIANGLES) { - -#ifdef AI_BUILD_BIG_ENDIAN - - ByteSwap::Swap4(pcSurfaces->FLAGS); - ByteSwap::Swap4(pcSurfaces->IDENT); - ByteSwap::Swap4(pcSurfaces->NUM_FRAMES); - ByteSwap::Swap4(pcSurfaces->NUM_SHADER); - ByteSwap::Swap4(pcSurfaces->NUM_TRIANGLES); - ByteSwap::Swap4(pcSurfaces->NUM_VERTICES); - ByteSwap::Swap4(pcSurfaces->OFS_END); - ByteSwap::Swap4(pcSurfaces->OFS_SHADERS); - ByteSwap::Swap4(pcSurfaces->OFS_ST); - ByteSwap::Swap4(pcSurfaces->OFS_TRIANGLES); - ByteSwap::Swap4(pcSurfaces->OFS_XYZNORMAL); - -#endif - - // validate the surface - this->ValidateSurfaceHeaderOffsets(pcSurfaces); - - // navigate to the vertex list of the surface - const MD3::Vertex* pcVertices = (const MD3::Vertex*) - (((uint8_t*)pcSurfaces) + pcSurfaces->OFS_XYZNORMAL); - - // navigate to the triangle list of the surface - const MD3::Triangle* pcTriangles = (const MD3::Triangle*) - (((uint8_t*)pcSurfaces) + pcSurfaces->OFS_TRIANGLES); - - // navigate to the texture coordinate list of the surface - const MD3::TexCoord* pcUVs = (const MD3::TexCoord*) - (((uint8_t*)pcSurfaces) + pcSurfaces->OFS_ST); - - // navigate to the shader list of the surface - const MD3::Shader* pcShaders = (const MD3::Shader*) - (((uint8_t*)pcSurfaces) + pcSurfaces->OFS_SHADERS); - - // if the submesh is empty ignore it - if (0 == pcSurfaces->NUM_VERTICES || 0 == pcSurfaces->NUM_TRIANGLES) - { - pcSurfaces = (const MD3::Surface*)(((uint8_t*)pcSurfaces) + pcSurfaces->OFS_END); - pScene->mNumMeshes--; - continue; - } + pcSurfaces = (const MD3::Surface*)(((uint8_t*)pcSurfaces) + pcSurfaces->OFS_END); + pScene->mNumMeshes--; + continue; + } #ifdef AI_BUILD_BIG_ENDIAN - for (uint32_t i = 0; i < pcSurfaces->NUM_VERTICES;++i) - { - ByteSwap::Swap2( & pcVertices[i].NORMAL ); - ByteSwap::Swap2( & pcVertices[i].X ); - ByteSwap::Swap2( & pcVertices[i].Y ); - ByteSwap::Swap2( & pcVertices[i].Z ); + for (uint32_t i = 0; i < pcSurfaces->NUM_VERTICES;++i) + { + ByteSwap::Swap2( & pcVertices[i].NORMAL ); + ByteSwap::Swap2( & pcVertices[i].X ); + ByteSwap::Swap2( & pcVertices[i].Y ); + ByteSwap::Swap2( & pcVertices[i].Z ); - ByteSwap::Swap4( & pcUVs[i].U ); - ByteSwap::Swap4( & pcUVs[i].U ); - } - for (uint32_t i = 0; i < pcSurfaces->NUM_TRIANGLES;++i) - { - ByteSwap::Swap4(pcTriangles[i].INDEXES[0]); - ByteSwap::Swap4(pcTriangles[i].INDEXES[1]); - ByteSwap::Swap4(pcTriangles[i].INDEXES[2]); - } + ByteSwap::Swap4( & pcUVs[i].U ); + ByteSwap::Swap4( & pcUVs[i].U ); + } + for (uint32_t i = 0; i < pcSurfaces->NUM_TRIANGLES;++i) + { + ByteSwap::Swap4(pcTriangles[i].INDEXES[0]); + ByteSwap::Swap4(pcTriangles[i].INDEXES[1]); + ByteSwap::Swap4(pcTriangles[i].INDEXES[2]); + } #endif - // allocate the output mesh - pScene->mMeshes[iNum] = new aiMesh(); - aiMesh* pcMesh = pScene->mMeshes[iNum]; + // allocate the output mesh + pScene->mMeshes[iNum] = new aiMesh(); + aiMesh* pcMesh = pScene->mMeshes[iNum]; - pcMesh->mNumVertices = pcSurfaces->NUM_TRIANGLES*3; - pcMesh->mNumFaces = pcSurfaces->NUM_TRIANGLES; - pcMesh->mFaces = new aiFace[pcSurfaces->NUM_TRIANGLES]; - pcMesh->mNormals = new aiVector3D[pcMesh->mNumVertices]; - pcMesh->mVertices = new aiVector3D[pcMesh->mNumVertices]; - pcMesh->mTextureCoords[0] = new aiVector3D[pcMesh->mNumVertices]; - pcMesh->mNumUVComponents[0] = 2; + pcMesh->mNumVertices = pcSurfaces->NUM_TRIANGLES*3; + pcMesh->mNumFaces = pcSurfaces->NUM_TRIANGLES; + pcMesh->mFaces = new aiFace[pcSurfaces->NUM_TRIANGLES]; + pcMesh->mNormals = new aiVector3D[pcMesh->mNumVertices]; + pcMesh->mVertices = new aiVector3D[pcMesh->mNumVertices]; + pcMesh->mTextureCoords[0] = new aiVector3D[pcMesh->mNumVertices]; + pcMesh->mNumUVComponents[0] = 2; - // fill in all triangles - unsigned int iCurrent = 0; - for (unsigned int i = 0; i < (unsigned int)pcSurfaces->NUM_TRIANGLES;++i) + // fill in all triangles + unsigned int iCurrent = 0; + for (unsigned int i = 0; i < (unsigned int)pcSurfaces->NUM_TRIANGLES;++i) + { + pcMesh->mFaces[i].mIndices = new unsigned int[3]; + pcMesh->mFaces[i].mNumIndices = 3; + + unsigned int iTemp = iCurrent; + for (unsigned int c = 0; c < 3;++c,++iCurrent) { - pcMesh->mFaces[i].mIndices = new unsigned int[3]; - pcMesh->mFaces[i].mNumIndices = 3; + // read vertices + pcMesh->mVertices[iCurrent].x = pcVertices[ pcTriangles->INDEXES[c]].X; + pcMesh->mVertices[iCurrent].y = pcVertices[ pcTriangles->INDEXES[c]].Y*-1.0f; + pcMesh->mVertices[iCurrent].z = pcVertices[ pcTriangles->INDEXES[c]].Z; - unsigned int iTemp = iCurrent; - for (unsigned int c = 0; c < 3;++c,++iCurrent) - { - // read vertices - pcMesh->mVertices[iCurrent].x = pcVertices[ pcTriangles->INDEXES[c]].X; - pcMesh->mVertices[iCurrent].y = pcVertices[ pcTriangles->INDEXES[c]].Y*-1.0f; - pcMesh->mVertices[iCurrent].z = pcVertices[ pcTriangles->INDEXES[c]].Z; + // convert the normal vector to uncompressed float3 format + LatLngNormalToVec3(pcVertices[pcTriangles->INDEXES[c]].NORMAL, + (float*)&pcMesh->mNormals[iCurrent]); - // convert the normal vector to uncompressed float3 format - LatLngNormalToVec3(pcVertices[pcTriangles->INDEXES[c]].NORMAL, - (float*)&pcMesh->mNormals[iCurrent]); + pcMesh->mNormals[iCurrent].y *= -1.0f; - pcMesh->mNormals[iCurrent].y *= -1.0f; - - // read texture coordinates - pcMesh->mTextureCoords[0][iCurrent].x = pcUVs[ pcTriangles->INDEXES[c]].U; - pcMesh->mTextureCoords[0][iCurrent].y = 1.0f-pcUVs[ pcTriangles->INDEXES[c]].V; - } - // FIX: flip the face ordering for use with OpenGL - pcMesh->mFaces[i].mIndices[0] = iTemp+2; - pcMesh->mFaces[i].mIndices[1] = iTemp+1; - pcMesh->mFaces[i].mIndices[2] = iTemp+0; - pcTriangles++; + // read texture coordinates + pcMesh->mTextureCoords[0][iCurrent].x = pcUVs[ pcTriangles->INDEXES[c]].U; + pcMesh->mTextureCoords[0][iCurrent].y = 1.0f-pcUVs[ pcTriangles->INDEXES[c]].V; } + // FIX: flip the face ordering for use with OpenGL + pcMesh->mFaces[i].mIndices[0] = iTemp+2; + pcMesh->mFaces[i].mIndices[1] = iTemp+1; + pcMesh->mFaces[i].mIndices[2] = iTemp+0; + pcTriangles++; + } - // get the first shader (= texture?) assigned to the surface - if (0 != pcSurfaces->NUM_SHADER) + // get the first shader (= texture?) assigned to the surface + if (pcSurfaces->NUM_SHADER) + { + // make a relative path. + // if the MD3's internal path itself and the given path are using + // the same directory remove it + const char* szEndDir1 = ::strrchr((const char*)pcHeader->NAME,'\\'); + if (!szEndDir1)szEndDir1 = ::strrchr((const char*)pcHeader->NAME,'/'); + + const char* szEndDir2 = ::strrchr((const char*)pcShaders->NAME,'\\'); + if (!szEndDir2)szEndDir2 = ::strrchr((const char*)pcShaders->NAME,'/'); + + if (szEndDir1 && szEndDir2) { - // make a relative path. - // if the MD3's internal path itself and the given path are using - // the same directory remove it - const char* szEndDir1 = ::strrchr((const char*)this->m_pcHeader->NAME,'\\'); - if (!szEndDir1)szEndDir1 = ::strrchr((const char*)this->m_pcHeader->NAME,'/'); + // both of them are valid + const unsigned int iLen1 = (unsigned int)(szEndDir1 - (const char*)pcHeader->NAME); + const unsigned int iLen2 = std::min (iLen1, (unsigned int)(szEndDir2 - (const char*)pcShaders->NAME) ); - const char* szEndDir2 = ::strrchr((const char*)pcShaders->NAME,'\\'); - if (!szEndDir2)szEndDir2 = ::strrchr((const char*)pcShaders->NAME,'/'); - - if (szEndDir1 && szEndDir2) + bool bSuccess = true; + for (unsigned int a = 0; a < iLen2;++a) { - // both of them are valid - const unsigned int iLen1 = (unsigned int)(szEndDir1 - (const char*)this->m_pcHeader->NAME); - const unsigned int iLen2 = std::min (iLen1, (unsigned int)(szEndDir2 - (const char*)pcShaders->NAME) ); - - bool bSuccess = true; - for (unsigned int a = 0; a < iLen2;++a) + char sz = ::tolower ( pcShaders->NAME[a] ); + char sz2 = ::tolower ( pcHeader->NAME[a] ); + if (sz != sz2) { - char sz = ::tolower ( pcShaders->NAME[a] ); - char sz2 = ::tolower ( this->m_pcHeader->NAME[a] ); - if (sz != sz2) - { - bSuccess = false; - break; - } - } - if (bSuccess) - { - // use the file name only - szEndDir2++; - } - else - { - // use the full path - szEndDir2 = (const char*)pcShaders->NAME; + bSuccess = false; + break; } } - - // now try to find out whether we have this shader already - bool bHave = false; - for (unsigned int p = 0; p < iNumMaterials;++p) + if (bSuccess) { - if (iDefaultMatIndex == p)continue; - - aiString szOut; - if(AI_SUCCESS == aiGetMaterialString ( (aiMaterial*)pScene->mMaterials[p], - AI_MATKEY_TEXTURE_DIFFUSE(0),&szOut)) - { - if (0 == ASSIMP_stricmp(szOut.data,szEndDir2)) - { - // equal. reuse this material (texture) - bHave = true; - pcMesh->mMaterialIndex = p; - break; - } - } - } - - if (!bHave) - { - MaterialHelper* pcHelper = new MaterialHelper(); - - if (szEndDir2) - { - if (szEndDir2[0]) - { - aiString szString; - const size_t iLen = ::strlen(szEndDir2); - ::memcpy(szString.data,szEndDir2,iLen); - szString.data[iLen] = '\0'; - szString.length = iLen; - - pcHelper->AddProperty(&szString,AI_MATKEY_TEXTURE_DIFFUSE(0)); - } - else - { - DefaultLogger::get()->warn("Texture file name has zero length. " - "It will be skipped."); - } - } - - int iMode = (int)aiShadingMode_Gouraud; - pcHelper->AddProperty(&iMode, 1, AI_MATKEY_SHADING_MODEL); - - // add a small ambient color value - Quake 3 seems to have one - aiColor3D clr; - clr.b = clr.g = clr.r = 0.05f; - pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_AMBIENT); - - aiString szName; - szName.Set(AI_DEFAULT_MATERIAL_NAME); - pcHelper->AddProperty(&szName,AI_MATKEY_NAME); - - pScene->mMaterials[iNumMaterials] = (aiMaterial*)pcHelper; - iDefaultMatIndex = pcMesh->mMaterialIndex = iNumMaterials++; - } - } - else - { - if (0xFFFFFFFF != iDefaultMatIndex) - { - pcMesh->mMaterialIndex = iDefaultMatIndex; + // use the file name only + szEndDir2++; } else { - MaterialHelper* pcHelper = new MaterialHelper(); - - // fill in a default material - int iMode = (int)aiShadingMode_Gouraud; - pcHelper->AddProperty(&iMode, 1, AI_MATKEY_SHADING_MODEL); - - aiColor3D clr; - clr.b = clr.g = clr.r = 0.6f; - pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_DIFFUSE); - pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_SPECULAR); - - clr.b = clr.g = clr.r = 0.05f; - pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_AMBIENT); - - pScene->mMaterials[iNumMaterials] = (aiMaterial*)pcHelper; - iDefaultMatIndex = pcMesh->mMaterialIndex = iNumMaterials++; + // use the full path + szEndDir2 = (const char*)pcShaders->NAME; } } - // go to the next surface - pcSurfaces = (const MD3::Surface*)(((unsigned char*)pcSurfaces) + pcSurfaces->OFS_END); + MaterialHelper* pcHelper = new MaterialHelper(); + + if (szEndDir2) + { + if (szEndDir2[0]) + { + aiString szString; + const size_t iLen = ::strlen(szEndDir2); + ::memcpy(szString.data,szEndDir2,iLen); + szString.data[iLen] = '\0'; + szString.length = iLen; + + pcHelper->AddProperty(&szString,AI_MATKEY_TEXTURE_DIFFUSE(0)); + } + else + { + DefaultLogger::get()->warn("Texture file name has zero length. " + "It will be skipped."); + } + } + + int iMode = (int)aiShadingMode_Gouraud; + pcHelper->AddProperty(&iMode, 1, AI_MATKEY_SHADING_MODEL); + + // add a small ambient color value - Quake 3 seems to have one + aiColor3D clr; + clr.b = clr.g = clr.r = 0.05f; + pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_AMBIENT); + + clr.b = clr.g = clr.r = 1.0f; + pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_DIFFUSE); + pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_SPECULAR); + + aiString szName; + szName.Set(AI_DEFAULT_MATERIAL_NAME); + pcHelper->AddProperty(&szName,AI_MATKEY_NAME); + + pScene->mMaterials[iNumMaterials] = (aiMaterial*)pcHelper; + pcMesh->mMaterialIndex = iNumMaterials++; } + else + { + if (0xFFFFFFFF != iDefaultMatIndex) + { + pcMesh->mMaterialIndex = iDefaultMatIndex; + } + else + { + MaterialHelper* pcHelper = new MaterialHelper(); - if (0 == pScene->mNumMeshes) - throw new ImportErrorException( "Invalid md3 file: File contains no valid mesh"); - pScene->mNumMaterials = iNumMaterials; + // fill in a default material + int iMode = (int)aiShadingMode_Gouraud; + pcHelper->AddProperty(&iMode, 1, AI_MATKEY_SHADING_MODEL); - // now we need to generate an empty node graph - pScene->mRootNode = new aiNode(); - pScene->mRootNode->mNumMeshes = pScene->mNumMeshes; - pScene->mRootNode->mMeshes = new unsigned int[pScene->mNumMeshes]; + aiColor3D clr; + clr.b = clr.g = clr.r = 0.6f; + pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_DIFFUSE); + pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_SPECULAR); - for (unsigned int i = 0; i < pScene->mNumMeshes;++i) - pScene->mRootNode->mMeshes[i] = i; + clr.b = clr.g = clr.r = 0.05f; + pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_AMBIENT); + pScene->mMaterials[iNumMaterials] = (aiMaterial*)pcHelper; + iDefaultMatIndex = pcMesh->mMaterialIndex = iNumMaterials++; + } + } + // go to the next surface + pcSurfaces = (const MD3::Surface*)(((unsigned char*)pcSurfaces) + pcSurfaces->OFS_END); } - catch (ImportErrorException* ex) - { - delete[] this->mBuffer; AI_DEBUG_INVALIDATE_PTR(this->mBuffer); - throw ex; - } - delete[] this->mBuffer; AI_DEBUG_INVALIDATE_PTR(this->mBuffer); -} \ No newline at end of file + + if (!pScene->mNumMeshes) + throw new ImportErrorException( "Invalid MD3 file: File contains no valid mesh"); + pScene->mNumMaterials = iNumMaterials; + + // now we need to generate an empty node graph + pScene->mRootNode = new aiNode(); + pScene->mRootNode->mNumMeshes = pScene->mNumMeshes; + pScene->mRootNode->mMeshes = new unsigned int[pScene->mNumMeshes]; + + for (unsigned int i = 0; i < pScene->mNumMeshes;++i) + pScene->mRootNode->mMeshes[i] = i; +} diff --git a/code/MD3Loader.h b/code/MD3Loader.h index 2eb85eada..3939b87c3 100644 --- a/code/MD3Loader.h +++ b/code/MD3Loader.h @@ -42,17 +42,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_MD3LOADER_H_INCLUDED #define AI_MD3LOADER_H_INCLUDED -#include - #include "BaseImporter.h" +#include "ByteSwap.h" #include "../include/aiTypes.h" struct aiNode; #include "MD3FileData.h" -namespace Assimp -{ +namespace Assimp { class MaterialHelper; using namespace MD3; @@ -117,10 +115,10 @@ protected: unsigned int configFrameID; /** Header of the MD3 file */ - const MD3::Header* m_pcHeader; + BE_NCONST MD3::Header* pcHeader; - /** Buffer to hold the loaded file */ - const unsigned char* mBuffer; + /** File buffer */ + BE_NCONST unsigned char* mBuffer; /** Size of the file, in bytes */ unsigned int fileSize; diff --git a/code/MDCFileData.h b/code/MDCFileData.h index 9e205cc9e..dfd1a8124 100644 --- a/code/MDCFileData.h +++ b/code/MDCFileData.h @@ -53,14 +53,7 @@ http://themdcfile.planetwolfenstein.gamespy.com/MDC_File_Format.pdf #include "../include/aiMesh.h" #include "../include/aiAnim.h" -#if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) -# pragma pack(push,1) -# define PACK_STRUCT -#elif defined( __GNUC__ ) -# define PACK_STRUCT __attribute__((packed)) -#else -# error Compiler not supported -#endif +#include "./Compiler/pushpack1.h" namespace Assimp { @@ -188,11 +181,7 @@ struct Shader } PACK_STRUCT; -// reset packing to the original value -#if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) -# pragma pack( pop ) -#endif -#undef PACK_STRUCT +#include "./Compiler/poppack1.h" // --------------------------------------------------------------------------- diff --git a/code/MDCLoader.cpp b/code/MDCLoader.cpp new file mode 100644 index 000000000..65c7f464d --- /dev/null +++ b/code/MDCLoader.cpp @@ -0,0 +1,476 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (ASSIMP) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2008, ASSIMP Development Team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the ASSIMP team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the ASSIMP Development Team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +/** @file Implementation of the MDC importer class */ + +// internal headers +#include "MDCLoader.h" +#include "MD3FileData.h" +#include "MaterialSystem.h" +#include "StringComparison.h" +#include "MDCNormalTable.h" // shouldn't be included by other units +#include "ByteSwap.h" + +// public ASSIMP headers +#include "../include/IOStream.h" +#include "../include/IOSystem.h" +#include "../include/aiMesh.h" +#include "../include/aiScene.h" +#include "../include/aiAssert.h" +#include "../include/DefaultLogger.h" +#include "../include/assimp.hpp" + +// boost headers +#include + +using namespace Assimp; +using namespace Assimp::MDC; + + +// ------------------------------------------------------------------------------------------------ +void MDC::BuildVertex(const Frame& frame, + const BaseVertex& bvert, + const CompressedVertex& cvert, + aiVector3D& vXYZOut, + aiVector3D& vNorOut) +{ + // compute the position + const float xd = (cvert.xd - AI_MDC_CVERT_BIAS) * AI_MDC_DELTA_SCALING; + const float yd = (cvert.yd - AI_MDC_CVERT_BIAS) * AI_MDC_DELTA_SCALING; + const float zd = (cvert.zd - AI_MDC_CVERT_BIAS) * AI_MDC_DELTA_SCALING; + vXYZOut.x = frame.localOrigin.x + AI_MDC_BASE_SCALING * (bvert.x + xd); + vXYZOut.y = frame.localOrigin.y + AI_MDC_BASE_SCALING * (bvert.y + yd); + vXYZOut.z = frame.localOrigin.z + AI_MDC_BASE_SCALING * (bvert.z + zd); + + // compute the normal vector .. ehm ... lookup it in the table :-) + vNorOut.x = mdcNormals[cvert.nd][0]; + vNorOut.y = mdcNormals[cvert.nd][1]; + vNorOut.z = mdcNormals[cvert.nd][2]; +} + +// ------------------------------------------------------------------------------------------------ +// Constructor to be privately used by Importer +MDCImporter::MDCImporter() +{ +} + +// ------------------------------------------------------------------------------------------------ +// Destructor, private as well +MDCImporter::~MDCImporter() +{ +} +// ------------------------------------------------------------------------------------------------ +// Returns whether the class can handle the format of the given file. +bool MDCImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler) const +{ + // simple check of file extension is enough for the moment + std::string::size_type pos = pFile.find_last_of('.'); + // no file extension - can't read + if( pos == std::string::npos) + return false; + std::string extension = pFile.substr( pos); + + if (extension.length() < 4)return false; + if (extension[0] != '.')return false; + + if( extension[1] != 'M' && extension[1] != 'm')return false; + if( extension[2] != 'D' && extension[2] != 'd')return false; + if( extension[3] != 'C' && extension[3] != 'c')return false; + + return true; +} +// ------------------------------------------------------------------------------------------------ +// Validate the header of the given MDC file +void MDCImporter::ValidateHeader() +{ + AI_SWAP4( this->pcHeader->ulVersion ); + AI_SWAP4( this->pcHeader->ulFlags ); + AI_SWAP4( this->pcHeader->ulNumFrames ); + AI_SWAP4( this->pcHeader->ulNumTags ); + AI_SWAP4( this->pcHeader->ulNumSurfaces ); + AI_SWAP4( this->pcHeader->ulNumSkins ); + AI_SWAP4( this->pcHeader->ulOffsetBorderFrames ); + + if (pcHeader->ulIdent != AI_MDC_MAGIC_NUMBER_BE && + pcHeader->ulIdent != AI_MDC_MAGIC_NUMBER_LE) + { + char szBuffer[5]; + szBuffer[0] = ((char*)&pcHeader->ulIdent)[0]; + szBuffer[1] = ((char*)&pcHeader->ulIdent)[1]; + szBuffer[2] = ((char*)&pcHeader->ulIdent)[2]; + szBuffer[3] = ((char*)&pcHeader->ulIdent)[3]; + szBuffer[4] = '\0'; + + throw new ImportErrorException("Invalid MDC magic word: should be IDPC, the " + "magic word found is " + std::string( szBuffer )); + } + + if (pcHeader->ulVersion != AI_MDC_VERSION) + DefaultLogger::get()->warn("Unsupported MDC file version (2 (AI_MDC_VERSION) was expected)"); + + if (pcHeader->ulOffsetBorderFrames + pcHeader->ulNumFrames * sizeof(MDC::Frame) > this->fileSize || + pcHeader->ulOffsetSurfaces + pcHeader->ulNumSurfaces * sizeof(MDC::Surface) > this->fileSize) + { + throw new ImportErrorException("Some of the offset values in the MDC header are invalid " + "and point to something behind the file."); + } + + if (this->configFrameID >= this->pcHeader->ulNumFrames) + throw new ImportErrorException("The requested frame is not available"); +} +// ------------------------------------------------------------------------------------------------ +// Validate the header of a given MDC file surface +void MDCImporter::ValidateSurfaceHeader(BE_NCONST MDC::Surface* pcSurf) +{ + AI_SWAP4(pcSurf->ulFlags); + AI_SWAP4(pcSurf->ulNumCompFrames); + AI_SWAP4(pcSurf->ulNumBaseFrames); + AI_SWAP4(pcSurf->ulNumShaders); + AI_SWAP4(pcSurf->ulNumVertices); + AI_SWAP4(pcSurf->ulNumTriangles); + AI_SWAP4(pcSurf->ulOffsetTriangles); + AI_SWAP4(pcSurf->ulOffsetTexCoords); + AI_SWAP4(pcSurf->ulOffsetBaseVerts); + AI_SWAP4(pcSurf->ulOffsetCompVerts); + AI_SWAP4(pcSurf->ulOffsetFrameBaseFrames); + AI_SWAP4(pcSurf->ulOffsetFrameCompFrames); + AI_SWAP4(pcSurf->ulOffsetEnd); + + const unsigned int iMax = this->fileSize - (unsigned int)((int8_t*)pcSurf-(int8_t*)pcHeader); + + if (pcSurf->ulOffsetBaseVerts + pcSurf->ulNumVertices * sizeof(MDC::BaseVertex) > iMax || + (pcSurf->ulNumCompFrames && pcSurf->ulOffsetCompVerts + pcSurf->ulNumVertices * sizeof(MDC::CompressedVertex) > iMax) || + pcSurf->ulOffsetTriangles + pcSurf->ulNumTriangles * sizeof(MDC::Triangle) > iMax || + pcSurf->ulOffsetTexCoords + pcSurf->ulNumVertices * sizeof(MDC::TexturCoord) > iMax || + pcSurf->ulOffsetShaders + pcSurf->ulNumShaders * sizeof(MDC::Shader) > iMax || + pcSurf->ulOffsetFrameBaseFrames + pcSurf->ulNumBaseFrames * 2 > iMax || + (pcSurf->ulNumCompFrames && pcSurf->ulOffsetFrameCompFrames + pcSurf->ulNumCompFrames * 2 > iMax)) + { + throw new ImportErrorException("Some of the offset values in the MDC surface header " + "are invalid and point somewhere behind the file."); + } +} +// ------------------------------------------------------------------------------------------------ +// Setup configuration properties +void MDCImporter::SetupProperties(const Importer* pImp) +{ + // The AI_CONFIG_IMPORT_MDC_KEYFRAME option overrides the + // AI_CONFIG_IMPORT_GLOBAL_KEYFRAME option. + if(0xffffffff == (this->configFrameID = pImp->GetProperty( + AI_CONFIG_IMPORT_MDC_KEYFRAME,0xffffffff))) + { + this->configFrameID = pImp->GetProperty(AI_CONFIG_IMPORT_GLOBAL_KEYFRAME,0); + } +} +// ------------------------------------------------------------------------------------------------ +// Imports the given file into the given scene structure. +void MDCImporter::InternReadFile( + const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) +{ + boost::scoped_ptr file( pIOHandler->Open( pFile)); + + // Check whether we can read from the file + if( file.get() == NULL) + throw new ImportErrorException( "Failed to open MDC file " + pFile + "."); + + // check whether the mdc file is large enough to contain the file header + fileSize = (unsigned int)file->FileSize(); + if( fileSize < sizeof(MDC::Header)) + throw new ImportErrorException( "MDC File is too small."); + + std::vector mBuffer2(fileSize); + file->Read( &mBuffer2[0], 1, fileSize); + mBuffer = &mBuffer2[0]; + + // validate the file header + this->pcHeader = (BE_NCONST MDC::Header*)this->mBuffer; + this->ValidateHeader(); + + std::vector aszShaders; + + // get a pointer to the frame we want to read + BE_NCONST MDC::Frame* pcFrame = (BE_NCONST MDC::Frame*)(this->mBuffer+ + this->pcHeader->ulOffsetBorderFrames); + + // no need to swap the other members, we won't need them + pcFrame += configFrameID; + AI_SWAP4( pcFrame->localOrigin[0] ); + AI_SWAP4( pcFrame->localOrigin[1] ); + AI_SWAP4( pcFrame->localOrigin[2] ); + + // get the number of valid surfaces + BE_NCONST MDC::Surface* pcSurface, *pcSurface2; + pcSurface = pcSurface2 = (BE_NCONST MDC::Surface*)(mBuffer + pcHeader->ulOffsetSurfaces); + unsigned int iNumShaders = 0; + for (unsigned int i = 0; i < pcHeader->ulNumSurfaces;++i) + { + // validate the surface header + this->ValidateSurfaceHeader(pcSurface2); + + if (pcSurface2->ulNumVertices && pcSurface2->ulNumTriangles)++pScene->mNumMeshes; + iNumShaders += pcSurface2->ulNumShaders; + pcSurface2 = (const MDC::Surface*)((int8_t*)pcSurface2 + pcSurface2->ulOffsetEnd); + } + aszShaders.reserve(iNumShaders); + pScene->mMeshes = new aiMesh*[pScene->mNumMeshes]; + + // necessary that we don't crash if an exception occurs + for (unsigned int i = 0; i < pScene->mNumMeshes;++i) + pScene->mMeshes[i] = NULL; + + // now read all surfaces + unsigned int iDefaultMatIndex = 0xffffffff; + for (unsigned int i = 0, iNum = 0; i < pcHeader->ulNumSurfaces;++i) + { + if (!pcSurface->ulNumVertices || !pcSurface->ulNumTriangles)continue; + aiMesh* pcMesh = pScene->mMeshes[iNum++] = new aiMesh(); + + pcMesh->mNumFaces = pcSurface->ulNumTriangles; + pcMesh->mNumVertices = pcMesh->mNumFaces * 3; + + // store the name of the surface for use as node name. + // FIX: make sure there is a 0 termination + const_cast(pcSurface->ucName[AI_MDC_MAXQPATH-1]) = '\0'; + pcMesh->mTextureCoords[3] = (aiVector3D*)pcSurface->ucName; + + // go to the first shader in the file. ignore the others. + if (pcSurface->ulNumShaders) + { + const MDC::Shader* pcShader = (const MDC::Shader*)((int8_t*)pcSurface + pcSurface->ulOffsetShaders); + pcMesh->mMaterialIndex = (unsigned int)aszShaders.size(); + + // create a new shader + aszShaders.push_back(std::string( pcShader->ucName, std::min( + ::strlen(pcShader->ucName),sizeof(pcShader->ucName)) )); + } + // need to create a default material + else if (0xffffffff == iDefaultMatIndex) + { + pcMesh->mMaterialIndex = iDefaultMatIndex = (unsigned int)aszShaders.size(); + aszShaders.push_back(std::string()); + } + // otherwise assign a reference to the default material + else pcMesh->mMaterialIndex = iDefaultMatIndex; + + // allocate output storage for the mesh + aiVector3D* pcVertCur = pcMesh->mVertices = new aiVector3D[pcMesh->mNumVertices]; + aiVector3D* pcNorCur = pcMesh->mNormals = new aiVector3D[pcMesh->mNumVertices]; + aiVector3D* pcUVCur = pcMesh->mTextureCoords[0] = new aiVector3D[pcMesh->mNumVertices]; + aiFace* pcFaceCur = pcMesh->mFaces = new aiFace[pcMesh->mNumFaces]; + + // create all vertices/faces + BE_NCONST MDC::Triangle* pcTriangle = (BE_NCONST MDC::Triangle*) + ((int8_t*)pcSurface+pcSurface->ulOffsetTriangles); + + BE_NCONST MDC::TexturCoord* const pcUVs = (BE_NCONST MDC::TexturCoord*) + ((int8_t*)pcSurface+pcSurface->ulOffsetTexCoords); + + // get a pointer to the uncompressed vertices + int16_t iOfs = *((int16_t*) ((int8_t*) pcSurface + + pcSurface->ulOffsetFrameBaseFrames) + this->configFrameID); + + AI_SWAP2(iOfs); + + BE_NCONST MDC::BaseVertex* const pcVerts = (BE_NCONST MDC::BaseVertex*) + ((int8_t*)pcSurface+pcSurface->ulOffsetBaseVerts) + + ((int)iOfs * pcSurface->ulNumVertices * 4); + + // do the main swapping stuff ... +#if (defined AI_BUILD_BIG_ENDIAN) + + // swap all triangles + for (unsigned int i = 0; i < pcSurface->ulNumTriangles;++i) + { + AI_SWAP4( pcTriangle[i].aiIndices[0] ); + AI_SWAP4( pcTriangle[i].aiIndices[1] ); + AI_SWAP4( pcTriangle[i].aiIndices[2] ); + } + + // swap all vertices + for (unsigned int i = 0; i < pcSurface->ulNumVertices*pcSurface->ulNumBaseFrames;++i) + { + AI_SWAP2( pcVerts->normal ); + AI_SWAP2( pcVerts->x ); + AI_SWAP2( pcVerts->y ); + AI_SWAP2( pcVerts->z ); + } + + // swap all texture coordinates + for (unsigned int i = 0; i < pcSurface->ulNumVertices;++i) + { + AI_SWAP4( pcUVs->v ); + AI_SWAP4( pcUVs->v ); + } + +#endif + + const MDC::CompressedVertex* pcCVerts; + int16_t* mdcCompVert = NULL; + + // access compressed frames for large frame numbers, but never for the first + if( this->configFrameID && pcSurface->ulNumCompFrames > 0 ) + { + mdcCompVert = (int16_t*) ((int8_t*)pcSurface+pcSurface->ulOffsetFrameCompFrames) + this->configFrameID; + AI_SWAP2P(mdcCompVert); + if( *mdcCompVert >= 0 ) + { + pcCVerts = (const MDC::CompressedVertex*)((int8_t*)pcSurface + + pcSurface->ulOffsetCompVerts) + *mdcCompVert * pcSurface->ulNumVertices; + } + else mdcCompVert = NULL; + } + + // copy all faces + for (unsigned int iFace = 0; iFace < pcSurface->ulNumTriangles;++iFace, + ++pcTriangle,++pcFaceCur) + { + const unsigned int iOutIndex = iFace*3; + pcFaceCur->mNumIndices = 3; + pcFaceCur->mIndices = new unsigned int[3]; + + for (unsigned int iIndex = 0; iIndex < 3;++iIndex, + ++pcVertCur,++pcUVCur,++pcNorCur) + { + uint32_t quak = pcTriangle->aiIndices[iIndex]; + if (quak >= pcSurface->ulNumVertices) + { + DefaultLogger::get()->error("MDC vertex index is out of range"); + quak = pcSurface->ulNumVertices-1; + } + + // compressed vertices? + if (mdcCompVert) + { + MDC::BuildVertex(*pcFrame,pcVerts[quak],pcCVerts[quak], + *pcVertCur,*pcNorCur); + } + else + { + // copy position + pcVertCur->x = pcVerts[quak].x * AI_MDC_BASE_SCALING; + pcVertCur->y = pcVerts[quak].y * AI_MDC_BASE_SCALING; + pcVertCur->z = pcVerts[quak].z * AI_MDC_BASE_SCALING; + + // copy normals + MD3::LatLngNormalToVec3( pcVerts[quak].normal, &pcNorCur->x ); + + // copy texture coordinates + pcUVCur->x = pcUVs[quak].u; + pcUVCur->y = 1.0f-pcUVs[quak].v; // DX to OGL + } + pcVertCur->x += pcFrame->localOrigin[0] ; + pcVertCur->y += pcFrame->localOrigin[1] ; + pcVertCur->z += pcFrame->localOrigin[2] ; + } + + // swap the face order - DX to OGL + pcFaceCur->mIndices[0] = iOutIndex + 2; + pcFaceCur->mIndices[1] = iOutIndex + 1; + pcFaceCur->mIndices[2] = iOutIndex + 0; + } + + pcSurface = (BE_NCONST MDC::Surface*)((int8_t*)pcSurface + pcSurface->ulOffsetEnd); + } + + // create a flat node graph with a root node and one child for each surface + if (!pScene->mNumMeshes) + throw new ImportErrorException( "Invalid MDC file: File contains no valid mesh"); + else if (1 == pScene->mNumMeshes) + { + pScene->mRootNode = new aiNode(); + pScene->mRootNode->mName.Set(std::string((const char*)pScene->mMeshes[0]->mTextureCoords[3])); + pScene->mRootNode->mNumMeshes = 1; + pScene->mRootNode->mMeshes = new unsigned int[1]; + pScene->mRootNode->mMeshes[0] = 0; + } + else + { + pScene->mRootNode = new aiNode(); + pScene->mRootNode->mNumChildren = pScene->mNumMeshes; + pScene->mRootNode->mChildren = new aiNode*[pScene->mNumMeshes]; + pScene->mRootNode->mName.Set(""); + for (unsigned int i = 0; i < pScene->mNumMeshes;++i) + { + aiNode* pcNode = pScene->mRootNode->mChildren[i] = new aiNode(); + pcNode->mParent = pScene->mRootNode; + pcNode->mName.Set(std::string((const char*)pScene->mMeshes[i]->mTextureCoords[3])); + pcNode->mNumMeshes = 1; + pcNode->mMeshes = new unsigned int[1]; + pcNode->mMeshes[0] = i; + } + } + + // make sure we invalidate the pointer to the mesh name + for (unsigned int i = 0; i < pScene->mNumMeshes;++i) + pScene->mMeshes[i]->mTextureCoords[3] = NULL; + + // create materials + pScene->mNumMaterials = aszShaders.size(); + pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials]; + for (unsigned int i = 0; i < pScene->mNumMaterials;++i) + { + MaterialHelper* pcMat = new MaterialHelper(); + pScene->mMaterials[i] = pcMat; + + const std::string& name = aszShaders[i]; + + int iMode = (int)aiShadingMode_Gouraud; + pcMat->AddProperty(&iMode, 1, AI_MATKEY_SHADING_MODEL); + + // add a small ambient color value - RtCW seems to have one + aiColor3D clr; + clr.b = clr.g = clr.r = 0.05f; + pcMat->AddProperty(&clr, 1,AI_MATKEY_COLOR_AMBIENT); + + if (name.length())clr.b = clr.g = clr.r = 1.0f; + else clr.b = clr.g = clr.r = 0.6f; + + pcMat->AddProperty(&clr, 1,AI_MATKEY_COLOR_DIFFUSE); + pcMat->AddProperty(&clr, 1,AI_MATKEY_COLOR_SPECULAR); + + if (name.length()) + { + aiString path; + path.Set(name); + pcMat->AddProperty(&path,AI_MATKEY_TEXTURE_DIFFUSE(0)); + } + } +} diff --git a/code/MDCLoader.h b/code/MDCLoader.h new file mode 100644 index 000000000..c31affbc6 --- /dev/null +++ b/code/MDCLoader.h @@ -0,0 +1,132 @@ +/* +Open Asset Import Library (ASSIMP) +---------------------------------------------------------------------- + +Copyright (c) 2006-2008, ASSIMP Development Team +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the +following conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the ASSIMP team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the ASSIMP Development Team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------------------------------------- +*/ + +/** @file Definition of the MDC importer class. */ +#ifndef AI_MDCLOADER_H_INCLUDED +#define AI_MDCLOADER_H_INCLUDED + +#include "../include/aiTypes.h" + +#include "BaseImporter.h" +#include "MDCFileData.h" +#include "ByteSwap.h" + +namespace Assimp +{ +using namespace MDC; + +// --------------------------------------------------------------------------- +/** Used to load MDC files +*/ +class MDCImporter : public BaseImporter +{ + friend class Importer; + +protected: + /** Constructor to be privately used by Importer */ + MDCImporter(); + + /** Destructor, private as well */ + ~MDCImporter(); + +public: + + // ------------------------------------------------------------------- + /** Returns whether the class can handle the format of the given file. + * See BaseImporter::CanRead() for details. */ + bool CanRead( const std::string& pFile, IOSystem* pIOHandler) const; + + // ------------------------------------------------------------------- + /** Called prior to ReadFile(). + * The function is a request to the importer to update its configuration + * basing on the Importer's configuration property list. + */ + void SetupProperties(const Importer* pImp); + +protected: + + // ------------------------------------------------------------------- + /** Called by Importer::GetExtensionList() for each loaded importer. + * See BaseImporter::GetExtensionList() for details + */ + void GetExtensionList(std::string& append) + { + append.append("*.mdc"); + } + + // ------------------------------------------------------------------- + /** Imports the given file into the given scene structure. + * See BaseImporter::InternReadFile() for details + */ + void InternReadFile( const std::string& pFile, aiScene* pScene, + IOSystem* pIOHandler); + +protected: + + + // ------------------------------------------------------------------- + /** Validate the header of the file + */ + void ValidateHeader(); + + // ------------------------------------------------------------------- + /** Validate the header of a MDC surface + */ + void ValidateSurfaceHeader(BE_NCONST MDC::Surface* pcSurf); + +protected: + + + /** Configuration option: frame to be loaded */ + unsigned int configFrameID; + + /** Header of the MDC file */ + BE_NCONST MDC::Header* pcHeader; + + /** Buffer to hold the loaded file */ + unsigned char* mBuffer; + + /** size of the file, in bytes */ + unsigned int fileSize; +}; + +} // end of namespace Assimp + +#endif // AI_3DSIMPORTER_H_INC \ No newline at end of file diff --git a/code/MDCNormalTable.h b/code/MDCNormalTable.h new file mode 100644 index 000000000..198fef3ac --- /dev/null +++ b/code/MDCNormalTable.h @@ -0,0 +1,299 @@ +/* ----------------------------------------------------------------------------- + +PicoModel Library + +Copyright (c) 2002, Randy Reddig & seaw0lf +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +Neither the names of the copyright holders nor the names of its contributors may +be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------- */ + +#if (!defined MDC_NORMAL_TABLE_INCLUDED) +#define MDC_NORMAL_TABLE_INCLUDED + +/* mdc decoding normal table */ +float mdcNormals[ 256 ][ 3 ] = +{ + { 1.000000f, 0.000000f, 0.000000f }, + { 0.980785f, 0.195090f, 0.000000f }, + { 0.923880f, 0.382683f, 0.000000f }, + { 0.831470f, 0.555570f, 0.000000f }, + { 0.707107f, 0.707107f, 0.000000f }, + { 0.555570f, 0.831470f, 0.000000f }, + { 0.382683f, 0.923880f, 0.000000f }, + { 0.195090f, 0.980785f, 0.000000f }, + { -0.000000f, 1.000000f, 0.000000f }, + { -0.195090f, 0.980785f, 0.000000f }, + { -0.382683f, 0.923880f, 0.000000f }, + { -0.555570f, 0.831470f, 0.000000f }, + { -0.707107f, 0.707107f, 0.000000f }, + { -0.831470f, 0.555570f, 0.000000f }, + { -0.923880f, 0.382683f, 0.000000f }, + { -0.980785f, 0.195090f, 0.000000f }, + { -1.000000f, -0.000000f, 0.000000f }, + { -0.980785f, -0.195090f, 0.000000f }, + { -0.923880f, -0.382683f, 0.000000f }, + { -0.831470f, -0.555570f, 0.000000f }, + { -0.707107f, -0.707107f, 0.000000f }, + { -0.555570f, -0.831469f, 0.000000f }, + { -0.382684f, -0.923880f, 0.000000f }, + { -0.195090f, -0.980785f, 0.000000f }, + { 0.000000f, -1.000000f, 0.000000f }, + { 0.195090f, -0.980785f, 0.000000f }, + { 0.382684f, -0.923879f, 0.000000f }, + { 0.555570f, -0.831470f, 0.000000f }, + { 0.707107f, -0.707107f, 0.000000f }, + { 0.831470f, -0.555570f, 0.000000f }, + { 0.923880f, -0.382683f, 0.000000f }, + { 0.980785f, -0.195090f, 0.000000f }, + { 0.980785f, 0.000000f, -0.195090f }, + { 0.956195f, 0.218245f, -0.195090f }, + { 0.883657f, 0.425547f, -0.195090f }, + { 0.766809f, 0.611510f, -0.195090f }, + { 0.611510f, 0.766809f, -0.195090f }, + { 0.425547f, 0.883657f, -0.195090f }, + { 0.218245f, 0.956195f, -0.195090f }, + { -0.000000f, 0.980785f, -0.195090f }, + { -0.218245f, 0.956195f, -0.195090f }, + { -0.425547f, 0.883657f, -0.195090f }, + { -0.611510f, 0.766809f, -0.195090f }, + { -0.766809f, 0.611510f, -0.195090f }, + { -0.883657f, 0.425547f, -0.195090f }, + { -0.956195f, 0.218245f, -0.195090f }, + { -0.980785f, -0.000000f, -0.195090f }, + { -0.956195f, -0.218245f, -0.195090f }, + { -0.883657f, -0.425547f, -0.195090f }, + { -0.766809f, -0.611510f, -0.195090f }, + { -0.611510f, -0.766809f, -0.195090f }, + { -0.425547f, -0.883657f, -0.195090f }, + { -0.218245f, -0.956195f, -0.195090f }, + { 0.000000f, -0.980785f, -0.195090f }, + { 0.218245f, -0.956195f, -0.195090f }, + { 0.425547f, -0.883657f, -0.195090f }, + { 0.611510f, -0.766809f, -0.195090f }, + { 0.766809f, -0.611510f, -0.195090f }, + { 0.883657f, -0.425547f, -0.195090f }, + { 0.956195f, -0.218245f, -0.195090f }, + { 0.923880f, 0.000000f, -0.382683f }, + { 0.892399f, 0.239118f, -0.382683f }, + { 0.800103f, 0.461940f, -0.382683f }, + { 0.653281f, 0.653281f, -0.382683f }, + { 0.461940f, 0.800103f, -0.382683f }, + { 0.239118f, 0.892399f, -0.382683f }, + { -0.000000f, 0.923880f, -0.382683f }, + { -0.239118f, 0.892399f, -0.382683f }, + { -0.461940f, 0.800103f, -0.382683f }, + { -0.653281f, 0.653281f, -0.382683f }, + { -0.800103f, 0.461940f, -0.382683f }, + { -0.892399f, 0.239118f, -0.382683f }, + { -0.923880f, -0.000000f, -0.382683f }, + { -0.892399f, -0.239118f, -0.382683f }, + { -0.800103f, -0.461940f, -0.382683f }, + { -0.653282f, -0.653281f, -0.382683f }, + { -0.461940f, -0.800103f, -0.382683f }, + { -0.239118f, -0.892399f, -0.382683f }, + { 0.000000f, -0.923880f, -0.382683f }, + { 0.239118f, -0.892399f, -0.382683f }, + { 0.461940f, -0.800103f, -0.382683f }, + { 0.653281f, -0.653282f, -0.382683f }, + { 0.800103f, -0.461940f, -0.382683f }, + { 0.892399f, -0.239117f, -0.382683f }, + { 0.831470f, 0.000000f, -0.555570f }, + { 0.790775f, 0.256938f, -0.555570f }, + { 0.672673f, 0.488726f, -0.555570f }, + { 0.488726f, 0.672673f, -0.555570f }, + { 0.256938f, 0.790775f, -0.555570f }, + { -0.000000f, 0.831470f, -0.555570f }, + { -0.256938f, 0.790775f, -0.555570f }, + { -0.488726f, 0.672673f, -0.555570f }, + { -0.672673f, 0.488726f, -0.555570f }, + { -0.790775f, 0.256938f, -0.555570f }, + { -0.831470f, -0.000000f, -0.555570f }, + { -0.790775f, -0.256938f, -0.555570f }, + { -0.672673f, -0.488726f, -0.555570f }, + { -0.488725f, -0.672673f, -0.555570f }, + { -0.256938f, -0.790775f, -0.555570f }, + { 0.000000f, -0.831470f, -0.555570f }, + { 0.256938f, -0.790775f, -0.555570f }, + { 0.488725f, -0.672673f, -0.555570f }, + { 0.672673f, -0.488726f, -0.555570f }, + { 0.790775f, -0.256938f, -0.555570f }, + { 0.707107f, 0.000000f, -0.707107f }, + { 0.653281f, 0.270598f, -0.707107f }, + { 0.500000f, 0.500000f, -0.707107f }, + { 0.270598f, 0.653281f, -0.707107f }, + { -0.000000f, 0.707107f, -0.707107f }, + { -0.270598f, 0.653282f, -0.707107f }, + { -0.500000f, 0.500000f, -0.707107f }, + { -0.653281f, 0.270598f, -0.707107f }, + { -0.707107f, -0.000000f, -0.707107f }, + { -0.653281f, -0.270598f, -0.707107f }, + { -0.500000f, -0.500000f, -0.707107f }, + { -0.270598f, -0.653281f, -0.707107f }, + { 0.000000f, -0.707107f, -0.707107f }, + { 0.270598f, -0.653281f, -0.707107f }, + { 0.500000f, -0.500000f, -0.707107f }, + { 0.653282f, -0.270598f, -0.707107f }, + { 0.555570f, 0.000000f, -0.831470f }, + { 0.481138f, 0.277785f, -0.831470f }, + { 0.277785f, 0.481138f, -0.831470f }, + { -0.000000f, 0.555570f, -0.831470f }, + { -0.277785f, 0.481138f, -0.831470f }, + { -0.481138f, 0.277785f, -0.831470f }, + { -0.555570f, -0.000000f, -0.831470f }, + { -0.481138f, -0.277785f, -0.831470f }, + { -0.277785f, -0.481138f, -0.831470f }, + { 0.000000f, -0.555570f, -0.831470f }, + { 0.277785f, -0.481138f, -0.831470f }, + { 0.481138f, -0.277785f, -0.831470f }, + { 0.382683f, 0.000000f, -0.923880f }, + { 0.270598f, 0.270598f, -0.923880f }, + { -0.000000f, 0.382683f, -0.923880f }, + { -0.270598f, 0.270598f, -0.923880f }, + { -0.382683f, -0.000000f, -0.923880f }, + { -0.270598f, -0.270598f, -0.923880f }, + { 0.000000f, -0.382683f, -0.923880f }, + { 0.270598f, -0.270598f, -0.923880f }, + { 0.195090f, 0.000000f, -0.980785f }, + { -0.000000f, 0.195090f, -0.980785f }, + { -0.195090f, -0.000000f, -0.980785f }, + { 0.000000f, -0.195090f, -0.980785f }, + { 0.980785f, 0.000000f, 0.195090f }, + { 0.956195f, 0.218245f, 0.195090f }, + { 0.883657f, 0.425547f, 0.195090f }, + { 0.766809f, 0.611510f, 0.195090f }, + { 0.611510f, 0.766809f, 0.195090f }, + { 0.425547f, 0.883657f, 0.195090f }, + { 0.218245f, 0.956195f, 0.195090f }, + { -0.000000f, 0.980785f, 0.195090f }, + { -0.218245f, 0.956195f, 0.195090f }, + { -0.425547f, 0.883657f, 0.195090f }, + { -0.611510f, 0.766809f, 0.195090f }, + { -0.766809f, 0.611510f, 0.195090f }, + { -0.883657f, 0.425547f, 0.195090f }, + { -0.956195f, 0.218245f, 0.195090f }, + { -0.980785f, -0.000000f, 0.195090f }, + { -0.956195f, -0.218245f, 0.195090f }, + { -0.883657f, -0.425547f, 0.195090f }, + { -0.766809f, -0.611510f, 0.195090f }, + { -0.611510f, -0.766809f, 0.195090f }, + { -0.425547f, -0.883657f, 0.195090f }, + { -0.218245f, -0.956195f, 0.195090f }, + { 0.000000f, -0.980785f, 0.195090f }, + { 0.218245f, -0.956195f, 0.195090f }, + { 0.425547f, -0.883657f, 0.195090f }, + { 0.611510f, -0.766809f, 0.195090f }, + { 0.766809f, -0.611510f, 0.195090f }, + { 0.883657f, -0.425547f, 0.195090f }, + { 0.956195f, -0.218245f, 0.195090f }, + { 0.923880f, 0.000000f, 0.382683f }, + { 0.892399f, 0.239118f, 0.382683f }, + { 0.800103f, 0.461940f, 0.382683f }, + { 0.653281f, 0.653281f, 0.382683f }, + { 0.461940f, 0.800103f, 0.382683f }, + { 0.239118f, 0.892399f, 0.382683f }, + { -0.000000f, 0.923880f, 0.382683f }, + { -0.239118f, 0.892399f, 0.382683f }, + { -0.461940f, 0.800103f, 0.382683f }, + { -0.653281f, 0.653281f, 0.382683f }, + { -0.800103f, 0.461940f, 0.382683f }, + { -0.892399f, 0.239118f, 0.382683f }, + { -0.923880f, -0.000000f, 0.382683f }, + { -0.892399f, -0.239118f, 0.382683f }, + { -0.800103f, -0.461940f, 0.382683f }, + { -0.653282f, -0.653281f, 0.382683f }, + { -0.461940f, -0.800103f, 0.382683f }, + { -0.239118f, -0.892399f, 0.382683f }, + { 0.000000f, -0.923880f, 0.382683f }, + { 0.239118f, -0.892399f, 0.382683f }, + { 0.461940f, -0.800103f, 0.382683f }, + { 0.653281f, -0.653282f, 0.382683f }, + { 0.800103f, -0.461940f, 0.382683f }, + { 0.892399f, -0.239117f, 0.382683f }, + { 0.831470f, 0.000000f, 0.555570f }, + { 0.790775f, 0.256938f, 0.555570f }, + { 0.672673f, 0.488726f, 0.555570f }, + { 0.488726f, 0.672673f, 0.555570f }, + { 0.256938f, 0.790775f, 0.555570f }, + { -0.000000f, 0.831470f, 0.555570f }, + { -0.256938f, 0.790775f, 0.555570f }, + { -0.488726f, 0.672673f, 0.555570f }, + { -0.672673f, 0.488726f, 0.555570f }, + { -0.790775f, 0.256938f, 0.555570f }, + { -0.831470f, -0.000000f, 0.555570f }, + { -0.790775f, -0.256938f, 0.555570f }, + { -0.672673f, -0.488726f, 0.555570f }, + { -0.488725f, -0.672673f, 0.555570f }, + { -0.256938f, -0.790775f, 0.555570f }, + { 0.000000f, -0.831470f, 0.555570f }, + { 0.256938f, -0.790775f, 0.555570f }, + { 0.488725f, -0.672673f, 0.555570f }, + { 0.672673f, -0.488726f, 0.555570f }, + { 0.790775f, -0.256938f, 0.555570f }, + { 0.707107f, 0.000000f, 0.707107f }, + { 0.653281f, 0.270598f, 0.707107f }, + { 0.500000f, 0.500000f, 0.707107f }, + { 0.270598f, 0.653281f, 0.707107f }, + { -0.000000f, 0.707107f, 0.707107f }, + { -0.270598f, 0.653282f, 0.707107f }, + { -0.500000f, 0.500000f, 0.707107f }, + { -0.653281f, 0.270598f, 0.707107f }, + { -0.707107f, -0.000000f, 0.707107f }, + { -0.653281f, -0.270598f, 0.707107f }, + { -0.500000f, -0.500000f, 0.707107f }, + { -0.270598f, -0.653281f, 0.707107f }, + { 0.000000f, -0.707107f, 0.707107f }, + { 0.270598f, -0.653281f, 0.707107f }, + { 0.500000f, -0.500000f, 0.707107f }, + { 0.653282f, -0.270598f, 0.707107f }, + { 0.555570f, 0.000000f, 0.831470f }, + { 0.481138f, 0.277785f, 0.831470f }, + { 0.277785f, 0.481138f, 0.831470f }, + { -0.000000f, 0.555570f, 0.831470f }, + { -0.277785f, 0.481138f, 0.831470f }, + { -0.481138f, 0.277785f, 0.831470f }, + { -0.555570f, -0.000000f, 0.831470f }, + { -0.481138f, -0.277785f, 0.831470f }, + { -0.277785f, -0.481138f, 0.831470f }, + { 0.000000f, -0.555570f, 0.831470f }, + { 0.277785f, -0.481138f, 0.831470f }, + { 0.481138f, -0.277785f, 0.831470f }, + { 0.382683f, 0.000000f, 0.923880f }, + { 0.270598f, 0.270598f, 0.923880f }, + { -0.000000f, 0.382683f, 0.923880f }, + { -0.270598f, 0.270598f, 0.923880f }, + { -0.382683f, -0.000000f, 0.923880f }, + { -0.270598f, -0.270598f, 0.923880f }, + { 0.000000f, -0.382683f, 0.923880f }, + { 0.270598f, -0.270598f, 0.923880f }, + { 0.195090f, 0.000000f, 0.980785f }, + { -0.000000f, 0.195090f, 0.980785f }, + { -0.195090f, -0.000000f, 0.980785f }, + { 0.000000f, -0.195090f, 0.980785f } +}; + +#endif // !! MDC_NORMAL_TABLE_INCLUDED \ No newline at end of file diff --git a/code/MDLLoader.cpp b/code/MDLLoader.cpp index fdf779abf..d68136147 100644 --- a/code/MDLLoader.cpp +++ b/code/MDLLoader.cpp @@ -47,6 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "MDLDefaultColorMap.h" #include "MD2FileData.h" #include "qnan.h" +#include "ByteSwap.h" // public ASSIMP headers #include "../include/DefaultLogger.h" @@ -62,8 +63,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; -extern float g_avNormals[162][3]; - // ------------------------------------------------------------------------------------------------ // macros used by the MDL7 loader @@ -81,7 +80,6 @@ extern float g_avNormals[162][3]; _AI_MDL7_ACCESS(_data,_index,_limit,MDL::Vertex_MDL7) #endif - // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer MDLImporter::MDLImporter() @@ -116,36 +114,34 @@ bool MDLImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler) const return true; } // ------------------------------------------------------------------------------------------------ +// Setup configuration properties +void MDLImporter::SetupProperties(const Importer* pImp) +{ + // The AI_CONFIG_IMPORT_MDL_KEYFRAME option overrides the + // AI_CONFIG_IMPORT_GLOBAL_KEYFRAME option. + if(0xffffffff == (this->configFrameID = pImp->GetProperty( + AI_CONFIG_IMPORT_MDL_KEYFRAME,0xffffffff))) + { + this->configFrameID = pImp->GetProperty(AI_CONFIG_IMPORT_GLOBAL_KEYFRAME,0); + } +} +// ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. -void MDLImporter::InternReadFile( - const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) +void MDLImporter::InternReadFile( const std::string& pFile, + aiScene* pScene, IOSystem* pIOHandler) { boost::scoped_ptr file( pIOHandler->Open( pFile)); // Check whether we can read from the file if( file.get() == NULL) - { throw new ImportErrorException( "Failed to open MDL file " + pFile + "."); - } - // The AI_CONFIG_IMPORT_MDL_KEYFRAME option overrides the - // AI_CONFIG_IMPORT_GLOBAL_KEYFRAME option. -#if 0 - if(0xffffffff == (this->configFrameID = this->mImporter->GetProperty( - AI_CONFIG_IMPORT_MDL_KEYFRAME,0xffffffff))) - { - this->configFrameID = this->mImporter->GetProperty( - AI_CONFIG_IMPORT_GLOBAL_KEYFRAME,0); - } -#endif // this should work for all other types of MDL files, too ... // the quake header is one of the smallest, afaik this->iFileSize = (unsigned int)file->FileSize(); if( this->iFileSize < sizeof(MDL::Header)) - { throw new ImportErrorException( "MDL File is too small."); - } // allocate storage and copy the contents of the file to a memory buffer this->pScene = pScene; @@ -162,89 +158,93 @@ void MDLImporter::InternReadFile( // determine the file subtype and call the appropriate member function try { - // Original Quake1 format - if (AI_MDL_MAGIC_NUMBER_BE == iMagicWord || - AI_MDL_MAGIC_NUMBER_LE == iMagicWord) - { - DefaultLogger::get()->debug("MDL subtype: Quake 1, magic word is IDPO"); - this->iGSFileVersion = 0; - this->InternReadFile_Quake1(); - } - // GameStudio A MDL2 format - used by some test models that come with 3DGS - else if (AI_MDL_MAGIC_NUMBER_BE_GS3 == iMagicWord || - AI_MDL_MAGIC_NUMBER_LE_GS3 == iMagicWord) - { - DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A2, magic word is MDL2"); - this->iGSFileVersion = 2; - this->InternReadFile_Quake1(); - } - // GameStudio A4 MDL3 format - else if (AI_MDL_MAGIC_NUMBER_BE_GS4 == iMagicWord || - AI_MDL_MAGIC_NUMBER_LE_GS4 == iMagicWord) - { - DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A4, magic word is MDL3"); - this->iGSFileVersion = 3; - this->InternReadFile_3DGS_MDL345(); - } - // GameStudio A5+ MDL4 format - else if (AI_MDL_MAGIC_NUMBER_BE_GS5a == iMagicWord || - AI_MDL_MAGIC_NUMBER_LE_GS5a == iMagicWord) - { - DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A4, magic word is MDL4"); - this->iGSFileVersion = 4; - this->InternReadFile_3DGS_MDL345(); - } - // GameStudio A5+ MDL5 format - else if (AI_MDL_MAGIC_NUMBER_BE_GS5b == iMagicWord || - AI_MDL_MAGIC_NUMBER_LE_GS5b == iMagicWord) - { - DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A5, magic word is MDL5"); - this->iGSFileVersion = 5; - this->InternReadFile_3DGS_MDL345(); - } - // GameStudio A6+ MDL6 format (not sure whether it is really existing ... ) - else if (AI_MDL_MAGIC_NUMBER_BE_GS6 == iMagicWord || - AI_MDL_MAGIC_NUMBER_LE_GS6 == iMagicWord) - { - DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A6, magic word is MDL6"); - this->iGSFileVersion = 6; - this->InternReadFile_3DGS_MDL345(); - } - // GameStudio A7 MDL7 format - else if (AI_MDL_MAGIC_NUMBER_BE_GS7 == iMagicWord || - AI_MDL_MAGIC_NUMBER_LE_GS7 == iMagicWord) - { - DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A7, magic word is MDL7"); - this->iGSFileVersion = 7; - this->InternReadFile_3DGS_MDL7(); - } - // IDST/IDSQ Format (CS:S/HL², etc ...) - else if (AI_MDL_MAGIC_NUMBER_BE_HL2a == iMagicWord || - AI_MDL_MAGIC_NUMBER_LE_HL2a == iMagicWord || - AI_MDL_MAGIC_NUMBER_BE_HL2b == iMagicWord || - AI_MDL_MAGIC_NUMBER_LE_HL2b == iMagicWord) - { - DefaultLogger::get()->debug("MDL subtype: CS:S\\HL², magic word is IDST/IDSQ"); - this->iGSFileVersion = 0; - this->InternReadFile_HL2(); - } - else - { - // print the magic word to the logger - char szBuffer[5]; - szBuffer[0] = ((char*)&iMagicWord)[0]; - szBuffer[1] = ((char*)&iMagicWord)[1]; - szBuffer[2] = ((char*)&iMagicWord)[2]; - szBuffer[3] = ((char*)&iMagicWord)[3]; - szBuffer[4] = '\0'; + // Original Quake1 format + if (AI_MDL_MAGIC_NUMBER_BE == iMagicWord || + AI_MDL_MAGIC_NUMBER_LE == iMagicWord) + { + DefaultLogger::get()->debug("MDL subtype: Quake 1, magic word is IDPO"); + this->iGSFileVersion = 0; + this->InternReadFile_Quake1(); + } + // GameStudio A MDL2 format - used by some test models that come with 3DGS + else if (AI_MDL_MAGIC_NUMBER_BE_GS3 == iMagicWord || + AI_MDL_MAGIC_NUMBER_LE_GS3 == iMagicWord) + { + DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A2, magic word is MDL2"); + this->iGSFileVersion = 2; + this->InternReadFile_Quake1(); + } + // GameStudio A4 MDL3 format + else if (AI_MDL_MAGIC_NUMBER_BE_GS4 == iMagicWord || + AI_MDL_MAGIC_NUMBER_LE_GS4 == iMagicWord) + { + DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A4, magic word is MDL3"); + this->iGSFileVersion = 3; + this->InternReadFile_3DGS_MDL345(); + } + // GameStudio A5+ MDL4 format + else if (AI_MDL_MAGIC_NUMBER_BE_GS5a == iMagicWord || + AI_MDL_MAGIC_NUMBER_LE_GS5a == iMagicWord) + { + DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A4, magic word is MDL4"); + this->iGSFileVersion = 4; + this->InternReadFile_3DGS_MDL345(); + } + // GameStudio A5+ MDL5 format + else if (AI_MDL_MAGIC_NUMBER_BE_GS5b == iMagicWord || + AI_MDL_MAGIC_NUMBER_LE_GS5b == iMagicWord) + { + DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A5, magic word is MDL5"); + this->iGSFileVersion = 5; + this->InternReadFile_3DGS_MDL345(); + } + // GameStudio A6+ MDL6 format (not sure whether it is really existing ... ) + else if (AI_MDL_MAGIC_NUMBER_BE_GS6 == iMagicWord || + AI_MDL_MAGIC_NUMBER_LE_GS6 == iMagicWord) + { + DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A6, magic word is MDL6"); + this->iGSFileVersion = 6; + this->InternReadFile_3DGS_MDL345(); + } + // GameStudio A7 MDL7 format + else if (AI_MDL_MAGIC_NUMBER_BE_GS7 == iMagicWord || + AI_MDL_MAGIC_NUMBER_LE_GS7 == iMagicWord) + { + DefaultLogger::get()->debug("MDL subtype: 3D GameStudio A7, magic word is MDL7"); + this->iGSFileVersion = 7; + this->InternReadFile_3DGS_MDL7(); + } + // IDST/IDSQ Format (CS:S/HL², etc ...) + else if (AI_MDL_MAGIC_NUMBER_BE_HL2a == iMagicWord || + AI_MDL_MAGIC_NUMBER_LE_HL2a == iMagicWord || + AI_MDL_MAGIC_NUMBER_BE_HL2b == iMagicWord || + AI_MDL_MAGIC_NUMBER_LE_HL2b == iMagicWord) + { + DefaultLogger::get()->debug("MDL subtype: CS:S\\HL², magic word is IDST/IDSQ"); + this->iGSFileVersion = 0; + this->InternReadFile_HL2(); + } + else + { + // print the magic word to the logger + char szBuffer[5]; + szBuffer[0] = ((char*)&iMagicWord)[0]; + szBuffer[1] = ((char*)&iMagicWord)[1]; + szBuffer[2] = ((char*)&iMagicWord)[2]; + szBuffer[3] = ((char*)&iMagicWord)[3]; + szBuffer[4] = '\0'; - // we're definitely unable to load this file - throw new ImportErrorException( "Unknown MDL subformat " + pFile + - ". Magic word (" + szBuffer + ") is not known"); - } + // we're definitely unable to load this file + throw new ImportErrorException( "Unknown MDL subformat " + pFile + + ". Magic word (" + szBuffer + ") is not known"); + } - } catch (ImportErrorException* ex) { + } + catch (ImportErrorException* ex) { delete[] this->mBuffer; + AI_DEBUG_INVALIDATE_PTR(this->mBuffer); + AI_DEBUG_INVALIDATE_PTR(this->pIOHandler); + AI_DEBUG_INVALIDATE_PTR(this->pScene); throw ex; } @@ -253,7 +253,6 @@ void MDLImporter::InternReadFile( AI_DEBUG_INVALIDATE_PTR(this->mBuffer); AI_DEBUG_INVALIDATE_PTR(this->pIOHandler); AI_DEBUG_INVALIDATE_PTR(this->pScene); - return; } // ------------------------------------------------------------------------------------------------ void MDLImporter::SizeCheck(const void* szPos) @@ -279,12 +278,7 @@ void MDLImporter::SizeCheck(const void* szPos, const char* szFile, unsigned int if (szFilePtr)++szFilePtr; char szBuffer[1024]; -#if _MSC_VER >= 1400 - ::sprintf_s(szBuffer, -#else - ::sprintf(szBuffer, -#endif - "Invalid MDL file. The file is too small " + ::sprintf(szBuffer,"Invalid MDL file. The file is too small " "or contains invalid data (File: %s Line: %i)",szFilePtr,iLine); throw new ImportErrorException(szBuffer); @@ -295,56 +289,67 @@ void MDLImporter::ValidateHeader_Quake1(const MDL::Header* pcHeader) { // some values may not be NULL if (!pcHeader->num_frames) - { throw new ImportErrorException( "[Quake 1 MDL] There are no frames in the file"); - } + if (!pcHeader->num_verts) - { throw new ImportErrorException( "[Quake 1 MDL] There are no vertices in the file"); - } + if (!pcHeader->num_tris) - { throw new ImportErrorException( "[Quake 1 MDL] There are no triangles in the file"); - } // check whether the maxima are exceeded ...however, this applies for Quake 1 MDLs only if (!this->iGSFileVersion) { if (pcHeader->num_verts > AI_MDL_MAX_VERTS) - { DefaultLogger::get()->warn("Quake 1 MDL model has more than AI_MDL_MAX_VERTS vertices"); - } + if (pcHeader->num_tris > AI_MDL_MAX_TRIANGLES) - { DefaultLogger::get()->warn("Quake 1 MDL model has more than AI_MDL_MAX_TRIANGLES triangles"); - } + if (pcHeader->num_frames > AI_MDL_MAX_FRAMES) - { DefaultLogger::get()->warn("Quake 1 MDL model has more than AI_MDL_MAX_FRAMES frames"); - } + // (this does not apply for 3DGS MDLs) if (!this->iGSFileVersion && pcHeader->version != AI_MDL_VERSION) - { DefaultLogger::get()->warn("Quake 1 MDL model has an unknown version: AI_MDL_VERSION (=6) is " "the expected file format version"); - } - - if (pcHeader->num_skins) - { - if(!pcHeader->skinwidth || !pcHeader->skinheight) - { - DefaultLogger::get()->warn("Skin width or height are 0. Division through " - "zero would occur ..."); - } - } + if(pcHeader->num_skins && (!pcHeader->skinwidth || !pcHeader->skinheight)) + DefaultLogger::get()->warn("Skin width or height are 0"); } } +#ifdef AI_BUILD_BIG_ENDIAN +// ------------------------------------------------------------------------------------------------ +void FlipQuakeHeader(BE_NCONST MDL::Header* pcHeader) +{ + ByteSwap::Swap4(& pcHeader->ident); + ByteSwap::Swap4(& pcHeader->version); + ByteSwap::Swap4(& pcHeader->boundingradius); + ByteSwap::Swap4(& pcHeader->flags); + ByteSwap::Swap4(& pcHeader->num_frames); + ByteSwap::Swap4(& pcHeader->num_skins); + ByteSwap::Swap4(& pcHeader->num_tris); + ByteSwap::Swap4(& pcHeader->num_verts); + for (unsigned int i = 0; i < 3;++i) + { + ByteSwap::Swap4(& pcHeader->scale[i]); + ByteSwap::Swap4(& pcHeader->translate[i]); + } + ByteSwap::Swap4(& pcHeader->size); + ByteSwap::Swap4(& pcHeader->skinheight); + ByteSwap::Swap4(& pcHeader->skin); +} +#endif // ------------------------------------------------------------------------------------------------ void MDLImporter::InternReadFile_Quake1( ) { ai_assert(NULL != pScene); - const MDL::Header* pcHeader = (const MDL::Header*)this->mBuffer; + BE_NCONST MDL::Header* pcHeader = (BE_NCONST MDL::Header*)this->mBuffer; + +#ifdef AI_BUILD_BIG_ENDIAN + FlipQuakeHeader(pcHeader); +#endif + ValidateHeader_Quake1(pcHeader); // current cursor position in the file @@ -353,13 +358,16 @@ void MDLImporter::InternReadFile_Quake1( ) // need to read all textures for (unsigned int i = 0; i < (unsigned int)pcHeader->num_skins;++i) { - union{const MDL::Skin* pcSkin;const MDL::GroupSkin* pcGroupSkin;}; - pcSkin = (const MDL::Skin*)szCurrent; + union{BE_NCONST MDL::Skin* pcSkin;BE_NCONST MDL::GroupSkin* pcGroupSkin;}; + pcSkin = (BE_NCONST MDL::Skin*)szCurrent; + AI_SWAP4( pcSkin->group ); // Quake 1 groupskins if (1 == pcSkin->group) { + AI_SWAP4( pcGroupSkin->nb ); + // need to skip multiple images const unsigned int iNumImages = (unsigned int)pcGroupSkin->nb; szCurrent += sizeof(uint32_t) * 2; @@ -413,6 +421,25 @@ void MDLImporter::InternReadFile_Quake1( ) VALIDATE_FILE_SIZE((const unsigned char*)(pcVertices + pcHeader->num_verts)); +#ifdef AI_BUILD_BIG_ENDIAN + + for (unsigned int i = 0; inum_verts;++i) + { + AI_SWAP4( pcTexCoords[i].onseam ); + AI_SWAP4( pcTexCoords[i].s ); + AI_SWAP4( pcTexCoords[i].t ); + } + + for (unsigned int i = 0; inum_tris;++i) + { + AI_SWAP4( pcTriangles[i].facesfront); + AI_SWAP4( pcTriangles[i].vertex[0]); + AI_SWAP4( pcTriangles[i].vertex[1]); + AI_SWAP4( pcTriangles[i].vertex[2]); + } + +#endif + // setup materials this->SetupMaterialProperties_3DGS_MDL5_Quake1(); @@ -453,7 +480,6 @@ void MDLImporter::InternReadFile_Quake1( ) if (iIndex >= (unsigned int)pcHeader->num_verts) { iIndex = pcHeader->num_verts-1; - DefaultLogger::get()->warn("Index overflow in Q1-MDL vertex list."); } @@ -461,16 +487,16 @@ void MDLImporter::InternReadFile_Quake1( ) vec.x = (float)pcVertices[iIndex].v[0] * pcHeader->scale[0]; vec.x += pcHeader->translate[0]; - // (flip z and y component) - vec.z = (float)pcVertices[iIndex].v[1] * pcHeader->scale[1]; - vec.z += pcHeader->translate[1]; + vec.y = (float)pcVertices[iIndex].v[1] * pcHeader->scale[1]; + vec.y += pcHeader->translate[1]; + vec.y *= -1.0f; - vec.y = (float)pcVertices[iIndex].v[2] * pcHeader->scale[2]; - vec.y += pcHeader->translate[2]; + vec.z = (float)pcVertices[iIndex].v[2] * pcHeader->scale[2]; + vec.z += pcHeader->translate[2]; // read the normal vector from the precalculated normal table MD2::LookupNormalIndex(pcVertices[iIndex].normalIndex,pcMesh->mNormals[iCurrent]); - std::swap ( pcMesh->mNormals[iCurrent].y,pcMesh->mNormals[iCurrent].z ); + pcMesh->mNormals[iCurrent].y *= -1.0f; // read texture coordinates float s = (float)pcTexCoords[iIndex].s; @@ -546,6 +572,9 @@ void MDLImporter::InternReadFile_3DGS_MDL345( ) // the header of MDL 3/4/5 is nearly identical to the original Quake1 header const MDL::Header* pcHeader = (const MDL::Header*)this->mBuffer; +#ifdef AI_BUILD_BIG_ENDIAN + FlipQuakeHeader(pcHeader); +#endif this->ValidateHeader_Quake1(pcHeader); // current cursor position in the file @@ -584,6 +613,26 @@ void MDLImporter::InternReadFile_3DGS_MDL345( ) const MDL::Triangle_MDL3* pcTriangles = (const MDL::Triangle_MDL3*)szCurrent; szCurrent += sizeof(MDL::Triangle_MDL3) * pcHeader->num_tris; +#ifdef AI_BUILD_BIG_ENDIAN + + for (unsigned int i = 0; isynctype;++i) + { + AI_SWAP2( pcTexCoords[i].u ); + AI_SWAP2( pcTexCoords[i].v ); + } + + for (unsigned int i = 0; inum_tris;++i) + { + AI_SWAP4( pcTriangles[i].index_xyz[0]); + AI_SWAP4( pcTriangles[i].index_xyz[1]); + AI_SWAP4( pcTriangles[i].index_xyz[2]); + AI_SWAP4( pcTriangles[i].index_uv[0]); + AI_SWAP4( pcTriangles[i].index_uv[1]); + AI_SWAP4( pcTriangles[i].index_uv[2]); + } + +#endif + VALIDATE_FILE_SIZE(szCurrent); // setup materials @@ -620,15 +669,15 @@ void MDLImporter::InternReadFile_3DGS_MDL345( ) const MDL::Frame* pcFrames = (const MDL::Frame*)szCurrent; // byte packed vertices + // BIG TODO: these two snippets are nearly totally identical ... // *********************************************************************** if (0 == pcFrames->type || 3 >= this->iGSFileVersion) { - const MDL::SimpleFrame* pcFirstFrame = - (const MDL::SimpleFrame*)(szCurrent + sizeof(uint32_t)); + const MDL::SimpleFrame* pcFirstFrame = (const MDL::SimpleFrame*)(szCurrent + sizeof(uint32_t)); // get a pointer to the vertices - const MDL::Vertex* pcVertices = (const MDL::Vertex*) ( - (pcFirstFrame->name) + sizeof(pcFirstFrame->name)); + const MDL::Vertex* pcVertices = (const MDL::Vertex*) ((pcFirstFrame->name) + + sizeof(pcFirstFrame->name)); VALIDATE_FILE_SIZE(pcVertices + pcHeader->num_verts); @@ -654,16 +703,16 @@ void MDLImporter::InternReadFile_3DGS_MDL345( ) vec.x = (float)pcVertices[iIndex].v[0] * pcHeader->scale[0]; vec.x += pcHeader->translate[0]; - // (flip z and y component) - vec.z = (float)pcVertices[iIndex].v[1] * pcHeader->scale[1]; - vec.z += pcHeader->translate[1]; + vec.y = (float)pcVertices[iIndex].v[1] * pcHeader->scale[1]; + vec.y += pcHeader->translate[1]; + vec.y *= -1.0f; - vec.y = (float)pcVertices[iIndex].v[2] * pcHeader->scale[2]; - vec.y += pcHeader->translate[2]; + vec.z = (float)pcVertices[iIndex].v[2] * pcHeader->scale[2]; + vec.z += pcHeader->translate[2]; // read the normal vector from the precalculated normal table MD2::LookupNormalIndex(pcVertices[iIndex].normalIndex,pcMesh->mNormals[iCurrent]); - std::swap ( pcMesh->mNormals[iCurrent].y,pcMesh->mNormals[iCurrent].z ); + pcMesh->mNormals[iCurrent].y *= -1.0f; // read texture coordinates if (pcHeader->synctype) @@ -684,12 +733,11 @@ void MDLImporter::InternReadFile_3DGS_MDL345( ) else { // now get a pointer to the first frame in the file - const MDL::SimpleFrame_MDLn_SP* pcFirstFrame = - (const MDL::SimpleFrame_MDLn_SP*) (szCurrent + sizeof(uint32_t)); + const MDL::SimpleFrame_MDLn_SP* pcFirstFrame = (const MDL::SimpleFrame_MDLn_SP*) (szCurrent + sizeof(uint32_t)); // get a pointer to the vertices - const MDL::Vertex_MDL4* pcVertices = (const MDL::Vertex_MDL4*) - ((pcFirstFrame->name) + sizeof(pcFirstFrame->name)); + const MDL::Vertex_MDL4* pcVertices = (const MDL::Vertex_MDL4*) ((pcFirstFrame->name) + + sizeof(pcFirstFrame->name)); VALIDATE_FILE_SIZE(pcVertices + pcHeader->num_verts); @@ -715,16 +763,16 @@ void MDLImporter::InternReadFile_3DGS_MDL345( ) vec.x = (float)pcVertices[iIndex].v[0] * pcHeader->scale[0]; vec.x += pcHeader->translate[0]; - // (flip z and y component) - vec.z = (float)pcVertices[iIndex].v[1] * pcHeader->scale[1]; - vec.z += pcHeader->translate[1]; + vec.y = (float)pcVertices[iIndex].v[1] * pcHeader->scale[1]; + vec.y += pcHeader->translate[1]; + vec.y *= -1.0f; - vec.y = (float)pcVertices[iIndex].v[2] * pcHeader->scale[2]; - vec.y += pcHeader->translate[2]; + vec.z = (float)pcVertices[iIndex].v[2] * pcHeader->scale[2]; + vec.z += pcHeader->translate[2]; // read the normal vector from the precalculated normal table MD2::LookupNormalIndex(pcVertices[iIndex].normalIndex,pcMesh->mNormals[iCurrent]); - std::swap ( pcMesh->mNormals[iCurrent].y,pcMesh->mNormals[iCurrent].z ); + pcMesh->mNormals[iCurrent].y *= -1.0f; // read texture coordinates if (pcHeader->synctype) @@ -920,14 +968,9 @@ void MDLImporter::CalcAbsBoneMatrices_3DGS_MDL7(const MDL::Bone_MDL7* pcBones, if (AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_NOT_THERE == pcHeader->bone_stc_size) { - // no real name for our poor bone :-( -# if (_MSC_VER >= 1400) - pcOutBone->mName.length = ::sprintf_s(pcOutBone->mName.data, - MAXLEN,"UnnamedBone_%i",iBone); -# else - pcOutBone->mName.length = ::sprintf(pcOutBone->mName.data, - "UnnamedBone_%i",iBone); -# endif + // no real name for our poor bone is specified :-( + pcOutBone->mName.length = ::sprintf(pcOutBone->mName.data, + "UnnamedBone_%i",iBone); } else { @@ -1012,17 +1055,15 @@ void MDLImporter::ReadFaces_3DGS_MDL7( // write the output face index groupData.pcFaces[iTriangle].mIndices[2-c] = iOutIndex; - // swap z and y axis aiVector3D& vPosition = groupData.vPositions[ iOutIndex ]; vPosition.x = _AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size) .x; - vPosition.z = _AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size) .y; - vPosition.y = _AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size) .z; + vPosition.y = -1.0f*_AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size) .y; + vPosition.z = _AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size) .z; // if we have bones, save the index if (!groupData.aiBones.empty()) - { - groupData.aiBones[iOutIndex] = _AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size).vertindex; - } + groupData.aiBones[iOutIndex] = _AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts, + iIndex,pcHeader->mainvertex_stc_size).vertindex; // now read the normal vector if (AI_MDL7_FRAMEVERTEX030305_STCSIZE <= pcHeader->mainvertex_stc_size) @@ -1030,8 +1071,8 @@ void MDLImporter::ReadFaces_3DGS_MDL7( // read the full normal vector aiVector3D& vNormal = groupData.vNormals[ iOutIndex ]; vNormal.x = _AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size) .norm[0]; - vNormal.z = _AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size) .norm[1]; - vNormal.y = _AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size) .norm[2]; + vNormal.y = -1.0f*_AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size) .norm[1]; + vNormal.z = _AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex,pcHeader->mainvertex_stc_size) .norm[2]; } else if (AI_MDL7_FRAMEVERTEX120503_STCSIZE <= pcHeader->mainvertex_stc_size) { @@ -1039,8 +1080,7 @@ void MDLImporter::ReadFaces_3DGS_MDL7( aiVector3D& vNormal = groupData.vNormals[ iOutIndex ]; MD2::LookupNormalIndex(_AI_MDL7_ACCESS_VERT(groupInfo.pcGroupVerts,iIndex, pcHeader->mainvertex_stc_size) .norm162index,vNormal); - - std::swap(groupData.vNormals[iOutIndex].z,groupData.vNormals[iOutIndex].y); + vNormal.y *= -1.0f; } // validate and process the first uv coordinate set // ************************************************************* @@ -1063,9 +1103,7 @@ void MDLImporter::ReadFaces_3DGS_MDL7( } // assign the material index, but only if it is existing if (pcHeader->triangle_stc_size >= AI_MDL7_TRIANGLE_STD_SIZE_ONE_UV_WITH_MATINDEX) - { groupData.pcFaces[iTriangle].iMatIndex[0] = pcGroupTris->skinsets[0].material; - } } // validate and process the second uv coordinate set // ************************************************************* @@ -1090,14 +1128,11 @@ void MDLImporter::ReadFaces_3DGS_MDL7( // coordinate set ... wastes memory and loading time if (0 != iIndex && (u != groupData.vTextureCoords1[ iOutIndex ].x || v != groupData.vTextureCoords1[ iOutIndex ].y ) ) - { groupData.bNeed2UV = true; - } + // if the material differs, we need a second skin, too if (pcGroupTris->skinsets[ 1 ].material != pcGroupTris->skinsets[ 0 ].material) - { groupData.bNeed2UV = true; - } } // assign the material index groupData.pcFaces[ iTriangle ].iMatIndex[ 1 ] = pcGroupTris->skinsets[ 1 ].material; @@ -1144,9 +1179,7 @@ bool MDLImporter::ProcessFrames_3DGS_MDL7(const MDL::IntGroupInfo_MDL7& groupInf // our output frame? if (configFrameID == iFrame) { - const MDL::Vertex_MDL7* pcFrameVertices = (const MDL::Vertex_MDL7*) - (szCurrent + pcHeader->framevertex_stc_size); - + const MDL::Vertex_MDL7* pcFrameVertices = (const MDL::Vertex_MDL7*)(szCurrent+pcHeader->frame_stc_size); for (unsigned int qq = 0; qq < frame.pcFrame->vertices_count;++qq) { // I assume this are simple replacements for normal @@ -1157,37 +1190,33 @@ bool MDLImporter::ProcessFrames_3DGS_MDL7(const MDL::IntGroupInfo_MDL7& groupInf if (iIndex >= groupInfo.pcGroup->numverts) { - DefaultLogger::get()->warn("Invalid vertex index in frame vertex section. " - "Skipping this frame vertex"); + DefaultLogger::get()->warn("Invalid vertex index in frame vertex section"); continue; } aiVector3D vPosition,vNormal; vPosition.x = _AI_MDL7_ACCESS_VERT(pcFrameVertices,qq,pcHeader->framevertex_stc_size) .x; - vPosition.z = _AI_MDL7_ACCESS_VERT(pcFrameVertices,qq,pcHeader->framevertex_stc_size) .y; - vPosition.y = _AI_MDL7_ACCESS_VERT(pcFrameVertices,qq,pcHeader->framevertex_stc_size) .z; + vPosition.y = -1.0f*_AI_MDL7_ACCESS_VERT(pcFrameVertices,qq,pcHeader->framevertex_stc_size) .y; + vPosition.z = _AI_MDL7_ACCESS_VERT(pcFrameVertices,qq,pcHeader->framevertex_stc_size) .z; // now read the normal vector if (AI_MDL7_FRAMEVERTEX030305_STCSIZE <= pcHeader->mainvertex_stc_size) { // read the full normal vector vNormal.x = _AI_MDL7_ACCESS_VERT(pcFrameVertices,qq,pcHeader->framevertex_stc_size) .norm[0]; - vNormal.z = _AI_MDL7_ACCESS_VERT(pcFrameVertices,qq,pcHeader->framevertex_stc_size) .norm[1]; - vNormal.y = _AI_MDL7_ACCESS_VERT(pcFrameVertices,qq,pcHeader->framevertex_stc_size) .norm[2]; + vNormal.y = -1.0f* _AI_MDL7_ACCESS_VERT(pcFrameVertices,qq,pcHeader->framevertex_stc_size) .norm[1]; + vNormal.z = _AI_MDL7_ACCESS_VERT(pcFrameVertices,qq,pcHeader->framevertex_stc_size) .norm[2]; } else if (AI_MDL7_FRAMEVERTEX120503_STCSIZE <= pcHeader->mainvertex_stc_size) { // read the normal vector from Quake2's smart table MD2::LookupNormalIndex(_AI_MDL7_ACCESS_VERT(pcFrameVertices,qq, pcHeader->framevertex_stc_size) .norm162index,vNormal); - - std::swap(vNormal.z,vNormal.y); + vNormal.y *= -1.0f; } // FIXME: O(n^2) at the moment ... - // shouldn't be too worse, frame vertices aren't required more - // than once a century ... const MDL::Triangle_MDL7* pcGroupTris = groupInfo.pcGroupTris; unsigned int iOutIndex = 0; for (unsigned int iTriangle = 0; iTriangle < (unsigned int)groupInfo.pcGroup->numtris; ++iTriangle) @@ -1204,16 +1233,13 @@ bool MDLImporter::ProcessFrames_3DGS_MDL7(const MDL::IntGroupInfo_MDL7& groupInf } } // get the next triangle in the list - pcGroupTris = (const MDL::Triangle_MDL7*)((const char*)pcGroupTris + - pcHeader->triangle_stc_size); + pcGroupTris = (const MDL::Triangle_MDL7*)((const char*) + pcGroupTris + pcHeader->triangle_stc_size); } } } // parse bone trafo matrix keys (only if there are bones ...) - if (shared.apcOutBones) - { - this->ParseBoneTrafoKeys_3DGS_MDL7(groupInfo,frame,shared); - } + if (shared.apcOutBones)this->ParseBoneTrafoKeys_3DGS_MDL7(groupInfo,frame,shared); szCurrent += iAdd; } *szCurrentOut = szCurrent; @@ -1371,7 +1397,6 @@ void MDLImporter::InternReadFile_3DGS_MDL7( ) // load all bones (they are shared by all groups, so // we'll need to add them to all groups/meshes later) // apcBonesOut is a list of all bones or NULL if they could not been loaded - // TODO (aramis): Make apcBonesOut an MDL::IntBone_MDL7* szCurrent += pcHeader->bones_num * pcHeader->bone_stc_size; sharedData.apcOutBones = this->LoadBones_3DGS_MDL7(); @@ -1493,19 +1518,13 @@ void MDLImporter::InternReadFile_3DGS_MDL7( ) if (!splittedGroupData.aiSplit[qq]->empty()) sharedData.abNeedMaterials[qq] = true; } - - // now generate output meshes - this->GenerateOutputMeshes_3DGS_MDL7(groupData, - splittedGroupData); } else DefaultLogger::get()->warn("[3DGS MDL7] Mesh group consists of 0 " "vertices or faces. It will be skipped."); - // process all frames - if(!ProcessFrames_3DGS_MDL7(groupInfo,groupData, sharedData,szCurrent,&szCurrent)) - { - break; - } + // process all frames and generate output meshes + this->ProcessFrames_3DGS_MDL7(groupInfo,groupData, sharedData,szCurrent,&szCurrent); + this->GenerateOutputMeshes_3DGS_MDL7(groupData,splittedGroupData); } // generate a nodegraph and subnodes for each group @@ -1545,16 +1564,9 @@ void MDLImporter::InternReadFile_3DGS_MDL7( ) // setup the name of the node char* const szBuffer = &aszGroupNameBuffer[i*AI_MDL7_MAX_GROUPNAMESIZE]; - if ('\0' == *szBuffer) - { -#if _MSC_VER >= 1400 - ::sprintf_s(szBuffer,AI_MDL7_MAX_GROUPNAMESIZE,"Group_%i",p); -#else - ::sprintf(szBuffer,"Group_%i",p); -#endif - } + if ('\0' == *szBuffer)pcNode->mName.length = ::sprintf(szBuffer,"Group_%i",p); + else pcNode->mName.length = ::strlen(szBuffer); ::strcpy(pcNode->mName.data,szBuffer); - pcNode->mName.length = ::strlen(szBuffer); ++p; } } @@ -1566,10 +1578,9 @@ void MDLImporter::InternReadFile_3DGS_MDL7( ) this->pScene->mRootNode = pcOldRoot->mChildren[0]; pcOldRoot->mChildren[0] = NULL; delete pcOldRoot; - this->pScene->mRootNode->mParent = NULL; } - else this->pScene->mRootNode->mName.Set("mesh_root"); + else this->pScene->mRootNode->mName.Set(""); delete[] avOutList; delete[] aszGroupNameBuffer; @@ -1578,8 +1589,6 @@ void MDLImporter::InternReadFile_3DGS_MDL7( ) // build a final material list. this->CopyMaterials_3DGS_MDL7(sharedData); - - // handle materials that are just referencing another material correctly this->HandleMaterialReferences_3DGS_MDL7(); // generate output bone animations and add all bones to the scenegraph @@ -1590,7 +1599,7 @@ void MDLImporter::InternReadFile_3DGS_MDL7( ) aiNode* const pc = this->pScene->mRootNode->mChildren[ this->pScene->mRootNode->mNumChildren-1] = new aiNode(); - pc->mName.Set("skeleton_root"); + pc->mName.Set(""); // add bones to the nodegraph this->AddBonesToNodeGraph_3DGS_MDL7((const Assimp::MDL::IntBone_MDL7 **) @@ -1604,64 +1613,15 @@ void MDLImporter::InternReadFile_3DGS_MDL7( ) // ------------------------------------------------------------------------------------------------ void MDLImporter::CopyMaterials_3DGS_MDL7(MDL::IntSharedData_MDL7 &shared) { - unsigned int iNewNumMaterials = 0; - unsigned int p = 0; - for (;p < shared.pcMats.size();++p) - if (shared.abNeedMaterials[p])++iNewNumMaterials; - - this->pScene->mMaterials = new aiMaterial*[iNewNumMaterials]; - if ((unsigned int)shared.pcMats.size() == iNewNumMaterials) - { - this->pScene->mNumMaterials = (unsigned int)shared.pcMats.size(); - for (unsigned int i = 0; i < this->pScene->mNumMaterials;++i) - this->pScene->mMaterials[i] = shared.pcMats[i]; - } - else - { - p = 0; - const unsigned int iMSB = 0x1u << (sizeof (unsigned int)*8-1); - for (unsigned int i = 0; i < (unsigned int)shared.pcMats.size();++i) - { - if (!shared.abNeedMaterials[i]) - { - // destruction is done by the destructor of sh - delete shared.pcMats[i]; - AI_DEBUG_INVALIDATE_PTR(shared.pcMats[i]); - continue; - } - this->pScene->mMaterials[p] = shared.pcMats[i]; - - if (p != i) - { - // replace the material index and MSB in all material - // indices that have been replaced to make sure they won't be - // replaced again (this won't work if there are more than - // 2^31 materials in the model - but this shouldn't care :-)). - for (unsigned int qq = 0; qq < this->pScene->mNumMeshes;++qq) - { - aiMesh* const pcMesh = this->pScene->mMeshes[qq]; - if (i == pcMesh->mMaterialIndex) - { - pcMesh->mMaterialIndex = p | iMSB; - } - } - } - ++p; - } - this->pScene->mNumMaterials = iNewNumMaterials; - - // Remove the MSB from all material indices - for (unsigned int qq = 0; qq < this->pScene->mNumMeshes;++qq) - { - this->pScene->mMeshes[qq]->mMaterialIndex &= ~iMSB; - } - } + this->pScene->mNumMaterials = (unsigned int)shared.pcMats.size(); + this->pScene->mMaterials = new aiMaterial*[this->pScene->mNumMaterials]; + for (unsigned int i = 0; i < this->pScene->mNumMaterials;++i) + this->pScene->mMaterials[i] = shared.pcMats[i]; } // ------------------------------------------------------------------------------------------------ void MDLImporter::HandleMaterialReferences_3DGS_MDL7() { // search for referrer materials - // (there is no test file but Conitec's docs say it is supported ... :cry: ) for (unsigned int i = 0; i < this->pScene->mNumMaterials;++i) { int iIndex = 0; @@ -1672,9 +1632,7 @@ void MDLImporter::HandleMaterialReferences_3DGS_MDL7() { aiMesh* const pcMesh = this->pScene->mMeshes[a]; if (i == pcMesh->mMaterialIndex) - { pcMesh->mMaterialIndex = iIndex; - } } // collapse the rest of the array delete this->pScene->mMaterials[i]; @@ -1731,8 +1689,7 @@ void MDLImporter::ParseBoneTrafoKeys_3DGS_MDL7( else { DefaultLogger::get()->warn("Found animation keyframes " - "in a group that is not the first. They will be igored, " - "the format specification says this should not occur"); + "in a group that is not the first. They will be igored"); } } } @@ -1802,7 +1759,7 @@ void MDLImporter::BuildOutputAnims_3DGS_MDL7( aiBoneAnim* const pcBoneAnim = pcAnim->mBones[iCnt++] = new aiBoneAnim(); pcBoneAnim->mBoneName = aiString( intBone->mName ); - // allocate enough storahe for all keys + // allocate enough storage for all keys pcBoneAnim->mNumPositionKeys = (unsigned int)intBone->pkeyPositions.size(); pcBoneAnim->mNumScalingKeys = (unsigned int)intBone->pkeyPositions.size(); pcBoneAnim->mNumRotationKeys = (unsigned int)intBone->pkeyPositions.size(); diff --git a/code/MDLLoader.h b/code/MDLLoader.h index e528f9e87..b62e467ba 100644 --- a/code/MDLLoader.h +++ b/code/MDLLoader.h @@ -87,6 +87,14 @@ public: * See BaseImporter::CanRead() for details. */ bool CanRead( const std::string& pFile, IOSystem* pIOHandler) const; + + // ------------------------------------------------------------------- + /** Called prior to ReadFile(). + * The function is a request to the importer to update its configuration + * basing on the Importer's configuration property list. + */ + void SetupProperties(const Importer* pImp); + protected: diff --git a/code/RemoveRedundantMaterials.cpp b/code/RemoveRedundantMaterials.cpp index eb2d1617a..86ab7ff7a 100644 --- a/code/RemoveRedundantMaterials.cpp +++ b/code/RemoveRedundantMaterials.cpp @@ -88,6 +88,10 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) unsigned int* aiMappingTable = new unsigned int[pScene->mNumMaterials]; unsigned int iNewNum = 0; + std::vector abReferenced(pScene->mNumMaterials,false); + for (unsigned int i = 0;i < pScene->mNumMeshes;++i) + abReferenced[pScene->mMeshes[i]->mMaterialIndex] = true; + // iterate through all materials and calculate a hash for them // store all hashes in a list and so a quick search whether // we do already have a specific hash. This allows us to @@ -96,6 +100,9 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) aiHashes = new uint32_t[pScene->mNumMaterials]; for (unsigned int i = 0; i < pScene->mNumMaterials;++i) { + // if the material is not referenced ... remove it + if (!abReferenced[i])continue; + uint32_t me = aiHashes[i] = ((MaterialHelper*)pScene->mMaterials[i])->ComputeHash(); for (unsigned int a = 0; a < i;++a) { @@ -120,6 +127,9 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) ::memset(ppcMaterials,0,sizeof(void*)*iNewNum); for (unsigned int p = 0; p < pScene->mNumMaterials;++p) { + // if the material is not referenced ... remove it + if (!abReferenced[p])continue; + // generate new names for all modified materials const unsigned int idx = aiMappingTable[p]; if (ppcMaterials[idx]) diff --git a/code/SplitLargeMeshes.cpp b/code/SplitLargeMeshes.cpp index e58b83bc0..5c83f07af 100644 --- a/code/SplitLargeMeshes.cpp +++ b/code/SplitLargeMeshes.cpp @@ -101,12 +101,8 @@ void SplitLargeMeshesProcess_Triangle::Execute( aiScene* pScene) // Setup properties void SplitLargeMeshesProcess_Triangle::SetupProperties( const Importer* pImp) { - // get the current value of the split property - if(0xcdcdcdcd == (this->LIMIT = pImp->GetProperty( - AI_CONFIG_PP_SLM_TRIANGLE_LIMIT,0xcdcdcdcd))) - { - this->LIMIT = AI_SLM_DEFAULT_MAX_TRIANGLES; - } + // get the current value of the split property + this->LIMIT = pImp->GetProperty(AI_CONFIG_PP_SLM_TRIANGLE_LIMIT,AI_SLM_DEFAULT_MAX_TRIANGLES); } // ------------------------------------------------------------------------------------------------ // Update a node after some meshes have been split @@ -291,15 +287,11 @@ void SplitLargeMeshesProcess_Triangle::SplitMesh( // copy positions if (pMesh->mVertices != NULL) - { pcMesh->mVertices[iIndexOut] = pMesh->mVertices[iIndex]; - } // copy normals if (pMesh->HasNormals()) - { pcMesh->mNormals[iIndexOut] = pMesh->mNormals[iIndex]; - } // copy tangents/bitangents if (pMesh->HasTangentsAndBitangents()) @@ -312,17 +304,13 @@ void SplitLargeMeshesProcess_Triangle::SplitMesh( for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS;++c) { if (pMesh->HasTextureCoords( c)) - { pcMesh->mTextureCoords[c][iIndexOut] = pMesh->mTextureCoords[c][iIndex]; - } } // vertex colors for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_COLOR_SETS;++c) { if (pMesh->HasVertexColors( c)) - { pcMesh->mColors[c][iIndexOut] = pMesh->mColors[c][iIndex]; - } } } } @@ -386,12 +374,7 @@ void SplitLargeMeshesProcess_Vertex::Execute( aiScene* pScene) // Setup properties void SplitLargeMeshesProcess_Vertex::SetupProperties( const Importer* pImp) { - // get the current value of the split property - if(0xcdcdcdcd == (this->LIMIT = pImp->GetProperty( - AI_CONFIG_PP_SLM_VERTEX_LIMIT,0xcdcdcdcd))) - { - this->LIMIT = AI_SLM_DEFAULT_MAX_VERTICES; - } + this->LIMIT = pImp->GetProperty(AI_CONFIG_PP_SLM_VERTEX_LIMIT,AI_SLM_DEFAULT_MAX_VERTICES); } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. @@ -455,9 +438,15 @@ void SplitLargeMeshesProcess_Vertex::SplitMesh( } // clear the temporary helper array - if (0 != iBase) + if (iBase) { - memset(&avWasCopied[0],0xFF,pMesh->mNumVertices * sizeof(unsigned int)); + // we can't use memset here we unsigned int needn' be 32 bits + for (std::vector::iterator + iter = avWasCopied.begin(),end = avWasCopied.end(); + iter != end;++iter) + { + (*iter) = 0xffffffff; + } } // output vectors diff --git a/code/ValidateDataStructure.cpp b/code/ValidateDataStructure.cpp index ba1a5926f..98ccfc924 100644 --- a/code/ValidateDataStructure.cpp +++ b/code/ValidateDataStructure.cpp @@ -710,10 +710,10 @@ __break_out: } if (pBoneAnim->mPositionKeys[i].mTime <= dLast) { - this->ReportError("aiBoneAnim::mPositionKeys[%i].mTime (%.5f) is larger " + this->ReportWarning("aiBoneAnim::mPositionKeys[%i].mTime (%.5f) is smaller " "than aiAnimation::mPositionKeys[%i] (which is %.5f)",i, (float)pBoneAnim->mPositionKeys[i].mTime, - i, (float)dLast); + i-1, (float)dLast); } dLast = pBoneAnim->mPositionKeys[i].mTime; } @@ -738,10 +738,10 @@ __break_out: } if (pBoneAnim->mRotationKeys[i].mTime <= dLast) { - this->ReportError("aiBoneAnim::mRotationKeys[%i].mTime (%.5f) is larger " + this->ReportWarning("aiBoneAnim::mRotationKeys[%i].mTime (%.5f) is smaller " "than aiAnimation::mRotationKeys[%i] (which is %.5f)",i, (float)pBoneAnim->mRotationKeys[i].mTime, - i, (float)dLast); + i-1, (float)dLast); } dLast = pBoneAnim->mRotationKeys[i].mTime; } @@ -766,10 +766,10 @@ __break_out: } if (pBoneAnim->mScalingKeys[i].mTime <= dLast) { - this->ReportError("aiBoneAnim::mScalingKeys[%i].mTime (%.5f) is larger " + this->ReportWarning("aiBoneAnim::mScalingKeys[%i].mTime (%.5f) is smaller " "than aiAnimation::mScalingKeys[%i] (which is %.5f)",i, (float)pBoneAnim->mScalingKeys[i].mTime, - i, (float)dLast); + i-1, (float)dLast); } dLast = pBoneAnim->mScalingKeys[i].mTime; } diff --git a/include/aiConfig.h b/include/aiConfig.h index b82ca2b42..179792479 100644 --- a/include/aiConfig.h +++ b/include/aiConfig.h @@ -105,6 +105,27 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define AI_CONFIG_IMPORT_3DS_IGNORE_PIVOT "imp.3ds.nopivot" +// --------------------------------------------------------------------------- +/** \brief Specifies the maximum angle that may be between two vertex tangents + * that their tangents and bitangents are smoothed. + * + * This applies to the CalcTangentSpace-Step. The angle is specified + * in degrees * 1000, so 180000 is PI. The default value is + * 45 degrees. The maximum value is 180000. + */ +#define AI_CONFIG_PP_CT_MAX_SMOOTHING_ANGLE "pp.ct.max_smoothing" + +// --------------------------------------------------------------------------- +/** \brief Specifies the maximum angle that may be between two face normals + * at the same vertex position that their are smoothed. + * + * This applies to the GenSmoothNormals-Step. The angle is specified + * in degrees * 1000, so 180000 is PI. The default value is + * 180 degrees (all vertex normals are smoothed). The maximum value is 180000 + * \note This can be manually overriden by loaders via #aiMesh::mMaxSmoothingAngle; + */ +#define AI_CONFIG_PP_GSN_MAX_SMOOTHING_ANGLE "pp.gsn.max_smoothing" + #define AI_CONFIG_PP_OG_MAX_DEPTH "pp.og.max_depth" #define AI_CONFIG_PP_OG_MIN_TRIS_PER_NODE "pp.og.min_tris" diff --git a/include/aiMesh.h b/include/aiMesh.h index 98182f549..8aed9f3b7 100644 --- a/include/aiMesh.h +++ b/include/aiMesh.h @@ -248,6 +248,8 @@ struct aiBone #endif // !! AI_MAX_NUMBER_OF_TEXTURECOORDS +#define AI_MESH_SMOOTHING_ANGLE_NOT_SET (10e10f) + // --------------------------------------------------------------------------- /** A mesh represents a geometry or model with a single material. * @@ -358,8 +360,9 @@ struct aiMesh * If the angle between two vertex normals is larger, * the vertex normals should not be smoothed. The GenVertexNormals-Step * takes care of this value. The angle is specified in radians. - * It is 2PI if the source file didn't contain any additional - * information related to the calculation of vertex normals. + * It is set to AI_MESH_SMOOTHING_ANGLE_NOT_SET if the source file didn't + * contain any additional information related to the calculation of + * vertex normals. */ float mMaxSmoothingAngle; @@ -381,7 +384,7 @@ struct aiMesh mColors[a] = NULL; mNumBones = 0; mBones = NULL; mMaterialIndex = 0; - mMaxSmoothingAngle = (float)AI_MATH_TWO_PI; + mMaxSmoothingAngle = AI_MESH_SMOOTHING_ANGLE_NOT_SET; } //! Deletes all storage allocated for the mesh diff --git a/tools/assimp_view/assimp_view.aps b/tools/assimp_view/assimp_view.aps index 0cbec45248cc9d3dfe4135a64e1678abc147acce..9631b78f5c595cbfc969fc8e1ab03787172ff498 100644 GIT binary patch literal 390688 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≷pd^x`{*LA*ro_b3UyqXt-UUEE7X3lSaPMpYG;dHz6nm?sa zveC1|B5cx`^KfEIx~^;BGQV`}phKtq)^LD5@q@Y1h<@6YbjVHHW+@c2n6O8fXI++|pFH%(!e=UXza~a7bzJLnm7ATSZ~dn}6rR#Quo;hioIaoa zZumz(fd!0f>_t0dyS$_mHuqs+lq{WheM>&|@4!$#lFgHDA-i;Fd^Eo9@1%!6(gJtM z3`~qC=sKVLS$(yxUz9`UHp&EN@Ik5Sb%d|6*IB&TFqzHw?SCcZhpbiT5o%P4zg zYn&&(!m^@s+s?dUp*^qVDKB}zUD(mJ@QJa(v!ro<^f6_;>A$4c^@L2Y6rSPdfv?7K zqY(~cao&6Zo~aLAy$oLL&0OapTV?Bz?!vgDMYsFic3ao9VI{x$C&y>XP9HZMLzmkl zmw#NIv}@ih7k#tMnAC3jq$mBF?YrbJ>(W2SxBr&y(-%)}KKjv*KL7O8Q}J8bkygAO zBhJ@$b8qMSKChj~KN$C;+)L~Ezwb?T-?@FC$XfHmvG(-6;_m$Sqn#9V@w@coYb?Dy z#zgOn)%lZ8eq{6HM;K3$D{-DF{n>rY`I7^q?`H=N_pS4lu8!?Ld%oL0$M)aW+#!6^ zo|GAW)jfOM!?UKVbzRrz@z-t8*erYVy!*}9%ywOuyFTBgr|aD7d@bih%6{enZSPmg zQ%~Wq{_S#e9XzjtE@SfB58HXls(RG!?61b&aj%Y5ZI%lVGE@2RLGt>yH(y=cU94B5wMKXKf)W0#(F z-MakI&E9%;*u3^Zl;J;78C!Jn;Zx5`M)t$;?by;au*18}ztz8k{>1!nT>d^@y6j_) zozlIgiSqINzO->~e>D3B#uM?;UNlR+_~ohc_i-@~{S8z173Vu?_QJB8-oDtza|}6a z96QU~w$E`X+9heq!O!qwVJ!I^{og$@K_kOJYN~Ue>Wew(~0`XG8XhZe6f(b z?#C(@jr~0BT>h__^=mmR-!Cwoc$@VPzpmsQuYE5*)nlXP#b$HJpEemM?a$Xf{-@^u zRq;xfgsXnn;R>m!?wC`H{k&oviik5luG9G_Wc*!h%F`cgEbt@JL+rYFz#KYS`MJ2m{% zj%m}V8+1>Fy`(=J@{kL5%b)pp^B7A@zNsharjLqm_`yC{*B2lD zHLk(4n>KaExD&3RDU9N;I{8*UNyG}| zMYpaC*?H}4`^0|e?ZX!(XJ@|*yi?|y51;JhUE_P+<&TbQcG)+($Niodut9cUL-)PU z%ik-%@1=8lj$z)(xn{Pl%e!dS^HnP^=CZY{EPrgwb=&Q<&GwSp=gfutrnh8%O!jQo zPy1Ti$3j2JJR$pIB*~(_(eA1fZ_;mJ-r`MJqFdQ8bvAt^dx>Eerp6OGC-$U8_EHAr z-E!cy9mcf4i>!sbCTCGUbz0sM1AL8l4_}?o|I^}4J45D9j7weJ&LysidtEP{wQP?c z+phM#ZQJdO@~LI);foi7d11p2`NAX2&2E=PZ(F+m`gx5P%P!u5)v`{ouXp+2;hZk8!#DLh>d< zSe7@pUCuaa(oll$Il>rLh@7B$3xF2!lt1c4AoAX+B>e%*055i z`fWM((XcmsFm)yU$AkCdp@Re#+njXJL>lrrFFxVQcJUggp@Gh`Z?zoE&+0ua?^MHq>x|Fw|fv4F8cG0Uo^$c0ovydN{%Wuh7HlQCF$Se9O zr`n_!ewSOm;t{X)lx)j2zsey?ID|Fz55L0Kl4MqS$TDBoC4K2TWTS7*YaLV09=f}& zAy@RF>y!4yz=PkWZ>HR;7basVy5i0Lr600=^aHvFP0Hyy#8-CbnCLRl0naYGq8^{v zwxPrNN{)QXIkI}2<(7=nflo+de08~9mvkqsaJUZ})`6|-Z8D}^#ud4A&+;c1a_PIY zYv647ghTR+Cfd-^lkMt#GV9<=znEvzB_`<=hNSI&1)F@=Fp0nH-1b

$^d&CYSpAlm(w5QhMLY1~zrvS&5AMV^uu2|v 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 z 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 delta 110961 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 ",IDC_STATIC,42,66,192,8 - LTEXT "Kim Kulling \t\t\taka ",IDC_STATIC,42,78,186,8 - LTEXT "Rainer Schmidt \t\t\taka ",IDC_STATIC,42,90,180,8 - LTEXT "Alexander Gessler\t\taka ",IDC_STATIC,42,102,186,8 + LTEXT "Open Asset Import Library (Assimp)",IDC_STATIC,77,13,121,12 + LTEXT "A free C/C++ library for game && graphics developers. Developed by members of the german game development community www.zfx.info",IDC_STATIC,47,26,204,24 + LTEXT "Thomas Schulze \t\taka ",IDC_STATIC,55,80,192,8 + LTEXT "Kim Kulling \t\t\taka ",IDC_STATIC,55,92,186,8 + LTEXT "Rainer Schmidt \t\t\taka ",IDC_STATIC,55,104,180,8 + LTEXT "Alexander Gessler\t\taka ",IDC_STATIC,55,68,186,8 CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,60,282,1 - LTEXT "http://zfxce.svn.sourceforge.net/viewvc/zfxce/trunk/ASSIMP",IDC_STATIC,42,120,198,8 - DEFPUSHBUTTON "Love this library",IDOK,199,148,67,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,138,281,1 + LTEXT "assimp.sourceforge.net",IDC_STATIC,7,137,78,8 + DEFPUSHBUTTON "Love this library",IDOK,200,128,67,14 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,148,283,1 + CONTROL 130,IDC_STATIC,"Static",SS_BITMAP,0,149,514,20 END IDD_DIALOGMAIN DIALOGEX 0, 0, 594, 384 @@ -233,6 +234,7 @@ GUIDELINES DESIGNINFO BEGIN IDD_ABOUTBOX, DIALOG BEGIN + TOPMARGIN, 1 BOTTOMMARGIN, 158 END diff --git a/tools/assimp_view/banner.bmp b/tools/assimp_view/banner.bmp index 36ceed902975750cd215f0a71206020011223f89..419b97ddece4c96ee23e3501993794045e2a95d3 100644 GIT binary patch literal 144054 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%0De&FVLw$-u62R!tu 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 E1!Fy?(f|Me literal 108054 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 C!Q}k_ literal 84054 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 diff --git a/workspaces/vc8/assimp.vcproj b/workspaces/vc8/assimp.vcproj index f97923b0a..918d141fe 100644 --- a/workspaces/vc8/assimp.vcproj +++ b/workspaces/vc8/assimp.vcproj @@ -582,6 +582,10 @@ RelativePath="..\..\include\aiAssert.h" > + + @@ -674,6 +678,10 @@ RelativePath="..\..\include\LogStream.h" > + + @@ -965,10 +973,6 @@ - - @@ -1030,6 +1034,30 @@ > + + + + + + + + + + + + + + + +