void clASELoader::ASE_ReadMaterialList( iIStream* FStream ) { guard(); while ( !FStream->Eof() ) { LString Line = FStream->ReadLineTrimLeadSpaces(); if ( LStr::ContainsSubStr( Line, "}" ) ) { break; } else if ( LStr::StartsWith( Line, ASE_MaterialCount ) ) { int MaterialCount = LStr::ToInt( LStr::GetToken( Line, 2 ) ); FMaterialList.resize( MaterialCount ); } else if ( LStr::StartsWith( Line, ASE_Material ) ) { int MaterialIndex = LStr::ToInt( LStr::GetToken( Line, 2 ) ); //ASE_ReadMaterial( MaterialIndex, -1, 0 ); FMaterialList[ MaterialIndex ] = ASE_ReadMaterial( FStream, 0 ); } else { FATAL_MSG( "Unexpected token in " + ASE_MaterialList + " : " + Line ); } } unguard(); }
static int ASE_ReadMaterialList (CFILE *cfP, tASEModel *pm, int nType, int bCustom) { if (CharTok (" \t") != '{') return ASE_Error ("syntax error"); if (!(pszToken = ASE_ReadLine (cfP))) return ASE_Error ("unexpected end of file"); if (strcmp (pszToken, "*MATERIAL_COUNT")) return ASE_Error ("material count missing"); pm->textures.nBitmaps = IntTok (" \t"); if (!pm->textures.nBitmaps) return ASE_Error ("no bitmaps specified"); if (!(pm->textures.pBitmaps = (grsBitmap *) D2_ALLOC (pm->textures.nBitmaps * sizeof (grsBitmap)))) return ASE_Error ("out of memory"); if (!(pm->textures.pszNames = (char **) D2_ALLOC (pm->textures.nBitmaps * sizeof (char *)))) return ASE_Error ("out of memory"); if (!(pm->textures.nTeam = (ubyte *) D2_ALLOC (pm->textures.nBitmaps * sizeof (ubyte)))) return ASE_Error ("out of memory"); memset (pm->textures.pBitmaps, 0, pm->textures.nBitmaps * sizeof (grsBitmap)); memset (pm->textures.pszNames, 0, pm->textures.nBitmaps * sizeof (char *)); memset (pm->textures.nTeam, 0, pm->textures.nBitmaps * sizeof (ubyte)); while ((pszToken = ASE_ReadLine (cfP))) { if (*pszToken == '}') return 1; if (!strcmp (pszToken, "*MATERIAL")) { if (!ASE_ReadMaterial (cfP, pm, nType, bCustom)) return ASE_Error (NULL); } } return ASE_Error ("unexpected end of file"); }
//void clASELoader::ASE_ReadMaterial(int MaterialIndex, int SubMaterialIndex, int SubMaterialNesting) sASEMaterial clASELoader::ASE_ReadMaterial( iIStream* FStream, int SubMaterialNesting ) { guard(); sASEMaterial Material; while ( !FStream->Eof() ) { LString Line = FStream->ReadLineTrimLeadSpaces(); if ( LStr::ContainsSubStr( Line, "}" ) ) { break; } else if ( LStr::StartsWith( Line, ASE_MaterialName ) ) { // size_t TotalMTLSlots = FMaterialList.size(); //FATAL( MaterialIndex >= static_cast<int>( TotalMTLSlots ), //"Number of reserved material slots exceeded. Check for "+ASE_MaterialCount+" value in ASE file: " + FMesh->GetFileName() + "(reserved: "+LStr::ToStr( TotalMTLSlots ) + ", requested: "+LStr::ToStr(MaterialIndex)+")" ); Material.FName = LStr::GetToken( Line, 2 ); #ifdef ASE_HEAVY_DEBUG Env->Logger->Log( L_DEBUG, "Reading material: " + Material.FName ); #endif } else if ( LStr::StartsWith( Line, ASE_MaterialClass ) ) { Material.FClass = LStr::GetToken( Line, 2 ); } else if ( LStr::StartsWith( Line, ASE_MaterialAmbient ) ) { Material.FAmbient = LVector3( LStr::ToFloat( LStr::GetToken( Line, 2 ) ), LStr::ToFloat( LStr::GetToken( Line, 3 ) ), LStr::ToFloat( LStr::GetToken( Line, 4 ) ) ); } else if ( LStr::StartsWith( Line, ASE_MaterialDiffuse ) ) { Material.FDiffuse = LVector3( LStr::ToFloat( LStr::GetToken( Line, 2 ) ), LStr::ToFloat( LStr::GetToken( Line, 3 ) ), LStr::ToFloat( LStr::GetToken( Line, 4 ) ) ); } else if ( LStr::StartsWith( Line, ASE_MaterialSpecular ) ) { Material.FSpecular = LVector3( LStr::ToFloat( LStr::GetToken( Line, 2 ) ), LStr::ToFloat( LStr::GetToken( Line, 3 ) ), LStr::ToFloat( LStr::GetToken( Line, 4 ) ) ); } else if ( LStr::StartsWith( Line, ASE_MaterialShine ) ) { Material.FShine = LStr::ToFloat( LStr::GetToken( Line, 2 ) ); } else if ( LStr::StartsWith( Line, ASE_MaterialShineStrength ) ) { Material.FShineStrength = LStr::ToFloat( LStr::GetToken( Line, 2 ) ); } else if ( LStr::StartsWith( Line, ASE_MaterialTransparency ) ) { Material.FTransparency = LStr::ToFloat( LStr::GetToken( Line, 2 ) ); } else if ( LStr::StartsWith( Line, ASE_MaterialWireSize ) ) { Material.FWireSize = LStr::ToFloat( LStr::GetToken( Line, 2 ) ); } else if ( LStr::StartsWith( Line, ASE_MaterialShading ) ) { Material.FShading = LStr::GetToken( Line, 2 ); } else if ( LStr::StartsWith( Line, ASE_MaterialXPFalloff ) ) { Material.FXPFallOff = LStr::ToFloat( LStr::GetToken( Line, 2 ) ); } else if ( LStr::StartsWith( Line, ASE_MaterialSelfIllum ) ) { Material.FSelfIllum = LStr::ToFloat( LStr::GetToken( Line, 2 ) ); } else if ( LStr::StartsWith( Line, ASE_MaterialFalloff ) ) { Material.FFallOff = LStr::GetToken( Line, 2 ); } else if ( LStr::StartsWith( Line, ASE_MaterialXPType ) ) { Material.FXPType = LStr::GetToken( Line, 2 ); } else if ( LStr::StartsWith( Line, ASE_SubMaterialCount ) ) { int SubMaterialCount = LStr::ToInt( LStr::GetToken( Line, 2 ) ); if ( Material.FSubMaterials.size() == 0 ) { // don't redefine submaterials Material.FSubMaterials.resize( SubMaterialCount ); } } else if ( LStr::StartsWith( Line, ASE_SubMaterial ) ) { int SubMaterialIndex = LStr::ToInt( LStr::GetToken( Line, 2 ) ); #ifdef ASE_HEAVY_DEBUG Env->Logger->Log( L_NOTICE, "Found submaterial:" + LStr::ToStr( SubMaterialIndex ) ); #endif // if ( SubMaterialNesting < 1 ) // don't read sub-submaterials... Material.FSubMaterials[ SubMaterialIndex ] = ASE_ReadMaterial( FStream, SubMaterialNesting + 1 ); } else if ( LStr::StartsWith( Line, ASE_MaterialMapAmbient ) ) { ASE_ReadMap( FStream, &Material.FAmbientMap ); } else if ( LStr::StartsWith( Line, ASE_MaterialMapDiffuse ) ) { ASE_ReadMap( FStream, &Material.FDiffuseMap ); } else if ( LStr::StartsWith( Line, ASE_MaterialMapSpecular ) ) { ASE_ReadMap( FStream, &Material.FSpecularMap ); } else if ( LStr::StartsWith( Line, ASE_MaterialMapBump ) ) { ASE_ReadMap( FStream, &Material.FBumpMap ); } else { ASE_SkipBlock( FStream, Line ); } } /* // add to list if ( SubMaterialIndex == -1 ) { Env->Logger->Log( L_NOTICE, "Material:" + LString( Material.FName ) ); FMaterialList[ MaterialIndex ].FDefaultMeterial = Material; } else { Env->Logger->Log( L_NOTICE, "SubMaterial:" + LString( Material.FName ) ); size_t TotalMTLSlots = FMaterialList[ MaterialIndex ].FSubMaterials.size(); FATAL( SubMaterialIndex >= static_cast<int>( TotalMTLSlots ), "Number of reserved submaterial slots exceeded. Check for "+ASE_SubMaterialCount+" value in ASE file. " + "(reserved: "+LStr::ToStr( TotalMTLSlots ) + ", requested: "+LStr::ToStr(SubMaterialIndex)+")" ); FMaterialList[ MaterialIndex ].FSubMaterials[ SubMaterialIndex ] = Material; }*/ return Material; unguard(); }