From 52fd75801c2cf71dd2be537c3bea00fc7c522314 Mon Sep 17 00:00:00 2001 From: TimeServ Date: Thu, 31 Mar 2011 23:05:19 +0000 Subject: [PATCH] attempt implement d3d and gl es getrgbinfo, fix typos/commit with crosshair git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3766 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/r_2d.c | 2 +- engine/common/common.c | 2 +- engine/d3d/vid_d3d.c | 63 +++++++++++++-- engine/gl/gl_draw.c | 164 --------------------------------------- engine/gl/gl_draw.h | 1 - engine/gl/gl_rmisc.c | 9 --- engine/gl/gl_screen.c | 26 ++++++- engine/gl/gl_vidcommon.c | 1 - 8 files changed, 84 insertions(+), 184 deletions(-) diff --git a/engine/client/r_2d.c b/engine/client/r_2d.c index 11035e84f..26abc02dd 100644 --- a/engine/client/r_2d.c +++ b/engine/client/r_2d.c @@ -1003,7 +1003,7 @@ void R2D_DrawCrosshair(void) { sizex = (size*vid.rotpixelwidth) / (float)vid.width; sizey = (size*vid.rotpixelheight) / (float)vid.height; - chc = size * chc; + chc = size / 16.0; } sizex = (int)sizex; diff --git a/engine/common/common.c b/engine/common/common.c index b597074f3..60ad733d2 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -4336,8 +4336,8 @@ char *version_string(void) #define STRINGIFY2(arg) #arg #define STRINGIFY(arg) STRINGIFY2(arg) Q_snprintfz(s, sizeof(s), "%s SVN %s", DISTRIBUTION, STRINGIFY(SVNREVISION)); -#undef STRINGIFY2 #undef STRINGIFY +#undef STRINGIFY2 #else Q_snprintfz(s, sizeof(s), "%s build %s", DISTRIBUTION, __DATE__); #endif diff --git a/engine/d3d/vid_d3d.c b/engine/d3d/vid_d3d.c index 0f9b5968c..13fa026c9 100644 --- a/engine/d3d/vid_d3d.c +++ b/engine/d3d/vid_d3d.c @@ -798,7 +798,64 @@ static void (D3D9_VID_ShiftPalette) (unsigned char *palette) } static char *(D3D9_VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight) { - return NULL; + IDirect3DSurface9 *surf; + D3DLOCKED_RECT rect; + extern qboolean gammaworks; + int i, j, c; + qbyte *ret = BZ_Malloc(prepad + vid.pixelwidth*vid.pixelheight*3); + qbyte *p; + HRESULT res; + + // TODO: this captures the entire screen on windowed display.. + // also might break on multi-monitor + IDirect3DDevice9_CreateOffscreenPlainSurface(pD3DDev9, + GetSystemMetrics(SM_CXSCREEN), + GetSystemMetrics(SM_CYSCREEN), + D3DFMT_A8R8G8B8, + D3DPOOL_SYSTEMMEM, + &surf, + NULL); + IDirect3DDevice9_GetFrontBufferData(pD3DDev9, 0, surf); + IDirect3DSurface9_LockRect(surf, &rect, NULL, D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_READONLY|D3DLOCK_NOSYSLOCK); + + // read surface rect and convert 32 bgra to 24 rgb and flip + c = prepad+vid.pixelwidth*vid.pixelheight*3; + p = (qbyte *)rect.pBits; + + if (gammaworks) + { + extern qbyte gammatable[256]; + for (i=c-(3*vid.pixelwidth); i>=prepad; i-=(3*vid.pixelwidth)) + { + for (j=0; j=prepad; i-=(3*vid.pixelwidth)) + { + for (j=0; jstring)) - externalhair = R_LoadHiResTexture (var->string, "crosshairs", IF_NOMIPMAP); -} - -void GLCrosshair_Callback(struct cvar_s *var, char *oldvalue) -{ - unsigned int c, c2; - - if (!var->value) - return; - - c = (unsigned int)(chcolor[0] * 255) | // red - ((unsigned int)(chcolor[1] * 255) << 8) | // green - ((unsigned int)(chcolor[2] * 255) << 16) | // blue - 0xff000000; // alpha - c2 = c; - -#define Pix(x,y,c) { \ - if (y+8<0)c=0; \ - if (y+8>=16)c=0; \ - if (x+8<0)c=0; \ - if (x+8>=16)c=0; \ - \ - cs_data[(y+8)*16+(x+8)] = c; \ - } - memset(cs_data, 0, sizeof(cs_data)); - switch((int)var->value) - { - default: -#include "crosshairs.dat" - } -#undef Pix - - R_Upload(cs_texture, NULL, TF_RGBA32, cs_data, NULL, 16, 16, IF_NOMIPMAP|IF_NOGAMMA); - - if (gl_smoothcrosshair.ival) - { - qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - } - else - { - qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } -} - -void GLCrosshaircolor_Callback(struct cvar_s *var, char *oldvalue) -{ - SCR_StringToRGB(var->string, chcolor, 255); - - chcolor[0] = bound(0, chcolor[0], 1); - chcolor[1] = bound(0, chcolor[1], 1); - chcolor[2] = bound(0, chcolor[2], 1); - - GLCrosshair_Callback(&crosshair, ""); -} - -void GLDraw_Crosshair(void) -{ - int x, y; - int sc; - float sx, sy, sizex, sizey; - - float size, chc; - shader_t *shader; - - qboolean usingimage = false; - - if (crosshair.ival == 1 && !*crosshairimage.string) - { - for (sc = 0; sc < cl.splitclients; sc++) - { - SCR_CrosshairPosition(sc, &x, &y); - Font_BeginString(font_conchar, x, y, &x, &y); - x -= Font_CharWidth('+' | 0xe000 | CON_WHITEMASK)/2; - y -= Font_CharHeight()/2; - Font_DrawChar(x, y, '+' | 0xe000 | CON_WHITEMASK); - Font_EndString(font_conchar); - } - return; - } - - shader = crosshair_shader; - if (*crosshairimage.string) - { - usingimage = true; - chc = 0; - - shader->defaulttextures.base = externalhair; - } - else if (crosshair.ival) - { - chc = 1/16.0; - - // force crosshair refresh with animated crosshairs - if (crosshair.ival >= FIRSTANIMATEDCROSHAIR) - GLCrosshair_Callback(&crosshair, ""); - - shader->defaulttextures.base = cs_texture; - } - else - return; - - size = crosshairsize.value; - - if (size < 0) - { - size = -size; - sizex = size; - sizey = size; - chc = 0; - } - else - { - sizex = (size*vid.rotpixelwidth) / (float)vid.width; - sizey = (size*vid.rotpixelheight) / (float)vid.height; - chc = size * chc; - } - - sizex = (int)sizex; - sizex = ((sizex)*(int)vid.width) / (float)vid.rotpixelwidth; - - sizey = (int)sizey; - sizey = ((sizey)*(int)vid.height) / (float)vid.rotpixelheight; - - for (sc = 0; sc < cl.splitclients; sc++) - { - SCR_CrosshairPosition(sc, &x, &y); - - //translate to pixel coord, for rounding - x = ((x-sizex-chc)*vid.rotpixelwidth) / (float)vid.width; - y = ((y-sizey-chc)*vid.rotpixelheight) / (float)vid.height; - - //translate to screen coords - sx = ((x)*(int)vid.width) / (float)vid.rotpixelwidth; - sy = ((y)*(int)vid.height) / (float)vid.rotpixelheight; - - R2D_Image(sx, sy, sizex*2, sizey*2, 0, 0, 1, 1, shader); - } -} - //============================================================================= diff --git a/engine/gl/gl_draw.h b/engine/gl/gl_draw.h index 54fa7259a..6dc922b6d 100644 --- a/engine/gl/gl_draw.h +++ b/engine/gl/gl_draw.h @@ -25,7 +25,6 @@ void GLDraw_Init (void); void GLDraw_ReInit (void); void GLDraw_DeInit (void); void Surf_DeInit (void); -void GLDraw_Crosshair(void); void R2D_Init(void); mpic_t *R2D_SafeCachePic (char *path); diff --git a/engine/gl/gl_rmisc.c b/engine/gl/gl_rmisc.c index 7eaedc945..11c313fe7 100644 --- a/engine/gl/gl_rmisc.c +++ b/engine/gl/gl_rmisc.c @@ -451,9 +451,6 @@ extern cvar_t vid_conautoscale, vid_conheight, vid_conwidth; extern cvar_t crosshair, crosshairimage, crosshaircolor, r_skyboxname; extern cvar_t r_floorcolour, r_wallcolour, r_floortexture, r_walltexture; extern cvar_t r_fastskycolour; -void GLCrosshairimage_Callback(struct cvar_s *var, char *oldvalue); -void GLCrosshair_Callback(struct cvar_s *var, char *oldvalue); -void GLCrosshaircolor_Callback(struct cvar_s *var, char *oldvalue); void GLV_Gamma_Callback(struct cvar_s *var, char *oldvalue); void GLR_DeInit (void) @@ -464,9 +461,6 @@ void GLR_DeInit (void) Cmd_RemoveCommand ("makewad"); - Cvar_Unhook(&crosshair); - Cvar_Unhook(&crosshairimage); - Cvar_Unhook(&crosshaircolor); Cvar_Unhook(&r_skyboxname); Cvar_Unhook(&vid_conautoscale); Cvar_Unhook(&vid_conheight); @@ -495,9 +489,6 @@ void GLR_Init (void) // Cmd_AddRemCommand ("makewad", R_MakeTexWad_f); - Cvar_Hook(&crosshair, GLCrosshair_Callback); - Cvar_Hook(&crosshairimage, GLCrosshairimage_Callback); - Cvar_Hook(&crosshaircolor, GLCrosshaircolor_Callback); // Cvar_Hook(&r_floorcolour, GLR_Floorcolour_Callback); // Cvar_Hook(&r_fastskycolour, GLR_Fastskycolour_Callback); // Cvar_Hook(&r_wallcolour, GLR_Wallcolour_Callback); diff --git a/engine/gl/gl_screen.c b/engine/gl/gl_screen.c index 9a8c13eb5..f94b8e56a 100644 --- a/engine/gl/gl_screen.c +++ b/engine/gl/gl_screen.c @@ -221,9 +221,31 @@ char *GLVID_GetRGBInfo(int prepadbytes, int *truewidth, int *trueheight) { //returns a BZ_Malloced array extern qboolean gammaworks; int i, c; - qbyte *ret = BZ_Malloc(prepadbytes + vid.pixelwidth*vid.pixelheight*3); + qbyte *ret; - qglReadPixels (0, 0, vid.pixelwidth, vid.pixelheight, GL_RGB, GL_UNSIGNED_BYTE, ret + prepadbytes); + if (gl_config.gles) + { + qbyte *p; + + // gles only guarantees GL_RGBA/GL_UNSIGNED_BYTE so downconvert and resize + ret = BZ_Malloc(prepadbytes + vid.pixelwidth*vid.pixelheight*4); + qglReadPixels (0, 0, vid.pixelwidth, vid.pixelheight, GL_RGBA, GL_UNSIGNED_BYTE, ret + prepadbytes); + + c = vid.pixelwidth*vid.pixelheight; + p = ret + prepadbytes; + for (i = 1; i < c; i++) + { + p[i*3+0]=p[i*4+0]; + p[i*3+1]=p[i*4+1]; + p[i*3+2]=p[i*4+2]; + } + ret = BZ_Realloc(ret, prepadbytes + vid.pixelwidth*vid.pixelheight*3); + } + else + { + ret = BZ_Malloc(prepadbytes + vid.pixelwidth*vid.pixelheight*3); + qglReadPixels (0, 0, vid.pixelwidth, vid.pixelheight, GL_RGB, GL_UNSIGNED_BYTE, ret + prepadbytes); + } *truewidth = vid.pixelwidth; *trueheight = vid.pixelheight; diff --git a/engine/gl/gl_vidcommon.c b/engine/gl/gl_vidcommon.c index 845021cf2..1e58aae94 100644 --- a/engine/gl/gl_vidcommon.c +++ b/engine/gl/gl_vidcommon.c @@ -1067,7 +1067,6 @@ rendererinfo_t openglrendererinfo = { GLDraw_Init, GLDraw_ReInit, - GLDraw_Crosshair, GL_LoadTextureFmt, GL_LoadTexture8Pal24,