Descent3/renderer/renderer.cpp

2415 lines
49 KiB
C++
Raw Normal View History

2024-04-16 03:43:29 +00:00
/*
* $Logfile: /DescentIII/Main/renderer/renderer.cpp $
* $Revision: 125 $
* $Date: 4/19/00 5:24p $
* $Author: Matt $
*
* Renderer abstraction layer
*
* $Log: /DescentIII/Main/renderer/renderer.cpp $
*
* 125 4/19/00 5:24p Matt
* From Duane for 1.4
* Removed ATI flag
*
* 124 3/20/00 12:31p Matt
* Merge of Duane's post-1.3 changes.
* Removed defines for Mac.
*
* 123 10/21/99 3:18p Kevin
* Mac Merge
*
* 122 9/18/99 9:26p Jeff
* added alpha factor (for overriding all alpha on polygons drawn)
*
* 121 7/29/99 2:01p Kevin
*
* 120 7/29/99 12:31p Kevin
* Mac merge fixes
*
* 119 7/28/99 2:06p Kevin
* Macintosh Changes
*
* 118 7/15/99 6:38p Jeff
* created function to get rendering stats
*
* 117 6/24/99 8:13p Jeff
* OpenGL added for Linux
*
* 116 6/22/99 7:04p Jeff
* added Glide support for Linux
*
* 115 5/13/99 3:47p Ardussi
* changes for compiling on the Mac
*
* 114 5/04/99 4:34p Jason
* changes for bumpmapping
*
* 113 5/01/99 9:26p Kevin
* ifdef should have been ifndef
*
* 112 5/01/99 4:56p Kevin
* made critical renderer code do nothing in DEDICATED_ONLY builds
*
* 111 4/16/99 6:45p Kevin
* removed ifdef demo
*
* 110 4/16/99 3:22a Jeff
* added ifdefs to specify what renderers to compile in (initially for
* linux use)
*
* 109 4/14/99 1:44a Jeff
* fixed case mismatched #includes
*
* 108 4/13/99 4:59p Jason
* changes for font renderings
*
* 107 4/02/99 3:02p Samir
* rend_RetrieveDDrawProps modified so renderer none works.
*
* 106 4/01/99 10:56a Jason
* added better support for movie rendering
*
* 105 3/31/99 3:48p Jason
* changes for cinematics
*
* 104 3/30/99 3:39p Jason
* fixed some fog issues
*
* 103 3/29/99 7:29p Jason
* made renderer handle default resolution more gracefully
*
* 102 3/24/99 11:55a Jason
* added S3 texture compression
*
* 101 3/22/99 5:51p Jason
* enhancements to mirrors
*
* 100 3/02/99 6:03p Jason
* fixed opengl problem
*
* 99 2/26/99 3:32p Jason
* made OpenGL/D3D not work with Voodoo3 OEM
*
* 98 2/17/99 1:05p Jason
* revamped object/face/terrain selection code
*
* 97 2/16/99 11:36a Jason
* fixed up some FindArg stuff
*
* 96 2/15/99 3:47p Jason
* added screenshots to opengl
*
* 95 2/06/99 10:34p Jason
* added renderer error message if no renderer is set
*
* 94 1/29/99 6:29p Jason
* first pass at adding bumpmaps
*
* 93 1/22/99 1:08a Jason
* added vid mem checking
*
* 92 1/18/99 10:45a Samir
* added function to get DirectDraw object from Win32 apps.
*
* 91 12/08/98 2:30p Jason
* fog rendering changes for patch
*
* 90 12/03/98 5:02p Jason
* made glide work good with 128x128 lightmaps
*
* 89 11/30/98 2:27p Jason
* more opengl fixes
*
* 88 11/30/98 12:03p Jason
* fixed some opengl issues
*
* 87 11/30/98 11:15a Jason
* fixed some renderer issues for the demo patch
*
* 86 11/19/98 6:55p Jason
* hurray! Fixed TNT problems with Direct3d
*
* 85 11/11/98 2:07p Jason
* added direct3d screenshots
*
* 84 10/22/98 10:31a Sean
* fixed lighting in a window with opengl
*
* 83 10/22/98 12:27a Sean
* put breaks in switch statements
*
* 82 10/21/98 9:28p Jason
* Made no lightmaps work globally
*
* 81 10/21/98 12:06p Jason
* changes for data paging
*
* 80 10/17/98 2:46p Jason
* better error string reports
*
* 79 10/14/98 6:28p Jason
* added Coplanar polygon stuff
*
* 78 10/12/98 7:20p Jason
* fixed gamma for direct3d
*
* 77 10/08/98 3:36p Jason
* fixes for the demo
*
* 76 9/25/98 9:25p Jason
* did some graphics optimizations
*
* 75 9/25/98 1:17a Jason
* added rend_SetCoplanarPolygonOffset functions
*
* 74 9/24/98 12:57p Jason
* more state limited optimizations
*
* 73 9/18/98 1:28p Jason
* cleaned up renderer initting
*
* 72 9/15/98 12:11p Jason
* made special lines work in opengl
*
* 71 9/11/98 4:03p Jason
* added better multitexture support
*
* 70 9/08/98 5:20p Jason
* more state changing optimizations
*
* 69 9/02/98 5:41p Jason
* adding lightmaps back to opengl
*
* 68 9/02/98 2:26p Jason
* changes for state limiting
*
* 67 8/31/98 5:30p Jason
* first pass at textures with Direct3d
*
* 66 7/16/98 2:30p Jason
* added first pass at Direct3D support
*
* 65 6/11/98 3:38p Jason
* added a general StateLimit render boolean for APIs that are state
* limited (like OpenGL or D3D)
*
* 64 6/10/98 1:08p Jason
* Fixed yet more OpenGL bugs
*
* 63 6/10/98 12:23p Jason
* fixed some more bugs with windowed opengl
*
* 62 6/09/98 7:32p Jason
* fixed windowed OpenGl bug
*
* 61 6/09/98 6:16p Jason
* added some features for windowed opengl
*
* 60 6/09/98 4:47p Jason
* added windowed openGL mode
*
* 59 5/20/98 5:44p Jason
* incremental checkin for bumpmapping
*
* 58 5/19/98 2:23p Jeff
* put in the rend_SetZBufferState(0) into DrawChunkedBitmap
*
* 57 5/18/98 7:07p Jeff
* rend_DrawChunkBitmap now calls rend_DrawSimpleBitmap instead of
* rend_DrawScaledBitmap
*
* 56 5/11/98 6:14p Jason
* some minor fixes for opengl
*
* 55 5/06/98 1:39p Jason
* added rend_SetResolution
*
* 54 5/05/98 3:02p Jason
* attempting to add different screen resolutions
*
* 53 5/05/98 1:01p Jeff
* Added a rend_DrawScaledChunkBitmap
*
* 52 4/23/98 6:38p Jason
* made bitmaps use 1555 format
*
* 51 4/17/98 4:27p Jason
* added alpha per vertex stuff to drawscaledbitmap
*
* 50 4/18/98 3:25a Samir
* changed some flag in rend_DrawChunkedBitmap
*
* 49 4/08/98 3:07p Jeff
* changed the zvalue parameter within DrawSimpleBitmap
*
* 48 4/08/98 12:27p Jason
* added rend_drawsimplebitmap
*
* 47 4/01/98 12:02p Jason
* incremental checkin for rendering changes
*
* 46 3/13/98 1:22p Jason
* Moved UseHardware flag to the renderer lib where it belongs
*
* 45 3/02/98 5:53p Jason
* added gamma functionality
*
* 44 2/27/98 4:46p Jason
* added more opengl support
*
* 43 2/26/98 11:00a Jason
* incremental opengl functionality
*
* 42 2/17/98 2:02p Jason
* fixed clamping bug for chunked bitmaps
*
* 41 2/16/98 11:43a Jason
* more opengl stuff
*
* 40 2/14/98 10:48p Jason
* got preferred rendering working
*
* 39 2/13/98 3:56p Jason
* added much better opengl support
*
* 38 2/12/98 1:32p Jason
* got mipmapping working
*
* 37 1/28/98 5:37p Jason
* added streamer weapons
*
* 36 1/28/98 12:54p Jason
* made renderer auto shutdown on program close
*
*
* 35 1/19/98 2:32p Jason
* added the ability to set clear flags on rend_StartFrame
*
* 34 1/16/98 11:54a Samir
* Added support for rendering chunked bitmaps.
*
* 33 1/14/98 5:49p Jeff
* tex_LFBLock stuff added (samir.)
*
* 32 12/29/97 5:51p Samir
* rend_Flip should call ddvid_Flip for software flip.
*
* 31 12/22/97 7:34p Samir
* Removed instances of gr.h include. Replaced with grdefs.h
*
* 30 12/19/97 5:22p Samir
* Added more drawing primatives for software.
*
* 29 12/19/97 2:36p Jason
* more fixes for 2d/3d integration
*
* 28 12/19/97 12:20p Jason
* changes for better 2d/3d system integration
*
* 27 11/14/97 3:44p Jason
* added transparency to blitting function
*
* 26 11/13/97 4:06p Jason
* added rend_DrawLFBBitmap
*
* 25 11/13/97 3:52p Jason
* added lfb stuff for renderer
*
* 24 10/29/97 12:36p Jason
* remove byte/bool conflicts in the renderer lib
*
* 23 10/24/97 4:39p Jason
* added support to not write into the zbuffer
*
* 22 10/22/97 5:01p Jason
* added rend_SetZBias
*
* 21 10/20/97 4:46p Jason
* changes for explosions
*
* 20 10/13/97 3:56p Jason
* made a better 3d bitmap system
*
* 19 9/16/97 6:23p Jason
* took out software z buffer from rend_SetZBuffer
*
* 18 9/16/97 4:09p Jason
* implemented software zbuffer
*
* 17 9/09/97 12:34p Jason
* made software transparency work correctly with new alpha type
*
* 16 9/09/97 11:45a Jason
* changed the way alpha works with the renderer
*
* 15 8/29/97 5:42p Jason
* fixed hud rendering problems
*
* 14 8/29/97 11:59a Jason
* implemented screenshot functions
*
* 13 8/24/97 2:45p Jason
* implemented texture wrapping
*
* 12 8/07/97 11:46a Jason
* implemented tmap overlay system
*
* 11 8/04/97 6:46p Jason
* added code for a lightmap system
*
* 10 8/04/97 3:28p Jason
* added alpha blending per texture
*
* 9 7/20/97 7:36p Jason
* added support for colored fog
*
* 8 7/18/97 12:57p Jason
* added line drawing for glide
*
* 13 6/16/97 5:02p Jason
* added flip function
*
* 12 6/16/97 3:44p Jason
* added line drawing
*
* 11 6/16/97 2:54p Jason
* added rend_DrawFontCharacter function for drawing fonts
*
* 10 6/16/97 2:34p Jason
* added 3dfx support
*
* 9 6/06/97 11:35a Jason
* added missing functions for pixel primitives
*
* 8 6/03/97 12:19p Jason
* more functions added for opengl
*
* 7 5/29/97 6:26p Jason
* incremental changes for opengl/lighting support
*
* 6 5/27/97 4:39p Jason
* changes to support OpenGL
*
* 5 5/22/97 11:59a Jason
* add a ScaleBitmap function to the abstracted render library
*
* 4 5/21/97 7:35p Matt
* Move Current_surface & viewport locking from 3D to renderer library
*
* $NoKeywords: $
*/
#include "renderer.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "ddvid.h"
#include "pstypes.h"
#include "mono.h"
#include "pserror.h"
#include "ddio.h"
#include "bitmap.h"
#include "application.h"
#include "3d.h"
//Renderers for Windows version. Mac gets these through a global include file.
#if defined(WIN32)
#define USE_OPENGL
//#define USE_GLIDE
#define USE_D3D
//#define USE_SOFTWARE
#endif
//Renderers for Linux version
#if defined(__LINUX__)
#define USE_OPENGL
#define USE_GLIDE
//#define USE_D3D
//#define USE_SOFTWARE
#endif
#ifdef USE_SOFTWARE
#include "texture.h"
#endif
#ifdef USE_OPENGL
#include "rend_opengl.h"
#endif
#ifdef USE_GLIDE
#include "rend_glide.h"
#endif
#ifdef USE_D3D
#include "rend_d3d.h"
#endif
extern int FindArg(char *);
#ifdef USE_OPENGL
int OpenGL_window_initted=0;
#endif
// 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";
int Triangles_drawn=0;
bool UseHardware=0;
bool NoLightmaps=0;
bool StateLimited=0;
bool UseMultitexture=0;
bool UseWBuffer=0;
int Overlay_map=-1;
int Bump_map=0,Bumpmap_ready=0;
ubyte Overlay_type=OT_NONE;
float Z_bias=0.0;
ubyte Renderer_close_flag=0,Renderer_initted=0;
// Is this hardware or software rendered?
renderer_type Renderer_type=RENDERER_SOFTWARE_16BIT;
// Tells the software renderer whether or not to use mipping
void rend_SetMipState (sbyte mipstate)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_SetMipState (mipstate);
#endif
break;
case RENDERER_OPENGL:
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetMipState (mipstate);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetMipState (mipstate);
#endif
break;
default:
Int3();
break;
}
}
void rend_SetInitOptions ()
{
switch (Renderer_type)
{
case RENDERER_DIRECT3D:
/*
//#ifdef DEMO
if (UseMultitexture)
{
if (!FindArg("-forcelightmaps"))
UseMultitexture=0;
}
NoLightmaps=true;
//#endif
*/
break;
default:
break;
}
if (FindArg("-forcelightmaps"))
NoLightmaps=false;
if (FindArg("-nolightmaps"))
{
NoLightmaps=true;
UseMultitexture=false;
}
if (FindArg ("-NoMultitexture"))
UseMultitexture=false;
}
// Init our renderer
int rend_Init (renderer_type state, oeApplication *app,renderer_preferred_state *pref_state)
{
#ifndef DEDICATED_ONLY
int retval=0;
rend_SetRendererType (state);
if (!Renderer_initted)
{
if (!Renderer_close_flag)
{
atexit (rend_Close);
Renderer_close_flag=1;
}
Renderer_initted=1;
}
#ifdef USE_OPENGL
if (OpenGL_window_initted)
{
rend_CloseOpenGLWindow ();
OpenGL_window_initted=0;
}
#endif
mprintf ((0,"Renderer init is set to %d\n",Renderer_initted));
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
NoLightmaps=false;
UseHardware=0;
StateLimited=0;
UseMultitexture=0;
UseWBuffer=0;
#ifdef USE_SOFTWARE
retval=tex_Init ();
#endif
break;
case RENDERER_OPENGL:
{
NoLightmaps=false;
UseHardware=1;
StateLimited=1;
UseMultitexture=0;
UseWBuffer=0;
#ifndef OEM_V3
int flags = app->flags();
if( flags & OEAPP_WINDOWED )
{
// initialize for windowed
retval = rend_InitOpenGLWindow( app, pref_state );
}
else
{
// initialize for full screen
retval=opengl_Init (app,pref_state);
}
#endif
}break;
case RENDERER_GLIDE:
NoLightmaps=false;
UseHardware=1;
StateLimited=0;
UseMultitexture=0;
UseWBuffer=1;
#ifdef USE_GLIDE
retval=glide_Init (app,pref_state);
#endif
break;
case RENDERER_DIRECT3D:
NoLightmaps=false;
UseHardware=1;
StateLimited=1;
UseMultitexture=0;
UseWBuffer=0;
#ifdef USE_D3D
#ifndef OEM_V3
retval= d3d_Init (app,pref_state);
#endif
#endif
break;
default:
rend_SetErrorMessage ("No renderer set. Make sure you have run the game from the launcher.");
retval=0;
break;
}
if (retval!=0)
rend_SetInitOptions();
return retval;
#else
return 0;
#endif //#ifdef DEDICATED_ONLY
}
void rend_Close ()
{
mprintf ((0,"CLOSE:Renderer init is set to %d\n",Renderer_initted));
if (!Renderer_initted)
return;
#ifdef USE_OPENGL
if (OpenGL_window_initted)
{
if (Renderer_type!=RENDERER_OPENGL)
rend_CloseOpenGLWindow ();
OpenGL_window_initted=0;
}
#endif
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_Close();
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_Close();
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_Close ();
#endif
break;
default:
Int3();
break;
}
Renderer_initted=0;
}
// Given nv points, draws that polygon according to the various state variables
// Handle is a bitmap handle
void rend_DrawPolygon (int handle,g3Point **p,int nv,int map_type)
{
#ifndef DEDICATED_ONLY
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_DrawPointList (handle,p,nv);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_DrawPolygon (handle,p,nv,map_type);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_DrawPolygon (handle,p,nv,map_type);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_DrawPolygon (handle,p,nv,map_type);
#endif
break;
default:
Int3();
break;
}
#endif //#ifdef DEDICATED_ONLY
}
void rend_SetFlatColor (ddgr_color color)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_SetFlatColor (color);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetFlatColor(color);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetFlatColor(color);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetFlatColor(color);
#endif
break;
default:
Int3();
break;
}
}
// Sets the fog state to TRUE or FALSE
void rend_SetFogState (sbyte on)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_SetFogState (on);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetFogState (on);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetFogState (on);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetFogState (on);
#endif
break;
default:
Int3();
break;
}
}
// Sets the near and far plane of fog
void rend_SetFogBorders (float fog_near,float fog_far)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_SetFogBorders (fog_near,fog_far);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetFogBorders (fog_near,fog_far);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetFogBorders (fog_near,fog_far);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetFogBorders (fog_near,fog_far);
#endif
break;
default:
Int3();
break;
}
}
void rend_SetRendererType (renderer_type state)
{
Renderer_type=state;
mprintf ((0,"RendererType is set to %d.\n",state));
}
void rend_SetLighting(light_state state)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_SetLighting (state);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetLightingState (state);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetLightingState (state);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetLightingState (state);
#endif
break;
default:
Int3();
break;
}
}
void rend_SetColorModel (color_model state)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_SetColorModel (state);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetColorModel (state);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetColorModel (state);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetColorModel (state);
#endif
break;
default:
Int3();
break;
}
}
void rend_SetTextureType (texture_type state)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_SetTextureType (state);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetTextureType (state);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetTextureType (state);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetTextureType (state);
#endif
break;
default:
Int3();
break;
}
}
void rend_StartFrame (int x1,int y1,int x2,int y2,int clear_flags)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_StartFrame(x1,y1,x2,y2);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_BeginFrame(x1,y1,x2,y2,clear_flags);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_BeginFrame(x1,y1,x2,y2,clear_flags);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_BeginFrame(x1,y1,x2,y2,clear_flags);
#endif
break;
default:
Int3();
break;
}
}
// Flips the screen
void rend_Flip ()
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
ddvid_VideoFlip();
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_Flip();
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_Flip();
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_Flip();
#endif
break;
default:
Int3();
break;
}
}
void rend_EndFrame ()
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_EndFrame();
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_EndFrame();
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_EndFrame();
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_EndFrame();
#endif
break;
default:
Int3();
break;
}
}
// 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)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
case RENDERER_OPENGL:
case RENDERER_GLIDE:
case RENDERER_DIRECT3D:
{
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_DrawPolygon (bm,ptr_pnts,4);
break;
}
default:
Int3();
break;
}
}
// Sets where the software renderer should write to
void rend_SetSoftwareParameters(float aspect,int width,int height,int pitch,ubyte *framebuffer)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_SetSoftwareParameters (aspect,width,height,pitch,framebuffer);
#endif
break;
case RENDERER_OPENGL:
case RENDERER_GLIDE:
case RENDERER_DIRECT3D:
default:
//Int3(); // This function shouldn't have been called!
break;
}
}
// Sets the state of bilinear filtering for our textures
void rend_SetFiltering (sbyte state)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetFiltering (state);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetFiltering (state);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetFiltering (state);
#endif
break;
default:
Int3();
break;
}
}
// Sets the state of zbuffering to on or off
void rend_SetZBufferState (sbyte state)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetZBufferState (state);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetZBufferState (state);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetZBufferState (state);
#endif
break;
default:
Int3();
break;
}
}
// Sets the near and far planes for z buffer
void rend_SetZValues (float nearz,float farz)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetZValues (nearz,farz);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetZValues (nearz,farz);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetZValues (nearz,farz);
#endif
break;
default:
Int3();
break;
}
}
// 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)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_ClearScreen (color);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_ClearScreen (color);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_ClearScreen (color);
#endif
break;
default:
Int3();
break;
}
}
// Clears the zbuffer for the screen
void rend_ClearZBuffer ()
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_ClearZBuffer ();
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_ClearZBuffer ();
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_ClearZBuffer ();
#endif
break;
default:
Int3();
break;
}
}
// Clears the zbuffer for the screen
void rend_ResetCache ()
{
mprintf ((0,"Resetting texture cache!\n"));
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_ResetCache ();
#endif
break;
case RENDERER_GLIDE:
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_ResetCache ();
#endif
break;
default:
Int3();
break;
}
}
// Fills a rectangle on the display
void rend_FillRect (ddgr_color color,int x1,int y1,int x2,int y2)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_FillRect(color, x1, y1, x2, y2);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_FillRect (color,x1,y1,x2,y2);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_FillRect (color,x1,y1,x2,y2);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_FillRect (color,x1,y1,x2,y2);
#endif
break;
default:
Int3();
break;
}
}
// Sets a pixel on the display
void rend_SetPixel (ddgr_color color,int x,int y)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_SetPixel(color, x, y);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetPixel (color,x,y);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetPixel (color,x,y);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetPixel (color,x,y);
#endif
break;
default:
Int3();
break;
}
}
// Sets a pixel on the display
ddgr_color rend_GetPixel (int x,int y)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
return tex_GetPixel(x, y);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
return opengl_GetPixel (x,y);
#endif
break;
case RENDERER_GLIDE:
case RENDERER_DIRECT3D:
default:
//Int3();
break;
}
return GR_BLACK;
}
// Draws spheres
void rend_FillCircle(ddgr_color col, int x, int y, int rad)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_FillCircle(col, x, y, rad);
#endif
break;
case RENDERER_OPENGL:
case RENDERER_GLIDE:
case RENDERER_DIRECT3D:
default:
//Int3();
break;
}
}
// draws circles
void rend_DrawCircle(int x, int y, int rad)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_DrawCircle(x, y, rad);
#endif
break;
case RENDERER_OPENGL:
case RENDERER_GLIDE:
case RENDERER_DIRECT3D:
default:
//Int3();
break;
}
}
// 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_DrawPolygon (bm_handle,ptr_pnts,4);
}
// Draws a line
void rend_DrawLine (int x1,int y1,int x2,int y2)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_DrawLine(x1,y1,x2,y2);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_DrawLine (x1,y1,x2,y2);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_DrawLine (x1,y1,x2,y2);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_DrawLine (x1,y1,x2,y2);
#endif
break;
default:
Int3();
break;
}
}
// 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.0);
rend_FontRed[1]=(float)(GR_COLOR_RED(color2)/255.0);
rend_FontRed[2]=(float)(GR_COLOR_RED(color3)/255.0);
rend_FontRed[3]=(float)(GR_COLOR_RED(color4)/255.0);
rend_FontGreen[0]=(float)(GR_COLOR_GREEN(color1)/255.0);
rend_FontGreen[1]=(float)(GR_COLOR_GREEN(color2)/255.0);
rend_FontGreen[2]=(float)(GR_COLOR_GREEN(color3)/255.0);
rend_FontGreen[3]=(float)(GR_COLOR_GREEN(color4)/255.0);
rend_FontBlue[0]=(float)(GR_COLOR_BLUE(color1)/255.0);
rend_FontBlue[1]=(float)(GR_COLOR_BLUE(color2)/255.0);
rend_FontBlue[2]=(float)(GR_COLOR_BLUE(color3)/255.0);
rend_FontBlue[3]=(float)(GR_COLOR_BLUE(color4)/255.0);
rend_FontAlpha[0]=(color1>>24)/255.0;
rend_FontAlpha[1]=(color2>>24)/255.0;
rend_FontAlpha[2]=(color3>>24)/255.0;
rend_FontAlpha[3]=(color4>>24)/255.0;
}
// Sets the color of fog
void rend_SetFogColor (ddgr_color fogcolor)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetFogColor (fogcolor);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetFogColor (fogcolor);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetFogColor (fogcolor);
#endif
break;
default:
Int3();
break;
}
}
void rend_SetAlphaType (sbyte atype)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_SetAlphaType (atype);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetAlphaType (atype);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetAlphaType (atype);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetAlphaType (atype);
#endif
break;
default:
Int3();
break;
}
}
// Sets the alpha value for constant alpha
void rend_SetAlphaValue (ubyte val)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetAlphaValue (val);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetAlphaValue (val);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetAlphaValue (val);
#endif
break;
default:
Int3();
break;
}
}
// 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;
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetAlphaFactor (val);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetAlphaFactor (val);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetAlphaFactor (val);
#endif
break;
default:
Int3();
break;
}
}
// Returns the current Alpha factor
float rend_GetAlphaFactor(void)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
return opengl_GetAlphaFactor ();
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
return glide_GetAlphaFactor ();
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
return d3d_GetAlphaFactor ();
#endif
break;
default:
Int3();
break;
}
return 1.0f;
}
// Sets the texture wrapping type
void rend_SetWrapType (wrap_type val)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetWrapType (val);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetWrapType (val);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetWrapType (val);
#endif
break;
default:
Int3();
break;
}
}
// Draws a line using the states of the renderer
void rend_DrawSpecialLine (g3Point *p0,g3Point *p1)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_DrawSpecialLine (p0,p1);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_DrawSpecialLine (p0,p1);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_DrawSpecialLine (p0,p1);
#endif
break;
default:
Int3();
break;
}
}
// Takes a screenshot of the current frame and puts it into the handle passed
void rend_Screenshot (int bm_handle)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_Screenshot (bm_handle);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_Screenshot (bm_handle);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_Screenshot (bm_handle);
#endif
break;
default:
Int3();
break;
}
}
void rend_SetZBias (float z_bias)
{
Z_bias=z_bias;
}
// Enables/disables writes the depth buffer
void rend_SetZBufferWriteMask (int state)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetZBufferWriteMask (state);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetZBufferWriteMask (state);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetZBufferWriteMask (state);
#endif
break;
default:
Int3();
break;
}
}
// Gets a pointer to a linear frame buffer
void rend_GetLFBLock (renderer_lfb *lfb)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_GetLFBLock(lfb);
#endif
break;
case RENDERER_OPENGL:
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_GetLFBLock(lfb);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_GetLFBLock(lfb);
#endif
break;
default:
Int3();
break;
}
}
// Releases an lfb lock
void rend_ReleaseLFBLock (renderer_lfb *lfb)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_ReleaseLFBLock(lfb);
#endif
break;
case RENDERER_OPENGL:
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_ReleaseLFBLock(lfb);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_ReleaseLFBLock(lfb);
#endif
break;
default:
Int3();
break;
}
}
// Returns the aspect ratio of the physical screen
void rend_GetProjectionParameters (int *width,int *height)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_GetProjectionParameters(width,height);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_GetProjectionParameters(width,height);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_GetProjectionParameters(width,height);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_GetProjectionParameters(width,height);
#endif
break;
default:
mprintf ((0,"Function not implemented for this lib!\n"));
Int3();
break;
}
}
void rend_GetProjectionScreenParameters( int &screenLX, int &screenTY, int &screenW, int &screenH )
{
switch (Renderer_type)
{
case RENDERER_OPENGL:
{
#ifdef USE_OPENGL
opengl_GetProjectionScreenParameters( screenLX, screenTY, screenW, screenH );
#endif
}break;
default:
mprintf ((0,"Function not implemented for this lib!\n"));
Int3();
break;
}
}
// Returns the aspect ratio of the physical screen
float rend_GetAspectRatio ()
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
return tex_GetAspectRatio();
break;
#else
return -1.0f;
break;
#endif
case RENDERER_GLIDE:
#ifdef USE_GLIDE
return glide_GetAspectRatio();
break;
#else
return -1.0f;
break;
#endif
case RENDERER_OPENGL:
#ifdef USE_OPENGL
return opengl_GetAspectRatio();
break;
#else
return -1.0f;
break;
#endif
case RENDERER_DIRECT3D:
#ifdef USE_D3D
return d3d_GetAspectRatio();
break;
#else
return -1.0f;
break;
#endif
default:
mprintf ((0,"Function not implemented for the lib!\n"));
return -1;
Int3();
break;
}
}
// 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)
{
renderer_lfb lfb;
int i,t;
lfb.type=LFB_LOCK_WRITE;
rend_GetLFBLock (&lfb);
if (lfb.data==NULL)
{
mprintf ((0,"Couldn't get lock in rend_DrawLFBBitmap!\n"));
return;
}
for (i=0;i<h;i++)
{
for (t=0;t<w;t++)
{
ushort pix=data[((sy+i)*(rowsize/2))+sx+t];
if (pix & OPAQUE_FLAG)
lfb.data[((dy+i)*(lfb.bytes_per_row/2))+dx+t]=pix;
}
}
rend_ReleaseLFBLock (&lfb);
}
// 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;
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
retval=glide_SetPreferredState(pref_state);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
retval=d3d_SetPreferredState (pref_state);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
retval=opengl_SetPreferredState (pref_state);
#endif
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
rend_SetInitOptions();
return retval;
}
// Sets the gamma for this display
void rend_SetGammaValue (float val)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetGammaValue (val);
#endif
break;
case RENDERER_OPENGL:
case RENDERER_DIRECT3D:
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}
// 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)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
#ifdef USE_SOFTWARE
tex_GetRenderState (rstate);
#endif
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_GetRenderState (rstate);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_GetRenderState (rstate);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_GetRenderState (rstate);
#endif
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}
// 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)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
//tex_GetRenderState (rstate);
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_CopyBitmapToFramebuffer (bm_handle,x,y);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_CopyBitmapToFramebuffer (bm_handle,x,y);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_CopyBitmapToFramebuffer (bm_handle,x,y);
#endif
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}
// Gets a renderer ready for a framebuffer copy, or stops a framebuffer copy
void rend_SetFrameBufferCopyState (bool state)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
//tex_GetRenderState (rstate);
break;
case RENDERER_GLIDE:
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetFrameBufferCopyState (state);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetFrameBufferCopyState (state);
#endif
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}
// Changes the resolution of the renderer
void rend_SetResolution (int width,int height)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetResolution (width,height);
#endif
break;
case RENDERER_OPENGL:
case RENDERER_DIRECT3D:
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}
#ifdef USE_OPENGL
int WindowGL=0;
#endif
// Gets OpenGL ready to work in a window
int rend_InitOpenGLWindow (oeApplication *app,renderer_preferred_state *pref_state)
{
#ifdef USE_OPENGL
WindowGL=1;
return opengl_Init (app,pref_state);
#else
return 0;
#endif
}
// Shuts down OpenGL in a window
void rend_CloseOpenGLWindow ()
{
#ifdef USE_OPENGL
opengl_Close();
WindowGL=0;
OpenGL_window_initted=0;
mprintf ((1,"SHUTTING DOWN WINDOWED OPENGL!"));
#endif
}
// Sets the state of the OpenGLWindow to on or off
static renderer_type Save_rend;
static bool Save_state_limit;
void rend_SetOpenGLWindowState (int state,oeApplication *app,renderer_preferred_state *pref_state)
{
#ifdef USE_OPENGL
if (state)
{
if (!OpenGL_window_initted)
{
if (rend_InitOpenGLWindow (app,pref_state))
OpenGL_window_initted=1;
else
return;
}
UseHardware=1;
Save_rend=Renderer_type;
Save_state_limit=StateLimited;
Renderer_type=RENDERER_OPENGL;
StateLimited=1;
NoLightmaps=false;
}
else
{
if (OpenGL_window_initted)
{
UseHardware=0;
Renderer_type=RENDERER_SOFTWARE_16BIT;
StateLimited=Save_state_limit;
}
}
#endif
}
// Sets the hardware bias level for coplanar polygons
// This helps reduce z buffer artifaces
void rend_SetCoplanarPolygonOffset (float factor)
{
ASSERT (factor>=0 && factor<=1.0);
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_SetCoplanarPolygonOffset (factor);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_SetCoplanarPolygonOffset (factor);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_SetCoplanarPolygonOffset (factor);
#endif
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}
// Preuploads a texture to the video card
void rend_PreUploadTextureToCard (int handle,int map_type)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_GLIDE:
break;
case RENDERER_OPENGL:
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_PreUploadTextureToCard (handle,map_type);
#endif
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}
// Frees an uploaded texture from the video card
void rend_FreePreUploadedTexture (int handle,int map_type)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_GLIDE:
break;
case RENDERER_OPENGL:
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_FreePreUploadedTexture (handle,map_type);
#endif
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}
// Retrieves an error message
char *rend_GetErrorMessage ()
{
return (char *)Renderer_error_message;
}
// Sets an error message
void rend_SetErrorMessage (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()
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
return glide_LowVidMem();
#endif
break;
case RENDERER_OPENGL:
case RENDERER_DIRECT3D:
return 0;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
return 0;
}
// Returns 1 if the renderer supports bumpmapping
int rend_SupportsBumpmapping ()
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
case RENDERER_GLIDE:
case RENDERER_OPENGL:
return 0;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
return d3d_SupportsBumpmapping();
#endif
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
return 0;
}
// Sets a bumpmap to be rendered, or turns off bumpmapping altogether
void rend_SetBumpmapReadyState (int state,int map)
{
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
case RENDERER_GLIDE:
case RENDERER_OPENGL:
break;
case RENDERER_DIRECT3D:
Bumpmap_ready=state;
Bump_map=map;
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}
// returns the direct draw object
void *rend_RetrieveDirectDrawObj(void **frontsurf, void **backsurf)
{
if (Renderer_initted) {
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
break;
case RENDERER_GLIDE:
break;
case RENDERER_OPENGL:
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
return d3d_DirectDrawObj(frontsurf, backsurf);
#endif
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}
*frontsurf = NULL;
*backsurf = NULL;
return NULL;
}
// returns rendering statistics for the frame
void rend_GetStatistics(tRendererStats *stats)
{
if (Renderer_initted) {
switch (Renderer_type)
{
case RENDERER_SOFTWARE_16BIT:
case RENDERER_SOFTWARE_8BIT:
memset(stats,0,sizeof(tRendererStats));
break;
case RENDERER_GLIDE:
#ifdef USE_GLIDE
glide_GetStatistics(stats);
#endif
break;
case RENDERER_OPENGL:
#ifdef USE_OPENGL
opengl_GetStatistics(stats);
#endif
break;
case RENDERER_DIRECT3D:
#ifdef USE_D3D
d3d_GetStatistics(stats);
#endif
break;
default:
mprintf ((0,"Function not implemented for the lib!\n"));
Int3();
break;
}
}else
{
memset(stats,0,sizeof(tRendererStats));
}
}