/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef WATCHMAKER_RENDER_H #define WATCHMAKER_RENDER_H #include "common/array.h" #include "watchmaker/types.h" #include "watchmaker/windows_hacks.h" #include "watchmaker/3d/texture.h" #include "watchmaker/3d/material.h" namespace Watchmaker { // Material properties #define T3D_MATERIAL_CLIPMAP (1<<0) // clipmap #define T3D_MATERIAL_OPACITY (1<<1) // opacity (0-24) #define T3D_MATERIAL_ADDITIVE (1<<2) // additive (25-49) #define T3D_MATERIAL_GLASS (1<<3) // glass (50-74) #define T3D_MATERIAL_BOTTLE (1<<4) // bottle (75-100) #define T3D_MATERIAL_ENVIRONMENT (1<<5) // environment #define T3D_MATERIAL_SKY (1<<6) // sky #define T3D_MATERIAL_NOLIGHTMAP (1<<7) // no lightmap #define T3D_MATERIAL_MOVIE (1<<8) // with movie #define T3D_MATERIAL_FLARE (1<<9) // flare #define T3D_MATERIAL_FLARE_SUN (1<<10) // flare sun #define T3D_MATERIAL_FLARESOFT (1<<11) // flare soft #define T3D_MATERIAL_SMOKE (1<<12) // smoke #define T3D_MATERIAL_MOVIEPAUSED (1<<13) // if movie is paused // Backbuffer & Z-Buffer #define rCLEARZBUFFER (1<<0) // clear zbuffer #define rCLEARBACKBUFFER (1<<1) // clear back buffer #define rCLEARSCREENBUFFER (1<<2) // clear screen buffer // rendering modes #define rSOLIDMODE 1 // render in solid mode #define rWIREFRAMEMODE 2 // render in wireframe // vertex buffer lock options #define rVBLOCK_READONLY 1 // lock VB for reading #define rVBLOCK_WRITEONLY 2 // lock VB for writing #define rVBLOCK_NOSYSLOCK 4 // lock VB without hanging the system // VertexBuffers #define MAX_LINES 50000 // max lines in VB #define MAX_SHADOWS_PER_LIGHT 30 // max shadows per light #define MAX_BATCH_BLOCKS 512 // max normal batch blocks #define MAX_BATCH_BLOCKS_SPECIAL 128 // max special batch blocks #define MAX_BATCH_BLOCKS_LIGHTMAPS 512 // max lightmaps batch blocks #define MAX_BATCH_BLOCKS_SKY 4 // max sky batch blocks #define FLEXIBLEVERTEXFLAGS (D3DFVF_XYZ | D3DFVF_DIFFUSE |D3DFVF_TEX2 ) // VB struct elements //#define FLEXIBLEVERTEXFLAGSDEST (D3DFVF_XYZRHW | D3DFVF_DIFFUSE |D3DFVF_TEX2 ) // Bitmap & Texture #define rBITMAPSURFACE (0) // Plain bitmap image; fit the backbuffer pixelformat #define rTEXTURESURFACE (1<<0) // Use when loading an image; if flag specified the image fit the texture pixelformat #define rSURFACESTRETCH (1<<1) // Used for bitmaps; strech the pic to a new dimension using DX (could produce very bad results) #define rSURFACECOPY (1<<2) // Not supported yet #define rSURFACEHALF (1<<3) // Used for texture; hal the dimension during loading #define rSURFACEFLIP (1<<4) // Flip upside-down the loaded image struct VertexBuffer { // Just cheat for now, and do this offline. Common::Array _buffer; }; struct SHADOW { uint32 totalverts, num_objverts; // number of vertices in the shadow mesh uint32 num_side_indices, num_cap_indices; // number of indices // LPDIRECT3DVERTEXBUFFER7 VB,ProjVertsVB; // holds vertices of shadow volumes void *VB; void *ProjVertsVB; // holds vertices of shadow volumes uint16 *pwShadVolIndices; // tri indices into vertex buffer VB for DrawPrim uint16 *pwShadVolSideIndices; // ptrs into main index array pwShadVolIndices for Side tris of shadow volume int16 *pwShadVolCapIndices; // ptrs into main index array pwShadVolIndices for cap tris of shadow volume gTexture ProjectiveTexture; // texture to be projected }; struct SHADOWBOX { SHADOW ShadowsList[MAX_SHADOWS_PER_LIGHT]; // shadow elements unsigned int NumShadowsList; // number of shadow elements int VBO; //LPDIRECT3DVERTEXBUFFER7 VB; // shadow VB uint32 NumVerts; // num verts in shadow box uint32 NumIndices; // num indices uint16 *pwIndices; // pointer to indices list uint16 Intensity; // shadow intensity uint16 ViewMatrixNum; // number of view matrix }; struct gBatchBlock { signed short int Texture1 = 0, Texture2 = 0; // texture ID unsigned int Flags1 = 0, Flags2 = 0; // flags signed short int ViewMatrixNum = 0; // view matrix num unsigned short int NumFaces() { return FacesList.size(); // faces number } unsigned short int NumVerts() { if (VBO) return VBO->_buffer.size(); // verts number else return 0; } Common::Array FacesList; // pointer to faces list Common::SharedPtr VBO = nullptr; // LPDIRECT3DVERTEXBUFFER7 VB; // block VB gBatchBlock() {} gBatchBlock(signed short int texture1, signed short int texture2, unsigned int flags1, unsigned int flags2) : Texture1(texture1), Texture2(texture2), Flags1(flags1), Flags2(flags2) {} }; class WorkDirs; //Rendering control functions gBatchBlock *rNewBatchBlock(signed short int T1, unsigned int F1, signed short int T2, unsigned int F2); void rBuildMaterialList(MaterialTable &MatList, unsigned int NumMat, signed short int ViewMatrixNum); bool rRenderScene(); void rResetPipeline(); // Function declaration bool rGrabVideo(const char *path, char flags); bool rRenderReady(); //Materials, textures and bitmap functions MaterialTable rCreateMaterialList(int num); bool rSetMovieFrame(MaterialPtr mat, uint32 dwCurrFrame); uint32 rGetMovieFrame(MaterialPtr mat); void rReleaseAllTextures(unsigned int NotFlags); class WGame; int rLoadBitmapImage(WGame &game, const char *TextName, unsigned char flags); void rReleaseAllBitmaps(unsigned int NotFlags); void rReleaseBitmap(int i); void rReleaseBitmapDirect(gTexture *b); void rSetLoaderFlags(unsigned int NewLoaderFlags); int rCreateSurface(unsigned int dimx, unsigned int dimy, unsigned char flags); void *rCreateSurfaceP(unsigned int dimx, unsigned int dimy, unsigned char flags); char *rGetBitmapName(unsigned int id); void rSetBitmapName(unsigned int id, const char *s); unsigned char *rLockSurface(int surf, unsigned int *pitch); unsigned char *rLockSurfaceDirect(gTexture *t, unsigned int *pitch); void rUnlockSurface(int surf); void rUnlockSurfaceDirect(gTexture *t); uint16 rRGBAToSurfaceFormat(unsigned int R, unsigned int G, unsigned int B, unsigned int A); uint16 rRGBAToTextureFormat(unsigned int r, unsigned int g, unsigned int b, unsigned int a); void rSurfaceFormatToRGBA(uint32 color, unsigned int *R, unsigned int *G, unsigned int *B, unsigned int *A); void rTextureFormatToRGBA(uint16 color, unsigned int *R, unsigned int *G, unsigned int *B, unsigned int *A); gTexture *rGetSurfaceTexture(int pos); gTexture *rCopyTexture(gTexture *t); //VertexBuffer and triangles functions VertexBuffer rCreateVertexBuffer(unsigned int num); bool rDeleteVertexBuffer(VertexBuffer &vb); gVertex *rLockVertexPtr(void *vb, int flags); void *rGetUserVertexBuffer(); unsigned int rGetUserVertexBufferCounter(); void rSetUserVertexBufferCounter(unsigned int uvbc); bool rUnlockVertexPtr(void *vb); uint16 *rGetLinesArrayPtr(); void rAddLinesArray(); unsigned int rGetNumLinesArray(); void rAddTrianglesArray(float x, float y, int r, int g, int b, int a); int16 *rGetTrianglesArrayPtr(); unsigned int rGetNumTrianglesArray(); void *rLockPointArray(); void rUnlockPointArray(); unsigned int rGetNumPointArray(); void rAddPointArray(); void rOptimizeVertexArray(void *v); bool rMakeShadowVolume(SHADOWBOX *sb, gVertex *InVerts, DWORD nverts, float lightm[9]); bool rMakeShadowBox(SHADOWBOX *sb, float BoxX, float BoxY, float BoxZ, WORD intens); bool rMakeProjectiveShadow(SHADOWBOX *sb, void *InVerts, DWORD nverts); //Setup & clear functions class WGame; bool rInitialize3DEnvironment(WGame &game, char *cfg); char *rGetRenderDllDesc(); void rSetFlagsFullScreen(); bool rGetFlagsFullScreen(); void rSetRenderMode(int state); bool rClearBuffers(char flags); void rGetScreenInfos(unsigned int *width, unsigned int *height, unsigned int *bpp); void rRelaseFontTable(unsigned short *ft); void rRelaseAllFontTable(); void rGetBlitterViewport(unsigned int *left, unsigned int *top, unsigned int *right, unsigned int *bottom); void rUpdateExtends(int x1, int y1, int x2, int y2); void rGetExtends(int *x1, int *y1, int *x2, int *y2); void rResetExtends(); int rBlitSetStandardFont(signed int color, unsigned short *table); int DebugQuick(signed int StdPx, signed int StdPy, const char *format, ...); bool rGetStencilBitDepth(); //Misc functions void rBlitter(WGame &game, int dst, int src, int dposx, int dposy, int sposx, int sposy, int sdimx, int sdimy); //D3d specific geometry trasf. functions struct t3dM3X3F; struct t3dV3F; void rSetViewMatrix(const t3dM3X3F &viewMatrix, const t3dV3F &translation); int rBuildLinesViewMatrix(const t3dM3X3F &viewMatrix, const t3dV3F &translation); int rAddUserViewMatrix(const t3dM3X3F &viewMatrix, const t3dV3F &translation); void rSetUserViewMatrix(int num); void rSaveViewMatrix(); void rRestoreViewMatrix(); void rSetLinesViewMatrix(); bool checkGlError(const char *when = ""); } // End of namespace Watchmaker #endif // WATCHMAKER_RENDER_H