//------------------------------------------------------------------------------
// 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 ADDRESS_MODE_SPRITE_STATE_H_
#define ADDRESS_MODE_SPRITE_STATE_H_

#include "Graphics2D/SpriteState/SpriteState.h"

namespace Lamp{

//------------------------------------------------------------------------------
/**
 * アドレスモードスプライトステート
 */
class AddressModeSpriteState : public SpriteState{
public:
	//--------------------------------------------------------------------------
	// テンプレートステート
	//--------------------------------------------------------------------------
	/// クランプ
	static const AddressModeSpriteState clampState;

	/// ラップ
	static const AddressModeSpriteState wrapState;

	/// ミラー
	static const AddressModeSpriteState mirrorState;

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

	//--------------------------------------------------------------------------
	// アドレスモード
	//--------------------------------------------------------------------------
	/// アドレスモード
	enum AddressMode{
		addressModeWrap = 0,
		addressModeClamp,
		addressModeMirror,
		addressModeMax,
	};

	/**
	 * アドレスモードから文字列への変換
	 * @param addressMode アドレスモード
	 * @return アドレスモード文字列
	 */
	static const String& addressModeToString(AddressMode addressMode);

	/**
	 * 文字列からアドレスモードへの変換
	 * @param addressModeString アドレスモード文字列
	 * @return アドレスモード
	 */
	static AddressMode addressModeFromString(const String& addressModeString);

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

	/**
	 * コンストラクタ
	 * @param addressModeU アドレスモードU
	 * @param addressModeV アドレスモードV
	 */
	AddressModeSpriteState(AddressMode addressModeU, AddressMode addressModeV);

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

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

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

	//--------------------------------------------------------------------------
	// アドレス
	//--------------------------------------------------------------------------
	/**
	 * アドレスモードの設定
	 * @param addressModeU アドレスモードU
	 * @param addressModeV アドレスモードV
	 */
	virtual void setAddressMode(
		AddressMode addressModeU, AddressMode addressModeV){
		Assert((addressModeU >= 0) && (addressModeU < addressModeMax));
		Assert((addressModeV >= 0) && (addressModeV < addressModeMax));
		addressModeU_ = addressModeU;
		addressModeV_ = addressModeV;
	}

	//--------------------------------------------------------------------------
	/**
	 * アドレスモードUの設定
	 * @param addressModeU アドレスモードU
	 */
	virtual void setAddressModeU(AddressMode addressModeU){
		Assert((addressModeU >= 0) && (addressModeU < addressModeMax));
		addressModeU_ = addressModeU;
	}

	/**
	 * アドレスモードUの取得
	 * @return アドレスモードU
	 */
	virtual AddressMode getAddressModeU() const{ return addressModeU_; }

	//--------------------------------------------------------------------------
	/**
	 * アドレスモードVの設定
	 * @param addressModeV アドレスモードV
	 */
	virtual void setAddressModeV(AddressMode addressModeV){
		Assert((addressModeV >= 0) && (addressModeV < addressModeMax));
		addressModeV_ = addressModeV;
	}

	/**
	 * アドレスモードVの取得
	 * @return アドレスモードV
	 */
	virtual AddressMode getAddressModeV() const{ return addressModeV_; }

private:
	//--------------------------------------------------------------------------
	// アドレスモードU
	AddressMode addressModeU_;
	// アドレスモードV
	AddressMode addressModeV_;

	// アドレスモード文字列テーブル
	static const String addressModeStringTable[];

};

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