diff --git a/Descent3/lnxmain.cpp b/Descent3/lnxmain.cpp
index fa017d1ba..f16d552e6 100644
--- a/Descent3/lnxmain.cpp
+++ b/Descent3/lnxmain.cpp
@@ -113,10 +113,6 @@ static cmdLineArg d3ArgTable[] = {
{"glfog", 'o', "Enable OpenGL fog."},
{"nogamma", 'M', "Disable gamma support."},
{"glinfo", 'I', "Display info about OpenGL library."}
-
-#ifdef __CHECK_FOR_TOO_SLOW_RENDERING__
- {"nofpscheck", 'H', "Disable FPS checking."},
-#endif
};
static volatile char already_tried_signal_cleanup = 0;
diff --git a/lib/renderer.h b/lib/renderer.h
index bfea4ef8b..1643f262a 100644
--- a/lib/renderer.h
+++ b/lib/renderer.h
@@ -631,9 +631,6 @@ void rend_GetRenderState(rendering_state *rstate);
// Draws a simple bitmap at the specified x,y location
void rend_DrawSimpleBitmap(int bm_handle, int x, int y);
-// Changes the resolution of the renderer
-void rend_SetResolution(int width, int height);
-
// Gets OpenGL ready to work in a window
int rend_InitOpenGLWindow(oeApplication *app, renderer_preferred_state *pref_state);
diff --git a/renderer/CMakeLists.txt b/renderer/CMakeLists.txt
index 57a3539a5..eb274f0c6 100644
--- a/renderer/CMakeLists.txt
+++ b/renderer/CMakeLists.txt
@@ -8,6 +8,7 @@ set(CPPS
HardwareGlobalVars.cpp
HardwareInstance.cpp
HardwareOpenGL.cpp
+ HardwareBaseGPU.cpp
HardwarePoints.cpp
HardwareSetup.cpp
HardwareTransforms.cpp
diff --git a/renderer/HardwareBaseGPU.cpp b/renderer/HardwareBaseGPU.cpp
new file mode 100644
index 000000000..f9538727b
--- /dev/null
+++ b/renderer/HardwareBaseGPU.cpp
@@ -0,0 +1,436 @@
+/*
+* Descent 3
+* Copyright (C) 2024 Descent Developers
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see .
+ */
+
+// TODO: This is missing a good way of overriding base behavior (like, you know, method overrides...)
+
+#include "pserror.h"
+#include "mono.h"
+#include "3d.h"
+#include "renderer.h"
+#include "bitmap.h"
+#include "grdefs.h"
+#include
+
+#include "HardwareInternal.h"
+
+// FIXME: Unused
+// The font characteristics
+static float rend_FontRed[4], rend_FontBlue[4], rend_FontGreen[4], rend_FontAlpha[4];
+char Renderer_error_message[256] = "Generic renderer error";
+
+// The following values are referenced by the game code, but only
+// UseMultitexture is actually referenced and used in this code - and
+// even that can probably go away and we just assume there is more than
+// one texture unit (which, since I believe OpenGL 1.2 is a requirement)
+bool UseHardware = true;
+bool NoLightmaps = false;
+bool StateLimited = false;
+bool UseMultitexture = false;
+bool UseWBuffer = false;
+
+// General renderer states
+int gpu_Overlay_map = -1;
+ubyte gpu_Overlay_type = OT_NONE;
+ubyte Renderer_initted = 0;
+
+// Generic GPU data
+rendering_state gpu_state;
+renderer_preferred_state gpu_preferred_state = {0, 1, 1.5};
+
+int gpu_last_frame_polys_drawn = 0;
+int gpu_last_frame_verts_processed = 0;
+int gpu_last_uploaded = 0;
+
+float gpu_Alpha_factor = 1.0f;
+float gpu_Alpha_multiplier = 1.0f;
+
+// returns the alpha that we should use
+float rend_GetAlphaMultiplier() {
+ switch (gpu_state.cur_alpha_type) {
+ case AT_ALWAYS:
+ case AT_TEXTURE:
+ case AT_VERTEX:
+ case AT_TEXTURE_VERTEX:
+ case AT_SATURATE_VERTEX:
+ case AT_SATURATE_TEXTURE_VERTEX:
+ case AT_SPECULAR:
+ return 1.0;
+ case AT_CONSTANT:
+ case AT_CONSTANT_TEXTURE:
+ case AT_CONSTANT_TEXTURE_VERTEX:
+ case AT_CONSTANT_VERTEX:
+ case AT_LIGHTMAP_BLEND:
+ case AT_LIGHTMAP_BLEND_SATURATE:
+ case AT_SATURATE_TEXTURE:
+ case AT_SATURATE_CONSTANT_VERTEX:
+ return gpu_state.cur_alpha / 255.0;
+ default:
+ // Int3(); // no type defined,get jason
+ return 0;
+ }
+}
+
+// Retrieves an error message
+const char *rend_GetErrorMessage() { return Renderer_error_message; }
+
+// Sets an error message
+void rend_SetErrorMessage(const char *str) {
+ ASSERT(strlen(str) < 256);
+ strcpy(Renderer_error_message, str);
+}
+
+// FIXME: Unused
+// Sets the argb characteristics of the font characters. color1 is the upper left and proceeds clockwise
+void rend_SetCharacterParameters(ddgr_color color1, ddgr_color color2, ddgr_color color3, ddgr_color color4) {
+ rend_FontRed[0] = (float)(GR_COLOR_RED(color1) / 255.0f);
+ rend_FontRed[1] = (float)(GR_COLOR_RED(color2) / 255.0f);
+ rend_FontRed[2] = (float)(GR_COLOR_RED(color3) / 255.0f);
+ rend_FontRed[3] = (float)(GR_COLOR_RED(color4) / 255.0f);
+ rend_FontGreen[0] = (float)(GR_COLOR_GREEN(color1) / 255.0f);
+ rend_FontGreen[1] = (float)(GR_COLOR_GREEN(color2) / 255.0f);
+ rend_FontGreen[2] = (float)(GR_COLOR_GREEN(color3) / 255.0f);
+ rend_FontGreen[3] = (float)(GR_COLOR_GREEN(color4) / 255.0f);
+ rend_FontBlue[0] = (float)(GR_COLOR_BLUE(color1) / 255.0f);
+ rend_FontBlue[1] = (float)(GR_COLOR_BLUE(color2) / 255.0f);
+ rend_FontBlue[2] = (float)(GR_COLOR_BLUE(color3) / 255.0f);
+ rend_FontBlue[3] = (float)(GR_COLOR_BLUE(color4) / 255.0f);
+ rend_FontAlpha[0] = (color1 >> 24) / 255.0f;
+ rend_FontAlpha[1] = (color2 >> 24) / 255.0f;
+ rend_FontAlpha[2] = (color3 >> 24) / 255.0f;
+ rend_FontAlpha[3] = (color4 >> 24) / 255.0f;
+}
+
+// Sets where the software renderer should write to
+void rend_SetSoftwareParameters(float aspect, int width, int height, int pitch, ubyte *framebuffer) {}
+
+// Sets the state of bilinear filtering for our textures
+void rend_SetFiltering(sbyte state) {
+ gpu_state.cur_bilinear_state = state;
+}
+
+// Sets the near and far planes for z buffer
+void rend_SetZValues(float nearz, float farz) {
+ gpu_state.cur_near_z = nearz;
+ gpu_state.cur_far_z = farz;
+ // mprintf ((0,"OPENGL:Setting depth range to %f - %f\n",nearz,farz));
+
+ // JEFF: glDepthRange must take parameters [0,1]
+ // It is set in init
+ //@@dglDepthRange (0,farz);
+}
+
+// Sets a bitmap as a overlay map to rendered on top of the next texture map
+// a -1 value indicates no overlay map
+void rend_SetOverlayMap(int handle) { gpu_Overlay_map = handle; }
+
+void rend_SetOverlayType(ubyte type) { gpu_Overlay_type = type; }
+
+
+void rend_FillCircle(ddgr_color col, int x, int y, int rad) {}
+
+void rend_DrawCircle(int x, int y, int rad) {}
+
+// Sets up a font character to draw. We draw our fonts as pieces of textures
+void rend_DrawFontCharacter(int bm_handle, int x1, int y1, int x2, int y2, float u, float v, float w, float h) {
+ g3Point *ptr_pnts[4];
+ g3Point pnts[4];
+ for (int i = 0; i < 4; i++) {
+ pnts[i].p3_z = 1; // Make REALLY close!
+ pnts[i].p3_flags = PF_PROJECTED;
+ ptr_pnts[i] = &pnts[i];
+ }
+ pnts[0].p3_sx = x1;
+ pnts[0].p3_sy = y1;
+ pnts[0].p3_u = u;
+ pnts[0].p3_v = v;
+ pnts[1].p3_sx = x2;
+ pnts[1].p3_sy = y1;
+ pnts[1].p3_u = u + w;
+ pnts[1].p3_v = v;
+ pnts[2].p3_sx = x2;
+ pnts[2].p3_sy = y2;
+ pnts[2].p3_u = u + w;
+ pnts[2].p3_v = v + h;
+ pnts[3].p3_sx = x1;
+ pnts[3].p3_sy = y2;
+ pnts[3].p3_u = u;
+ pnts[3].p3_v = v + h;
+ rend_DrawPolygon2D(bm_handle, ptr_pnts, 4);
+}
+
+// Sets the alpha value for constant alpha
+void rend_SetAlphaValue(ubyte val) {
+ gpu_state.cur_alpha = val;
+ gpu_Alpha_multiplier = rend_GetAlphaMultiplier();
+}
+
+// Sets the texture wrapping type
+void rend_SetWrapType(wrap_type val) { gpu_state.cur_wrap_type = val; }
+
+void rend_SetZBias(float z_bias) {
+ if (Z_bias != z_bias) {
+ Z_bias = z_bias;
+
+ // Force refresh our transforms to take the Zbias into account
+ g3_GetModelViewMatrix(&View_position, &Unscaled_matrix, (float *)gTransformModelView);
+ g3_UpdateFullTransform();
+ g3_ForceTransformRefresh();
+ }
+}
+
+// Sets the overall alpha scale factor (all alpha values are scaled by this value)
+// usefull for motion blur effect
+void rend_SetAlphaFactor(float val) {
+ if (val < 0.0f)
+ val = 0.0f;
+ if (val > 1.0f)
+ val = 1.0f;
+ gpu_Alpha_factor = val;
+}
+
+// Returns the current Alpha factor
+float rend_GetAlphaFactor(void) { return gpu_Alpha_factor; }
+
+// Gets a pointer to a linear frame buffer
+void rend_GetLFBLock(renderer_lfb *lfb) {}
+
+// Releases an lfb lock
+void rend_ReleaseLFBLock(renderer_lfb *lfb) {}
+
+// Returns the aspect ratio of the physical screen
+void rend_GetProjectionParameters(int *width, int *height) {
+ *width = gpu_state.clip_x2 - gpu_state.clip_x1;
+ *height = gpu_state.clip_y2 - gpu_state.clip_y1;
+}
+
+void rend_GetProjectionScreenParameters(int &screenLX, int &screenTY, int &screenW, int &screenH) {
+ screenLX = gpu_state.clip_x1;
+ screenTY = gpu_state.clip_y1;
+ screenW = gpu_state.clip_x2 - gpu_state.clip_x1 + 1;
+ screenH = gpu_state.clip_y2 - gpu_state.clip_y1 + 1;
+}
+
+// Returns the aspect ratio of the physical screen
+float rend_GetAspectRatio(void) {
+ float aspect_ratio = (float)((3.0f * gpu_state.screen_width) / (4.0f * gpu_state.screen_height));
+ return aspect_ratio;
+}
+
+// Given a source x,y and width,height, draws any sized bitmap into the renderer lfb
+void rend_DrawLFBBitmap(int sx, int sy, int w, int h, int dx, int dy, ushort *data, int rowsize) {}
+
+// draws a scaled 2d bitmap to our buffer
+void rend_DrawScaledBitmap(int x1, int y1, int x2, int y2, int bm, float u0, float v0, float u1, float v1, int color,
+ float *alphas) {
+ g3Point *ptr_pnts[4];
+ g3Point pnts[4];
+ float r, g, b;
+ if (color != -1) {
+ r = GR_COLOR_RED(color) / 255.0;
+ g = GR_COLOR_GREEN(color) / 255.0;
+ b = GR_COLOR_BLUE(color) / 255.0;
+ }
+ for (int i = 0; i < 4; i++) {
+ if (color == -1)
+ pnts[i].p3_l = 1.0;
+ else {
+ pnts[i].p3_r = r;
+ pnts[i].p3_g = g;
+ pnts[i].p3_b = b;
+ }
+ if (alphas) {
+ pnts[i].p3_a = alphas[i];
+ }
+
+ pnts[i].p3_z = 1.0f;
+ pnts[i].p3_flags = PF_PROJECTED;
+ }
+
+ pnts[0].p3_sx = x1;
+ pnts[0].p3_sy = y1;
+ pnts[0].p3_u = u0;
+ pnts[0].p3_v = v0;
+ pnts[1].p3_sx = x2;
+ pnts[1].p3_sy = y1;
+ pnts[1].p3_u = u1;
+ pnts[1].p3_v = v0;
+ pnts[2].p3_sx = x2;
+ pnts[2].p3_sy = y2;
+ pnts[2].p3_u = u1;
+ pnts[2].p3_v = v1;
+ pnts[3].p3_sx = x1;
+ pnts[3].p3_sy = y2;
+ pnts[3].p3_u = u0;
+ pnts[3].p3_v = v1;
+ ptr_pnts[0] = &pnts[0];
+ ptr_pnts[1] = &pnts[1];
+ ptr_pnts[2] = &pnts[2];
+ ptr_pnts[3] = &pnts[3];
+ rend_SetTextureType(TT_LINEAR);
+ rend_DrawPolygon2D(bm, ptr_pnts, 4);
+}
+
+// given a chunked bitmap, renders it.
+void rend_DrawChunkedBitmap(chunked_bitmap *chunk, int x, int y, ubyte alpha) {
+ int *bm_array = chunk->bm_array;
+ int w = chunk->w;
+ int h = chunk->h;
+ int piece_w = bm_w(bm_array[0], 0);
+ int piece_h = bm_h(bm_array[0], 0);
+ int screen_w, screen_h;
+ int i, t;
+ rend_SetZBufferState(0);
+ rend_GetProjectionParameters(&screen_w, &screen_h);
+ for (i = 0; i < h; i++) {
+ for (t = 0; t < w; t++) {
+ int dx = x + (piece_w * t);
+ int dy = y + (piece_h * i);
+ int dw, dh;
+ if ((dx + piece_w) > screen_w)
+ dw = piece_w - ((dx + piece_w) - screen_w);
+ else
+ dw = piece_w;
+ if ((dy + piece_h) > screen_h)
+ dh = piece_h - ((dy + piece_h) - screen_h);
+ else
+ dh = piece_h;
+
+ float u2 = (float)dw / (float)piece_w;
+ float v2 = (float)dh / (float)piece_h;
+ rend_DrawSimpleBitmap(bm_array[i * w + t], dx, dy);
+ }
+ }
+ rend_SetZBufferState(1);
+}
+
+// given a chunked bitmap, renders it.scaled
+void rend_DrawScaledChunkedBitmap(chunked_bitmap *chunk, int x, int y, int neww, int newh, ubyte alpha) {
+ int *bm_array = chunk->bm_array;
+ int w = chunk->w;
+ int h = chunk->h;
+ int piece_w;
+ int piece_h;
+ int screen_w, screen_h;
+ int i, t;
+
+ float scalew, scaleh;
+
+ scalew = ((float)neww) / ((float)chunk->pw);
+ scaleh = ((float)newh) / ((float)chunk->ph);
+ piece_w = scalew * ((float)bm_w(bm_array[0], 0));
+ piece_h = scaleh * ((float)bm_h(bm_array[0], 0));
+ rend_GetProjectionParameters(&screen_w, &screen_h);
+ rend_SetOverlayType(OT_NONE);
+ rend_SetLighting(LS_NONE);
+ rend_SetColorModel(CM_MONO);
+ rend_SetZBufferState(0);
+ rend_SetAlphaType(AT_CONSTANT_TEXTURE);
+ rend_SetAlphaValue(alpha);
+ rend_SetWrapType(WT_WRAP);
+ for (i = 0; i < h; i++) {
+ for (t = 0; t < w; t++) {
+ int dx = x + (piece_w * t);
+ int dy = y + (piece_h * i);
+ int dw, dh;
+ if ((dx + piece_w) > screen_w)
+ dw = piece_w - ((dx + piece_w) - screen_w);
+ else
+ dw = piece_w;
+ if ((dy + piece_h) > screen_h)
+ dh = piece_h - ((dy + piece_h) - screen_h);
+ else
+ dh = piece_h;
+
+ float u2 = (float)dw / (float)piece_w;
+ float v2 = (float)dh / (float)piece_h;
+ rend_DrawScaledBitmap(dx, dy, dx + dw, dy + dh, bm_array[i * w + t], 0, 0, u2, v2);
+ }
+ }
+ rend_SetZBufferState(1);
+}
+
+// Sets some global preferences for the renderer
+int rend_SetPreferredState(renderer_preferred_state *pref_state) {
+ int retval = 1;
+ renderer_preferred_state old_state = gpu_preferred_state;
+
+ gpu_preferred_state = *pref_state;
+ if (gpu_state.initted) {
+ int reinit = 0;
+ mprintf((0, "Inside pref state!\n"));
+
+ // Change gamma if needed
+ if (pref_state->width != gpu_state.screen_width || pref_state->height != gpu_state.screen_height ||
+ old_state.bit_depth != pref_state->bit_depth) {
+ reinit = 1;
+ }
+
+ if (reinit) {
+ retval = rend_ReInit();
+ } else {
+ if (old_state.gamma != pref_state->gamma) {
+ rend_SetGammaValue(pref_state->gamma);
+ }
+ }
+ } else {
+ gpu_preferred_state = *pref_state;
+ }
+
+ return retval;
+}
+
+// Draws a simple bitmap at the specified x,y location
+void rend_DrawSimpleBitmap(int bm_handle, int x, int y) {
+ rend_SetAlphaType(AT_CONSTANT_TEXTURE);
+ rend_SetAlphaValue(255);
+ rend_SetLighting(LS_NONE);
+ rend_SetColorModel(CM_MONO);
+ rend_SetOverlayType(OT_NONE);
+ rend_SetFiltering(0);
+ rend_DrawScaledBitmap(x, y, x + bm_w(bm_handle, 0), y + bm_h(bm_handle, 0), bm_handle, 0, 0, 1, 1);
+ rend_SetFiltering(1);
+}
+
+// Fills in the passed in pointer with the current rendering state
+void rend_GetRenderState(rendering_state *rstate) { memcpy(rstate, &gpu_state, sizeof(rendering_state)); }
+
+// Preuploads a texture to the video card
+void rend_PreUploadTextureToCard(int handle, int map_type) {}
+
+// Frees an uploaded texture from the video card
+void rend_FreePreUploadedTexture(int handle, int map_type) {}
+
+// Returns 1 if there is mid video memory, 2 if there is low vid memory, or 0 if there is large vid memory
+int rend_LowVidMem(void) { return 0; }
+
+// Returns 1 if the renderer supports bumpmapping
+int rend_SupportsBumpmapping(void) { return 0; }
+
+// Sets a bumpmap to be rendered, or turns off bumpmapping altogether
+void rend_SetBumpmapReadyState(int state, int map) {}
+
+// returns rendering statistics for the frame
+void rend_GetStatistics(tRendererStats *stats) {
+ if (Renderer_initted) {
+ stats->poly_count = gpu_last_frame_polys_drawn;
+ stats->vert_count = gpu_last_frame_verts_processed;
+ stats->texture_uploads = gpu_last_uploaded;
+ } else {
+ memset(stats, 0, sizeof(tRendererStats));
+ }
+}
diff --git a/renderer/HardwareInternal.h b/renderer/HardwareInternal.h
index 386116795..130d6c003 100644
--- a/renderer/HardwareInternal.h
+++ b/renderer/HardwareInternal.h
@@ -58,4 +58,7 @@ void rend_TransformSetViewport(int lx, int ty, int width, int height);
void rend_TransformSetProjection(float trans[4][4]);
void rend_TransformSetModelView(float trans[4][4]);
+int rend_ReInit();
+float rend_GetAlphaMultiplier();
+
#endif
diff --git a/renderer/HardwareOpenGL.cpp b/renderer/HardwareOpenGL.cpp
index b97d1f6c7..903fe466f 100644
--- a/renderer/HardwareOpenGL.cpp
+++ b/renderer/HardwareOpenGL.cpp
@@ -60,27 +60,14 @@ void rend_SetLightingState(light_state state);
#define CHANGE_RESOLUTION_IN_FULLSCREEN
-// The font characteristics
-static float rend_FontRed[4], rend_FontBlue[4], rend_FontGreen[4], rend_FontAlpha[4];
-char Renderer_error_message[256] = "Generic renderer error";
-// The following values are referenced by the game code, but only
-// UseMultitexture is actually referenced and used in this code - and
-// even that can probably go away and we just assume there is more than
-// one texture unit (which, since I believe OpenGL 1.2 is a requirement)
-bool UseHardware = true;
-bool NoLightmaps = false;
-bool StateLimited = false;
-bool UseMultitexture = false;
-bool UseWBuffer = false;
-
// General renderer states
-int Overlay_map = -1;
+extern int gpu_Overlay_map;
int Bump_map = 0;
int Bumpmap_ready = 0;
-ubyte Overlay_type = OT_NONE;
+extern ubyte gpu_Overlay_type;
float Z_bias = 0.0f;
ubyte Renderer_close_flag = 0;
-ubyte Renderer_initted = 0;
+extern ubyte Renderer_initted;
renderer_type Renderer_type = RENDERER_OPENGL;
int WindowGL = 0;
@@ -135,17 +122,13 @@ static int Cur_texture_object_num = 1;
static int OpenGL_cache_initted = 0;
static int OpenGL_last_bound[2];
static int Last_texel_unit_set = -1;
-static int OpenGL_last_frame_polys_drawn = 0;
-static int OpenGL_last_frame_verts_processed = 0;
-static int OpenGL_last_uploaded = 0;
-static float OpenGL_Alpha_factor = 1.0f;
-#ifndef RELEASE
-// This is for the Microsoft OpenGL reference driver
-// Setting this will turn off bilinear filtering and zbuffer so we can get decent
-// framerates to discern driver problems
-static ubyte Fast_test_render = 0;
-#endif
+extern int gpu_last_frame_polys_drawn;
+extern int gpu_last_frame_verts_processed;
+extern int gpu_last_uploaded;
+
+extern float gpu_Alpha_factor;
+extern float gpu_Alpha_multiplier;
#if defined(_USE_OGL_ACTIVE_TEXTURES)
PFNGLACTIVETEXTUREARBPROC oglActiveTextureARB = NULL;
@@ -166,10 +149,8 @@ ushort *opengl_packed_Upload_data = NULL;
ushort *opengl_packed_Translate_table = NULL;
ushort *opengl_packed_4444_translate_table = NULL;
-rendering_state OpenGL_state;
-static float Alpha_multiplier = 1.0f;
-
-renderer_preferred_state OpenGL_preferred_state = {0, 1, 1.5};
+extern rendering_state gpu_state;
+extern renderer_preferred_state gpu_preferred_state;
// These structs are for drawing with OpenGL vertex arrays
// Useful for fast indexing
@@ -285,17 +266,6 @@ void opengl_GetInformation() {
mprintf((0, "OpenGL Renderer: %s\n", dglGetString(GL_RENDERER)));
mprintf((0, "OpenGL Version: %s\n", dglGetString(GL_VERSION)));
mprintf((0, "OpenGL Extensions: %s\n", dglGetString(GL_EXTENSIONS)));
-
- /*
- #ifndef RELEASE
- // If this is the microsoft driver, then make stuff go faster
- const ubyte *renderer=dglGetString(GL_RENDERER);
- if (!(strnicmp ((const char *)renderer,"GDI",3)))
- Fast_test_render=1;
- else
- Fast_test_render=0;
- #endif
- */
}
int opengl_MakeTextureObject(int tn) {
@@ -374,14 +344,14 @@ int opengl_InitCache(void) {
void opengl_SetDefaults() {
mprintf((0, "Setting states\n"));
- OpenGL_state.cur_color = 0x00FFFFFF;
- OpenGL_state.cur_bilinear_state = -1;
- OpenGL_state.cur_zbuffer_state = -1;
- OpenGL_state.cur_texture_quality = -1;
- OpenGL_state.cur_light_state = LS_GOURAUD;
- OpenGL_state.cur_color_model = CM_MONO;
- OpenGL_state.cur_bilinear_state = -1;
- OpenGL_state.cur_alpha_type = AT_TEXTURE;
+ gpu_state.cur_color = 0x00FFFFFF;
+ gpu_state.cur_bilinear_state = -1;
+ gpu_state.cur_zbuffer_state = -1;
+ gpu_state.cur_texture_quality = -1;
+ gpu_state.cur_light_state = LS_GOURAUD;
+ gpu_state.cur_color_model = CM_MONO;
+ gpu_state.cur_bilinear_state = -1;
+ gpu_state.cur_alpha_type = AT_TEXTURE;
// Enable some states
dglAlphaFunc(GL_GREATER, 0);
@@ -390,12 +360,6 @@ void opengl_SetDefaults() {
dglEnable(GL_DITHER);
opengl_Blending_on = true;
-#ifndef RELEASE
- if (Fast_test_render) {
- dglDisable(GL_DITHER);
- }
-#endif
-
rend_SetAlphaType(AT_ALWAYS);
rend_SetAlphaValue(255);
rend_SetFiltering(1);
@@ -404,7 +368,7 @@ void opengl_SetDefaults() {
rend_SetColorModel(CM_RGB);
rend_SetZBufferState(1);
rend_SetZValues(0, 3000);
- opengl_SetGammaValue(OpenGL_preferred_state.gamma);
+ rend_SetGammaValue(gpu_preferred_state.gamma);
OpenGL_last_bound[0] = 9999999;
OpenGL_last_bound[1] = 9999999;
Last_texel_unit_set = -1;
@@ -421,7 +385,7 @@ void opengl_SetDefaults() {
dglHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
dglHint(GL_FOG_HINT, GL_NICEST);
dglEnable(GL_SCISSOR_TEST);
- dglScissor(0, 0, OpenGL_state.screen_width, OpenGL_state.screen_height);
+ dglScissor(0, 0, gpu_state.screen_width, gpu_state.screen_height);
dglDisable(GL_SCISSOR_TEST);
dglDepthRange(0.0f, 1.0f);
@@ -470,15 +434,15 @@ int opengl_Setup(HDC glhdc) {
/*if (!WindowGL)
{
- if (OpenGL_preferred_state.bit_depth==32)
+ if (gpu_preferred_state.bit_depth==32)
{
pfd.cColorBits = 32;
pfd.cDepthBits = 32;
}
else
{
- pfd.cColorBits = OpenGL_preferred_state.bit_depth;
- pfd.cDepthBits =OpenGL_preferred_state.bit_depth;
+ pfd.cColorBits = gpu_preferred_state.bit_depth;
+ pfd.cDepthBits =gpu_preferred_state.bit_depth;
}
pfd.cColorBits = 16;
@@ -544,42 +508,12 @@ int opengl_Setup(HDC glhdc) {
}
#elif defined(__LINUX__)
-#ifdef __CHECK_FOR_TOO_SLOW_RENDERING__
-static long minimumAcceptableRender = -1;
-static Uint32 lastSwapTicks = 0;
-static int tooSlowCount = 0;
-static int tooSlowChecksLeft = 0;
-
-void setMinimumAcceptableRenderTime(int ms) {
- if (nofpscheck)
- return;
-
- minimumAcceptableRender = ms;
- lastSwapTicks = SDL_GetTicks();
- tooSlowCount = 0;
- tooSlowChecksLeft = 15; // check 15 frames.
-}
-#endif
-
extern bool linux_permit_gamma;
extern renderer_preferred_state Render_preferred_state;
extern bool ddio_mouseGrabbed;
int SDLCALL d3SDLEventFilter(void *userdata, SDL_Event *event);
int opengl_Setup(oeApplication *app, int *width, int *height) {
-// rcg11192000 don't check for FPS.
-#ifdef __CHECK_FOR_TOO_SLOW_RENDERING__
- nofpscheck = (FindArgChar("-nofpscheck", 'H') != 0);
-
- // rcg01252000 reset these, so they don't barf if we change
- // video modes for a movie or whatnot in the middle of
- // checking rendering speed...
- minimumAcceptableRender = -1;
- lastSwapTicks = 0;
- tooSlowCount = 0;
- tooSlowChecksLeft = 0;
-#endif
-
// rcg09182000 don't need to quitsubsystem anymore...
// SDL_QuitSubSystem(SDL_INIT_VIDEO); // here goes nothing...
// Already_loaded = false;
@@ -721,7 +655,7 @@ int opengl_Init(oeApplication *app, renderer_preferred_state *pref_state) {
mprintf((0, "Setting up opengl mode!\n"));
if (pref_state) {
- OpenGL_preferred_state = *pref_state;
+ gpu_preferred_state = *pref_state;
}
if (app != NULL) {
@@ -747,9 +681,9 @@ int opengl_Init(oeApplication *app, renderer_preferred_state *pref_state) {
devmode.dmSize = sizeof(devmode);
devmode.dmBitsPerPel = 16;
- // devmode.dmBitsPerPel=OpenGL_preferred_state.bit_depth;
- devmode.dmPelsWidth = OpenGL_preferred_state.width;
- devmode.dmPelsHeight = OpenGL_preferred_state.height;
+ // devmode.dmBitsPerPel=gpu_preferred_state.bit_depth;
+ devmode.dmPelsWidth = gpu_preferred_state.width;
+ devmode.dmPelsHeight = gpu_preferred_state.height;
devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
#ifdef CHANGE_RESOLUTION_IN_FULLSCREEN
@@ -773,17 +707,17 @@ int opengl_Init(oeApplication *app, renderer_preferred_state *pref_state) {
opengl_Close();
return 0;
} else {
- OpenGL_preferred_state.bit_depth = 16;
- OpenGL_preferred_state.width = 640;
- OpenGL_preferred_state.height = 480;
+ gpu_preferred_state.bit_depth = 16;
+ gpu_preferred_state.width = 640;
+ gpu_preferred_state.height = 480;
}
} else {
- mprintf((0, "Setdisplaymode to %d x %d (%d bits) is successful!\n", OpenGL_preferred_state.width,
- OpenGL_preferred_state.height, OpenGL_preferred_state.bit_depth));
+ mprintf((0, "Setdisplaymode to %d x %d (%d bits) is successful!\n", gpu_preferred_state.width,
+ gpu_preferred_state.height, gpu_preferred_state.bit_depth));
}
}
- memset(&OpenGL_state, 0, sizeof(rendering_state));
+ memset(&gpu_state, 0, sizeof(rendering_state));
// These values are set here - samir
if (app != NULL) {
@@ -806,17 +740,17 @@ int opengl_Init(oeApplication *app, renderer_preferred_state *pref_state) {
windowX = topLeft.x;
windowY = topLeft.y;
} else {
- SetWindowPos(hOpenGLWnd, HWND_TOPMOST, 0, 0, OpenGL_preferred_state.width, OpenGL_preferred_state.height,
+ SetWindowPos(hOpenGLWnd, HWND_TOPMOST, 0, 0, gpu_preferred_state.width, gpu_preferred_state.height,
SWP_FRAMECHANGED);
- width = OpenGL_preferred_state.width;
- height = OpenGL_preferred_state.height;
+ width = gpu_preferred_state.width;
+ height = gpu_preferred_state.height;
RECT rect;
GetWindowRect((HWND)hOpenGLWnd, &rect);
mprintf((0, "rect=%d %d %d %d\n", rect.top, rect.right, rect.bottom, rect.left));
}
- OpenGL_state.screen_width = width;
- OpenGL_state.screen_height = height;
+ gpu_state.screen_width = width;
+ gpu_state.screen_height = height;
if (!opengl_Setup(hOpenGLDC)) {
opengl_Close();
@@ -831,20 +765,20 @@ int opengl_Init(oeApplication *app, renderer_preferred_state *pref_state) {
* LINUX OPENGL
***********************************************************
*/
- // Setup OpenGL_state.screen_width & OpenGL_state.screen_height & width & height
- width = OpenGL_preferred_state.width;
- height = OpenGL_preferred_state.height;
+ // Setup gpu_state.screen_width & gpu_state.screen_height & width & height
+ width = gpu_preferred_state.width;
+ height = gpu_preferred_state.height;
if (!opengl_Setup(app, &width, &height)) {
opengl_Close();
return 0;
}
- memset(&OpenGL_state, 0, sizeof(rendering_state));
- OpenGL_state.screen_width = width;
- OpenGL_state.screen_height = height;
+ memset(&gpu_state, 0, sizeof(rendering_state));
+ gpu_state.screen_width = width;
+ gpu_state.screen_height = height;
#else
- // Setup OpenGL_state.screen_width & OpenGL_state.screen_height & width & height
+ // Setup gpu_state.screen_width & gpu_state.screen_height & width & height
#endif
// Get some info
@@ -1001,7 +935,7 @@ int opengl_Init(oeApplication *app, renderer_preferred_state *pref_state) {
CHECK_ERROR(4)
- OpenGL_state.initted = 1;
+ gpu_state.initted = 1;
mprintf((0, "OpenGL initialization at %d x %d was successful.\n", width, height));
@@ -1094,7 +1028,7 @@ void opengl_Close() {
#endif
// mod_FreeModule (OpenGLDLLHandle);
- OpenGL_state.initted = 0;
+ gpu_state.initted = 0;
}
// Takes our 16bit format and converts it into the memory scheme that OpenGL wants
@@ -1366,7 +1300,7 @@ void opengl_MakeWrapTypeCurrent(int handle, int map_type, int tn) {
if (tn == 1)
dest_wrap = WT_CLAMP;
else
- dest_wrap = OpenGL_state.cur_wrap_type;
+ dest_wrap = gpu_state.cur_wrap_type;
if (map_type == MAP_TYPE_LIGHTMAP)
uwrap = GET_WRAP_STATE(OpenGL_lightmap_states[handle]);
@@ -1385,11 +1319,11 @@ void opengl_MakeWrapTypeCurrent(int handle, int map_type, int tn) {
OpenGL_sets_this_frame[1]++;
- if (OpenGL_state.cur_wrap_type == WT_CLAMP) {
+ if (gpu_state.cur_wrap_type == WT_CLAMP) {
dglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
dglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
- } else if (OpenGL_state.cur_wrap_type == WT_WRAP_V) {
+ } else if (gpu_state.cur_wrap_type == WT_WRAP_V) {
dglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
dglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
} else {
@@ -1416,8 +1350,8 @@ void opengl_MakeFilterTypeCurrent(int handle, int map_type, int tn) {
dest_state = 1;
} else {
magf = GET_FILTER_STATE(OpenGL_bitmap_states[handle]);
- dest_state = OpenGL_preferred_state.filtering;
- if (!OpenGL_state.cur_bilinear_state)
+ dest_state = gpu_preferred_state.filtering;
+ if (!gpu_state.cur_bilinear_state)
dest_state = 0;
}
@@ -1460,43 +1394,6 @@ void opengl_MakeFilterTypeCurrent(int handle, int map_type, int tn) {
CHECK_ERROR(9)
}
-// returns the alpha that we should use
-float opengl_GetAlphaMultiplier(void) {
- switch (OpenGL_state.cur_alpha_type) {
- case AT_ALWAYS:
- return 1.0;
- case AT_CONSTANT:
- return OpenGL_state.cur_alpha / 255.0;
- case AT_TEXTURE:
- return 1.0;
- case AT_CONSTANT_TEXTURE:
- return OpenGL_state.cur_alpha / 255.0;
- case AT_VERTEX:
- return 1.0;
- case AT_CONSTANT_TEXTURE_VERTEX:
- case AT_CONSTANT_VERTEX:
- return OpenGL_state.cur_alpha / 255.0;
- case AT_TEXTURE_VERTEX:
- return 1.0;
- case AT_LIGHTMAP_BLEND:
- case AT_LIGHTMAP_BLEND_SATURATE:
- return OpenGL_state.cur_alpha / 255.0;
- case AT_SATURATE_TEXTURE:
- return OpenGL_state.cur_alpha / 255.0;
- case AT_SATURATE_VERTEX:
- return 1.0;
- case AT_SATURATE_CONSTANT_VERTEX:
- return OpenGL_state.cur_alpha / 255.0;
- case AT_SATURATE_TEXTURE_VERTEX:
- return 1.0;
- case AT_SPECULAR:
- return 1.0;
- default:
- // Int3(); // no type defined,get jason
- return 0;
- }
-}
-
// Turns on/off multitexture blending
void opengl_SetMultitextureBlendMode(bool state) {
if (OpenGL_multitexture_state == state)
@@ -1538,19 +1435,19 @@ void opengl_DrawMultitexturePolygon3D(int handle, g3Point **p, int nv, int map_t
color_array *colorp;
tex_array *texp, *texp2;
- float one_over_square_res = 1.0 / GameLightmaps[Overlay_map].square_res;
- float xscalar = (float)GameLightmaps[Overlay_map].width * one_over_square_res;
- float yscalar = (float)GameLightmaps[Overlay_map].height * one_over_square_res;
+ float one_over_square_res = 1.0 / GameLightmaps[gpu_Overlay_map].square_res;
+ float xscalar = (float)GameLightmaps[gpu_Overlay_map].width * one_over_square_res;
+ float yscalar = (float)GameLightmaps[gpu_Overlay_map].height * one_over_square_res;
ASSERT(nv < 100);
- if (OpenGL_state.cur_light_state == LS_NONE) {
- fr = GR_COLOR_RED(OpenGL_state.cur_color);
- fg = GR_COLOR_GREEN(OpenGL_state.cur_color);
- fb = GR_COLOR_BLUE(OpenGL_state.cur_color);
+ if (gpu_state.cur_light_state == LS_NONE) {
+ fr = GR_COLOR_RED(gpu_state.cur_color);
+ fg = GR_COLOR_GREEN(gpu_state.cur_color);
+ fb = GR_COLOR_BLUE(gpu_state.cur_color);
}
- alpha = Alpha_multiplier * OpenGL_Alpha_factor;
+ alpha = gpu_Alpha_multiplier * gpu_Alpha_factor;
vertp = &GL_verts[0];
texp = &GL_tex_coords[0];
@@ -1562,13 +1459,13 @@ void opengl_DrawMultitexturePolygon3D(int handle, g3Point **p, int nv, int map_t
pnt = p[i];
ASSERT(pnt->p3_flags & PF_ORIGPOINT);
- if (OpenGL_state.cur_alpha_type & ATF_VERTEX)
- alpha = pnt->p3_a * Alpha_multiplier * OpenGL_Alpha_factor;
+ if (gpu_state.cur_alpha_type & ATF_VERTEX)
+ alpha = pnt->p3_a * gpu_Alpha_multiplier * gpu_Alpha_factor;
// If we have a lighting model, apply the correct lighting!
- if (OpenGL_state.cur_light_state != LS_NONE) {
+ if (gpu_state.cur_light_state != LS_NONE) {
// Do lighting based on intesity (MONO) or colored (RGB)
- if (OpenGL_state.cur_color_model == CM_MONO) {
+ if (gpu_state.cur_color_model == CM_MONO) {
colorp->r = pnt->p3_l;
colorp->g = pnt->p3_l;
colorp->b = pnt->p3_l;
@@ -1624,9 +1521,9 @@ void opengl_DrawMultitexturePolygon3D(int handle, g3Point **p, int nv, int map_t
opengl_MakeFilterTypeCurrent(handle, map_type, 0);
// make sure our bitmap is ready to be drawn
- opengl_MakeBitmapCurrent(Overlay_map, MAP_TYPE_LIGHTMAP, 1);
- opengl_MakeWrapTypeCurrent(Overlay_map, MAP_TYPE_LIGHTMAP, 1);
- opengl_MakeFilterTypeCurrent(Overlay_map, MAP_TYPE_LIGHTMAP, 1);
+ opengl_MakeBitmapCurrent(gpu_Overlay_map, MAP_TYPE_LIGHTMAP, 1);
+ opengl_MakeWrapTypeCurrent(gpu_Overlay_map, MAP_TYPE_LIGHTMAP, 1);
+ opengl_MakeFilterTypeCurrent(gpu_Overlay_map, MAP_TYPE_LIGHTMAP, 1);
opengl_SetMultitextureBlendMode(true);
@@ -1646,11 +1543,11 @@ void opengl_DrawFlatPolygon3D(g3Point **p, int nv) {
opengl_SetMultitextureBlendMode(false);
}
- float alpha = Alpha_multiplier * OpenGL_Alpha_factor;
+ float alpha = gpu_Alpha_multiplier * gpu_Alpha_factor;
- fr = GR_COLOR_RED(OpenGL_state.cur_color);
- fg = GR_COLOR_GREEN(OpenGL_state.cur_color);
- fb = GR_COLOR_BLUE(OpenGL_state.cur_color);
+ fr = GR_COLOR_RED(gpu_state.cur_color);
+ fg = GR_COLOR_GREEN(gpu_state.cur_color);
+ fb = GR_COLOR_BLUE(gpu_state.cur_color);
fr /= 255.0;
fg /= 255.0;
fb /= 255.0;
@@ -1661,13 +1558,13 @@ void opengl_DrawFlatPolygon3D(g3Point **p, int nv) {
g3Point *pnt = p[i];
ASSERT(pnt->p3_flags & PF_ORIGPOINT);
- if (OpenGL_state.cur_alpha_type & ATF_VERTEX)
- alpha = pnt->p3_a * Alpha_multiplier * OpenGL_Alpha_factor;
+ if (gpu_state.cur_alpha_type & ATF_VERTEX)
+ alpha = pnt->p3_a * gpu_Alpha_multiplier * gpu_Alpha_factor;
// If we have a lighting model, apply the correct lighting!
- if (OpenGL_state.cur_light_state != LS_NONE) {
+ if (gpu_state.cur_light_state != LS_NONE) {
// Do lighting based on intesity (MONO) or colored (RGB)
- if (OpenGL_state.cur_color_model == CM_MONO)
+ if (gpu_state.cur_color_model == CM_MONO)
dglColor4f(pnt->p3_l, pnt->p3_l, pnt->p3_l, alpha);
else {
dglColor4f(pnt->p3_r, pnt->p3_g, pnt->p3_b, alpha);
@@ -1692,11 +1589,11 @@ void opengl_DrawFlatPolygon3D(g3Point **p, int nv) {
}
// Sets the gamma correction value
-void opengl_SetGammaValue(float val) {
+void rend_SetGammaValue(float val) {
// if( WindowGL )
// return;
- OpenGL_preferred_state.gamma = val;
+ gpu_preferred_state.gamma = val;
mprintf((0, "Setting gamma to %f\n", val));
#if defined(WIN32)
@@ -1918,20 +1815,20 @@ void rend_DrawPolygon3D(int handle, g3Point **p, int nv, int map_type) {
g3_RefreshTransforms(false);
- if (OpenGL_state.cur_texture_quality == 0) {
+ if (gpu_state.cur_texture_quality == 0) {
opengl_DrawFlatPolygon3D(p, nv);
return;
}
- if (Overlay_type != OT_NONE && UseMultitexture) {
+ if (gpu_Overlay_type != OT_NONE && UseMultitexture) {
opengl_DrawMultitexturePolygon3D(handle, p, nv, map_type);
return;
}
- if (OpenGL_state.cur_light_state == LS_FLAT_GOURAUD) {
- fr = GR_COLOR_RED(OpenGL_state.cur_color) / 255.0;
- fg = GR_COLOR_GREEN(OpenGL_state.cur_color) / 255.0;
- fb = GR_COLOR_BLUE(OpenGL_state.cur_color) / 255.0;
+ if (gpu_state.cur_light_state == LS_FLAT_GOURAUD) {
+ fr = GR_COLOR_RED(gpu_state.cur_color) / 255.0;
+ fg = GR_COLOR_GREEN(gpu_state.cur_color) / 255.0;
+ fb = GR_COLOR_BLUE(gpu_state.cur_color) / 255.0;
}
if (UseMultitexture) {
@@ -1943,7 +1840,7 @@ void rend_DrawPolygon3D(int handle, g3Point **p, int nv, int map_type) {
opengl_MakeWrapTypeCurrent(handle, map_type, 0);
opengl_MakeFilterTypeCurrent(handle, map_type, 0);
- alpha = Alpha_multiplier * OpenGL_Alpha_factor;
+ alpha = gpu_Alpha_multiplier * gpu_Alpha_factor;
vertp = &GL_verts[0];
texp = &GL_tex_coords[0];
@@ -1976,8 +1873,8 @@ void rend_DrawPolygon3D(int handle, g3Point **p, int nv, int map_type) {
vector tempv = pnt->p3_vecPreRot - View_position;
vector testPt = tempv * Unscaled_matrix;
- float screenX = pnt->p3_sx + OpenGL_state.clip_x1;
- float screenY = pnt->p3_sy + OpenGL_state.clip_y1;
+ float screenX = pnt->p3_sx + gpu_state.clip_x1;
+ float screenY = pnt->p3_sy + gpu_state.clip_y1;
// normalize
float oOW = 1.0f / view[3];
@@ -1989,20 +1886,20 @@ void rend_DrawPolygon3D(int handle, g3Point **p, int nv, int map_type) {
}
////////////////////////////////////////////
- if (OpenGL_state.cur_alpha_type & ATF_VERTEX) {
- alpha = pnt->p3_a * Alpha_multiplier * OpenGL_Alpha_factor;
+ if (gpu_state.cur_alpha_type & ATF_VERTEX) {
+ alpha = pnt->p3_a * gpu_Alpha_multiplier * gpu_Alpha_factor;
}
// If we have a lighting model, apply the correct lighting!
- if (OpenGL_state.cur_light_state != LS_NONE) {
- if (OpenGL_state.cur_light_state == LS_FLAT_GOURAUD) {
+ if (gpu_state.cur_light_state != LS_NONE) {
+ if (gpu_state.cur_light_state == LS_FLAT_GOURAUD) {
colorp->r = fr;
colorp->g = fg;
colorp->b = fb;
colorp->a = alpha;
} else {
// Do lighting based on intesity (MONO) or colored (RGB)
- if (OpenGL_state.cur_color_model == CM_MONO) {
+ if (gpu_state.cur_color_model == CM_MONO) {
colorp->r = pnt->p3_l;
colorp->g = pnt->p3_l;
colorp->b = pnt->p3_l;
@@ -2071,7 +1968,7 @@ void rend_DrawPolygon3D(int handle, g3Point **p, int nv, int map_type) {
CHECK_ERROR(10)
// If there is a lightmap to draw, draw it as well
- if (Overlay_type != OT_NONE) {
+ if (gpu_Overlay_type != OT_NONE) {
return; // Temp fix until I figure out whats going on
Int3(); // Shouldn't reach here
}
@@ -2081,7 +1978,7 @@ void rend_DrawPolygon3D(int handle, g3Point **p, int nv, int map_type) {
// Uses bitmap "handle" as a texture
void rend_DrawPolygon2D(int handle, g3Point **p, int nv) {
ASSERT(nv < 100);
- ASSERT(Overlay_type == OT_NONE);
+ ASSERT(gpu_Overlay_type == OT_NONE);
g3_RefreshTransforms(true);
@@ -2089,15 +1986,15 @@ void rend_DrawPolygon2D(int handle, g3Point **p, int nv) {
opengl_SetMultitextureBlendMode(false);
}
- int xAdd = OpenGL_state.clip_x1;
- int yAdd = OpenGL_state.clip_y1;
+ int xAdd = gpu_state.clip_x1;
+ int yAdd = gpu_state.clip_y1;
float fr, fg, fb;
- if (OpenGL_state.cur_light_state == LS_FLAT_GOURAUD || OpenGL_state.cur_texture_quality == 0) {
+ if (gpu_state.cur_light_state == LS_FLAT_GOURAUD || gpu_state.cur_texture_quality == 0) {
float scale = 1.0f / 255.0f;
- fr = GR_COLOR_RED(OpenGL_state.cur_color) * scale;
- fg = GR_COLOR_GREEN(OpenGL_state.cur_color) * scale;
- fb = GR_COLOR_BLUE(OpenGL_state.cur_color) * scale;
+ fr = GR_COLOR_RED(gpu_state.cur_color) * scale;
+ fg = GR_COLOR_GREEN(gpu_state.cur_color) * scale;
+ fb = GR_COLOR_BLUE(gpu_state.cur_color) * scale;
}
// make sure our bitmap is ready to be drawn
@@ -2105,7 +2002,7 @@ void rend_DrawPolygon2D(int handle, g3Point **p, int nv) {
opengl_MakeWrapTypeCurrent(handle, MAP_TYPE_BITMAP, 0);
opengl_MakeFilterTypeCurrent(handle, MAP_TYPE_BITMAP, 0);
- float alpha = Alpha_multiplier * OpenGL_Alpha_factor;
+ float alpha = gpu_Alpha_multiplier * gpu_Alpha_factor;
vector *vertp = &GL_verts[0];
tex_array *texp = &GL_tex_coords[0];
@@ -2116,21 +2013,21 @@ void rend_DrawPolygon2D(int handle, g3Point **p, int nv) {
for (i = 0; i < nv; ++i, ++vertp, ++texp, ++colorp) {
g3Point *pnt = p[i];
- if (OpenGL_state.cur_alpha_type & ATF_VERTEX) {
+ if (gpu_state.cur_alpha_type & ATF_VERTEX) {
// the alpha should come from the vertex
- alpha = pnt->p3_a * Alpha_multiplier * OpenGL_Alpha_factor;
+ alpha = pnt->p3_a * gpu_Alpha_multiplier * gpu_Alpha_factor;
}
// If we have a lighting model, apply the correct lighting!
- if (OpenGL_state.cur_light_state == LS_FLAT_GOURAUD || OpenGL_state.cur_texture_quality == 0) {
+ if (gpu_state.cur_light_state == LS_FLAT_GOURAUD || gpu_state.cur_texture_quality == 0) {
// pull the color from the constant color data
colorp->r = fr;
colorp->g = fg;
colorp->b = fb;
colorp->a = alpha;
- } else if (OpenGL_state.cur_light_state != LS_NONE) {
+ } else if (gpu_state.cur_light_state != LS_NONE) {
// Do lighting based on intensity (MONO) or colored (RGB)
- if (OpenGL_state.cur_color_model == CM_MONO) {
+ if (gpu_state.cur_color_model == CM_MONO) {
colorp->r = pnt->p3_l;
colorp->g = pnt->p3_l;
colorp->b = pnt->p3_l;
@@ -2161,7 +2058,7 @@ void rend_DrawPolygon2D(int handle, g3Point **p, int nv) {
}
// And draw!
- if (OpenGL_state.cur_texture_quality == 0) {
+ if (gpu_state.cur_texture_quality == 0) {
// force disable textures
dglDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
@@ -2169,7 +2066,7 @@ void rend_DrawPolygon2D(int handle, g3Point **p, int nv) {
// draw the data in the arrays
dglDrawArrays(GL_POLYGON, 0, nv);
- if (OpenGL_state.cur_texture_quality == 0) {
+ if (gpu_state.cur_texture_quality == 0) {
// re-enable textures
dglEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
@@ -2182,14 +2079,14 @@ void rend_DrawPolygon2D(int handle, g3Point **p, int nv) {
#endif // DEDICATED_ONLY
-void rend_SetFlatColor(ddgr_color color) { OpenGL_state.cur_color = color; }
+void rend_SetFlatColor(ddgr_color color) { gpu_state.cur_color = color; }
// Sets the fog state to TRUE or FALSE
void rend_SetFogState(sbyte state) {
- if (state == OpenGL_state.cur_fog_state)
+ if (state == gpu_state.cur_fog_state)
return;
- OpenGL_state.cur_fog_state = state;
+ gpu_state.cur_fog_state = state;
if (state == 1) {
dglEnable(GL_FOG);
} else {
@@ -2203,8 +2100,8 @@ void rend_SetFogBorders(float nearz, float farz) {
float fogStart = nearz;
float fogEnd = farz;
- OpenGL_state.cur_fog_start = fogStart;
- OpenGL_state.cur_fog_end = fogEnd;
+ gpu_state.cur_fog_start = fogStart;
+ gpu_state.cur_fog_end = fogEnd;
dglFogi(GL_FOG_MODE, GL_LINEAR);
dglFogf(GL_FOG_START, fogStart);
@@ -2217,7 +2114,7 @@ void rend_SetRendererType(renderer_type state) {
}
void rend_SetLighting(light_state state) {
- if (state == OpenGL_state.cur_light_state)
+ if (state == gpu_state.cur_light_state)
return; // No redundant state setting
#if (defined(_USE_OGL_ACTIVE_TEXTURES))
if (UseMultitexture && Last_texel_unit_set != 0) {
@@ -2231,16 +2128,16 @@ void rend_SetLighting(light_state state) {
switch (state) {
case LS_NONE:
dglShadeModel(GL_SMOOTH);
- OpenGL_state.cur_light_state = LS_NONE;
+ gpu_state.cur_light_state = LS_NONE;
break;
case LS_FLAT_GOURAUD:
dglShadeModel(GL_SMOOTH);
- OpenGL_state.cur_light_state = LS_FLAT_GOURAUD;
+ gpu_state.cur_light_state = LS_FLAT_GOURAUD;
break;
case LS_GOURAUD:
case LS_PHONG:
dglShadeModel(GL_SMOOTH);
- OpenGL_state.cur_light_state = LS_GOURAUD;
+ gpu_state.cur_light_state = LS_GOURAUD;
break;
default:
Int3();
@@ -2253,10 +2150,10 @@ void rend_SetLighting(light_state state) {
void rend_SetColorModel(color_model state) {
switch (state) {
case CM_MONO:
- OpenGL_state.cur_color_model = CM_MONO;
+ gpu_state.cur_color_model = CM_MONO;
break;
case CM_RGB:
- OpenGL_state.cur_color_model = CM_RGB;
+ gpu_state.cur_color_model = CM_RGB;
break;
default:
Int3();
@@ -2265,7 +2162,7 @@ void rend_SetColorModel(color_model state) {
}
void rend_SetTextureType(texture_type state) {
- if (state == OpenGL_state.cur_texture_type)
+ if (state == gpu_state.cur_texture_type)
return; // No redundant state setting
#if (defined(_USE_OGL_ACTIVE_TEXTURES))
if (UseMultitexture && Last_texel_unit_set != 0) {
@@ -2278,14 +2175,14 @@ void rend_SetTextureType(texture_type state) {
switch (state) {
case TT_FLAT:
dglDisable(GL_TEXTURE_2D);
- OpenGL_state.cur_texture_quality = 0;
+ gpu_state.cur_texture_quality = 0;
break;
case TT_LINEAR:
case TT_LINEAR_SPECIAL:
case TT_PERSPECTIVE:
case TT_PERSPECTIVE_SPECIAL:
dglEnable(GL_TEXTURE_2D);
- OpenGL_state.cur_texture_quality = 2;
+ gpu_state.cur_texture_quality = 2;
break;
default:
Int3(); // huh? Get Jason
@@ -2293,45 +2190,19 @@ void rend_SetTextureType(texture_type state) {
}
CHECK_ERROR(12)
- OpenGL_state.cur_texture_type = state;
+ gpu_state.cur_texture_type = state;
}
void rend_StartFrame(int x1, int y1, int x2, int y2, int clear_flags) {
if (clear_flags & RF_CLEAR_ZBUFFER) {
dglClear(GL_DEPTH_BUFFER_BIT);
}
- OpenGL_state.clip_x1 = x1;
- OpenGL_state.clip_y1 = y1;
- OpenGL_state.clip_x2 = x2;
- OpenGL_state.clip_y2 = y2;
+ gpu_state.clip_x1 = x1;
+ gpu_state.clip_y1 = y1;
+ gpu_state.clip_x2 = x2;
+ gpu_state.clip_y2 = y2;
}
-#ifdef __CHECK_FOR_TOO_SLOW_RENDERING__
-// !!! FIXME: delete this whole section (and definitely the Loki email and phone number!).
-#error do not compile this in. This was for software mesa problems in 2000.
-static void slownessAbort(void) {
-
-#ifdef __LINUX__
- SDL_Surface *surface = SDL_GetVideoSurface();
- SDL_SetVideoMode(surface->w, surface->h, surface->format->BitsPerPixel, surface->flags & ~SDL_OPENGL);
-
- sdl_ShowMessage("Your OpenGL driver is too slow to play this game.\n"
- "Driver used: [ %s ]\n"
- "Please change your driver!\n"
- "Email support@lokigames.com for help,\n"
- "or call 1-714-508-2140 (9-5 PM US Pacific Time).\n",
- loadedLibrary);
-
- SDL_GL_SwapBuffers();
- Sleep(10000);
- SDL_Quit();
- _exit(99);
-#else
-#error Fill in an aborting notice for your platform.
-#endif
-
-} // slownessAbort
-#endif
// Flips the screen
void rend_Flip(void) {
@@ -2351,9 +2222,9 @@ void rend_Flip(void) {
}
#endif
- OpenGL_last_frame_polys_drawn = OpenGL_polys_drawn;
- OpenGL_last_frame_verts_processed = OpenGL_verts_processed;
- OpenGL_last_uploaded = OpenGL_uploads;
+ gpu_last_frame_polys_drawn = OpenGL_polys_drawn;
+ gpu_last_frame_verts_processed = OpenGL_verts_processed;
+ gpu_last_uploaded = OpenGL_uploads;
OpenGL_uploads = 0;
OpenGL_polys_drawn = 0;
@@ -2370,107 +2241,17 @@ void rend_Flip(void) {
DGL_LogNewFrame();
}
#endif
-
-#ifdef __CHECK_FOR_TOO_SLOW_RENDERING__
- if (minimumAcceptableRender > 0) {
- Uint32 newticks = SDL_GetTicks();
- if ((newticks - lastSwapTicks) > minimumAcceptableRender) {
- tooSlowCount++;
- if (tooSlowCount >= 3) {
- slownessAbort();
- } // if
- } // if
-
- // disable check?
- tooSlowChecksLeft--;
- if (tooSlowChecksLeft <= 0) {
- minimumAcceptableRender = -1;
- }
- lastSwapTicks = newticks;
- } // if
-#endif
}
void rend_EndFrame(void) {}
-// draws a scaled 2d bitmap to our buffer
-void rend_DrawScaledBitmap(int x1, int y1, int x2, int y2, int bm, float u0, float v0, float u1, float v1, int color,
- float *alphas) {
- g3Point *ptr_pnts[4];
- g3Point pnts[4];
- float r, g, b;
- if (color != -1) {
- r = GR_COLOR_RED(color) / 255.0;
- g = GR_COLOR_GREEN(color) / 255.0;
- b = GR_COLOR_BLUE(color) / 255.0;
- }
- for (int i = 0; i < 4; i++) {
- if (color == -1)
- pnts[i].p3_l = 1.0;
- else {
- pnts[i].p3_r = r;
- pnts[i].p3_g = g;
- pnts[i].p3_b = b;
- }
- if (alphas) {
- pnts[i].p3_a = alphas[i];
- }
-
- pnts[i].p3_z = 1.0f;
- pnts[i].p3_flags = PF_PROJECTED;
- }
-
- pnts[0].p3_sx = x1;
- pnts[0].p3_sy = y1;
- pnts[0].p3_u = u0;
- pnts[0].p3_v = v0;
- pnts[1].p3_sx = x2;
- pnts[1].p3_sy = y1;
- pnts[1].p3_u = u1;
- pnts[1].p3_v = v0;
- pnts[2].p3_sx = x2;
- pnts[2].p3_sy = y2;
- pnts[2].p3_u = u1;
- pnts[2].p3_v = v1;
- pnts[3].p3_sx = x1;
- pnts[3].p3_sy = y2;
- pnts[3].p3_u = u0;
- pnts[3].p3_v = v1;
- ptr_pnts[0] = &pnts[0];
- ptr_pnts[1] = &pnts[1];
- ptr_pnts[2] = &pnts[2];
- ptr_pnts[3] = &pnts[3];
- rend_SetTextureType(TT_LINEAR);
- rend_DrawPolygon2D(bm, ptr_pnts, 4);
-}
-
-// Sets where the software renderer should write to
-void rend_SetSoftwareParameters(float aspect, int width, int height, int pitch, ubyte *framebuffer) {}
-
-// Sets the state of bilinear filtering for our textures
-void rend_SetFiltering(sbyte state) {
-#ifndef RELEASE
- if (Fast_test_render) {
- state = 0;
- }
-#endif
-
- OpenGL_state.cur_bilinear_state = state;
-}
-
// Sets the state of z-buffering to on or off
void rend_SetZBufferState(sbyte state) {
-#ifndef RELEASE
- if (Fast_test_render) {
- state = 0;
- }
-#endif
-
- if (state == OpenGL_state.cur_zbuffer_state)
+ if (state == gpu_state.cur_zbuffer_state)
return; // No redundant state setting
OpenGL_sets_this_frame[5]++;
- OpenGL_state.cur_zbuffer_state = state;
+ gpu_state.cur_zbuffer_state = state;
// mprintf ((0,"OPENGL: Setting zbuffer state to %d.\n",state));
@@ -2484,23 +2265,6 @@ void rend_SetZBufferState(sbyte state) {
CHECK_ERROR(14)
}
-// Sets the near and far planes for z buffer
-void rend_SetZValues(float nearz, float farz) {
- OpenGL_state.cur_near_z = nearz;
- OpenGL_state.cur_far_z = farz;
- // mprintf ((0,"OPENGL:Setting depth range to %f - %f\n",nearz,farz));
-
- // JEFF: glDepthRange must take parameters [0,1]
- // It is set in init
- //@@dglDepthRange (0,farz);
-}
-
-// Sets a bitmap as a overlay map to rendered on top of the next texture map
-// a -1 value indicates no overlay map
-void rend_SetOverlayMap(int handle) { Overlay_map = handle; }
-
-void rend_SetOverlayType(ubyte type) { Overlay_type = type; }
-
// Clears the display to a specified color
void rend_ClearScreen(ddgr_color color) {
int r = (color >> 16 & 0xFF);
@@ -2530,18 +2294,18 @@ void rend_FillRect(ddgr_color color, int x1, int y1, int x2, int y2) {
int width = x2 - x1;
int height = y2 - y1;
- x1 += OpenGL_state.clip_x1;
- y1 += OpenGL_state.clip_y1;
+ x1 += gpu_state.clip_x1;
+ y1 += gpu_state.clip_y1;
dglEnable(GL_SCISSOR_TEST);
- dglScissor(x1, OpenGL_state.screen_height - (height + y1), width, height);
+ dglScissor(x1, gpu_state.screen_height - (height + y1), width, height);
dglClearColor((float)r / 255.0, (float)g / 255.0, (float)b / 255.0, 0);
dglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- width = OpenGL_state.clip_x2 - OpenGL_state.clip_x1;
- height = OpenGL_state.clip_y2 - OpenGL_state.clip_y1;
+ width = gpu_state.clip_x2 - gpu_state.clip_x1;
+ height = gpu_state.clip_y2 - gpu_state.clip_y1;
- dglScissor(OpenGL_state.clip_x1, OpenGL_state.screen_height - (OpenGL_state.clip_y1 + height), width, height);
+ dglScissor(gpu_state.clip_x1, gpu_state.screen_height - (gpu_state.clip_y1 + height), width, height);
dglDisable(GL_SCISSOR_TEST);
}
@@ -2563,48 +2327,16 @@ void rend_SetPixel(ddgr_color color, int x, int y) {
// Sets a pixel on the display
ddgr_color rend_GetPixel(int x, int y) {
ddgr_color color[4];
- dglReadPixels(x, (OpenGL_state.screen_height - 1) - y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)color);
+ dglReadPixels(x, (gpu_state.screen_height - 1) - y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)color);
return color[0];
}
-void rend_FillCircle(ddgr_color col, int x, int y, int rad) {}
-
-void rend_DrawCircle(int x, int y, int rad) {}
-
-// Sets up a font character to draw. We draw our fonts as pieces of textures
-void rend_DrawFontCharacter(int bm_handle, int x1, int y1, int x2, int y2, float u, float v, float w, float h) {
- g3Point *ptr_pnts[4];
- g3Point pnts[4];
- for (int i = 0; i < 4; i++) {
- pnts[i].p3_z = 1; // Make REALLY close!
- pnts[i].p3_flags = PF_PROJECTED;
- ptr_pnts[i] = &pnts[i];
- }
- pnts[0].p3_sx = x1;
- pnts[0].p3_sy = y1;
- pnts[0].p3_u = u;
- pnts[0].p3_v = v;
- pnts[1].p3_sx = x2;
- pnts[1].p3_sy = y1;
- pnts[1].p3_u = u + w;
- pnts[1].p3_v = v;
- pnts[2].p3_sx = x2;
- pnts[2].p3_sy = y2;
- pnts[2].p3_u = u + w;
- pnts[2].p3_v = v + h;
- pnts[3].p3_sx = x1;
- pnts[3].p3_sy = y2;
- pnts[3].p3_u = u;
- pnts[3].p3_v = v + h;
- rend_DrawPolygon2D(bm_handle, ptr_pnts, 4);
-}
-
// Draws a line
void rend_DrawLine(int x1, int y1, int x2, int y2) {
sbyte atype;
light_state ltype;
texture_type ttype;
- int color = OpenGL_state.cur_color;
+ int color = gpu_state.cur_color;
g3_RefreshTransforms(true);
@@ -2612,19 +2344,20 @@ void rend_DrawLine(int x1, int y1, int x2, int y2) {
int g = GR_COLOR_GREEN(color);
int b = GR_COLOR_BLUE(color);
- atype = OpenGL_state.cur_alpha_type;
- ltype = OpenGL_state.cur_light_state;
- ttype = OpenGL_state.cur_texture_type;
+ atype = gpu_state.cur_alpha_type;
+ ltype = gpu_state.cur_light_state;
+ ttype = gpu_state.cur_texture_type;
rend_SetAlphaType(AT_ALWAYS);
rend_SetLighting(LS_NONE);
rend_SetTextureType(TT_FLAT);
+ // TODO: Generalize
dglBegin(GL_LINES);
dglColor4ub(r, g, b, 255);
- dglVertex2i(x1 + OpenGL_state.clip_x1, y1 + OpenGL_state.clip_y1);
+ dglVertex2i(x1 + gpu_state.clip_x1, y1 + gpu_state.clip_y1);
dglColor4ub(r, g, b, 255);
- dglVertex2i(x2 + OpenGL_state.clip_x1, y2 + OpenGL_state.clip_y1);
+ dglVertex2i(x2 + gpu_state.clip_x1, y2 + gpu_state.clip_y1);
dglEnd();
rend_SetAlphaType(atype);
@@ -2632,29 +2365,9 @@ void rend_DrawLine(int x1, int y1, int x2, int y2) {
rend_SetTextureType(ttype);
}
-// Sets the argb characteristics of the font characters. color1 is the upper left and proceeds clockwise
-void rend_SetCharacterParameters(ddgr_color color1, ddgr_color color2, ddgr_color color3, ddgr_color color4) {
- rend_FontRed[0] = (float)(GR_COLOR_RED(color1) / 255.0f);
- rend_FontRed[1] = (float)(GR_COLOR_RED(color2) / 255.0f);
- rend_FontRed[2] = (float)(GR_COLOR_RED(color3) / 255.0f);
- rend_FontRed[3] = (float)(GR_COLOR_RED(color4) / 255.0f);
- rend_FontGreen[0] = (float)(GR_COLOR_GREEN(color1) / 255.0f);
- rend_FontGreen[1] = (float)(GR_COLOR_GREEN(color2) / 255.0f);
- rend_FontGreen[2] = (float)(GR_COLOR_GREEN(color3) / 255.0f);
- rend_FontGreen[3] = (float)(GR_COLOR_GREEN(color4) / 255.0f);
- rend_FontBlue[0] = (float)(GR_COLOR_BLUE(color1) / 255.0f);
- rend_FontBlue[1] = (float)(GR_COLOR_BLUE(color2) / 255.0f);
- rend_FontBlue[2] = (float)(GR_COLOR_BLUE(color3) / 255.0f);
- rend_FontBlue[3] = (float)(GR_COLOR_BLUE(color4) / 255.0f);
- rend_FontAlpha[0] = (color1 >> 24) / 255.0f;
- rend_FontAlpha[1] = (color2 >> 24) / 255.0f;
- rend_FontAlpha[2] = (color3 >> 24) / 255.0f;
- rend_FontAlpha[3] = (color4 >> 24) / 255.0f;
-}
-
// Sets the color of fog
void rend_SetFogColor(ddgr_color color) {
- if (color == OpenGL_state.cur_fog_color)
+ if (color == gpu_state.cur_fog_color)
return;
float fc[4];
@@ -2672,7 +2385,7 @@ void rend_SetFogColor(ddgr_color color) {
// Sets the lighting state of opengl
void rend_SetLightingState(light_state state) {
- if (state == OpenGL_state.cur_light_state)
+ if (state == gpu_state.cur_light_state)
return; // No redundant state setting
if (UseMultitexture && Last_texel_unit_set != 0) {
@@ -2687,16 +2400,16 @@ void rend_SetLightingState(light_state state) {
switch (state) {
case LS_NONE:
dglShadeModel(GL_SMOOTH);
- OpenGL_state.cur_light_state = LS_NONE;
+ gpu_state.cur_light_state = LS_NONE;
break;
case LS_FLAT_GOURAUD:
dglShadeModel(GL_SMOOTH);
- OpenGL_state.cur_light_state = LS_FLAT_GOURAUD;
+ gpu_state.cur_light_state = LS_FLAT_GOURAUD;
break;
case LS_GOURAUD:
case LS_PHONG:
dglShadeModel(GL_SMOOTH);
- OpenGL_state.cur_light_state = LS_GOURAUD;
+ gpu_state.cur_light_state = LS_GOURAUD;
break;
default:
Int3();
@@ -2707,7 +2420,7 @@ void rend_SetLightingState(light_state state) {
}
void rend_SetAlphaType(sbyte atype) {
- if (atype == OpenGL_state.cur_alpha_type)
+ if (atype == gpu_state.cur_alpha_type)
return; // don't set it redundantly
#if (defined(_USE_OGL_ACTIVE_TEXTURES))
if (UseMultitexture && Last_texel_unit_set != 0) {
@@ -2731,26 +2444,15 @@ void rend_SetAlphaType(sbyte atype) {
switch (atype) {
case AT_ALWAYS:
- rend_SetAlphaValue(255);
- dglBlendFunc(GL_ONE, GL_ZERO);
- break;
- case AT_CONSTANT:
- dglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- break;
case AT_TEXTURE:
rend_SetAlphaValue(255);
dglBlendFunc(GL_ONE, GL_ZERO);
break;
+ case AT_CONSTANT:
case AT_CONSTANT_TEXTURE:
- dglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- break;
case AT_VERTEX:
- dglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- break;
case AT_CONSTANT_TEXTURE_VERTEX:
case AT_CONSTANT_VERTEX:
- dglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- break;
case AT_TEXTURE_VERTEX:
dglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
break;
@@ -2759,14 +2461,8 @@ void rend_SetAlphaType(sbyte atype) {
break;
case AT_SATURATE_TEXTURE:
case AT_LIGHTMAP_BLEND_SATURATE:
- dglBlendFunc(GL_SRC_ALPHA, GL_ONE);
- break;
case AT_SATURATE_VERTEX:
- dglBlendFunc(GL_SRC_ALPHA, GL_ONE);
- break;
case AT_SATURATE_CONSTANT_VERTEX:
- dglBlendFunc(GL_SRC_ALPHA, GL_ONE);
- break;
case AT_SATURATE_TEXTURE_VERTEX:
dglBlendFunc(GL_SRC_ALPHA, GL_ONE);
break;
@@ -2776,51 +2472,29 @@ void rend_SetAlphaType(sbyte atype) {
Int3(); // no type defined,get jason
break;
}
- OpenGL_state.cur_alpha_type = atype;
- Alpha_multiplier = opengl_GetAlphaMultiplier();
+ gpu_state.cur_alpha_type = atype;
+ gpu_Alpha_multiplier = rend_GetAlphaMultiplier();
CHECK_ERROR(15)
}
-// Sets the alpha value for constant alpha
-void rend_SetAlphaValue(ubyte val) {
- OpenGL_state.cur_alpha = val;
- Alpha_multiplier = opengl_GetAlphaMultiplier();
-}
-
-// Sets the overall alpha scale factor (all alpha values are scaled by this value)
-// usefull for motion blur effect
-void rend_SetAlphaFactor(float val) {
- if (val < 0.0f)
- val = 0.0f;
- if (val > 1.0f)
- val = 1.0f;
- OpenGL_Alpha_factor = val;
-}
-
-// Returns the current Alpha factor
-float rend_GetAlphaFactor(void) { return OpenGL_Alpha_factor; }
-
-// Sets the texture wrapping type
-void rend_SetWrapType(wrap_type val) { OpenGL_state.cur_wrap_type = val; }
-
// Draws a line using the states of the renderer
void rend_DrawSpecialLine(g3Point *p0, g3Point *p1) {
g3_RefreshTransforms(true);
- int x_add = OpenGL_state.clip_x1;
- int y_add = OpenGL_state.clip_y1;
+ int x_add = gpu_state.clip_x1;
+ int y_add = gpu_state.clip_y1;
float fr, fg, fb, alpha;
int i;
- fr = GR_COLOR_RED(OpenGL_state.cur_color);
- fg = GR_COLOR_GREEN(OpenGL_state.cur_color);
- fb = GR_COLOR_BLUE(OpenGL_state.cur_color);
+ fr = GR_COLOR_RED(gpu_state.cur_color);
+ fg = GR_COLOR_GREEN(gpu_state.cur_color);
+ fb = GR_COLOR_BLUE(gpu_state.cur_color);
fr /= 255.0f;
fg /= 255.0f;
fb /= 255.0f;
- alpha = Alpha_multiplier * OpenGL_Alpha_factor;
+ alpha = gpu_Alpha_multiplier * gpu_Alpha_factor;
// And draw!
dglBegin(GL_LINES);
@@ -2830,16 +2504,16 @@ void rend_DrawSpecialLine(g3Point *p0, g3Point *p1) {
if (i == 1)
pnt = p1;
- if (OpenGL_state.cur_alpha_type & ATF_VERTEX)
- alpha = pnt->p3_a * Alpha_multiplier * OpenGL_Alpha_factor;
+ if (gpu_state.cur_alpha_type & ATF_VERTEX)
+ alpha = pnt->p3_a * gpu_Alpha_multiplier * gpu_Alpha_factor;
// If we have a lighting model, apply the correct lighting!
- if (OpenGL_state.cur_light_state != LS_NONE) {
- if (OpenGL_state.cur_light_state == LS_FLAT_GOURAUD) {
+ if (gpu_state.cur_light_state != LS_NONE) {
+ if (gpu_state.cur_light_state == LS_FLAT_GOURAUD) {
dglColor4f(fr, fg, fb, alpha);
} else {
// Do lighting based on intesity (MONO) or colored (RGB)
- if (OpenGL_state.cur_color_model == CM_MONO)
+ if (gpu_state.cur_color_model == CM_MONO)
dglColor4f(pnt->p3_l, pnt->p3_l, pnt->p3_l, alpha);
else {
dglColor4f(pnt->p3_r, pnt->p3_g, pnt->p3_b, alpha);
@@ -2862,10 +2536,10 @@ void rend_Screenshot(int bm_handle) {
ushort *dest_data;
uint *temp_data;
int i, t;
- int total = OpenGL_state.screen_width * OpenGL_state.screen_height;
+ int total = gpu_state.screen_width * gpu_state.screen_height;
- ASSERT((bm_w(bm_handle, 0)) == OpenGL_state.screen_width);
- ASSERT((bm_h(bm_handle, 0)) == OpenGL_state.screen_height);
+ ASSERT((bm_w(bm_handle, 0)) == gpu_state.screen_width);
+ ASSERT((bm_h(bm_handle, 0)) == gpu_state.screen_height);
int w = bm_w(bm_handle, 0);
int h = bm_h(bm_handle, 0);
@@ -2875,7 +2549,7 @@ void rend_Screenshot(int bm_handle) {
dest_data = bm_data(bm_handle, 0);
- dglReadPixels(0, 0, OpenGL_state.screen_width, OpenGL_state.screen_height, GL_RGBA, GL_UNSIGNED_BYTE,
+ dglReadPixels(0, 0, gpu_state.screen_width, gpu_state.screen_height, GL_RGBA, GL_UNSIGNED_BYTE,
(GLvoid *)temp_data);
for (i = 0; i < h; i++) {
@@ -2893,17 +2567,6 @@ void rend_Screenshot(int bm_handle) {
mem_free(temp_data);
}
-void rend_SetZBias(float z_bias) {
- if (Z_bias != z_bias) {
- Z_bias = z_bias;
-
- // Force refresh our transforms to take the Zbias into account
- g3_GetModelViewMatrix(&View_position, &Unscaled_matrix, (float *)gTransformModelView);
- g3_UpdateFullTransform();
- g3_ForceTransformRefresh();
- }
-}
-
// Enables/disables writes the depth buffer
void rend_SetZBufferWriteMask(int state) {
OpenGL_sets_this_frame[5]++;
@@ -2914,162 +2577,11 @@ void rend_SetZBufferWriteMask(int state) {
}
}
-// Gets a pointer to a linear frame buffer
-void rend_GetLFBLock(renderer_lfb *lfb) {}
-
-// Releases an lfb lock
-void rend_ReleaseLFBLock(renderer_lfb *lfb) {}
-
-// Returns the aspect ratio of the physical screen
-void rend_GetProjectionParameters(int *width, int *height) {
- *width = OpenGL_state.clip_x2 - OpenGL_state.clip_x1;
- *height = OpenGL_state.clip_y2 - OpenGL_state.clip_y1;
-}
-
-void rend_GetProjectionScreenParameters(int &screenLX, int &screenTY, int &screenW, int &screenH) {
- screenLX = OpenGL_state.clip_x1;
- screenTY = OpenGL_state.clip_y1;
- screenW = OpenGL_state.clip_x2 - OpenGL_state.clip_x1 + 1;
- screenH = OpenGL_state.clip_y2 - OpenGL_state.clip_y1 + 1;
-}
-
-// Returns the aspect ratio of the physical screen
-float rend_GetAspectRatio(void) {
- float aspect_ratio = (float)((3.0f * OpenGL_state.screen_width) / (4.0f * OpenGL_state.screen_height));
- return aspect_ratio;
-}
-
-// Given a source x,y and width,height, draws any sized bitmap into the renderer lfb
-void rend_DrawLFBBitmap(int sx, int sy, int w, int h, int dx, int dy, ushort *data, int rowsize) {}
-
-// given a chunked bitmap, renders it.
-void rend_DrawChunkedBitmap(chunked_bitmap *chunk, int x, int y, ubyte alpha) {
- int *bm_array = chunk->bm_array;
- int w = chunk->w;
- int h = chunk->h;
- int piece_w = bm_w(bm_array[0], 0);
- int piece_h = bm_h(bm_array[0], 0);
- int screen_w, screen_h;
- int i, t;
- rend_SetZBufferState(0);
- rend_GetProjectionParameters(&screen_w, &screen_h);
- for (i = 0; i < h; i++) {
- for (t = 0; t < w; t++) {
- int dx = x + (piece_w * t);
- int dy = y + (piece_h * i);
- int dw, dh;
- if ((dx + piece_w) > screen_w)
- dw = piece_w - ((dx + piece_w) - screen_w);
- else
- dw = piece_w;
- if ((dy + piece_h) > screen_h)
- dh = piece_h - ((dy + piece_h) - screen_h);
- else
- dh = piece_h;
-
- float u2 = (float)dw / (float)piece_w;
- float v2 = (float)dh / (float)piece_h;
- rend_DrawSimpleBitmap(bm_array[i * w + t], dx, dy);
- }
- }
- rend_SetZBufferState(1);
-}
-
-// given a chunked bitmap, renders it.scaled
-void rend_DrawScaledChunkedBitmap(chunked_bitmap *chunk, int x, int y, int neww, int newh, ubyte alpha) {
- int *bm_array = chunk->bm_array;
- int w = chunk->w;
- int h = chunk->h;
- int piece_w;
- int piece_h;
- int screen_w, screen_h;
- int i, t;
-
- float scalew, scaleh;
-
- scalew = ((float)neww) / ((float)chunk->pw);
- scaleh = ((float)newh) / ((float)chunk->ph);
- piece_w = scalew * ((float)bm_w(bm_array[0], 0));
- piece_h = scaleh * ((float)bm_h(bm_array[0], 0));
- rend_GetProjectionParameters(&screen_w, &screen_h);
- rend_SetOverlayType(OT_NONE);
- rend_SetLighting(LS_NONE);
- rend_SetColorModel(CM_MONO);
- rend_SetZBufferState(0);
- rend_SetAlphaType(AT_CONSTANT_TEXTURE);
- rend_SetAlphaValue(alpha);
- rend_SetWrapType(WT_WRAP);
- for (i = 0; i < h; i++) {
- for (t = 0; t < w; t++) {
- int dx = x + (piece_w * t);
- int dy = y + (piece_h * i);
- int dw, dh;
- if ((dx + piece_w) > screen_w)
- dw = piece_w - ((dx + piece_w) - screen_w);
- else
- dw = piece_w;
- if ((dy + piece_h) > screen_h)
- dh = piece_h - ((dy + piece_h) - screen_h);
- else
- dh = piece_h;
-
- float u2 = (float)dw / (float)piece_w;
- float v2 = (float)dh / (float)piece_h;
- rend_DrawScaledBitmap(dx, dy, dx + dw, dy + dh, bm_array[i * w + t], 0, 0, u2, v2);
- }
- }
- rend_SetZBufferState(1);
-}
-
-// Sets some global preferences for the renderer
-int rend_SetPreferredState(renderer_preferred_state *pref_state) {
- int retval = 1;
- renderer_preferred_state old_state = OpenGL_preferred_state;
-
- OpenGL_preferred_state = *pref_state;
- if (OpenGL_state.initted) {
- int reinit = 0;
- mprintf((0, "Inside pref state!\n"));
-
- // Change gamma if needed
- if (pref_state->width != OpenGL_state.screen_width || pref_state->height != OpenGL_state.screen_height ||
- old_state.bit_depth != pref_state->bit_depth) {
- reinit = 1;
- }
-
- if (reinit) {
- opengl_Close();
- retval = opengl_Init(NULL, &OpenGL_preferred_state);
- } else {
- if (old_state.gamma != pref_state->gamma) {
- opengl_SetGammaValue(pref_state->gamma);
- }
- }
- } else {
- OpenGL_preferred_state = *pref_state;
- }
-
- return retval;
-}
-
-// Sets the gamma for this display
-void rend_SetGammaValue(float val) {}
-
-// Draws a simple bitmap at the specified x,y location
-void rend_DrawSimpleBitmap(int bm_handle, int x, int y) {
- rend_SetAlphaType(AT_CONSTANT_TEXTURE);
- rend_SetAlphaValue(255);
- rend_SetLighting(LS_NONE);
- rend_SetColorModel(CM_MONO);
- rend_SetOverlayType(OT_NONE);
- rend_SetFiltering(0);
- rend_DrawScaledBitmap(x, y, x + bm_w(bm_handle, 0), y + bm_h(bm_handle, 0), bm_handle, 0, 0, 1, 1);
- rend_SetFiltering(1);
+int rend_ReInit() {
+ opengl_Close();
+ return opengl_Init(NULL, &gpu_preferred_state);
}
-// Fills in the passed in pointer with the current rendering state
-void rend_GetRenderState(rendering_state *rstate) { memcpy(rstate, &OpenGL_state, sizeof(rendering_state)); }
-
// Takes a bitmap and blits it to the screen using linear frame buffer stuff
// X and Y are the destination X,Y
void rend_CopyBitmapToFramebuffer(int bm_handle, int x, int y) {
@@ -3101,9 +2613,6 @@ void rend_SetFrameBufferCopyState(bool state) {
}
}
-// Changes the resolution of the renderer
-void rend_SetResolution(int width, int height) {}
-
// Gets OpenGL ready to work in a window
int rend_InitOpenGLWindow(oeApplication *app, renderer_preferred_state *pref_state) {
WindowGL = 1;
@@ -3129,30 +2638,6 @@ void rend_SetCoplanarPolygonOffset(float factor) {
}
}
-// Preuploads a texture to the video card
-void rend_PreUploadTextureToCard(int handle, int map_type) {}
-
-// Frees an uploaded texture from the video card
-void rend_FreePreUploadedTexture(int handle, int map_type) {}
-
-// Retrieves an error message
-const char *rend_GetErrorMessage() { return Renderer_error_message; }
-
-// Sets an error message
-void rend_SetErrorMessage(const char *str) {
- ASSERT(strlen(str) < 256);
- strcpy(Renderer_error_message, str);
-}
-
-// Returns 1 if there is mid video memory, 2 if there is low vid memory, or 0 if there is large vid memory
-int rend_LowVidMem(void) { return 0; }
-
-// Returns 1 if the renderer supports bumpmapping
-int rend_SupportsBumpmapping(void) { return 0; }
-
-// Sets a bumpmap to be rendered, or turns off bumpmapping altogether
-void rend_SetBumpmapReadyState(int state, int map) {}
-
// returns the direct draw object
void *rend_RetrieveDirectDrawObj(void **frontsurf, void **backsurf) {
*frontsurf = NULL;
@@ -3160,21 +2645,11 @@ void *rend_RetrieveDirectDrawObj(void **frontsurf, void **backsurf) {
return NULL;
}
-// returns rendering statistics for the frame
-void rend_GetStatistics(tRendererStats *stats) {
- if (Renderer_initted) {
- stats->poly_count = OpenGL_last_frame_polys_drawn;
- stats->vert_count = OpenGL_last_frame_verts_processed;
- stats->texture_uploads = OpenGL_last_uploaded;
- } else {
- memset(stats, 0, sizeof(tRendererStats));
- }
-}
-
void rend_TransformSetToPassthru(void) {
- int width = OpenGL_state.screen_width;
- int height = OpenGL_state.screen_height;
+ int width = gpu_state.screen_width;
+ int height = gpu_state.screen_height;
+ // TODO: Generalize
// Projection
dglMatrixMode(GL_PROJECTION);
dglLoadIdentity();
@@ -3189,7 +2664,7 @@ void rend_TransformSetToPassthru(void) {
}
void rend_TransformSetViewport(int lx, int ty, int width, int height) {
- dglViewport(lx, OpenGL_state.screen_height - (ty + height - 1), width, height);
+ dglViewport(lx, gpu_state.screen_height - (ty + height - 1), width, height);
}
void rend_TransformSetProjection(float trans[4][4]) {
diff --git a/renderer/dyna_gl.h b/renderer/dyna_gl.h
index 513e64ab9..21940841b 100644
--- a/renderer/dyna_gl.h
+++ b/renderer/dyna_gl.h
@@ -534,11 +534,6 @@ module *LoadOpenGLDLL(const char *dllname) {
module *LoadOpenGLDLL(const char *dllname);
-// ryan's add. 10/04/2000
-#ifdef __CHECK_FOR_TOO_SLOW_RENDERING__
- void setMinimumAcceptableRenderTime(int ms);
-#endif
-
#else
#endif
mprintf((0, "OpenGL dll loading successful.\n"));