//---------------------------------------------------------------------------------- // dump material textures void DumpTexture(m_material *pMat, IGameMaterial *pGMaxMat) { std::vector<tex_channel> bk_tex_channel; std::vector<unsigned int> bk_tex_idx; std::vector<MatTextureInfo> TexInfos; int texCount = pGMaxMat->GetNumberOfTextureMaps(); for (int i = 0; i < texCount; ++i) { IGameTextureMap * pGMaxTex = pGMaxMat->GetIGameTextureMap(i); int tex_type = pGMaxTex->GetStdMapSlot(); if (pGMaxTex->IsEntitySupported() && tex_type >= 0) //its a bitmap texture { MatTextureInfo TexInfo; tex_channel tc; TexInfo.mat_id = pMat->id; m_texture * pTex = new m_texture; std::string pathname = pGMaxTex->GetBitmapFileName(); int idx = (int)pathname.rfind('\\'); if (idx == INDEX_NONE){ idx = (int)pathname.rfind('/'); } std::string filename = pathname.substr(idx + 1, INDEX_NONE); pTex->name = filename; // set the texture xform... IGameUVGen *pUVGen = pGMaxTex->GetIGameUVGen(); GMatrix UVMat = pUVGen->GetUVTransform(); TexInfo.tex_mat = pTex->tex_mat = (scalar*)UVMat.GetAddr(); // save mapping matrix // get the uv channel to use... Texmap *pTMap = pGMaxTex->GetMaxTexmap(); BitmapTex *pBTex = (BitmapTex*)pTMap; StdUVGen *pStdUVGen = pBTex->GetUVGen(); if (pStdUVGen){ tc.channel = pStdUVGen->GetMapChannel() - 1; } IParamBlock2 *pUVWCropParam = (IParamBlock2*)(pBTex->GetReference(1)); if (pUVWCropParam) { pUVWCropParam->GetValue(0, ExporterMAX::GetExporter()->GetStaticFrame(), TexInfo.uv_offset.x, FOREVER); pUVWCropParam->GetValue(1, ExporterMAX::GetExporter()->GetStaticFrame(), TexInfo.uv_offset.y, FOREVER); pUVWCropParam->GetValue(2, ExporterMAX::GetExporter()->GetStaticFrame(), TexInfo.uv_scale.x, FOREVER); pUVWCropParam->GetValue(3, ExporterMAX::GetExporter()->GetStaticFrame(), TexInfo.uv_scale.y, FOREVER); } // set the type of texture... pTex->type = texture_type[tex_type]; // if we have a bump map, we create a normal map with the convention // that the filename will be the same name as the bump map + "_normal" // appended to it. if (pTex->type == m_texture::BUMP) { std::string normal_map = pTex->name; std::string::size_type pos = normal_map.rfind("."); normal_map.insert(pos, "_normal"); m_texture *pTexNormal = new m_texture; *pTexNormal = *pTex; pTexNormal->name = normal_map; pTexNormal->type = m_texture::NORMAL; tc.pTex = pTexNormal; bk_tex_channel.push_back(tc); // add the new texture to the local TOC TexInfos.push_back(TexInfo); } tc.pTex = pTex; bk_tex_channel.push_back(tc); // add the new texture to the local TOC TexInfos.push_back(TexInfo); } } // lets check if we don't have them already in our global TOC... for (size_t index = 0; index < bk_tex_channel.size(); ++index) { m_texture * pTex = bk_tex_channel[index].pTex; unsigned int idx = ExporterMAX::GetExporter()->FindTexture(pTex); if (idx == INDEX_NONE){ idx = ExporterMAX::GetExporter()->AddTexture(pTex); // add the new texture to the TOC } bk_tex_idx.push_back(idx); pMat->tex_channel.push_back(bk_tex_channel[index].channel); TexInfos[index].base_channel = bk_tex_channel[index].channel; bk_texs.insert(IdxBKTexMapPair(idx, TexInfos[index])); } // set the texture indices... for (size_t index = 0; index < bk_tex_idx.size(); ++index){ pMat->textures.push_back(bk_tex_idx[index]); } }