Bool CMaterialResource::Init()
{
	CXMLDocument document;
	document.Load( m_FilePath.c_str() );

	CXMLNode rootNode = document.GetRootNode();

	//Read out textures
	CXMLNode childNode = rootNode.GetChildNode( "Texture2D" );

	while ( childNode.IsEmpty() == false )
	{
		CXMLAttribute attribute = childNode.GetAttribute( "Hash" );
		const Uint hash = (Uint)strtoul( attribute.GetValue(), NULL, 0 );
		AddDependentHash( hash );
		childNode = childNode.GetNextSibling();
	}

	if ( m_DependenciesLeft == 0 )
	{
		return true;
	}

	return false;
}
void CMaterialResource::Load()
{
	m_IsLoaded = true;
	CXMLDocument document;
	document.Load( m_FilePath.c_str() );

	CXMLNode rootNode = document.GetRootNode();
	//Read out shaders
	CXMLNode childNode = rootNode.GetChildNode( "Shader" );
	CXMLAttribute attribute = childNode.GetAttribute( "File" );

	std::string shaderPath; shaderPath += "../Content/";
	shaderPath += attribute.GetValue();
	
	//Read out defines
	childNode = rootNode.GetChildNode( "ShaderDefine" );

	while ( childNode.IsEmpty() == false )
	{
		attribute = childNode.GetAttribute( "Name" );
		const Char* name = attribute.GetValue( "" );
		if ( strcmp( name, "" ) != 0 )
		{
			m_ShaderDefines.push_back( name );
		}
		childNode = childNode.GetNextSibling();
	}

	//Build hash
	Uint hash = HashString( shaderPath.c_str() );
	hash += m_ShaderDefines.size();
	for ( Uint i = 0; i < m_ShaderDefines.size(); ++i )
	{
		hash += HashString( m_ShaderDefines[i].c_str() );
	}

	CResource* shaderResource;
	if ( ( shaderResource = CResourceManager::GetInstance()->GetResourceByHash( hash ) ) == NULL )
	{
		shaderResource = CResourceManager::GetInstance()->AddShaderResource( shaderPath.c_str(), hash, m_ShaderDefines );
	}

	m_ShaderResource = (CShaderResource*)shaderResource;
	m_Shader = m_ShaderResource->GetShader();

	//Read terms
	childNode = rootNode.GetChildNode( "Terms" );
	//Emmisive
	CXMLNode termNode = childNode.GetChildNode( "Emissive" );
	attribute = termNode.GetAttribute( "R" ); m_EmissiveTerm.X = (Float)atof( attribute.GetValue() );
	attribute = termNode.GetAttribute( "G" ); m_EmissiveTerm.Y = (Float)atof( attribute.GetValue() );
	attribute = termNode.GetAttribute( "B" ); m_EmissiveTerm.Z = (Float)atof( attribute.GetValue() );
	//Diffuse
	termNode = childNode.GetChildNode( "Diffuse" );
	attribute = termNode.GetAttribute( "R" ); m_DiffuseTerm.X = (Float)atof( attribute.GetValue() );
	attribute = termNode.GetAttribute( "G" ); m_DiffuseTerm.Y = (Float)atof( attribute.GetValue() );
	attribute = termNode.GetAttribute( "B" ); m_DiffuseTerm.Z = (Float)atof( attribute.GetValue() );
	//Specular
	termNode = childNode.GetChildNode( "Specular" );
	attribute = termNode.GetAttribute( "R" ); m_SpecularTerm.X = (Float)atof( attribute.GetValue() );
	attribute = termNode.GetAttribute( "G" ); m_SpecularTerm.Y = (Float)atof( attribute.GetValue() );
	attribute = termNode.GetAttribute( "B" ); m_SpecularTerm.Z = (Float)atof( attribute.GetValue() );
	//Ambient
	termNode = childNode.GetChildNode( "Ambient" );
	attribute = termNode.GetAttribute( "R" ); m_AmbientTerm.X = (Float)atof( attribute.GetValue() );
	attribute = termNode.GetAttribute( "G" ); m_AmbientTerm.Y = (Float)atof( attribute.GetValue() );
	attribute = termNode.GetAttribute( "B" ); m_AmbientTerm.Z = (Float)atof( attribute.GetValue() );
	//Specular power
	termNode = childNode.GetChildNode( "SpecularPower" );	
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "Value" ); 
		m_SpecularPower = (Float)atof( attribute.GetValue( "1.0f" ) );
	}

	termNode = childNode.GetChildNode( "Reflection" );	
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "Value" ); 
		m_Reflection = (Float)atof( attribute.GetValue( "0.0f" ) );
	}

	termNode = childNode.GetChildNode( "Refraction" );	
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "Value" ); 
		m_Refraction = (Float)atof( attribute.GetValue( "0.0f" ) );
	}	

	termNode = childNode.GetChildNode( "Transmittance" );	
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "Value" ); 
		m_Transmittance = (Float)atof( attribute.GetValue( "0.0f" ) );
	}

	termNode = childNode.GetChildNode( "FresnelPower" );	
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "Value" ); 
		m_FresnelValues.X = (Float)atof( attribute.GetValue( "1.0f" ) );
	}

	termNode = childNode.GetChildNode( "FresnelScale" );
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "Value" ); 
		m_FresnelValues.Y = (Float)atof( attribute.GetValue( "1.0f" ) );
	}

	termNode = childNode.GetChildNode( "FresnelBias" );
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "Value" ); 
		m_FresnelValues.Z = (Float)atof( attribute.GetValue( "0.0f" ) );
	}

	termNode = childNode.GetChildNode( "TextureWeight" );
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "Value" ); 
		m_TextureWeight = (Float)atof( attribute.GetValue( "0.0f" ) );
	}

	termNode = childNode.GetChildNode( "ParallaxScale" );
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "Value" ); 
		m_ParallaxScale = (Float)atof( attribute.GetValue( "0.0f" ) );
	}


	termNode = childNode.GetChildNode( "ParallaxBias" );
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "Value" ); 
		m_ParallaxBias = (Float)atof( attribute.GetValue( "0.0f" ) );
	}

	termNode = childNode.GetChildNode( "RefractiveIndices" );
	if ( termNode.IsEmpty() == false )
	{
		attribute = termNode.GetAttribute( "R" ); m_RefractiveIndices.X = (Float)atof( attribute.GetValue( "1.0f" ) );
		attribute = termNode.GetAttribute( "G" ); m_RefractiveIndices.Y = (Float)atof( attribute.GetValue( "1.0f" ) );
		attribute = termNode.GetAttribute( "B" ); m_RefractiveIndices.Z = (Float)atof( attribute.GetValue( "1.0f" ) );
	}

	//Read out textures
	childNode = rootNode.GetChildNode( "Texture2D" );

	while ( childNode.IsEmpty() == false )
	{
		attribute = childNode.GetAttribute( "Name" );
		const Char* name = attribute.GetValue();

		attribute = childNode.GetAttribute( "Hash" );
		const Uint hash = (Uint)strtoul( attribute.GetValue(), NULL, 0 );
		//Check if the resource already exists and is loaded		
		CResource* resource = m_DependentResources.find( hash )->second;
		Uint textureID = 0;
		if ( resource != NULL )
		{
			CTextureResource* textureResource = (CTextureResource*)resource;
			if ( textureResource->IsLoaded() )
			{
				textureID = textureResource->GetTextureID();
			}
		}

		attribute = childNode.GetAttribute( "Type" );
		const Char* type = attribute.GetValue();
		attribute = childNode.GetAttribute( "UVChannel" );
		const Uint uvChannel = atoi( attribute.GetValue() );
		attribute = childNode.GetAttribute( "Mapping" );
		const Char* mapping = attribute.GetValue();
		
		CXMLNode mapNode = childNode.GetChildNode( "MapMode" );
		attribute = mapNode.GetAttribute( "X" );
		const Char* mapModeX = attribute.GetValue();
		attribute = mapNode.GetAttribute( "Y" );
		const Char* mapModeY = attribute.GetValue();
		
		TextureMapMode mapModes[2];
		mapModes[0] = (TextureMapMode)ConvertMapMode( mapModeX );
		mapModes[1] = (TextureMapMode)ConvertMapMode( mapModeY );
		CTexture2D* texture = new CTexture2D( name, hash, (TextureMapping)ConvertMapping( mapping ), mapModes, (TextureMapType)ConvertTextureType( type ), uvChannel, textureID );
		m_2DTextures.push_back( texture );
		childNode = childNode.GetNextSibling();
	}

	childNode = rootNode.GetChildNode( "TextureCube" );

	while ( childNode.IsEmpty() == false )
	{
		attribute = childNode.GetAttribute( "FileBase" );
		const Char* fileBase = attribute.GetValue();

		attribute = childNode.GetAttribute( "UniformName" );
		const Char* uniformName = attribute.GetValue();

		attribute = childNode.GetAttribute( "Extension" );
		const Char* extension = attribute.GetValue();

		CTextureCube* texture = new CTextureCube( fileBase, uniformName, extension );
		m_3DTextures.push_back( texture );
		childNode = childNode.GetNextSibling();
	}	


}