mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-10 07:12:07 +00:00
GL1 unified draw calls, part 3
Batching / buffered procedure, applied to multitexture surfaces. This solves the issue with gl1_overbrightbits, when jumping between 0 and 2-4.
This commit is contained in:
parent
4461128255
commit
749e70b988
3 changed files with 55 additions and 67 deletions
|
@ -61,7 +61,7 @@ R_ApplyGLBuffer(void)
|
||||||
{
|
{
|
||||||
// Properties of batched draws here
|
// Properties of batched draws here
|
||||||
GLint vtx_size;
|
GLint vtx_size;
|
||||||
qboolean texture, alpha, texenv_set;
|
qboolean texture, mtex, alpha, texenv_set;
|
||||||
|
|
||||||
if (gl_buf.vtx_ptr == 0 || gl_buf.idx_ptr == 0)
|
if (gl_buf.vtx_ptr == 0 || gl_buf.idx_ptr == 0)
|
||||||
{
|
{
|
||||||
|
@ -71,7 +71,7 @@ R_ApplyGLBuffer(void)
|
||||||
// defaults for drawing (mostly buf_singletex features)
|
// defaults for drawing (mostly buf_singletex features)
|
||||||
vtx_size = 3;
|
vtx_size = 3;
|
||||||
texture = true;
|
texture = true;
|
||||||
alpha = texenv_set = false;
|
mtex = alpha = texenv_set = false;
|
||||||
|
|
||||||
// choosing features by type
|
// choosing features by type
|
||||||
switch (gl_buf.type)
|
switch (gl_buf.type)
|
||||||
|
@ -79,6 +79,9 @@ R_ApplyGLBuffer(void)
|
||||||
case buf_2d:
|
case buf_2d:
|
||||||
vtx_size = 2;
|
vtx_size = 2;
|
||||||
break;
|
break;
|
||||||
|
case buf_mtex:
|
||||||
|
mtex = true;
|
||||||
|
break;
|
||||||
case buf_alpha:
|
case buf_alpha:
|
||||||
alpha = true;
|
alpha = true;
|
||||||
break;
|
break;
|
||||||
|
@ -86,6 +89,8 @@ R_ApplyGLBuffer(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
R_EnableMultitexture(mtex);
|
||||||
|
|
||||||
if (alpha)
|
if (alpha)
|
||||||
{
|
{
|
||||||
// the textures are prescaled up for a better
|
// the textures are prescaled up for a better
|
||||||
|
@ -130,7 +135,27 @@ R_ApplyGLBuffer(void)
|
||||||
|
|
||||||
if (texture)
|
if (texture)
|
||||||
{
|
{
|
||||||
R_Bind(gl_buf.texture[0]);
|
if (mtex)
|
||||||
|
{
|
||||||
|
// TMU 1: Lightmap texture
|
||||||
|
R_MBind(GL_TEXTURE1, gl_state.lightmap_textures + gl_buf.texture[1]);
|
||||||
|
|
||||||
|
if (gl1_overbrightbits->value)
|
||||||
|
{
|
||||||
|
R_TexEnv(GL_COMBINE);
|
||||||
|
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, gl1_overbrightbits->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
glTexCoordPointer(2, GL_FLOAT, 0, gl_buf.tex[1]);
|
||||||
|
|
||||||
|
// TMU 0: Color texture
|
||||||
|
R_MBind(GL_TEXTURE0, gl_buf.texture[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
R_Bind(gl_buf.texture[0]);
|
||||||
|
}
|
||||||
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
glTexCoordPointer(2, GL_FLOAT, 0, gl_buf.tex[0]);
|
glTexCoordPointer(2, GL_FLOAT, 0, gl_buf.tex[0]);
|
||||||
|
@ -159,6 +184,7 @@ void
|
||||||
R_UpdateGLBuffer(buffered_draw_t type, int colortex, int lighttex, int flags, float alpha)
|
R_UpdateGLBuffer(buffered_draw_t type, int colortex, int lighttex, int flags, float alpha)
|
||||||
{
|
{
|
||||||
if ( gl_buf.type != type || gl_buf.texture[0] != colortex ||
|
if ( gl_buf.type != type || gl_buf.texture[0] != colortex ||
|
||||||
|
(gl_config.multitexture && type == buf_mtex && gl_buf.texture[1] != lighttex) ||
|
||||||
(type == buf_singletex && gl_buf.flags != flags) ||
|
(type == buf_singletex && gl_buf.flags != flags) ||
|
||||||
(type == buf_alpha && gl_buf.alpha != alpha))
|
(type == buf_alpha && gl_buf.alpha != alpha))
|
||||||
{
|
{
|
||||||
|
@ -279,3 +305,16 @@ R_BufferSingleTex(GLfloat s, GLfloat t)
|
||||||
gl_buf.tex[0][tx++] = s;
|
gl_buf.tex[0][tx++] = s;
|
||||||
gl_buf.tex[0][tx++] = t;
|
gl_buf.tex[0][tx++] = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Adds texture coordinates for color and lightmap
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
R_BufferMultiTex(GLfloat cs, GLfloat ct, GLfloat ls, GLfloat lt)
|
||||||
|
{
|
||||||
|
gl_buf.tex[0][tx] = cs;
|
||||||
|
gl_buf.tex[0][tx+1] = ct;
|
||||||
|
gl_buf.tex[1][tx] = ls;
|
||||||
|
gl_buf.tex[1][tx+1] = lt;
|
||||||
|
tx += 2;
|
||||||
|
}
|
||||||
|
|
|
@ -573,15 +573,6 @@ R_RenderLightmappedPoly(entity_t *currententity, msurface_t *surf)
|
||||||
float scroll;
|
float scroll;
|
||||||
float *v;
|
float *v;
|
||||||
|
|
||||||
R_MBind(GL_TEXTURE1, gl_state.lightmap_textures + surf->lightmaptexturenum);
|
|
||||||
|
|
||||||
// Apply overbrightbits to TMU 1 (lightmap)
|
|
||||||
if (gl1_overbrightbits->value)
|
|
||||||
{
|
|
||||||
R_TexEnv(GL_COMBINE);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, gl1_overbrightbits->value);
|
|
||||||
}
|
|
||||||
|
|
||||||
c_brush_polys++;
|
c_brush_polys++;
|
||||||
v = surf->polys->verts[0];
|
v = surf->polys->verts[0];
|
||||||
|
|
||||||
|
@ -593,60 +584,19 @@ R_RenderLightmappedPoly(entity_t *currententity, msurface_t *surf)
|
||||||
{
|
{
|
||||||
scroll = -64.0;
|
scroll = -64.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
YQ2_VLA(GLfloat, tex, 4 * nv);
|
|
||||||
unsigned int index_tex = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < nv; i++, v += VERTEXSIZE)
|
|
||||||
{
|
|
||||||
tex[index_tex++] = v[3] + scroll;
|
|
||||||
tex[index_tex++] = v[4];
|
|
||||||
tex[index_tex++] = v[5];
|
|
||||||
tex[index_tex++] = v[6];
|
|
||||||
}
|
|
||||||
v = surf->polys->verts[0];
|
|
||||||
|
|
||||||
// Polygon
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glVertexPointer(3, GL_FLOAT, VERTEXSIZE * sizeof(GLfloat), v);
|
|
||||||
|
|
||||||
// Texture
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
qglClientActiveTexture(GL_TEXTURE0);
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, 4 * sizeof(GLfloat), tex);
|
|
||||||
|
|
||||||
// Lightmap
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
qglClientActiveTexture(GL_TEXTURE1);
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, 4 * sizeof(GLfloat), tex + 2);
|
|
||||||
|
|
||||||
// Draw the thing
|
|
||||||
glDrawArrays(GL_TRIANGLE_FAN, 0, nv);
|
|
||||||
|
|
||||||
YQ2_VLAFREE(tex);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Polygon
|
scroll = 0.0;
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glVertexPointer(3, GL_FLOAT, VERTEXSIZE * sizeof(GLfloat), v);
|
|
||||||
|
|
||||||
// Texture
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
qglClientActiveTexture(GL_TEXTURE0);
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, VERTEXSIZE * sizeof(GLfloat), v + 3);
|
|
||||||
|
|
||||||
// Lightmap
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
qglClientActiveTexture(GL_TEXTURE1);
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, VERTEXSIZE * sizeof(GLfloat), v + 5);
|
|
||||||
|
|
||||||
// Draw it
|
|
||||||
glDrawArrays(GL_TRIANGLE_FAN, 0, nv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
R_SetBufferIndices(GL_TRIANGLE_FAN, nv);
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
|
for (i = 0; i < nv; i++, v += VERTEXSIZE)
|
||||||
|
{
|
||||||
|
R_BufferVertex( v[0], v[1], v[2] );
|
||||||
|
R_BufferMultiTex( v[3] + scroll, v[4], v[5], v[6] );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Upload dynamic lights to each lightmap texture (multitexture path only) */
|
/* Upload dynamic lights to each lightmap texture (multitexture path only) */
|
||||||
|
@ -782,8 +732,6 @@ R_DrawTextureChains(entity_t *currententity)
|
||||||
}
|
}
|
||||||
else // multitexture
|
else // multitexture
|
||||||
{
|
{
|
||||||
R_EnableMultitexture(true);
|
|
||||||
|
|
||||||
for (i = 0, image = gltextures; i < numgltextures; i++, image++)
|
for (i = 0, image = gltextures; i < numgltextures; i++, image++)
|
||||||
{
|
{
|
||||||
if (!image->registration_sequence || !image->texturechain)
|
if (!image->registration_sequence || !image->texturechain)
|
||||||
|
@ -791,17 +739,18 @@ R_DrawTextureChains(entity_t *currententity)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
R_MBind(GL_TEXTURE0, image->texnum); // setting it only once
|
|
||||||
c_visible_textures++;
|
c_visible_textures++;
|
||||||
|
|
||||||
for (s = image->texturechain; s; s = s->texturechain)
|
for (s = image->texturechain; s; s = s->texturechain)
|
||||||
{
|
{
|
||||||
if (!(s->flags & SURF_DRAWTURB))
|
if (!(s->flags & SURF_DRAWTURB))
|
||||||
{
|
{
|
||||||
|
R_UpdateGLBuffer(buf_mtex, image->texnum, s->lightmaptexturenum, 0, 1);
|
||||||
R_RenderLightmappedPoly(currententity, s);
|
R_RenderLightmappedPoly(currententity, s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
R_ApplyGLBuffer();
|
||||||
|
|
||||||
R_EnableMultitexture(false); // force disabling, SURF_DRAWTURB surfaces may not exist
|
R_EnableMultitexture(false); // force disabling, SURF_DRAWTURB surfaces may not exist
|
||||||
|
|
||||||
|
@ -884,8 +833,7 @@ R_DrawInlineBModel(entity_t *currententity, const model_t *currentmodel)
|
||||||
if (gl_config.multitexture && !(psurf->flags & SURF_DRAWTURB))
|
if (gl_config.multitexture && !(psurf->flags & SURF_DRAWTURB))
|
||||||
{
|
{
|
||||||
// Dynamic lighting already generated in R_GetBrushesLighting()
|
// Dynamic lighting already generated in R_GetBrushesLighting()
|
||||||
R_EnableMultitexture(true);
|
R_UpdateGLBuffer(buf_mtex, image->texnum, psurf->lightmaptexturenum, 0, 1);
|
||||||
R_MBind(GL_TEXTURE0, image->texnum);
|
|
||||||
R_RenderLightmappedPoly(currententity, psurf);
|
R_RenderLightmappedPoly(currententity, psurf);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -896,7 +844,6 @@ R_DrawInlineBModel(entity_t *currententity, const model_t *currentmodel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
R_EnableMultitexture(false);
|
|
||||||
R_ApplyGLBuffer();
|
R_ApplyGLBuffer();
|
||||||
|
|
||||||
if (!(currententity->flags & RF_TRANSLUCENT))
|
if (!(currententity->flags & RF_TRANSLUCENT))
|
||||||
|
|
|
@ -111,6 +111,7 @@ typedef enum
|
||||||
{
|
{
|
||||||
buf_2d,
|
buf_2d,
|
||||||
buf_singletex,
|
buf_singletex,
|
||||||
|
buf_mtex,
|
||||||
buf_alpha
|
buf_alpha
|
||||||
} buffered_draw_t;
|
} buffered_draw_t;
|
||||||
|
|
||||||
|
@ -295,6 +296,7 @@ void R_Buffer2DQuad(GLfloat ul_vx, GLfloat ul_vy, GLfloat dr_vx, GLfloat dr_vy,
|
||||||
void R_SetBufferIndices(GLenum type, GLuint vertices_num);
|
void R_SetBufferIndices(GLenum type, GLuint vertices_num);
|
||||||
void R_BufferVertex(GLfloat x, GLfloat y, GLfloat z);
|
void R_BufferVertex(GLfloat x, GLfloat y, GLfloat z);
|
||||||
void R_BufferSingleTex(GLfloat s, GLfloat t);
|
void R_BufferSingleTex(GLfloat s, GLfloat t);
|
||||||
|
void R_BufferMultiTex(GLfloat cs, GLfloat ct, GLfloat ls, GLfloat lt);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
void glCheckError_(const char *file, const char *function, int line);
|
void glCheckError_(const char *file, const char *function, int line);
|
||||||
|
|
Loading…
Reference in a new issue