diff --git a/code/ColladaExporter.cpp b/code/ColladaExporter.cpp index 03e59b8ad..8e48842ad 100644 --- a/code/ColladaExporter.cpp +++ b/code/ColladaExporter.cpp @@ -215,6 +215,7 @@ void ColladaExporter::WriteMaterials() materials.resize( mScene->mNumMaterials); /// collect all materials from the scene + size_t numTextures = 0; for( size_t a = 0; a < mScene->mNumMaterials; ++a ) { const aiMaterial* mat = mScene->mMaterials[a]; @@ -228,99 +229,111 @@ void ColladaExporter::WriteMaterials() materials[a].name[pos] = 'x'; ReadMaterialSurface( materials[a].ambient, mat, aiTextureType_AMBIENT, AI_MATKEY_COLOR_AMBIENT); + if( !materials[a].ambient.texture.empty() ) numTextures++; ReadMaterialSurface( materials[a].diffuse, mat, aiTextureType_DIFFUSE, AI_MATKEY_COLOR_DIFFUSE); + if( !materials[a].diffuse.texture.empty() ) numTextures++; ReadMaterialSurface( materials[a].specular, mat, aiTextureType_SPECULAR, AI_MATKEY_COLOR_SPECULAR); + if( !materials[a].specular.texture.empty() ) numTextures++; ReadMaterialSurface( materials[a].emissive, mat, aiTextureType_EMISSIVE, AI_MATKEY_COLOR_EMISSIVE); + if( !materials[a].emissive.texture.empty() ) numTextures++; ReadMaterialSurface( materials[a].reflective, mat, aiTextureType_REFLECTION, AI_MATKEY_COLOR_REFLECTIVE); + if( !materials[a].reflective.texture.empty() ) numTextures++; ReadMaterialSurface( materials[a].normal, mat, aiTextureType_NORMALS, NULL, 0, 0); + if( !materials[a].normal.texture.empty() ) numTextures++; mat->Get( AI_MATKEY_SHININESS, materials[a].shininess); } // output textures if present - mOutput << startstr << "" << endstr; - PushTag(); - for( std::vector::const_iterator it = materials.begin(); it != materials.end(); ++it ) - { - const Material& mat = *it; - WriteImageEntry( mat.ambient, mat.name + "-ambient-image"); - WriteImageEntry( mat.diffuse, mat.name + "-diffuse-image"); - WriteImageEntry( mat.specular, mat.name + "-specular-image"); - WriteImageEntry( mat.emissive, mat.name + "-emissive-image"); - WriteImageEntry( mat.reflective, mat.name + "-reflective-image"); - WriteImageEntry( mat.normal, mat.name + "-normal-image"); + if( numTextures > 0 ) + { + mOutput << startstr << "" << endstr; + PushTag(); + for( std::vector::const_iterator it = materials.begin(); it != materials.end(); ++it ) + { + const Material& mat = *it; + WriteImageEntry( mat.ambient, mat.name + "-ambient-image"); + WriteImageEntry( mat.diffuse, mat.name + "-diffuse-image"); + WriteImageEntry( mat.specular, mat.name + "-specular-image"); + WriteImageEntry( mat.emissive, mat.name + "-emissive-image"); + WriteImageEntry( mat.reflective, mat.name + "-reflective-image"); + WriteImageEntry( mat.normal, mat.name + "-normal-image"); + } + PopTag(); + mOutput << startstr << "" << endstr; } - PopTag(); - mOutput << startstr << "" << endstr; // output effects - those are the actual carriers of information - mOutput << startstr << "" << endstr; - PushTag(); - for( std::vector::const_iterator it = materials.begin(); it != materials.end(); ++it ) + if( !materials.empty() ) { - const Material& mat = *it; - // this is so ridiculous it must be right - mOutput << startstr << "" << endstr; + mOutput << startstr << "" << endstr; PushTag(); - mOutput << startstr << "" << endstr; + for( std::vector::const_iterator it = materials.begin(); it != materials.end(); ++it ) + { + const Material& mat = *it; + // this is so ridiculous it must be right + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" << endstr; + PushTag(); + + // write sampler- and surface params for the texture entries + WriteTextureParamEntry( mat.emissive, "emissive", mat.name); + WriteTextureParamEntry( mat.ambient, "ambient", mat.name); + WriteTextureParamEntry( mat.diffuse, "diffuse", mat.name); + WriteTextureParamEntry( mat.specular, "specular", mat.name); + WriteTextureParamEntry( mat.reflective, "reflective", mat.name); + + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" << endstr; + PushTag(); + + WriteTextureColorEntry( mat.emissive, "emission", mat.name + "-emissive-sampler"); + WriteTextureColorEntry( mat.ambient, "ambient", mat.name + "-ambient-sampler"); + WriteTextureColorEntry( mat.diffuse, "diffuse", mat.name + "-diffuse-sampler"); + WriteTextureColorEntry( mat.specular, "specular", mat.name + "-specular-sampler"); + + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" << mat.shininess << "" << endstr; + PopTag(); + mOutput << startstr << "" << endstr; + + WriteTextureColorEntry( mat.reflective, "reflective", mat.name + "-reflective-sampler"); + + // deactivated because the Collada spec PHONG model does not allow other textures. + // if( !mat.normal.texture.empty() ) + // WriteTextureColorEntry( mat.normal, "bump", mat.name + "-normal-sampler"); + + + PopTag(); + mOutput << startstr << "" << endstr; + PopTag(); + mOutput << startstr << "" << endstr; + PopTag(); + mOutput << startstr << "" << endstr; + PopTag(); + mOutput << startstr << "" << endstr; + } + PopTag(); + mOutput << startstr << "" << endstr; + + // write materials - they're just effect references + mOutput << startstr << "" << endstr; PushTag(); - - // write sampler- and surface params for the texture entries - WriteTextureParamEntry( mat.emissive, "emissive", mat.name); - WriteTextureParamEntry( mat.ambient, "ambient", mat.name); - WriteTextureParamEntry( mat.diffuse, "diffuse", mat.name); - WriteTextureParamEntry( mat.specular, "specular", mat.name); - WriteTextureParamEntry( mat.reflective, "reflective", mat.name); - - mOutput << startstr << "" << endstr; - PushTag(); - mOutput << startstr << "" << endstr; - PushTag(); - - WriteTextureColorEntry( mat.emissive, "emission", mat.name + "-emissive-sampler"); - WriteTextureColorEntry( mat.ambient, "ambient", mat.name + "-ambient-sampler"); - WriteTextureColorEntry( mat.diffuse, "diffuse", mat.name + "-diffuse-sampler"); - WriteTextureColorEntry( mat.specular, "specular", mat.name + "-specular-sampler"); - - mOutput << startstr << "" << endstr; - PushTag(); - mOutput << startstr << "" << mat.shininess << "" << endstr; + for( std::vector::const_iterator it = materials.begin(); it != materials.end(); ++it ) + { + const Material& mat = *it; + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" << endstr; + PopTag(); + mOutput << startstr << "" << endstr; + } PopTag(); - mOutput << startstr << "" << endstr; - - WriteTextureColorEntry( mat.reflective, "reflective", mat.name + "-reflective-sampler"); - -// deactivated because the Collada spec PHONG model does not allow other textures. -// if( !mat.normal.texture.empty() ) -// WriteTextureColorEntry( mat.normal, "bump", mat.name + "-normal-sampler"); - - - PopTag(); - mOutput << startstr << "" << endstr; - PopTag(); - mOutput << startstr << "" << endstr; - PopTag(); - mOutput << startstr << "" << endstr; - PopTag(); - mOutput << startstr << "" << endstr; + mOutput << startstr << "" << endstr; } - PopTag(); - mOutput << startstr << "" << endstr; - - // write materials - they're just effect references - mOutput << startstr << "" << endstr; - PushTag(); - for( std::vector::const_iterator it = materials.begin(); it != materials.end(); ++it ) - { - const Material& mat = *it; - mOutput << startstr << "" << endstr; - PushTag(); - mOutput << startstr << "" << endstr; - PopTag(); - mOutput << startstr << "" << endstr; - } - PopTag(); - mOutput << startstr << "" << endstr; } // ------------------------------------------------------------------------------------------------