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 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 remove all the IM matrix crap and write real functions now that it works
// - SPRITES
// o port sprite panning and fullbrights from hacked polymost (:(
// - 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
// - MDSPRITES
2008-05-24 09:37:09 +00:00
// o need to truly convert MD2s to MD3s with proper scale offset to just dump the data into VRAM
2008-03-30 11:43:24 +00:00
// o need full translation and rotation support from CON to attach to game world or tags
2008-06-01 08:58:06 +00:00
// o need to blend between frames
2008-03-30 11:43:24 +00:00
//
// 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"
2008-05-05 09:05:07 +00:00
# include "mdsprite.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 ;
2008-04-04 08:07:11 +00:00
extern int pr_billboardingmode ;
2007-01-29 01:18:16 +00:00
extern int pr_verbosity ;
extern int pr_wireframe ;
2008-05-24 09:37:09 +00:00
extern int pr_vbos ;
2008-06-06 14:00:12 +00:00
extern int pr_gpusmoothing ;
2007-01-29 01:18:16 +00:00
2008-03-30 09:16:39 +00:00
extern int glerror ;
2008-11-25 10:42:22 +00:00
// MATERIAL
typedef struct s_prmaterial {
2008-11-27 16:19:24 +00:00
// PR_BIT_ANIM_INTERPOLATION
GLfloat frameprogress ;
GLfloat * nextframedata ;
GLsizei nextframedatastride ;
// PR_BIT_DIFFUSE_MAP
2008-11-25 10:42:22 +00:00
GLuint diffusemap ;
2008-11-26 17:24:08 +00:00
GLfloat diffusescalex , diffusescaley ;
2008-11-27 16:19:24 +00:00
// PR_BIT_DIFFUSE_MODULATION
2008-11-25 10:42:22 +00:00
GLfloat diffusemodulation [ 4 ] ;
} _prmaterial ;
// BUILD DATA
2008-05-18 07:35:35 +00:00
typedef struct s_prplane {
2006-09-27 17:55:49 +00:00
// geometry
2008-05-18 07:35:35 +00:00
GLfloat * buffer ;
GLuint vbo ;
2006-09-29 21:36:12 +00:00
// attributes
2008-05-18 07:35:35 +00:00
GLdouble plane [ 4 ] ;
2008-11-25 10:42:22 +00:00
_prmaterial material ;
2006-09-27 17:55:49 +00:00
// elements
2008-05-18 07:35:35 +00:00
GLushort * indices ;
GLuint ivbo ;
} _prplane ;
typedef struct s_prsector {
// polymer data
GLdouble * verts ;
_prplane floor ;
_prplane ceil ;
2006-09-27 02:23:27 +00:00
short curindice ;
2006-09-27 17:55:49 +00:00
int indicescount ;
2008-05-31 08:29:40 +00:00
int oldindicescount ;
2008-03-30 14:22:03 +00:00
// stuff
float wallsproffset ;
float floorsproffset ;
2008-04-02 06:58:26 +00:00
// build sector data
int ceilingz , floorz ;
short ceilingstat , floorstat ;
short ceilingpicnum , ceilingheinum ;
signed char ceilingshade ;
char ceilingpal , ceilingxpanning , ceilingypanning ;
short floorpicnum , floorheinum ;
signed char floorshade ;
char floorpal , floorxpanning , floorypanning ;
2006-09-27 17:55:49 +00:00
2008-04-02 08:49:21 +00:00
char controlstate ; // 1: up to date, 2: just allocated
unsigned int invalidid ;
2006-09-27 02:23:27 +00:00
} _prsector ;
2006-09-29 21:36:12 +00:00
typedef struct s_prwall {
2008-05-18 07:35:35 +00:00
_prplane wall ;
_prplane over ;
_prplane mask ;
// stuff
2008-04-03 06:58:36 +00:00
GLfloat * bigportal ;
2008-04-12 08:16:01 +00:00
GLfloat * cap ;
2008-05-24 09:37:09 +00:00
GLuint stuffvbo ;
2008-04-09 07:27:17 +00:00
// build wall data
2008-04-02 08:49:21 +00:00
short cstat , nwallcstat ;
short picnum , overpicnum , nwallpicnum ;
signed char shade ;
char pal , xrepeat , yrepeat , xpanning , ypanning ;
char nwallxpanning , nwallypanning ;
2006-09-29 21:36:12 +00:00
char underover ;
2008-04-02 08:49:21 +00:00
unsigned int invalidid ;
2008-03-30 19:13:24 +00:00
char controlstate ;
2006-09-29 21:36:12 +00:00
} _prwall ;
2008-04-06 23:35:48 +00:00
typedef struct s_pranimatespritesinfo {
animatespritesptr animatesprites ;
int x , y , a , smoothratio ;
} _pranimatespritesinfo ;
2006-10-14 23:33:10 +00:00
2008-11-25 10:42:22 +00:00
// LIGHTS
2008-11-25 09:07:38 +00:00
# define PR_MAXLIGHTS 128
typedef enum {
PR_LIGHT_POINT ,
PR_LIGHT_SPOT ,
PR_LIGHT_DIRECTIONAL
} prlighttype ;
typedef struct s_prlight {
int x , y , z , horiz , range , faderange ;
short angle , sector ;
prlighttype type ;
} _prlight ;
2008-11-25 10:42:22 +00:00
// PROGRAMS
2008-11-25 09:07:38 +00:00
# define PR_INFO_LOG_BUFFER_SIZE 512
typedef enum {
2008-11-27 16:19:24 +00:00
PR_BIT_ANIM_INTERPOLATION ,
2008-11-26 08:37:14 +00:00
PR_BIT_DIFFUSE_MAP ,
2008-11-25 11:32:49 +00:00
PR_BIT_DIFFUSE_MODULATION ,
2008-11-25 09:07:38 +00:00
PR_BIT_DEFAULT , // must be just before last
PR_BIT_COUNT // must be last
} prbittype ;
typedef struct s_prprogrambit {
int bit ;
char * vert_def ;
char * vert_prog ;
char * frag_def ;
char * frag_prog ;
} _prprogrambit ;
2007-01-29 01:18:16 +00:00
2008-11-26 08:37:14 +00:00
typedef struct s_prrograminfo {
GLhandleARB handle ;
2008-11-27 16:19:24 +00:00
// PR_BIT_ANIM_INTERPOLATION
GLint attrib_nextFrameData ;
GLint uniform_frameProgress ;
2008-11-26 08:37:14 +00:00
} _prprograminfo ;
2007-01-29 01:18:16 +00:00
// 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 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 ) ;
2008-11-25 09:07:38 +00:00
void polymer_resetlights ( void ) ;
void polymer_addlight ( _prlight light ) ;
2008-04-02 09:29:58 +00:00
# ifdef POLYMER_C
2008-04-06 03:00:39 +00:00
// CORE
static void polymer_displayrooms ( short sectnum ) ;
2008-05-18 07:35:35 +00:00
static void polymer_drawplane ( short sectnum , short wallnum , _prplane * plane , int indicecount ) ;
2008-04-09 07:27:17 +00:00
static void polymer_inb4mirror ( GLfloat * buffer , GLdouble * plane ) ;
2008-04-06 23:35:48 +00:00
static void polymer_animatesprites ( void ) ;
2006-10-15 18:51:41 +00:00
// SECTORS
2008-04-02 09:29:58 +00:00
static int polymer_initsector ( short sectnum ) ;
static int polymer_updatesector ( short sectnum ) ;
2006-09-29 21:36:12 +00:00
void PR_CALLBACK polymer_tesserror ( GLenum error ) ;
void PR_CALLBACK polymer_tessedgeflag ( GLenum error ) ;
void PR_CALLBACK polymer_tessvertex ( void * vertex , void * sector ) ;
2008-04-02 09:29:58 +00:00
static int polymer_buildfloor ( short sectnum ) ;
static void polymer_drawsector ( short sectnum ) ;
2006-10-15 18:51:41 +00:00
// WALLS
2008-04-02 09:29:58 +00:00
static int polymer_initwall ( short wallnum ) ;
static void polymer_updatewall ( short wallnum ) ;
2008-04-09 07:27:17 +00:00
static void polymer_drawwall ( short sectnum , short wallnum ) ;
2006-10-14 23:33:10 +00:00
// HSR
2008-04-10 08:39:05 +00:00
static void polymer_buffertoplane ( GLfloat * buffer , GLushort * indices , int indicecount , GLdouble * plane ) ;
2008-04-06 23:35:48 +00:00
static void polymer_crossproduct ( GLfloat * in_a , GLfloat * in_b , GLdouble * out ) ;
2008-04-02 09:29:58 +00:00
static void polymer_pokesector ( short sectnum ) ;
2008-04-06 03:00:39 +00:00
static void polymer_extractfrustum ( GLdouble * modelview , GLdouble * projection , float * frustum ) ;
static int polymer_portalinfrustum ( short wallnum , float * frustum ) ;
2008-04-06 23:35:48 +00:00
static void polymer_scansprites ( short sectnum , spritetype * tsprite , int * spritesortcnt ) ;
2006-10-18 03:59:28 +00:00
// SKIES
2008-04-02 09:29:58 +00:00
static void polymer_getsky ( void ) ;
2008-06-09 09:25:47 +00:00
static void polymer_drawsky ( short tilenum ) ;
static void polymer_initartsky ( void ) ;
2008-04-02 09:29:58 +00:00
static void polymer_drawartsky ( short tilenum ) ;
2008-06-09 09:25:47 +00:00
static void polymer_drawartskyquad ( int p1 , int p2 , GLfloat height ) ;
static void polymer_drawskybox ( short tilenum ) ;
2008-06-01 08:58:06 +00:00
// MDSPRITES
static void polymer_drawmdsprite ( spritetype * tspr ) ;
static void polymer_loadmodelvbos ( md3model * m ) ;
2008-11-26 14:22:07 +00:00
// MATERIALS
2008-11-27 16:19:24 +00:00
static void polymer_getscratchmaterial ( _prmaterial * material ) ;
static void polymer_getbuildmaterial ( _prmaterial * material , short tilenum , char pal , signed char shade ) ;
static int polymer_bindmaterial ( _prmaterial material ) ;
static void polymer_unbindmaterial ( int programbits ) ;
2008-11-25 09:07:38 +00:00
static void polymer_compileprogram ( int programbits ) ;
2008-04-02 09:29:58 +00:00
2008-05-05 09:05:07 +00:00
# endif // !POLYMER_C
2007-01-29 01:18:16 +00:00
# endif // !_polymer_h_