Esempio n. 1
0
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;
}