
#ifndef __SCENE_H__
#define __SCENE_H__

/*--------------------
   組み込みファイル名
  --------------------*/
#include <nn.h>

/* CAMERA */
typedef
	struct{
		NNS_VECTOR		Rotation;		/* カメラの回転 */
		NNS_VECTOR		Position;		/* カメラの座標 */
		NNS_VECTOR		Interest;		/* ターゲットの座標 */
		
		Float			NearPlane;		// 手前のクリッピング座標
		Float			FarPlane;		// 奥のクリッピング座標

		Float			FieldOfView;	// 画角
    }CAMERA;

/* LIGHT */
typedef
	struct{
		/* パラレル光源又は 点光源 */
		NNF_LIGHTTYPE 	Type;			/* ライトのタイプ */
		void			*pLight;

		NNS_RGBA		Color;
		Float			Intensity;
		NNS_VECTOR		Position;
		Float			FallOffStart;
		Float			FallOffEnd;
    }LIGHT;

/* MODEL */
typedef
	struct{
		NNE_BOOL		RenderToTexFlg;	/* NNE_ON のときテクスチャに描画される */

		NNS_VECTOR		Scaling;		/* モデルのスケール */
		NNS_VECTOR		Translation;	/* モデルの座標 */
		NNS_MATRIX		*pMatrix;		/* モデルのマトリクス(align(16)されているのでポインタにしてある) */

		NNS_OBJECT		*pObject;		/* メモリの解放をしなくて良い */
#if 1 /* 2008.09.10 */
		NNS_OBJECT		*pObjectBuf;	/* オブジェクトのメモリ */
#else
		NNS_OBJECT		*pObjectBase;
		void		    *pObjectDataBuf;
#endif
		NNS_PLIABLEOBJ	*pPliableObject;
		NNS_MATRIX		*pMtxList;		/* マトリクスリストの先頭 */
		NNS_MATRIX		*pMtxPal;		/* マトリクスパレット先頭 */
		NNF_NODESTATUS	*pNodestatList;	/* ノードステータスリスト先頭 */
		NNS_TEXLIST		*pTexList;
		void			*pTexListBuf;	/* テクスチャ情報領域用バッファ */

		NNS_MOTION		*pMotion;		/* モーションデータの先頭(メモリの解放をしなくて良い)*/
		NNS_MOTION		*pMotionMat;	/* マテリアルのモーションデータの先頭(メモリの解放をしなくて良い) */

		void			*pMotionBuf;	/* モーションのメモリ */
		void			*pMotionMatBuf;	/* マテリアルのモーションのメモリ */

		NNS_MATMOTOBJ	*pMatMotObj;	/* マテリアルモーションオブジェクト */
	}MODEL;

/* SCENE */
typedef
	struct{
		Sint32	NbCamera;	/* カメラ */
		CAMERA	*pCamera;

		Sint32	NbLight;	/* ライト */
		LIGHT	*pLight;

		Sint32	NbModel;	/* モデル */
		MODEL	*pModel;

		Float	StartFrame;	/* モーションの最初のフレーム番号 */
		Float	EndFrame;	/* モーションの最後のフレーム番号 */
		Float	CurrentFrame;
		Float	Step;
    }SCENE;

#ifdef EXT
# undef EXT
#endif

#ifndef __SCENE_C__
# define EXT extern
#else
# define EXT
#endif

#ifdef __cplusplus
extern "C" {
#endif

EXT CAMERA *CameraAllocate(Uint32 nb);				/* CAMERA のメモリの確保 */
EXT void CameraDispose(Sint32 nbCam, CAMERA *cam);	/* CAMERA のメモリの解放 */

EXT LIGHT *LightAllocate(Uint32 nb);				/* LIGHT のメモリの確保 */
EXT void LightDispose(Sint32 nbLit, LIGHT *lit);	/* LIGHT のメモリの解放 */

EXT MODEL *ModelAllocate(Uint32 nb);				/* MODEL のメモリの確保 */
EXT void ModelDispose(Sint32 nbMdl, MODEL *mdl);	/* MODEL のメモリの解放 */

EXT SCENE *SceneAllocate(void);						/* SCENE のメモリの確保 */
EXT void SceneDispose(SCENE **scn);					/* SCENE のメモリの解放 */

#ifdef __cplusplus
}
#endif

#endif	/* ifndef __SCENE_H__ */
