/*============================================================================= DriverD3D8.h : Direct3D8 Render interface declarations. Copyright (c) 2001 Crytek Studios. All Rights Reserved. Revision history: * Created by Khonich Andrey =============================================================================*/ #ifndef DRIVERD3D8_H #define DRIVERD3D8_H #if _MSC_VER > 1000 # pragma once #endif #ifndef PS2 /* =========================================== The DXRenderer interface Class =========================================== */ #ifndef _XBOX // Base class #include #else #include #include #endif extern SPipeVertex_D_1T gVerts[]; //======================================================================= #ifndef _XBOX #include "cg\cgD3D8.h" #endif // DRIVERD3D.H // CRender3D Direct3D rasterizer class. #define VERSION_D3D 1.2 #define DECLARE_INITED(typ,var) typ var; memset(&var,0,sizeof(var)); var.dwSize=sizeof(var); #define SAFETRY(cmd) {try{cmd;}catch(...){ShError("Exception in '%s'\n", #cmd);}} #define DX_RELEASE(x) { if(x) { (x)->Release(); (x) = NULL; } } struct SPixFormat; class CRender3DD3D; struct SDeviceInfo; //======================================================================= extern HRESULT h; #include "StaticVB.h" #include "StaticIB.h" #include "D3DTexture.h" #include "D3DPShaders.h" #define D3DRGBA(r, g, b, a) \ ( (((long)((a) * 255)) << 24) | (((long)((r) * 255)) << 16) \ | (((long)((g) * 255)) << 8) | (long)((b) * 255) \ ) _inline DWORD FLOATtoDWORD( float f ) { union FLOATDWORD { float f; DWORD dw; }; FLOATDWORD val; val.f = f; return val.dw; } //======================================================================= typedef std::map TTextureMap; typedef TTextureMap::iterator TTextureMapItor; #define TEXTGT_2D 0 #define TEXTGT_CUBEMAP 1 struct STexPicD3D : public STexPic { STexPicD3D() : STexPic() { m_RefTex = NULL; } virtual void SaveTGA(const char *name, bool bMips); virtual void SaveJPG(const char *name, bool bMips); virtual void Release(bool bForce); virtual void Set(); virtual void SetClamp(bool bEnable); virtual void BuildMips(TArray* Mips); virtual void DownloadMips(TArray* Mips, int nStartMip, int nEndMip, int SizeFirst); virtual void ReleaseHW(); }; //===================================================== struct STexStageInfo { DWORD TextureCacheID; bool UseMips; bool Repeat; int MagFilter; int MinFilter; int Anisotropic; #ifndef _XBOX int Palette; #else D3DPalette* pPalette; #endif STexPic *Texture; STexStageInfo() {} void Flush() { TextureCacheID = 0; UseMips = (bool)-1; Repeat = (bool)-1; Anisotropic = 255; Texture = NULL; #ifndef _XBOX Palette = -1; #else pPalette = NULL; #endif } }; struct SD3DStats { }; struct SPixFormat { // Pixel format info. D3DFORMAT Format; // Pixel format from Direct3D. SPixFormat* Next; // Next in linked list of all compatible pixel formats. const TCHAR* Desc; // Stat: Human readable name for stats. int BitsPerPixel; // Total bits per pixel. DWORD MaxWidth; DWORD MaxHeight; // Multi-frame stats. int Binned; // Stat: How many textures of this format are available in bins. int BinnedRAM; // Stat: How much RAM is used by total textures of this format in the cache. // Per-frame stats. int Active; // Stat: How many textures of this format are active. int ActiveRAM; // Stat: How much RAM is used by active textures of this format per frame. int Sets; // Stat: Number of SetTexture was called this frame on textures of this format. int Uploads; // Stat: Number of texture Blts this frame. int UploadCycles; // Stat: Cycles spent Blting. void Init() { Next = NULL; BitsPerPixel = Binned = BinnedRAM = 0; } void InitStats() { Sets = Uploads = UploadCycles = Active = ActiveRAM = 0; } }; struct STexFiller; struct SDeviceInfo { GUID Guid; //[Alberto] I changed the decalration from String to string because String //was removed string Description; string Name; SDeviceInfo( GUID InGuid, const TCHAR* InDescription, const TCHAR* InName ) : Guid(InGuid), Description(InDescription), Name(InName) {} }; struct SStencil_D3D : public SStencil { int Func; int FuncRef; int FuncMask; int OpFail; int OpZFail; int OpZPass; virtual void mfSet(); virtual void mfReset(); }; #define BUFFERED_VERTS 256 #define D3DAPPERR_NODIRECT3D 0x82000001 #define D3DAPPERR_NOWINDOW 0x82000002 #define D3DAPPERR_NOCOMPATIBLEDEVICES 0x82000003 #define D3DAPPERR_NOWINDOWABLEDEVICES 0x82000004 #define D3DAPPERR_NOHARDWAREDEVICE 0x82000005 #define D3DAPPERR_HALNOTCOMPATIBLE 0x82000006 #define D3DAPPERR_NOWINDOWEDHAL 0x82000007 #define D3DAPPERR_NODESKTOPHAL 0x82000008 #define D3DAPPERR_NOHALTHISMODE 0x82000009 #define D3DAPPERR_NONZEROREFCOUNT 0x8200000a #define D3DAPPERR_MEDIANOTFOUND 0x8200000b #define D3DAPPERR_RESIZEFAILED 0x8200000c //----------------------------------------------------------------------------- // Name: struct D3DModeInfo // Desc: Structure for holding information about a display mode //----------------------------------------------------------------------------- struct SD3DModeInfo { DWORD Width; // Screen width in this mode DWORD Height; // Screen height in this mode D3DFORMAT Format; // Pixel format in this mode DWORD dwBehavior; // Hardware / Software / Mixed vertex processing D3DFORMAT DepthStencilFormat; // Which depth/stencil format to use with this mode }; //----------------------------------------------------------------------------- // Name: struct D3DDeviceInfo // Desc: Structure for holding information about a Direct3D device, including // a list of modes compatible with this device //----------------------------------------------------------------------------- struct SD3DDeviceInfo { // Device data D3DDEVTYPE DeviceType; // Reference, HAL, etc. D3DCAPS8 d3dCaps; // Capabilities of this device const TCHAR* strDesc; // Name of this device BOOL bCanDoWindowed; // Whether this device can work in windowed mode // Modes for this device DWORD dwNumModes; SD3DModeInfo modes[150]; // Current state DWORD dwCurrentMode; BOOL bWindowed; D3DMULTISAMPLE_TYPE MultiSampleType; }; //----------------------------------------------------------------------------- // Name: struct D3DAdapterInfo // Desc: Structure for holding information about an adapter, including a list // of devices available on this adapter //----------------------------------------------------------------------------- struct SD3DAdapterInfo { // Adapter data D3DADAPTER_IDENTIFIER8 d3dAdapterIdentifier; D3DDISPLAYMODE d3ddmDesktop; // Desktop display mode for this adapter int mMaxWidth, mMaxHeight; // Devices for this adapter DWORD dwNumDevices; SD3DDeviceInfo devices[5]; // Current state DWORD dwCurrentDevice; }; struct SD3DContext { WIN_HWND m_hWnd; int m_X; int m_Y; int m_Width; int m_Height; }; //====================================================================== /// Direct3D Render driver class class CD3D8Renderer : public CRenderer { friend class CD3D8TexMan; public: CD3D8Renderer(); ~CD3D8Renderer(); protected: // Windows context char m_WinTitle[80]; HINSTANCE m_hInst; HWND m_hWnd; // The main app window SD3DAdapterInfo m_Adapters[10]; int m_dwAdapter; int m_dwNumAdapters; // From D3D. // Main objects used for creating and rendering the 3D scene D3DPRESENT_PARAMETERS m_d3dpp; // Parameters for CreateDevice/Reset LPDIRECT3D8 m_pD3D; // The main D3D object D3DCAPS8 m_d3dCaps; // Caps for the device D3DSURFACE_DESC m_d3dsdZBuffer; // Surface desc of the Zbuffer LPDIRECT3DSURFACE8 m_pZBuffer; LPDIRECT3DSURFACE8 m_pBackBuffer; DWORD m_dwCreateFlags; // Indicate sw or hw vertex processing DWORD m_dwWindowStyle; // Saved window style for mode switches RECT m_rcWindowBounds; // Saved window bounds for mode switches RECT m_rcWindowClient; // Saved client area size for mode switches TCHAR m_strDeviceStats[90];// String to hold D3D device stats D3DVIEWPORT8 m_Viewport; int m_MinDepthBits; // Minimum number of bits needed in depth buffer int m_MinStencilBits; // Minimum number of bits needed in stencil buffer bool m_bActive; bool m_bReady; bool m_bGammaCalibrate; bool m_bUseSWVP; bool m_bAllowAlphaPalettes; bool m_bDeviceDoesFlatCubic; bool m_bDeviceDoesGaussianCubic; bool m_bUseWBuffer; int mMinTextureWidth, mMinTextureHeight; int m_SceneRecurseCount; D3DGAMMARAMP m_SystemGammaRamp; bool m_bHALExists, m_bHALIsSampleCompatible, m_bHALIsWindowedCompatible, m_bHALIsDesktopCompatible; int m_CurPal; // Direct3D-specific render options. int m_MaxAnisotropyLevel; int m_AnisotropyLevel; SD3DStats mStats; D3DMATERIAL8 m_Material; D3DLIGHT8 m_Lights[16]; float m_CurStereoSeparation; //================================================================== public: STexStageInfo mStages[MAX_TMU]; int m_TextureBits; IDirect3DVertexBuffer8 *m_pQuadVB; IDirect3DVertexBuffer8 *m_pLineVB; LPDIRECT3DDEVICE8 m_pd3dDevice; // The D3D rendering device #ifndef _XBOX CGcontext m_CGContext; #endif // Pixel formats from D3D. SPixFormat mFormat8000; //8 bit alpha SPixFormat mFormat8888; //32 bit SPixFormat mFormat1555; //16 bit SPixFormat mFormat4444; //16 bit SPixFormat mFormat0555; //16 bit SPixFormat mFormat0565; //16 bit SPixFormat mFormatU8V8; //16 bit SPixFormat mFormatQ8W8U8V8; //32 bit SPixFormat mFormatX8L8U8V8; //32 bit SPixFormat mFormatU5V5L6; //16 bit SPixFormat mFormatDXT1; //Compressed RGB SPixFormat mFormatDXT3; //Compressed RGBA SPixFormat mFormatDXT5; //Compressed RGBA SPixFormat mFormatPal8; //Paletted 8 bit SPixFormat* mFirstPixelFormat; int mZBias; byte m_GammmaTable[256]; bool m_bEnableLights; public: LPDIRECT3DDEVICE8 mfGetD3DDevice() { return m_pd3dDevice; } LPDIRECT3D8 mfGetD3D() { return m_pD3D; } D3DSURFACE_DESC* mfGetZSurfaceDesc() { return &m_d3dsdZBuffer; } LPDIRECT3DSURFACE8 mfGetZSurface() { return m_pZBuffer; } LPDIRECT3DSURFACE8 mfGetBackSurface() { return m_pBackBuffer; } D3DCAPS8 *mfGetD3DCaps() { return &m_d3dCaps; } int GetAnisotropicLevel() { if (GetFeatures() & RFT_ALLOWANISOTROPIC) return CV_r_texture_anisotropic_level; return 0; } void SetDefaultTexParams(bool bUseMips, bool bRepeat, bool bLoad); public: //============================================================= byte eCurColorOp[MAX_TMU]; int msCurState; void D3DSetCull(ECull eCull); char *D3DError( HRESULT h ); void DrawQuad(float x0, float y0, float x1, float y1, const CFColor & color, float ftx0 = 0, float fty0 = 0, float ftx1 = 1, float fty1 = 1); void DrawQuad3D(const Vec3d & v0, const Vec3d & v1, const Vec3d & v2, const Vec3d & v3, const CFColor & color, float ftx0 = 0, float fty0 = 0, float ftx1 = 1, float fty1 = 1, float ftx2 = 0, float fty2 = 0, float ftx3 = 1, float fty3 = 1); private: void RegisterVariables(); void UnRegisterVariables(); bool Error(char *Msg, HRESULT h); bool SetWindow(int width, int height, bool fullscreen, WIN_HWND hWnd); bool SetRes(); void UnSetRes(); HRESULT DeleteDeviceObjects(); HRESULT InvalidateDeviceObjects(); HRESULT FinalCleanup(); HRESULT ConfirmDevice( D3DCAPS8* pCaps, DWORD dwBehavior, D3DFORMAT Format ); bool FindDepthStencilFormat( UINT iAdapter, D3DDEVTYPE DeviceType, D3DFORMAT TargetFormat, D3DFORMAT* pDepthStencilFormat ); HRESULT BuildDevicesList(); HRESULT AdjustWindowForChange(); HRESULT InitDeviceObjects(); void RecognizePixelFormat(SPixFormat& Dest, D3DFORMAT FromD3D, INT InBitsPerPixel, const TCHAR* InDesc); HRESULT RestoreDeviceObjects(); void SetRendParms(SD3DModeInfo *pModeInfo, SD3DDeviceInfo *pDeviceInfo); HRESULT Initialize3DEnvironment(); bool IsSuitableDevice(int a, bool bAllowSoft); void DestroyWindow(void); void RestoreGamma(void); void SetGamma(float fGamma, float fBrigtness, float fContrast); virtual char* GetVertexProfile(); virtual char* GetPixelProfile(); void PrepareOutSpaceTextures(CREOutSpace * pRE); void ScanOutSpaceCube(uint & nTexID, const Vec3d & vPos, int * pResult); void DrawOutSpaceSide( const float *angle, const Vec3d& Pos, int tex_size, int offsetX, int offsetY); struct texture_info { texture_info() { ZeroStruct(*this); } char filename[256]; int bind_id; int low_tid; int type; int last_time_used; }; list2 m_texture_registry; int FindTextureInRegistry(const char * filename, int * tex_type); int RegisterTextureInRegistry(const char * filename, int tex_type, int tid, int low_tid); unsigned int MakeTextureREAL(const char * filename,int *tex_type, unsigned int load_low_res); unsigned int CheckTexturePlus(const char * filename, const char * postfix); public: LPD3DXMATRIXSTACK m_matView; LPD3DXMATRIXSTACK m_matProj; D3DXMATRIX m_matViewInv; D3DXMATRIX m_TexMatrix[4]; int m_MatDepth; static int CV_d3d8_texture_filter_anisotropic; static int CV_d3d8_nodeviceid; static int CV_d3d8_palettedtextures; static int CV_d3d8_compressedtextures; static int CV_d3d8_usebumpmap; static int CV_d3d8_bumptype; static int CV_d3d8_forcesoftwarevp; static int CV_d3d8_texturebits; static int CV_d3d8_texmipfilter; static ICVar *CV_d3d8_texturefilter; static int CV_d3d8_squaretextures; static int CV_d3d8_mipprocedures; static ICVar *CV_d3d8_device; static int CV_d3d8_allowsoftware; static float CV_d3d8_gamma; static int CV_d3d8_rb_verts; static int CV_d3d8_rb_tris; static int CV_d3d8_decaloffset; static float CV_d3d8_normalmapscale; //============================================================ // Renderer interface bool m_bInitialized; string m_Description; bool m_bFullScreen; int m_AlphaDepth; TArray m_RContexts; SD3DContext *m_CurrContext; public: #ifndef PS2 virtual WIN_HWND Init(int x,int y,int width,int height,unsigned int cbpp, int zbpp, int sbits, bool fullscreen,WIN_HINSTANCE hinst, WIN_HWND Glhwnd=0, WIN_HDC Glhdc=0, WIN_HGLRC hGLrc=0, bool bReInit=false); #else //PS2 virtual bool Init(int x,int y,int width,int height,unsigned int cbpp, int zbpp, int sbits, bool fullscreen, bool bReInit=false); #endif //endif virtual bool SetCurrentContext(WIN_HWND hWnd); virtual bool CreateContext(WIN_HWND hWnd, bool bAllowFSAA=false); virtual bool DeleteContext(WIN_HWND hWnd); virtual void ShareResources( IRenderer *renderer ); virtual void MakeCurrent(); virtual bool ChangeDisplay(unsigned int width,unsigned int height,unsigned int cbpp); virtual void ChangeViewport(unsigned int x,unsigned int y,unsigned int width,unsigned int height); virtual int EnumDisplayFormats(TArray& Formats, bool bReset); virtual void RefreshResources(int nFlags); virtual void BeginFrame(); virtual void ShutDown(bool bReInit=false); virtual void Update(void); virtual void GetMemoryUsage(ICrySizer* Sizer); virtual void WriteXY (CXFont *currfont,int x,int y, float xscale,float yscale,float r,float g,float b,float a,const char *message, ...); virtual void Draw2dImage(float xpos,float ypos,float w,float h,int textureid,float s0=0,float t0=0,float s1=1,float t1=1,float angle=0,float r=1,float g=1,float b=1,float a=1,float z=1); //! Draw a image using the current matrix virtual void DrawImage(float xpos,float ypos,float w,float h,int texture_id,float s0,float t0,float s1,float t1,float r,float g,float b,float a); virtual void Print(CXFont *currfont,float x, float y, const char *buf,float xscale,float yscale,float r,float g,float b,float a); virtual void SetCullMode(int mode=R_CULL_BACK); virtual void EnableBlend(bool enable); virtual void SetBlendMode(int mode); virtual bool EnableFog(bool enable); virtual void SetFog(float density, float fogstart, float fogend, const float *color, int fogmode); //virtual CImage *TryLoadImage(const char *szFilename) { return (NULL); } virtual void SetLodBias(float value); virtual void SelectTMU(int tnum); virtual void EnableTMU(bool enable); virtual void SetTexture(int tnum, ETexType Type=eTT_Base); virtual void SetEnviMode(int mode); virtual unsigned int DownLoadToVideoMemory(unsigned char *data,int w, int h, ETEX_Format eTFSrc, ETEX_Format eTFDst, int nummipmap, bool repeat=true, int filter=FILTER_BILINEAR, int Id=0); virtual void UpdateTextureInVideoMemory(uint tnum, unsigned char *newdata,int posx,int posy,int w,int h,ETEX_Format eTF=eTF_0888){}; virtual void RemoveTexture(unsigned int TextureId); virtual void RemoveTexture(ITexPic * pTexPic); virtual unsigned int MakeTexture(const char * filename,int *tex_type=NULL/*,unsigned int def_tid=0*/); virtual unsigned int LoadTexture(const char * filename,int *tex_type=NULL,unsigned int def_tid=0,bool compresstodisk=true,bool bWarn=true); virtual void SetCamera(const CCamera &cam); virtual void SetViewport(int x=0, int y=0, int width=0, int height=0); virtual void SetScissor(int x=0, int y=0, int width=0, int height=0); virtual void Draw3dBBox(const Vec3d &mins,const Vec3d &maxs, int nPrimType); virtual void Draw3dPrim(const Vec3d &mins,const Vec3d &maxs, int nPrimType=DPRIM_WHIRE_BOX, const float* fRGBA = NULL); virtual void EnableTexGen(bool enable); virtual void SetTexgen(float scaleX, float scaleY,float translateX,float translateY); virtual void SetTexgen3D(float x1, float y1, float z1, float x2, float y2, float z2); virtual void SetSphericalTexgen(); virtual CVertexBuffer *CreateBuffer(int buffersize,int vertexformat, const char *szSource, bool bDynamic=false); virtual void CreateBuffer(int size, int vertexformat, CVertexBuffer *buf, int Type, const char *szSource); virtual void DrawBuffer(CVertexBuffer *src,SVertexStream *indicies,int numindices, int offsindex, int prmode,int vert_start=0,int vert_stop=0, CMatInfo *mi=NULL); void UnlockBuffer(CVertexBuffer *dest, int Type); virtual void UpdateBuffer(CVertexBuffer *dest,const void *src,int vertexcount, bool bUnLock, int offs=0, int Type=0); virtual void CreateIndexBuffer(SVertexStream *dest,const void *src,int indexcount); virtual void UpdateIndexBuffer(SVertexStream *dest,const void *src,int indexcount, bool bUnLock=true); virtual void ReleaseIndexBuffer(SVertexStream *dest); virtual void ReleaseBuffer(CVertexBuffer *bufptr); virtual void CheckError(const char *comment); virtual int SetPolygonMode(int mode); virtual void PushMatrix(); virtual void PopMatrix(); virtual void RotateMatrix(float a,float x,float y,float z); virtual void RotateMatrix(const Vec3d & angels); virtual void ScaleMatrix(float x,float y,float z); virtual void TranslateMatrix(float x,float y,float z); virtual void TranslateMatrix(const Vec3d &pos); virtual void EnableVSync(bool enable); virtual void EnableDepthTest(bool enable); virtual void EnableDepthWrites(bool enable); virtual void EnableAlphaTest(bool enable,float alphavalue=0.5f); virtual void DrawTriStrip(CVertexBuffer *src, int vert_num); virtual void ResetToDefault(); virtual void LoadMatrix(const Matrix *src); virtual void MultMatrix(float * mat); virtual int GenerateAlphaGlowTexture(float k); virtual void SetMaterialColor(float r, float g, float b, float a); virtual void SetColorMask(unsigned char r,unsigned char g,unsigned char b,unsigned char a); virtual int LoadAnimatedTexture(const char * format,const int nCount); virtual char * GetStatusText(ERendStats type); virtual char * GetTexturesStatusText(); //virtual void Project3DSprite(const Vec3d &origin,CImage *image); virtual void EnableLight (int id, bool enable); virtual void SetLightPos (int id, Vec3d &pos, bool bDirectional=0); virtual void SetLightDiffuse (int id, Vec3d &color); virtual void SetLightAmbient (int id, Vec3d &color); virtual void SetLightSpecular(int id, Vec3d &color); virtual void SetLightAttenuat(int id, float att); virtual void EnableLighting (bool enable); virtual void SetMaterialDiffuse (Vec3d &color); virtual void SetMaterialAmbient (Vec3d &color); virtual void SetMaterialSpecular(Vec3d &color); virtual void ProjectToScreen(float ptx, float pty, float ptz,float *sx, float *sy, float *sz ); virtual void Draw2dLine(float x1, float y1, float x2, float y2); virtual void DrawPoints(Vec3d v[], int nump, CFColor& col, int flags); virtual void DrawLines(Vec3d v[], int nump, CFColor& col, int flags); virtual void DrawLine(const Vec3d & vPos1, const Vec3d & vPos2); virtual void DrawLineColor(const Vec3d & vPos1, const CFColor & vColor1, const Vec3d & vPos2, const CFColor & vColor2); virtual void DrawBall(float x, float y, float z, float radius); virtual void DrawBall(const Vec3d & pos, float radius ); virtual void DrawPoint(float x, float y, float z, float fSize); virtual int UnProject(float sx, float sy, float sz, float *px, float *py, float *pz, const float modelMatrix[16], const float projMatrix[16], const int viewport[4]); virtual int UnProjectFromScreen( float sx, float sy, float sz, float *px, float *py, float *pz); virtual void PrepareDepthMap(ShadowMapFrustum * lof, bool make_new_tid); virtual void ConfigCombinersForShadowPass(); virtual void ConfigCombinersForHardwareShadowPass(int withTexture, float * lightDimColor); virtual void ConfigShadowTexgen(int Num, int rangeMap, ShadowMapFrustum * pFrustum, float * pLightFrustumMatrix, float * pLightViewMatrix); virtual void SetupShadowOnlyPass(int Num, ShadowMapFrustum * pFrustum, Vec3d * vShadowTrans, const float fShadowScale, Vec3d vObjTrans=Vec3d(0,0,0), float fObjScale=1.f, const Vec3d vObjAngles=Vec3d(0,0,0), Matrix44 * pObjMat=0); // virtual void DrawShadowGrid(const Vec3d & pos, const Vec3d & Scale, ShadowMapFrustum*lf, bool translate_projection, float alpha, IndexedVertexBuffer* pVertexBuffer, float anim_angle); int MakeShadowIdentityTexture(); virtual void SetClipPlane( int id, float * params ){}; virtual void EnableBumpCombinersAdditive(){} virtual void EnableCombiners(bool enable){}; virtual int GenBumpTexUnsignedNorMap(char * bump_filename){return 0;}; virtual void GetModelViewMatrix(float * mat); virtual void GetProjectionMatrix(float * mat); virtual void DrawObjSprites (list2 *pList, float fMaxViewDist, CObjManager *pObjMan); virtual void DrawQuad(const Vec3d &right, const Vec3d &up, const Vec3d &origin,int nFlipMode=0); virtual void DrawQuad(float dy,float dx, float dz, float x, float y, float z); virtual void DrawQuadInFogVolume(float dy,float dx, float dz, float x, float y, float z, float fFogLevel, float fFogViewDist); virtual void GenTexID(int num, unsigned int * ids){}; //fog void EnableFogCoordExt(bool enable){}; void SetFogColor(float * color); virtual void TransformTextureMatrix(float x, float y, float angle, float scale); virtual void ResetTextureMatrix(); virtual void SetPerspective(const CCamera &cam); virtual void ClearDepthBuffer(); virtual void ClearColorBuffer(const Vec3d vColor); virtual void ReadFrameBuffer(unsigned char * pRGB, int nSizeX, int nSizeY, bool bBackBuffer, bool bRGBA); //misc virtual void ScreenShot(const char *filename=NULL) {}; virtual uint MakeSprite(float object_scale, int tex_size, float angle, IStatObj * pStatObj, uchar * _pTmpBuffer, uint def_tid); virtual uint Make3DSprite(int nTexSize, float fAngleStep, IStatObj * pStatObj); virtual void EnablePolygonOffset(bool enable, float factor/*1.1f*/, float units/*4.0f*/){}; virtual void UnloadOldTextures(){}; virtual void Set2DMode(bool enable, int ortox, int ortoy); virtual void PrintToScreen(float x, float y, float size, const char *buf); virtual int ScreenToTexture(){ return 0; }; virtual void SetFenceCompleted(CVertexBuffer * buffer){}; virtual void SetTexClampMode(bool clamp); virtual void SetDepthFunc(int mode); virtual void EnableStencilTest(bool enable); virtual void SetStencilMask(unsigned char value); virtual void SetStencilFunc(int func,int ref,int mask); virtual void SetStencilOp(int fail,int zfail,int pass); virtual void DrawTransparentQuad2D(float color); virtual void EnableAALines(bool bEnable); virtual void DrawCircle(float fX, float fY, float fZ, float fRadius); virtual bool SetGammaDelta(const float fGamma); ////////////////////////////////////////////////////////////////////// // Replacement functions for the Font engine virtual bool FontUploadTexture(class CFBitmap*); virtual void FontReleaseTexture(class CFBitmap *pBmp); virtual void FontSetTexture(class CFBitmap*); virtual void FontSetRenderingState(unsigned long nVirtualScreenWidth, unsigned long nVirtualScreenHeight); virtual void FontSetBlending(int src, int dst); virtual void FontRestoreRenderingState(); virtual void FontSetState(bool bRestore); virtual void DrawString(int x, int y,bool bIgnoreColor,const char *message, ...); ////////////////////////////////////////////////////////////////////// // Shaders pipeline virtual void EF_Release(int nFlags); virtual void EF_PipelineShutdown(); void EF_ClearBuffer(bool bForce, float *Colors); virtual void EF_LightMaterial(SLightMaterial *lm, bool bEnable, int Flags); byte *m_SysArray; ECull m_eCull; int m_EnableLights; D3DXMATRIX *m_CurOpMatrix; bool m_bInvertedMatrix; D3DXMATRIX m_InvertedMatrix; bool m_bMatColor; _inline void EF_PushMatrix() { m_matView->Push(); m_pd3dDevice->SetTransform(D3DTS_VIEW, m_matView->GetTop()); m_MatDepth++; } _inline void EF_PopMatrix() { m_matView->Pop(); m_pd3dDevice->SetTransform(D3DTS_VIEW, m_matView->GetTop()); m_MatDepth--; m_bInvertedMatrix = false; } _inline D3DXMATRIX *EF_InverseMatrix() { if (m_bInvertedMatrix) return &m_InvertedMatrix; D3DXMATRIX *mi; if (m_MatDepth) { D3DXMATRIX *m = m_matView->GetTop(); D3DXMatrixInverse(&m_InvertedMatrix, NULL, m); mi = &m_InvertedMatrix; } else mi = &m_matViewInv; m_bInvertedMatrix = true; return mi; } _inline void EF_SetGlobalColor(UCol& color) { if (!m_bMatColor) { m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR ); m_bMatColor = true; } m_pd3dDevice->SetRenderState( D3DRS_TEXTUREFACTOR, color.dcolor ); } _inline void EF_SetGlobalColor(float r, float g, float b, float a) { if (!m_bMatColor) { m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR ); m_bMatColor = true; } UCol color; color.bcolor[0] = (byte)(b * 255.0f); color.bcolor[1] = (byte)(g * 255.0f); color.bcolor[2] = (byte)(r * 255.0f); color.bcolor[3] = (byte)(a * 255.0f); m_pd3dDevice->SetRenderState( D3DRS_TEXTUREFACTOR, color.dcolor ); } _inline void EF_SetVertColor() { if (m_bMatColor) { m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); m_bMatColor = false; } } _inline void EF_SetArrayPointers(TArray& Pointers, int Id) { for (int i=0; imfSet(Id); } } _inline void EF_SelectTMU(int Stage) { CTexMan::m_CurStage = Stage; } void EF_SetColorOp(byte co); // Clip Planes support void EF_SetClipPlane (bool bEnable, float *pPlane, bool bRefract); void EF_Init(); void EF_PreRender(); void EF_PostRender(); void EF_RenderPipeLine(void (*RenderFunc)()); void EF_InitRandTables(); void EF_InitWaveTables(); void EF_InitEvalFuncs(int num); void EF_InitD3DFixedPipeline(); bool EF_PreDraw(); void EF_SetCameraInfo(); void EF_SetObjectTransform(CCObject *obj); bool EF_ObjectChange(SShader *Shader, int nObject, CRendElement *pRE); void EF_UpdateTextures(SShaderPass *Layer); void EF_UpdateTextures(SShaderPassHW *Layer); void EF_DrawFogOverlay(); void EF_DrawDetailOverlay(); void EF_DrawDecalOverlay(); void EF_EvalNormalsRB(SShader *ef); void EF_Eval_DeformVerts(TArray* Defs); void EF_Eval_RGBAGen(SShaderPass *sfm); void EF_Eval_TexGen(SShaderPass *sfm); void EF_ApplyMatrixOps(TArray* MatrixOps, bool bEnable); bool EF_SetLights(int Flags, bool Enable); void EF_SetHWLight(int Num, vec4_t Pos, CFColor& Diffuse, CFColor& Specular, float ca, float la, float qa, float fRange); void EF_DrawDebugLights(); void EF_DrawDebugTools(); static void EF_DrawWire(); static void EF_DrawNormals(); static void EF_DrawTangents(); static void EF_Flush(); _inline void EF_Draw(SShader *sh, SShaderPass *sl) { if (!CV_r_nodrawshaders) { if (m_RP.m_pRE) m_RP.m_pRE->mfDraw(sh, sl); else EF_DrawIndexedMesh(R_PRIMV_TRIANGLES); } } void EF_DrawIndexedMesh (int nPrimType); void EF_DrawLayersHW(SShaderTechnique *hs, SShader *ef); void EF_DrawLightsHW(SShaderTechnique *hs, SShader *ef, int Stage); void EF_FlushHW(); void EF_SetStateShaderState(); void EF_ResetStateShaderState(); bool EF_SetResourcesState(bool bSet); void EF_FlushShader(); int EF_Preprocess(SRendItemPre *ri, int nums, int nume); void EF_DrawREPreprocess(SRendItemPreprocess *ris, int Nums); void EF_PipeLine(int nums, int nume, int nList, int nSortType, void (*RenderFunc)()); STWarpZone *EF_SetWarpZone(SWarpSurf *sf, int *NumWarps, STWarpZone Warps[]); void EF_UpdateWarpZone(STWarpZone *wp, SWarpSurf *srf); bool EF_CalcWarpCamera(STWarpZone *wp, int nObject, CCamera& prevCam, CCamera& newCam); bool EF_RenderWarpZone(STWarpZone *wp); void EF_PrintProfileInfo(); virtual void EF_CheckOverflow(int nVerts, int nTris, CRendElement *re); virtual void EF_EndEf3D (bool bSort); virtual void EF_EndEf2D(bool bSort); // 2d only virtual void EF_Start(SShader *ef, SShader *efState, SRenderShaderResources *Res, int nFog, CRendElement *re); virtual void EF_Start(SShader *ef, SShader *efState, SRenderShaderResources *Res, CRendElement *re); virtual bool EF_SetLightHole(Vec3d vPos, Vec3d vNormal, int idTex, float fScale=1.0f, bool bAdditive=true); virtual int EF_RegisterFogVolume(float fMaxFogDist, float fFogLayerZ, CFColor color); virtual void SetTexGen(byte eTC) {}; virtual void SetState(int st); virtual STexPic *EF_MakePhongTexture(int Exp); void EF_InitFogVolumes(); virtual WIN_HWND GetHWND() { return 0; } // virtual void ClearAlphaBuffer(float fAlphaValue) {} }; extern CD3D8Renderer *gcpRendD3D; class CD3D8TexMan : public CTexMan { protected: virtual STexPic *CreateTexture(const char *name, int wdt, int hgt, int depth, uint flags, uint flags2, byte *dst, ETexType eTT, float fAmount1=-1.0f, float fAmount2=-1.0f, int DXTSize=0, STexPic *ti=NULL, int bind=0, ETEX_Format eTF=eTF_8888, const char *szSourceName=NULL); virtual STexPic *CopyTexture(const char *name, STexPic *ti, int CubeSide=-1); public: CD3D8TexMan() : CTexMan() { #ifndef _XBOX m_CurPal = 1; #endif m_pCurCubeTexture = NULL; } void D3DCompressTexture(int tgt, STexPicD3D *ti, int CubeSide); void D3DCreateVideoTexture(int tgt, byte *src, int wdt, int hgt, D3DFORMAT SrcFormat, D3DFORMAT DstFormat, STexPicD3D *ti, bool bMips, int CubeSide, PALETTEENTRY *pe, int DXTSize); void BuildMipsSub(byte* src, int wdt, int hgt); void ClearBuffer(int Width, int Height, bool bEnd, STexPic *pImage, int Side); void DrawCubeSide( const float *angle, Vec3d& Pos, int tex_size, int side, int RendFlags); void CreateBufRegion(int Width, int Height); void AmplifyGlare(SByteColor *glarepixels, int width, int height); void SmoothGlare(SByteColor *src, int src_w, int src_h, SLongColor *dst); void BlurGlare(SByteColor *src, int src_w, int src_h, SByteColor *dst, SLongColor *p, int boxw, int boxh); float CalcFogVal(float fi, float fj); void GenerateFlareMap(); void GenerateFogMaps(); static void CalcMipsAndSize(STexPic *ti); static BindNULL(int From) { int n = CTexMan::m_nCurStages; CTexMan::m_nCurStages = From; for (; FrommfGetD3DDevice()->SetTexture(From, NULL); gcpRendD3D->EF_SelectTMU(From); gcpRendD3D->EF_SetColorOp(eCO_DISABLE); gcpRendD3D->mStages[From].Texture = NULL; } } virtual ~CD3D8TexMan(); virtual STexPic *GetByID(int Id); virtual SRefTex *AddToHash(int Id, STexPic *ti); virtual void RemoveFromHash(int Id, STexPic *ti); virtual void SetTexture(int Id, ETexType eTT); virtual byte *GenerateDXT_HW(STexPic *ti, EImFormat eF, byte *dst, int *numMips, int *DXTSize, bool bMips); virtual bool SetFilter(char *filt); virtual void UpdateTextureData(STexPic *pic, byte *data, int USize, int VSize, bool bProc, int State, bool bPal); virtual STexPic *CreateTexture(); virtual bool ScanEnvironmentCM (const char *name, int size, Vec3d& Pos); virtual void ScanEnvironmentCube(SEnvTexture *cm, int RendFlags); virtual void ScanEnvironmentTexture(SEnvTexture *cm, int RendFlags); virtual void EndCubeSide(CCObject *obj, bool bNeedClear); virtual void StartCubeSide(CCObject *obj); virtual void DrawToTexture(Plane& Pl, STexPic *Tex, int RendFlags); virtual void DrawToTextureForGlare(int Id); virtual void DrawToTextureForRainMap(int Id); virtual void StartHeatMap(int Id); virtual void EndHeatMap(); virtual void StartNightMap(int Id); virtual void EndNightMap(); virtual void StartMotionMap(int Id, CCObject *pObject); virtual void EndMotionMap(void); virtual void StartScreenMap(int Id); virtual void EndScreenMap(); // tiago: added virtual void StartScreenTexMap(int Id); virtual void EndScreenTexMap(); virtual void DrawFlashBangMap(int Id, int RendFlags, CREFlashBang *pRE); virtual void Update(); virtual void GenerateFuncTextures(); IDirect3DSurface8* m_pZSurf; LPDIRECT3DCUBETEXTURE8 m_pCurCubeTexture; STexPicD3D *m_CurCubeFaces[6]; CCamera m_PrevCamera; int m_TempX, m_TempY, m_TempWidth, m_TempHeight; static int TexSize(int wdt, int hgt, int mode); #ifndef _XBOX int m_CurPal; #endif static int m_Format; static int m_FirstBind; static TTextureMap m_RefTexs; }; #endif //PS2 #endif // DRIVERD3D8_H