/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### Shark 3D Engine (www.shark3d.com) // ########## # # # // ######## Copyright (c) 1996-2006 Spinor GmbH. // ######### # # # All rights reserved. // ## ########## // ## // /////////////////////////////////////////////////////////////////////////////// //@cpp #ifndef S3D_DRV_D3D9_ENG_H #define S3D_DRV_D3D9_ENG_H #include "drv_d3d9_param.h" #include "drv_d3d9_state.h" #include "drv_d3d9_batch.h" #include "drv_d3d9_vertdecl.h" #include "drv_d3d9_tex.h" #include "drv_d3d9_prog.h" #include "drv_d3d9_env.h" #include "drv_d3d9_ctx.h" #include "drv_d3d9_visib.h" #include "drv_d3d9_surfpool.h" #include "drv/interf/drv_gfx.h" #include "drv/interf/drv_ctx.h" #include "drv/interf/win32/drv_win32_ctx.h" #include "util/cont/util_idmgr.h" #include "util/base/util_init.h" #include "util/cont/util_tuple.h" #include "util/notif/util_multinotif.h" #include "general/general_env.h" //#include "GeoLodLibraryDLL.h" #include "shark_mesh_loader_model.h" /////////////////////////////////////////////////////////////////////////////// /*@{ @declare{cpp.macro}{S3D_DRV_D3D9_ENG_CAP_D3D}{#define $} D3D can be used. @}*/ #define S3D_DRV_D3D9_ENG_CAP_D3D "d3d" /*@{ @declare{cpp.macro}{S3D_DRV_D3D9_ENG_CAP_D3D9}{#define $} D3D9 can be used. @}*/ #define S3D_DRV_D3D9_ENG_CAP_D3D9 "d3d9" /////////////////////////////////////////////////////////////////////////////// #define S3D_DRV_D3D9_MAX_DEST_CNT 16 /////////////////////////////////////////////////////////////////////////////// template<> S3D_SYS_INLINE D3DXMATRIXA16 *s3d_UtilNew() { void *p = D3DXMATRIXA16::operator new(S3D_SYS_SIZEOFS(D3DXMATRIXA16)); return reinterpret_cast(p); } template<> S3D_SYS_INLINE void s3d_UtilDelete(D3DXMATRIXA16 *p) { D3DXMATRIXA16::operator delete(p); } template<> S3D_SYS_INLINE D3DXMATRIXA16 *s3d_UtilNewArray(s3d_CSysIntps Cnt) { void *p = D3DXMATRIXA16::operator new[](S3D_SYS_SIZEOFS( D3DXMATRIXA16) * Cnt); return reinterpret_cast(p); } template<> S3D_SYS_INLINE void s3d_UtilDeleteArray(D3DXMATRIXA16 *p) { D3DXMATRIXA16::operator delete[](p); } /////////////////////////////////////////////////////////////////////////////// //@ Implementation of @ident{comp}{drv_d3d9.gfxmgr.gfxeng}. class s3d_CDrvD3d9GfxEngCLOD : public s3d_CDrvGfxEng { public: S3D_UTIL_RTTI_TABLE_DECLARE //@ For a description of the parameters // see @ident{comp}{drv_d3d9.gfxmgr.gfxeng}. s3d_CDrvD3d9GfxEngCLOD( s3d_CUtilMsgHandler *MsgHandler, s3d_CUtilStr_cr Info, bool Bare, s3d_CCompSuppl *CompSuppl, s3d_CUtilAtomMgr *AtomMgr, s3d_CUtilMemPool *MemPool, s3d_CUtilStorageMgr *StorageMgr, s3d_CCompResMgr *ResMgr, s3d_CCompSuppl *UnivProgSuppl, s3d_CCompSuppl *UnivProgGivenSuppl, s3d_CUtilSnkChunk *DefaultOutParam); //@ ~s3d_CDrvD3d9GfxEngCLOD(); //@ void Done(); //@ s3d_CUtilStr GetDesc() const; //@ s3d_CDrvGfxOutPtr CreateOut( s3d_CUtilStr_cr Info, s3d_CDrvCtx *Ctx, s3d_CUtilStr_cr Device, int Prop, int Left, int Top, int Width, int Height, int Depth, int Frequency, s3d_CUtilSnkChunk *Param); //@ s3d_CDrvGfxOutPtr CreateOut( s3d_CUtilStr_cr Info, s3d_CDrvCtx *Ctx, s3d_CUtilStr_cr Device, int Prop, int Left, int Top, int Width, int Height, int Depth, int Frequency, s3d_CUtilRecogBase *Param); //@ s3d_CDrvGfxOutPtr CreateOut( s3d_CUtilStr_cr Info, s3d_CDrvCtx *Ctx, s3d_CUtilStr_cr Device, int Prop, int Left, int Top, int Width, int Height, int Depth, int Frequency, s3d_CDrvD3d9Param *D3dParam); //@ s3d_CUtilSnkChunkPtr GetDefaultOutParam(); //@ void RegisterNotifCtxChanged( s3d_CUtilNotifRecip *Recip); //@ void Alter( s3d_CUtilStr_cr Info, s3d_CUtilStr_cr Device, int Prop, int Left, int Top, int Width, int Height, int Depth, int Frequency, s3d_CUtilSnkChunk *Param); //@ void Alter( s3d_CUtilStr_cr Info, s3d_CUtilStr_cr Device, int Prop, int Left, int Top, int Width, int Height, int Depth, int Frequency, s3d_CDrvD3d9Param *D3dParam); //@ void UserFunc(s3d_CUtilCoStr Func); //@ bool HasCap( s3d_CSysIntps CapLen, const s3d_CSysChar *CapStart) const; //@ s3d_CDrvGfxStat *GetStat(); //@ int GetSampCnt() const; //@ void SnapTexSize( int &Width, int &Height, int &Depth, int TexProp, int SnapProp); //@ s3d_CDrvGfxTexPtr CreateTexDirect( s3d_CUtilStr_cr Info, int TexProp, int Width, int Height, int Depth); //@ s3d_CDrvGfxTexPtr CreateTexStream( s3d_CUtilStr_cr Info, int TexProp, s3d_CUtilStream *Stream); //@ s3d_CDrvGfxTexPtr CreateTexVideo( s3d_CUtilStr_cr Info, int TexProp, s3d_CDrvVideoPlayer *VideoPlayer); //@ s3d_CDrvGfxTexPtr CreateTexIdent( s3d_CUtilStr_cr Info, int TexProp, s3d_CUtilStr_cr Ident); //@ s3d_CDrvGfxTexPtr CreateTexUser( s3d_CUtilStr_cr Info, int TexProp, s3d_CCompObj *UserObj); //@ void SetSampTex( int Samp, s3d_CDrvGfxTex *Tex); //@ void SetSampTexElseNone( int SampStart); //@ void SetSampMode( int Samp, int SampMode); //@ s3d_CDrvGfxProgPtr CreateProg( s3d_CUtilNotifGather *NotifGather, s3d_CUtilSnkChunk *Desc); //@ void GetMainSize(int &Width, int &Height) const; //@ int GetMainColorAlphaBits() const; //@ void SetGamma( s3d_CUtilVec3f_cr Gamma); //@ void Present(); //@ void GetCurTargetSize(int &Width, int &Height) const; //@ void EndRender(); //@ void BeginRenderMain( int DestProp, s3d_CDrvGfxClearParam_cr ClearParam, s3d_CDrvGfxOut *GfxOut); //@ void EndRenderMain(); //@ void BeginRenderTex( int DestProp, s3d_CDrvGfxClearParam_cr ClearParam, int Width, int Height, s3d_CSysIntps DestCnt, const s3d_CDrvGfxDest *DestArray); //@ void EndRenderTex(); //@ void CopyIntoTex( int Width, int Height, int SrcX, int SrcY, s3d_CSysIntps DestCnt, const s3d_CDrvGfxDest *DestArray); //@ void StoreScreenshot(); //@ void SetViewRect( s3d_CUtilTranslScale2f_cr ViewRect); //@ void SetViewDepthRange( float NegZ, float PosZ); //@ void SetScissorRect( int X, int Y, int Width, int Height); //@ void SetScissorNone(); //@ void SetCullMode(int Mode); //@ void SetDepthTest(int Mode); //@ void SetDepthWrite(bool Enabled); //@ int GetStencilBits() const; //@ void SetStencilMode( int TestMask, int TestRef, int TestModeFront, int TestModeBack, int WriteMask, int OpFailFront, int OpDepthFailFront, int OpDepthPassFront, int OpFailBack, int OpDepthFailBack, int OpDepthPassBack); //@ void SetAlphaTest( int Mode, float Ref); //@ void SetBlendMode( int ColSrcFac, int ColDestFac, int ColOp, int AlphaSrcFac, int AlphaDestFac, int AlphaOp); //@ void SetPaintMode(int Mode); //@ void SetPaintExt(float Ext); //@ void BeginVisib(); //@ s3d_CDrvGfxVisibPtr EndVisib(); //@ void SetFogNone(); //@ void SetFogExp(float Density, s3d_CUtilVec3f_cr Color); //@ bool IsStereo() const; //@ void SetStereoEyeOffset(s3d_CUtilVec3f_cr EyeOffset); //@ void SetTransf(int Chan, int Slot, s3d_CUtilMat4x4f_cr Mat); //@ void SetTransfIdentity(int Chan, int Slot); //@ void SetClipPlane(s3d_CUtilVec4f_cr Plane); //@ void SetDepthBias( float BiasOverlay, float BiasOffs); //@ void DisableLighting(); //@ void SetLightArray( s3d_CSysIntps LightCnt, s3d_CDrvGfxLight **LightArray); //@ void SetMtl( s3d_CUtilVec3f_cr Ambient, s3d_CUtilVec3f_cr Diffuse, s3d_CUtilVec3f_cr Specular, s3d_CUtilVec3f_cr Emissive, float SpecExp, float Alpha); //@ void SetColorAlpha( s3d_CUtilVec4f_cr ColorAlpha); //@ void GetPacketLimits( int &MaxVertCnt, int &MaxPrimCnt, int Prim); //@ s3d_CDrvGfxBatchPtr CreateBatch( const s3d_CDrvGfxCharge *Charge); //@ void ExecuteCharge( const s3d_CDrvGfxCharge *Charge, s3d_CDrvGfxBatch *Batch, s3d_CDrvGfxParam_cr GfxParam); // NEW for GAMETOOLS void ManipulateBatchForLODSTRIPS(s3d_CDrvGfxBatchPtr batch, Geometry::LodStripsLibrary *, float lod); void GetViewPos(float &x, float &y, float &z); private: s3d_CUtilMsgHandlerPtr m_MsgHandler; s3d_CUtilStr m_Info; s3d_CUtilAtomMgrPtr m_AtomMgr; s3d_CUtilMemPoolPtr m_MemPool; s3d_CCompResMgrPtr m_ResMgr; s3d_CUtilStorageMgrPtr m_StorageMgr; s3d_CCompSupplPtr m_UnivProgSuppl; s3d_CCompSupplPtr m_UnivProgGivenSuppl; s3d_CUtilSnkChunkPtr m_DefaultOutParam; s3d_CDrvCtxPtr m_Ctx; s3d_CUtilNotifMgr m_NotifMgrCtx; s3d_CDrvWin32CtxInterf *m_CtxWin32; HWND m_hWnd; s3d_CDrvD3d9ParamPtr m_D3dParam; int m_Prop; int m_BufWidth; int m_BufHeight; int m_BufColorAlphaBits; int m_BufDepthBits; int m_BufStencilBits; float m_BufDepthBiasScale; // D3d device s3d_CDrvD3d9Direct3d m_D3d; s3d_CDrvD3d9Device m_D3dDev; s3d_CDrvD3d9SwapChain m_SwapChain; bool m_SWVertProc; DWORD m_DevFlags; D3DDEVTYPE m_DevType; D3DFORMAT m_BackBufFmt; D3DFORMAT m_DepthStencilFmt; s3d_CDrvD3d9Surf m_MainSurfCol; s3d_CDrvD3d9Surf m_MainSurfDepth; void ResetDevice(); s3d_CDrvGfxStat m_Stat; s3d_CSysInt32u m_FrmIdx; // Render to tex // Keep "locks" of color surfaces s3d_CUtilPtrArray m_CurSurfRTColArray; // Keep "lock" of depth surface s3d_CDrvD3d9SurfRTPtr m_CurSurfRTDepth; s3d_CDrvD3d9SurfRTPoolMap m_SurfRTPoolMap; s3d_CDrvD3d9SurfRTPtr FindSurfRT( int Width, int Height, D3DFORMAT Fmt, D3DMULTISAMPLE_TYPE MultiSampleType); void BeginRenderTexStd( int Width, int Height, s3d_CSysIntps DestCnt, const s3d_CDrvGfxDest *DestArray); void EndRenderTexStd(); void BeginRenderTexMSAA( int Width, int Height, s3d_CSysIntps DestCnt, const s3d_CDrvGfxDest *DestArray); void EndRenderTexMSAA(); void UnbindTex( s3d_CDrvD3d9TexObjBase *TexImpl); void SetRenderTargetElseNone( int Start); int m_CurSurfColUsedCnt; s3d_CSysIntps m_MaxSimRTCnt; s3d_CDrvD3d9Surf m_CurSurfColArray[S3D_DRV_D3D9_MAX_SIM_RT_CNT]; s3d_CDrvD3d9Surf m_CurSurfDepth; int m_DestProp; s3d_CSysIntps m_DestCnt; s3d_CDrvGfxDest m_DestArray[S3D_DRV_D3D9_MAX_DEST_CNT]; void InitRenderToTex(); void RestoreRenderTargets(); UINT m_Adapter; s3d_CUtilStr m_AdapterDesc; D3DCAPS9 m_DevCaps; D3DPRESENT_PARAMETERS m_PresentParam; bool m_UseMSAA; D3DVIEWPORT9 m_Viewport; RECT m_ScissorRect; bool m_CurScissorEnabled; void EnabledScissor(bool Enabled); // State s3d_CDrvD3d9StateMgr m_StateMgr; s3d_CDrvD3d9StateBlk m_State; void SetDefaultState(); int m_CullMode; int m_DepthTestMode; float m_DepthBiasOverlay; float m_DepthBiasOffs; int m_BlendColSrcFac; int m_BlendColDestFac; int m_BlendColOp; int m_BlendAlphaSrcFac; int m_BlendAlphaDestFac; int m_BlendAlphaOp; int m_PaintMode; int m_StencilTestModeFront; int m_StencilTestModeBack; int m_StencilOpFailFront; int m_StencilOpDepthFailFront; int m_StencilOpDepthPassFront; int m_StencilOpFailBack; int m_StencilOpDepthFailBack; int m_StencilOpDepthPassBack; int m_AlphaTestMode; float m_AlphaTestRef; // Did previous ExecuteCharge use a FFP? bool m_PrevUsedFFP; // Projection matrix: float m_MainProjOffsX; float m_MainProjOffsY; float m_CurProjOffsX; float m_CurProjOffsY; bool m_MatProjDirty; D3DXMATRIXA16 m_MatProj; //D3DXMATRIXA16 m_EffMatProj; void CalcProjOffs( float &ProjOffsX, float &ProjOffsY, int Width, int Height); void SetProjOffs( const float &ProjOffsX, const float &ProjOffsY); // Texture: // Maximum device texcoord count. int m_MaxAttrCnt; D3DTEXTURETRANSFORMFLAGS m_CurTexTransfFlagsArray[ S3D_DRV_D3D9_MAX_ATTR_CNT]; D3DTEXTUREOP m_CurTexOpArray[ S3D_DRV_D3D9_MAX_ATTR_CNT]; // Maximum device sampler count. int m_MaxSampCnt; // All entries of m_WantSampTexArray with index < m_SampMaxWantCnt // have changes not yet reflected by m_CurSampTexArray and not yet // committed to d3d state. int m_SampMaxWantCnt; s3d_CDrvD3d9TexObjBasePtr m_WantSampTexArray[S3D_DRV_D3D9_MAX_SAMPLER_CNT]; s3d_CDrvD3d9SampParam m_CurSampParamArray[S3D_DRV_D3D9_MAX_SAMPLER_CNT]; int m_SampModeArray[S3D_DRV_D3D9_MAX_SAMPLER_CNT]; s3d_CDrvD3d9TexMgrPtr m_TexMgr; int m_MinLbTexWidth; int m_MaxLbTexWidth; int m_MinLbTexHeight; int m_MaxLbTexHeight; int m_MinLbVolTexExt; int m_MaxLbVolTexExt; D3DTEXTUREFILTERTYPE m_MaxFilterMinStd; D3DTEXTUREFILTERTYPE m_MaxFilterMagStd; D3DTEXTUREFILTERTYPE m_MaxFilterMinCube; D3DTEXTUREFILTERTYPE m_MaxFilterMagCube; D3DTEXTUREFILTERTYPE m_MaxFilterMinVol; D3DTEXTUREFILTERTYPE m_MaxFilterMagVol; D3DTEXTUREFILTERTYPE m_MaxFilterMipStd; D3DTEXTUREFILTERTYPE m_MaxFilterMipCube; D3DTEXTUREFILTERTYPE m_MaxFilterMipVol; void InitTexturing(); void SetTexOpTransf( int Attr, D3DTEXTUREOP Op, D3DTEXTURETRANSFORMFLAGS TransfFlag); void UpdateSampParam( s3d_CSysIntps Samp, const s3d_CDrvD3d9TexObjBase *Tex); void AddrOfSampMode( int SampMode, D3DTEXTUREADDRESS &AddrX, D3DTEXTUREADDRESS &AddrY, D3DTEXTUREADDRESS &AddrZ); void FilterOfSampMode( int SampMode, const s3d_CDrvD3d9TexObjBase *Tex, D3DTEXTUREFILTERTYPE &FilterMin, D3DTEXTUREFILTERTYPE &FilterMag, D3DTEXTUREFILTERTYPE &FilterMip); void Clear( s3d_CDrvGfxClearParam_cr ClearParam); // Bones s3d_CUtilArray m_MatBoneArray; bool m_MatBoneDirty; // Batch objects, vertex and index buffers: s3d_CDrvD3d9BufMgrPtr m_BufMgr; s3d_CDrvD3d9VertBufObjPtr m_CurVertBufObj; s3d_CDrvD3d9IdxBufObjPtr m_CurIdxBufObj; s3d_CDrvD3d9VertDecl m_CurVertDecl; s3d_CDrvD3d9VertBuf m_CurVertBufDummyBlendWghIdx; void SelectBuffers( s3d_CDrvD3d9VertBufObj *VertBufObj, s3d_CDrvD3d9IdxBufObj *IdxBufObj); void SelectProg( const s3d_CSysChar *Info, s3d_CDrvGfxProg *Prog, const s3d_CSysChar *BufInfo, const s3d_CSysChar *BufDesc, const s3d_CDrvD3d9VertDecl &VertDecl, s3d_CDrvGfxParam_cr GfxParam); void BeginDraw( const s3d_CSysChar *Info, int VertBufFmtDecl, bool UseFFP); void BeginDrawFFP( const s3d_CSysChar *Info, int VertBufFmtDecl); void EndDrawFFP( const s3d_CSysChar *Info); void BeginDrawProg( const s3d_CSysChar *Info, int VertBufFmtDecl); void EndDrawProg( const s3d_CSysChar *Info); void DrawIndexedBatchPacket( D3DPRIMITIVETYPE D3dPrim, s3d_CSysIntps PacketSubCnt, s3d_CDrvD3d9Packet *PacketSubArray, s3d_CSysIntps VertexSubBase, s3d_CSysIntps IndexSubBase, s3d_CSysIntps BoneIdxSubBase, s3d_CSysIntps BoneIdxCnt, const s3d_CSysInt32u *BoneIdxData, bool TrackDummyBlendTransf); void DrawIndexedBatchPacketUP( D3DPRIMITIVETYPE D3dPrim, s3d_CSysIntps PacketSubCnt, s3d_CDrvD3d9Packet *PacketSubArray, s3d_CSysIntps VertexSubBase, const s3d_CSysIntm *VertData, int VertSize, D3DFORMAT IdxFmt, const s3d_CSysIntm *IdxData, s3d_CSysIntps BoneIdxSubBase, s3d_CSysIntps BoneIdxCnt, const s3d_CSysInt32u *BoneIdxData, bool TrackDummyBlendTransf); s3d_CDrvD3d9ProgMgrPtr m_ProgMgr; s3d_CDrvD3d9ParamBlk m_ParamBlk; s3d_CDrvD3d9ParamBlkState m_ParamStateProg; s3d_CDrvD3d9ParamBlkState m_ParamStateFFP; s3d_CSysIntps m_MaxLightCnt; bool m_LightingEnabled; bool m_WantLighting; s3d_CSysIntps m_WantLightCnt; bool m_LightEnabledArray[S3D_DRV_D3D9_MAX_LIGHT_CNT]; bool m_LightDirtyArray[S3D_DRV_D3D9_MAX_LIGHT_CNT]; void InitLighting(); void EnabledLighting(bool Enabled); bool m_HasNvDepthTex; bool m_CanRenderDepth; void InitDevCaps(); void Park(); void Unpark(); s3d_CDrvD3d9Env m_Env; s3d_CDrvD3d9CtxPtr m_D3dCtx; // Queries s3d_CDrvD3d9QueryEvent m_FlushEvent; s3d_CSysIntps m_IdxFlushCnt; s3d_CDrvD3d9VisibMgrPtr m_VisibMgr; }; S3D_DRV_PUBLIC_DECL S3D_UTIL_RTTI_TARGET_DECLARE(s3d_CDrvD3d9GfxEngCLOD) //@ typedef s3d_CUtilPtr s3d_CDrvD3d9GfxEngCLODPtr; /////////////////////////////////////////////////////////////////////////////// class s3d_CDrvD3d9GfxOut: public s3d_CDrvGfxOut { public: s3d_CDrvD3d9GfxOut( s3d_CDrvD3d9GfxEngCLOD *GfxEng); s3d_CUtilStr GetDesc(); void Alter( s3d_CUtilStr_cr Info, s3d_CUtilStr_cr Device, int Prop, int Left, int Top, int Width, int Height, int Depth, int Frequency, s3d_CUtilSnkChunk *Param); void Alter( s3d_CUtilStr_cr Info, s3d_CUtilStr_cr Device, int Prop, int Left, int Top, int Width, int Height, int Depth, int Frequency, s3d_CDrvD3d9Param *D3dParam); void Present(); void GetSize(int &Width, int &Height) const; int GetColorAlphaBits() const; void SetGamma( s3d_CUtilVec3f_cr Gamma); private: s3d_CDrvD3d9GfxEngCLODPtr m_GfxEng; }; /////////////////////////////////////////////////////////////////////////////// #endif