//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * 基本シェーダ固定パイプライン実装
 * @author Junpee
 */

#include "LampBasic.h"
#include "Graphics/Shader/BasicShaderFixed.h"
#include "Graphics/Renderer/RenderingDevice.h"
#include "Graphics/Material/Material.h"

#include "Graphics/Texture/Texture.h"

namespace Lamp{

//------------------------------------------------------------------------------
// コンストラクタ
BasicShaderFixed::BasicShaderFixed(){
}
//------------------------------------------------------------------------------
// デストラクタ
BasicShaderFixed::~BasicShaderFixed(){
}
//------------------------------------------------------------------------------
// ステートブロックの構築
void BasicShaderFixed::buildStateBlock(
	Direct3DStateBlock** startBlock, Direct3DStateBlock** endBlock,
	Material* material, Texture* baseTexture, int baseUVIndex,
	Texture* lightTexture, int lightUVIndex, Texture* stainTexture,
	int stainUVIndex, const Color3f& diffuseColor,
	const Color3f& specularColor, const Color3f& ambientColor,
	const Color3f& emissiveColor, float specularPower){
	// 前処理
	Assert((startBlock != NULL) && (endBlock != NULL));
	Assert(((*startBlock) == NULL) && ((*endBlock) == NULL));

	//--------------------------------------------------------------------------
	// 描画開始ステートブロックの構築
	//--------------------------------------------------------------------------
	device_->beginStateBlock();
	// マテリアルの設定
	buildMaterialStart(material);
	// 固定機能ライティングのマテリアル設定
	device_->setMaterial(diffuseColor, specularColor, ambientColor,
		emissiveColor, specularPower, material->getAlpha());

	//--------------------------------------------------------------------------
	// カラーテクスチャステージの設定
	// スペキュラ項がテクスチャステージ後に足される為、GlossMapが行えない
	// Color = (Diffuse + light) * base * stain + Specular
	int colorStage = 0;
	// ライトテクスチャ、ライトUVインデックス
	colorStage = setFixedLightTexture(colorStage, lightTexture, lightUVIndex);

	// ベーステクスチャ、ベースUVインデックス
	int baseTextureStage = colorStage;
	if(baseTexture == NULL){ baseTextureStage = -1; }
	colorStage = setFixedBaseTexture(colorStage, baseTexture, baseUVIndex);

	// 汚れテクスチャ、汚れUVインデックス
	colorStage = setFixedStainTexture(colorStage, stainTexture, stainUVIndex);

	// カラーテクスチャステージを閉じる
	device_->closeColorTextureStage(colorStage);

	//--------------------------------------------------------------------------
	// アルファステクスチャテージの設定
	// Alpha = Diffuse.a * base
	device_->setAlphaTextureStage(baseTextureStage);

	//--------------------------------------------------------------------------
	// ステートブロックを閉じる
	(*startBlock) = device_->endStateBlock();

	//--------------------------------------------------------------------------
	// 描画終了ステートブロックの構築
	//--------------------------------------------------------------------------
	// 終了ステートブロック無し
//	device_->beginStateBlock();
	// マテリアルの設定
//	buildMaterialEnd(material);
//	(*endBlock) = device_->endStateBlock();

}
//------------------------------------------------------------------------------
// 描画
void BasicShaderFixed::draw(DrawRequest* request){
	// 描画のセットアップ
	setupFixedDraw(request);
	// 描画
	drawFixed(request);
	// 描画のリセット
	resetFixedDraw(request);
}
//------------------------------------------------------------------------------
} // End of namespace Lamp
//------------------------------------------------------------------------------
