attempt to support quakeforge 16bit mdl variant. untested.

This commit is contained in:
Shpoike 2019-01-30 01:54:49 +00:00
parent 3a7caf60c3
commit daac6039a5
4 changed files with 273 additions and 160 deletions

View file

@ -107,11 +107,28 @@ void GL_MakeAliasModelDisplayLists (qmodel_t *m, aliashdr_t *paliashdr)
} }
} }
switch(paliashdr->poseverttype)
{
case PV_QUAKEFORGE:
verts = (trivertx_t *) Hunk_Alloc (paliashdr->numposes * paliashdr->numverts_vbo*2 * sizeof(*verts));
paliashdr->vertexes = (byte *)verts - (byte *)paliashdr;
for (i=0 ; i<paliashdr->numposes ; i++)
for (j=0 ; j<paliashdr->numverts_vbo ; j++)
{
verts[i*paliashdr->numverts_vbo*2 + j] = poseverts_mdl[i][desc[j].vertindex];
verts[i*paliashdr->numverts_vbo*2 + j + paliashdr->numverts_vbo] = poseverts_mdl[i][desc[j].vertindex + paliashdr->numverts_vbo];
}
break;
case PV_QUAKE1:
verts = (trivertx_t *) Hunk_Alloc (paliashdr->numposes * paliashdr->numverts_vbo * sizeof(*verts)); verts = (trivertx_t *) Hunk_Alloc (paliashdr->numposes * paliashdr->numverts_vbo * sizeof(*verts));
paliashdr->vertexes = (byte *)verts - (byte *)paliashdr; paliashdr->vertexes = (byte *)verts - (byte *)paliashdr;
for (i=0 ; i<paliashdr->numposes ; i++) for (i=0 ; i<paliashdr->numposes ; i++)
for (j=0 ; j<paliashdr->numverts_vbo ; j++) for (j=0 ; j<paliashdr->numverts_vbo ; j++)
verts[i*paliashdr->numverts_vbo + j] = poseverts_mdl[i][desc[j].vertindex]; verts[i*paliashdr->numverts_vbo + j] = poseverts_mdl[i][desc[j].vertindex];
break;
case PV_QUAKE3:
break; //invalid here.
}
} }
#define NUMVERTEXNORMALS 162 #define NUMVERTEXNORMALS 162
@ -147,10 +164,18 @@ void GLMesh_LoadVertexBuffer (qmodel_t *m, aliashdr_t *mainhdr)
//count how much space we're going to need. //count how much space we're going to need.
for(hdr = mainhdr, numverts = 0, numindexes = 0; ; ) for(hdr = mainhdr, numverts = 0, numindexes = 0; ; )
{ {
if (hdr->posevertssize == 1) switch(hdr->poseverttype)
{
case PV_QUAKE1:
totalvbosize += (hdr->numposes * hdr->numverts_vbo * sizeof (meshxyz_mdl_t)); // ericw -- what RMQEngine called nummeshframes is called numposes in QuakeSpasm totalvbosize += (hdr->numposes * hdr->numverts_vbo * sizeof (meshxyz_mdl_t)); // ericw -- what RMQEngine called nummeshframes is called numposes in QuakeSpasm
else if (hdr->posevertssize == 2) break;
totalvbosize += (hdr->numposes * hdr->numverts_vbo * sizeof (meshxyz_md3_t)); // ericw -- what RMQEngine called nummeshframes is called numposes in QuakeSpasm case PV_QUAKEFORGE:
totalvbosize += (hdr->numposes * hdr->numverts_vbo * sizeof (meshxyz_mdl16_t));
break;
case PV_QUAKE3:
totalvbosize += (hdr->numposes * hdr->numverts_vbo * sizeof (meshxyz_md3_t));
break;
}
numverts += hdr->numverts_vbo; numverts += hdr->numverts_vbo;
numindexes += hdr->numindexes; numindexes += hdr->numindexes;
@ -200,8 +225,9 @@ void GLMesh_LoadVertexBuffer (qmodel_t *m, aliashdr_t *mainhdr)
hdr->vbovertofs = vertofs; hdr->vbovertofs = vertofs;
// fill in the vertices at the start of the buffer // fill in the vertices at the start of the buffer
if (hdr->posevertssize == 1) switch(hdr->poseverttype)
{ {
case PV_QUAKE1:
for (f = 0; f < hdr->numposes; f++) // ericw -- what RMQEngine called nummeshframes is called numposes in QuakeSpasm for (f = 0; f < hdr->numposes; f++) // ericw -- what RMQEngine called nummeshframes is called numposes in QuakeSpasm
{ {
int v; int v;
@ -225,9 +251,33 @@ void GLMesh_LoadVertexBuffer (qmodel_t *m, aliashdr_t *mainhdr)
xyz[v].normal[3] = 0; // unused; for 4-byte alignment xyz[v].normal[3] = 0; // unused; for 4-byte alignment
} }
} }
} break;
else if (hdr->posevertssize == 2) case PV_QUAKEFORGE:
for (f = 0; f < hdr->numposes; f++) // ericw -- what RMQEngine called nummeshframes is called numposes in QuakeSpasm
{ {
int v;
meshxyz_mdl16_t *xyz = (meshxyz_mdl16_t *) (vbodata + vertofs);
const trivertx_t *tv = (trivertx_t*)trivertexes + (hdr->numverts_vbo*2 * f);
vertofs += hdr->numverts_vbo * sizeof (*xyz);
for (v = 0; v < hdr->numverts_vbo; v++, tv++)
{
xyz[v].xyz[0] = (tv->v[0]<<8) | tv[hdr->numverts_vbo].v[0];
xyz[v].xyz[1] = (tv->v[1]<<8) | tv[hdr->numverts_vbo].v[0];
xyz[v].xyz[2] = (tv->v[2]<<8) | tv[hdr->numverts_vbo].v[0];
xyz[v].xyz[3] = 1; // need w 1 for 4 byte vertex compression
// map the normal coordinates in [-1..1] to [-127..127] and store in an unsigned char.
// this introduces some error (less than 0.004), but the normals were very coarse
// to begin with
xyz[v].normal[0] = 127 * r_avertexnormals[tv->lightnormalindex][0];
xyz[v].normal[1] = 127 * r_avertexnormals[tv->lightnormalindex][1];
xyz[v].normal[2] = 127 * r_avertexnormals[tv->lightnormalindex][2];
xyz[v].normal[3] = 0; // unused; for 4-byte alignment
}
}
break;
case PV_QUAKE3:
for (f = 0; f < hdr->numposes; f++) // ericw -- what RMQEngine called nummeshframes is called numposes in QuakeSpasm for (f = 0; f < hdr->numposes; f++) // ericw -- what RMQEngine called nummeshframes is called numposes in QuakeSpasm
{ {
int v; int v;
@ -254,6 +304,7 @@ void GLMesh_LoadVertexBuffer (qmodel_t *m, aliashdr_t *mainhdr)
xyz[v].normal[3] = 0; // unused; for 4-byte alignment xyz[v].normal[3] = 0; // unused; for 4-byte alignment
} }
} }
break;
} }
// fill in the ST coords at the end of the buffer // fill in the ST coords at the end of the buffer
@ -269,21 +320,23 @@ void GLMesh_LoadVertexBuffer (qmodel_t *m, aliashdr_t *mainhdr)
hdr->vbostofs = stofs; hdr->vbostofs = stofs;
st = (meshst_t *) (vbodata + stofs); st = (meshst_t *) (vbodata + stofs);
stofs += hdr->numverts_vbo*sizeof(*st); stofs += hdr->numverts_vbo*sizeof(*st);
if (hdr->posevertssize == 2) switch(hdr->poseverttype)
{ {
case PV_QUAKE3:
for (f = 0; f < hdr->numverts_vbo; f++) for (f = 0; f < hdr->numverts_vbo; f++)
{ //md3 has floating-point skin coords. use the values directly. { //md3 has floating-point skin coords. use the values directly.
st[f].st[0] = hscale * desc[f].st[0]; st[f].st[0] = hscale * desc[f].st[0];
st[f].st[1] = vscale * desc[f].st[1]; st[f].st[1] = vscale * desc[f].st[1];
} }
} break;
else case PV_QUAKEFORGE:
{ case PV_QUAKE1:
for (f = 0; f < hdr->numverts_vbo; f++) for (f = 0; f < hdr->numverts_vbo; f++)
{ {
st[f].st[0] = hscale * ((float) desc[f].st[0] + 0.5f) / (float) hdr->skinwidth; st[f].st[0] = hscale * ((float) desc[f].st[0] + 0.5f) / (float) hdr->skinwidth;
st[f].st[1] = vscale * ((float) desc[f].st[1] + 0.5f) / (float) hdr->skinheight; st[f].st[1] = vscale * ((float) desc[f].st[1] + 0.5f) / (float) hdr->skinheight;
} }
break;
} }
} }
@ -528,7 +581,7 @@ void Mod_LoadMD3Model (qmodel_t *mod, void *buffer)
else else
osurf->nextsurface = 0; osurf->nextsurface = 0;
osurf->posevertssize = 2; osurf->poseverttype = PV_QUAKE3;
osurf->numverts_vbo = osurf->numverts = LittleLong(pinsurface->numVerts); osurf->numverts_vbo = osurf->numverts = LittleLong(pinsurface->numVerts);
pinvert = (md3XyzNormal_t*)((byte*)pinsurface + LittleLong(pinsurface->ofsXyzNormals)); pinvert = (md3XyzNormal_t*)((byte*)pinsurface + LittleLong(pinsurface->ofsXyzNormals));
poutvert = (md3XyzNormal_t *) Hunk_Alloc (numframes * osurf->numverts * sizeof(*poutvert)); poutvert = (md3XyzNormal_t *) Hunk_Alloc (numframes * osurf->numverts * sizeof(*poutvert));

View file

@ -31,7 +31,7 @@ char loadname[32]; // for hunk tags
void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer); void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer);
void Mod_LoadBrushModel (qmodel_t *mod, void *buffer); void Mod_LoadBrushModel (qmodel_t *mod, void *buffer);
void Mod_LoadAliasModel (qmodel_t *mod, void *buffer); void Mod_LoadAliasModel (qmodel_t *mod, void *buffer, int pvtype);
void Mod_LoadMD3Model (qmodel_t *mod, void *buffer); void Mod_LoadMD3Model (qmodel_t *mod, void *buffer);
qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash); qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash);
@ -373,7 +373,10 @@ qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash)
switch (mod_type) switch (mod_type)
{ {
case IDPOLYHEADER: case IDPOLYHEADER:
Mod_LoadAliasModel (mod, buf); Mod_LoadAliasModel (mod, buf, PV_QUAKE1);
break;
case (('M'<<0)+('D'<<8)+('1'<<16)+('6'<<24)): //QF 16bit variation
Mod_LoadAliasModel (mod, buf, PV_QUAKEFORGE);
break; break;
case IDSPRITEHEADER: case IDSPRITEHEADER:
@ -1446,8 +1449,8 @@ void Mod_LoadFaces (lump_t *l, qboolean bsp2)
if (Mod_ParseWorldspawnKey(loadmodel, "lightmap_scale", scalebuf, sizeof(scalebuf))) if (Mod_ParseWorldspawnKey(loadmodel, "lightmap_scale", scalebuf, sizeof(scalebuf)))
{ {
i = atoi(scalebuf); i = atoi(scalebuf);
for (defaultshift = 0; (1<<defaultshift) < i && defaultshift < 254; defaultshift++) for(defaultshift = 0; i > 1; defaultshift++)
break; i >>= 1;
} }
} }
@ -2583,7 +2586,7 @@ byte *player_8bit_texels;
Mod_LoadAliasFrame Mod_LoadAliasFrame
================= =================
*/ */
void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame) static void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame, int pvtype)
{ {
trivertx_t *pinframe; trivertx_t *pinframe;
int i; int i;
@ -2612,7 +2615,7 @@ void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame)
poseverts_mdl[posenum] = pinframe; poseverts_mdl[posenum] = pinframe;
posenum++; posenum++;
pinframe += pheader->numverts; pinframe += pheader->numverts*(pvtype==PV_QUAKEFORGE?2:1);
return (void *)pinframe; return (void *)pinframe;
} }
@ -2623,7 +2626,7 @@ void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame)
Mod_LoadAliasGroup Mod_LoadAliasGroup
================= =================
*/ */
void *Mod_LoadAliasGroup (void * pin, maliasframedesc_t *frame) static void *Mod_LoadAliasGroup (void * pin, maliasframedesc_t *frame, int pvtype)
{ {
daliasgroup_t *pingroup; daliasgroup_t *pingroup;
int i, numframes; int i, numframes;
@ -2660,7 +2663,7 @@ void *Mod_LoadAliasGroup (void * pin, maliasframedesc_t *frame)
poseverts_mdl[posenum] = (trivertx_t *)((daliasframe_t *)ptemp + 1); poseverts_mdl[posenum] = (trivertx_t *)((daliasframe_t *)ptemp + 1);
posenum++; posenum++;
ptemp = (trivertx_t *)((daliasframe_t *)ptemp + 1) + pheader->numverts; ptemp = (trivertx_t *)((daliasframe_t *)ptemp + 1) + pheader->numverts*(pvtype==PV_QUAKEFORGE?2:1);
} }
return ptemp; return ptemp;
@ -2878,8 +2881,9 @@ void Mod_CalcAliasBounds (aliashdr_t *a)
{ {
if (a->numposes && a->numverts) if (a->numposes && a->numverts)
{ {
if (a->posevertssize == 1) switch(a->poseverttype)
{ {
case PV_QUAKE1:
//process verts //process verts
for (i=0 ; i<a->numposes; i++) for (i=0 ; i<a->numposes; i++)
for (j=0; j<a->numverts; j++) for (j=0; j<a->numverts; j++)
@ -2899,9 +2903,29 @@ void Mod_CalcAliasBounds (aliashdr_t *a)
if (radius < dist) if (radius < dist)
radius = dist; radius = dist;
} }
} break;
else if (a->posevertssize == 2) case PV_QUAKEFORGE:
//process verts
for (i=0 ; i<a->numposes; i++)
for (j=0; j<a->numverts; j++)
{ {
for (k=0; k<3;k++)
v[k] = (poseverts_mdl[i][j].v[k] * pheader->scale[k]) + (poseverts_mdl[i][j+a->numverts].v[k] * pheader->scale[k]/256.f) + (pheader->scale_origin[k]);
for (k=0; k<3;k++)
{
loadmodel->mins[k] = q_min(loadmodel->mins[k], v[k]);
loadmodel->maxs[k] = q_max(loadmodel->maxs[k], v[k]);
}
dist = v[0] * v[0] + v[1] * v[1];
if (yawradius < dist)
yawradius = dist;
dist += v[2] * v[2];
if (radius < dist)
radius = dist;
}
break;
case PV_QUAKE3:
//process verts //process verts
for (i=0 ; i<a->numposes; i++) for (i=0 ; i<a->numposes; i++)
{ {
@ -2924,6 +2948,7 @@ void Mod_CalcAliasBounds (aliashdr_t *a)
radius = dist; radius = dist;
} }
} }
break;
} }
} }
@ -3028,7 +3053,7 @@ void Mod_SetExtraFlags (qmodel_t *mod)
Mod_LoadAliasModel Mod_LoadAliasModel
================= =================
*/ */
void Mod_LoadAliasModel (qmodel_t *mod, void *buffer) void Mod_LoadAliasModel (qmodel_t *mod, void *buffer, int pvtype)
{ {
int i, j; int i, j;
mdl_t *pinmodel; mdl_t *pinmodel;
@ -3175,13 +3200,13 @@ void Mod_LoadAliasModel (qmodel_t *mod, void *buffer)
aliasframetype_t frametype; aliasframetype_t frametype;
frametype = (aliasframetype_t) LittleLong (pframetype->type); frametype = (aliasframetype_t) LittleLong (pframetype->type);
if (frametype == ALIAS_SINGLE) if (frametype == ALIAS_SINGLE)
pframetype = (daliasframetype_t *) Mod_LoadAliasFrame (pframetype + 1, &pheader->frames[i]); pframetype = (daliasframetype_t *) Mod_LoadAliasFrame (pframetype + 1, &pheader->frames[i], pvtype);
else else
pframetype = (daliasframetype_t *) Mod_LoadAliasGroup (pframetype + 1, &pheader->frames[i]); pframetype = (daliasframetype_t *) Mod_LoadAliasGroup (pframetype + 1, &pheader->frames[i], pvtype);
} }
pheader->numposes = posenum; pheader->numposes = posenum;
pheader->posevertssize = 1; pheader->poseverttype = pvtype; //it would be safe to always store PV_QUAKE1 here if you wanted to drop the low-order data.
mod->type = mod_alias; mod->type = mod_alias;

View file

@ -293,6 +293,12 @@ typedef struct meshxyz_mdl_s
signed char normal[4]; signed char normal[4];
} meshxyz_mdl_t; } meshxyz_mdl_t;
typedef struct meshxyz_mdl16_s
{
unsigned short xyz[4];
signed char normal[4];
} meshxyz_mdl16_t;
typedef struct meshxyz_md3_s typedef struct meshxyz_md3_s
{ {
signed short xyz[4]; signed short xyz[4];
@ -369,7 +375,12 @@ typedef struct {
intptr_t nextsurface; //spike intptr_t nextsurface; //spike
int numposes; int numposes;
int posevertssize; //spike 1=mdl, 2=md3 enum
{
PV_QUAKE1 = 1, //trivertx_t
PV_QUAKE3 = 2, //md3XyzNormal_t
PV_QUAKEFORGE, //trivertx16_t
} poseverttype; //spike
struct gltexture_s *gltextures[MAX_SKINS][4]; //johnfitz struct gltexture_s *gltextures[MAX_SKINS][4]; //johnfitz
struct gltexture_s *fbtextures[MAX_SKINS][4]; //johnfitz struct gltexture_s *fbtextures[MAX_SKINS][4]; //johnfitz
intptr_t texels[MAX_SKINS]; // only for player skins intptr_t texels[MAX_SKINS]; // only for player skins

View file

@ -99,6 +99,11 @@ static void *GLARB_GetXYZOffset_MDL (aliashdr_t *hdr, int pose)
const size_t xyzoffs = offsetof (meshxyz_mdl_t, xyz); const size_t xyzoffs = offsetof (meshxyz_mdl_t, xyz);
return currententity->model->meshvboptr+(hdr->vbovertofs + (hdr->numverts_vbo * pose * sizeof (meshxyz_mdl_t)) + xyzoffs); return currententity->model->meshvboptr+(hdr->vbovertofs + (hdr->numverts_vbo * pose * sizeof (meshxyz_mdl_t)) + xyzoffs);
} }
static void *GLARB_GetXYZOffset_MDLQF (aliashdr_t *hdr, int pose)
{
const size_t xyzoffs = offsetof (meshxyz_mdl16_t, xyz);
return currententity->model->meshvboptr+(hdr->vbovertofs + (hdr->numverts_vbo * pose * sizeof (meshxyz_mdl16_t)) + xyzoffs);
}
static void *GLARB_GetXYZOffset_MD3 (aliashdr_t *hdr, int pose) static void *GLARB_GetXYZOffset_MD3 (aliashdr_t *hdr, int pose)
{ {
const size_t xyzoffs = offsetof (meshxyz_md3_t, xyz); const size_t xyzoffs = offsetof (meshxyz_md3_t, xyz);
@ -118,6 +123,11 @@ static void *GLARB_GetNormalOffset_MDL (aliashdr_t *hdr, int pose)
const size_t normaloffs = offsetof (meshxyz_mdl_t, normal); const size_t normaloffs = offsetof (meshxyz_mdl_t, normal);
return currententity->model->meshvboptr+(hdr->vbovertofs + (hdr->numverts_vbo * pose * sizeof (meshxyz_mdl_t)) + normaloffs); return currententity->model->meshvboptr+(hdr->vbovertofs + (hdr->numverts_vbo * pose * sizeof (meshxyz_mdl_t)) + normaloffs);
} }
static void *GLARB_GetNormalOffset_MDLQF (aliashdr_t *hdr, int pose)
{
const size_t normaloffs = offsetof (meshxyz_mdl16_t, normal);
return currententity->model->meshvboptr+(hdr->vbovertofs + (hdr->numverts_vbo * pose * sizeof (meshxyz_mdl16_t)) + normaloffs);
}
static void *GLARB_GetNormalOffset_MD3 (aliashdr_t *hdr, int pose) static void *GLARB_GetNormalOffset_MD3 (aliashdr_t *hdr, int pose)
{ {
const size_t normaloffs = offsetof (meshxyz_md3_t, normal); const size_t normaloffs = offsetof (meshxyz_md3_t, normal);
@ -260,21 +270,29 @@ void GL_DrawAliasFrame_GLSL (aliashdr_t *paliashdr, lerpdata_t lerpdata, gltextu
GL_EnableVertexAttribArrayFunc (pose2NormalAttrIndex); GL_EnableVertexAttribArrayFunc (pose2NormalAttrIndex);
GL_VertexAttribPointerFunc (texCoordsAttrIndex, 2, GL_FLOAT, GL_FALSE, 0, currententity->model->meshvboptr+paliashdr->vbostofs); GL_VertexAttribPointerFunc (texCoordsAttrIndex, 2, GL_FLOAT, GL_FALSE, 0, currententity->model->meshvboptr+paliashdr->vbostofs);
if (paliashdr->posevertssize == 1) switch(paliashdr->poseverttype)
{ {
case PV_QUAKE1:
GL_VertexAttribPointerFunc (pose1VertexAttrIndex, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof (meshxyz_mdl_t), GLARB_GetXYZOffset_MDL (paliashdr, lerpdata.pose1)); GL_VertexAttribPointerFunc (pose1VertexAttrIndex, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof (meshxyz_mdl_t), GLARB_GetXYZOffset_MDL (paliashdr, lerpdata.pose1));
GL_VertexAttribPointerFunc (pose2VertexAttrIndex, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof (meshxyz_mdl_t), GLARB_GetXYZOffset_MDL (paliashdr, lerpdata.pose2)); GL_VertexAttribPointerFunc (pose2VertexAttrIndex, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof (meshxyz_mdl_t), GLARB_GetXYZOffset_MDL (paliashdr, lerpdata.pose2));
// GL_TRUE to normalize the signed bytes to [-1 .. 1] // GL_TRUE to normalize the signed bytes to [-1 .. 1]
GL_VertexAttribPointerFunc (pose1NormalAttrIndex, 4, GL_BYTE, GL_TRUE, sizeof (meshxyz_mdl_t), GLARB_GetNormalOffset_MDL (paliashdr, lerpdata.pose1)); GL_VertexAttribPointerFunc (pose1NormalAttrIndex, 4, GL_BYTE, GL_TRUE, sizeof (meshxyz_mdl_t), GLARB_GetNormalOffset_MDL (paliashdr, lerpdata.pose1));
GL_VertexAttribPointerFunc (pose2NormalAttrIndex, 4, GL_BYTE, GL_TRUE, sizeof (meshxyz_mdl_t), GLARB_GetNormalOffset_MDL (paliashdr, lerpdata.pose2)); GL_VertexAttribPointerFunc (pose2NormalAttrIndex, 4, GL_BYTE, GL_TRUE, sizeof (meshxyz_mdl_t), GLARB_GetNormalOffset_MDL (paliashdr, lerpdata.pose2));
} break;
else if (paliashdr->posevertssize == 2) case PV_QUAKEFORGE:
{ GL_VertexAttribPointerFunc (pose1VertexAttrIndex, 4, GL_UNSIGNED_SHORT, GL_FALSE, sizeof (meshxyz_mdl16_t), GLARB_GetXYZOffset_MDLQF (paliashdr, lerpdata.pose1));
GL_VertexAttribPointerFunc (pose2VertexAttrIndex, 4, GL_UNSIGNED_SHORT, GL_FALSE, sizeof (meshxyz_mdl16_t), GLARB_GetXYZOffset_MDLQF (paliashdr, lerpdata.pose2));
// GL_TRUE to normalize the signed bytes to [-1 .. 1]
GL_VertexAttribPointerFunc (pose1NormalAttrIndex, 4, GL_BYTE, GL_TRUE, sizeof (meshxyz_mdl16_t), GLARB_GetNormalOffset_MDLQF (paliashdr, lerpdata.pose1));
GL_VertexAttribPointerFunc (pose2NormalAttrIndex, 4, GL_BYTE, GL_TRUE, sizeof (meshxyz_mdl16_t), GLARB_GetNormalOffset_MDLQF (paliashdr, lerpdata.pose2));
break;
case PV_QUAKE3:
GL_VertexAttribPointerFunc (pose1VertexAttrIndex, 4, GL_SHORT, GL_FALSE, sizeof (meshxyz_md3_t), GLARB_GetXYZOffset_MD3 (paliashdr, lerpdata.pose1)); GL_VertexAttribPointerFunc (pose1VertexAttrIndex, 4, GL_SHORT, GL_FALSE, sizeof (meshxyz_md3_t), GLARB_GetXYZOffset_MD3 (paliashdr, lerpdata.pose1));
GL_VertexAttribPointerFunc (pose2VertexAttrIndex, 4, GL_SHORT, GL_FALSE, sizeof (meshxyz_md3_t), GLARB_GetXYZOffset_MD3 (paliashdr, lerpdata.pose2)); GL_VertexAttribPointerFunc (pose2VertexAttrIndex, 4, GL_SHORT, GL_FALSE, sizeof (meshxyz_md3_t), GLARB_GetXYZOffset_MD3 (paliashdr, lerpdata.pose2));
// GL_TRUE to normalize the signed bytes to [-1 .. 1] // GL_TRUE to normalize the signed bytes to [-1 .. 1]
GL_VertexAttribPointerFunc (pose1NormalAttrIndex, 4, GL_BYTE, GL_TRUE, sizeof (meshxyz_md3_t), GLARB_GetNormalOffset_MD3 (paliashdr, lerpdata.pose1)); GL_VertexAttribPointerFunc (pose1NormalAttrIndex, 4, GL_BYTE, GL_TRUE, sizeof (meshxyz_md3_t), GLARB_GetNormalOffset_MD3 (paliashdr, lerpdata.pose1));
GL_VertexAttribPointerFunc (pose2NormalAttrIndex, 4, GL_BYTE, GL_TRUE, sizeof (meshxyz_md3_t), GLARB_GetNormalOffset_MD3 (paliashdr, lerpdata.pose2)); GL_VertexAttribPointerFunc (pose2NormalAttrIndex, 4, GL_BYTE, GL_TRUE, sizeof (meshxyz_md3_t), GLARB_GetNormalOffset_MD3 (paliashdr, lerpdata.pose2));
break;
} }
// set uniforms // set uniforms
@ -347,10 +365,13 @@ void GL_DrawAliasFrame (aliashdr_t *paliashdr, lerpdata_t lerpdata)
} }
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
if (paliashdr->posevertssize == 1) switch(paliashdr->poseverttype)
{ {
trivertx_t *verts1 = (trivertx_t*)((byte *)paliashdr + paliashdr->vertexes) + lerpdata.pose1 * paliashdr->numverts_vbo; case PV_QUAKE1:
trivertx_t *verts2 = (trivertx_t*)((byte *)paliashdr + paliashdr->vertexes) + lerpdata.pose2 * paliashdr->numverts_vbo; case PV_QUAKEFORGE: //just going to ignore the extra data here.
{
trivertx_t *verts1 = (trivertx_t*)((byte *)paliashdr + paliashdr->vertexes) + lerpdata.pose1 * paliashdr->numverts_vbo*(paliashdr->poseverttype==PV_QUAKEFORGE?2:1);
trivertx_t *verts2 = (trivertx_t*)((byte *)paliashdr + paliashdr->vertexes) + lerpdata.pose2 * paliashdr->numverts_vbo*(paliashdr->poseverttype==PV_QUAKEFORGE?2:1);
if (iblend) if (iblend)
{ {
@ -403,7 +424,8 @@ void GL_DrawAliasFrame (aliashdr_t *paliashdr, lerpdata_t lerpdata)
glVertexPointer(3, GL_FLOAT, sizeof (vpos[0]), vpos); glVertexPointer(3, GL_FLOAT, sizeof (vpos[0]), vpos);
} }
} }
else if (paliashdr->posevertssize == 2) break;
case PV_QUAKE3:
{ {
md3XyzNormal_t *verts1 = (md3XyzNormal_t*)((byte *)paliashdr + paliashdr->vertexes) + lerpdata.pose1 * paliashdr->numverts_vbo; md3XyzNormal_t *verts1 = (md3XyzNormal_t*)((byte *)paliashdr + paliashdr->vertexes) + lerpdata.pose1 * paliashdr->numverts_vbo;
md3XyzNormal_t *verts2 = (md3XyzNormal_t*)((byte *)paliashdr + paliashdr->vertexes) + lerpdata.pose2 * paliashdr->numverts_vbo; md3XyzNormal_t *verts2 = (md3XyzNormal_t*)((byte *)paliashdr + paliashdr->vertexes) + lerpdata.pose2 * paliashdr->numverts_vbo;
@ -488,6 +510,8 @@ void GL_DrawAliasFrame (aliashdr_t *paliashdr, lerpdata_t lerpdata)
glVertexPointer(3, GL_SHORT, sizeof (meshxyz_md3_t), GLARB_GetXYZOffset_MD3 (paliashdr, lerpdata.pose2)); glVertexPointer(3, GL_SHORT, sizeof (meshxyz_md3_t), GLARB_GetXYZOffset_MD3 (paliashdr, lerpdata.pose2));
} }
} }
break;
}
// set textures // set textures
GL_BindBuffer (GL_ARRAY_BUFFER, currententity->model->meshvbo); GL_BindBuffer (GL_ARRAY_BUFFER, currententity->model->meshvbo);