ETHShaderManager::ETHShaderManager(VideoPtr video, const str_type::string& shaderPath, const bool richLighting) :
	m_lastAM(Video::AM_PIXEL),
	m_fakeEyeManager(new ETHFakeEyePositionManager),
	m_richLighting(richLighting)
{
	m_video = video;

	Shader::SHADER_PROFILE sp = Shader::SP_MODEL_2;
	#ifdef OPENGL
	 sp = Shader::SP_MODEL_1;
	#endif

	m_defaultVS = m_video->LoadShaderFromFile(ETHGlobal::GetDataResourceFullPath(shaderPath, ETHShaders::DefaultVS()).c_str(), Shader::SF_VERTEX, sp);
	m_particle  = m_video->LoadShaderFromFile(ETHGlobal::GetDataResourceFullPath(shaderPath, ETHShaders::Particle_VS()).c_str(), Shader::SF_VERTEX, sp);
	m_defaultStaticAmbientVS  = m_video->LoadShaderFromFile(ETHGlobal::GetDataResourceFullPath(shaderPath, ETHShaders::Ambient_VS_Hor()).c_str(), Shader::SF_VERTEX, sp);
	m_verticalStaticAmbientVS = m_video->LoadShaderFromFile(ETHGlobal::GetDataResourceFullPath(shaderPath, ETHShaders::Ambient_VS_Ver()).c_str(), Shader::SF_VERTEX, sp);
	m_shadowVS = m_video->LoadShaderFromFile(ETHGlobal::GetDataResourceFullPath(shaderPath, ETHShaders::Shadow_VS_Ver()).c_str(), Shader::SF_VERTEX, sp);

	#if defined(GLES2) || defined(OPENGL)
		m_projShadow = m_video->CreateSprite(ETHGlobal::GetDataResourceFullPath(shaderPath, GS_L("shadow.png")));
	#else
		m_projShadow = m_video->CreateSprite(ETHGlobal::GetDataResourceFullPath(shaderPath, GS_L("shadow.dds")));
	#endif

	m_opaqueSprite = m_video->CreateSprite(ETHGlobal::GetDataResourceFullPath(shaderPath, GS_L("default_nm.png")));

	if (m_richLighting)
	{
		// Not yet implemented on GLES2
		#if !defined(GLES2)
		  {ETHLightingProfilePtr profile(new ETHVertexLightDiffuse(m_video, shaderPath));
		  if (profile->IsSupportedByHardware())
		  {
			 m_lightingProfiles[VERTEX_LIGHTING_DIFFUSE] = profile;
		  }}
		#endif

		{ETHLightingProfilePtr profile(new ETHPixelLightDiffuseSpecular(m_video, shaderPath, m_fakeEyeManager));
		if (profile->IsSupportedByHardware())
		{
			m_lightingProfiles[PIXEL_LIGHTING_DIFFUSE_SPECULAR] = profile;
		}}
	}

	if (m_lightingProfiles.empty())
	{
		video->Message(GS_L("ETHShaderManager::ETHShaderManager: no lighting profile"), GSMT_WARNING);
	}
	else
	{
		m_currentProfile = FindHighestLightingProfile();
	}
}
void ETHShaderManager::UsePS(const bool usePS)
{
	if (!m_lightingProfiles.empty())
	{
		if (usePS)
			m_currentProfile = FindHighestLightingProfile();
		else
			m_currentProfile = m_lightingProfiles.find(VERTEX_LIGHTING_DIFFUSE)->second;
	}
	else
	{
		m_video->Message(GS_L("ETHShaderManager::UsePS: no lighting profile"), GSMT_WARNING);
	}
}
ETHShaderManager::ETHShaderManager(VideoPtr video, const str_type::string& shaderPath) :
	m_lastAM(GSAM_PIXEL), m_fakeEyeManager(new ETHFakeEyePositionManager)
{
	m_video = video;

	m_defaultVS = m_video->LoadShaderFromFile(ETHGlobal::GetDataResourceFullPath(shaderPath, ETHShaders::DefaultVS()).c_str(), GSSF_VERTEX, GSSP_MODEL_2);
	m_particle  = m_video->LoadShaderFromFile(ETHGlobal::GetDataResourceFullPath(shaderPath, ETHShaders::Particle_VS()).c_str(), GSSF_VERTEX, GSSP_MODEL_2, "particle");
	m_defaultStaticAmbientVS  = m_video->LoadShaderFromFile(ETHGlobal::GetDataResourceFullPath(shaderPath, ETHShaders::Ambient_VS_Hor()).c_str(), GSSF_VERTEX, GSSP_MODEL_2);
	m_verticalStaticAmbientVS = m_video->LoadShaderFromFile(ETHGlobal::GetDataResourceFullPath(shaderPath, ETHShaders::Ambient_VS_Ver()).c_str(), GSSF_VERTEX, GSSP_MODEL_2, "vertical");
	m_shadowVS = m_video->LoadShaderFromFile(ETHGlobal::GetDataResourceFullPath(shaderPath, ETHShaders::Shadow_VS_Ver()).c_str(), GSSF_VERTEX, GSSP_MODEL_2);

	// TODO/TO-DO: use a wider macro here
	#ifndef ANDROID
		m_projShadow = m_video->CreateSprite(ETHGlobal::GetDataResourceFullPath(shaderPath, GS_L("shadow.dds")));
	#else
		m_projShadow = m_video->CreateSprite(ETHGlobal::GetDataResourceFullPath(shaderPath, GS_L("shadow.png")));
	#endif

	{
		ETHLightingProfilePtr profile(new ETHVertexLightDiffuse(m_video, shaderPath));
		if (profile->IsSupportedByHardware())
		{
			m_lightingProfiles[VERTEX_LIGHTING_DIFFUSE] = profile;
		}
	}
	{
		ETHLightingProfilePtr profile(new ETHPixelLightDiffuseSpecular(m_video, shaderPath, m_fakeEyeManager));
		if (profile->IsSupportedByHardware())
		{
			m_lightingProfiles[PIXEL_LIGHTING_DIFFUSE_SPECULAR] = profile;
		}
	}

	if (m_lightingProfiles.empty())
	{
		video->Message(GS_L("ETHShaderManager::ETHShaderManager: no lighting profile"), GSMT_WARNING);
	}
	else
	{
		m_currentProfile = FindHighestLightingProfile();
	}
}