bool CSimpleMesh::LoadMaterials(CString szFileName) { TArray<CString> m_oTextureNames; FILE *file = fopen(szFileName, "rt"); if (!file) return false; char szLine[MAX_LINE_LEN]; CString *ppsTokens; int iNumTokens; int iNumMaterials = 0; while (fgets(szLine, MAX_LINE_LEN, file)) { CString sLine(szLine); sLine.ToUpper(); if (sLine.StartsWith("NEWMTL")) { CMaterial oMaterial; m_oMaterials.Append(oMaterial); sLine.Tokenize(&ppsTokens, &iNumTokens, sDelimiters); m_oMaterialNames.Append(ppsTokens[1]); SAFE_DELETE_ARRAY(ppsTokens); iNumMaterials++; //m_oTextureNames.Append(NULL); m_oMaterialsTextureIndex.Append(NO_TEXTURE); } else if (sLine.StartsWith("KA")) { sLine.Tokenize(&ppsTokens, &iNumTokens, sDelimiters); CMaterial *oMaterial = &m_oMaterials[m_oMaterials.GetSize() - 1]; CColor *poColor = oMaterial->GetAmbientColor(); poColor->red = ppsTokens[1].ToFloat(); poColor->green = ppsTokens[2].ToFloat(); poColor->blue = ppsTokens[3].ToFloat(); SAFE_DELETE_ARRAY(ppsTokens); } else if (sLine.StartsWith("KD")) { sLine.Tokenize(&ppsTokens, &iNumTokens, sDelimiters); CMaterial *oMaterial = &m_oMaterials[m_oMaterials.GetSize() - 1]; CColor *poColor = oMaterial->GetDiffuseColor(); poColor->red = ppsTokens[1].ToFloat(); poColor->green = ppsTokens[2].ToFloat(); poColor->blue = ppsTokens[3].ToFloat(); SAFE_DELETE_ARRAY(ppsTokens); } else if (sLine.StartsWith("KS")) { sLine.Tokenize(&ppsTokens, &iNumTokens, sDelimiters); CMaterial *oMaterial = &m_oMaterials[m_oMaterials.GetSize() - 1]; CColor *poColor = oMaterial->GetSpecularColor(); poColor->red = ppsTokens[1].ToFloat(); poColor->green = ppsTokens[2].ToFloat(); poColor->blue = ppsTokens[3].ToFloat(); SAFE_DELETE_ARRAY(ppsTokens); } else if (sLine.StartsWith("NS")) { sLine.Tokenize(&ppsTokens, &iNumTokens, sDelimiters); CMaterial *oMaterial = &m_oMaterials[m_oMaterials.GetSize() - 1]; oMaterial->SetPower(ppsTokens[1].ToFloat()); SAFE_DELETE_ARRAY(ppsTokens); } else if (sLine.StartsWith("MAP_KD") || sLine.StartsWith("MAP_KA")) { sLine.Tokenize(&ppsTokens, &iNumTokens, sDelimiters); CString sTextureName(ppsTokens[1].StartsWith(".\\") ? ppsTokens[1].GetBuffer() + 2 : ppsTokens[1]); int index = m_oTextureNames.Find(sTextureName); if (index == -1) { m_oTextureNames.Append(sTextureName); m_oMaterialsTextureIndex[m_oMaterials.GetSize() - 1] = m_oTextureNames.GetSize() - 1; } else { m_oMaterialsTextureIndex[m_oMaterials.GetSize() - 1] = index; } SAFE_DELETE_ARRAY(ppsTokens); } } fclose(file); for (int i = 0; i < m_oTextureNames.GetSize(); i++) m_oTextures.Append(new CTexture(m_poDisplayDevice, m_oTextureNames[i].GetBuffer())); return true; }