//------------------------------------------------------------------------------
// 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
 */

#ifndef BLEND_SPRITE_STATE_H_
#define BLEND_SPRITE_STATE_H_

#include "Graphics2D/SpriteState/SpriteState.h"

namespace Lamp{

//------------------------------------------------------------------------------
/**
 * ブレンドスプライトステート
 */
class BlendSpriteState : public SpriteState{
public:
	//--------------------------------------------------------------------------
	// テンプレートステート
	//--------------------------------------------------------------------------
	/// 半透明
	static const BlendSpriteState translucent;

	/// 加算
	static const BlendSpriteState addState;

	/// デフォルト
	static const BlendSpriteState defaultState;

	//--------------------------------------------------------------------------
	// ブレンドモード
	//--------------------------------------------------------------------------
	/// ブレンドモード
	enum BlendMode{
		blendModeDisable = 0,
		blendModeAdd,
		blendModeSubtract,
		blendModeInverseSubtract,
		blendModeMinimum,
		blendModeMaximum,
		blendModeMax,
	};

	/**
	 * ブレンドモードから文字列への変換
	 * @param blendMode ブレンドモード
	 * @return ブレンドモード文字列
	 */
	static const String& blendModeToString(BlendMode blendMode);

	/**
	 * 文字列からブレンドモードへの変換
	 * @param blendModeString ブレンドモード文字列
	 * @return ブレンドモード
	 */
	static BlendMode blendModeFromString(const String& blendModeString);

	//--------------------------------------------------------------------------
	// ブレンドステート
	//--------------------------------------------------------------------------
	/// ブレンドステート
	enum BlendState{
		blendStateZero = 0,
		blendStateOne,
		blendStateSourceColor,
		blendStateInverseSourceColor,
		blendStateSourceAlpha,
		blendStateInverseSourceAlpha,
		blendStateSourceAlphaSaturate,
		blendStateDestinationColor,
		blendStateInverseDestinationColor,
		blendStateDestinationAlpha,
		blendStateInverseDestinationAlpha,
		blendStateMax,
	};

	/**
	 * ブレンドステートから文字列への変換
	 * @param blendState ブレンドステート
	 * @return ブレンドステート文字列
	 */
	static const String& blendStateToString(BlendState blendState);

	/**
	 * 文字列からブレンドステートへの変換
	 * @param blendStateString ブレンドステート文字列
	 * @return ブレンドステート
	 */
	static BlendState blendStateFromString(const String& blendStateString);

	//--------------------------------------------------------------------------
	// 生成、破棄
	//--------------------------------------------------------------------------
	/**
	 * コンストラクタ
	 */
	BlendSpriteState();

	/**
	 * コンストラクタ
	 * @param blendMode ブレンドモード
	 * @param blendSource ブレンドソース
	 * @param blendDestination ブレンドデスティネーション
	 */
	BlendSpriteState(BlendMode blendMode,
		BlendState blendSource, BlendState blendDestination);

	/**
	 * デストラクタ
	 */
	virtual ~BlendSpriteState();

	//--------------------------------------------------------------------------
	// デフォルトステート
	//--------------------------------------------------------------------------
	/**
	 * デフォルトステートの取得
	 * @return デフォルトステート
	 */
	virtual const SpriteRequest* getDefaultState() const{
		return &defaultState;
	}

	//--------------------------------------------------------------------------
	// 描画
	//--------------------------------------------------------------------------
	/**
	 * 適用
	 * @param renderState レンダーステート
	 */
	virtual void apply(SpriteRenderState* renderState);

	//--------------------------------------------------------------------------
	// ブレンド
	//--------------------------------------------------------------------------
	/**
	 * ブレンドモードの設定
	 * @param blendMode ブレンドモード
	 */
	virtual void setBlendMode(BlendMode blendMode){
		Assert((blendMode >= 0) && (blendMode < blendModeMax));
		blendMode_ = blendMode;
	}

	/**
	 * ブレンドモードの取得
	 * @return ブレンドモード
	 */
	virtual BlendMode getBlendMode() const{ return blendMode_; }

	/**
	 * ブレンドが有効か
	 * @return ブレンドが有効ならtrue
	 */
	virtual bool isBlendEnabled() const{
		return (blendMode_ != blendModeDisable);
	}

	//--------------------------------------------------------------------------
	/**
	 * ブレンドソースの設定
	 * @param blendSource ブレンドソース
	 */
	virtual void setBlendSource(BlendState blendSource){
		Assert((blendSource >= 0) && (blendSource < blendStateMax));
		blendSource_ = blendSource;
	}

	/**
	 * ブレンドソースの取得
	 * @return ブレンドソース
	 */
	virtual BlendState getBlendSource() const{ return blendSource_; }

	//--------------------------------------------------------------------------
	/**
	 * ブレンドデスティネーションの設定
	 * @param blendDestination ブレンドデスティネーション
	 */
	virtual void setBlendDestination(BlendState blendDestination){
		Assert((blendDestination >= 0) && (blendDestination < blendStateMax));
		blendDestination_ = blendDestination;
	}

	/**
	 * ブレンドデスティネーションの取得
	 * @return ブレンドデスティネーション
	 */
	virtual BlendState getBlendDestination() const{ return blendDestination_; }

private:
	//--------------------------------------------------------------------------
	// ブレンドモード
	BlendMode blendMode_;
	// ブレンドソース
	BlendState blendSource_;
	// ブレンドデスティネーション
	BlendState blendDestination_;

	// ブレンドモード文字列テーブル
	static const String blendModeStringTable[];
	// ブレンドステート文字列テーブル
	static const String blendStateStringTable[];

};

//------------------------------------------------------------------------------
} // End of namespace Lamp
#endif // End of BLEND_SPRITE_STATE_H_
//------------------------------------------------------------------------------
