shared_ptr<ModelMaterial> ModelMaterialProcessor::LoadModelMaterial(Model& model, aiMaterial& material) { InitializeTextureTypeMappings(); ModelMaterialData modelMaterialData; aiString name; material.Get(AI_MATKEY_NAME, name); modelMaterialData.Name = name.C_Str(); for (TextureType textureType = (TextureType)0; textureType < TextureType::End; textureType = (TextureType)(static_cast<int>(textureType) + 1)) { aiTextureType mappedTextureType = (aiTextureType)sTextureTypeMappings[textureType]; UINT textureCount = material.GetTextureCount(mappedTextureType); if (textureCount > 0) { vector<string>* textures = new vector<string>(); modelMaterialData.Textures.insert(pair<TextureType, vector<string>*>(textureType, textures)); textures->reserve(textureCount); for (UINT textureIndex = 0; textureIndex < textureCount; textureIndex++) { aiString path; if (material.GetTexture(mappedTextureType, textureIndex, &path) == AI_SUCCESS) { textures->push_back(path.C_Str()); } } } } return make_shared<ModelMaterial>(model, move(modelMaterialData)); }
void Exporter::exportMaterial(const aiMaterial& mtl) const { std::string diffTex; std::string normTex; std::string specColTex; std::string shininessTex; std::string dispTex; std::string emissiveTex; std::string metallicTex; aiString path; std::string name = getMaterialName(mtl); LOGI("Exporting material %s", name.c_str()); // Diffuse texture if(mtl.GetTextureCount(aiTextureType_DIFFUSE) > 0) { if(mtl.GetTexture(aiTextureType_DIFFUSE, 0, &path) == AI_SUCCESS) { diffTex = getFilename(path.C_Str()); } else { ERROR("Failed to retrieve texture"); } } // Normal texture if(mtl.GetTextureCount(aiTextureType_NORMALS) > 0) { if(mtl.GetTexture(aiTextureType_NORMALS, 0, &path) == AI_SUCCESS) { normTex = getFilename(path.C_Str()); } else { ERROR("Failed to retrieve texture"); } } // Specular color if(mtl.GetTextureCount(aiTextureType_SPECULAR) > 0) { if(mtl.GetTexture(aiTextureType_SPECULAR, 0, &path) == AI_SUCCESS) { specColTex = getFilename(path.C_Str()); } else { ERROR("Failed to retrieve texture"); } } // Shininess color if(mtl.GetTextureCount(aiTextureType_SHININESS) > 0) { if(mtl.GetTexture(aiTextureType_SHININESS, 0, &path) == AI_SUCCESS) { shininessTex = getFilename(path.C_Str()); } else { ERROR("Failed to retrieve texture"); } } // Height texture if(mtl.GetTextureCount(aiTextureType_DISPLACEMENT) > 0) { if(mtl.GetTexture(aiTextureType_DISPLACEMENT, 0, &path) == AI_SUCCESS) { dispTex = getFilename(path.C_Str()); } else { ERROR("Failed to retrieve texture"); } } // Emissive texture if(mtl.GetTextureCount(aiTextureType_EMISSIVE) > 0) { if(mtl.GetTexture(aiTextureType_EMISSIVE, 0, &path) == AI_SUCCESS) { emissiveTex = getFilename(path.C_Str()); } else { ERROR("Failed to retrieve texture"); } } // Metallic texture if(mtl.GetTextureCount(aiTextureType_REFLECTION) > 0) { if(mtl.GetTexture(aiTextureType_REFLECTION, 0, &path) == AI_SUCCESS) { metallicTex = getFilename(path.C_Str()); } else { ERROR("Failed to retrieve texture"); } } // Write file static const char* diffNormSpecFragTemplate = #include "templates/diffNormSpecFrag.h" ; static const char* simpleVertTemplate = #include "templates/simpleVert.h" ; static const char* tessVertTemplate = #include "templates/tessVert.h" ; static const char* readRgbFromTextureTemplate = R"( <operation> <id>%id%</id> <returnType>vec3</returnType> <function>readRgbFromTexture</function> <arguments> <argument>%map%</argument> <argument>out2</argument> </arguments> </operation>)"; static const char* readRFromTextureTemplate = R"( <operation> <id>%id%</id> <returnType>float</returnType> <function>readRFromTexture</function> <arguments> <argument>%map%</argument> <argument>out2</argument> </arguments> </operation>)"; // Compose full template // First geometry part std::string materialStr; materialStr = R"(<?xml version="1.0" encoding="UTF-8" ?>)"; materialStr += "\n<material>\n\t<programs>\n"; if(/*dispTex.empty()*/ 1) { materialStr += simpleVertTemplate; } else { materialStr += tessVertTemplate; } materialStr += "\n"; // Then fragment part materialStr += diffNormSpecFragTemplate; materialStr += "\n\t</programs>\t</material>"; // Replace strings if(!dispTex.empty()) { materialStr = replaceAllString(materialStr, "%dispMap%", m_texrpath + dispTex); } // Diffuse if(!diffTex.empty()) { materialStr = replaceAllString(materialStr, "%diffuseColorInput%", R"(<input><type>sampler2D</type><name>uDiffuseColor</name><value>)" + m_texrpath + diffTex + R"(</value></input>)"); materialStr = replaceAllString(materialStr, "%diffuseColorFunc%", readRgbFromTextureTemplate); materialStr = replaceAllString(materialStr, "%id%", "10"); materialStr = replaceAllString(materialStr, "%map%", "uDiffuseColor"); materialStr = replaceAllString(materialStr, "%diffuseColorArg%", "out10"); }