//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007-2008)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: constant_table_d3d9.cpp
//      Краткое описание: Constant table for effect for directx 9 platform
//

#ifdef GD_D3D9

#include <Darkstar/Graphic System/Effect/constant_table.hpp>
#include <Darkstar/Graphic System/Direct3D/graphicDriver.hpp>
#include <Darkstar/Kernel/logh.hpp>

using gs::GraphicDriver;
using gs::Constant;
using gs::ConstantTable;
using gs::CONSTANT_TYPE;
using gs::PS_CONST;
using gs::VS_CONST;
using gs::ShaderReflection;
using gs::ShaderBoundResource;
using gs::ShaderVariable;
using ker::Log;

bool ConstantTable::setBoolArray(const std::string& name, const bool* values, unsigned int count)
{
	std::pair<storage::iterator, storage::iterator> it_range = constants.equal_range(name);
	storage::iterator it;
	if(it_range.second == it_range.first)
		return false;
	for(it = it_range.first; it != it_range.second; ++it)
	{
		Constant con = it->second;
		if(con.type == VS_CONST)
			GraphicDriver::ptr()->getDevice()->SetVertexShaderConstantB(con.register_index, (BOOL*)values, count);
		else
			GraphicDriver::ptr()->getDevice()->SetPixelShaderConstantB(con.register_index, (BOOL*)values, count);
	};
	return true;
};

bool ConstantTable::setFloatArray(const std::string& name, const float* values, unsigned int count)
{
	std::pair<storage::iterator, storage::iterator> it_range = constants.equal_range(name);
	storage::iterator it;
	if(it_range.second == it_range.first)
		return false;
	for(it = it_range.first; it != it_range.second; ++it)
	{
		Constant con = it->second;
		if(con.type == VS_CONST)
			GraphicDriver::ptr()->getDevice()->SetVertexShaderConstantF(con.register_index, values, count);
		else
			GraphicDriver::ptr()->getDevice()->SetPixelShaderConstantF(con.register_index, values, count);
	};
	return true;
};

bool ConstantTable::setIntArray(const std::string& name, const int* values, unsigned int count)
{
	std::pair<storage::iterator, storage::iterator> it_range = constants.equal_range(name);
	storage::iterator it;
	if(it_range.second == it_range.first)
		return false;
	for(it = it_range.first; it != it_range.second; ++it)
	{
		Constant con = it->second;
		if(con.type == VS_CONST)
			GraphicDriver::ptr()->getDevice()->SetVertexShaderConstantI(con.register_index, values, count);
		else
			GraphicDriver::ptr()->getDevice()->SetPixelShaderConstantI(con.register_index, values, count);
	};
	return true;
};

#endif