/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### Shark 3D Engine (www.shark3d.com) // ########## # # # // ######## Copyright (c) 1996-2006 Spinor GmbH. // ######### # # # All rights reserved. // ## ########## // ## // /////////////////////////////////////////////////////////////////////////////// //@cpp #ifndef S3D_DRV_D3D9_PROGHLSL_H #define S3D_DRV_D3D9_PROGHLSL_H #include "drv_d3d9_prog.h" #include "lib/stream/lib_stream_prepro.h" #include "util/snk/util_snk_extract.h" /////////////////////////////////////////////////////////////////////////////// typedef s3d_CUtilArray s3d_CDrvD3d9ProgHLSLVarArray; typedef s3d_CUtilSet s3d_CDrvD3d9ProgHLSLVarSet; /////////////////////////////////////////////////////////////////////////////// struct s3d_CDrvD3d9ProgHLSLTrackMat { D3DXHANDLE m_Var; int m_Chan; int m_Slot; int m_Trans; int m_Cnt; s3d_CDrvD3d9ProgHLSLTrackMat(); }; typedef s3d_CUtilArray s3d_CDrvD3d9ProgHLSLTrackMatArray; /////////////////////////////////////////////////////////////////////////////// struct s3d_CDrvD3d9ProgHLSLLight { D3DXHANDLE m_PosVar; D3DXHANDLE m_DirVar; D3DXHANDLE m_AmbientVar; D3DXHANDLE m_DiffuseVar; D3DXHANDLE m_SpecularVar; D3DXHANDLE m_AttenVar; s3d_CDrvD3d9ProgHLSLLight(); }; typedef s3d_CUtilArray s3d_CDrvD3d9ProgHLSLLightArray; /////////////////////////////////////////////////////////////////////////////// struct s3d_CDrvD3d9ProgHLSLTrackMtrl { D3DXHANDLE m_PowerVar; D3DXHANDLE m_EmissiveVar; s3d_CDrvD3d9ProgHLSLTrackMtrl(); }; /////////////////////////////////////////////////////////////////////////////// struct s3d_CDrvD3d9ProgHLSLParam { s3d_CUtilStr m_Info; D3DXHANDLE m_Var; int m_Type; bool m_HadError; s3d_CDrvD3d9ProgHLSLParam(); }; typedef s3d_CUtilKeyEntry s3d_CDrvD3d9ProgHLSLParamEntry; typedef s3d_CUtilArray s3d_CDrvD3d9ProgHLSLParamArray; /////////////////////////////////////////////////////////////////////////////// //@ struct s3d_CDrvD3d9ProgHLSLTrackBlk { s3d_CUtilStr m_CodeName; s3d_CUtilStr m_CodeInfo; s3d_CDrvD3d9ConstTable m_ConstTab; s3d_CDrvD3d9ProgHLSLParamArray m_ParamArray; s3d_CDrvD3d9ProgHLSLVarArray m_TexSizeArray; s3d_CDrvD3d9ProgHLSLVarArray m_TexRcpSizeArray; s3d_CDrvD3d9ProgHLSLTrackMatArray m_MatTrackArray; s3d_CDrvD3d9ProgHLSLTrackMatArray m_BoneTrackArray; D3DXHANDLE m_ActiveLightCntVar; s3d_CDrvD3d9ProgHLSLLightArray m_LightTrackArray; s3d_CDrvD3d9ProgHLSLTrackMtrl m_Mtl; D3DXHANDLE m_FogVar; s3d_CDrvD3d9ProgHLSLTrackBlk(); }; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9ProgHLSL : public s3d_CDrvD3d9Prog { public: s3d_CDrvD3d9ProgHLSL( 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 D3DXHANDLE &Var, int Trans, const D3DXMATRIXA16 *Mat, s3d_CSysIntps Cnt, const LPD3DXCONSTANTTABLE ConstTab, LPDIRECT3DDEVICE9 D3dDev); void TrackParams( s3d_CDrvGfxParam_cr GfxParam, const s3d_CDrvD3d9ParamBlk &ParamBlk, const s3d_CDrvD3d9ParamBlkState &ParamBlkState, s3d_CDrvD3d9ProgHLSLTrackBlk &TrackBlk); void TrackNoLighting( const s3d_CDrvD3d9ParamBlk &ParamBlk, const s3d_CDrvD3d9ParamBlkState &ParamBlkState, s3d_CDrvD3d9ProgHLSLTrackBlk &TrackBlk); void TrackLighting( const s3d_CDrvD3d9ParamBlk &ParamBlk, const s3d_CDrvD3d9ParamBlkState &ParamBlkState, s3d_CDrvD3d9ProgHLSLTrackBlk &TrackBlk); void TrackLightingBlack( const s3d_CDrvD3d9ParamBlk &ParamBlk, const s3d_CDrvD3d9ParamBlkState &ParamBlkState, s3d_CDrvD3d9ProgHLSLTrackBlk &TrackBlk, s3d_CSysIntps FromLight); void TrackTransfBone( s3d_CSysIntps BoneIdxCnt, const s3d_CSysInt32u *BoneIdxData, s3d_CSysIntps MatBoneCnt, const D3DXMATRIXA16 *MatBoneArray, s3d_CDrvD3d9ProgHLSLTrackBlk &TrackBlk); s3d_CDrvD3d9ProgHLSLTrackBlk m_VertTrackBlk; s3d_CDrvD3d9ProgHLSLTrackBlk m_PixTrackBlk; }; //@ typedef s3d_CUtilPtr s3d_CDrvD3d9ProgHLSLPtr; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9ProgHLSLUtil { public: static void CreateShader( s3d_CUtilNotifGather *NotifGather, s3d_CUtilSnkChunk *Param, s3d_CDrvD3d9ProgCtx *ProgCtx, bool VertShader, s3d_CDrvD3d9Prog *Prog, s3d_CDrvD3d9ProgHLSLTrackBlk &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, const LPD3DXCONSTANTTABLE ConstTab, s3d_CDrvD3d9ProgHLSLParamArray &ParamArray, s3d_CDrvD3d9ProgHLSLVarSet &VarSet, s3d_CUtilSnkExtract &SnkExtract); static void ExtractTexSize( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, const LPD3DXCONSTANTTABLE ConstTab, s3d_CDrvD3d9ProgHLSLVarArray &TexSizeArray, s3d_CDrvD3d9ProgHLSLVarArray &TexRcpSizeArray, s3d_CDrvD3d9ProgHLSLVarSet &VarSet, s3d_CUtilSnkExtract &SnkExtract); static void ExtractTrackArray( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, const LPD3DXCONSTANTTABLE ConstTab, s3d_CDrvD3d9ProgHLSLTrackMatArray &MatTrackArray, s3d_CDrvD3d9ProgHLSLTrackMatArray &BoneTrackArray, s3d_CDrvD3d9ProgHLSLVarSet &VarSet, s3d_CUtilSnkExtract &SnkExtract); static void ExtractLightArray( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, const LPD3DXCONSTANTTABLE ConstTab, D3DXHANDLE &ActiveLightCntVar, s3d_CDrvD3d9ProgHLSLLightArray &LightTrackArray, s3d_CDrvD3d9ProgHLSLVarSet &VarSet, s3d_CUtilSnkExtract &SnkExtract); static void ExtractMtl( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, const LPD3DXCONSTANTTABLE ConstTab, s3d_CDrvD3d9ProgHLSLTrackMtrl &Mtl, s3d_CDrvD3d9ProgHLSLVarSet &VarSet, s3d_CUtilSnkExtract &SnkExtract); static void ExtractFog( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, const LPD3DXCONSTANTTABLE ConstTab, D3DXHANDLE &FogVar, s3d_CDrvD3d9ProgHLSLVarSet &VarSet, s3d_CUtilSnkExtract &SnkExtract); static void InitTrackBlk( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, s3d_CDrvD3d9ProgHLSLTrackBlk &TrackBlk, s3d_CUtilSnkExtract &SnkExtract); static bool CompileFromRes( s3d_CUtilNotifGather *NotifGather, const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, s3d_CUtilStr_cr EntryPoint, s3d_CUtilStr_cr Profile, s3d_CLibStreamPreproState *PreproState, s3d_CDrvD3d9Buf &CodeBuf, s3d_CDrvD3d9ConstTable &ConstTab); static bool CompileFromFile( s3d_CUtilNotifGather *NotifGather, const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, s3d_CUtilStr_cr EntryPoint, s3d_CUtilStr_cr Profile, s3d_CLibStreamPreproState *PreproState, s3d_CDrvD3d9Buf &CodeBuf, s3d_CDrvD3d9ConstTable &ConstTab); static void ResolveVar( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, LPD3DXCONSTANTTABLE ConstTab, D3DXHANDLE &Var, s3d_CUtilStr_cr VarName, s3d_CDrvD3d9ProgHLSLVarSet &VarSet); static void EnumAllVars( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, LPD3DXCONSTANTTABLE ConstTab, const s3d_CDrvD3d9ProgHLSLVarSet &VarSet); static void EnumVar( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, LPD3DXCONSTANTTABLE ConstTab, D3DXHANDLE Var, s3d_CUtilStr_cr VarName, const s3d_CDrvD3d9ProgHLSLVarSet &VarSet); static void CheckVarInitialized( const s3d_CDrvD3d9ProgCtx *ProgCtx, s3d_CUtilStr_cr CodeInfo, s3d_CUtilStr_cr CodeName, D3DXHANDLE Var, s3d_CUtilStr_cr VarName, const D3DXCONSTANT_DESC &VarDesc, const s3d_CDrvD3d9ProgHLSLVarSet &VarSet); }; /////////////////////////////////////////////////////////////////////////////// // Implementations /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9ProgHLSLTrackMat::s3d_CDrvD3d9ProgHLSLTrackMat() { m_Var = 0; m_Chan = 0; m_Slot = 0; m_Trans = 0; m_Cnt = 0; } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9ProgHLSLLight::s3d_CDrvD3d9ProgHLSLLight() { m_PosVar = 0; m_DirVar = 0; m_AmbientVar = 0; m_DiffuseVar = 0; m_SpecularVar = 0; m_AttenVar = 0; } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9ProgHLSLTrackMtrl::s3d_CDrvD3d9ProgHLSLTrackMtrl() { m_PowerVar = 0; m_EmissiveVar = 0; } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9ProgHLSLParam::s3d_CDrvD3d9ProgHLSLParam() { m_Var = 0; m_Type = -1; m_HadError = false; } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9ProgHLSLTrackBlk::s3d_CDrvD3d9ProgHLSLTrackBlk() { m_ActiveLightCntVar = 0; m_FogVar = 0; } /////////////////////////////////////////////////////////////////////////////// #endif