From bd196ea31819c306cc114e9177b3f0de0a80d7da Mon Sep 17 00:00:00 2001 From: aramis_acg Date: Mon, 20 Apr 2009 16:49:46 +0000 Subject: [PATCH] - Changing LWO loader's VMAP selection strategy. Unassigned VMAPs (UVs and VColors) are now kept, if possible. Referenced VMAPs have higher priority so everything should be backward compatible. - assimp_cmd writes vertex colors in 'Colors' elements now. - assimp_cmd writes 'set=' attribute for UVs and vertex colors. - Adding test files for the awesome new LWO capabilities. git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@396 67173fc5-114c-0410-ac8e-9d2fd5bffc1f --- code/LWOFileData.h | 13 +- code/LWOLoader.cpp | 5 +- code/LWOLoader.h | 6 +- code/LWOMaterial.cpp | 200 +++++++++++++++-------- mkutil/revision.h | 2 +- test/models/LWO/LWO2/box_2uv_1unused.lwo | Bin 0 -> 1236 bytes test/models/LWO/LWO2/box_2vc_1unused.lwo | Bin 0 -> 22924 bytes test/models/LWO/LWO2/white.bmp | Bin 0 -> 58 bytes tools/assimp_cmd/WriteDumb.cpp | 4 +- 9 files changed, 153 insertions(+), 77 deletions(-) create mode 100644 test/models/LWO/LWO2/box_2uv_1unused.lwo create mode 100644 test/models/LWO/LWO2/box_2vc_1unused.lwo create mode 100644 test/models/LWO/LWO2/white.bmp diff --git a/code/LWOFileData.h b/code/LWOFileData.h index f13e32f86..f1d6fb3ec 100644 --- a/code/LWOFileData.h +++ b/code/LWOFileData.h @@ -308,9 +308,10 @@ struct VMapEntry //! allocates memory for the vertex map virtual void Allocate(unsigned int num) { - if (!rawData.empty())return; // return if already allocated + if (!rawData.empty()) + return; // return if already allocated - register unsigned int m = num*dims; + const unsigned int m = num*dims; rawData.reserve(m + (m>>2u)); // 25% as extra storage for VMADs rawData.resize(m,0.f); abAssigned.resize(num,false); @@ -318,8 +319,8 @@ struct VMapEntry std::string name; unsigned int dims; - std::vector rawData; + std::vector rawData; std::vector abAssigned; }; @@ -336,14 +337,15 @@ struct VColorChannel : public VMapEntry //! be initialized to 1.0 by default virtual void Allocate(unsigned int num) { - if (!rawData.empty())return; // return if already allocated + if (!rawData.empty()) + return; // return if already allocated register unsigned int m = num*dims; rawData.reserve(m + (m>>2u)); // 25% as extra storage for VMADs rawData.resize(m); for (aiColor4D* p = (aiColor4D*)&rawData[0]; p < (aiColor4D*)&rawData[m-1]; ++p) - *p = aiColor4D(); + p->a = 1.f; abAssigned.resize(num,false); } @@ -618,6 +620,7 @@ typedef std::vector < VColorChannel > VColorChannelList; typedef std::vector < UVChannel > UVChannelList; typedef std::vector < Clip > ClipList; typedef std::vector < Envelope > EnvelopeList; +typedef std::vector < unsigned int > SortedRep; // --------------------------------------------------------------------------- /** \brief Represents a layer in the file diff --git a/code/LWOLoader.cpp b/code/LWOLoader.cpp index cc16bca3d..f899b080c 100644 --- a/code/LWOLoader.cpp +++ b/code/LWOLoader.cpp @@ -208,7 +208,6 @@ void LWOImporter::InternReadFile( const std::string& pFile, if (!layer.mFaces.empty() && !layer.mTempPoints.empty()) { // now sort all faces by the surfaces assigned to them - typedef std::vector SortedRep; std::vector pSorted(mSurfaces->size()+1); unsigned int i = 0; @@ -271,8 +270,8 @@ void LWOImporter::InternReadFile( const std::string& pFile, vVColorIndices[mui] = 0xffffffff; #endif - FindUVChannels(_mSurfaces[i],layer,vUVChannelIndices); - FindVCChannels(_mSurfaces[i],layer,vVColorIndices); + FindUVChannels(_mSurfaces[i],sorted,layer,vUVChannelIndices); + FindVCChannels(_mSurfaces[i],sorted,layer,vVColorIndices); // allocate storage for UV and CV channels aiVector3D* pvUV[AI_MAX_NUMBER_OF_TEXTURECOORDS]; diff --git a/code/LWOLoader.h b/code/LWOLoader.h index e88013ace..3c889c74c 100644 --- a/code/LWOLoader.h +++ b/code/LWOLoader.h @@ -289,15 +289,17 @@ private: * UV/VC channel lists of the layer */ void FindUVChannels(/*const*/ LWO::Surface& surf, + LWO::SortedRep& sorted, /*const*/ LWO::Layer& layer, unsigned int out[AI_MAX_NUMBER_OF_TEXTURECOORDS]); // ------------------------------------------------------------------- - void FindUVChannels(LWO::TextureList& list, LWO::Layer& layer, - unsigned int out[AI_MAX_NUMBER_OF_TEXTURECOORDS], unsigned int& next); + char FindUVChannels(LWO::TextureList& list, + LWO::Layer& layer,LWO::UVChannel& uv, unsigned int next); // ------------------------------------------------------------------- void FindVCChannels(const LWO::Surface& surf, + LWO::SortedRep& sorted, const LWO::Layer& layer, unsigned int out[AI_MAX_NUMBER_OF_COLOR_SETS]); diff --git a/code/LWOMaterial.cpp b/code/LWOMaterial.cpp index ab8dcadca..f025ad6a7 100644 --- a/code/LWOMaterial.cpp +++ b/code/LWOMaterial.cpp @@ -285,9 +285,12 @@ void LWOImporter::ConvertMaterial(const LWO::Surface& surf,MaterialHelper* pcMat } else { - if (16.0f >= surf.mGlossiness)fGloss = 6.0f; - else if (64.0f >= surf.mGlossiness)fGloss = 20.0f; - else if (256.0f >= surf.mGlossiness)fGloss = 50.0f; + if (16.0f >= surf.mGlossiness) + fGloss = 6.0f; + else if (64.0f >= surf.mGlossiness) + fGloss = 20.0f; + else if (256.0f >= surf.mGlossiness) + fGloss = 50.0f; else fGloss = 80.0f; } @@ -303,20 +306,19 @@ void LWOImporter::ConvertMaterial(const LWO::Surface& surf,MaterialHelper* pcMat pcMat->AddProperty(&surf.mSpecularValue,1,AI_MATKEY_SHININESS_STRENGTH); // emissive color - // (luminosity is not really the same but it affects the surface in - // a similar way. However, some scalings seems to be necessary) + // luminosity is not really the same but it affects the surface in a similar way. Some scaling looks good. clr.g = clr.b = clr.r = surf.mLuminosity*0.8f; pcMat->AddProperty(&clr,1,AI_MATKEY_COLOR_EMISSIVE); // opacity ... either additive or default-blended, please - if (0.f != surf.mAdditiveTransparency) - { + if (0.f != surf.mAdditiveTransparency) { + const int add = aiBlendMode_Additive; pcMat->AddProperty(&surf.mAdditiveTransparency,1,AI_MATKEY_OPACITY); pcMat->AddProperty(&add,1,AI_MATKEY_BLEND_FUNC); } - else if (10e10f != surf.mTransparency) - { + + else if (10e10f != surf.mTransparency) { const int def = aiBlendMode_Default; const float f = 1.0f-surf.mTransparency; pcMat->AddProperty(&f,1,AI_MATKEY_OPACITY); @@ -334,23 +336,19 @@ void LWOImporter::ConvertMaterial(const LWO::Surface& surf,MaterialHelper* pcMat HandleTextures(pcMat,surf.mOpacityTextures,aiTextureType_OPACITY); HandleTextures(pcMat,surf.mReflectionTextures,aiTextureType_REFLECTION); - // Now we need to know which shader we must use - // iterate through the shader list of the surface and - // search for a name which we know ... - for (ShaderList::const_iterator it = surf.mShaders.begin(), end = surf.mShaders.end(); - it != end;++it) - { + // Now we need to know which shader to use .. iterate through the shader list of + // the surface and search for a name which we know ... + for (ShaderList::const_iterator it = surf.mShaders.begin(), end = surf.mShaders.end();it != end;++it) { //if (!(*it).enabled)continue; + if ((*it).functionName == "LW_SuperCelShader" || (*it).functionName == "AH_CelShader") { - DefaultLogger::get()->info("LWO2: Mapping LW_SuperCelShader/AH_CelShader " - "to aiShadingMode_Toon"); + DefaultLogger::get()->info("LWO2: Mapping LW_SuperCelShader/AH_CelShader to aiShadingMode_Toon"); m = aiShadingMode_Toon; break; } else if ((*it).functionName == "LW_RealFresnel" || (*it).functionName == "LW_FastFresnel") { - DefaultLogger::get()->info("LWO2: Mapping LW_RealFresnel/LW_FastFresnel " - "to aiShadingMode_Fresnel"); + DefaultLogger::get()->info("LWO2: Mapping LW_RealFresnel/LW_FastFresnel to aiShadingMode_Fresnel"); m = aiShadingMode_Fresnel; break; @@ -374,74 +372,148 @@ void LWOImporter::ConvertMaterial(const LWO::Surface& surf,MaterialHelper* pcMat } // ------------------------------------------------------------------------------------------------ -void LWOImporter::FindUVChannels(LWO::TextureList& list, LWO::Layer& layer, - unsigned int out[AI_MAX_NUMBER_OF_TEXTURECOORDS], - unsigned int& next) +char LWOImporter::FindUVChannels(LWO::TextureList& list, + LWO::Layer& layer,LWO::UVChannel& uv, unsigned int next) { + char ret = 0; for (TextureList::iterator it = list.begin(), end = list.end();it != end;++it) { // Ignore textures with non-UV mappings for the moment. if (!(*it).enabled || !(*it).bCanUse || (*it).mapMode != LWO::Texture::UV) { continue; } - for (unsigned int i = 0; i < layer.mUVChannels.size();++i) { + + if ((*it).mUVChannelIndex == uv.name) { + ret = 1; + + // got it. + if ((*it).mRealUVIndex == 0xffffffff || (*it).mRealUVIndex == next) + { + (*it).mRealUVIndex = next; + } + else { + // channel mismatch. need to duplicate the material. + DefaultLogger::get()->warn("LWO: Channel mismatch, would need to duplicate surface [design bug]"); - bool found = false; - if ((*it).mUVChannelIndex == layer.mUVChannels[i].name) { - // check whether we have this channel already - for (unsigned int m = 0; m < next;++m) { + // TODO + } + } + } + return ret; +} + +// ------------------------------------------------------------------------------------------------ +void LWOImporter::FindUVChannels(LWO::Surface& surf, + LWO::SortedRep& sorted,LWO::Layer& layer, + unsigned int out[AI_MAX_NUMBER_OF_TEXTURECOORDS]) +{ + unsigned int next = 0, extra = 0, num_extra = 0; + + // Check whether we have an UV entry != 0 for one of the faces in 'sorted' + for (unsigned int i = 0; i < layer.mUVChannels.size();++i) { + LWO::UVChannel& uv = layer.mUVChannels[i]; + + for (LWO::SortedRep::const_iterator it = sorted.begin(); it != sorted.end(); ++it) { + + LWO::Face& face = layer.mFaces[*it]; + + for (unsigned int n = 0; n < face.mNumIndices; ++n) { + unsigned int idx = face.mIndices[n]; + + if (uv.abAssigned[idx] && ((aiVector2D*)&uv.rawData[0])[idx] != aiVector2D()) { + + if (next >= AI_MAX_NUMBER_OF_TEXTURECOORDS) { + + DefaultLogger::get()->error("LWO: Maximum number of UV channels for " + "this mesh reached. Skipping channel \'" + uv.name + "\'"); - if (i == out[m]) { - (*it).mRealUVIndex = m; - found = true; - break; } - } + else { + // Search through all textures assigned to 'surf' and look for this UV channel + char had = 0; + had |= FindUVChannels(surf.mColorTextures,layer,uv,next); + had |= FindUVChannels(surf.mDiffuseTextures,layer,uv,next); + had |= FindUVChannels(surf.mSpecularTextures,layer,uv,next); + had |= FindUVChannels(surf.mGlossinessTextures,layer,uv,next); + had |= FindUVChannels(surf.mOpacityTextures,layer,uv,next); + had |= FindUVChannels(surf.mBumpTextures,layer,uv,next); + had |= FindUVChannels(surf.mReflectionTextures,layer,uv,next); - if (!found) { - (*it).mRealUVIndex = next; - out[next++] = i; - if (AI_MAX_NUMBER_OF_TEXTURECOORDS != next) - out[next] = 0xffffffff; + if (had != 0) { + + // We have a texture referencing this UV channel so we have to take special care of it + if (num_extra) { + + for (unsigned int a = next; a < std::min( extra, AI_MAX_NUMBER_OF_TEXTURECOORDS-1u ); ++a) { + out[a+1] = out[a]; + } + } + ++extra; + out[next++] = i; + } + else { + + // Bäh ... seems not to be used at all. Push to end if enough space is available. + out[extra++] = i; + ++num_extra; + } + } + it = sorted.end()-1; break; } } } - if (0xffffffff == (*it).mRealUVIndex) - DefaultLogger::get()->error("LWO2: Unable to find matching UV channel for texture"); + } + if (next != AI_MAX_NUMBER_OF_TEXTURECOORDS) { + out[extra] = 0xffffffff; } } // ------------------------------------------------------------------------------------------------ -void LWOImporter::FindUVChannels(LWO::Surface& surf, LWO::Layer& layer, - unsigned int out[AI_MAX_NUMBER_OF_TEXTURECOORDS]) -{ - out[0] = 0xffffffff; - unsigned int next = 0; - - FindUVChannels(surf.mColorTextures,layer,out,next); - FindUVChannels(surf.mDiffuseTextures,layer,out,next); - FindUVChannels(surf.mSpecularTextures,layer,out,next); - FindUVChannels(surf.mGlossinessTextures,layer,out,next); - FindUVChannels(surf.mOpacityTextures,layer,out,next); - FindUVChannels(surf.mBumpTextures,layer,out,next); - FindUVChannels(surf.mReflectionTextures,layer,out,next); -} - -// ------------------------------------------------------------------------------------------------ -void LWOImporter::FindVCChannels(const LWO::Surface& surf, const LWO::Layer& layer, +void LWOImporter::FindVCChannels(const LWO::Surface& surf, LWO::SortedRep& sorted, const LWO::Layer& layer, unsigned int out[AI_MAX_NUMBER_OF_COLOR_SETS]) { - out[0] = 0xffffffff; - if (surf.mVCMap.length()) { - for (unsigned int i = 0; i < layer.mVColorChannels.size();++i) { - if (surf.mVCMap == layer.mVColorChannels[i].name) { - out[0] = i; - out[1] = 0xffffffff; - return; + unsigned int next = 0; + + // Check whether we have an vc entry != 0 for one of the faces in 'sorted' + for (unsigned int i = 0; i < layer.mVColorChannels.size();++i) { + const LWO::VColorChannel& vc = layer.mVColorChannels[i]; + + if (surf.mVCMap == vc.name) { + // The vertex color map is explicitely requested by the surface so we need to take special care of it + for (unsigned int a = 0; a < std::min(next,AI_MAX_NUMBER_OF_COLOR_SETS-1u); ++a) { + out[a+1] = out[a]; + } + out[0] = i; + ++next; + } + else { + + for (LWO::SortedRep::iterator it = sorted.begin(); it != sorted.end(); ++it) { + const LWO::Face& face = layer.mFaces[*it]; + + for (unsigned int n = 0; n < face.mNumIndices; ++n) { + unsigned int idx = face.mIndices[n]; + + if (vc.abAssigned[idx] && ((aiColor4D*)&vc.rawData[0])[idx] != aiColor4D(0.f,0.f,0.f,1.f)) { + if (next >= AI_MAX_NUMBER_OF_COLOR_SETS) { + + DefaultLogger::get()->error("LWO: Maximum number of vertex color channels for " + "this mesh reached. Skipping channel \'" + vc.name + "\'"); + + } + else { + out[next++] = i; + } + it = sorted.end()-1; + break; + } + } } } - DefaultLogger::get()->warn("LWO2: Unable to find vertex color channel: " + surf.mVCMap); + } + if (next != AI_MAX_NUMBER_OF_COLOR_SETS) { + out[next] = 0xffffffff; } } diff --git a/mkutil/revision.h b/mkutil/revision.h index 3152519a3..c019ccfc1 100644 --- a/mkutil/revision.h +++ b/mkutil/revision.h @@ -1 +1 @@ -#define SVNRevision 387 +#define SVNRevision 394 diff --git a/test/models/LWO/LWO2/box_2uv_1unused.lwo b/test/models/LWO/LWO2/box_2uv_1unused.lwo new file mode 100644 index 0000000000000000000000000000000000000000..49bf9ad0b9ff91800179bdeaad383a1571bd1250 GIT binary patch literal 1236 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 literal 0 HcmV?d00001 diff --git a/tools/assimp_cmd/WriteDumb.cpp b/tools/assimp_cmd/WriteDumb.cpp index 78b674efd..5e5a677c7 100644 --- a/tools/assimp_cmd/WriteDumb.cpp +++ b/tools/assimp_cmd/WriteDumb.cpp @@ -890,7 +890,7 @@ void WriteDump(const aiScene* scene, FILE* out, const char* src, const char* cmd if (!mesh->mTextureCoords[a]) break; - ::fprintf(out,"\t\t \n",mesh->mNumUVComponents[a]); + ::fprintf(out,"\t\t \n",a,mesh->mNumUVComponents[a]); if (!shortened) { for (unsigned int n = 0; n < mesh->mNumVertices; ++n) { ::fprintf(out,"\t\t%0 8f %0 8f %0 8f\n", @@ -908,7 +908,7 @@ void WriteDump(const aiScene* scene, FILE* out, const char* src, const char* cmd for (unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; ++a) { if (!mesh->mColors[a]) break; - ::fprintf(out,"\t\t \n"); + //::fprintf(out,"\t\t \n",a); if (!shortened) { for (unsigned int n = 0; n < mesh->mNumVertices; ++n) { ::fprintf(out,"\t\t%0 8f %0 8f %0 8f %0 8f\n",