Skip to content

Commit

Permalink
Huge renderer optimization.
Browse files Browse the repository at this point in the history
  • Loading branch information
Rinnegatamante committed Jul 2, 2019
1 parent e506aed commit b1de3ac
Show file tree
Hide file tree
Showing 8 changed files with 148 additions and 143 deletions.
4 changes: 0 additions & 4 deletions source/gl_draw.cpp
Expand Up @@ -10,10 +10,6 @@ extern "C"{
#include "quakedef.h"
}

float gVertexBuffer[VERTEXARRAYSIZE];
float gColorBuffer[VERTEXARRAYSIZE];
float gTexCoordBuffer[VERTEXARRAYSIZE];

extern int ColorIndex[16];
extern unsigned ColorPercent[16];
extern qboolean vid_initialized;
Expand Down
24 changes: 12 additions & 12 deletions source/gl_rlight.c
Expand Up @@ -88,24 +88,24 @@ void R_RenderDlight (dlight_t *light)
GL_DisableState(GL_TEXTURE_COORD_ARRAY);
float* pPos = gVertexBuffer;
float* pColor = gColorBuffer;
*pColor++ = 0.2f;
*pColor++ = 0.1f;
*pColor++ = 0.0f;
*pColor++ = 1.0f;
*gColorBuffer++ = 0.2f;
*gColorBuffer++ = 0.1f;
*gColorBuffer++ = 0.0f;
*gColorBuffer++ = 1.0f;
for (i=0 ; i<3 ; i++)
*pPos++ = light->origin[i] - vpn[i]*rad;
*gVertexBuffer++ = light->origin[i] - vpn[i]*rad;
for (i=16 ; i>=0 ; i--)
{
*pColor++ = 0.0f;
*pColor++ = 0.0f;
*pColor++ = 0.0f;
*pColor++ = 1.0f;
*gColorBuffer++ = 0.0f;
*gColorBuffer++ = 0.0f;
*gColorBuffer++ = 0.0f;
*gColorBuffer++ = 1.0f;
for (j=0 ; j<3 ; j++)
*pPos++ = light->origin[j] + vright[j]*costablef[i]*rad
*gVertexBuffer++ = light->origin[j] + vright[j]*costablef[i]*rad
+ vup[j]*sintablef[i]*rad;
}
vglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 18, gVertexBuffer);
vglVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 18, gColorBuffer);
vglVertexAttribPointerMapped(0, pPos);
vglVertexAttribPointerMapped(1, pColor);
GL_DrawPolygon(GL_TRIANGLE_FAN, 18);
GL_DisableState(GL_COLOR_ARRAY);
GL_EnableState(GL_TEXTURE_COORD_ARRAY);
Expand Down
72 changes: 35 additions & 37 deletions source/gl_rmain.c
Expand Up @@ -448,21 +448,22 @@ void R_DrawSpriteModel (entity_t *e)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

VectorMA (e->origin, frame->down, r_spritedesc.vup, point);
VectorMA (point, frame->left, r_spritedesc.vright, pPoint);
pPoint += 3;
VectorMA (point, frame->left, r_spritedesc.vright, gVertexBuffer);
gVertexBuffer += 3;

VectorMA (e->origin, frame->up, r_spritedesc.vup, point);
VectorMA (point, frame->left, r_spritedesc.vright, pPoint);
pPoint += 3;
VectorMA (point, frame->left, r_spritedesc.vright, gVertexBuffer);
gVertexBuffer += 3;

VectorMA (e->origin, frame->up, r_spritedesc.vup, point);
VectorMA (point, frame->right, r_spritedesc.vright, pPoint);
pPoint += 3;
VectorMA (point, frame->right, r_spritedesc.vright, gVertexBuffer);
gVertexBuffer += 3;

VectorMA (e->origin, frame->down, r_spritedesc.vup, point);
VectorMA (point, frame->right, r_spritedesc.vright, pPoint);

vglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 4, gVertexBuffer);
VectorMA (point, frame->right, r_spritedesc.vright, gVertexBuffer);
gVertexBuffer += 3;

vglVertexAttribPointerMapped(0, pPoint);
vglVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 4, texCoords);
GL_DrawPolygon(GL_TRIANGLE_FAN, 4);

Expand Down Expand Up @@ -570,8 +571,8 @@ void GL_DrawAliasFrame (aliashdr_t *paliashdr, int posenum)
for (c = 0; c < count; ++c)
{
// texture coordinates come from the draw list
*pTexCoord++ = ((float *)order)[0];
*pTexCoord++ = ((float *)order)[1];
*gTexCoordBuffer++ = ((float *)order)[0];
*gTexCoordBuffer++ = ((float *)order)[1];
order += 2;

// calculate light as vector so that intensity is it's length
Expand All @@ -598,19 +599,19 @@ void GL_DrawAliasFrame (aliashdr_t *paliashdr, int posenum)
}

// normals and vertexes come from the frame list
*pColor++ = l[0];
*pColor++ = l[1];
*pColor++ = l[2];
*pColor++ = model_constant_alpha;
*pPos++ = verts->v[0];
*pPos++ = verts->v[1];
*pPos++ = verts->v[2];
*gColorBuffer++ = l[0];
*gColorBuffer++ = l[1];
*gColorBuffer++ = l[2];
*gColorBuffer++ = model_constant_alpha;
*gVertexBuffer++ = verts->v[0];
*gVertexBuffer++ = verts->v[1];
*gVertexBuffer++ = verts->v[2];
verts++;
}

vglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, count, gVertexBuffer);
vglVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, count, gTexCoordBuffer);
vglVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, count, gColorBuffer);
vglVertexAttribPointerMapped(0, pPos);
vglVertexAttribPointerMapped(1, pTexCoord);
vglVertexAttribPointerMapped(2, pColor);
GL_DrawPolygon(primType, count);
}

Expand Down Expand Up @@ -639,8 +640,6 @@ void GL_DrawAliasFrame (aliashdr_t *paliashdr, int posenum)
break; // done

int primType;
float* pColor;
float* pPos;
if (count < 0)
{
count = -count;
Expand All @@ -649,22 +648,21 @@ void GL_DrawAliasFrame (aliashdr_t *paliashdr, int posenum)
else
primType = GL_TRIANGLE_STRIP;

pPos = gVertexBuffer;
pColor = gColorBuffer;
float *pPos = gVertexBuffer;
int c;
for (c = 0; c < count; ++c)
{
order += 2;

*pPos++ = verts->v[0];
*pPos++ = verts->v[1];
*pPos++ = verts->v[2];
*gVertexBuffer++ = verts->v[0];
*gVertexBuffer++ = verts->v[1];
*gVertexBuffer++ = verts->v[2];
verts++;
}

float color[4] = {0.0f, 0.0f, 0.0f, model_constant_alpha};
glUniform4fv(monocolor, 1, color);
vglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, count, gVertexBuffer);
vglVertexAttribPointerMapped(0, pPos);
GL_DrawPolygon(primType, count);
}

Expand Down Expand Up @@ -734,23 +732,23 @@ void GL_DrawAliasShadow (aliashdr_t *paliashdr, int posenum)
order += 2;

// normals and vertexes come from the frame list
pVertex[0] = verts->v[0] * paliashdr->scale[0] + paliashdr->scale_origin[0];
pVertex[1] = verts->v[1] * paliashdr->scale[1] + paliashdr->scale_origin[1];
pVertex[2] = verts->v[2] * paliashdr->scale[2] + paliashdr->scale_origin[2];
gVertexBuffer[0] = verts->v[0] * paliashdr->scale[0] + paliashdr->scale_origin[0];
gVertexBuffer[1] = verts->v[1] * paliashdr->scale[1] + paliashdr->scale_origin[1];
gVertexBuffer[2] = verts->v[2] * paliashdr->scale[2] + paliashdr->scale_origin[2];

pVertex[0] -= shadevector[0]*(pVertex[2]+lheight);
pVertex[1] -= shadevector[1]*(pVertex[2]+lheight);
pVertex[2] = height;
gVertexBuffer[0] -= shadevector[0]*(pVertex[2]+lheight);
gVertexBuffer[1] -= shadevector[1]*(pVertex[2]+lheight);
gVertexBuffer[2] = height;
// height -= 0.001;
pVertex += 3;
gVertexBuffer += 3;

verts++;
}

GL_DisableState(GL_TEXTURE_COORD_ARRAY);
const float color[] = {0,0,0,0.5f};
glUniform4fv(monocolor, 1, color);
vglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, count, gVertexBuffer);
vglVertexAttribPointerMapped(0, pVertex);
GL_DrawPolygon(primType, count);
GL_EnableState(GL_TEXTURE_COORD_ARRAY);
}
Expand Down
90 changes: 45 additions & 45 deletions source/gl_rsurf.c
Expand Up @@ -262,20 +262,20 @@ void DrawGLWaterPoly (glpoly_t *p)
//vec3_t nv;

v = p->verts[0];
float* pnv = gVertexBuffer;
float* pnt = gTexCoordBuffer;
float *pnv = gVertexBuffer;
float *pnt = gTexCoordBuffer;
for (i=0 ; i<p->numverts ; i++, v+= VERTEXSIZE)
{
pnv[0] = v[0];
pnv[1] = v[1];
pnv[2] = v[2];
pnt[0] = v[3];
pnt[1] = v[4];
pnv +=3;
pnt +=2;
gVertexBuffer[0] = v[0];
gVertexBuffer[1] = v[1];
gVertexBuffer[2] = v[2];
gTexCoordBuffer[0] = v[3];
gTexCoordBuffer[1] = v[4];
gVertexBuffer +=3;
gTexCoordBuffer +=2;
}
vglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, p->numverts, gVertexBuffer);
vglVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, p->numverts, gTexCoordBuffer);
vglVertexAttribPointerMapped(0, pnv);
vglVertexAttribPointerMapped(1, pnt);
GL_DrawPolygon(GL_TRIANGLE_FAN, p->numverts);
}
void DrawGLWaterPolyLightmap (glpoly_t *p)
Expand All @@ -285,21 +285,21 @@ void DrawGLWaterPolyLightmap (glpoly_t *p)
float s, t, os, ot;
//vec3_t nv;

float* pnv = gVertexBuffer;
float* pnt = gTexCoordBuffer;
float *pnv = gVertexBuffer;
float *pnt = gTexCoordBuffer;
v = p->verts[0];
for (i=0 ; i<p->numverts ; i++, v+= VERTEXSIZE)
{
pnv[0] = v[0];
pnv[1] = v[1];
pnv[2] = v[2];
pnt[0] = v[5];
pnt[1] = v[6];
pnv +=3;
pnt +=2;
gVertexBuffer[0] = v[0];
gVertexBuffer[1] = v[1];
gVertexBuffer[2] = v[2];
gTexCoordBuffer[0] = v[5];
gTexCoordBuffer[1] = v[6];
gVertexBuffer +=3;
gTexCoordBuffer +=2;
}
vglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, p->numverts, gVertexBuffer);
vglVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, p->numverts, gTexCoordBuffer);
vglVertexAttribPointerMapped(0, pnv);
vglVertexAttribPointerMapped(1, pnt);
GL_DrawPolygon(GL_TRIANGLE_FAN, p->numverts);
}

Expand All @@ -312,45 +312,45 @@ void DrawGLPoly (glpoly_t *p)
{
int i;
float *v = p->verts[0];
float* pnv = gVertexBuffer;
float* pnt = gTexCoordBuffer;
float *pnv = gVertexBuffer;
float *pnt = gTexCoordBuffer;

for (i=0 ; i<p->numverts ; i++, v+= VERTEXSIZE)
{
pnv[0] = v[0];
pnv[1] = v[1];
pnv[2] = v[2];
pnt[0] = v[3];
pnt[1] = v[4];
pnv += 3;
pnt +=2;
gVertexBuffer[0] = v[0];
gVertexBuffer[1] = v[1];
gVertexBuffer[2] = v[2];
gTexCoordBuffer[0] = v[3];
gTexCoordBuffer[1] = v[4];
gVertexBuffer += 3;
gTexCoordBuffer +=2;
}

vglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, p->numverts, gVertexBuffer);
vglVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, p->numverts, gTexCoordBuffer);
vglVertexAttribPointerMapped(0, pnv);
vglVertexAttribPointerMapped(1, pnt);
GL_DrawPolygon(GL_TRIANGLE_FAN, p->numverts);
}

void DrawGLPolyLightmap (glpoly_t *p)
{
int i;
float* v = p->verts[0];
float* pnv = gVertexBuffer;
float* pnt = gTexCoordBuffer;
float *v = p->verts[0];
float *pnv = gVertexBuffer;
float *pnt = gTexCoordBuffer;

for (i=0 ; i<p->numverts ; i++, v+= VERTEXSIZE)
{
pnv[0] = v[0];
pnv[1] = v[1];
pnv[2] = v[2];
pnt[0] = v[5];
pnt[1] = v[6];
pnv += 3;
pnt +=2;
gVertexBuffer[0] = v[0];
gVertexBuffer[1] = v[1];
gVertexBuffer[2] = v[2];
gTexCoordBuffer[0] = v[5];
gTexCoordBuffer[1] = v[6];
gVertexBuffer += 3;
gTexCoordBuffer +=2;
}

vglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, p->numverts, gVertexBuffer);
vglVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, p->numverts, gTexCoordBuffer);
vglVertexAttribPointerMapped(0, pnv);
vglVertexAttribPointerMapped(1, pnt);
GL_DrawPolygon(GL_TRIANGLE_FAN, p->numverts);
}

Expand Down
14 changes: 13 additions & 1 deletion source/gl_vidpsp2.c
Expand Up @@ -19,6 +19,13 @@
#define NO_MODE (MODE_WINDOWED - 1)
#define MODE_FULLSCREEN_DEFAULT (MODE_WINDOWED + 1)

float *gVertexBuffer;
float *gColorBuffer;
float *gTexCoordBuffer;
float *gVertexBufferPtr;
float *gColorBufferPtr;
float *gTexCoordBufferPtr;

int scr_width = 960, scr_height = 544;

byte globalcolormap[VID_GRADES*256];
Expand Down Expand Up @@ -421,7 +428,9 @@ void GL_Init (void)
for (i=0;i<MAX_INDICES;i++){
indices[i] = i;
}

gVertexBufferPtr = (float*)malloc(0x400000);
gColorBufferPtr = (float*)malloc(0x200000);
gTexCoordBufferPtr = (float*)malloc(0x200000);
}

/*
Expand All @@ -438,6 +447,9 @@ void GL_BeginRendering (int *x, int *y, int *width, int *height)

vglStartRendering();
vglIndexPointerMapped(indices);
gVertexBuffer = gVertexBufferPtr;
gColorBuffer = gColorBufferPtr;
gTexCoordBuffer = gTexCoordBufferPtr;
}


Expand Down

0 comments on commit b1de3ac

Please sign in to comment.