/**
 * @file
 * @brief 3Dスプライト属性の定義を行う.
 * 
 * @author S.F.
 * @version $Id:
 *
 * Copyright (C) 2000-2002 Satoshi Fujiwara. All Rights Reserved.*/

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

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "sf.h"
#include "Obj.h"
extern "C" {
namespace sf{
	namespace system{
		namespace console {
/** 3Dスプライト属性クラスの定義 */
class SFDLL Obj3D : public Obj  
{
	// LIFECYCLE //
public:
	/// コンストラクタ
	Obj3D();
	/// デストラクタ
	virtual ~Obj3D();
	// OPERATORS //
	// OPERATIONS //
	
	// ACCESS //
	
	/** スクリーンX座標を設定する
	 * @param value スクリーンX座標 */
	void x(float value);
	
	/** 現在設定されているスクリーンX座標を取得する
	 * @return value スクリーンX座標 */
	const float x(void) const {return mX;};
	
	/** 現在設定されているワールド空間X座標を取得する
	 * @return ワールド空間X座標 */
	const float spaceX(void) const {return mSpaceX;};
		
	/** スクリーンY座標を設定する
	 * @param value スクリーンY座標 */
	void y(const float value);
	
	/** 現在設定されているスクリーンY座標を取得する
	 * @return value スクリーンY座標 */
	const float y(void) const { return mY;};
	
	/** 現在設定されているワールド空間Y座標を取得する
	 * @return ワールド空間Y座標 */
	const float spaceY(void) const {return mSpaceY;};

	/** スクリーンZ座標を設定する
	 * @param value スクリーンZ座標 */
	void  z(const float value);
	
	/** 現在設定されているスクリーンZ座標を取得する
	 * @return value スクリーンZ座標 */
	const float  z(void) const {return mZ;};

	/** 現在設定されているワールド空間Z座標を取得する
	 * @return ワールド空間Z座標 */
	const float spaceZ(void) const { return mSpaceZ;};

	/** X回転角(ラジアン 0-2π)を取得する 
	 * @return 回転角 0-2π */
	const float angleX(void) const {return mAngleX;};
	/** X回転角(ラジアン 0-2π)を設定する 
	 * @param value X回転角 */
	void  angleX(const float value);

	/** Y回転角(ラジアン 0-2π)を取得する 
	 * @return 回転角 0-2π */
	const float angleY(void) const {return mAngleY;};
	/** Y回転角(ラジアン 0-2π)を設定する 
	 * @param value Y回転角 */
	void  angleY(const float value);

	/** Z回転角(ラジアン 0-2π）を取得する 
	 @return 回転角 0-2π */
	const float angleZ(void){return mAngleZ;};
	/** Z回転角(ラジアン 0-2π）を設定する 
	 @param value Z回転角 */
	void  angleZ(const float value);

	// 
	/** X回転角のCos値を取得する 
	* @return X回転角のCos値 */
	const float rotXCos(void) const { return mRotXCos;};
	/** X回転角のSin値を取得する 
	* @return X回転角のSin値 */
	const float rotXSin(void) const { return mRotXSin;};

	/** Y回転角のCos値を取得する 
	* @return Y回転角のCos値 */
	const float rotYCos(void) const { return mRotYCos;};
	/** Y回転角のSin値を取得する 
	* @return Y回転角のSin値 */
	const float rotYSin(void) const { return mRotYSin;};

	/** Z回転角のCos値を取得する 
	* @return Z回転角のCos値 */
	const float rotZCos(void) const { return mRotZCos;};
	/** Z回転角のSin値を取得する 
	* @return Z回転角のSin値 */
	const float rotZSin(void) const { return mRotZSin;};

	// スケーリング

	/** X拡大縮小率 を取得する
	 * @return X拡大縮小率 */
	const float scalingX(void) const {return mScalingX;};
	/** X拡大縮小率 を設定する
	 * @param value  X拡大縮小率 */
	void  scalingX(const float value){mScalingX = value;};

	/** Y拡大縮小率を取得する 
	 * @return Y拡大縮小率 */
	const float scalingY(void) const {return mScalingY;};
	/** Y拡大縮小率 を設定する
	 * @param value  Y拡大縮小率 */
	void  scalingY(const float value){mScalingY = value;};

	// Z
	/** Z拡大縮小率を取得する 
	 * @return Z拡大縮小率 */
	const float scalingZ(void) const {return mScalingZ;};
	/** Z拡大縮小率 を設定する
	 * @param value  Z拡大縮小率 */
	void  scalingZ(const float value){mScalingZ = value;};

	void drawMode(const DrawMode value) { mDrawMode = value;};
	const DrawMode drawMode() const {return mDrawMode;}
	
	// スプライトのアドレス //
	virtual sprite::Sprite * const sprite() const {return mpSprite;};
	virtual void sprite(sprite::Sprite* const value){ mpSprite = value;};

	virtual const int index() const { return mIndex;};
	virtual void index(const int value) { mIndex = value;};
	
	const bool visibility() const {return mbVisibility;};
	void visibility(const bool value){ mbVisibility = value;};
	
	Obj * const previous() const   {return mpPrevious;};
	void previous(Obj * const value){mpPrevious = value;};
	
	Obj * const next() const {return mpNext;};
	void next(Obj * const value){mpNext = value;};
	// INQUIRY //
private:
	// スクリーン座標
	float mX;///< スクリーン座標X
	float mY;///< スクリーン座標Y
	float mZ;///< スクリーン座標Z

	// ワールド空間座標
	float mSpaceX;///< ワールド空間座標X
	float mSpaceY;///< ワールド空間座標Y
	float mSpaceZ;///< ワールド空間座標Z
	
	float mAngleX;///< X回転角（ラジアン 0-2π）
	float mAngleY;///< Y回転角（ラジアン 0-2π）
	float mAngleZ;///< Z回転角（ラジアン 0-2π）

	float mRotXSin;///< X回転角のSin値
	float mRotYSin;///< X回転角のSin値
	float mRotZSin;///< X回転角のSin値
	float mRotXCos;///< X回転角のCos値
	float mRotYCos;///< X回転角のCos値
	float mRotZCos;///< X回転角のCos値
	
	float mScalingX;///< X拡大縮小率
	float mScalingY;///< Y拡大縮小率
	float mScalingZ;///< Z拡大縮小率
	
	bool mbVisibility;///< 表示するかしないか
	sprite::Sprite *mpSprite;///< sprite::Spriteインターフェースのポインタ
	int mIndex;///< 表示インデックス
	DrawMode mDrawMode;///< DrawMode
	Obj* mpPrevious;///< 前のObjインターフェース
	Obj* mpNext;///< 次のObjインターフェース

};
		}
	}
}
}
#endif // !defined(AFX_OBJ3D_H__6F81DB0E_4F49_491D_9D09_E729679CE97A__INCLUDED_)
