/*---------------------------------------------------------------------------

    NN Material library for DXG20

    Copyright (C) 2002, 2003 SEGA Corporation Creative Center Graphics Sect.
    All Rights Reserved.

    Module  : NN Material Library for DXG20
    File    : nnlmaterialxe.h
    Create  : 2003/06/05
    Modify  : 2003/06/05
    Modify  : 2003/07/14 Xbox,PC共通化向けの修正
    Modify  : 2008/11/18 nnGetMaterialControlShadowMapDXG20 関数名を nnGetMaterialControlShadowMapStateDXG20 に変更
    Modify  : 2008/11/25 nnSetSamplerStateDXG20 を新規に追加
	                     NNM_RGBAtoARGB8888DXG20 を新規に追加
						 NNM_RGBA8888toARGB8888DXG20 を新規に追加
    Modify  : 2009/05/12 ヘッダ整理
    Version : 0.01.03
    Note    :

---------------------------------------------------------------------------*/
#ifndef __NNLMATERIALDXG20_H__
#define __NNLMATERIALDXG20_H__

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/*** マテリアルコントロール ***/

#define	NNM_RGBAtoARGB8888DXG20( r, g, b, a )	(((((Uint32)((a) * 255.0f)) & 0xff) << 24)	\
												|((((Uint32)((r) * 255.0f)) & 0xff) << 16)	\
												|((((Uint32)((g) * 255.0f)) & 0xff) <<  8)	\
												|((((Uint32)((b) * 255.0f)) & 0xff)))

#define	NNM_RGBA8888toARGB8888DXG20( r, g, b, a )	(( ((a) & 0xff) << 24)	\
													|( ((r) & 0xff) << 16)	\
													|( ((g) & 0xff) <<  8)	\
													|( ((b) & 0xff) ))

typedef enum {
	/* 2008.06.24(D3DSAMPLERSTATETYPE と同様で、0 からにしてある) */
	NNE_SAMPLERSTATETYPE_ADDRESSU = 0,
	NNE_SAMPLERSTATETYPE_ADDRESSV,
	NNE_SAMPLERSTATETYPE_ADDRESSW,
	NNE_SAMPLERSTATETYPE_BORDERCOLOR,
	NNE_SAMPLERSTATETYPE_MAGFILTER,
	NNE_SAMPLERSTATETYPE_MINFILTER,
	NNE_SAMPLERSTATETYPE_MIPFILTER,
	NNE_SAMPLERSTATETYPE_MIPMAPLODBIAS,
	NNE_SAMPLERSTATETYPE_MAXMIPLEVEL,
	NNE_SAMPLERSTATETYPE_MAXANISOTROPY,
	NNE_SAMPLERSTATETYPE_SRGBTEXTURE,
	NNE_SAMPLERSTATETYPE_ELEMENTINDEX,
	NNE_SAMPLERSTATETYPE_DMAPOFFSET,

	NNE_SAMPLERSTATETYPE_MAX
} NNE_SAMPLERSTATETYPE_DXG20;

typedef enum {
	NNE_TEXTURETYPE_NORMAL,
	NNE_TEXTURETYPE_BASE,
	NNE_TEXTURETYPE_DECAL,
	NNE_TEXTURETYPE_DECAL2,
	NNE_TEXTURETYPE_DECAL3,
	NNE_TEXTURETYPE_SPECULAR,
	NNE_TEXTURETYPE_SHININESS,
	NNE_TEXTURETYPE_ENVMASK,
	NNE_TEXTURETYPE_MODULATE,
	NNE_TEXTURETYPE_ADD,
	NNE_TEXTURETYPE_OPACITY,
	NNE_TEXTURETYPE_USER1,
	NNE_TEXTURETYPE_USER2,
	NNE_TEXTURETYPE_USER3,
	NNE_TEXTURETYPE_USER4,
	NNE_TEXTURETYPE_USER5,
	NNE_TEXTURETYPE_USER6,
	NNE_TEXTURETYPE_USER7,
	NNE_TEXTURETYPE_USER8,
	NNE_TEXTURETYPE_DUALPARABOLOID,

	NNE_TEXTURETYPE_MAX,
} NNE_TEXTURETYPE_DXG20;

typedef enum {
	NNE_SHADOWMAP_1 = 0,
	NNE_SHADOWMAP_2,

	NNE_SHADOWMAP_MAX,
} NNE_SHADOWMAP;

typedef enum {
	NNE_USER_SAMPLER_2D_1,
	NNE_USER_SAMPLER_2D_2,
	NNE_USER_SAMPLER_3D_1,
	NNE_USER_SAMPLER_3D_2,
	NNE_USER_SAMPLER_CUBE_1,
	NNE_USER_SAMPLER_CUBE_2,

	NNE_USER_SAMPLER_MAX,
} NNE_USER_SAMPLER;

typedef struct{
	NNE_MATCTRLMODE		mode;
	Float				bias;
} NNS_MATCTRL_TEXLODBIAS;

/* サンプラステートの設定 */
void nnSetSamplerStateDXG20( Sint32 slot, const Uint32 state[NNE_SAMPLERSTATETYPE_MAX] );

/* デフォルトサンプラの関数 */
/*   デフォルトサンプラのデフォルトのサンプラステートを取得 */
void nnGetMaterialControlDefaultSamplerDefaultStateDXG20(Uint32 state[NNE_SAMPLERSTATETYPE_MAX]);
/*   デフォルトサンプラの機能の初期化 */
void nnInitMaterialControlDefaultSamplerDXG20(void);
/*   デフォルトのサンプラ設定 */
void nnSetMaterialControlDefaultSamplerDXG20( const Uint32 state[NNE_SAMPLERSTATETYPE_MAX] );
/*   デフォルトサンプラの現在のサンプラステートを取得 */
void nnGetMaterialControlDefaultSamplerStateDXG20( Uint32 state[NNE_SAMPLERSTATETYPE_MAX] );

/**/
/*  テクスチャタイプ別UVオフセット設定 */
void nnSetMaterialControlTextureOffsetDXG20( NNE_TEXTURETYPE_DXG20 textype, NNE_MATCTRLMODE mode, Float u, Float v );
/*  テクスチャLODバイアス設定 */
void nnSetMaterialControlTextureLodBiasDXG20( NNE_TEXTURETYPE_DXG20 textype, NNE_MATCTRLMODE mode, Float bias );


/* シャドウマップの関数　*/
/*   シャドウマップのデフォルトのサンプラステートを取得 */
void nnGetMaterialControlShadowMapDefaultStateDXG20(Uint32 state[NNE_SAMPLERSTATETYPE_MAX] );
/*   シャドウマップの機能の初期化 */
void nnInitMaterialControlShadowMapDXG20(void);
/*   シャドウマップの設定 */
void nnSetMaterialControlShadowMapDXG20( NNE_SHADOWMAP idx, LPDIRECT3DTEXTURE9 texmap, const NNS_MATRIX44 *mtx, Float r, Float g, Float b, const Uint32 state[NNE_SAMPLERSTATETYPE_MAX] );
/*   シャドウマップの現在のサンプラステートを返す */
void nnGetMaterialControlShadowMapStateDXG20( NNE_SHADOWMAP idx, Uint32 state[NNE_SAMPLERSTATETYPE_MAX] );


/* ユーザーサンプラの関数 */
/*   ユーザーサンプラのデフォルトのサンプラステートを取得 */
void nnGetMaterialControlUserSamplerDefaultStateDXG20(Uint32 state[NNE_SAMPLERSTATETYPE_MAX]);
/*   ユーザーサンプラの機能の初期化 */
void nnInitMaterialControlUserSamplerDXG20(void);
/*   ユーザーサンプラの設定 */
void nnSetMaterialControlUserSamplerDXG20( NNE_USER_SAMPLER idx, LPDIRECT3DBASETEXTURE9 texmap, const NNS_MATRIX44 *mtx, const Uint32 state[NNE_SAMPLERSTATETYPE_MAX]);
/*   ユーザーサンプラの現在のサンプラステートを取得 */
void nnGetMaterialControlUserSamplerStateDXG20(NNE_USER_SAMPLER idx, Uint32 state[NNE_SAMPLERSTATETYPE_MAX]);


/* デュアルパラボロイド環境マップマトリクス設定 */
void nnSetDualParaboloidMatrixDXG20( NNS_MATRIX *mtx );


/* NN内部管理グローバル変数 */
typedef struct {
	Uint32				state[NNE_SAMPLERSTATETYPE_MAX];	/* 2008.06.24( NNE_SAMPLERSTATETYPE_DXG20 で参照( D3DSAMP_ADDRESSU-1 〜 D3DSAMP_DMAPOFFSET-1 にして参照が可能 ) ) */
} NNS_MATCTRL_DEFAULTSAMPLER;

typedef struct {
	LPDIRECT3DTEXTURE9	texmap;
	NNS_MATRIX44		mtx;
	NNS_RGB				col;
	Uint32				state[NNE_SAMPLERSTATETYPE_MAX];	/* 2008.06.24( NNE_SAMPLERSTATETYPE_DXG20 で参照( D3DSAMP_ADDRESSU-1 〜 D3DSAMP_DMAPOFFSET-1 にして参照が可能 ) ) */
} NNS_MATCTRL_SHADOWMAP;

typedef struct {
	LPDIRECT3DBASETEXTURE9	texmap;
	NNS_MATRIX44			mtx;
	Uint32					state[NNE_SAMPLERSTATETYPE_MAX];	/* 2008.06.24( NNE_SAMPLERSTATETYPE_DXG20 で参照( D3DSAMP_ADDRESSU-1 〜 D3DSAMP_DMAPOFFSET-1 にして参照が可能 ) ) */
} NNS_MATCTRL_USERSAMPLER;

extern NNS_MATCTRL_RGB 			nngMatCtrlDiffuse;
extern NNS_MATCTRL_RGB 			nngMatCtrlAmbient;
extern NNS_MATCTRL_RGB 			nngMatCtrlSpecular;
extern NNS_MATCTRL_ALPHA 		nngMatCtrlAlpha;
extern NNS_MATCTRL_ENVTEXMATRIX nngMatCtrlEnvTexMtx;
extern NNS_MATCTRL_BLENDMODE	nngMatCtrlBlendMode;
extern NNS_MATCTRL_TEXOFFSET	nngMatCtrlTexOffset[NNE_TEXSLOT_MAX];

extern NNS_MATCTRL_TEXOFFSET	nngMatCtrlTexOffsetDXG20[NNE_TEXTURETYPE_MAX];
extern NNS_MATCTRL_TEXLODBIAS	nngMatCtrlTexLodBias[NNE_TEXTURETYPE_MAX];

/* 2008.06.24 */
extern NNS_MATCTRL_DEFAULTSAMPLER nngMatCtrlDefaultSampler;
/* 2008.06.17 */
extern NNS_MATCTRL_SHADOWMAP nngMatCtrlShadowMap[NNE_SHADOWMAP_MAX];
/* 2008.06.23 */
extern NNS_MATCTRL_USERSAMPLER nngMatCtrlUserSampler[NNE_USER_SAMPLER_MAX];
/* 2008.06.05 */
extern NNS_MATRIX nngDualParaboloidMatrix;


#define nnSetMatCtrlDiffuseMode( mode ) nngMatCtrlDiffuse.mode = mode
#define nnSetMatCtrlDiffuseRGB( r, g, b ) { nngMatCtrlDiffuse.col.r = r;\
													nngMatCtrlDiffuse.col.g = g;\
													nngMatCtrlDiffuse.col.b = b}
#define nnSetMatCtrlDiffuseR( r ) nngMatCtrlDiffuse.col.r = r
#define nnSetMatCtrlDiffuseG( g ) nngMatCtrlDiffuse.col.g = g
#define nnSetMatCtrlDiffuseB( b ) nngMatCtrlDiffuse.col.b = b

#define nnSetMatCtrlAmbientMode( mode ) nngMatCtrlAmbient.mode = mode
#define nnSetMatCtrlAmbientRGB( r, g, b ) { nngMatCtrlAmbient.col.r = r;\
													nngMatCtrlAmbient.col.g = g;\
													nngMatCtrlAmbient.col.b = b}
#define nnSetMatCtrlAmbientR( r ) nngMatCtrlAmbient.col.r = r
#define nnSetMatCtrlAmbientG( g ) nngMatCtrlAmbient.col.g = g
#define nnSetMatCtrlAmbientB( b ) nngMatCtrlAmbient.col.b = b

#define nnSetMatCtrlSpecularMode( mode ) nngMatCtrlSpecular.mode = mode
#define nnSetMatCtrlSpecularRGB( r, g, b ) { nngMatCtrlSpecular.col.r = r;\
													nngMatCtrlSpecular.col.g = g;\
													nngMatCtrlSpecular.col.b = b}
#define nnSetMatCtrlSpecularR( r ) nngMatCtrlSpecular.col.r = r
#define nnSetMatCtrlSpecularG( g ) nngMatCtrlSpecular.col.g = g
#define nnSetMatCtrlSpecularB( b ) nngMatCtrlSpecular.col.b = b

#define nnSetMatCtrlAlphaMode( mode ) nngMatCtrlAlpha.mode = mode
#define nnSetMatCtrlAlphaAlpha( a ) nngMatCtrlAlpha.alpha = a

#define nnSetMatCtrlEnvTexMtxTexCoodSrc( texcoordsrc ) nngMatCtrlEnvTexMtx.texcoordsrc = texcoordsrc
#define nnSetMatCtrlEnvTexMtxTexMtx( texmtx ) nngMatCtrlEnvTexMtx.texmtx = texmtx

#define nnGetMatCtrlDiffuseMode() nngMatCtrlDiffuse.mode
#define nnGetMatCtrlDiffuseR() nngMatCtrlDiffuse.col.r
#define nnGetMatCtrlDiffuseG() nngMatCtrlDiffuse.col.g
#define nnGetMatCtrlDiffuseB() nngMatCtrlDiffuse.col.b

#define nnGetMatCtrlAmbientMode() nngMatCtrlAmbient.mode
#define nnGetMatCtrlAmbientR() nngMatCtrlAmbient.col.r
#define nnGetMatCtrlAmbientG() nngMatCtrlAmbient.col.g
#define nnGetMatCtrlAmbientB() nngMatCtrlAmbient.col.b

#define nnGetMatCtrlSpecularMode() nngMatCtrlSpecular.mode
#define nnGetMatCtrlSpecularR() nngMatCtrlSpecular.col.r
#define nnGetMatCtrlSpecularG() nngMatCtrlSpecular.col.g
#define nnGetMatCtrlSpecularB() nngMatCtrlSpecular.col.b

#define nnGetMatCtrlAlphaMode() nngMatCtrlAlpha.mode
#define nnGetMatCtrlAlpha() nngMatCtrlAlpha.alpha

#define nnGetMatCtrlEnvTexMtxTexCoodSrc() nngMatCtrlEnvTexMtx.texcoordsrc
#define nnGetMatCtrlEnvTexMtxTexMtx() nngMatCtrlEnvTexMtx.texmtx

#define nnGetMatCtrlBlendMode() nngMatCtrlBlendMode.blendmode


NNE_BOOL nnPutMaterialCoreStdShader( const NNS_DRAWCALLBACK_VAL *val );

#if 0 /* 現状意味がないので(2008.05.22) */
#if 1 /* 2008.05.20 */
/* *** マテリアルコールバック専用関数 */
/* ユーザユニフォーム変数設定 */
void nnPutUserUniformDXG20( const NNS_DRAWCALLBACK_VAL *val );
#endif
#endif

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __NNLMATERIALDXG20_H__ */

/* End of file */
