Descent3/lib/rend_opengl.h
Ryan C. Gordon 393a39b709
opengl: use SDL_WINDOW_FULLSCREEN_DESKTOP and an FBO.
This now renders to an OpenGL Framebuffer Object at the game's resolution,
and blits it to the window at whatever resolution it is currently using,
scaling and letterboxing if necessary.

Which is to say: display resolutions are now imaginary, and we never change
the physical display mode now. A smaller resolution is simply drawing less
pixels and scaling them up with the GPU for display. This solves a few
problems: no more resizing background windows or desktop icons shuffling
around, no more being stuck in a weird resolution when debugging or if the
game crashes, no more waiting on monitors to click over to a new mode, and
no more weird rendering when the display didn't exactly support the requested
mode.

This also means the game doesn't have to drop down to 640x480 for the config
menu screen when it was otherwise using some other resolution.

Some caveats:

- This _requires_ OpenGL Framebuffer Object support; there is currently no
fallback if it's missing and the game will refuse to start. But any desktop
hardware of the last ~20 years should support it. For weird embedded things
or whatnot, it will be possible to add a fallback.

- This currently requires SDL. The OpenGL pieces should work on Windows, but
someone would need to adjust the existing win32 code to create a fullscreen
window and not change the physical display mode. It should still compile on
windows and work as before (untested by me, though).

- This is only OpenGL; it does not touch the Direct3D renderer, which should
continue to work as before (again, untested by me).
2024-06-14 03:56:49 -04:00

161 lines
4.6 KiB
C++

/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef REND_OPENGL_H
#define REND_OPENGL_H
#include "renderer.h"
#include "3d.h"
class oeApplication;
// Starts up opengl
int opengl_Init(oeApplication *app, renderer_preferred_state *pref_state);
// Closes down opengl
void opengl_Close(const bool just_resizing=false);
void opengl_Shutdown();
// The main drawing function...draws a flat/textured/gouraud polygon
void opengl_DrawPolygon(int, g3Point **, int, int);
void opengl_SetFlatColor(ddgr_color color);
// Ends a frame
void opengl_EndFrame();
// Flips the screen
void opengl_Flip();
// Does setup for a new frame
void opengl_BeginFrame(int, int, int, int, int);
// Tells opengl what kind of texturing (linear/perspective) we want
void opengl_SetTextureType(texture_type);
// Sets the lighting state of opengl
void opengl_SetLightingState(light_state state);
// Sets the opengl color model (either rgb or mono)
void opengl_SetColorModel(color_model state);
// Sets the state of bilinear filtering for our textures
void opengl_SetFiltering(int8_t state);
// Sets the state of zbuffering to on or off
void opengl_SetZBufferState(int8_t state);
// Sets the near/far z values for zbuffering
void opengl_SetZValues(float nearz, float farz);
// Sets a bitmap as a lightmap to rendered on top of the next texture map
// a -1 value indicates no lighting map
void opengl_SetLightingMap(int handle);
// Clears the display to a specified color
void opengl_ClearScreen(ddgr_color color);
// Fills a rectangle on the display
void opengl_FillRect(ddgr_color color, int x1, int y1, int x2, int y2);
// Sets a pixel on the display
void opengl_SetPixel(ddgr_color color, int x, int y);
// Sets the near and far plane of fog
void opengl_SetFogBorders(float nearz, float farz);
// Sets the fog state to on or off
void opengl_SetFogState(int8_t state);
// Fills in projection variables
void opengl_GetProjectionParameters(int *width, int *height);
void opengl_GetProjectionScreenParameters(int &screenLX, int &screenTY, int &screenW, int &screenH);
// Returns the aspect ratio of the physical screen
float opengl_GetAspectRatio();
// Sets texture wrapping type
void opengl_SetWrapType(wrap_type val);
// Sets the constant alpha value
void opengl_SetAlphaValue(uint8_t val);
// Sets the overall alpha scale factor (all alpha values are scaled by this value)
// usefull for motion blur effect
void opengl_SetAlphaFactor(float val);
// Returns the current Alpha factor
float opengl_GetAlphaFactor(void);
// Sets the type of alpha blending you want
void opengl_SetAlphaType(int8_t atype);
// Sets whether or not to write into the zbuffer
void opengl_SetZBufferWriteMask(int state);
// Gets the current state of the renderer
void opengl_GetRenderState(rendering_state *rstate);
// draws a line
void opengl_DrawLine(int x1, int y1, int x2, int y2);
// draws a line
void opengl_DrawSpecialLine(g3Point *p0, g3Point *p1);
// Sets the color that opengl uses for fog
void opengl_SetFogColor(ddgr_color color);
// Sets the coplanar z bias for rendered polygons
void opengl_SetCoplanarPolygonOffset(float factor);
// Sets up a some global preferences for openGL
int opengl_SetPreferredState(renderer_preferred_state *pref_state);
// Sets the gamma correction value
void opengl_SetGammaValue(float val);
// Takes a screenshot of the frontbuffer and puts it into the passed bitmap handle
void opengl_Screenshot(int bm_handle);
// Returns the pixel color at x,y
ddgr_color opengl_GetPixel(int, int);
// Clears the zbuffer
void opengl_ClearZBuffer();
// Clears the texture cache
void opengl_ResetCache();
// Takes a bitmap and blits it to the screen using linear frame buffer stuff
// X and Y are the destination X,Y
void opengl_CopyBitmapToFramebuffer(int bm_handle, int x, int y);
// Gets a renderer ready for a framebuffer copy, or stops a framebuffer copy
void opengl_SetFrameBufferCopyState(bool state);
#if defined(WIN32)
// returns directdraw object
void *opengl_DirectDrawObj();
#endif
// returns rendering statistics for the frame
void opengl_GetStatistics(tRendererStats *stats);
#endif