Use vertex arrays in R_RenderLightmappedPoly.

This is done for normal surfaces only. To change SURF_FLOWING surfes I
need to find such a surface somewhere in the game...
This commit is contained in:
Yamagi Burmeister 2016-08-06 15:25:54 +02:00
parent bcde80834f
commit 5840bd570b
3 changed files with 85 additions and 114 deletions

View file

@ -45,9 +45,6 @@
#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB #define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB
#define GL_TEXTURE0_SGIS 0x835E
#define GL_TEXTURE1_SGIS 0x835F
#define GL_POINT_SIZE_MIN_EXT 0x8126 #define GL_POINT_SIZE_MIN_EXT 0x8126
#define GL_POINT_SIZE_MAX_EXT 0x8127 #define GL_POINT_SIZE_MAX_EXT 0x8127
#define GL_DISTANCE_ATTENUATION_EXT 0x8129 #define GL_DISTANCE_ATTENUATION_EXT 0x8129
@ -96,7 +93,14 @@
#define GL_OPERAND7_ALPHA_EXT 0x859F #define GL_OPERAND7_ALPHA_EXT 0x859F
#endif #endif
/* QGL main functions */ #ifdef _WIN32
GLAPI void APIENTRY glActiveTextureARB( GLenum texture );
GLAPI void APIENTRY glClientActiveTextureARB( GLenum texture );
GLAPI void APIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t);
GLAPI void APIENTRY glMultiTexCoord2fvARB(GLenum target, const GLfloat *v);
#endif
// =======================================================================
/* /*
* This is responsible for setting up our QGL extension pointers * This is responsible for setting up our QGL extension pointers

View file

@ -81,8 +81,6 @@
#define REF_VERSION "Yamagi Quake II OpenGL Refresher" #define REF_VERSION "Yamagi Quake II OpenGL Refresher"
#define MAX_LBM_HEIGHT 480 #define MAX_LBM_HEIGHT 480
#define BACKFACE_EPSILON 0.01 #define BACKFACE_EPSILON 0.01
#define DYNAMIC_LIGHT_WIDTH 128
#define DYNAMIC_LIGHT_HEIGHT 128
#define LIGHTMAP_BYTES 4 #define LIGHTMAP_BYTES 4
#define MAX_LIGHTMAPS 128 #define MAX_LIGHTMAPS 128
#define GL_LIGHTMAP_FORMAT GL_RGBA #define GL_LIGHTMAP_FORMAT GL_RGBA
@ -96,7 +94,6 @@
/* fall over */ /* fall over */
#define ROLL 2 #define ROLL 2
char *strlwr(char *s);
extern viddef_t vid; extern viddef_t vid;
/* /*

View file

@ -660,31 +660,42 @@ R_DrawTextureChains(void)
void void
R_RenderLightmappedPoly(msurface_t *surf) R_RenderLightmappedPoly(msurface_t *surf)
{ {
int i, nv = surf->polys->numverts; int i;
int map; int map;
int nv;
int smax;
int tmax;
float scroll;
float *v; float *v;
image_t *image = R_TextureAnimation(surf->texinfo);
qboolean is_dynamic = false;
unsigned lmtex = surf->lightmaptexturenum;
glpoly_t *p; glpoly_t *p;
image_t *image;
qboolean is_dynamic;
unsigned lmtex;
unsigned temp[128 * 128];
image = R_TextureAnimation(surf->texinfo);
is_dynamic = false;
lmtex = surf->lightmaptexturenum;
nv = surf->polys->numverts;
// Any dynamic lights on this surface?
for (map = 0; map < MAXLIGHTMAPS && surf->styles[map] != 255; map++) for (map = 0; map < MAXLIGHTMAPS && surf->styles[map] != 255; map++)
{ {
if (r_newrefdef.lightstyles[surf->styles[map]].white != if (r_newrefdef.lightstyles[surf->styles[map]].white != surf->cached_light[map])
surf->cached_light[map])
{ {
goto dynamic; if (!(surf->texinfo->flags & (SURF_SKY | SURF_TRANS33 | SURF_TRANS66 | SURF_WARP)))
{
is_dynamic = true;
}
} }
} }
// Normal dynamic lights
if (surf->dlightframe == r_framecount) if (surf->dlightframe == r_framecount)
{ {
dynamic:
if (gl_dynamic->value) if (gl_dynamic->value)
{ {
if (!(surf->texinfo->flags & if (!(surf->texinfo->flags & (SURF_SKY | SURF_TRANS33 | SURF_TRANS66 | SURF_WARP)))
(SURF_SKY | SURF_TRANS33 | SURF_TRANS66 | SURF_WARP)))
{ {
is_dynamic = true; is_dynamic = true;
} }
@ -693,138 +704,97 @@ R_RenderLightmappedPoly(msurface_t *surf)
if (is_dynamic) if (is_dynamic)
{ {
unsigned temp[128 * 128]; // Dynamic lights on a surface
int smax, tmax; if (((surf->styles[map] >= 32) || (surf->styles[map] == 0)) && (surf->dlightframe != r_framecount))
if (((surf->styles[map] >= 32) ||
(surf->styles[map] == 0)) &&
(surf->dlightframe != r_framecount))
{ {
smax = (surf->extents[0] >> 4) + 1; smax = (surf->extents[0] >> 4) + 1;
tmax = (surf->extents[1] >> 4) + 1; tmax = (surf->extents[1] >> 4) + 1;
R_BuildLightMap(surf, (void *)temp, smax * 4); R_BuildLightMap(surf, (void *) temp, smax * 4);
R_SetCacheState(surf); R_SetCacheState(surf);
R_MBind(GL_TEXTURE1_ARB, gl_state.lightmap_textures + surf->lightmaptexturenum); R_MBind(GL_TEXTURE1_ARB, gl_state.lightmap_textures + surf->lightmaptexturenum);
lmtex = surf->lightmaptexturenum; lmtex = surf->lightmaptexturenum;
glTexSubImage2D(GL_TEXTURE_2D, 0, surf->light_s, surf->light_t, glTexSubImage2D(GL_TEXTURE_2D, 0, surf->light_s, surf->light_t, smax,
smax, tmax, GL_LIGHTMAP_FORMAT, GL_UNSIGNED_BYTE, temp); tmax, GL_LIGHTMAP_FORMAT, GL_UNSIGNED_BYTE, temp);
} }
else else // Normal dynamic lights
{ {
smax = (surf->extents[0] >> 4) + 1; smax = (surf->extents[0] >> 4) + 1;
tmax = (surf->extents[1] >> 4) + 1; tmax = (surf->extents[1] >> 4) + 1;
R_BuildLightMap(surf, (void *)temp, smax * 4); R_BuildLightMap(surf, (void *) temp, smax * 4);
R_MBind(GL_TEXTURE1_ARB, gl_state.lightmap_textures + 0); R_MBind(GL_TEXTURE1_ARB, gl_state.lightmap_textures + 0);
lmtex = 0; lmtex = 0;
glTexSubImage2D(GL_TEXTURE_2D, 0, surf->light_s, surf->light_t, glTexSubImage2D(GL_TEXTURE_2D, 0, surf->light_s, surf->light_t, smax,
smax, tmax, GL_LIGHTMAP_FORMAT, GL_UNSIGNED_BYTE, temp); tmax, GL_LIGHTMAP_FORMAT, GL_UNSIGNED_BYTE, temp);
} }
c_brush_polys++; c_brush_polys++;
R_MBind(GL_TEXTURE0_ARB, image->texnum); R_MBind(GL_TEXTURE0_ARB, image->texnum);
R_MBind(GL_TEXTURE1_ARB, gl_state.lightmap_textures + lmtex); R_MBind(GL_TEXTURE1_ARB, gl_state.lightmap_textures + lmtex);
if (surf->texinfo->flags & SURF_FLOWING)
{
float scroll;
scroll = -64 * ((r_newrefdef.time / 40.0) - (int)(r_newrefdef.time / 40.0));
if (scroll == 0.0)
{
scroll = -64.0;
}
for (p = surf->polys; p; p = p->chain)
{
v = p->verts[0];
glBegin(GL_POLYGON);
for (i = 0; i < nv; i++, v += VERTEXSIZE)
{
qglMultiTexCoord2fARB(GL_TEXTURE0, (v[3]+scroll), v[4]);
qglMultiTexCoord2fvARB(GL_TEXTURE1, &v[5]);
glVertex3fv(v);
}
glEnd();
}
}
else
{
for (p = surf->polys; p; p = p->chain)
{
v = p->verts[0];
glBegin(GL_POLYGON);
for (i=0 ; i< nv; i++, v+= VERTEXSIZE)
{
qglMultiTexCoord2fvARB(GL_TEXTURE0, &v[3]);
qglMultiTexCoord2fvARB(GL_TEXTURE1, &v[5]);
glVertex3fv(v);
}
glEnd();
}
}
} }
else else // No dynamic lights
{ {
c_brush_polys++; c_brush_polys++;
R_MBind(GL_TEXTURE0_ARB, image->texnum); R_MBind(GL_TEXTURE0_ARB, image->texnum);
R_MBind(GL_TEXTURE1_ARB, gl_state.lightmap_textures + lmtex); R_MBind(GL_TEXTURE1_ARB, gl_state.lightmap_textures + lmtex);
}
if (surf->texinfo->flags & SURF_FLOWING) if (surf->texinfo->flags & SURF_FLOWING)
{
scroll = -64 * ((r_newrefdef.time / 40.0) - (int) (r_newrefdef.time / 40.0));
if (scroll == 0.0)
{ {
float scroll; scroll = -64.0;
scroll = -64 * ((r_newrefdef.time / 40.0) - (int)(r_newrefdef.time / 40.0));
if (scroll == 0.0)
{
scroll = -64.0;
}
for (p = surf->polys; p; p = p->chain)
{
v = p->verts[0];
glBegin(GL_POLYGON);
for (i=0 ; i< nv; i++, v+= VERTEXSIZE)
{
qglMultiTexCoord2fARB(GL_TEXTURE0, (v[3]+scroll), v[4]);
qglMultiTexCoord2fARB(GL_TEXTURE1, v[5], v[6]);
}
glEnd();
}
} }
else
for (p = surf->polys; p; p = p->chain)
{ {
for (p = surf->polys; p; p = p->chain) v = p->verts[0];
glBegin(GL_POLYGON);
for (i = 0; i < nv; i++, v += VERTEXSIZE)
{ {
v = p->verts[0]; qglMultiTexCoord2fARB(GL_TEXTURE0, (v[3] + scroll), v[4]);
glBegin (GL_POLYGON); qglMultiTexCoord2fvARB(GL_TEXTURE1, &v[5]);
glVertex3fv(v);
for (i=0 ; i< nv; i++, v+= VERTEXSIZE)
{
qglMultiTexCoord2fvARB(GL_TEXTURE0, &v[3]);
qglMultiTexCoord2fvARB(GL_TEXTURE1, &v[5]);
glVertex3fv(v);
}
glEnd();
} }
glEnd();
}
}
else
{
for (p = surf->polys; p; p = p->chain)
{
v = p->verts[0];
// Polygon
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, VERTEXSIZE * sizeof(GLfloat), v);
// Texture
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
qglClientActiveTextureARB(GL_TEXTURE0_ARB);
glTexCoordPointer(2, GL_FLOAT, VERTEXSIZE * sizeof(GLfloat), v + 3);
// Lightmap
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
qglClientActiveTextureARB(GL_TEXTURE1_ARB);
glTexCoordPointer(2, GL_FLOAT, VERTEXSIZE * sizeof(GLfloat), v + 5);
// Draw the crap
glDrawArrays(GL_TRIANGLE_FAN, 0, p->numverts);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
} }
} }
} }