summaryrefslogtreecommitdiff
path: root/src/opengl.c
diff options
context:
space:
mode:
authorSteven Fuller <relnev@icculus.org>2001-10-14 18:21:53 +0000
committerPatryk Obara <dreamer.tan@gmail.com>2019-08-20 02:22:36 +0200
commit0b37ed3309814c143fa0bc1046b9de7fc5878a04 (patch)
tree1f98bfe0084cb969f802880442b86a967231158a /src/opengl.c
parentb7e1c7cb2f95c7348ebc69ddea7f43ebe62c202c (diff)
Most of the menu code now builds.
Diffstat (limited to 'src/opengl.c')
-rw-r--r--src/opengl.c577
1 files changed, 577 insertions, 0 deletions
diff --git a/src/opengl.c b/src/opengl.c
index 97dc36f..1448184 100644
--- a/src/opengl.c
+++ b/src/opengl.c
@@ -1782,6 +1782,571 @@ if (stringPtr == NULL) return;
}
}
+int Hardware_RenderSmallMenuText(char *textPtr, int x, int y, int alpha, enum AVPMENUFORMAT_ID format)
+{
+ switch(format)
+ {
+ default:
+ fprintf(stderr, "Hardware_RenderSmallMenuText: UNKNOWN TEXT FORMAT\n");
+ exit(EXIT_FAILURE);
+// GLOBALASSERT("UNKNOWN TEXT FORMAT"==0);
+ case AVPMENUFORMAT_LEFTJUSTIFIED:
+ {
+ // supplied x is correct
+ break;
+ }
+ case AVPMENUFORMAT_RIGHTJUSTIFIED:
+ {
+ int length = 0;
+ signed char *ptr = textPtr;
+
+ while(*ptr)
+ {
+ length+=AAFontWidths[*ptr++];
+ }
+
+ x -= length;
+ break;
+ }
+ case AVPMENUFORMAT_CENTREJUSTIFIED:
+ {
+ int length = 0;
+ signed char *ptr = textPtr;
+
+ while(*ptr)
+ {
+ length+=AAFontWidths[*ptr++];
+ }
+
+ x -= length/2;
+ break;
+ }
+ }
+
+// LOCALASSERT(x>0);
+
+ {
+ unsigned int colour = alpha>>8;
+ if (colour>255) colour = 255;
+ colour = (colour<<24)+0xffffff;
+ D3D_RenderHUDString(textPtr,x,y,colour);
+ }
+ return x;
+}
+
+int Hardware_RenderSmallMenuText_Coloured(char *textPtr, int x, int y, int alpha, enum AVPMENUFORMAT_ID format, int red, int green, int blue)
+{
+ switch(format)
+ {
+ default:
+// GLOBALASSERT("UNKNOWN TEXT FORMAT"==0);
+ fprintf(stderr, "Hardware_RenderSmallMenuText_Coloured: UNKNOWN TEXT FORMAT\n");
+ exit(EXIT_FAILURE);
+ case AVPMENUFORMAT_LEFTJUSTIFIED:
+ {
+ // supplied x is correct
+ break;
+ }
+ case AVPMENUFORMAT_RIGHTJUSTIFIED:
+ {
+ int length = 0;
+ signed char *ptr = textPtr;
+
+ while(*ptr)
+ {
+ length+=AAFontWidths[*ptr++];
+ }
+
+ x -= length;
+ break;
+ }
+ case AVPMENUFORMAT_CENTREJUSTIFIED:
+ {
+ int length = 0;
+ signed char *ptr = textPtr;
+
+ while(*ptr)
+ {
+ length+=AAFontWidths[*ptr++];
+ }
+
+ x -= length/2;
+ break;
+ }
+ }
+
+// LOCALASSERT(x>0);
+
+ {
+ unsigned int colour = alpha>>8;
+ if (colour>255) colour = 255;
+ colour = (colour<<24);
+ colour += MUL_FIXED(red,255)<<16;
+ colour += MUL_FIXED(green,255)<<8;
+ colour += MUL_FIXED(blue,255);
+ D3D_RenderHUDString(textPtr,x,y,colour);
+ }
+ return x;
+}
+
+void Hardware_RenderKeyConfigRectangle(int alpha)
+{
+ extern void D3D_DrawRectangle(int x, int y, int w, int h, int alpha);
+ D3D_DrawRectangle(10,ScreenDescriptorBlock.SDB_Height/2+25-115,ScreenDescriptorBlock.SDB_Width-20,250,alpha);
+}
+
+void Hardware_RenderHighlightRectangle(int x1,int y1,int x2,int y2,int r, int g, int b)
+{
+ D3D_Rectangle(x1, y1, x2, y2, r, g, b, 255);
+}
+
+void D3D_DrawSliderBar(int x, int y, int alpha)
+{
+ struct VertexTag quadVertices[4];
+ int sliderHeight = 11;
+ unsigned int colour = alpha>>8;
+
+ if (colour>255) colour = 255;
+ colour = (colour<<24)+0xffffff;
+
+ quadVertices[0].Y = y;
+ quadVertices[1].Y = y;
+ quadVertices[2].Y = y + sliderHeight;
+ quadVertices[3].Y = y + sliderHeight;
+
+ CheckFilteringModeIsCorrect(FILTERING_BILINEAR_OFF);
+ {
+ int topLeftU = 1;
+ int topLeftV = 68;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU + 2;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU + 2;
+ quadVertices[2].V = topLeftV + sliderHeight;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + sliderHeight;
+
+ quadVertices[0].X = x;
+ quadVertices[3].X = x;
+ quadVertices[1].X = x + 2;
+ quadVertices[2].X = x + 2;
+
+ D3D_HUDQuad_Output
+ (
+ HUDFontsImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+ {
+ int topLeftU = 7;
+ int topLeftV = 68;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU + 2;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU + 2;
+ quadVertices[2].V = topLeftV + sliderHeight;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + sliderHeight;
+
+ quadVertices[0].X = x+213+2;
+ quadVertices[3].X = x+213+2;
+ quadVertices[1].X = x+2 +213+2;
+ quadVertices[2].X = x+2 +213+2;
+
+ D3D_HUDQuad_Output
+ (
+ HUDFontsImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+ quadVertices[2].Y = y + 2;
+ quadVertices[3].Y = y + 2;
+
+ {
+ int topLeftU = 5;
+ int topLeftV = 77;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU;
+ quadVertices[2].V = topLeftV + 2;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + 2;
+
+ quadVertices[0].X = x + 2;
+ quadVertices[3].X = x + 2;
+ quadVertices[1].X = x + 215;
+ quadVertices[2].X = x + 215;
+
+ D3D_HUDQuad_Output
+ (
+ HUDFontsImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+ quadVertices[0].Y = y + 9;
+ quadVertices[1].Y = y + 9;
+ quadVertices[2].Y = y + 11;
+ quadVertices[3].Y = y + 11;
+
+ {
+ int topLeftU = 5;
+ int topLeftV = 77;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU;
+ quadVertices[2].V = topLeftV + 2;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + 2;
+
+ quadVertices[0].X = x + 2;
+ quadVertices[3].X = x + 2;
+ quadVertices[1].X = x + 215;
+ quadVertices[2].X = x + 215;
+
+ D3D_HUDQuad_Output
+ (
+ HUDFontsImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+}
+
+void D3D_DrawSlider(int x, int y, int alpha)
+{
+ struct VertexTag quadVertices[4];
+ int sliderHeight = 5;
+ unsigned int colour = alpha>>8;
+
+ if (colour>255) colour = 255;
+ colour = (colour<<24)+0xffffff;
+
+ quadVertices[0].Y = y;
+ quadVertices[1].Y = y;
+ quadVertices[2].Y = y + sliderHeight;
+ quadVertices[3].Y = y + sliderHeight;
+
+ CheckFilteringModeIsCorrect(FILTERING_BILINEAR_OFF);
+ {
+ int topLeftU = 11;
+ int topLeftV = 74;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU + 9;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU + 9;
+ quadVertices[2].V = topLeftV + sliderHeight;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + sliderHeight;
+
+ quadVertices[0].X = x;
+ quadVertices[3].X = x;
+ quadVertices[1].X = x + 9;
+ quadVertices[2].X = x + 9;
+
+ D3D_HUDQuad_Output
+ (
+ HUDFontsImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+}
+
+void D3D_DrawRectangle(int x, int y, int w, int h, int alpha)
+{
+ struct VertexTag quadVertices[4];
+ unsigned int colour = alpha>>8;
+
+ if (colour>255) colour = 255;
+ colour = (colour<<24)+0xffffff;
+
+ quadVertices[0].Y = y;
+ quadVertices[1].Y = y;
+ quadVertices[2].Y = y + 6;
+ quadVertices[3].Y = y + 6;
+
+ CheckFilteringModeIsCorrect(FILTERING_BILINEAR_OFF);
+ /* top left corner */
+ {
+ int topLeftU = 1;
+ int topLeftV = 238;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU + 6;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU + 6;
+ quadVertices[2].V = topLeftV + 6;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + 6;
+
+ quadVertices[0].X = x;
+ quadVertices[3].X = x;
+ quadVertices[1].X = x + 6;
+ quadVertices[2].X = x + 6;
+
+ D3D_HUDQuad_Output
+ (
+ AAFontImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+ /* top */
+ {
+ int topLeftU = 9;
+ int topLeftV = 238;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU;
+ quadVertices[2].V = topLeftV + 6;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + 6;
+
+ quadVertices[0].X = x+6;
+ quadVertices[3].X = x+6;
+ quadVertices[1].X = x+6 + w-12;
+ quadVertices[2].X = x+6 + w-12;
+
+ D3D_HUDQuad_Output
+ (
+ AAFontImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+ /* top right corner */
+ {
+ int topLeftU = 11;
+ int topLeftV = 238;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU + 6;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU + 6;
+ quadVertices[2].V = topLeftV + 6;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + 6;
+
+ quadVertices[0].X = x + w - 6;
+ quadVertices[3].X = x + w - 6;
+ quadVertices[1].X = x + w;
+ quadVertices[2].X = x + w;
+
+ D3D_HUDQuad_Output
+ (
+ AAFontImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+ quadVertices[0].Y = y + 6;
+ quadVertices[1].Y = y + 6;
+ quadVertices[2].Y = y + h - 6;
+ quadVertices[3].Y = y + h - 6;
+ /* right */
+ {
+ int topLeftU = 1;
+ int topLeftV = 246;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU + 6;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU + 6;
+ quadVertices[2].V = topLeftV;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV;
+
+ D3D_HUDQuad_Output
+ (
+ AAFontImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+ /* left */
+ {
+ int topLeftU = 1;
+ int topLeftV = 246;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU + 6;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU + 6;
+ quadVertices[2].V = topLeftV;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV;
+
+ quadVertices[0].X = x;
+ quadVertices[3].X = x;
+ quadVertices[1].X = x + 6;
+ quadVertices[2].X = x + 6;
+
+ D3D_HUDQuad_Output
+ (
+ AAFontImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+ quadVertices[0].Y = y + h - 6;
+ quadVertices[1].Y = y + h - 6;
+ quadVertices[2].Y = y + h;
+ quadVertices[3].Y = y + h;
+ /* bottom left corner */
+ {
+ int topLeftU = 1;
+ int topLeftV = 248;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU + 6;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU + 6;
+ quadVertices[2].V = topLeftV + 6;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + 6;
+
+ quadVertices[0].X = x;
+ quadVertices[3].X = x;
+ quadVertices[1].X = x + 6;
+ quadVertices[2].X = x + 6;
+
+ D3D_HUDQuad_Output
+ (
+ AAFontImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+ /* bottom */
+ {
+ int topLeftU = 9;
+ int topLeftV = 238;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU;
+ quadVertices[2].V = topLeftV + 6;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + 6;
+
+ quadVertices[0].X = x+6;
+ quadVertices[3].X = x+6;
+ quadVertices[1].X = x+6 + w-12;
+ quadVertices[2].X = x+6 + w-12;
+
+ D3D_HUDQuad_Output
+ (
+ AAFontImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+ /* bottom right corner */
+ {
+ int topLeftU = 11;
+ int topLeftV = 248;
+
+ quadVertices[0].U = topLeftU;
+ quadVertices[0].V = topLeftV;
+ quadVertices[1].U = topLeftU + 6;
+ quadVertices[1].V = topLeftV;
+ quadVertices[2].U = topLeftU + 6;
+ quadVertices[2].V = topLeftV + 6;
+ quadVertices[3].U = topLeftU;
+ quadVertices[3].V = topLeftV + 6;
+
+ quadVertices[0].X = x + w - 6;
+ quadVertices[3].X = x + w - 6;
+ quadVertices[1].X = x + w;
+ quadVertices[2].X = x + w;
+
+ D3D_HUDQuad_Output
+ (
+ AAFontImageNumber,
+ quadVertices,
+ colour
+ );
+ }
+}
+
+void D3D_DrawColourBar(int yTop, int yBottom, int rScale, int gScale, int bScale)
+{
+ extern unsigned char GammaValues[256];
+ GLfloat x[4], y[4];
+ int i;
+
+ CheckTranslucencyModeIsCorrect(TRANSLUCENCY_OFF);
+ CheckBoundTextureIsCorrect(NULL);
+
+ SelectPolygonBeginType(3); /* triangles */
+
+ for (i = 0; i < 255; ) {
+ unsigned int c;
+
+ c = GammaValues[i];
+ glColor4ub(MUL_FIXED(c,rScale), MUL_FIXED(c,gScale), MUL_FIXED(c,bScale), 0);
+
+ 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;
+ y[1] = yBottom;
+ y[1] = -(y[1] - ScreenDescriptorBlock.SDB_CentreY)/ScreenDescriptorBlock.SDB_CentreY;
+
+ i++;
+ c = GammaValues[i];
+ glColor4ub(MUL_FIXED(c,rScale), MUL_FIXED(c,gScale), MUL_FIXED(c,bScale), 0);
+ 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;
+
+ 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;
+
+
+ glVertex3f(x[0], y[0], -1.0f);
+ glVertex3f(x[1], y[1], -1.0f);
+ glVertex3f(x[3], y[3], -1.0f);
+
+ glVertex3f(x[1], y[1], -1.0f);
+ glVertex3f(x[2], y[2], -1.0f);
+ glVertex3f(x[3], y[3], -1.0f);
+ }
+
+ glEnd();
+}
+
void ColourFillBackBuffer(int FillColour)
{
float r, g, b, a;
@@ -1796,6 +2361,18 @@ void ColourFillBackBuffer(int FillColour)
glClear(GL_COLOR_BUFFER_BIT);
}
+void ColourFillBackBufferQuad(int FillColour, int LeftX, int TopY, int RightX, int BotY)
+{
+ int r, g, b, a;
+
+ b = ((FillColour >> 0) & 0xFF);
+ g = ((FillColour >> 8) & 0xFF);
+ r = ((FillColour >> 16) & 0xFF);
+ a = ((FillColour >> 24) & 0xFF);
+
+ D3D_Rectangle(LeftX, TopY, RightX, BotY, r, g, b, a);
+}
+
void D3D_DrawBackdrop()
{
extern int NumActiveBlocks;