// ------------------------------------------------------------------- // Gets a texture name from data. void ObjFileMtlImporter::getTexture() { aiString* out = NULL; // FIXME: just a quick'n'dirty hack, consider cleanup later // Diffuse texture if (!ASSIMP_strincmp(&(*m_DataIt),"map_kd",6)) out = & m_pModel->m_pCurrentMaterial->texture; // Ambient texture else if (!ASSIMP_strincmp(&(*m_DataIt),"map_ka",6)) out = & m_pModel->m_pCurrentMaterial->textureAmbient; // Specular texture else if (!ASSIMP_strincmp(&(*m_DataIt),"map_ks",6)) out = & m_pModel->m_pCurrentMaterial->textureSpecular; // Opacity texture else if (!ASSIMP_strincmp(&(*m_DataIt),"map_d",5)) out = & m_pModel->m_pCurrentMaterial->textureOpacity; // Ambient texture else if (!ASSIMP_strincmp(&(*m_DataIt),"map_ka",6)) out = & m_pModel->m_pCurrentMaterial->textureAmbient; // Bump texture else if (!ASSIMP_strincmp(&(*m_DataIt),"map_bump",8) || !ASSIMP_strincmp(&(*m_DataIt),"bump",4)) out = & m_pModel->m_pCurrentMaterial->textureBump; // Specularity scaling (glossiness) else if (!ASSIMP_strincmp(&(*m_DataIt),"map_ns",6)) out = & m_pModel->m_pCurrentMaterial->textureSpecularity; else { DefaultLogger::get()->error("OBJ/MTL: Encountered unknown texture type"); return; } std::string strTexture; m_DataIt = getName<DataArrayIt>( m_DataIt, m_DataItEnd, strTexture ); if ( m_DataItEnd == m_DataIt ) return; out->Set( strTexture ); }
/* ///////////////////////////////////////////////////////////////////////////// * Texture Option * ///////////////////////////////////////////////////////////////////////////// * According to http://en.wikipedia.org/wiki/Wavefront_.obj_file#Texture_options * Texture map statement can contains various texture option, for example: * * map_Ka -o 1 1 1 some.png * map_Kd -clamp on some.png * * So we need to parse and skip these options, and leave the last part which is * the url of image, otherwise we will get a wrong url like "-clamp on some.png". * * Because aiMaterial supports clamp option, so we also want to return it * ///////////////////////////////////////////////////////////////////////////// */ void ObjFileMtlImporter::getTextureOption(bool &clamp) { m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd); //If there is any more texture option while (!isEndOfBuffer(m_DataIt, m_DataItEnd) && *m_DataIt == '-') { const char *pPtr( &(*m_DataIt) ); //skip option key and value int skipToken = 1; if (!ASSIMP_strincmp(pPtr, ClampOption.c_str(), ClampOption.size())) { DataArrayIt it = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd); char value[3]; CopyNextWord(it, m_DataItEnd, value, sizeof(value) / sizeof(*value)); if (!ASSIMP_strincmp(value, "on", 2)) { clamp = true; } skipToken = 2; } else if ( !ASSIMP_strincmp(pPtr, BlendUOption.c_str(), BlendUOption.size()) || !ASSIMP_strincmp(pPtr, BlendVOption.c_str(), BlendVOption.size()) || !ASSIMP_strincmp(pPtr, BoostOption.c_str(), BoostOption.size()) || !ASSIMP_strincmp(pPtr, ResolutionOption.c_str(), ResolutionOption.size()) || !ASSIMP_strincmp(pPtr, BumpOption.c_str(), BumpOption.size()) || !ASSIMP_strincmp(pPtr, ChannelOption.c_str(), ChannelOption.size()) || !ASSIMP_strincmp(pPtr, TypeOption.c_str(), TypeOption.size()) ) { skipToken = 2; } else if (!ASSIMP_strincmp(pPtr, ModifyMapOption.c_str(), ModifyMapOption.size())) { skipToken = 3; } else if ( !ASSIMP_strincmp(pPtr, OffsetOption.c_str(), OffsetOption.size()) || !ASSIMP_strincmp(pPtr, ScaleOption.c_str(), ScaleOption.size()) || !ASSIMP_strincmp(pPtr, TurbulenceOption.c_str(), TurbulenceOption.size()) ) { skipToken = 4; } for (int i = 0; i < skipToken; ++i) { m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd); } } }
// ------------------------------------------------------------------- // Gets a texture name from data. void ObjFileMtlImporter::getTexture() { aiString *out( NULL ); int clampIndex = -1; const char *pPtr( &(*m_DataIt) ); if ( !ASSIMP_strincmp( pPtr, DiffuseTexture.c_str(), DiffuseTexture.size() ) ) { // Diffuse texture out = & m_pModel->m_pCurrentMaterial->texture; clampIndex = ObjFile::Material::TextureDiffuseType; } else if ( !ASSIMP_strincmp( pPtr,AmbientTexture.c_str(),AmbientTexture.size() ) ) { // Ambient texture out = & m_pModel->m_pCurrentMaterial->textureAmbient; clampIndex = ObjFile::Material::TextureAmbientType; } else if (!ASSIMP_strincmp( pPtr, SpecularTexture.c_str(), SpecularTexture.size())) { // Specular texture out = & m_pModel->m_pCurrentMaterial->textureSpecular; clampIndex = ObjFile::Material::TextureSpecularType; } else if ( !ASSIMP_strincmp( pPtr, OpacityTexture.c_str(), OpacityTexture.size() ) ) { // Opacity texture out = & m_pModel->m_pCurrentMaterial->textureOpacity; clampIndex = ObjFile::Material::TextureOpacityType; } else if (!ASSIMP_strincmp( pPtr,"map_ka",6)) { // Ambient texture out = & m_pModel->m_pCurrentMaterial->textureAmbient; clampIndex = ObjFile::Material::TextureAmbientType; } else if (!ASSIMP_strincmp(&(*m_DataIt),"map_emissive",6)) { // Emissive texture out = & m_pModel->m_pCurrentMaterial->textureEmissive; clampIndex = ObjFile::Material::TextureEmissiveType; } else if ( !ASSIMP_strincmp( pPtr, BumpTexture1.c_str(), BumpTexture1.size() ) || !ASSIMP_strincmp( pPtr, BumpTexture2.c_str(), BumpTexture2.size() ) || !ASSIMP_strincmp( pPtr, BumpTexture3.c_str(), BumpTexture3.size() ) ) { // Bump texture out = & m_pModel->m_pCurrentMaterial->textureBump; clampIndex = ObjFile::Material::TextureBumpType; } else if (!ASSIMP_strincmp( pPtr,NormalTexture.c_str(), NormalTexture.size())) { // Normal map out = & m_pModel->m_pCurrentMaterial->textureNormal; clampIndex = ObjFile::Material::TextureNormalType; } else if (!ASSIMP_strincmp( pPtr, DisplacementTexture.c_str(), DisplacementTexture.size() ) ) { // Displacement texture out = &m_pModel->m_pCurrentMaterial->textureDisp; clampIndex = ObjFile::Material::TextureDispType; } else if (!ASSIMP_strincmp( pPtr, SpecularityTexture.c_str(),SpecularityTexture.size() ) ) { // Specularity scaling (glossiness) out = & m_pModel->m_pCurrentMaterial->textureSpecularity; clampIndex = ObjFile::Material::TextureSpecularityType; } else { DefaultLogger::get()->error("OBJ/MTL: Encountered unknown texture type"); return; } bool clamp = false; getTextureOption(clamp); m_pModel->m_pCurrentMaterial->clamp[clampIndex] = clamp; std::string strTexture; m_DataIt = getName<DataArrayIt>( m_DataIt, m_DataItEnd, strTexture ); out->Set( strTexture ); }