Descent3/lib/renderer.h
2024-06-07 21:41:40 +02:00

691 lines
19 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/>.
--- HISTORICAL COMMENTS FOLLOW ---
* $Logfile: /DescentIII/Main/lib/renderer.h $
* $Revision: 80 $
* $Date: 4/19/00 5:22p $
* $Author: Matt $
*
* Header for renderer library
*
* $Log: /DescentIII/Main/lib/renderer.h $
*
* 80 4/19/00 5:22p Matt
* From Duane for 1.4
* Added extern
*
* 79 10/21/99 1:43p Kevin
* Mac Merge
*
* 78 9/18/99 9:22p Jeff
* Get/Set Alpha factor functions
*
* 77 8/10/99 10:51p Duane
* Added UseMipmap global
*
* 76 7/22/99 8:37p Jeff
* added texture upload to renderstats
*
* 75 7/15/99 6:38p Jeff
* created function to get rendering stats
*
* 74 4/01/99 10:56a Jason
* added better support for movie rendering
*
* 73 3/31/99 3:48p Jason
* changes for cinematics
*
* 72 3/29/99 7:29p Jason
* made renderer handle default resolution more gracefully
*
* 71 3/24/99 11:55a Jason
* added S3 texture compression
*
* 70 3/22/99 5:51p Jason
* enhancements to mirrors
*
* 69 1/29/99 6:29p Jason
* first pass at adding bumpmaps
*
* 68 1/22/99 1:09a Jason
* added vid mem checking
*
* 67 1/18/99 10:45a Samir
* added function to get DirectDraw object from Win32 apps.
*
* 66 12/23/98 5:35p Jason
* added saturated lightmap blending
*
* 65 12/18/98 5:25p Jason
* added specularity to mine walls
*
* 64 12/09/98 5:28p Jason
* added more options
*
* 63 12/08/98 2:29p Jason
* fog rendering changes for patch
*
* 62 10/21/98 9:28p Jason
* Made no lightmaps work globally
*
* 61 10/21/98 12:05p Jason
* changes for data paging
*
* 60 10/17/98 3:10p Jason
* added Set/Get error message stuff
*
* 59 10/08/98 3:36p Jason
* fixes for the demo
*
* 58 9/25/98 1:17a Jason
* added rend_SetCoplanarPolygonOffset functions
*
* 57 9/18/98 1:28p Jason
* cleaned up renderer initting
*
* 56 9/11/98 4:03p Jason
* added better multitexture support
*
* 55 6/11/98 3:38p Jason
* added a general StateLimit render boolean for APIs that are state
* limited (like OpenGL or D3D)
*
* 54 6/09/98 4:47p Jason
* added windowed openGL mode
*
* 53 5/26/98 3:59p Jason
* added LIGHTMAP_BLEND_CONSTANT alpha type
*
* 52 5/20/98 5:44p Jason
* incremental checkin for bumpmapping
*
* 51 5/19/98 12:27p Jason
* cleaned up some 3d stuff
*
* 50 5/06/98 1:39p Jason
* added rend_SetResolution
*
* 49 5/06/98 10:51a Jeff
* put rend_DrawScaledChunkBitmap back in the header
*
* 48 5/05/98 3:02p Jason
* attempting to add different screen resolutions
*
* 46 4/23/98 6:38p Jason
* made bitmaps use 1555 format
*
* 45 4/17/98 4:27p Jason
* added alpha per vertex stuff to drawscaledbitmap
*
* 44 4/08/98 12:27p Jason
* added rend_drawsimplebitmap
*
* 43 4/01/98 12:02p Jason
* incremental checkin for rendering changes
*
* 42 3/13/98 1:22p Jason
* Moved UseHardware flag to the renderer lib where it belongs
*
* 41 3/03/98 6:50p Jason
* added gamma stuff in preferred state
*
* 40 3/02/98 5:53p Jason
* added gamma functionality
*
* 39 2/14/98 10:48p Jason
* got preferred rendering working
*
* 38 2/12/98 1:32p Jason
* got mipmapping working
*
* 37 2/05/98 6:53p Jason
* added new weapon slot
*
* 36 2/03/98 3:16p Jason
* added the ability to specify saturation textures for models
*
* 35 1/28/98 5:37p Jason
* added streamer weapons
*
* 34 1/19/98 2:32p Jason
* added the ability to set clear flags on rend_StartFrame
*
* 33 1/16/98 11:54a Samir
* Added support for rendering chunked bitmaps.
*
* 32 1/15/98 6:32p Jason
* added v wrapping for sky textures
*
* 31 12/22/97 7:23p Samir
* took out transparent colors again.
*
* 30 12/22/97 7:15p Samir
* removed references of ddgr and gr.h. replace with grdefs.h
*
* 29 12/19/97 5:22p Samir
* Added more drawing primatives for software.
*
* 28 12/19/97 2:18p Jason
* fixed some more 2d/3d integration
*
* 27 12/19/97 12:20p Jason
* changes for better 2d/3d system integration
*
* 26 11/25/97 12:33p Jason
* added antialiasing mode
*
* 25 11/19/97 5:25p Jason
* added new alpha mode - AT_FLAT_BLEND
*
* 24 11/13/97 4:06p Jason
* added rend_DrawLFBBitmap
*
* 23 11/13/97 3:52p Jason
* added lfb stuff for renderer
*
* 22 10/29/97 12:36p Jason
* remove byte/bool conflicts in the renderer lib
*
* 21 10/24/97 4:39p Jason
* added support to not write into the zbuffer
*
* 20 10/24/97 2:29p Jason
* added alpha saturation type
*
* 19 10/22/97 4:19p Jason
* added smoke trail effects
*
* 18 10/15/97 5:20p Jason
* did a HUGE overhaul of the bitmap system
*
* 17 10/13/97 3:56p Jason
* made a better 3d bitmap system
*
* 16 9/16/97 4:09p Jason
* implemented software zbuffer
*
* 15 9/09/97 12:09p Jason
* took transparency out of texture_types
*
* 14 9/09/97 11:44a Jason
* changed the way alpha works with the renderer
*
* 13 9/04/97 5:52p Matt
* Took out include of 3d.h
*
* 12 8/29/97 11:59a Jason
* implemented screenshot functions
*
* 11 8/24/97 2:45p Jason
* implemented texture wrapping
*
* 10 8/07/97 11:46a Jason
* implemented tmap overlay system
*
* 9 8/06/97 11:43a Jason
* made lightmaps work correctly in the terrain
*
* 8 8/04/97 6:46p Jason
* added code for a lightmap system
*
* 7 8/04/97 3:28p Jason
* added alpha blending per texture
*
* 6 7/20/97 7:36p Jason
* added support for colored fog
*
* 2 6/24/97 7:45p Matt
* Removed include of manage.h
*
* 1 6/23/97 9:25p Samir
* added because source safe sucks
*
* 11 6/16/97 5:02p Jason
* added flip function
*
* 10 6/16/97 3:44p Jason
* added line drawing
*
* 9 6/16/97 2:54p Jason
* added rend_DrawFontCharacter function for drawing fonts
*
* 8 6/16/97 2:34p Jason
* added 3dfx support
*
* 7 6/06/97 11:35a Jason
* added missing functions for pixel primitives
*
* 6 6/03/97 12:19p Jason
* more functions added for opengl
*
* 5 5/27/97 4:39p Jason
* changes to support OpenGL
*
* 4 5/22/97 11:59a Jason
* add a ScaleBitmap function to the abstracted render library
*
* 3 5/21/97 12:30p Jason
* calls rend_start and rend_end when frames begin/end
*
* 2 5/19/97 5:10p Jason
* changes for our new abstracted renderer code
*
* 1 5/19/97 3:23p Jason
*
* $NoKeywords: $
*/
#ifndef RENDERER_H
#define RENDERER_H
#include <memory>
#include "pstypes.h"
#include "grdefs.h"
// Declare this here so we don't need to include 3d.h
typedef struct g3Point g3Point;
typedef struct chunked_bitmap chunked_bitmap;
// for rend_Init prototype
class oeApplication;
#define TEXTURE_WIDTH 128
#define TEXTURE_HEIGHT 128
#define TEXTURE_BPP 2
#define FLAT_SHADE_COLOR 0x7C01
// If an incoming texture has the above color in it, change that color to this color
#define REPLACEMENT_COLOR 0x07C0
extern int Triangles_drawn;
// Is this hardware or software rendered?
enum renderer_type {
RENDERER_SOFTWARE_8BIT,
RENDERER_SOFTWARE_16BIT,
RENDERER_OPENGL = 2,
RENDERER_DIRECT3D = 3,
RENDERER_GLIDE = 4,
RENDERER_NONE = 5,
};
extern renderer_type Renderer_type;
// renderer clear flags
#define RF_CLEAR_ZBUFFER 1
#define RF_CLEAR_COLOR 2
// Overlay texture settings
#define OT_NONE 0 // No overlay
#define OT_BLEND 1 // Draw a lightmap texture afterwards
#define OT_REPLACE 2 // Draw a tmap2 style texture afterwards
#define OT_FLAT_BLEND 3 // Draw a gouraud shaded polygon afterwards
#define OT_BLEND_VERTEX 4 // Like OT_BLEND, but take constant alpha into account
#define OT_BUMPMAP 5 // Draw a saturated bumpmap afterwards
#define OT_BLEND_SATURATE 6 // Add a lightmap in
extern uint8_t Overlay_type;
extern int Overlay_map;
extern int Bumpmap_ready, Bump_map;
extern float Z_bias;
extern bool UseHardware;
extern bool StateLimited;
extern bool NoLightmaps;
extern bool UseMultitexture;
extern bool UseWBuffer;
extern bool UseMipmap; // DAJ
extern bool ATIRagePro; // DAJ
extern bool Formac; // DAJ
class NewBitmap;
// various state setting functions
//------------------------------------
// Sets our renderer
void rend_SetRendererType(renderer_type state);
#define MAP_TYPE_BITMAP 0
#define MAP_TYPE_LIGHTMAP 1
#define MAP_TYPE_BUMPMAP 2
#define MAP_TYPE_UNKNOWN 3
// lighting state
enum light_state {
LS_NONE, // no lighting, fully lit rendering
LS_GOURAUD, // Gouraud shading
LS_PHONG, // Phong shading
LS_FLAT_GOURAUD // Take color from flat color
};
void rend_SetLighting(light_state);
enum color_model {
CM_MONO, // monochromatic (intensity) model - default
CM_RGB, // RGB model
};
// color model
void rend_SetColorModel(color_model);
enum texture_type {
TT_FLAT, // solid color
TT_LINEAR, // textured linearly
TT_PERSPECTIVE, // texture perspectively
TT_LINEAR_SPECIAL, // A textured polygon drawn as a flat color
TT_PERSPECTIVE_SPECIAL, // A textured polygon drawn as a flat color
};
// Alpha type flags - used to decide what type of alpha blending to use
#define ATF_CONSTANT 1 // Take constant alpha into account
#define ATF_TEXTURE 2 // Take texture alpha into account
#define ATF_VERTEX 4 // Take vertex alpha into account
// Alpha types
#define AT_ALWAYS 0 // Alpha is always 255 (1.0)
#define AT_CONSTANT 1 // constant alpha across the whole image
#define AT_TEXTURE 2 // Only uses texture alpha
#define AT_CONSTANT_TEXTURE 3 // Use texture * constant alpha
#define AT_VERTEX 4 // Use vertex alpha only
#define AT_CONSTANT_VERTEX 5 // Use vertex * constant alpha
#define AT_TEXTURE_VERTEX 6 // Use texture * vertex alpha
#define AT_CONSTANT_TEXTURE_VERTEX 7 // Use all three (texture constant vertex)
#define AT_LIGHTMAP_BLEND 8 // dest*src colors
#define AT_SATURATE_TEXTURE 9 // Saturate up to white when blending
#define AT_FLAT_BLEND 10 // Like lightmap blend, but uses gouraud shaded flat polygon
#define AT_ANTIALIAS 11 // Draws an antialiased polygon
#define AT_SATURATE_VERTEX 12 // Saturation with vertices
#define AT_SATURATE_CONSTANT_VERTEX 13 // Constant*vertex saturation
#define AT_SATURATE_TEXTURE_VERTEX 14 // Texture * vertex saturation
#define AT_LIGHTMAP_BLEND_VERTEX 15 // Like AT_LIGHTMAP_BLEND, but take vertex alpha into account
#define AT_LIGHTMAP_BLEND_CONSTANT 16 // Like AT_LIGHTMAP_BLEND, but take constant alpha into account
#define AT_SPECULAR 32
#define AT_LIGHTMAP_BLEND_SATURATE 33 // Light lightmap blend, but add instead of multiply
#define LFB_LOCK_READ 0
#define LFB_LOCK_WRITE 1
enum wrap_type {
WT_WRAP, // Texture repeats
WT_CLAMP, // Texture clamps
WT_WRAP_V // Texture wraps in v
};
struct rendering_state {
int8_t initted;
int8_t cur_bilinear_state;
int8_t cur_zbuffer_state;
int8_t cur_fog_state;
int8_t cur_mip_state;
texture_type cur_texture_type;
color_model cur_color_model;
light_state cur_light_state;
int8_t cur_alpha_type;
wrap_type cur_wrap_type;
float cur_fog_start, cur_fog_end;
float cur_near_z, cur_far_z;
float gamma_value;
int cur_alpha;
ddgr_color cur_color;
ddgr_color cur_fog_color;
int8_t cur_texture_quality; // 0-none, 1-linear, 2-perspective
int clip_x1, clip_x2, clip_y1, clip_y2;
int screen_width, screen_height;
};
struct renderer_preferred_state {
uint8_t mipping;
uint8_t filtering;
float gamma;
uint8_t bit_depth;
int width, height;
uint8_t vsync_on;
};
struct renderer_lfb {
int type;
uint16_t *data;
int bytes_per_row;
};
struct tRendererStats {
int poly_count;
int vert_count;
int texture_uploads;
};
// returns rendering statistics for the frame
void rend_GetStatistics(tRendererStats *stats);
void rend_SetTextureType(texture_type);
// Given a handle to a bitmap and nv point vertices, draws a 3D polygon
void rend_DrawPolygon3D(int handle, g3Point **p, int nv, int map_type = MAP_TYPE_BITMAP);
// Given a handle to a bitmap and nv point vertices, draws a 2D polygon
void rend_DrawPolygon2D(int handle, g3Point **p, int nv);
// Tells the software renderer whether or not to use mipping
void rend_SetMipState(int8_t);
// Sets the fog state to TRUE or FALSE
void rend_SetFogState(int8_t on);
// Sets the near and far plane of fog
void rend_SetFogBorders(float fog_near, float fog_far);
// Sets the color for fill based primitives;
void rend_SetFlatColor(ddgr_color color);
// Tells the renderer we're starting a frame. Clear flags tells the renderer
// what buffer (if any) to clear
void rend_StartFrame(int x1, int y1, int x2, int y2, int clear_flags = RF_CLEAR_ZBUFFER);
// Tells the renderer the frame is over
void rend_EndFrame();
// Init our renderer, pass the application object also.
int rend_Init(renderer_type state, oeApplication *app, renderer_preferred_state *pref_state);
// de-init the renderer
void rend_Close();
// Draws a scaled 2d bitmap to our buffer
// NOTE: scripts are expecting the old prototype that has a zvalue (which is ignored) before color
void rend_DrawScaledBitmap(int x1, int y1, int x2, int y2, int bm, float u0, float v0, float u1, float v1,
int color = -1, float *alphas = NULL);
// Sets the state of bilinear filtering for our textures
void rend_SetFiltering(int8_t state);
// Sets the state of zbuffering to on or off
void rend_SetZBufferState(int8_t state);
// Sets the near and far planes for z buffer
void rend_SetZValues(float nearz, float farz);
// Sets a bitmap as an overlay to rendered on top of the next texture map
void rend_SetOverlayMap(int handle);
// Sets the type of overlay operation
void rend_SetOverlayType(uint8_t type);
// Clears the display to a specified color
void rend_ClearScreen(ddgr_color color);
// Fills a rectangle on the display
void rend_FillRect(ddgr_color color, int x1, int y1, int x2, int y2);
// Sets a pixel on the display
void rend_SetPixel(ddgr_color color, int x, int y);
// Sets a pixel on the display
ddgr_color rend_GetPixel(int x, int y);
// 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);
// Draws a line
void rend_DrawLine(int x1, int y1, int x2, int y2);
// Draws spheres
void rend_FillCircle(ddgr_color col, int x, int y, int rad);
// draws circles
void rend_DrawCircle(int x, int y, int rad);
// Flips the surface
void rend_Flip();
// 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);
// Sets the color of fog
void rend_SetFogColor(ddgr_color fogcolor);
// sets the alpha type
void rend_SetAlphaType(int8_t);
// Sets the constant alpha value
void rend_SetAlphaValue(uint8_t val);
// Sets the overall alpha scale factor (all alpha values are scaled by this value)
// usefull for motion blur effect
void rend_SetAlphaFactor(float val);
// Returns the current Alpha factor
float rend_GetAlphaFactor(void);
// Sets the wrap parameter
void rend_SetWrapType(wrap_type val);
/// Takes a screenshot of the current frame and returns a NewBitmap
std::unique_ptr<NewBitmap> rend_Screenshot();
// Takes a screenshot of the current frame and puts it into the handle passed
void rend_Screenshot(int bm_handle);
// Adds a bias to each coordinates z value. This is useful for making 2d bitmaps
// get drawn without being clipped by the zbuffer
void rend_SetZBias(float z_bias);
// Enables/disables writes the depth buffer
void rend_SetZBufferWriteMask(int state);
// Sets where the software renderer should write to
void rend_SetSoftwareParameters(float aspect, int width, int height, int pitch, uint8_t *framebuffer);
// Fills in some variables so the 3d math routines know how to project
void rend_GetProjectionParameters(int *width, int *height);
void rend_GetProjectionScreenParameters(int &screenLX, int &screenTY, int &screenW, int &screenH);
// Returns the aspect ratio of the physical screen
float rend_GetAspectRatio();
// Gets a pointer to a linear frame buffer
void rend_GetLFBLock(renderer_lfb *lfb);
// Releases an lfb lock
void rend_ReleaseLFBLock(renderer_lfb *lfb);
// 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, uint16_t *data, int rowsize);
// given a chunked bitmap, renders it.
void rend_DrawChunkedBitmap(chunked_bitmap *chunk, int x, int y, uint8_t alpha);
// given a chunked bitmap, renders it.scaled
void rend_DrawScaledChunkedBitmap(chunked_bitmap *chunk, int x, int y, int neww, int newh, uint8_t alpha);
// Draws a line using the states of the renderer
void rend_DrawSpecialLine(g3Point *p0, g3Point *p1);
// Sets some global preferences for the renderer
// Returns -1 if it had to use the default resolution/bitdepth
int rend_SetPreferredState(renderer_preferred_state *pref_state);
// Sets the gamma value
void rend_SetGammaValue(float val);
// Fills in the passed in pointer with the current rendering state
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);
// Gets OpenGL ready to work in a window
int rend_InitOpenGLWindow(oeApplication *app, renderer_preferred_state *pref_state);
// Shuts down OpenGL in a window
void rend_CloseOpenGLWindow();
// Sets the state of the OpenGLWindow to on or off
void rend_SetOpenGLWindowState(int state, oeApplication *app, renderer_preferred_state *pref_state);
// Sets the hardware bias level for coplanar polygons
// This helps reduce z buffer artifaces
void rend_SetCoplanarPolygonOffset(float factor);
// Gets the error message string
const char *rend_GetErrorMessage();
// Sets the error message string
void rend_SetErrorMessage(const char *str);
// Preuploads a bitmap to the card
void rend_PreUploadTextureToCard(int, int);
void rend_FreePreUploadedTexture(int, int);
// 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();
// Returns 1 if the renderer supports bumpmapping
int rend_SupportsBumpmapping();
// Gets a bumpmap ready for drawing, or turns off bumpmapping
void rend_SetBumpmapReadyState(int state, int map);
// Clears the zbuffer
void rend_ClearZBuffer();
// Clears the texture cache
void rend_ResetCache();
// 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);
// Gets a renderer ready for a framebuffer copy, or stops a framebuffer copy
void rend_SetFrameBufferCopyState(bool state);
#if defined(WIN32)
// returns the direct draw object
void *rend_RetrieveDirectDrawObj(void **frontsurf, void **backsurf);
#endif
#endif