/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### Shark 3D Engine (www.shark3d.com) // ########## # # # // ######## Copyright (c) 1996-2006 Spinor GmbH. // ######### # # # All rights reserved. // ## ########## // ## // /////////////////////////////////////////////////////////////////////////////// //@cpp #ifndef S3D_DRV_D3D9_PROGASM_H #define S3D_DRV_D3D9_PROGASM_H #include "drv_d3d9_prog.h" #include "drv_d3d9_util.h" #include "lib/stream/lib_stream_prepro.h" #include "util/snk/util_snk_extract.h" /////////////////////////////////////////////////////////////////////////////// typedef s3d_CUtilIntArray s3d_CDrvD3d9ProgAsmAddrArray; /////////////////////////////////////////////////////////////////////////////// struct s3d_CDrvD3d9ProgAsmTrackMat { int m_Addr; int m_Chan; int m_Slot; int m_Cnt; int m_Trans; s3d_CDrvD3d9ProgAsmTrackMat(); }; typedef s3d_CUtilArray s3d_CDrvD3d9ProgAsmTrackMatArray; /////////////////////////////////////////////////////////////////////////////// struct s3d_CDrvD3d9ProgAsmLight { int m_PosAddr; int m_DirAddr; int m_AmbientAddr; int m_DiffuseAddr; int m_SpecularAddr; int m_AttenAddr; s3d_CDrvD3d9ProgAsmLight(); }; typedef s3d_CUtilArray s3d_CDrvD3d9ProgAsmLightArray; /////////////////////////////////////////////////////////////////////////////// struct s3d_CDrvD3d9ProgAsmTrackMtrl { int m_PowerAddr; int m_EmissiveAddr; s3d_CDrvD3d9ProgAsmTrackMtrl(); }; /////////////////////////////////////////////////////////////////////////////// struct s3d_CDrvD3d9ProgAsmParam { s3d_CUtilStr m_Info; int m_Addr; int m_Type; bool m_HadError; s3d_CDrvD3d9ProgAsmParam(); }; typedef s3d_CUtilKeyEntry s3d_CDrvD3d9ProgAsmParamEntry; typedef s3d_CUtilArray s3d_CDrvD3d9ProgAsmParamArray; /////////////////////////////////////////////////////////////////////////////// //@ struct s3d_CDrvD3d9ProgAsmTrackBlk { s3d_CUtilStr m_CodeName; s3d_CUtilStr m_CodeInfo; s3d_CDrvD3d9ProgAsmParamArray m_ParamArray; s3d_CDrvD3d9ProgAsmAddrArray m_TexSizeArray; s3d_CDrvD3d9ProgAsmAddrArray m_TexRcpSizeArray; s3d_CDrvD3d9ProgAsmTrackMatArray m_MatTrackArray; s3d_CDrvD3d9ProgAsmTrackMatArray m_BoneTrackArray; int m_ActiveLightCntAddr; s3d_CDrvD3d9ProgAsmLightArray m_LightTrackArray; s3d_CDrvD3d9ProgAsmTrackMtrl m_Mtl; int m_FogAddr; virtual void SetShaderConstF( s3d_CDrvD3d9ProgCtx *ProgCtx, UINT ConstAddr, const float *ConstVal, UINT ConstCnt) const = 0; virtual void SetShaderConstI( s3d_CDrvD3d9ProgCtx *ProgCtx, UINT ConstAddr, const int *ConstVal, UINT ConstCnt) const = 0; s3d_CDrvD3d9ProgAsmTrackBlk(); }; /////////////////////////////////////////////////////////////////////////////// //@ struct s3d_CDrvD3d9ProgAsmTrackBlkVert : public s3d_CDrvD3d9ProgAsmTrackBlk { void SetShaderConstF( s3d_CDrvD3d9ProgCtx *ProgCtx, UINT ConstAddr, const float *ConstVal, UINT ConstCnt) const; void SetShaderConstI( s3d_CDrvD3d9ProgCtx *ProgCtx, UINT ConstAddr, const int *ConstVal, UINT ConstCnt) const; }; /////////////////////////////////////////////////////////////////////////////// //@ struct s3d_CDrvD3d9ProgAsmTrackBlkPix : public s3d_CDrvD3d9ProgAsmTrackBlk { void SetShaderConstF( s3d_CDrvD3d9ProgCtx *ProgCtx, UINT ConstAddr, const float *ConstVal, UINT ConstCnt) const; void SetShaderConstI( s3d_CDrvD3d9ProgCtx *ProgCtx, UINT ConstAddr, const int *ConstVal, UINT ConstCnt) const; }; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9ProgAsm : public s3d_CDrvD3d9Prog { public: s3d_CDrvD3d9ProgAsm( s3d_CUtilNotifGather *NotifGather, s3d_CUtilStr_cr Info, s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilSnkChunk *ParamVert, s3d_CUtilSnkChunk *ParamPix); void TrackParams( s3d_CDrvGfxParam_cr GfxParam, const s3d_CDrvD3d9ParamBlk &ParamBlk, const s3d_CDrvD3d9ParamBlkState &ParamBlkState); void TrackTransfBone( s3d_CSysIntps BoneIdxCnt, const s3d_CSysInt32u *BoneIdxData, s3d_CSysIntps MatBoneCnt, const D3DXMATRIXA16 *MatBoneArray); void CalcVertBufDesc( const s3d_CDrvGfxCharge *Charge, s3d_CDrvD3d9VertBufDesc &VertBufDesc) const; bool IsValid(); void GetVertProgCodeInfoName( s3d_CUtilStr &CodeInfo, s3d_CUtilStr &CodeName) const; void GetPixProgCodeInfoName( s3d_CUtilStr &CodeInfo, s3d_CUtilStr &CodeName) const; private: void TrackMatTrans( const int &Addr, int Trans, const D3DXMATRIXA16 *Mat, s3d_CSysIntps Cnt, s3d_CDrvD3d9ProgAsmTrackBlk &TrackBlk); void TrackParams( s3d_CDrvGfxParam_cr GfxParam, const s3d_CDrvD3d9ParamBlk &ParamBlk, const s3d_CDrvD3d9ParamBlkState &ParamBlkState, s3d_CDrvD3d9ProgAsmTrackBlk &TrackBlk); void TrackNoLighting( const s3d_CDrvD3d9ParamBlk &ParamBlk, const s3d_CDrvD3d9ParamBlkState &ParamBlkState, s3d_CDrvD3d9ProgAsmTrackBlk &TrackBlk); void TrackLighting( const s3d_CDrvD3d9ParamBlk &ParamBlk, const s3d_CDrvD3d9ParamBlkState &ParamBlkState, s3d_CDrvD3d9ProgAsmTrackBlk &TrackBlk); void TrackLightingBlack( const s3d_CDrvD3d9ParamBlk &ParamBlk, const s3d_CDrvD3d9ParamBlkState &ParamBlkState, s3d_CDrvD3d9ProgAsmTrackBlk &TrackBlk, s3d_CSysIntps FromLight); void TrackTransfBone( s3d_CSysIntps BoneIdxCnt, const s3d_CSysInt32u *BoneIdxData, s3d_CSysIntps MatBoneCnt, const D3DXMATRIXA16 *MatBoneArray, s3d_CDrvD3d9ProgAsmTrackBlk &TrackBlk); s3d_CDrvD3d9ProgAsmTrackBlkVert m_VertTrackBlk; s3d_CDrvD3d9ProgAsmTrackBlkPix m_PixTrackBlk; }; //@ typedef s3d_CUtilPtr s3d_CDrvD3d9ProgAsmPtr; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9ProgAsmUtil { public: static void CreateShader( s3d_CUtilNotifGather *NotifGather, s3d_CUtilSnkChunk *Param, s3d_CDrvD3d9ProgCtx *ProgCtx, bool VertShader, s3d_CDrvD3d9Prog *Prog, s3d_CDrvD3d9ProgAsmTrackBlk &TrackBlk); static void ExtractPredefine( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CLibStreamPreproState *PreproState, s3d_CUtilSnkExtract &SnkExtract); static void ExtractParamArray( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, s3d_CDrvD3d9ProgAsmParamArray &ParamArray, s3d_CUtilSnkExtract &SnkExtract); static void ExtractTexSize( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, s3d_CDrvD3d9ProgAsmAddrArray &TexSizeAddrArray, s3d_CDrvD3d9ProgAsmAddrArray &TexRcpSizeAddrArray, s3d_CUtilSnkExtract &SnkExtract); static void ExtractTrackArray( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, s3d_CDrvD3d9ProgAsmTrackMatArray &MatTrackArray, s3d_CDrvD3d9ProgAsmTrackMatArray &BoneTrackArray, s3d_CUtilSnkExtract &SnkExtract); static void ExtractLightArray( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, int &ActiveLightCntAddr, s3d_CDrvD3d9ProgAsmLightArray &LightTrackArray, s3d_CUtilSnkExtract &SnkExtract); static void ExtractMtl( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, s3d_CDrvD3d9ProgAsmTrackMtrl &Mtl, s3d_CUtilSnkExtract &SnkExtract); static void ExtractFog( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, int &FogAddr, s3d_CUtilSnkExtract &SnkExtract); static void InitTrackBlk( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, s3d_CDrvD3d9ProgAsmTrackBlk &TrackBlk, s3d_CUtilSnkExtract &SnkExtract); static bool AssembleFromRes( s3d_CUtilNotifGather *NotifGather, const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, s3d_CLibStreamPreproState *PreproState, s3d_CDrvD3d9Buf &CodeBuf); static bool AssembleFromFile( s3d_CUtilNotifGather *NotifGather, const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, s3d_CLibStreamPreproState *PreproState, s3d_CDrvD3d9Buf &CodeBuf); }; /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9ProgAsmTrackMat::s3d_CDrvD3d9ProgAsmTrackMat() { m_Addr = -1; m_Chan = 0; m_Slot = 0; m_Cnt = 0; m_Trans = 0; } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9ProgAsmLight::s3d_CDrvD3d9ProgAsmLight() { m_PosAddr = -1; m_DirAddr = -1; m_AmbientAddr = -1; m_DiffuseAddr = -1; m_SpecularAddr = -1; m_AttenAddr = -1; } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9ProgAsmTrackMtrl::s3d_CDrvD3d9ProgAsmTrackMtrl() { m_PowerAddr = -1; m_EmissiveAddr = -1; } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9ProgAsmParam::s3d_CDrvD3d9ProgAsmParam() { m_Addr = -1; m_Type = -1; m_HadError = false; } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9ProgAsmTrackBlk::s3d_CDrvD3d9ProgAsmTrackBlk() { m_ActiveLightCntAddr = -1; m_FogAddr = -1; } /////////////////////////////////////////////////////////////////////////////// #endif