// TODO: All of these Get() functions look very similar. // Keep them all for their interface, but have them call a common function //----------------------------------------------------------------------------- CPUTMaterial *CPUTAssetLibrary::GetMaterial(const cString &name, bool nameIsFullPathAndFilename, const cString &modelSuffix, const cString &meshSuffix) { // Resolve name to absolute path before searching CPUTOSServices *pServices = CPUTOSServices::GetOSServices(); cString absolutePathAndFilename; pServices->ResolveAbsolutePathAndFilename( nameIsFullPathAndFilename? name : (mMaterialDirectoryName + name + _L(".mtl")), &absolutePathAndFilename); // If we already have one by this name, then return it CPUTMaterial *pMaterial = FindMaterial(absolutePathAndFilename, true); if(NULL==pMaterial) { // We don't already have it in the library, so create it. pMaterial = CPUTMaterial::CreateMaterial( absolutePathAndFilename, modelSuffix, meshSuffix ); return pMaterial; } else if( (0==modelSuffix.length()) && !pMaterial->MaterialRequiresPerModelPayload() ) { // This material doesn't have per-model elements, so we don't need to clone it. pMaterial->AddRef(); return pMaterial; } #ifdef _DEBUG // We need to clone the material. Do that by loading it again, but with a different name. // Add the model's suffix (address as string, plus model's material array index as string) CPUTMaterial *pUniqueMaterial = FindMaterial(absolutePathAndFilename + modelSuffix + meshSuffix, true); ASSERT( NULL == pUniqueMaterial, _L("Unique material already not unique: ") + absolutePathAndFilename + modelSuffix + meshSuffix ); #endif CPUTMaterial *pClonedMaterial = pMaterial->CloneMaterial( absolutePathAndFilename, modelSuffix, meshSuffix ); AddMaterial( absolutePathAndFilename + modelSuffix + meshSuffix, pClonedMaterial ); return pClonedMaterial; }
CPUTMaterial *CPUTMaterial::CreateMaterial( const cString &absolutePathAndFilename, const CPUTModel *pModel, int meshIndex ) { // material was not in the library, so load it #ifdef CPUT_FOR_DX11 CPUTMaterial *pMaterial = new CPUTMaterialDX11(); #else #error You must supply a target graphics API (ex: #define CPUT_FOR_DX11), or implement the target API for this file. #endif CPUTResult result = pMaterial->LoadMaterial(absolutePathAndFilename, pModel, meshIndex); ASSERT( CPUTSUCCESS(result), _L("\nError - CPUTAssetLibrary::GetMaterial() - Error in material file: '")+absolutePathAndFilename+_L("'") ); // add material to material library list if( pModel && pMaterial->MaterialRequiresPerModelPayload() ) { CPUTAssetLibrary::GetAssetLibrary()->AddMaterial( absolutePathAndFilename, pMaterial, pModel, meshIndex ); } else { CPUTAssetLibrary::GetAssetLibrary()->AddMaterial( absolutePathAndFilename, pMaterial ); } return pMaterial; }