コード例 #1
0
ファイル: ASE.cpp プロジェクト: berezhkovskaya/Carousel3D
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();
}
コード例 #2
0
ファイル: aseread.cpp プロジェクト: paud/d2x-xl
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");
}
コード例 #3
0
ファイル: ASE.cpp プロジェクト: berezhkovskaya/Carousel3D
//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();
}