2007-01-29 01:18:16 +00:00
// here lies the GREAT JUSTICE RENDERER
// TODO :
2008-03-30 11:43:24 +00:00
// - CORE STUFF
// o put all the sector/wall geometry in VBOs
// o optimize the update[sector|wall] functions to diff the changes
2008-03-30 12:22:50 +00:00
// o figure a way to get the interpolations from the game
2008-03-30 11:43:24 +00:00
// o make occlusion queries every n frames (cvar)
// o there's still a texture alignment problem with slopes (waterfall in launch facility)
// o there's also the texture alignment problem Hunter reported (san andreas fault)
2008-03-30 16:08:18 +00:00
// o also sliding doors are still fucked up sometimes (like under the bar in E1L2)
2008-03-30 11:43:24 +00:00
// o port glowmaps and detail maps from hacked polymost (:(
// o shading needs a lot of work
// o make the portal smaller
// o one-way walls and masks
// o remove all the IM matrix crap and write real functions now that it works
// o polymer.c possibly needs to be split in several source files
// o some crap really needs factorization
// o ... possibly more important stuff I don't have in mind right now
// - SPRITES
// o stop using IM
// o stop using Get for every face sprite (do the calculation by hand)
// o port sprite panning and fullbrights from hacked polymost (:(
// o draw all opaques first, keep translucent for later with masks
// o need smart PolygonOffset for floor and wall sprites
// - SKIES
// o figure a better way to handle ART skies - maybe add symetric caps that would fade to black like a big gem or something wow this is a long column lol ;0)
// o implement polymost skyboxes
// - MIRRORS
// o figure out how to get mirror data from game
// o unified mirror transformation (not just walls)
// - MDSPRITES
// o need to reimplement them - hopefully the loader can be reused without too much hassle
// o need full translation and rotation support from CON to attach to game world or tags
// o need to put frames into VBOs and blend between them
//
// the renderer should hopefully be pretty solid after all that
// the rest will be a bliss :)
2007-01-29 01:18:16 +00:00
# ifndef _polymer_h_
# define _polymer_h_
# include "compat.h"
# include "build.h"
# include "glbuild.h"
# include "osd.h"
# include "polymost.h"
2006-09-27 17:55:49 +00:00
# include "pragmas.h"
2007-07-01 06:32:03 +00:00
# include <math.h>
2007-01-29 01:18:16 +00:00
// CVARS
2008-03-26 09:24:25 +00:00
extern int pr_occlusionculling ;
2007-01-29 01:18:16 +00:00
extern int pr_fov ;
2007-07-01 06:32:03 +00:00
extern int pr_showportals ;
2007-01-29 01:18:16 +00:00
extern int pr_verbosity ;
extern int pr_wireframe ;
2008-03-30 09:16:39 +00:00
extern int glerror ;
2007-01-29 01:18:16 +00:00
// DATA
2006-08-30 23:32:39 +00:00
typedef struct s_prsector {
2006-09-27 17:55:49 +00:00
// geometry
2006-09-27 02:23:27 +00:00
GLdouble * verts ;
GLfloat * floorbuffer ;
GLfloat * ceilbuffer ;
2006-09-29 21:36:12 +00:00
// attributes
GLfloat floorcolor [ 4 ] , ceilcolor [ 4 ] ;
2006-10-19 23:51:44 +00:00
GLuint floorglpic , ceilglpic , floorfbglpic , ceilfbglpic ;
2006-09-27 17:55:49 +00:00
// elements
2006-10-04 09:54:25 +00:00
GLushort * floorindices ;
GLushort * ceilindices ;
2006-09-27 02:23:27 +00:00
short curindice ;
2006-09-27 17:55:49 +00:00
int indicescount ;
2008-03-30 14:22:03 +00:00
// stuff
float wallsproffset ;
float floorsproffset ;
2006-09-27 17:55:49 +00:00
2006-10-15 18:51:41 +00:00
char controlstate ; // bit 1: up-to-date, bit 2: geometry invalidated
2006-10-14 23:33:10 +00:00
char drawingstate ; // 0: fcuk, 1: in queue, 2: todraw, 3: drawn
2006-09-27 02:23:27 +00:00
} _prsector ;
2006-09-29 21:36:12 +00:00
typedef struct s_prwall {
// geometry
GLfloat * wallbuffer ;
GLfloat * overbuffer ;
2006-10-15 18:51:41 +00:00
GLfloat * portal ;
2006-09-29 21:36:12 +00:00
// attributes
GLfloat wallcolor [ 4 ] , overcolor [ 4 ] ;
2006-10-19 23:51:44 +00:00
GLfloat wallglpic , overglpic , wallfbglpic , overfbglpic ;
2006-09-29 21:36:12 +00:00
char underover ;
char invalidate ;
2008-03-30 19:13:24 +00:00
char controlstate ;
2006-09-29 21:36:12 +00:00
} _prwall ;
2006-10-14 23:33:10 +00:00
typedef struct s_cliplane {
_equation left , right , clip ;
_point2d ref ;
} _cliplane ;
2007-01-29 01:18:16 +00:00
extern _prsector * prsectors [ MAXSECTORS ] ;
extern _prwall * prwalls [ MAXWALLS ] ;
// CONTROL
2006-10-15 18:51:41 +00:00
extern int updatesectors ;
2007-01-29 01:18:16 +00:00
2006-09-29 21:36:12 +00:00
// EXTERNAL FUNCTIONS
int polymer_init ( void ) ;
void polymer_glinit ( void ) ;
void polymer_loadboard ( void ) ;
2008-03-25 09:21:18 +00:00
void polymer_drawrooms ( int daposx , int daposy , int daposz , short daang , int dahoriz , short dacursectnum ) ;
2008-03-30 19:13:24 +00:00
void polymer_pokesector ( short sectnum ) ;
2008-03-30 09:16:39 +00:00
void polymer_drawmasks ( void ) ;
2007-12-12 17:42:14 +00:00
void polymer_rotatesprite ( int sx , int sy , int z , short a , short picnum , signed char dashade , char dapalnum , char dastat , int cx1 , int cy1 , int cx2 , int cy2 ) ;
void polymer_drawmaskwall ( int damaskwallcnt ) ;
void polymer_drawsprite ( int snum ) ;
2006-10-15 18:51:41 +00:00
// SECTORS
2006-09-29 21:36:12 +00:00
int polymer_initsector ( short sectnum ) ;
int polymer_updatesector ( short sectnum ) ;
void PR_CALLBACK polymer_tesscombine ( GLdouble v [ 3 ] , GLdouble * data [ 4 ] , GLfloat weight [ 4 ] , GLdouble * * out ) ;
void PR_CALLBACK polymer_tesserror ( GLenum error ) ;
void PR_CALLBACK polymer_tessedgeflag ( GLenum error ) ;
void PR_CALLBACK polymer_tessvertex ( void * vertex , void * sector ) ;
int polymer_buildfloor ( short sectnum ) ;
2006-10-14 23:33:10 +00:00
void polymer_drawsector ( short sectnum ) ;
2006-10-15 18:51:41 +00:00
// WALLS
2006-09-29 21:36:12 +00:00
int polymer_initwall ( short wallnum ) ;
2007-01-29 01:18:16 +00:00
void polymer_updatewall ( short wallnum ) ;
void polymer_drawwall ( short wallnum ) ;
2006-10-14 23:33:10 +00:00
// HSR
2007-03-22 18:28:41 +00:00
void polymer_extractfrustum ( GLdouble * modelview , GLdouble * projection ) ;
2006-10-15 18:51:41 +00:00
int polymer_portalinfrustum ( short wallnum ) ;
2006-10-18 03:59:28 +00:00
// SKIES
void polymer_initskybox ( void ) ;
2006-10-19 23:51:44 +00:00
void polymer_getsky ( void ) ;
2006-10-18 03:59:28 +00:00
void polymer_drawskyquad ( int p1 , int p2 , GLfloat height ) ;
2007-01-29 01:18:16 +00:00
void polymer_drawartsky ( short tilenum ) ;
# endif // !_polymer_h_