Clean up mdsprite.c:md3draw() by tightening locals, factoring out 2x dup code.

git-svn-id: https://svn.eduke32.com/eduke32@3585 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2013-03-21 10:19:41 +00:00
parent 182121a0aa
commit 61f501c3fc

View file

@ -2032,20 +2032,58 @@ static void md3_vox_calcmat_common(const spritetype *tspr, const point3d *a0, fl
mat[14] += a0->y*mat[2] + a0->z*mat[6] + a0->x*mat[10]; mat[14] += a0->y*mat[2] + a0->z*mat[6] + a0->x*mat[10];
} }
static inline void md3draw_handle_triangles(const md3surf_t *s, uint16_t *indexhandle,
int32_t texunits, const md3model_t *M)
{
int32_t i, j;
if (r_vertexarrays)
{
int32_t k = 0;
for (i=s->numtris-1; i>=0; i--)
{
uint16_t tri = M ? M->indexes[i] : i;
for (j=0; j<3; j++)
indexhandle[k++] = s->tris[tri].i[j];
}
}
else
{
bglBegin(GL_TRIANGLES);
for (i=s->numtris-1; i>=0; i--)
{
uint16_t tri = M ? M->indexes[i] : i;
for (j=0; j<3; j++)
{
int32_t k = s->tris[tri].i[j];
if (texunits > GL_TEXTURE0_ARB)
{
int32_t l = GL_TEXTURE0_ARB;
while (l <= texunits)
bglMultiTexCoord2fARB(l++, s->uv[k].u,s->uv[k].v);
}
else
bglTexCoord2f(s->uv[k].u,s->uv[k].v);
bglVertex3fv((float *)&vertlist[k]);
}
}
bglEnd();
}
}
static int32_t md3draw(md3model_t *m, const spritetype *tspr) static int32_t md3draw(md3model_t *m, const spritetype *tspr)
{ {
point3d fp, fp1, fp2, m0, m1, a0; point3d fp, fp1, fp2, m0, m1, a0;
md3xyzn_t *v0, *v1; md3xyzn_t *v0, *v1;
int32_t i, j, k, l, surfi; int32_t i, surfi;
float f, g, k0, k1, k2=0, k3=0, mat[16]; // inits: compiler-happy float f, g, k0, k1, k2=0, k3=0, mat[16]; // inits: compiler-happy
md3surf_t *s;
GLfloat pc[4]; GLfloat pc[4];
int32_t texunits = GL_TEXTURE0_ARB; int32_t texunits = GL_TEXTURE0_ARB;
mdskinmap_t *sk;
//PLAG : sorting stuff
void *vbotemp;
point3d *vertexhandle = NULL;
uint16_t *indexhandle;
uint8_t lpal = (tspr->owner >= MAXSPRITES) ? tspr->pal : sprite[tspr->owner].pal; uint8_t lpal = (tspr->owner >= MAXSPRITES) ? tspr->pal : sprite[tspr->owner].pal;
if (r_vbos && (m->vbos == NULL)) if (r_vbos && (m->vbos == NULL))
@ -2230,7 +2268,13 @@ static int32_t md3draw(md3model_t *m, const spritetype *tspr)
for (surfi=0; surfi<m->head.numsurfs; surfi++) for (surfi=0; surfi<m->head.numsurfs; surfi++)
{ {
s = &m->head.surfs[surfi]; //PLAG : sorting stuff
void *vbotemp;
point3d *vertexhandle = NULL;
uint16_t *indexhandle;
const md3surf_t const *s = &m->head.surfs[surfi];
v0 = &s->xyzn[m->cframe*s->numverts]; v0 = &s->xyzn[m->cframe*s->numverts];
v1 = &s->xyzn[m->nframe*s->numverts]; v1 = &s->xyzn[m->nframe*s->numverts];
@ -2304,6 +2348,8 @@ static int32_t md3draw(md3model_t *m, const spritetype *tspr)
if (i) if (i)
{ {
mdskinmap_t *sk;
bglActiveTextureARB(++texunits); bglActiveTextureARB(++texunits);
bglEnable(GL_TEXTURE_2D); bglEnable(GL_TEXTURE_2D);
@ -2412,61 +2458,11 @@ static int32_t md3draw(md3model_t *m, const spritetype *tspr)
// dichotomic recursive sorting - about 100x less iterations than bubblesort // dichotomic recursive sorting - about 100x less iterations than bubblesort
quicksort(m->indexes, m->maxdepths, 0, s->numtris - 1); quicksort(m->indexes, m->maxdepths, 0, s->numtris - 1);
if (r_vertexarrays) md3draw_handle_triangles(s, indexhandle, texunits, m);
{
k = 0;
for (i=s->numtris-1; i>=0; i--)
for (j=0; j<3; j++)
indexhandle[k++] = s->tris[m->indexes[i]].i[j];
} }
else else
{ {
bglBegin(GL_TRIANGLES); md3draw_handle_triangles(s, indexhandle, texunits, NULL);
for (i=s->numtris-1; i>=0; i--)
for (j=0; j<3; j++)
{
k = s->tris[m->indexes[i]].i[j];
if (texunits > GL_TEXTURE0_ARB)
{
l = GL_TEXTURE0_ARB;
while (l <= texunits)
bglMultiTexCoord2fARB(l++, s->uv[k].u,s->uv[k].v);
}
else
bglTexCoord2f(s->uv[k].u,s->uv[k].v);
bglVertex3fv((float *)&vertlist[k]);
}
bglEnd();
}
}
else
{
if (r_vertexarrays)
{
k = 0;
for (i=s->numtris-1; i>=0; i--)
for (j=0; j<3; j++)
indexhandle[k++] = s->tris[i].i[j];
}
else
{
bglBegin(GL_TRIANGLES);
for (i=s->numtris-1; i>=0; i--)
for (j=0; j<3; j++)
{
k = s->tris[i].i[j];
if (texunits > GL_TEXTURE0_ARB)
{
l = GL_TEXTURE0_ARB;
while (l <= texunits)
bglMultiTexCoord2fARB(l++, s->uv[k].u,s->uv[k].v);
}
else
bglTexCoord2f(s->uv[k].u,s->uv[k].v);
bglVertex3fv((float *)&vertlist[k]);
}
bglEnd();
}
} }
if (r_vertexarrays && r_vbos) if (r_vertexarrays && r_vbos)
@ -2477,6 +2473,7 @@ static int32_t md3draw(md3model_t *m, const spritetype *tspr)
if (r_vertexarrays) if (r_vertexarrays)
{ {
int32_t l;
if (r_vbos) if (r_vbos)
bglBindBufferARB(GL_ARRAY_BUFFER_ARB, m->vbos[surfi]); bglBindBufferARB(GL_ARRAY_BUFFER_ARB, m->vbos[surfi]);
l = GL_TEXTURE0_ARB; l = GL_TEXTURE0_ARB;