diff --git a/polymer/build/include/polymer.h b/polymer/build/include/polymer.h index 83d8198be..ca24394da 100644 --- a/polymer/build/include/polymer.h +++ b/polymer/build/include/polymer.h @@ -2,8 +2,6 @@ // TODO : // - CORE STUFF // o put all the sector/wall geometry in VBOs -// o optimize the update[sector|wall] functions to diff the changes -// 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) // o also sliding doors are still fucked up sometimes (like under the bar in E1L2) @@ -93,7 +91,8 @@ typedef struct s_prwall { // attributes GLfloat wallcolor[4], overcolor[4]; GLfloat wallglpic, overglpic, wallfbglpic, overfbglpic; - // build wall data + // build wall data# ifdef POLYMER_C + short cstat, nwallcstat; short picnum, overpicnum, nwallpicnum; signed char shade; @@ -122,31 +121,36 @@ int polymer_init(void); void polymer_glinit(void); void polymer_loadboard(void); void polymer_drawrooms(int daposx, int daposy, int daposz, short daang, int dahoriz, short dacursectnum); -void polymer_pokesector(short sectnum); void polymer_drawmasks(void); 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); + +# ifdef POLYMER_C + // SECTORS -int polymer_initsector(short sectnum); -int polymer_updatesector(short sectnum); +static int polymer_initsector(short sectnum); +static 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); -void polymer_drawsector(short sectnum); +static int polymer_buildfloor(short sectnum); +static void polymer_drawsector(short sectnum); // WALLS -int polymer_initwall(short wallnum); -void polymer_updatewall(short wallnum); -void polymer_drawwall(short wallnum); +static int polymer_initwall(short wallnum); +static void polymer_updatewall(short wallnum); +static void polymer_drawwall(short wallnum); // HSR -void polymer_extractfrustum(GLdouble* modelview, GLdouble* projection); -int polymer_portalinfrustum(short wallnum); +static void polymer_pokesector(short sectnum); +static void polymer_extractfrustum(GLdouble* modelview, GLdouble* projection); +static int polymer_portalinfrustum(short wallnum); // SKIES -void polymer_initskybox(void); -void polymer_getsky(void); -void polymer_drawskyquad(int p1, int p2, GLfloat height); -void polymer_drawartsky(short tilenum); +static void polymer_initskybox(void); +static void polymer_getsky(void); +static void polymer_drawskyquad(int p1, int p2, GLfloat height); +static void polymer_drawartsky(short tilenum); + +# endif #endif // !_polymer_h_ diff --git a/polymer/build/src/polymer.c b/polymer/build/src/polymer.c index 2e28e0238..5506b1f9e 100644 --- a/polymer/build/src/polymer.c +++ b/polymer/build/src/polymer.c @@ -1,5 +1,7 @@ // blah #ifdef POLYMOST + +#define POLYMER_C #include "polymer.h" // CVARS @@ -48,6 +50,7 @@ int front; int back; int firstback; short sectorqueue[MAXSECTORS]; +short querydelay[MAXSECTORS]; GLdouble modelviewmatrix[16]; GLdouble spritemodelview[16]; @@ -338,7 +341,7 @@ void polymer_drawrooms(int daposx, int daposy, int daposz, short while (front != back) { - if ((front >= firstback) && (pr_occlusionculling)) + if ((front >= firstback) && (pr_occlusionculling) && (!querydelay[sectorqueue[front] + 1])) { bglGetQueryObjectivARB(sectorqueue[front] + 1, GL_QUERY_RESULT_ARB, @@ -348,7 +351,12 @@ void polymer_drawrooms(int daposx, int daposy, int daposz, short front++; continue; } + else + querydelay[sectorqueue[front] + 1] = pr_occlusionculling; } + else if ((front >= firstback) && (pr_occlusionculling) && (querydelay[sectorqueue[front] + 1])) + querydelay[sectorqueue[front] + 1]--; + polymer_pokesector(sectorqueue[front]); polymer_drawsector(sectorqueue[front]); @@ -370,7 +378,7 @@ void polymer_drawrooms(int daposx, int daposy, int daposz, short sectorqueue[back++] = wal->nextsector; prsectors[wal->nextsector]->drawingstate = 1; - if (pr_occlusionculling) + if (pr_occlusionculling && !querydelay[wal->nextsector + 1]) { nextsec = §or[wal->nextsector]; nextwal = &wall[nextsec->wallptr]; @@ -434,33 +442,6 @@ void polymer_drawrooms(int daposx, int daposy, int daposz, short if (pr_verbosity >= 3) OSD_Printf("PR : Rooms drawn.\n"); } -void polymer_pokesector(short sectnum) -{ - sectortype *sec; - _prsector *s; - walltype *wal; - int i; - - sec = §or[sectnum]; - s = prsectors[sectnum]; - wal = &wall[sec->wallptr]; - - if (!s->controlstate) - polymer_updatesector(sectnum); - - i = 0; - while (i < sec->wallnum) - { - if ((wal->nextsector != -1) && (!prsectors[wal->nextsector]->controlstate)) - polymer_updatesector(wal->nextsector); - if (!prwalls[sec->wallptr + i]->controlstate) - polymer_updatewall(sec->wallptr + i); - - i++; - wal = &wall[sec->wallptr + i]; - } -} - void polymer_drawmasks(void) { bglEnable(GL_ALPHA_TEST); @@ -633,7 +614,7 @@ void polymer_drawsprite(int snum) } // SECTORS -int polymer_initsector(short sectnum) +static int polymer_initsector(short sectnum) { sectortype *sec; _prsector* s; @@ -666,7 +647,7 @@ int polymer_initsector(short sectnum) return (1); } -int polymer_updatesector(short sectnum) +static int polymer_updatesector(short sectnum) { _prsector* s; sectortype *sec; @@ -949,7 +930,7 @@ void PR_CALLBACK polymer_tessvertex(void* vertex, void* sector) s->curindice++; } -int polymer_buildfloor(short sectnum) +static int polymer_buildfloor(short sectnum) { // This function tesselates the floor/ceiling of a sector and stores the triangles in a display list. _prsector* s; @@ -1010,7 +991,7 @@ int polymer_buildfloor(short sectnum) return (1); } -void polymer_drawsector(short sectnum) +static void polymer_drawsector(short sectnum) { sectortype *sec; walltype *wal; @@ -1073,7 +1054,7 @@ void polymer_drawsector(short sectnum) } // WALLS -int polymer_initwall(short wallnum) +static int polymer_initwall(short wallnum) { _prwall *w; @@ -1095,7 +1076,7 @@ int polymer_initwall(short wallnum) return (1); } -void polymer_updatewall(short wallnum) +static void polymer_updatewall(short wallnum) { short nwallnum, nnwallnum, curpicnum, wallpicnum, walloverpicnum, nwallpicnum; char curxpanning, curypanning; @@ -1417,7 +1398,7 @@ void polymer_updatewall(short wallnum) if (pr_verbosity >= 3) OSD_Printf("PR : Updated wall %i.\n", wallnum); } -void polymer_drawwall(short wallnum) +static void polymer_drawwall(short wallnum) { _prwall *w; @@ -1473,7 +1454,34 @@ void polymer_drawwall(short wallnum) } // HSR -void polymer_extractfrustum(GLdouble* modelview, GLdouble* projection) +static void polymer_pokesector(short sectnum) +{ + sectortype *sec; + _prsector *s; + walltype *wal; + int i; + + sec = §or[sectnum]; + s = prsectors[sectnum]; + wal = &wall[sec->wallptr]; + + if (!s->controlstate) + polymer_updatesector(sectnum); + + i = 0; + while (i < sec->wallnum) + { + if ((wal->nextsector != -1) && (!prsectors[wal->nextsector]->controlstate)) + polymer_updatesector(wal->nextsector); + if (!prwalls[sec->wallptr + i]->controlstate) + polymer_updatewall(sec->wallptr + i); + + i++; + wal = &wall[sec->wallptr + i]; + } +} + +static void polymer_extractfrustum(GLdouble* modelview, GLdouble* projection) { GLdouble matrix[16]; int i; @@ -1500,7 +1508,7 @@ void polymer_extractfrustum(GLdouble* modelview, GLdouble* projec if (pr_verbosity >= 3) OSD_Printf("PR : Frustum extracted.\n"); } -int polymer_portalinfrustum(short wallnum) +static int polymer_portalinfrustum(short wallnum) { int i, j, k; float sqdist; @@ -1531,7 +1539,7 @@ int polymer_portalinfrustum(short wallnum) } // SKIES -void polymer_initskybox(void) +static void polymer_initskybox(void) { GLfloat halfsqrt2 = 0.70710678f; @@ -1554,7 +1562,7 @@ void polymer_initskybox(void) skybox[14] = -1.0; skybox[15] = -1.0; // 7*/ } -void polymer_getsky(void) +static void polymer_getsky(void) { int i; @@ -1570,7 +1578,7 @@ void polymer_getsky(void) } } -void polymer_drawskyquad(int p1, int p2, GLfloat height) +static void polymer_drawskyquad(int p1, int p2, GLfloat height) { bglBegin(GL_QUADS); bglTexCoord2f(0.0f, 0.0f); @@ -1588,7 +1596,7 @@ void polymer_drawskyquad(int p1, int p2, GLfloat height) bglEnd(); } -void polymer_drawartsky(short tilenum) +static void polymer_drawartsky(short tilenum) { pthtyp* pth; GLuint glpics[5]; diff --git a/polymer/eduke32/source/osdcmds.c b/polymer/eduke32/source/osdcmds.c index 9dadc08b4..8dccf8804 100644 --- a/polymer/eduke32/source/osdcmds.c +++ b/polymer/eduke32/source/osdcmds.c @@ -695,7 +695,7 @@ cvar[] = { "r_anamorphic", "r_anamorphic: enable/disable widescreen mode", (void*)&glwidescreen, CVAR_BOOL, 0, 0, 1 }, { "r_projectionhack", "r_projectionhack: enable/disable projection hack", (void*)&glprojectionhacks, CVAR_BOOL, 0, 0, 1 }, // polymer cvars - { "pr_occlusionculling", "pr_occlusionculling: insert description that noone will ever read", (void*)&pr_occlusionculling, CVAR_INT, 0, 0, 1 }, + { "pr_occlusionculling", "pr_occlusionculling: insert description that noone will ever read", (void*)&pr_occlusionculling, CVAR_INT, 0, 0, 512 }, { "pr_fov", "pr_fov: sets the field of vision in build angle", (void*)&pr_fov, CVAR_INT, 0, 0, 1023}, { "pr_showportals", "pr_showportals: toggles frustum culling (recommended)", (void*)&pr_showportals, CVAR_INT, 0, 0, 1 }, { "pr_verbosity", "pr_verbosity: verbosity level of the polymer renderer", (void*)&pr_verbosity, CVAR_INT, 0, 0, 3 },