mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-29 07:41:47 +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
|
||||
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)
|
||||
{
|
||||
|
@ -71,7 +71,7 @@ R_ApplyGLBuffer(void)
|
|||
// defaults for drawing (mostly buf_singletex features)
|
||||
vtx_size = 3;
|
||||
texture = true;
|
||||
alpha = texenv_set = false;
|
||||
mtex = alpha = texenv_set = false;
|
||||
|
||||
// choosing features by type
|
||||
switch (gl_buf.type)
|
||||
|
@ -79,6 +79,9 @@ R_ApplyGLBuffer(void)
|
|||
case buf_2d:
|
||||
vtx_size = 2;
|
||||
break;
|
||||
case buf_mtex:
|
||||
mtex = true;
|
||||
break;
|
||||
case buf_alpha:
|
||||
alpha = true;
|
||||
break;
|
||||
|
@ -86,6 +89,8 @@ R_ApplyGLBuffer(void)
|
|||
break;
|
||||
}
|
||||
|
||||
R_EnableMultitexture(mtex);
|
||||
|
||||
if (alpha)
|
||||
{
|
||||
// the textures are prescaled up for a better
|
||||
|
@ -130,7 +135,27 @@ R_ApplyGLBuffer(void)
|
|||
|
||||
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);
|
||||
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)
|
||||
{
|
||||
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_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++] = 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 *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++;
|
||||
v = surf->polys->verts[0];
|
||||
|
||||
|
@ -593,60 +584,19 @@ R_RenderLightmappedPoly(entity_t *currententity, msurface_t *surf)
|
|||
{
|
||||
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
|
||||
{
|
||||
// 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, 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);
|
||||
scroll = 0.0;
|
||||
}
|
||||
|
||||
glDisableClientState(GL_VERTEX_ARRAY);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
R_SetBufferIndices(GL_TRIANGLE_FAN, nv);
|
||||
|
||||
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) */
|
||||
|
@ -782,8 +732,6 @@ R_DrawTextureChains(entity_t *currententity)
|
|||
}
|
||||
else // multitexture
|
||||
{
|
||||
R_EnableMultitexture(true);
|
||||
|
||||
for (i = 0, image = gltextures; i < numgltextures; i++, image++)
|
||||
{
|
||||
if (!image->registration_sequence || !image->texturechain)
|
||||
|
@ -791,17 +739,18 @@ R_DrawTextureChains(entity_t *currententity)
|
|||
continue;
|
||||
}
|
||||
|
||||
R_MBind(GL_TEXTURE0, image->texnum); // setting it only once
|
||||
c_visible_textures++;
|
||||
|
||||
for (s = image->texturechain; s; s = s->texturechain)
|
||||
{
|
||||
if (!(s->flags & SURF_DRAWTURB))
|
||||
{
|
||||
R_UpdateGLBuffer(buf_mtex, image->texnum, s->lightmaptexturenum, 0, 1);
|
||||
R_RenderLightmappedPoly(currententity, s);
|
||||
}
|
||||
}
|
||||
}
|
||||
R_ApplyGLBuffer();
|
||||
|
||||
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))
|
||||
{
|
||||
// Dynamic lighting already generated in R_GetBrushesLighting()
|
||||
R_EnableMultitexture(true);
|
||||
R_MBind(GL_TEXTURE0, image->texnum);
|
||||
R_UpdateGLBuffer(buf_mtex, image->texnum, psurf->lightmaptexturenum, 0, 1);
|
||||
R_RenderLightmappedPoly(currententity, psurf);
|
||||
}
|
||||
else
|
||||
|
@ -896,7 +844,6 @@ R_DrawInlineBModel(entity_t *currententity, const model_t *currentmodel)
|
|||
}
|
||||
}
|
||||
}
|
||||
R_EnableMultitexture(false);
|
||||
R_ApplyGLBuffer();
|
||||
|
||||
if (!(currententity->flags & RF_TRANSLUCENT))
|
||||
|
|
|
@ -111,6 +111,7 @@ typedef enum
|
|||
{
|
||||
buf_2d,
|
||||
buf_singletex,
|
||||
buf_mtex,
|
||||
buf_alpha
|
||||
} 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_BufferVertex(GLfloat x, GLfloat y, GLfloat z);
|
||||
void R_BufferSingleTex(GLfloat s, GLfloat t);
|
||||
void R_BufferMultiTex(GLfloat cs, GLfloat ct, GLfloat ls, GLfloat lt);
|
||||
|
||||
#ifdef DEBUG
|
||||
void glCheckError_(const char *file, const char *function, int line);
|
||||
|
|
Loading…
Reference in a new issue