diff options
| author | Steven Fuller <relnev@icculus.org> | 2015-02-14 12:00:00 +0100 |
|---|---|---|
| committer | Patryk Obara <dreamer.tan@gmail.com> | 2019-08-20 03:51:33 +0200 |
| commit | 0de664d0a886bcda45a0cd05551b6896c5c46ed0 (patch) | |
| tree | 50127b6ec478d76bc714dbfda69602610334ed0c /src/opengl.c | |
| parent | 22475d6d94e96056d1550dca00b32d00e3821649 (diff) | |
Import icculus.org release (2015-02-14)
Diffstat (limited to 'src/opengl.c')
| -rw-r--r-- | src/opengl.c | 1274 |
1 files changed, 760 insertions, 514 deletions
diff --git a/src/opengl.c b/src/opengl.c index 15195cd..4326fc0 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -49,18 +49,28 @@ static D3DTexture *CurrTextureHandle; static enum TRANSLUCENCY_TYPE CurrentTranslucencyMode = TRANSLUCENCY_OFF; static enum FILTERING_MODE_ID CurrentFilteringMode = FILTERING_BILINEAR_OFF; +static GLenum TextureMinFilter = GL_LINEAR_MIPMAP_LINEAR; static D3DTexture *CurrentlyBoundTexture = NULL; +#if defined(_MSC_VER) +#define ALIGN16 __declspec(align(16)) +#else +#define ALIGN16 __attribute__((__aligned__(16))) +#endif + +// need to look into this again at some point +// everything but the hud rendering used an offset +#define TEXCOORD_FIXED(s, r) (((float)((s)+(0<<15))) * (r)) + #define TA_MAXVERTICES 2048 #define TA_MAXTRIANGLES 2048 typedef struct VertexArray { GLfloat v[4]; - - GLfloat t[3]; /* 3rd float is padding */ - + GLfloat t[2]; GLubyte c[4]; + GLubyte s[4]; } VertexArray; typedef struct TriangleArray @@ -70,19 +80,19 @@ typedef struct TriangleArray unsigned short c; } TriangleArray; -static VertexArray varr[TA_MAXVERTICES*2]; -static TriangleArray tarr[TA_MAXTRIANGLES*2]; +static ALIGN16 VertexArray varr[TA_MAXVERTICES]; +static ALIGN16 TriangleArray tarr[TA_MAXTRIANGLES]; static VertexArray *varrp = varr; static TriangleArray *tarrp = tarr; static int varrc, tarrc; -static VertexArray *svarr = &varr[TA_MAXVERTICES], *svarrp = &varr[TA_MAXVERTICES]; -static TriangleArray *starr = &tarr[TA_MAXTRIANGLES], *starrp = &tarr[TA_MAXTRIANGLES]; -static int svarrc, starrc; +static ALIGN16 TriangleArray starr[TA_MAXTRIANGLES]; +static TriangleArray *starrp = starr; +static int starrc; /* Do not call this directly! */ static void SetTranslucencyMode(enum TRANSLUCENCY_TYPE mode) -{ +{ pglDisable(GL_ALPHA_TEST); switch(mode) { @@ -90,7 +100,9 @@ static void SetTranslucencyMode(enum TRANSLUCENCY_TYPE mode) if (TRIPTASTIC_CHEATMODE||MOTIONBLUR_CHEATMODE) { pglBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); } else { + // alien tail hack pglEnable(GL_ALPHA_TEST); + pglBlendFunc(GL_ONE, GL_ZERO); } break; @@ -113,8 +125,48 @@ static void SetTranslucencyMode(enum TRANSLUCENCY_TYPE mode) pglBlendFunc(GL_ZERO, GL_ONE); break; default: - fprintf(stderr, "RenderPolygon.TranslucencyMode: invalid %d\n", RenderPolygon.TranslucencyMode); - return; + fprintf(stderr, "SetTranslucencyMode: invalid blend mode %d\n", mode); + break; + } +} + +static void SetSecondPassTranslucencyMode(enum TRANSLUCENCY_TYPE mode) +{ + pglDisable(GL_ALPHA_TEST); + + switch(mode) { + case TRANSLUCENCY_OFF: + if (TRIPTASTIC_CHEATMODE||MOTIONBLUR_CHEATMODE) { + pglBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_ONE); + } else { + pglBlendFunc(GL_ONE, GL_ONE); + } + break; + case TRANSLUCENCY_NORMAL: + pglBlendFunc(GL_SRC_ALPHA, GL_ONE); + break; + case TRANSLUCENCY_GLOWING: + pglBlendFunc(GL_SRC_ALPHA, GL_ONE); + break; + case TRANSLUCENCY_COLOUR: + //fprintf(stderr, "SetSecondPassTranslucencyMode: unsupported blend mode %d\n", mode); + // can't easily emulate this one + pglBlendFunc(GL_DST_COLOR, GL_ONE); + break; + case TRANSLUCENCY_INVCOLOUR: + //fprintf(stderr, "SetSecondPassTranslucencyMode: unsupported blend mode %d\n", mode); + // can't easily emulate this one + pglBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE); + break; + + case TRANSLUCENCY_DARKENINGCOLOUR: + case TRANSLUCENCY_JUSTSETZ: + fprintf(stderr, "SetSecondPassTranslucencyMode: unsupported blend mode %d\n", mode); + pglBlendFunc(GL_SRC_ALPHA, GL_ONE); + break; + default: + fprintf(stderr, "SetSecondPassTranslucencyMode: invalid blend mode %d\n", mode); + break; } } @@ -131,10 +183,12 @@ void InitOpenGL() pglHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); pglHint( GL_GENERATE_MIPMAP_HINT, GL_NICEST ); +#if GL_NV_multisample_filter_hint if ( ogl_use_multisample_filter_hint ) { pglHint( GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST ); } +#endif CurrentTranslucencyMode = TRANSLUCENCY_OFF; pglBlendFunc(GL_ONE, GL_ZERO); @@ -157,17 +211,6 @@ void InitOpenGL() pglEnableClientState(GL_COLOR_ARRAY); pglColorPointer(4, GL_UNSIGNED_BYTE, sizeof(varr[0]), varr[0].c); -#if 0 -#if GL_EXT_secondary_color - if (ogl_use_secondary_color) { - pglEnableClientState(GL_SEPARATE_COLOR_ARRAY_EXT); - pglSecondaryColorPointerEXT(4, GL_UNSIGNED_BYTE, sizeof(svarr[0]), svarr[0].c); - } else { - pglDisableClientState(GL_SEPARATE_COLOR_ARRAY_EXT); - } -#endif -#endif - tarrc = 0; tarrp = tarr; @@ -176,9 +219,6 @@ void InitOpenGL() starrc = 0; starrp = starr; - - svarrc = 0; - svarrp = svarr; } static void FlushTriangleBuffers(int backup) @@ -194,42 +234,55 @@ static void FlushTriangleBuffers(int backup) } if (starrc) { - if (CurrentlyBoundTexture != NULL) { - if (!backup) CurrentlyBoundTexture = NULL; - pglBindTexture(GL_TEXTURE_2D, 0); - } + //if (CurrentlyBoundTexture != NULL) { + // if (!backup) CurrentlyBoundTexture = NULL; + // pglBindTexture(GL_TEXTURE_2D, 0); + //} - if (CurrentTranslucencyMode != TRANSLUCENCY_GLOWING) { - if (!backup) CurrentTranslucencyMode = TRANSLUCENCY_GLOWING; - SetTranslucencyMode(TRANSLUCENCY_GLOWING); - //if (CurrentTranslucencyMode == TRANSLUCENCY_OFF) - // pglEnable(GL_BLEND); - //glBlendFunc(GL_SRC_ALPHA, GL_ONE); - } + //if (CurrentTranslucencyMode != TRANSLUCENCY_GLOWING) { + // if (!backup) CurrentTranslucencyMode = TRANSLUCENCY_GLOWING; + // SetTranslucencyMode(TRANSLUCENCY_GLOWING); + // //if (CurrentTranslucencyMode == TRANSLUCENCY_OFF) + // // pglEnable(GL_BLEND); + // //glBlendFunc(GL_SRC_ALPHA, GL_ONE); + //} + + SetSecondPassTranslucencyMode(CurrentTranslucencyMode); - pglDisableClientState(GL_TEXTURE_COORD_ARRAY); + pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + pglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); + pglTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR); + pglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); + pglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); + pglTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); + pglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); + pglTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PRIMARY_COLOR); + pglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); + + //pglDisableClientState(GL_TEXTURE_COORD_ARRAY); + pglColorPointer(4, GL_UNSIGNED_BYTE, sizeof(varr[0]), varr[0].s); pglDrawElements(GL_TRIANGLES, starrc*3, GL_UNSIGNED_SHORT, starr); + + //pglEnableClientState(GL_TEXTURE_COORD_ARRAY); + pglColorPointer(4, GL_UNSIGNED_BYTE, sizeof(varr[0]), varr[0].c); - pglEnableClientState(GL_TEXTURE_COORD_ARRAY); - - if (backup) { - if (CurrentlyBoundTexture) - pglBindTexture(GL_TEXTURE_2D, CurrentlyBoundTexture->id); - if (CurrentTranslucencyMode != TRANSLUCENCY_GLOWING) - SetTranslucencyMode(CurrentTranslucencyMode); - } else { - CurrentlyBoundTexture = NULL; - CurrentTranslucencyMode = TRANSLUCENCY_GLOWING; - } + //if (backup) { + // //if (CurrentlyBoundTexture) + // // pglBindTexture(GL_TEXTURE_2D, CurrentlyBoundTexture->id); + // if (CurrentTranslucencyMode != TRANSLUCENCY_GLOWING) + // SetTranslucencyMode(CurrentTranslucencyMode); + //} else { + // //CurrentlyBoundTexture = NULL; + // CurrentTranslucencyMode = TRANSLUCENCY_GLOWING; + //} + + SetTranslucencyMode(CurrentTranslucencyMode); + pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); starrc = 0; starrp = starr; - - svarrc = 0; - svarrp = svarr; - } - + } } static void CheckBoundTextureIsCorrect(D3DTexture *tex) @@ -257,7 +310,7 @@ static void CheckBoundTextureIsCorrect(D3DTexture *tex) break; case FILTERING_BILINEAR_ON: pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, TextureMinFilter); break; default: break; @@ -283,7 +336,7 @@ static void CheckFilteringModeIsCorrect(enum FILTERING_MODE_ID filter) break; case FILTERING_BILINEAR_ON: pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, TextureMinFilter); break; default: break; @@ -309,16 +362,10 @@ static void CheckTriangleBuffer(int rver, int sver, int rtri, int stri, D3DTextu { if ((rver+varrc) >= TA_MAXVERTICES) { FlushTriangleBuffers(0); - } else if ((sver+svarrc) >= TA_MAXVERTICES) { - FlushTriangleBuffers(0); } else if (rtri == 0 && ((rver-2+tarrc) >= TA_MAXTRIANGLES)) { FlushTriangleBuffers(0); } else if (rtri && ((rtri+tarrc) >= TA_MAXTRIANGLES)) { FlushTriangleBuffers(0); - } else if (stri == 0 && ((sver-2+starrc) >= TA_MAXTRIANGLES)) { - FlushTriangleBuffers(0); - } else if (stri && ((stri+starrc) >= TA_MAXTRIANGLES)) { - FlushTriangleBuffers(0); } if ((intptr_t)tex != -1) @@ -359,7 +406,7 @@ static void CheckTriangleBuffer(int rver, int sver, int rtri, int stri, D3DTextu OUTPUT_TRIANGLE(0, 3, 4); case 4: OUTPUT_TRIANGLE(0, 2, 3); - OUTPUT_TRIANGLE(0, 1, 2); + OUTPUT_TRIANGLE(0, 1, 2); break; default: fprintf(stderr, "DrawTriangles_T2F_C4UB_V4F: vertices = %d\n", rver); @@ -369,9 +416,9 @@ static void CheckTriangleBuffer(int rver, int sver, int rtri, int stri, D3DTextu #define OUTPUT_TRIANGLE(x, y, z) \ { \ - starrp->a = TA_MAXVERTICES+svarrc+(x); \ - starrp->b = TA_MAXVERTICES+svarrc+(y); \ - starrp->c = TA_MAXVERTICES+svarrc+(z); \ + starrp->a = varrc+(x); \ + starrp->b = varrc+(y); \ + starrp->c = varrc+(z); \ \ starrp++; \ starrc++; \ @@ -404,61 +451,108 @@ static void CheckTriangleBuffer(int rver, int sver, int rtri, int stri, D3DTextu } } #undef OUTPUT_TRIANGLE - } -static void SelectPolygonBeginType(int points) -{ - if (tarrc || starrc) - FlushTriangleBuffers(1); - - switch(points) { - case 3: - pglBegin(GL_TRIANGLES); - break; - case 4: - case 5: - case 6: - case 7: - case 8: - pglBegin(GL_TRIANGLE_FAN); - break; - default: - fprintf(stderr, "SelectPolygonBeginType: points = %d\n", points); - break; - } +static unsigned int PowerOfTwo(unsigned int v) { + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + return v + 1; } GLuint CreateOGLTexture(D3DTexture *tex, unsigned char *buf) { + if (buf == NULL) { + // converting DDSurface to D3DTexture + buf = tex->buf; + } + if (buf == NULL) { + fprintf(stderr, "CreateOGLTexture - null buffer\n"); + return 0; + } + + int i; + int l = tex->w * tex->h; + for (i = 0; i < l; i++) { + int o = i*4; + int r = buf[o+0]; + int g = buf[o+1]; + int b = buf[o+2]; + int a = buf[o+3]; + + // kinda pre-multiplied alpha; + // texels with zero alpha shouldn't + // be visible. + if (a == 0) { + r = 0; + g = 0; + b = 0; + } + + buf[o+0] = r; + buf[o+1] = g; + buf[o+2] = b; + buf[o+3] = a; + } + + tex->TexWidth = tex->w; + tex->TexHeight = tex->h; + + int PotWidth = PowerOfTwo(tex->TexWidth); + int PotHeight = PowerOfTwo(tex->TexHeight); + tex->IsNpot = (PotWidth != tex->TexWidth) || (PotHeight != tex->TexHeight); + GLuint h; GLfloat max_anisotropy; FlushTriangleBuffers(1); - + pglGenTextures(1, &h); pglBindTexture(GL_TEXTURE_2D, h); pglTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); - + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - - pglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->w, tex->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf); - + + if (tex->IsNpot) { + // OpenGL 1.x compatibility + tex->TexWidth = PotWidth; + tex->TexHeight = PotHeight; + + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + pglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->TexWidth, tex->TexHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + pglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex->w, tex->h, GL_RGBA, GL_UNSIGNED_BYTE, buf); + } else { + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + if (tex->IsNpot) { + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } else { + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, TextureMinFilter); + } + + pglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->w, tex->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf); + } + pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - + + tex->buf = NULL; tex->id = h; tex->filter = FILTERING_BILINEAR_ON; + tex->RecipW = 1.0f / (float) tex->TexWidth; + tex->RecipH = 1.0f / (float) tex->TexHeight; if ( ogl_use_texture_filter_anisotropic ) { - pglGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_anisotropy); - pglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy); - } + pglGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_anisotropy); + pglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy); + } if ( CurrentlyBoundTexture != NULL ) { @@ -466,6 +560,8 @@ GLuint CreateOGLTexture(D3DTexture *tex, unsigned char *buf) pglBindTexture(GL_TEXTURE_2D, CurrentlyBoundTexture->id); } + free(buf); + return h; } @@ -473,11 +569,36 @@ void ReleaseD3DTexture(void *tex) { D3DTexture *TextureHandle = (D3DTexture *)tex; - pglDeleteTextures(1, (GLuint*) &(TextureHandle->id)); + if (TextureHandle == NULL) { + return; + } + + if (TextureHandle->id != 0) { + pglDeleteTextures(1, (GLuint*) &(TextureHandle->id)); + TextureHandle->id = 0; + } + + if (TextureHandle->buf != NULL) { + free(TextureHandle->buf); + TextureHandle->buf = NULL; + } free(TextureHandle); } +int CreateIMGSurface(D3DTexture *tex, unsigned char *buf) +{ + tex->buf = buf; + tex->id = 0; + + return 0; +} + +void ReleaseDDSurface(void* DDSurface) +{ + ReleaseD3DTexture(DDSurface); +} + /* ** */ void ThisFramesRenderingHasBegun() @@ -534,14 +655,12 @@ void D3D_DecalSystem_End() void D3D_Rectangle(int x0, int y0, int x1, int y1, int r, int g, int b, int a) { GLfloat x[4], y[4]; - + int i; + if (y1 <= y0) return; - - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_GLOWING); - CheckBoundTextureIsCorrect(NULL); - - pglColor4ub(r, g, b, a); + + CheckTriangleBuffer(4, 0, 0, 0, NULL, TRANSLUCENCY_GLOWING, -1); x[0] = x0; x[0] = (x[0] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; @@ -563,17 +682,28 @@ void D3D_Rectangle(int x0, int y0, int x1, int y1, int r, int g, int b, int a) y[3] = y1 - 1; y[3] = -(y[3] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; - SelectPolygonBeginType(3); /* triangles */ - - pglVertex3f(x[0], y[0], -1.0f); - pglVertex3f(x[1], y[1], -1.0f); - pglVertex3f(x[3], y[3], -1.0f); - - pglVertex3f(x[1], y[1], -1.0f); - pglVertex3f(x[2], y[2], -1.0f); - pglVertex3f(x[3], y[3], -1.0f); - - pglEnd(); + for (i = 0; i < 4; i++) { + varrp->v[0] = x[i]; + varrp->v[1] = y[i]; + varrp->v[2] = -1.0f; + varrp->v[3] = 1.0f; + + varrp->t[0] = 0.0f; + varrp->t[1] = 0.0f; + + varrp->c[0] = r; + varrp->c[1] = g; + varrp->c[2] = b; + varrp->c[3] = a; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } } /* ** */ @@ -597,19 +727,9 @@ void D3D_ZBufferedGouraudTexturedPolygon_Output(POLYHEADER *inputPolyPtr, RENDER TextureHandle = CurrTextureHandle; } - if (TextureHandle->w == 128) { - RecipW = (1.0f / 128.0f) / 65536.0f; - } else { - float width = TextureHandle->w; - RecipW = (1.0f / width) / 65536.0f; - } - if (TextureHandle->h == 128) { - RecipH = (1.0f / 128.0f) / 65536.0f; - } else { - float height = TextureHandle->h; - RecipH = (1.0f / height) / 65536.0f; - } - + RecipW = TextureHandle->RecipW / 65536.0f; + RecipH = TextureHandle->RecipH / 65536.0f; + CheckTriangleBuffer(RenderPolygon.NumberOfVertices, RenderPolygon.NumberOfVertices, 0, 0, TextureHandle, RenderPolygon.TranslucencyMode, -1); for (i = 0; i < RenderPolygon.NumberOfVertices; i++) { @@ -619,8 +739,8 @@ void D3D_ZBufferedGouraudTexturedPolygon_Output(POLYHEADER *inputPolyPtr, RENDER GLfloat w = (float)vertices->Z; GLfloat zvalue; - s = ((float)vertices->U) * RecipW + (1.0f/256.0f); - t = ((float)vertices->V) * RecipH + (1.0f/256.0f); + s = TEXCOORD_FIXED(vertices->U, RecipW); + t = TEXCOORD_FIXED(vertices->V, RecipH); x = ((float)vertices->X*((float)Global_VDB_Ptr->VDB_ProjX+1.0f))/((float)vertices->Z*(float)ScreenDescriptorBlock.SDB_CentreX); y = -((float)vertices->Y*((float)Global_VDB_Ptr->VDB_ProjY+1.0f))/((float)vertices->Z*(float)ScreenDescriptorBlock.SDB_CentreY); @@ -628,28 +748,26 @@ void D3D_ZBufferedGouraudTexturedPolygon_Output(POLYHEADER *inputPolyPtr, RENDER zvalue = vertices->Z+HeadUpDisplayZOffset; z = 1.0f - 2.0f*ZNear/zvalue; - varrp->v[0] = svarrp->v[0] = x*w; - varrp->v[1] = svarrp->v[1] = y*w; - varrp->v[2] = svarrp->v[2] = z*w; - varrp->v[3] = svarrp->v[3] = w; + varrp->v[0] = x*w; + varrp->v[1] = y*w; + varrp->v[2] = z*w; + varrp->v[3] = w; - varrp->t[0] = /**/ svarrp->t[0] = /**/ s; - varrp->t[1] = /**/ svarrp->t[1] = /**/ t; + varrp->t[0] = s; + varrp->t[1] = t; varrp->c[0] = GammaValues[vertices->R]; varrp->c[1] = GammaValues[vertices->G]; varrp->c[2] = GammaValues[vertices->B]; varrp->c[3] = vertices->A; - svarrp->c[0] = GammaValues[vertices->SpecularR]; - svarrp->c[1] = GammaValues[vertices->SpecularG]; - svarrp->c[2] = GammaValues[vertices->SpecularB]; - svarrp->c[3] = 255; + varrp->s[0] = GammaValues[vertices->SpecularR]; + varrp->s[1] = GammaValues[vertices->SpecularG]; + varrp->s[2] = GammaValues[vertices->SpecularB]; + varrp->s[3] = vertices->A; varrp++; varrc++; - svarrp++; - svarrc++; } } @@ -664,18 +782,8 @@ void D3D_SkyPolygon_Output(POLYHEADER *inputPolyPtr, RENDERVERTEX *renderVertice TextureHandle = (void *)ImageHeaderArray[texoffset].D3DTexture; CurrTextureHandle = TextureHandle; - if (TextureHandle->w == 128) { - RecipW = (1.0f / 128.0f) / 65536.0f; - } else { - float width = TextureHandle->w; - RecipW = (1.0f / width) / 65536.0f; - } - if (TextureHandle->h == 128) { - RecipH = (1.0f / 128.0f) / 65536.0f; - } else { - float height = TextureHandle->h; - RecipH = (1.0f / height) / 65536.0f; - } + RecipW = TextureHandle->RecipW / 65536.0f; + RecipH = TextureHandle->RecipH / 65536.0f; CheckTriangleBuffer(RenderPolygon.NumberOfVertices, 0, 0, 0, TextureHandle, RenderPolygon.TranslucencyMode, -1); @@ -687,8 +795,8 @@ void D3D_SkyPolygon_Output(POLYHEADER *inputPolyPtr, RENDERVERTEX *renderVertice w = (float)vertices->Z; - s = ((float)vertices->U) * RecipW + (1.0f/256.0f); - t = ((float)vertices->V) * RecipH + (1.0f/256.0f); + s = TEXCOORD_FIXED(vertices->U, RecipW); + t = TEXCOORD_FIXED(vertices->V, RecipH); x = ((float)vertices->X*((float)Global_VDB_Ptr->VDB_ProjX+1.0f))/((float)vertices->Z*(float)ScreenDescriptorBlock.SDB_CentreX); y = -((float)vertices->Y*((float)Global_VDB_Ptr->VDB_ProjY+1.0f))/((float)vertices->Z*(float)ScreenDescriptorBlock.SDB_CentreY); @@ -708,6 +816,11 @@ void D3D_SkyPolygon_Output(POLYHEADER *inputPolyPtr, RENDERVERTEX *renderVertice varrp->c[2] = vertices->B; varrp->c[3] = vertices->A; + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + varrp++; varrc++; } @@ -731,19 +844,8 @@ void D3D_ZBufferedCloakedPolygon_Output(POLYHEADER *inputPolyPtr, RENDERVERTEX * TextureHandle = ImageHeaderArray[texoffset].D3DTexture; CurrTextureHandle = TextureHandle; - if (TextureHandle->w == 128) { - RecipW = 1.0f / 128.0f; - } else { - float width = (float) TextureHandle->w; - RecipW = 1.0f / width; - } - - if (TextureHandle->h == 128) { - RecipH = 1.0f / 128.0f; - } else { - float height = (float) TextureHandle->h; - RecipH = 1.0f / height; - } + RecipW = TextureHandle->RecipW / 65536.0f; + RecipH = TextureHandle->RecipH / 65536.0f; CheckTriangleBuffer(RenderPolygon.NumberOfVertices, 0, 0, 0, TextureHandle, TRANSLUCENCY_NORMAL, -1); @@ -757,9 +859,9 @@ void D3D_ZBufferedCloakedPolygon_Output(POLYHEADER *inputPolyPtr, RENDERVERTEX * w = (float)vertices->Z; - s = (((float)vertices->U/65536.0f)+0.5) * RecipW; - t = (((float)vertices->V/65536.0f)+0.5) * RecipH; - + s = TEXCOORD_FIXED(vertices->U, RecipW); + t = TEXCOORD_FIXED(vertices->V, RecipH); + x = ((float)vertices->X*((float)Global_VDB_Ptr->VDB_ProjX+1.0f))/((float)vertices->Z*(float)ScreenDescriptorBlock.SDB_CentreX); y = -((float)vertices->Y*((float)Global_VDB_Ptr->VDB_ProjY+1.0f))/((float)vertices->Z*(float)ScreenDescriptorBlock.SDB_CentreY); @@ -778,7 +880,12 @@ void D3D_ZBufferedCloakedPolygon_Output(POLYHEADER *inputPolyPtr, RENDERVERTEX * varrp->c[1] = vertices->G; varrp->c[2] = vertices->B; varrp->c[3] = vertices->A; - + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + varrp++; varrc++; } @@ -811,19 +918,8 @@ void D3D_Decal_Output(DECAL *decalPtr, RENDERVERTEX *renderVerticesPtr) TextureHandle = ImageHeaderArray[texoffset].D3DTexture; - if (TextureHandle->w == 256) { - RecipW = 1.0 / 256.0; - } else { - float width = (float) TextureHandle->w; - RecipW = 1.0 / width; - } - - if (TextureHandle->h == 256) { - RecipH = 1.0 / 256.0; - } else { - float height = (float) TextureHandle->h; - RecipH = 1.0 / height; - } + RecipW = TextureHandle->RecipW / 65536.0f; + RecipH = TextureHandle->RecipH / 65536.0f; } if (decalDescPtr->IsLit) { @@ -861,8 +957,8 @@ void D3D_Decal_Output(DECAL *decalPtr, RENDERVERTEX *renderVerticesPtr) x = ((float)vertices->X*((float)Global_VDB_Ptr->VDB_ProjX+1.0f))/((float)vertices->Z*(float)ScreenDescriptorBlock.SDB_CentreX); y = -((float)vertices->Y*((float)Global_VDB_Ptr->VDB_ProjY+1.0f))/((float)vertices->Z*(float)ScreenDescriptorBlock.SDB_CentreY); - s = ((float)(vertices->U/65536.0f)+0.5f) * RecipW; - t = ((float)(vertices->V/65536.0f)+0.5f) * RecipH; + s = TEXCOORD_FIXED(vertices->U, RecipW); + t = TEXCOORD_FIXED(vertices->V, RecipH); zvalue = vertices->Z+HeadUpDisplayZOffset; z = 1.0f - 2.0f*ZNear/zvalue; @@ -879,7 +975,12 @@ void D3D_Decal_Output(DECAL *decalPtr, RENDERVERTEX *renderVerticesPtr) varrp->c[1] = g; varrp->c[2] = b; varrp->c[3] = a; - + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + varrp++; varrc++; } @@ -901,21 +1002,8 @@ void D3D_Particle_Output(PARTICLE *particlePtr, RENDERVERTEX *renderVerticesPtr) TextureHandle = ImageHeaderArray[texoffset].D3DTexture; - if (TextureHandle->w == 256) { - RecipW = 1.0 / 256.0; - } else { - float width = (float) TextureHandle->w; - - RecipW = (1.0 / width); - } - - if (TextureHandle->h == 256) { - RecipH = 1.0 / 256.0; - } else { - float height = (float) TextureHandle->h; - - RecipH = (1.0 / height); - } + RecipW = TextureHandle->RecipW / 65536.0f; + RecipH = TextureHandle->RecipH / 65536.0f; if (particleDescPtr->IsLit && !(particlePtr->ParticleID==PARTICLE_ALIEN_BLOOD && CurrentVisionMode==VISION_MODE_PRED_SEEALIENS) ) { @@ -956,8 +1044,8 @@ void D3D_Particle_Output(PARTICLE *particlePtr, RENDERVERTEX *renderVerticesPtr) GLfloat s, t; GLfloat w = (float)vertices->Z; - s = ((float)(vertices->U>>16)+.5) * RecipW; - t = ((float)(vertices->V>>16)+.5) * RecipH; + s = TEXCOORD_FIXED(vertices->U, RecipW); + t = TEXCOORD_FIXED(vertices->V, RecipH); x = ((float)vertices->X*((float)Global_VDB_Ptr->VDB_ProjX+1.0f))/((float)vertices->Z*(float)ScreenDescriptorBlock.SDB_CentreX); y = -((float)vertices->Y*((float)Global_VDB_Ptr->VDB_ProjY+1.0f))/((float)vertices->Z*(float)ScreenDescriptorBlock.SDB_CentreY); @@ -982,7 +1070,12 @@ void D3D_Particle_Output(PARTICLE *particlePtr, RENDERVERTEX *renderVerticesPtr) varrp->c[1] = g; varrp->c[2] = b; varrp->c[3] = a; - + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + varrp++; varrc++; } @@ -1020,7 +1113,12 @@ void D3D_PredatorThermalVisionPolygon_Output(POLYHEADER *inputPolyPtr, RENDERVER varrp->c[1] = vertices->G; varrp->c[2] = vertices->B; varrp->c[3] = vertices->A; - + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + varrp++; varrc++; } @@ -1064,6 +1162,11 @@ void D3D_ZBufferedGouraudPolygon_Output(POLYHEADER *inputPolyPtr, RENDERVERTEX * else varrp->c[3] = 255; + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + varrp++; varrc++; } @@ -1077,6 +1180,7 @@ void D3D_PlayerOnFireOverlay() float u, v; int r, g, b, a; D3DTexture *TextureHandle; + int i; b = (colour >> 0) & 0xFF; g = (colour >> 8) & 0xFF; @@ -1085,12 +1189,6 @@ void D3D_PlayerOnFireOverlay() TextureHandle = ImageHeaderArray[BurningImageNumber].D3DTexture; - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_GLOWING); - CheckBoundTextureIsCorrect(TextureHandle); - CheckFilteringModeIsCorrect(FILTERING_BILINEAR_ON); - - pglColor4ub(r, g, b, a); - u = (FastRandom()&255)/256.0f; v = (FastRandom()&255)/256.0f; @@ -1111,23 +1209,30 @@ void D3D_PlayerOnFireOverlay() s[3] = u; t[3] = v + 1.0f; - SelectPolygonBeginType(3); /* triangles */ - - pglTexCoord2f(s[0], t[0]); - pglVertex3f(x[0], y[0], -1.0f); - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], -1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], -1.0f); + CheckTriangleBuffer(4, 0, 0, 0, TextureHandle, TRANSLUCENCY_GLOWING, FILTERING_BILINEAR_ON); - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], -1.0f); - pglTexCoord2f(s[2], t[2]); - pglVertex3f(x[2], y[2], -1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], -1.0f); - - pglEnd(); + for (i = 0; i < 4; i++) { + varrp->v[0] = x[i]; + varrp->v[1] = y[i]; + varrp->v[2] = -1.0f; + varrp->v[3] = 1.0f; + + varrp->t[0] = s[i]; + varrp->t[1] = t[i]; + + varrp->c[0] = r; + varrp->c[1] = g; + varrp->c[2] = b; + varrp->c[3] = a; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } } void D3D_PlayerDamagedOverlay(int intensity) @@ -1137,7 +1242,8 @@ void D3D_PlayerDamagedOverlay(int intensity) int colour, baseColour; int r, g, b, a; int i; - + int j; + theta[0] = (CloakingPhase/8)&4095; theta[1] = (800-CloakingPhase/8)&4095; @@ -1155,23 +1261,30 @@ void D3D_PlayerDamagedOverlay(int intensity) baseColour = 0x00ff00; break; } - - CheckBoundTextureIsCorrect(TextureHandle); - CheckFilteringModeIsCorrect(FILTERING_BILINEAR_ON); - - colour = 0xffffff - baseColour + (intensity<<24); - - b = (colour >> 0) & 0xFF; - g = (colour >> 8) & 0xFF; - r = (colour >> 16) & 0xFF; - a = (colour >> 24) & 0xFF; - - pglColor4ub(r, g, b, a); - - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_INVCOLOUR); + for (i = 0; i < 2; i++) { GLfloat x[4], y[4], s[4], t[4]; + if (i == 0) { + CheckTriangleBuffer(4, 0, 0, 0, TextureHandle, TRANSLUCENCY_INVCOLOUR, FILTERING_BILINEAR_ON); + + colour = 0xffffff - baseColour + (intensity<<24); + + b = (colour >> 0) & 0xFF; + g = (colour >> 8) & 0xFF; + r = (colour >> 16) & 0xFF; + a = (colour >> 24) & 0xFF; + } else { + CheckTriangleBuffer(4, 0, 0, 0, TextureHandle, TRANSLUCENCY_GLOWING, FILTERING_BILINEAR_ON); + + colour = baseColour + (intensity<<24); + + b = (colour >> 0) & 0xFF; + g = (colour >> 8) & 0xFF; + r = (colour >> 16) & 0xFF; + a = (colour >> 24) & 0xFF; + } + float sin = (GetSin(theta[i]))/65536.0f/16.0f; float cos = (GetCos(theta[i]))/65536.0f/16.0f; @@ -1191,35 +1304,29 @@ void D3D_PlayerDamagedOverlay(int intensity) y[3] = 1.0f; s[3] = 0.875f + (cos*(-1) - sin*(+1)); t[3] = 0.375f + (sin*(-1) + cos*(+1)); - - SelectPolygonBeginType(3); /* triangles */ - - pglTexCoord2f(s[0], t[0]); - pglVertex3f(x[0], y[0], -1.0f); - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], -1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], -1.0f); - - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], -1.0f); - pglTexCoord2f(s[2], t[2]); - pglVertex3f(x[2], y[2], -1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], -1.0f); - - pglEnd(); - - colour = baseColour + (intensity<<24); - - b = (colour >> 0) & 0xFF; - g = (colour >> 8) & 0xFF; - r = (colour >> 16) & 0xFF; - a = (colour >> 24) & 0xFF; - - pglColor4ub(r, g, b, a); - - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_GLOWING); + + for (j = 0; j < 4; j++) { + varrp->v[0] = x[j]; + varrp->v[1] = y[j]; + varrp->v[2] = -1.0f; + varrp->v[3] = 1.0f; + + varrp->t[0] = s[j]; + varrp->t[1] = t[j]; + + varrp->c[0] = r; + varrp->c[1] = g; + varrp->c[2] = b; + varrp->c[3] = a; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } } } @@ -1229,23 +1336,19 @@ void DrawNoiseOverlay(int tr) int r, g, b; D3DTexture *tex; int size; - + int j; + r = 255; g = 255; b = 255; - + size = 256; - + tex = ImageHeaderArray[StaticImageNumber].D3DTexture; - - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_GLOWING); - CheckBoundTextureIsCorrect(tex); - CheckFilteringModeIsCorrect(FILTERING_BILINEAR_ON); - pglDepthFunc(GL_ALWAYS); - + u = FastRandom()&255; v = FastRandom()&255; - + x[0] = -1.0f; y[0] = -1.0f; s[0] = u / 256.0f; @@ -1262,26 +1365,36 @@ void DrawNoiseOverlay(int tr) y[3] = 1.0f; s[3] = u / 256.0f; t[3] = (v + size) / 256.0f; - - SelectPolygonBeginType(3); /* triangles */ - pglColor4ub(r, g, b, tr); - - pglTexCoord2f(s[0], t[0]); - pglVertex3f(x[0], y[0], 1.0f); - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], 1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], 1.0f); - - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], 1.0f); - pglTexCoord2f(s[2], t[2]); - pglVertex3f(x[2], y[2], 1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], 1.0f); - - pglEnd(); - + + // changing the depth func manually, so flush now + FlushTriangleBuffers(0); + CheckTriangleBuffer(4, 0, 0, 0, tex, TRANSLUCENCY_GLOWING, FILTERING_BILINEAR_ON); + + for (j = 0; j < 4; j++) { + varrp->v[0] = x[j]; + varrp->v[1] = y[j]; + varrp->v[2] = 1.0f; + varrp->v[3] = 1.0f; + + varrp->t[0] = s[j]; + varrp->t[1] = t[j]; + + varrp->c[0] = r; + varrp->c[1] = g; + varrp->c[2] = b; + varrp->c[3] = tr; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } + + pglDepthFunc(GL_ALWAYS); + FlushTriangleBuffers(0); pglDepthFunc(GL_LEQUAL); } @@ -1290,21 +1403,22 @@ void D3D_ScreenInversionOverlay() D3DTexture *tex; int theta[2]; int i; - + int j; + theta[0] = (CloakingPhase/8)&4095; theta[1] = (800-CloakingPhase/8)&4095; tex = ImageHeaderArray[SpecialFXImageNumber].D3DTexture; - - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_DARKENINGCOLOUR); - CheckBoundTextureIsCorrect(tex); - CheckFilteringModeIsCorrect(FILTERING_BILINEAR_ON); - pglColor4f(1.0f, 1.0f, 1.0f, 1.0f); - for (i = 0; i < 2; i++) { GLfloat x[4], y[4], s[4], t[4]; + if (i == 0) { + CheckTriangleBuffer(4, 0, 0, 0, tex, TRANSLUCENCY_DARKENINGCOLOUR, FILTERING_BILINEAR_ON); + } else { + CheckTriangleBuffer(4, 0, 0, 0, tex, TRANSLUCENCY_COLOUR, FILTERING_BILINEAR_ON); + } + float sin = (GetSin(theta[i]))/65536.0f/16.0f; float cos = (GetCos(theta[i]))/65536.0f/16.0f; @@ -1325,47 +1439,82 @@ void D3D_ScreenInversionOverlay() s[3] = 0.375f + (cos*(-1) - sin*(+1)); t[3] = 0.375f + (sin*(-1) + cos*(+1)); - SelectPolygonBeginType(3); /* triangles */ - - pglTexCoord2f(s[0], t[0]); - pglVertex3f(x[0], y[0], -1.0f); - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], -1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], -1.0f); - - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], -1.0f); - pglTexCoord2f(s[2], t[2]); - pglVertex3f(x[2], y[2], -1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], -1.0f); - - pglEnd(); - - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_COLOUR); + for (j = 0; j < 4; j++) { + varrp->v[0] = x[j]; + varrp->v[1] = y[j]; + varrp->v[2] = -1.0f; + varrp->v[3] = 1.0f; + + varrp->t[0] = s[j]; + varrp->t[1] = t[j]; + + varrp->c[0] = 255; + varrp->c[1] = 255; + varrp->c[2] = 255; + varrp->c[3] = 255; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } } } void D3D_PredatorScreenInversionOverlay() { - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_DARKENINGCOLOUR); - CheckBoundTextureIsCorrect(NULL); - pglDepthFunc(GL_ALWAYS); - - SelectPolygonBeginType(3); /* triangles */ - pglColor4f(1.0f, 1.0f, 1.0f, 1.0f); - - pglVertex3f(-1.0f, -1.0f, 1.0f); - pglVertex3f( 1.0f, -1.0f, 1.0f); - pglVertex3f(-1.0f, 1.0f, 1.0f); - - pglVertex3f( 1.0f, -1.0f, 1.0f); - pglVertex3f( 1.0f, 1.0f, 1.0f); - pglVertex3f(-1.0f, 1.0f, 1.0f); - - pglEnd(); + int j; + + // changing the depth func manually, so flush now + FlushTriangleBuffers(0); + CheckTriangleBuffer(4, 0, 0, 0, NULL, TRANSLUCENCY_DARKENINGCOLOUR, -1); + for (j = 0; j < 4; j++) { + + switch (j) { + case 0: + varrp->v[0] = -1.0f; + varrp->v[1] = -1.0f; + break; + case 1: + varrp->v[0] = 1.0f; + varrp->v[1] = -1.0f; + break; + case 2: + varrp->v[0] = 1.0f; + varrp->v[1] = 1.0f; + break; + case 3: + varrp->v[0] = -1.0f; + varrp->v[1] = 1.0f; + break; + } + + varrp->v[2] = 1.0f; + varrp->v[3] = 1.0f; + + varrp->t[0] = 0.0f; + varrp->t[1] = 0.0f; + + varrp->c[0] = 255; + varrp->c[1] = 255; + varrp->c[2] = 255; + varrp->c[3] = 255; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } + + pglDepthFunc(GL_ALWAYS); + FlushTriangleBuffers(0); pglDepthFunc(GL_LEQUAL); } @@ -1376,21 +1525,15 @@ void DrawScanlinesOverlay(float level) float v, size; int c; int a; + int j; tex = ImageHeaderArray[PredatorNumbersImageNumber].D3DTexture; - - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_NORMAL); - CheckBoundTextureIsCorrect(tex); - CheckFilteringModeIsCorrect(FILTERING_BILINEAR_ON); - pglDepthFunc(GL_ALWAYS); - + c = 255; a = 64.0f+level*64.0f; v = 128.0f; size = 128.0f*(1.0f-level*0.8f); - - pglColor4ub(c, c, c, a); x[0] = -1.0f; y[0] = -1.0f; @@ -1409,23 +1552,35 @@ void DrawScanlinesOverlay(float level) s[3] = (v + size) / 256.0f; t[3] = 1.0f; - SelectPolygonBeginType(3); /* triangles */ + // changing the depth func manually, so flush now + FlushTriangleBuffers(0); + CheckTriangleBuffer(4, 0, 0, 0, tex, TRANSLUCENCY_NORMAL, FILTERING_BILINEAR_ON); + + for (j = 0; j < 4; j++) { + varrp->v[0] = x[j]; + varrp->v[1] = y[j]; + varrp->v[2] = 1.0f; + varrp->v[3] = 1.0f; - pglTexCoord2f(s[0], t[0]); - pglVertex3f(x[0], y[0], 1.0f); - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], 1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], 1.0f); - - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], 1.0f); - pglTexCoord2f(s[2], t[2]); - pglVertex3f(x[2], y[2], 1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], 1.0f); - - pglEnd(); + varrp->t[0] = s[j]; + varrp->t[1] = t[j]; + + varrp->c[0] = c; + varrp->c[1] = c; + varrp->c[2] = c; + varrp->c[3] = a; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } + + pglDepthFunc(GL_ALWAYS); + FlushTriangleBuffers(0); pglDepthFunc(GL_LEQUAL); } @@ -1433,21 +1588,19 @@ void D3D_FadeDownScreen(int brightness, int colour) { int t, r, g, b, a; GLfloat x[4], y[4]; - + int i; + t = 255 - (brightness>>8); if (t<0) t = 0; colour = (t<<24)+colour; - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_NORMAL); - CheckBoundTextureIsCorrect(NULL); + CheckTriangleBuffer(4, 0, 0, 0, NULL, TRANSLUCENCY_NORMAL, -1); b = (colour >> 0) & 0xFF; g = (colour >> 8) & 0xFF; r = (colour >> 16) & 0xFF; a = (colour >> 24) & 0xFF; - - pglColor4ub(r, g, b, a); - + x[0] = -1.0f; y[0] = -1.0f; x[1] = 1.0f; @@ -1456,18 +1609,29 @@ void D3D_FadeDownScreen(int brightness, int colour) y[2] = 1.0f; x[3] = -1.0f; y[3] = 1.0f; - - SelectPolygonBeginType(3); /* triangles */ - - pglVertex3f(x[0], y[0], -1.0f); - pglVertex3f(x[1], y[1], -1.0f); - pglVertex3f(x[3], y[3], -1.0f); - - pglVertex3f(x[1], y[1], -1.0f); - pglVertex3f(x[2], y[2], -1.0f); - pglVertex3f(x[3], y[3], -1.0f); - - pglEnd(); + + for (i = 0; i < 4; i++) { + varrp->v[0] = x[i]; + varrp->v[1] = y[i]; + varrp->v[2] = -1.0f; + varrp->v[3] = 1.0f; + + varrp->t[0] = 0.0f; + varrp->t[1] = 0.0f; + + varrp->c[0] = r; + varrp->c[1] = g; + varrp->c[2] = b; + varrp->c[3] = a; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } } void D3D_HUD_Setup() @@ -1484,62 +1648,51 @@ void D3D_HUDQuad_Output(int imageNumber, struct VertexTag *quadVerticesPtr, unsi float RecipW, RecipH; int i; D3DTexture *tex = ImageHeaderArray[imageNumber].D3DTexture; - GLfloat x[4], y[4], s[4], t[4]; + GLfloat x, y, s, t; int r, g, b, a; /* possibly use polygon offset? (predator hud) */ - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_GLOWING); - CheckBoundTextureIsCorrect(tex); - - if (tex->w == 128) { - RecipW = 1.0f / 128.0f; - } else { - float width = (float) tex->w; - RecipW = 1.0f / width; - } + CheckTriangleBuffer(4, 0, 0, 0, tex, TRANSLUCENCY_GLOWING, -1); - if (tex->h == 128) { - RecipH = 1.0f / 128.0f; - } else { - float height = (float) tex->h; - RecipH = 1.0f / height; - } + RecipW = tex->RecipW / 65536.0f; + RecipH = tex->RecipH / 65536.0f; b = (colour >> 0) & 0xFF; g = (colour >> 8) & 0xFF; r = (colour >> 16) & 0xFF; a = (colour >> 24) & 0xFF; - - pglColor4ub(r, g, b, a); - + for (i = 0; i < 4; i++) { - x[i] = quadVerticesPtr[i].X; - x[i] = (x[i] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; - y[i] = quadVerticesPtr[i].Y; - y[i] = -(y[i] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; + x = quadVerticesPtr[i].X; + x = (x - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; + y = quadVerticesPtr[i].Y; + y = -(y - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; + + s = TEXCOORD_FIXED(quadVerticesPtr[i].U<<16, RecipW); + t = TEXCOORD_FIXED(quadVerticesPtr[i].V<<16, RecipH); + + varrp->v[0] = x; + varrp->v[1] = y; + varrp->v[2] = -1.0f; + varrp->v[3] = 1.0f; - s[i] = ((float)quadVerticesPtr[i].U)*RecipW; - t[i] = ((float)quadVerticesPtr[i].V)*RecipH; + varrp->t[0] = s; + varrp->t[1] = t; + + varrp->c[0] = r; + varrp->c[1] = g; + varrp->c[2] = b; + varrp->c[3] = a; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; } - - SelectPolygonBeginType(3); /* triangles */ - - pglTexCoord2f(s[0], t[0]); - pglVertex3f(x[0], y[0], -1.0f); - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], -1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], -1.0f); - - pglTexCoord2f(s[1], t[1]); - pglVertex3f(x[1], y[1], -1.0f); - pglTexCoord2f(s[2], t[2]); - pglVertex3f(x[2], y[2], -1.0f); - pglTexCoord2f(s[3], t[3]); - pglVertex3f(x[3], y[3], -1.0f); - - pglEnd(); } void D3D_RenderHUDNumber_Centred(unsigned int number,int x,int y,int colour) @@ -2328,60 +2481,99 @@ void D3D_DrawRectangle(int x, int y, int w, int h, int alpha) void D3D_DrawColourBar(int yTop, int yBottom, int rScale, int gScale, int bScale) { extern unsigned char GammaValues[256]; - GLfloat x[4], y[4]; + GLfloat x[2], y[2]; int i; - - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_OFF); - CheckBoundTextureIsCorrect(NULL); - - SelectPolygonBeginType(3); /* triangles */ - - for (i = 0; i < 255; ) { + int r; + int g; + int b; + int a; + int start; + + CheckTriangleBuffer(256*2, 0, 255*2, 0, NULL, TRANSLUCENCY_OFF, -1); + + start = varrc; + + for (i = 0; i < 256; i++) { unsigned int c; c = GammaValues[i]; - pglColor4ub(MUL_FIXED(c,rScale), MUL_FIXED(c,gScale), MUL_FIXED(c,bScale), 255); - + r = MUL_FIXED(c,rScale); + g = MUL_FIXED(c,gScale); + b = MUL_FIXED(c,bScale); + a = 255; + x[0] = (Global_VDB_Ptr->VDB_ClipRight*i)/255; x[0] = (x[0] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; y[0] = yTop; y[0] = -(y[0] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; - x[1] = (Global_VDB_Ptr->VDB_ClipRight*i)/255; - x[1] = (x[1] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; + x[1] = x[0]; y[1] = yBottom; y[1] = -(y[1] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; + + varrp->v[0] = x[0]; + varrp->v[1] = y[0]; + varrp->v[2] = -1.0f; + varrp->v[3] = 1.0f; - i++; - c = GammaValues[i]; - pglColor4ub(MUL_FIXED(c,rScale), MUL_FIXED(c,gScale), MUL_FIXED(c,bScale), 255); - x[2] = (Global_VDB_Ptr->VDB_ClipRight*i)/255; - x[2] = (x[2] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; - y[2] = yBottom; - y[2] = -(y[2] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; + varrp->t[0] = 0.0f; + varrp->t[1] = 0.0f; - x[3] = (Global_VDB_Ptr->VDB_ClipRight*i)/255; - x[3] = (x[3] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; - y[3] = yTop; - y[3] = -(y[3] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; + varrp->c[0] = r; + varrp->c[1] = g; + varrp->c[2] = b; + varrp->c[3] = a; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + varrp->v[0] = x[1]; + varrp->v[1] = y[1]; + varrp->v[2] = -1.0f; + varrp->v[3] = 1.0f; - pglVertex3f(x[0], y[0], -1.0f); - pglVertex3f(x[1], y[1], -1.0f); - pglVertex3f(x[3], y[3], -1.0f); - - pglVertex3f(x[1], y[1], -1.0f); - pglVertex3f(x[2], y[2], -1.0f); - pglVertex3f(x[3], y[3], -1.0f); + varrp->t[0] = 0.0f; + varrp->t[1] = 0.0f; + + varrp->c[0] = r; + varrp->c[1] = g; + varrp->c[2] = b; + varrp->c[3] = a; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } + + for (i = 0; i < 255; i++) { + tarrp->a = start+(i+0)*2+0; + tarrp->b = start+(i+0)*2+1; + tarrp->c = start+(i+1)*2+0; + tarrp++; + tarrc++; + tarrp->a = start+(i+0)*2+1; + tarrp->b = start+(i+1)*2+1; + tarrp->c = start+(i+1)*2+0; + tarrp++; + tarrc++; } - - pglEnd(); } void ColourFillBackBuffer(int FillColour) { float r, g, b, a; - + + FlushTriangleBuffers(1); + b = ((FillColour >> 0) & 0xFF) / 255.0f; g = ((FillColour >> 8) & 0xFF) / 255.0f; r = ((FillColour >> 16) & 0xFF) / 255.0f; @@ -2396,20 +2588,18 @@ void ColourFillBackBufferQuad(int FillColour, int x0, int y0, int x1, int y1) { GLfloat x[4], y[4]; int r, g, b, a; + int i; if (y1 <= y0) return; - CheckTranslucencyModeIsCorrect(TRANSLUCENCY_OFF); - CheckBoundTextureIsCorrect(NULL); + CheckTriangleBuffer(4, 0, 0, 0, NULL, TRANSLUCENCY_OFF, -1); b = ((FillColour >> 0) & 0xFF); g = ((FillColour >> 8) & 0xFF); r = ((FillColour >> 16) & 0xFF); a = ((FillColour >> 24) & 0xFF); - pglColor4ub(r, g, b, 255); - x[0] = x0; x[0] = (x[0] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; y[0] = y0; @@ -2430,17 +2620,28 @@ void ColourFillBackBufferQuad(int FillColour, int x0, int y0, int x1, int y1) y[3] = y1 - 1; y[3] = -(y[3] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; - SelectPolygonBeginType(3); /* triangles */ - - pglVertex3f(x[0], y[0], -1.0f); - pglVertex3f(x[1], y[1], -1.0f); - pglVertex3f(x[3], y[3], -1.0f); - - pglVertex3f(x[1], y[1], -1.0f); - pglVertex3f(x[2], y[2], -1.0f); - pglVertex3f(x[3], y[3], -1.0f); - - pglEnd(); + for (i = 0; i < 4; i++) { + varrp->v[0] = x[i]; + varrp->v[1] = y[i]; + varrp->v[2] = -1.0f; + varrp->v[3] = 1.0f; + + varrp->t[0] = 0.0f; + varrp->t[1] = 0.0f; + + varrp->c[0] = r; + varrp->c[1] = g; + varrp->c[2] = b; + varrp->c[3] = a; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } } void D3D_DrawBackdrop() @@ -2502,39 +2703,68 @@ void D3D_DrawBackdrop() void BltImage(RECT *dest, DDSurface *image, RECT *src) { - int width1, width; - int height1, height; + float x[4]; + float y[4]; + float s[4]; + float t[4]; + int i; - width = dest->right - dest->left + 1; - width1 = src->right - src->left + 1; - height = dest->bottom - dest->top + 1; - height1 = src->bottom - src->top + 1; - - pglPushAttrib(GL_COLOR_BUFFER_BIT | GL_PIXEL_MODE_BIT | GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT); - pglPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); - - pglDisable(GL_BLEND); - pglDisable(GL_DEPTH_TEST); - pglDisable(GL_TEXTURE_2D); - pglDisable(GL_ALPHA_TEST); - - pglPixelStorei(GL_UNPACK_ALIGNMENT, 1); - pglPixelStorei(GL_UNPACK_ROW_LENGTH, image->w); - pglPixelZoom((double)width/(double)width1, (double)height/(double)height1); - - pglMatrixMode(GL_PROJECTION); - pglPushMatrix(); - pglLoadIdentity(); - - pglOrtho(0.0, ScreenDescriptorBlock.SDB_Width, 0.0, ScreenDescriptorBlock.SDB_Height, -1.0, 1.0); - pglRasterPos2i(dest->left, ScreenDescriptorBlock.SDB_Height-dest->bottom); - - pglDrawPixels(width1, height1, GL_RGBA, GL_UNSIGNED_BYTE, image->buf); - - pglPopMatrix(); - - pglPopClientAttrib(); - pglPopAttrib();; + x[0] = dest->left; + x[0] = (x[0] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; + y[0] = dest->top; + y[0] = -(y[0] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; + + x[1] = dest->right; + x[1] = (x[1] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; + y[1] = dest->top; + y[1] = -(y[1] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; + + x[2] = dest->right; + x[2] = (x[2] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; + y[2] = dest->bottom; + y[2] = -(y[2] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; + + x[3] = dest->left; + x[3] = (x[3] - ScreenDescriptorBlock.SDB_CentreX)/ScreenDescriptorBlock.SDB_CentreX; + y[3] = dest->bottom; + y[3] = -(y[3] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY; + + s[0] = src->left * image->RecipW; + t[0] = src->top * image->RecipH; + + s[1] = src->right * image->RecipW; + t[1] = src->top * image->RecipH; + + s[2] = src->right * image->RecipW; + t[2] = src->bottom * image->RecipH; + + s[3] = src->left * image->RecipW; + t[3] = src->bottom * image->RecipH; + + CheckTriangleBuffer(4, 0, 0, 0, image, TRANSLUCENCY_OFF, -1); + + for (i = 0; i < 4; i++) { + varrp->v[0] = x[i]; + varrp->v[1] = y[i]; + varrp->v[2] = -1.0f; + varrp->v[3] = 1.0f; + + varrp->t[0] = s[i]; + varrp->t[1] = t[i]; + + varrp->c[0] = 255; + varrp->c[1] = 255; + varrp->c[2] = 255; + varrp->c[3] = 255; + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + + varrp++; + varrc++; + } } /* ** */ @@ -2620,7 +2850,7 @@ void D3D_DrawParticle_Rain(PARTICLE *particlePtr,VECTORCH *prevPositionPtr) varrp->v[1] = yf*w; varrp->v[2] = zf*w; varrp->v[3] = w; - + if (i == 0) { varrp->c[0] = 0; varrp->c[1] = 255; @@ -2632,6 +2862,12 @@ void D3D_DrawParticle_Rain(PARTICLE *particlePtr,VECTORCH *prevPositionPtr) varrp->c[2] = 255; varrp->c[3] = 32; } + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + varrp++; varrc++; } @@ -4512,6 +4748,11 @@ void D3D_DrawMoltenMetalMesh_Unclipped(void) varrp->c[2] = b; varrp->c[3] = a; + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + varrp++; varrc++; @@ -4620,7 +4861,12 @@ void D3D_DrawMoltenMetalMesh_Clipped(void) varrp->c[1] = g; varrp->c[2] = b; varrp->c[3] = a; - + + varrp->s[0] = 0; + varrp->s[1] = 0; + varrp->s[2] = 0; + varrp->s[3] = 0; + varrp++; varrc++; |
