/**
 * @file
 * @brief Sprite2D実装クラス関連の定義を行う.
 * 
 * 
 * @author S.F.
 * @version $Id:
 *
 * Copyright (C) 2000-2002 Satoshi Fujiwara. All Rights Reserved.
 */


/// 重複インクルード防止マクロ
#if !defined(AFX_SPRITE2D_H__6DA7673D_29FF_4B0A_838E_FE14D70C7E27__INCLUDED_)
#define AFX_SPRITE2D_H__6DA7673D_29FF_4B0A_838E_FE14D70C7E27__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "sf.h" 
#include "Console.h"
extern "C" {
namespace sf{
	namespace system{
		namespace console {
			namespace sprite {
				/** 2Dスプライトの定義を行う.
 					2Dスプライト用のテクスチャを保持するオブジェクトです。<br>
				*/
				class Sprite2D : public AbstractSprite  
				{
					// LIFECYCLE //
				public:
					/** コンストラクタ 
					 * @param pD3DDevice Direct3D Deviceへのポインタ */
					Sprite2D(LPDIRECT3DDEVICE9 pD3DDevice);
					/** デストラクタ.*/
					virtual ~Sprite2D();
					// OPERATIONS //
					
					/// Sprite2D実装クラスの初期化を行う
					void initialize(void);
					
					/** Sprite2D実装クラスの初期化を行う.
					 *  @param pD3DDevice Direct3D Deviceへのポインタ*/ 
					void initialize(LPDIRECT3DDEVICE9	pD3DDevice);
					/** 終了処理を行う */
					void uninitialize(void);
					/** テクスチャデータのロード 
					 @param pInfo sprite::Info のポインタ 
					 @textureFormat D3DFORMAT  
					 @color console::COLOR */
					void load(const sprite::Info *pInfo,const D3DFORMAT textureFormat,const COLOR color);
					void draw(const ObjRectangle * const pObj);
					void draw(const ObjQuadrangle * const pObj);
					void draw(const Obj3DL * const pObj){return;};
					
					const float width(void) const 
					{
						if(mCellWidth != 0.0f)
							return mCellWidth;
						return mWidth;
					};

					const float height(void) const {
						if(mCellHeight != 0.0f)
							return mCellHeight;
						return mHeight;
					};

				private:
					/** テクスチャのUV座標を計算する.
					 * sprite::Obj2D の情報を元に、表示範囲を求めます。
					 * @param pObj Obj2D のポインタ 
					 * @param u1 開始u座標 
					 * @param u2 終了u座標 
					 * @param v1 開始v座標 
					 * @param v2 終了v座標 */
					void calcUVPos(const Obj2D * const pObj,float& u1,float& u2,float& v1,float& v2);
					IDirect3DTexture9* mpSpriteTexture;///< スプライトテクスチャのポインタ
					IDirect3DVertexBuffer8* mpSpriteVtBuf;///< VertexBuffer8 のポインタ

					float mCellWidth;///< セルの幅(テクスチャはこの幅で論理的に分割される)
					float mCellHeight;///< セルの高さ(テクスチャはこの高さで論理的に分割される)
					float mCellCount;///< セルの数(論理的に分割された後のテクスチャの数）

				};// SpriteImpl
			}
		}
	}
}
}
#endif // !defined(AFX_SPRITE2D_H__6DA7673D_29FF_4B0A_838E_FE14D70C7E27__INCLUDED_)
