From 5c4dd797ce551e334ef0ca34fe87040fd153072d Mon Sep 17 00:00:00 2001 From: lewa_j Date: Sat, 16 May 2026 22:35:15 +0300 Subject: [PATCH] ref_dx2: rebase onto ref_api v17 --- ref/dx2/r_context.c | 219 ++++++++------------------------ ref/dx2/r_d3d.c | 12 +- ref/dx2/r_draw.c | 27 ---- ref/dx2/r_image.c | 299 ++++++++++++-------------------------------- ref/dx2/r_local.h | 78 ++---------- ref/dx2/r_main.c | 136 ++++++++------------ ref/dx2/r_surf.c | 48 +++---- ref/dx2/wscript | 2 +- 8 files changed, 215 insertions(+), 606 deletions(-) diff --git a/ref/dx2/r_context.c b/ref/dx2/r_context.c index 06aa481f..16ba7d7f 100644 --- a/ref/dx2/r_context.c +++ b/ref/dx2/r_context.c @@ -18,13 +18,11 @@ GNU General Public License for more details. #include "r_local.h" #include "xash3d_mathlib.h" #include "crtlib.h" +#include "r_studioint.h" //#pragma comment(lib, "ddraw.lib") //TODO COM_GetProcAddress -ref_api_t gEngfuncs; -ref_globals_t *gpGlobals; -ref_client_t *gp_cl; static void R_SimpleStub( void ) { @@ -83,11 +81,6 @@ void GL_SetRenderMode( int mode ) } -static void CL_AddCustomBeam( cl_entity_t *pEnvBeam ) -{ - ; -} - static void R_ProcessEntData( qboolean allocate, cl_entity_t *entities, unsigned int max_entities ) { if (!allocate) @@ -150,9 +143,16 @@ static void R_StudioLerpMovement( cl_entity_t *e, double time, vec3_t origin, ve ; } -void CL_InitStudioAPI( void ) +static qboolean R_StudioFillAPI( struct engine_studio_api_s *api, struct r_studio_interface_s *pDefaultDraw ) { - ; + return false; +} + +static r_studio_interface_t *pStudioDraw; + +static void R_StudioSetDrawInterface( struct r_studio_interface_s *pDraw ) +{ + pStudioDraw = pDraw; } static void R_SetSkyCloudsTextures( int solidskyTexture, int alphaskyTexture ) @@ -191,12 +191,7 @@ static void CL_DrawBeams( int fTrans, BEAM *beams ) ; } -static qboolean R_BeamCull( const vec3_t start, const vec3_t end, qboolean pvsOnly ) -{ - return false; -} - -static int RefGetParm( int parm, int arg ) +static intptr_t RefGetParm( int parm, int arg ) { dx_texture_t *glt; @@ -252,9 +247,11 @@ static int RefGetParm( int parm, int arg ) return GL_TexMemory(); case PARM_ACTIVE_TMU: return glState.activeTMU; +#endif case PARM_LIGHTSTYLEVALUE: arg = bound(0, arg, MAX_LIGHTSTYLES - 1); - return tr.lightstylevalue[arg]; + return g_lightstylevalue[arg]; +#if 0 case PARM_MAX_IMAGE_UNITS: return GL_MaxTextureUnits(); case PARM_REBUILD_GAMMA: @@ -274,6 +271,9 @@ static int RefGetParm( int parm, int arg ) return GL_TextureFilteringEnabled(R_GetTexture(arg)); #endif + case PARM_GET_STUDIO_HDR: + //return (intptr_t)R_StudioGetHeader(); + return 0; default: return (*gEngfuncs.EngineGetParm)(parm, arg); } @@ -281,37 +281,6 @@ static int RefGetParm( int parm, int arg ) } -static float GetFrameTime( void ) -{ - return 0.0f; -} - -static void R_SetCurrentEntity( struct cl_entity_s *ent ) -{ - ; -} - -static void R_SetCurrentModel( struct model_s *mod ) -{ - ; -} - -static void DrawSingleDecal( struct decal_s *pDecal, struct msurface_s *fa ) -{ - ; -} - -static float *R_DecalSetupVerts( struct decal_s *pDecal, struct msurface_s *surf, int texture, int *outCount ) -{ - return NULL; -} - -static void R_EntityRemoveDecals( struct model_s *mod ) -{ - ; -} - - void GL_Bind( int tmu, unsigned int texnum ) { const dx_texture_t *texture; @@ -332,32 +301,6 @@ void GL_Bind( int tmu, unsigned int texnum ) dxc.currentTexture = texture->d3dHandle; } -static void GL_LoadTextureMatrix( const float *glmatrix ) -{ - ; -} - -static void GL_TexGen( unsigned int coord, unsigned int mode ) -{ - ; -} - -static void GL_DrawParticles( const struct ref_viewpass_s *rvp, qboolean trans_pass, float frametime ) -{ - ; -} - -static colorVec LightVec( const float *start, const float *end, float *lightspot, float *lightvec ) -{ - colorVec c = { 0 }; - return c; -} - -static struct mstudiotex_s *StudioGetTexture( struct cl_entity_s *e ) -{ - return NULL; -} - static qboolean R_SpeedsMessage( char *out, size_t size ) { return false; @@ -365,17 +308,21 @@ static qboolean R_SpeedsMessage( char *out, size_t size ) static void R_NewMap( void ) { - model_t *WORLDMODEL = (gp_cl->models[1]); + tr.worldmodel = gp_cl->models[1]; + + // clear out efrags in case the level hasn't been reloaded + for( int i = 0; i < tr.worldmodel->numleafs; i++ ) + tr.worldmodel->leafs[i+1].efrags = NULL; tr.skytexturenum = -1; // clearing texture chains - for( int i = 0; i < WORLDMODEL->numtextures; i++ ) + for( int i = 0; i < tr.worldmodel->numtextures; i++ ) { - if( !WORLDMODEL->textures[i] ) + if( !tr.worldmodel->textures[i] ) continue; - texture_t *tx = WORLDMODEL->textures[i]; + texture_t *tx = tr.worldmodel->textures[i]; if( !Q_strncmp( tx->name, "sky", 3 ) && tx->width == ( tx->height * 2 )) tr.skytexturenum = i; @@ -385,15 +332,10 @@ static void R_NewMap( void ) GL_BuildLightmaps(); - if (gEngfuncs.drawFuncs->R_NewMap != NULL) + if( gEngfuncs.drawFuncs->R_NewMap != NULL ) gEngfuncs.drawFuncs->R_NewMap(); } -static void *R_GetProcAddress( const char *name ) -{ - return NULL; -} - static void Color4f( float r, float g, float b, float a ) { Vector4Set(dxc.currentColor, r, g, b, a); @@ -404,11 +346,6 @@ static void Color4ub( unsigned char r, unsigned char g, unsigned char b, unsigne Vector4Set(dxc.currentColor, r/255.f, g/255.f, b/255.f, a/255.f); } -static void TexCoord2f( float u, float v ) -{ - ; -} - static void Vertex3fv( const float *worldPnt ) { ; @@ -419,21 +356,6 @@ static void Vertex3f( float x, float y, float z ) ; } -static void Fog( float flFogColor[3], float flStart, float flEnd, int bOn ) -{ - ; -} - -static void GetMatrix( const int pname, float *matrix ) -{ - ; -} - -static void FogParams( float flDensity, int iFogSkybox ) -{ - ; -} - static void CullFace( TRICULLSTYLE mode ) { ; @@ -444,12 +366,17 @@ static void VGUI_SetupDrawing( qboolean rect ) ; } -static void VGUI_UploadTextureBlock( int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight ) +static void R_FillRenderAPI( render_api_t *api ) { ; } -static const ref_interface_t gReffuncs = +static void R_FillTriAPI( triangleapi_t *api ) +{ + ; +} + +const ref_interface_t gReffuncs = { .R_Init = R_Init, .R_Shutdown = R_Shutdown, @@ -474,9 +401,7 @@ static const ref_interface_t gReffuncs = .GL_SetRenderMode = GL_SetRenderMode, .R_AddEntity = R_AddEntity, - .CL_AddCustomBeam = CL_AddCustomBeam, .R_ProcessEntData = R_ProcessEntData, - .R_Flush = R_SimpleStubUInt, .R_ShowTextures = R_ShowTextures, @@ -486,7 +411,6 @@ static const ref_interface_t gReffuncs = .R_SetupSky = R_SetupSky, .R_Set2DMode = R_Set2DMode, - .R_DrawStretchRaw = R_DrawStretchRaw, .R_DrawStretchPic = R_DrawStretchPic, .FillRGBA = FillRGBA, .WorldToScreen = WorldToScreen, @@ -503,62 +427,35 @@ static const ref_interface_t gReffuncs = .R_StudioEstimateFrame = R_StudioEstimateFrame, .R_StudioLerpMovement = R_StudioLerpMovement, - .CL_InitStudioAPI = CL_InitStudioAPI, + .R_StudioFillAPI = R_StudioFillAPI, + .R_StudioSetDrawInterface = R_StudioSetDrawInterface, .R_SetSkyCloudsTextures = R_SetSkyCloudsTextures, .GL_SubdivideSurface = GL_SubdivideSurface, .CL_RunLightStyles = CL_RunLightStyles, - .R_GetSpriteParms = R_GetSpriteParms, - .R_GetSpriteTexture = R_GetSpriteTexture, - .Mod_ProcessRenderData = Mod_ProcessRenderData, .Mod_StudioLoadTextures = Mod_StudioLoadTextures, .CL_DrawParticles = CL_DrawParticles, .CL_DrawTracers = CL_DrawTracers, .CL_DrawBeams = CL_DrawBeams, - .R_BeamCull = R_BeamCull, - .RefGetParm = RefGetParm, - .GetDetailScaleForTexture = GetDetailScaleForTexture, - .GetExtraParmsForTexture = GetExtraParmsForTexture, - .GetFrameTime = GetFrameTime, + .RefGetParm = RefGetParm, - .R_SetCurrentEntity = R_SetCurrentEntity, - .R_SetCurrentModel = R_SetCurrentModel, + .R_GetDetailScaleForTexture = R_GetDetailScaleForTexture, + .R_SetDetailScaleForTexture = R_SetDetailScaleForTexture, - .GL_FindTexture = GL_FindTexture, - .GL_TextureName = GL_TextureName, - .GL_TextureData = GL_TextureData, - .GL_LoadTexture = GL_LoadTexture, - .GL_CreateTexture = GL_CreateTexture, - .GL_LoadTextureArray = GL_LoadTextureArray, - .GL_CreateTextureArray = GL_CreateTextureArray, - .GL_FreeTexture = GL_FreeTexture, + .GL_CreateTexture = GL_CreateTexture, + .GL_FindTexture = GL_FindTexture, + .GL_TextureName = GL_TextureName, + .GL_TextureData = GL_TextureData, + .GL_LoadTexture = GL_LoadTexture, + .GL_FreeTexture = GL_FreeTexture, .R_OverrideTextureSourceSize = R_OverrideTextureSourceSize, + .GL_UpdateTexture = GL_UpdateTexture, - .DrawSingleDecal = DrawSingleDecal, - .R_DecalSetupVerts = R_DecalSetupVerts, - .R_EntityRemoveDecals = R_EntityRemoveDecals, - - .AVI_UploadRawFrame = AVI_UploadRawFrame, - - .GL_Bind = GL_Bind, - .GL_SelectTexture = R_SimpleStubInt, - .GL_LoadTextureMatrix = GL_LoadTextureMatrix, - .GL_TexMatrixIdentity = R_SimpleStub, - .GL_CleanUpTextureUnits = R_SimpleStubInt, - .GL_TexGen = GL_TexGen, - .GL_TextureTarget = R_SimpleStubUInt, - .GL_TexCoordArrayMode = R_SimpleStubUInt, - .GL_UpdateTexSize = GL_UpdateTexSize, - .GL_Reserved0 = NULL, - .GL_Reserved1 = NULL, - - .GL_DrawParticles = GL_DrawParticles, - .LightVec = LightVec, - .StudioGetTexture = StudioGetTexture, + .GL_Bind = GL_Bind, .GL_RenderFrame = R_RenderFrame, .GL_OrthoBounds = GL_OrthoBounds, @@ -566,37 +463,19 @@ static const ref_interface_t gReffuncs = .Mod_GetCurrentVis = Mod_GetCurrentVis, .R_NewMap = R_NewMap, .R_ClearScene = R_ClearScene, - .R_GetProcAddress = R_GetProcAddress, .TriRenderMode = R_SimpleStubInt, .Begin = R_SimpleStubInt, .End = R_SimpleStub, .Color4f = Color4f, .Color4ub = Color4ub, - .TexCoord2f = TexCoord2f, .Vertex3fv = Vertex3fv, .Vertex3f = Vertex3f, - .Fog = Fog, - .ScreenToWorld = ScreenToWorld, - .GetMatrix = GetMatrix, - .FogParams = FogParams, .CullFace = CullFace, + .R_FillRenderAPI = R_FillRenderAPI, + .R_FillTriAPI = R_FillTriAPI, + .VGUI_SetupDrawing = VGUI_SetupDrawing, - .VGUI_UploadTextureBlock = VGUI_UploadTextureBlock, }; -int EXPORT GetRefAPI( int version, ref_interface_t *funcs, ref_api_t *engfuncs, ref_globals_t *globals ); -int EXPORT GetRefAPI( int version, ref_interface_t *funcs, ref_api_t *engfuncs, ref_globals_t *globals ) -{ - if( version != REF_API_VERSION ) - return 0; - - // fill in our callbacks - *funcs = gReffuncs; - gEngfuncs = *engfuncs; - gpGlobals = globals; - gp_cl = (ref_client_t *)gEngfuncs.EngineGetParm(PARM_GET_CLIENT_PTR, 0); - - return REF_API_VERSION; -} diff --git a/ref/dx2/r_d3d.c b/ref/dx2/r_d3d.c index eef13741..68e06b6f 100644 --- a/ref/dx2/r_d3d.c +++ b/ref/dx2/r_d3d.c @@ -21,11 +21,6 @@ CVAR_DEFINE_AUTO( r_nocull, "0", 0, "ignore frustrum culling (perfomance test)" CVAR_DEFINE_AUTO( r_lockpvs, "0", FCVAR_CHEAT, "lockpvs area at current point (pvs test)" ); CVAR_DEFINE_AUTO( r_lockfrustum, "0", FCVAR_CHEAT, "lock frustrum area at current point (cull test)" ); - -DEFINE_ENGINE_SHARED_CVAR_LIST() - -poolhandle_t r_temppool; - dx_globals_t tr; dx_context_t dxc; @@ -220,7 +215,7 @@ static qboolean D3D_InitDevice( void ) { d3dEBContext_t ebc = { 0 }; if (!D3D_StartExecuteBuffer(&ebc)) - return; + return false; void *cur = ebc.data; D3D_PutInstruction(&cur, D3DOP_STATETRANSFORM, sizeof(D3DSTATE), 2); @@ -233,7 +228,7 @@ static qboolean D3D_InitDevice( void ) ebc.insLength = ((char *)cur - (char *)ebc.data); if (!D3D_EndExecuteBuffer(&ebc)) - return; + return false; DXCheck(IDirect3DDevice_BeginScene(dxc.pd3dd)); DXCheck(IDirect3DDevice_Execute(dxc.pd3dd, ebc.pd3deb, dxc.viewport, D3DEXECUTE_CLIPPED)); @@ -249,8 +244,6 @@ qboolean R_Init( void ) { memset(&dxc, 0, sizeof(dxc)); - RETRIEVE_ENGINE_SHARED_CVAR_LIST(); - gEngfuncs.Cvar_RegisterVariable( &r_novis ); gEngfuncs.Cvar_RegisterVariable( &r_nocull ); gEngfuncs.Cvar_RegisterVariable( &r_lockpvs ); @@ -320,6 +313,7 @@ qboolean R_Init( void ) // see R_ProcessEntData for tr.entities initialization tr.world = (struct world_static_s *)ENGINE_GET_PARM( PARM_GET_WORLD_PTR ); + tr.viewent = (cl_entity_t *)ENGINE_GET_PARM( PARM_GET_VIEWENT_PTR ); dxc.renderMode = kRenderNormal; Vector4Set(dxc.currentColor, 1, 1, 1, 1); diff --git a/ref/dx2/r_draw.c b/ref/dx2/r_draw.c index 3eb32b26..b405e56c 100644 --- a/ref/dx2/r_draw.c +++ b/ref/dx2/r_draw.c @@ -21,11 +21,6 @@ void R_Set2DMode( qboolean enable ) } -void R_DrawStretchRaw( float x, float y, float w, float h, int cols, int rows, const byte *data, qboolean dirty ) -{ - ; -} - void R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, int texnum ) { if (texnum <= 0 || texnum >= MAX_TEXTURES) @@ -162,25 +157,3 @@ void FillRGBA( int rendermode, float x, float y, float w, float h, byte r, byte #endif } - -void R_GetSpriteParms( int *frameWidth, int *frameHeight, int *numFrames, int currentFrame, const model_t *pSprite ) -{ - if( frameWidth ) - *frameWidth = 0; - - if( frameHeight ) - *frameHeight = 0; - - if( numFrames ) - *numFrames = 0; -} - -int R_GetSpriteTexture( const model_t *m_pSpriteModel, int frame ) -{ - return 0; -} - -void AVI_UploadRawFrame( int texture, int cols, int rows, int width, int height, const byte *data ) -{ - ; -} diff --git a/ref/dx2/r_image.c b/ref/dx2/r_image.c index 9140f411..d5772bac 100644 --- a/ref/dx2/r_image.c +++ b/ref/dx2/r_image.c @@ -23,102 +23,7 @@ static dx_texture_t dx_textures[MAX_TEXTURES]; static dx_texture_t *dx_texturesHashTable[TEXTURES_HASH_SIZE]; static uint dx_numTextures; -static rgbdata_t *GL_FakeImage(int width, int height, int depth, int flags) -{ - static byte data2D[1024]; // 16x16x4 - static rgbdata_t r_image; - - // also use this for bad textures, but without alpha - r_image.width = Q_max(1, width); - r_image.height = Q_max(1, height); - r_image.depth = Q_max(1, depth); - r_image.flags = flags; - r_image.type = PF_BGRA_32; - r_image.size = r_image.width * r_image.height * r_image.depth * 4; - r_image.buffer = (r_image.size > sizeof(data2D)) ? NULL : data2D; - r_image.palette = NULL; - r_image.numMips = 1; - r_image.encode = 0; - - if (FBitSet(r_image.flags, IMAGE_CUBEMAP)) - r_image.size *= 6; - memset(data2D, 0xFF, sizeof(data2D)); - - return &r_image; -} - -static byte dottexture[8][8] = -{ - {0,1,1,0,0,0,0,0}, - {1,1,1,1,0,0,0,0}, - {1,1,1,1,0,0,0,0}, - {0,1,1,0,0,0,0,0}, - {0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0}, -}; - -static void GL_CreateInternalTextures(void) -{ - int dx2, dy, d; - int x, y; - rgbdata_t *pic; - - // emo-texture from quake1 - pic = GL_FakeImage(16, 16, 1, IMAGE_HAS_COLOR); - - for (y = 0; y < 16; y++) - { - for (x = 0; x < 16; x++) - { - if ((y < 8) ^ (x < 8)) - ((uint *)pic->buffer)[y * 16 + x] = 0xFFFF00FF; - else ((uint *)pic->buffer)[y * 16 + x] = 0xFF000000; - } - } - - tr.defaultTexture = GL_LoadTextureFromBuffer(REF_DEFAULT_TEXTURE, pic, TF_COLORMAP, false); - - // particle texture from quake1 - pic = GL_FakeImage(8, 8, 1, IMAGE_HAS_COLOR | IMAGE_HAS_ALPHA); - - for (x = 0; x < 8; x++) - { - for (y = 0; y < 8; y++) - { - if (dottexture[x][y]) - pic->buffer[(y * 8 + x) * 4 + 3] = 255; - else pic->buffer[(y * 8 + x) * 4 + 3] = 0; - } - } - - tr.particleTexture = GL_LoadTextureFromBuffer(REF_PARTICLE_TEXTURE, pic, TF_CLAMP, false); - - // white texture - pic = GL_FakeImage(4, 4, 1, IMAGE_HAS_COLOR); - for (x = 0; x < 16; x++) - ((uint *)pic->buffer)[x] = 0xFFFFFFFF; - tr.whiteTexture = GL_LoadTextureFromBuffer(REF_WHITE_TEXTURE, pic, TF_COLORMAP, false); - - // gray texture - pic = GL_FakeImage(4, 4, 1, IMAGE_HAS_COLOR); - for (x = 0; x < 16; x++) - ((uint *)pic->buffer)[x] = 0xFF7F7F7F; - tr.grayTexture = GL_LoadTextureFromBuffer(REF_GRAY_TEXTURE, pic, TF_COLORMAP, false); - - // black texture - pic = GL_FakeImage(4, 4, 1, IMAGE_HAS_COLOR); - for (x = 0; x < 16; x++) - ((uint *)pic->buffer)[x] = 0xFF000000; - tr.blackTexture = GL_LoadTextureFromBuffer(REF_BLACK_TEXTURE, pic, TF_COLORMAP, false); - - // cinematic dummy - pic = GL_FakeImage(640, 100, 1, IMAGE_HAS_COLOR); - tr.cinTexture = GL_LoadTextureFromBuffer("*cintexture", pic, TF_NOMIPMAP | TF_CLAMP, false); -} - -void R_InitImages(void) +void R_InitImages( void ) { memset(dx_textures, 0, sizeof(dx_textures)); memset(dx_texturesHashTable, 0, sizeof(dx_texturesHashTable)); @@ -130,11 +35,9 @@ void R_InitImages(void) dx_textures->nextHash = dx_texturesHashTable[dx_textures->hashValue]; dx_texturesHashTable[dx_textures->hashValue] = dx_textures; dx_numTextures = 1; - - GL_CreateInternalTextures(); } -dx_texture_t *R_GetTexture(unsigned int texnum) +dx_texture_t *R_GetTexture( unsigned int texnum ) { Assert(texnum < MAX_TEXTURES); return &dx_textures[texnum]; @@ -145,31 +48,31 @@ void R_ShowTextures( void ) } -const byte *R_GetTextureOriginalBuffer(unsigned int idx) +const byte *R_GetTextureOriginalBuffer( unsigned int idx ) { return NULL; } -static qboolean GL_CheckTexName(const char *name) +static qboolean GL_CheckTexName( const char *name ) { int len; if( COM_StringEmptyOrNULL( name )) return false; - len = Q_strlen(name); + len = Q_strlen( name ); // because multi-layered textures can exceed name string - if (len >= sizeof(dx_textures->name)) + if( len >= sizeof( dx_textures->name )) { - gEngfuncs.Con_Printf(S_ERROR "LoadTexture: too long name %s (%d)\n", name, len); + gEngfuncs.Con_Printf( S_ERROR "LoadTexture: too long name %s (%d)\n", name, len ); return false; } return true; } -static dx_texture_t *GL_TextureForName(const char *name) +static dx_texture_t *GL_TextureForName( const char *name ) { dx_texture_t *tex; uint hash; @@ -186,7 +89,7 @@ static dx_texture_t *GL_TextureForName(const char *name) return NULL; } -static dx_texture_t *GL_AllocTexture(const char *name, texFlags_t flags) +static dx_texture_t *GL_AllocTexture( const char *name, texFlags_t flags ) { dx_texture_t *tex = NULL; @@ -225,7 +128,7 @@ static dx_texture_t *GL_AllocTexture(const char *name, texFlags_t flags) return tex; } -static void GL_ProcessImage(dx_texture_t *tex, rgbdata_t *pic) +static void GL_ProcessImage( dx_texture_t *tex, rgbdata_t *pic ) { uint img_flags = 0; @@ -272,7 +175,7 @@ static void GL_ProcessImage(dx_texture_t *tex, rgbdata_t *pic) } } -static int GL_CalcMipmapCount(dx_texture_t *tex, qboolean haveBuffer) +static int GL_CalcMipmapCount( dx_texture_t *tex, qboolean haveBuffer ) { int width, height; int mipcount; @@ -301,91 +204,7 @@ static int GL_CalcMipmapCount(dx_texture_t *tex, qboolean haveBuffer) return mipcount + 1; } -static byte *GL_ResampleTexture(const byte *source, int inWidth, int inHeight, int outWidth, int outHeight, qboolean isNormalMap) -{ - uint frac, fracStep; - uint *in = (uint *)source; - uint p1[0x1000], p2[0x1000]; - byte *pix1, *pix2, *pix3, *pix4; - uint *out, *inRow1, *inRow2; - static byte *scaledImage = NULL; // pointer to a scaled image - vec3_t normal; - int i, x, y; - - if (!source) return NULL; - - scaledImage = Mem_Realloc(r_temppool, scaledImage, outWidth * outHeight * 4); - fracStep = inWidth * 0x10000 / outWidth; - out = (uint *)scaledImage; - - frac = fracStep >> 2; - for (i = 0; i < outWidth; i++) - { - p1[i] = 4 * (frac >> 16); - frac += fracStep; - } - - frac = (fracStep >> 2) * 3; - for (i = 0; i < outWidth; i++) - { - p2[i] = 4 * (frac >> 16); - frac += fracStep; - } - - if (isNormalMap) - { - for (y = 0; y < outHeight; y++, out += outWidth) - { - inRow1 = in + inWidth * (int)(((float)y + 0.25f) * inHeight / outHeight); - inRow2 = in + inWidth * (int)(((float)y + 0.75f) * inHeight / outHeight); - - for (x = 0; x < outWidth; x++) - { - pix1 = (byte *)inRow1 + p1[x]; - pix2 = (byte *)inRow1 + p2[x]; - pix3 = (byte *)inRow2 + p1[x]; - pix4 = (byte *)inRow2 + p2[x]; - - normal[0] = MAKE_SIGNED(pix1[0]) + MAKE_SIGNED(pix2[0]) + MAKE_SIGNED(pix3[0]) + MAKE_SIGNED(pix4[0]); - normal[1] = MAKE_SIGNED(pix1[1]) + MAKE_SIGNED(pix2[1]) + MAKE_SIGNED(pix3[1]) + MAKE_SIGNED(pix4[1]); - normal[2] = MAKE_SIGNED(pix1[2]) + MAKE_SIGNED(pix2[2]) + MAKE_SIGNED(pix3[2]) + MAKE_SIGNED(pix4[2]); - - if (!VectorNormalizeLength(normal)) - VectorSet(normal, 0.5f, 0.5f, 1.0f); - - ((byte *)(out + x))[0] = 128 + (byte)(127.0f * normal[0]); - ((byte *)(out + x))[1] = 128 + (byte)(127.0f * normal[1]); - ((byte *)(out + x))[2] = 128 + (byte)(127.0f * normal[2]); - ((byte *)(out + x))[3] = 255; - } - } - } - else - { - for (y = 0; y < outHeight; y++, out += outWidth) - { - inRow1 = in + inWidth * (int)(((float)y + 0.25f) * inHeight / outHeight); - inRow2 = in + inWidth * (int)(((float)y + 0.75f) * inHeight / outHeight); - - for (x = 0; x < outWidth; x++) - { - pix1 = (byte *)inRow1 + p1[x]; - pix2 = (byte *)inRow1 + p2[x]; - pix3 = (byte *)inRow2 + p1[x]; - pix4 = (byte *)inRow2 + p2[x]; - - ((byte *)(out + x))[0] = (pix1[0] + pix2[0] + pix3[0] + pix4[0]) >> 2; - ((byte *)(out + x))[1] = (pix1[1] + pix2[1] + pix3[1] + pix4[1]) >> 2; - ((byte *)(out + x))[2] = (pix1[2] + pix2[2] + pix3[2] + pix4[2]) >> 2; - ((byte *)(out + x))[3] = (pix1[3] + pix2[3] + pix3[3] + pix4[3]) >> 2; - } - } - } - - return scaledImage; -} - -static void GL_TextureImageRAW(dx_texture_t *tex, int width, int height, int type, const char *data) +static void GL_TextureImageRAW( dx_texture_t *tex, int width, int height, int type, const char *data ) { if (!data) return; @@ -426,12 +245,12 @@ static void GL_TextureImageRAW(dx_texture_t *tex, int width, int height, int typ DXCheck(IDirectDrawSurface_Unlock(tex->dds, ddsd.lpSurface)); } -static qboolean GL_UploadTexture(dx_texture_t *tex, rgbdata_t *pic) +static qboolean GL_UploadTexture( dx_texture_t *tex, rgbdata_t *pic ) { byte *buf, *data; - size_t texsize, size; + size_t size; uint width, height; - uint i, j, numSides; + uint j; qboolean normalMap; const byte *bufend; @@ -581,7 +400,7 @@ static qboolean GL_UploadTexture(dx_texture_t *tex, rgbdata_t *pic) return true; } -int GL_LoadTextureFromBuffer(const char *name, rgbdata_t *pic, texFlags_t flags, qboolean update) +int GL_LoadTextureFromBuffer( const char *name, rgbdata_t *pic, texFlags_t flags, qboolean update ) { dx_texture_t *tex; @@ -618,33 +437,84 @@ int GL_LoadTextureFromBuffer(const char *name, rgbdata_t *pic, texFlags_t flags, return (tex - dx_textures); } -void GL_ProcessTexture(int texnum, float gamma, int topColor, int bottomColor) +int GL_CreateTexture( const char *name, int width, int height, const void *buffer, texFlags_t flags ) +{ + qboolean update = FBitSet( flags, TF_UPDATE ) ? true : false; + int datasize = 1; + rgbdata_t r_empty; + + if( FBitSet( flags, TF_ARB_16BIT )) + datasize = 2; + else if( FBitSet( flags, TF_ARB_FLOAT )) + datasize = 4; + + ClearBits( flags, TF_UPDATE ); + memset( &r_empty, 0, sizeof( r_empty )); + r_empty.width = width; + r_empty.height = height; + r_empty.type = PF_RGBA_32; + r_empty.size = r_empty.width * r_empty.height * datasize * 4; + r_empty.buffer = (byte *)buffer; + + // clear invalid combinations + ClearBits( flags, TF_TEXTURE_3D ); + + // if image not luminance and not alphacontrast it will have color + if( !FBitSet( flags, TF_LUMINANCE ) && !FBitSet( flags, TF_ALPHACONTRAST )) + SetBits( r_empty.flags, IMAGE_HAS_COLOR ); + + if( FBitSet( flags, TF_HAS_ALPHA )) + SetBits( r_empty.flags, IMAGE_HAS_ALPHA ); + + if( FBitSet( flags, TF_CUBEMAP )) + { + // no cubemaps in dx2 + return 0; + } + + int texnum = GL_LoadTextureFromBuffer( name, &r_empty, flags, update ); + + if( !Q_strcmp( name, REF_DEFAULT_TEXTURE )) + tr.defaultTexture = texnum; + else if( !Q_strcmp( name, REF_PARTICLE_TEXTURE )) + tr.particleTexture = texnum; + else if( !Q_strcmp( name, REF_WHITE_TEXTURE )) + tr.whiteTexture = texnum; + else if( !Q_strcmp( name, REF_GRAY_TEXTURE )) + tr.grayTexture = texnum; + else if( !Q_strcmp( name, REF_BLACK_TEXTURE )) + tr.blackTexture = texnum; + + return texnum; +} + +void GL_ProcessTexture( int texnum, float gamma, int topColor, int bottomColor ) { ; } -void GetDetailScaleForTexture(int texture, float *xScale, float *yScale) +void R_GetDetailScaleForTexture( int texture, float *xScale, float *yScale ) { *xScale = *yScale = 1.0f; } -void GetExtraParmsForTexture(int texture, byte *red, byte *green, byte *blue, byte *alpha) +void R_SetDetailScaleForTexture( int texture, float xScale, float yScale ) { - *red = *green = *blue = *alpha = 0; + ; } -int GL_FindTexture(const char *name) +int GL_FindTexture( const char *name ) { gEngfuncs.Con_Printf("GL_FindTexture(%s)\n", name); return 0; } -const char *GL_TextureName(unsigned int texnum) +const char *GL_TextureName( unsigned int texnum ) { return NULL; } -const byte *GL_TextureData(unsigned int texnum) +const byte *GL_TextureData( unsigned int texnum ) { return NULL; } @@ -694,22 +564,7 @@ int GL_LoadTexture( const char *name, const byte *buf, size_t size, int flags ) return tex - dx_textures; } -int GL_CreateTexture(const char *name, int width, int height, const void *buffer, texFlags_t flags) -{ - return 0; -} - -int GL_LoadTextureArray(const char **names, int flags) -{ - return 0; -} - -int GL_CreateTextureArray(const char *name, int width, int height, int depth, const void *buffer, texFlags_t flags) -{ - return 0; -} - -void GL_FreeTexture(unsigned int texnum) +void GL_FreeTexture( unsigned int texnum ) { if (texnum <= 0 || texnum >= MAX_TEXTURES) return; @@ -756,12 +611,12 @@ void GL_FreeTexture(unsigned int texnum) memset(tex, 0, sizeof(*tex)); } -void R_OverrideTextureSourceSize(unsigned int textnum, unsigned int srcWidth, unsigned int srcHeight) +void R_OverrideTextureSourceSize( unsigned int textnum, unsigned int srcWidth, unsigned int srcHeight ) { } -void GL_UpdateTexSize( int texnum, int width, int height, int depth ) +void GL_UpdateTexture( int texnum, int cols, int rows, int width, int height, const byte *buffer, pixformat_t fmt ) { ; } diff --git a/ref/dx2/r_local.h b/ref/dx2/r_local.h index d05f1304..77e2992c 100644 --- a/ref/dx2/r_local.h +++ b/ref/dx2/r_local.h @@ -19,29 +19,19 @@ GNU General Public License for more details. #include "ref_common.h" #include "ref_api.h" #include "r_frustum.h" +#include "ref_params.h" #include "mod_local.h" #include "com_strings.h" +#include "pmove.h" #define DIRECTDRAW_VERSION 0x0200 #define DIRECT3D_VERSION 0x0500//D3DCOLORMODEL bug #include #include -#define Assert(x) if(!( x )) gEngfuncs.Host_Error( "assert failed at %s:%i\n", __FILE__, __LINE__ ) - - -extern poolhandle_t r_temppool; - - #define MAX_TEXTURES 8192 #define TEXTURES_HASH_SIZE (MAX_TEXTURES >> 2) -// refparams -#define RP_NONE 0 -#define RP_ENVVIEW BIT( 0 ) // used for cubemapshot -#define RP_OLDVIEWLEAF BIT( 1 ) -#define RP_CLIPPLANE BIT( 2 ) - #define MAX_DRAW_STACK 2 // normal view and menu view #define CULL_VISIBLE 0 // not culled @@ -99,27 +89,16 @@ typedef struct d3dEBContext_s typedef struct { - int params; // rendering parameters - - qboolean drawWorld; // ignore world for drawing PlayerModel - qboolean isSkyVisible; // sky is visible - qboolean onlyClientDraw; // disabled by client request - qboolean drawOrtho; // draw world as orthogonal projection - - float fov_x, fov_y; // current view fov + ref_viewpass_t rvp; cl_entity_t *currententity; model_t *currentmodel; cl_entity_t *currentbeam; // same as above but for beams - int viewport[4]; gl_frustum_t frustum; mleaf_t *viewleaf; mleaf_t *oldviewleaf; - vec3_t pvsorigin; - vec3_t vieworg; // locked vieworigin - vec3_t viewangles; vec3_t vforward; vec3_t vright; vec3_t vup; @@ -173,7 +152,6 @@ typedef struct int whiteTexture; int grayTexture; int blackTexture; - int cinTexture; // cinematic texture int skytexturenum; // index into model_t::textures @@ -186,6 +164,7 @@ typedef struct qboolean modelviewIdentity; int visframecount; // PVS frame + int dlightframecount; // dynamic light frame int realframecount; // not including viewpasses int framecount; @@ -199,9 +178,12 @@ typedef struct vec3_t modelorg; // relative to viewpoint // get from engine + model_t *worldmodel; world_static_t *world; cl_entity_t *entities; - int max_entities; + cl_entity_t *viewent; + + uint max_entities; ref_screen_rotation_t rotation; } dx_globals_t; @@ -234,10 +216,6 @@ extern ref_instance_t RI; extern dx_globals_t tr; extern dx_context_t dxc; -extern ref_api_t gEngfuncs; -extern ref_globals_t *gpGlobals; -extern ref_client_t *gp_cl; - static inline cl_entity_t *CL_GetEntityByIndex( int index ) { @@ -255,11 +233,6 @@ static inline model_t *CL_ModelHandle( int index ) return gp_cl->models[index]; } -static inline intptr_t ENGINE_GET_PARM( int parm ) -{ - return ( *gEngfuncs.EngineGetParm )( ( parm ), 0 ); -} - const char *dxResultToStr( HRESULT r ); #define DXCheckRet(DST, CALL) \ @@ -303,18 +276,13 @@ void R_RenderFrame( const struct ref_viewpass_s *rvp ); qboolean R_AddEntity( struct cl_entity_s *clent, int type ); void R_ClearScene( void ); int WorldToScreen( const vec3_t world, vec3_t screen ); -void ScreenToWorld( const float *screen, float *world ); void R_LoadIdentity( void ); void R_SetupD3D( qboolean set_state ); // r_draw.c void R_Set2DMode( qboolean enable ); -void R_DrawStretchRaw( float x, float y, float w, float h, int cols, int rows, const byte *data, qboolean dirty ); void R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, int texnum ); void FillRGBA( int rendermode, float x, float y, float w, float h, byte r, byte g, byte b, byte a ); -void R_GetSpriteParms( int *frameWidth, int *frameHeight, int *numFrames, int currentFrame, const model_t *pSprite ); -int R_GetSpriteTexture( const model_t *m_pSpriteModel, int frame ); -void AVI_UploadRawFrame( int texture, int cols, int rows, int width, int height, const byte *data ); // r_image.c void R_InitImages( void ); @@ -323,28 +291,16 @@ void R_ShowTextures( void ); const byte *R_GetTextureOriginalBuffer( unsigned int idx ); int GL_LoadTextureFromBuffer( const char *name, rgbdata_t *pic, texFlags_t flags, qboolean update ); void GL_ProcessTexture( int texnum, float gamma, int topColor, int bottomColor ); -void GetDetailScaleForTexture( int texture, float *xScale, float *yScale ); -void GetExtraParmsForTexture( int texture, byte *red, byte *green, byte *blue, byte *alpha ); +void R_GetDetailScaleForTexture( int texture, float *xScale, float *yScale ); +void R_SetDetailScaleForTexture( int texture, float xScale, float yScale ); int GL_FindTexture( const char *name ); const char *GL_TextureName( unsigned int texnum ); const byte *GL_TextureData( unsigned int texnum ); int GL_LoadTexture( const char *name, const byte *buf, size_t size, int flags ); int GL_CreateTexture( const char *name, int width, int height, const void *buffer, texFlags_t flags ); -int GL_LoadTextureArray( const char **names, int flags ); -int GL_CreateTextureArray( const char *name, int width, int height, int depth, const void *buffer, texFlags_t flags ); void GL_FreeTexture( unsigned int texnum ); void R_OverrideTextureSourceSize( unsigned int textnum, unsigned int srcWidth, unsigned int srcHeight ); -void GL_UpdateTexSize( int texnum, int width, int height, int depth ); - -// r_math.c -void Matrix4x4_ToArrayFloatGL( const matrix4x4 in, float out[16] ); -void Matrix4x4_Concat( matrix4x4 out, const matrix4x4 in1, const matrix4x4 in2 ); -void Matrix4x4_ConcatTranslate( matrix4x4 out, float x, float y, float z ); -void Matrix4x4_ConcatRotate( matrix4x4 out, float angle, float x, float y, float z ); -void Matrix4x4_CreateProjection( matrix4x4 out, float xMax, float xMin, float yMax, float yMin, float zNear, float zFar ); -void Matrix4x4_CreateOrtho( matrix4x4 m, float xLeft, float xRight, float yBottom, float yTop, float zNear, float zFar ); -void Matrix4x4_CreateModelview( matrix4x4 out ); - +void GL_UpdateTexture( int texnum, int cols, int rows, int width, int height, const byte *buffer, pixformat_t fmt ); // r_surf.c void GL_SubdivideSurface( model_t *mod, msurface_t *fa ); @@ -359,15 +315,3 @@ extern convar_t r_nocull; extern convar_t r_lockpvs; extern convar_t r_lockfrustum; -// -// engine shared convars -// -DECLARE_ENGINE_SHARED_CVAR_LIST( ) - -#define Mem_Malloc( pool, size ) _Mem_Alloc( pool, size, false, __FILE__, __LINE__ ) -#define Mem_Calloc( pool, size ) _Mem_Alloc( pool, size, true, __FILE__, __LINE__ ) -#define Mem_Realloc( pool, ptr, size ) gEngfuncs._Mem_Realloc( pool, ptr, size, true, __FILE__, __LINE__ ) -#define Mem_Free( mem ) _Mem_Free( mem, __FILE__, __LINE__ ) -#define Mem_AllocPool( name ) gEngfuncs._Mem_AllocPool( name, __FILE__, __LINE__ ) -#define Mem_FreePool( pool ) gEngfuncs._Mem_FreePool( pool, __FILE__, __LINE__ ) -#define Mem_EmptyPool( pool ) gEngfuncs._Mem_EmptyPool( pool, __FILE__, __LINE__ ) diff --git a/ref/dx2/r_main.c b/ref/dx2/r_main.c index 03bc6966..f3e898d1 100644 --- a/ref/dx2/r_main.c +++ b/ref/dx2/r_main.c @@ -22,45 +22,41 @@ ref_instance_t RI; static float R_GetFarClip( void ) { -#if 0 - if( WORLDMODEL && RI.drawWorld ) - return tr.movevars->zmax * 1.73f; -#endif + if( tr.worldmodel && FBitSet( RI.rvp.flags, RF_DRAW_WORLD ) ) + return gp_movevars->zmax * 1.73f; + return 2048.0f; } void R_SetupFrustum( void ) { - const ref_overview_t *ov = gEngfuncs.GetOverviewParms(); -#if 0 - if( RP_NORMALPASS() && ( ENGINE_GET_PARM( PARM_WATER_LEVEL ) >= 3 ) && ENGINE_GET_PARM( PARM_QUAKE_COMPATIBLE )) - { - RI.fov_x = atan( tan( DEG2RAD( RI.fov_x ) / 2 ) * ( 0.97f + sin( gp_cl->time * 1.5f ) * 0.03f )) * 2 / (M_PI_F / 180.0f); - RI.fov_y = atan( tan( DEG2RAD( RI.fov_y ) / 2 ) * ( 1.03f - sin( gp_cl->time * 1.5f ) * 0.03f )) * 2 / (M_PI_F / 180.0f); - } -#endif // build the transformation matrix for the given view angles - AngleVectors( RI.viewangles, RI.vforward, RI.vright, RI.vup ); + AngleVectors( RI.rvp.viewangles, RI.vforward, RI.vright, RI.vup ); if( !r_lockfrustum.value ) { - VectorCopy( RI.vieworg, RI.cullorigin ); + VectorCopy( RI.rvp.vieworigin, RI.cullorigin ); VectorCopy( RI.vforward, RI.cull_vforward ); VectorCopy( RI.vright, RI.cull_vright ); VectorCopy( RI.vup, RI.cull_vup ); } - if( RI.drawOrtho ) + if( FBitSet( RI.rvp.flags, RF_DRAW_OVERVIEW )) + { + const ref_overview_t *ov = gEngfuncs.GetOverviewParms(); GL_FrustumInitOrtho( &RI.frustum, ov->xLeft, ov->xRight, ov->yTop, ov->yBottom, ov->zNear, ov->zFar ); - else GL_FrustumInitProj( &RI.frustum, 0.0f, R_GetFarClip(), RI.fov_x, RI.fov_y ); // NOTE: we ignore nearplane here (mirrors only) + } + else + { + GL_FrustumInitProj( &RI.frustum, 0.0f, R_GetFarClip(), RI.rvp.fov_x, RI.rvp.fov_y ); // NOTE: we ignore nearplane here (mirrors only) + } } - static void R_SetupProjectionMatrix( matrix4x4 m ) { float xMin, xMax, yMin, yMax, zNear, zFar; - if( RI.drawOrtho ) + if( FBitSet( RI.rvp.flags, RF_DRAW_OVERVIEW )) { const ref_overview_t *ov = gEngfuncs.GetOverviewParms(); Matrix4x4_CreateOrtho( m, ov->xLeft, ov->xRight, ov->yTop, ov->yBottom, ov->zNear, ov->zFar ); @@ -72,10 +68,10 @@ static void R_SetupProjectionMatrix( matrix4x4 m ) zNear = 4.0f; zFar = Q_max( 256.0f, RI.farClip ); - yMax = zNear * tan( RI.fov_y * M_PI_F / 360.0f ); + yMax = zNear * tan( RI.rvp.fov_y * M_PI_F / 360.0f ); yMin = -yMax; - xMax = zNear * tan( RI.fov_x * M_PI_F / 360.0f ); + xMax = zNear * tan( RI.rvp.fov_x * M_PI_F / 360.0f ); xMin = -xMax; if( tr.rotation & 1 ) @@ -98,17 +94,17 @@ static void R_SetupModelviewMatrix( matrix4x4 m ) Matrix4x4_CreateModelview( m ); if( tr.rotation & 1 ) { - Matrix4x4_ConcatRotate( m, anglemod( -RI.viewangles[2] + 90 ), 1, 0, 0 ); - Matrix4x4_ConcatRotate( m, -RI.viewangles[0], 0, 1, 0 ); - Matrix4x4_ConcatRotate( m, -RI.viewangles[1], 0, 0, 1 ); + Matrix4x4_ConcatRotate( m, anglemod( -RI.rvp.viewangles[2] + 90 ), 1, 0, 0 ); + Matrix4x4_ConcatRotate( m, -RI.rvp.viewangles[0], 0, 1, 0 ); + Matrix4x4_ConcatRotate( m, -RI.rvp.viewangles[1], 0, 0, 1 ); } else { - Matrix4x4_ConcatRotate( m, -RI.viewangles[2], 1, 0, 0 ); - Matrix4x4_ConcatRotate( m, -RI.viewangles[0], 0, 1, 0 ); - Matrix4x4_ConcatRotate( m, -RI.viewangles[1], 0, 0, 1 ); + Matrix4x4_ConcatRotate( m, -RI.rvp.viewangles[2], 1, 0, 0 ); + Matrix4x4_ConcatRotate( m, -RI.rvp.viewangles[0], 0, 1, 0 ); + Matrix4x4_ConcatRotate( m, -RI.rvp.viewangles[1], 0, 0, 1 ); } - Matrix4x4_ConcatTranslate( m, -RI.vieworg[0], -RI.vieworg[1], -RI.vieworg[2] ); + Matrix4x4_ConcatTranslate( m, -RI.rvp.vieworigin[0], -RI.rvp.vieworigin[1], -RI.rvp.vieworigin[2] ); } void R_LoadIdentity( void ) @@ -150,21 +146,19 @@ static void R_DrawEntitiesOnList( void ) void R_RenderScene( void ) { - model_t *worldmodel = gp_cl->models[1]; - if (!worldmodel && RI.drawWorld) + if( !tr.worldmodel && FBitSet( RI.rvp.flags, RF_DRAW_WORLD ) ) gEngfuncs.Host_Error("%s: NULL worldmodel\n", __func__); // frametime is valid only for normal pass - if (FBitSet(RI.params, RP_ENVVIEW) == 0) + if( !FBitSet( RI.rvp.flags, RF_DRAW_CUBEMAP )) tr.frametime = gp_cl->time - gp_cl->oldtime; else tr.frametime = 0.0; // begin a new frame tr.framecount++; -#if 0 - R_PushDlights(); -#endif + tr.dlightframecount = R_PushDlights( tr.worldmodel, tr.framecount ); + R_SetupFrustum(); #if 0 R_SetupFrame(); @@ -176,7 +170,7 @@ void R_RenderScene( void ) R_MarkLeaves(); #if 0 R_DrawFog(); - if (RI.drawWorld) + if( FBitSet( RI.rvp.flags, RF_DRAW_WORLD )) R_AnimateRipples(); R_CheckGLFog(); @@ -232,47 +226,28 @@ void R_AllowFog( qboolean allowed ) static void R_SetupRefParams( const ref_viewpass_t *rvp ) { -// RI.params = RP_NONE; - RI.drawWorld = FBitSet(rvp->flags, RF_DRAW_WORLD); - RI.onlyClientDraw = FBitSet(rvp->flags, RF_ONLY_CLIENTDRAW); + RI.rvp = *rvp; + RI.farClip = 0; - - if (!FBitSet(rvp->flags, RF_DRAW_CUBEMAP)) - RI.drawOrtho = FBitSet(rvp->flags, RF_DRAW_OVERVIEW); - else RI.drawOrtho = false; - - // setup viewport - RI.viewport[0] = rvp->viewport[0]; - RI.viewport[1] = rvp->viewport[1]; - RI.viewport[2] = rvp->viewport[2]; - RI.viewport[3] = rvp->viewport[3]; - - // calc FOV - RI.fov_x = rvp->fov_x; - RI.fov_y = rvp->fov_y; - - VectorCopy(rvp->vieworigin, RI.vieworg); - VectorCopy(rvp->viewangles, RI.viewangles); - VectorCopy(rvp->vieworigin, RI.pvsorigin); } -void R_RenderFrame( const struct ref_viewpass_s *rvp ) +void R_RenderFrame( const ref_viewpass_t *rvp ) { - if (r_norefresh->value) + if( r_norefresh->value ) return; // setup the initial render params - R_SetupRefParams(rvp); + R_SetupRefParams( rvp ); // completely override rendering - if (gEngfuncs.drawFuncs->GL_RenderFrame != NULL) + if( gEngfuncs.drawFuncs->GL_RenderFrame != NULL ) { tr.fCustomRendering = true; - if (gEngfuncs.drawFuncs->GL_RenderFrame(rvp)) + if( gEngfuncs.drawFuncs->GL_RenderFrame( rvp )) { - //R_GatherPlayerLight(); + R_GatherPlayerLight( tr.viewent ); tr.realframecount++; tr.fResetVis = true; return; @@ -280,8 +255,10 @@ void R_RenderFrame( const struct ref_viewpass_s *rvp ) } tr.fCustomRendering = false; - //if (!RI.onlyClientDraw) - // R_RunViewmodelEvents(); +#if 0 + if( !FBitSet( RI.rvp.flags, RF_ONLY_CLIENTDRAW )) + R_RunViewmodelEvents(); +#endif tr.realframecount++; // right called after viewmodel events R_RenderScene(); @@ -311,34 +288,29 @@ int WorldToScreen( const vec3_t world, vec3_t screen ) return 0; } -void ScreenToWorld( const float *screen, float *world ) -{ - ; -} - void R_SetupD3D( qboolean set_state ) { - R_SetupModelviewMatrix(RI.worldviewMatrix); - R_SetupProjectionMatrix(RI.projectionMatrix); + R_SetupModelviewMatrix( RI.worldviewMatrix ); + R_SetupProjectionMatrix( RI.projectionMatrix ); - Matrix4x4_Concat(RI.worldviewProjectionMatrix, RI.projectionMatrix, RI.worldviewMatrix); + Matrix4x4_Concat( RI.worldviewProjectionMatrix, RI.projectionMatrix, RI.worldviewMatrix ); - if (!set_state) return; + if( !set_state ) return; D3DVIEWPORT viewport = { 0 }; viewport.dwSize = sizeof(viewport); - if (FBitSet(RI.params, RP_ENVVIEW) == 0) + if( !FBitSet( RI.rvp.flags, RF_DRAW_CUBEMAP )) { int x, x2, y, y2; // set up viewport (main, playersetup) - x = floor(RI.viewport[0] * gpGlobals->width / gpGlobals->width); - x2 = ceil((RI.viewport[0] + RI.viewport[2]) * gpGlobals->width / gpGlobals->width); - y = floor(gpGlobals->height - RI.viewport[1] * gpGlobals->height / gpGlobals->height); - y2 = ceil(gpGlobals->height - (RI.viewport[1] + RI.viewport[3]) * gpGlobals->height / gpGlobals->height); + x = floor( RI.rvp.viewport[0] * gpGlobals->width / gpGlobals->width ); + x2 = ceil( (RI.rvp.viewport[0] + RI.rvp.viewport[2]) * gpGlobals->width / gpGlobals->width ); + y = floor( gpGlobals->height - RI.rvp.viewport[1] * gpGlobals->height / gpGlobals->height ); + y2 = ceil( gpGlobals->height - (RI.rvp.viewport[1] + RI.rvp.viewport[3]) * gpGlobals->height / gpGlobals->height ); - if (tr.rotation & 1) + if( tr.rotation & 1 ) { viewport.dwX = y2; viewport.dwY = x; @@ -356,10 +328,10 @@ void R_SetupD3D( qboolean set_state ) else { // envpass, mirrorpass - viewport.dwX = RI.viewport[0]; - viewport.dwY = RI.viewport[1]; - viewport.dwWidth = RI.viewport[2]; - viewport.dwHeight = RI.viewport[3]; + viewport.dwX = RI.rvp.viewport[0]; + viewport.dwY = RI.rvp.viewport[1]; + viewport.dwWidth = RI.rvp.viewport[2]; + viewport.dwHeight = RI.rvp.viewport[3]; } viewport.dvScaleX = 0.5f * viewport.dwWidth; diff --git a/ref/dx2/r_surf.c b/ref/dx2/r_surf.c index 22b5b683..7d7d1544 100644 --- a/ref/dx2/r_surf.c +++ b/ref/dx2/r_surf.c @@ -277,7 +277,6 @@ static void R_DrawTextureChains( void ) int i; msurface_t *s; texture_t *t; - model_t *WORLDMODEL = (gp_cl->models[1]); // make sure what color is reset Vector4Set( dxc.currentColor, 1, 1, 1, 1 ); @@ -289,9 +288,9 @@ static void R_DrawTextureChains( void ) RI.currententity = CL_GetEntityByIndex( 0 ); RI.currentmodel = RI.currententity->model; - for( i = 0; i < WORLDMODEL->numtextures; i++ ) + for( i = 0; i < tr.worldmodel->numtextures; i++ ) { - t = WORLDMODEL->textures[i]; + t = tr.worldmodel->textures[i]; if( !t ) continue; s = t->texturechain; @@ -332,7 +331,6 @@ static void R_RecursiveWorldNode( mnode_t *node, uint clipflags ) float dot; mnode_t *children[2]; int numsurfaces, firstsurface; - model_t *WORLDMODEL = (gp_cl->models[1]); loc0: if( node->contents == CONTENTS_SOLID ) @@ -388,14 +386,14 @@ loc0: side = (dot >= 0.0f) ? 0 : 1; // recurse down the children, front side first - node_children( children, node, WORLDMODEL ); + node_children( children, node, tr.worldmodel ); R_RecursiveWorldNode( children[side], clipflags ); - firstsurface = node_firstsurface( node, WORLDMODEL ); - numsurfaces = node_numsurfaces( node, WORLDMODEL ); + firstsurface = node_firstsurface( node, tr.worldmodel ); + numsurfaces = node_numsurfaces( node, tr.worldmodel ); // draw stuff - for( c = numsurfaces, surf = WORLDMODEL->surfaces + firstsurface; c; c--, surf++ ) + for( c = numsurfaces, surf = tr.worldmodel->surfaces + firstsurface; c; c--, surf++ ) { if( R_CullSurface( surf, &RI.frustum, clipflags )) continue; @@ -424,7 +422,6 @@ loc0: void R_DrawWorld( void ) { double start, end; - model_t *WORLDMODEL = (gp_cl->models[1]); // paranoia issues: when gl_renderer is "0" we need have something valid for currententity // to prevent crashing until HeadShield drawing. @@ -433,7 +430,7 @@ void R_DrawWorld( void ) return; RI.currentmodel = RI.currententity->model; - if( !RI.drawWorld || RI.onlyClientDraw ) + if( !FBitSet( RI.rvp.flags, RF_DRAW_WORLD ) || FBitSet( RI.rvp.flags, RF_ONLY_CLIENTDRAW )) return; VectorCopy( RI.cullorigin, tr.modelorg ); @@ -447,11 +444,11 @@ void R_DrawWorld( void ) //R_ClearSkyBox (); start = gEngfuncs.pfnTime(); - if( RI.drawOrtho ) + if( FBitSet( RI.rvp.flags, RF_DRAW_OVERVIEW )) { - //R_DrawWorldTopView( WORLDMODEL->nodes, RI.frustum.clipFlags ); + //R_DrawWorldTopView( tr.worldmodel->nodes, RI.frustum.clipFlags ); } - else R_RecursiveWorldNode( WORLDMODEL->nodes, RI.frustum.clipFlags ); + else R_RecursiveWorldNode( tr.worldmodel->nodes, RI.frustum.clipFlags ); end = gEngfuncs.pfnTime(); //r_stats.t_world_node = end - start; @@ -484,9 +481,8 @@ void R_MarkLeaves( void ) mnode_t *node; vec3_t test; int i; - model_t *WORLDMODEL = (gp_cl->models[1]); - if( !RI.drawWorld ) return; + if( !FBitSet( RI.rvp.flags, RF_DRAW_WORLD ) ) return; if( FBitSet( r_novis.flags, FCVAR_CHANGED ) || tr.fResetVis ) { @@ -496,21 +492,17 @@ void R_MarkLeaves( void ) RI.viewleaf = NULL; } - VectorCopy( RI.pvsorigin, test ); + VectorCopy( RI.rvp.vieworigin, test ); if( RI.viewleaf != NULL ) { // merge two leafs that can be a crossed-line contents if( RI.viewleaf->contents == CONTENTS_EMPTY ) - { - VectorSet( test, RI.pvsorigin[0], RI.pvsorigin[1], RI.pvsorigin[2] - 16.0f ); - leaf = gEngfuncs.Mod_PointInLeaf( test, WORLDMODEL->nodes ); - } + VectorSet( test, RI.rvp.vieworigin[0], RI.rvp.vieworigin[1], RI.rvp.vieworigin[2] - 16.0f ); else - { - VectorSet( test, RI.pvsorigin[0], RI.pvsorigin[1], RI.pvsorigin[2] + 16.0f ); - leaf = gEngfuncs.Mod_PointInLeaf( test, WORLDMODEL->nodes ); - } + VectorSet( test, RI.rvp.vieworigin[0], RI.rvp.vieworigin[1], RI.rvp.vieworigin[2] + 16.0f ); + + leaf = gEngfuncs.Mod_PointInLeaf( test, tr.worldmodel->nodes, tr.worldmodel ); if(( leaf->contents != CONTENTS_SOLID ) && ( RI.viewleaf != leaf )) force = true; @@ -526,18 +518,18 @@ void R_MarkLeaves( void ) RI.oldviewleaf = RI.viewleaf; tr.visframecount++; - if( r_novis.value || RI.drawOrtho || !RI.viewleaf || !WORLDMODEL->visdata ) + if( r_novis.value || FBitSet( RI.rvp.flags, RF_DRAW_OVERVIEW ) || !RI.viewleaf || !tr.worldmodel->visdata ) novis = true; - gEngfuncs.R_FatPVS( RI.pvsorigin, r_pvs_radius->value, RI.visbytes, FBitSet( RI.params, RP_OLDVIEWLEAF ), novis ); + gEngfuncs.R_FatPVS( RI.rvp.vieworigin, r_pvs_radius->value, RI.visbytes, false, novis ); if( force && !novis ) gEngfuncs.R_FatPVS( test, r_pvs_radius->value, RI.visbytes, true, novis ); - for( i = 0; i < WORLDMODEL->numleafs; i++ ) + for( i = 0; i < tr.worldmodel->numleafs; i++ ) { if( CHECKVISBIT( RI.visbytes, i )) { - node = (mnode_t *)&WORLDMODEL->leafs[i+1]; + node = (mnode_t *)&tr.worldmodel->leafs[i+1]; do { if( node->visframe == tr.visframecount ) diff --git a/ref/dx2/wscript b/ref/dx2/wscript index 12e5e52f..18bf404c 100644 --- a/ref/dx2/wscript +++ b/ref/dx2/wscript @@ -13,6 +13,6 @@ def build(bld): source = ['r_context.c', 'r_image.c', 'r_d3d.c', 'r_main.c', 'r_draw.c', 'r_surf.c', 'r_frustum.c'], target = 'ref_dx2', defines = 'REF_DLL', - use = 'engine_includes sdk_includes werror public USER32 DDRAW', + use = 'ref_common engine_includes sdk_includes werror public USER32 DDRAW', install_path = bld.env.LIBDIR )