mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-12 11:10:39 +00:00
MD2. BMW.
git-svn-id: https://svn.eduke32.com/eduke32@294 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
d961d235a5
commit
fe40a9ce85
3 changed files with 62 additions and 31 deletions
|
@ -3,6 +3,12 @@
|
||||||
#ifndef _polymer_h_
|
#ifndef _polymer_h_
|
||||||
# define _polymer_h_
|
# define _polymer_h_
|
||||||
|
|
||||||
|
# ifdef _WIN32
|
||||||
|
# define PR_CALLBACK __stdcall
|
||||||
|
# else
|
||||||
|
# defube PR_CALLBACK
|
||||||
|
# endif
|
||||||
|
|
||||||
# include "compat.h"
|
# include "compat.h"
|
||||||
# include "build.h"
|
# include "build.h"
|
||||||
# include "glbuild.h"
|
# include "glbuild.h"
|
||||||
|
|
|
@ -145,6 +145,7 @@ typedef struct
|
||||||
|
|
||||||
//MD3 specific
|
//MD3 specific
|
||||||
md3head_t head;
|
md3head_t head;
|
||||||
|
point3d *muladdframes;
|
||||||
} md3model;
|
} md3model;
|
||||||
|
|
||||||
#define VOXBORDWIDTH 1 //use 0 to save memory, but has texture artifacts; 1 looks better...
|
#define VOXBORDWIDTH 1 //use 0 to save memory, but has texture artifacts; 1 looks better...
|
||||||
|
@ -990,6 +991,7 @@ m->basepath = (char *)malloc(i+1); if (!m->basepath) { free(m->uv); free(m->tris
|
||||||
m3->numframes = m3->head.numframes;
|
m3->numframes = m3->head.numframes;
|
||||||
|
|
||||||
m3->head.frames = (md3frame_t *)calloc(m3->head.numframes, sizeof(md3frame_t)); if (!m3->head.frames) { free(m3); free(m->skinfn); free(m->basepath); free(m->uv); free(m->tris); free(m->glcmds); free(m->frames); free(m); return(0); }
|
m3->head.frames = (md3frame_t *)calloc(m3->head.numframes, sizeof(md3frame_t)); if (!m3->head.frames) { free(m3); free(m->skinfn); free(m->basepath); free(m->uv); free(m->tris); free(m->glcmds); free(m->frames); free(m); return(0); }
|
||||||
|
m3->muladdframes = (point3d *)calloc(m->numframes * 2, sizeof(point3d));
|
||||||
|
|
||||||
f = (md2frame_t *)(m->frames);
|
f = (md2frame_t *)(m->frames);
|
||||||
|
|
||||||
|
@ -1000,6 +1002,8 @@ m->basepath = (char *)malloc(i+1); if (!m->basepath) { free(m->uv); free(m->tris
|
||||||
f = (md2frame_t *)&m->frames[i*m->framebytes];
|
f = (md2frame_t *)&m->frames[i*m->framebytes];
|
||||||
strcpy(m3->head.frames[i].nam, f->name);
|
strcpy(m3->head.frames[i].nam, f->name);
|
||||||
//OSD_Printf("Copied frame %s.\n", m3->head.frames[i].nam);
|
//OSD_Printf("Copied frame %s.\n", m3->head.frames[i].nam);
|
||||||
|
m3->muladdframes[i*2] = f->mul;
|
||||||
|
m3->muladdframes[i*2+1] = f->add;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1025,6 +1029,7 @@ m->basepath = (char *)malloc(i+1); if (!m->basepath) { free(m->uv); free(m->tris
|
||||||
s->tris = (md3tri_t *)calloc(head.numtris, sizeof(md3tri_t)); if (!s->tris) { free(s); free(m3->head.frames); free(m3); free(m->skinfn); free(m->basepath); free(m->uv); free(m->tris); free(m->glcmds); free(m->frames); free(m); return(0); }
|
s->tris = (md3tri_t *)calloc(head.numtris, sizeof(md3tri_t)); if (!s->tris) { free(s); free(m3->head.frames); free(m3); free(m->skinfn); free(m->basepath); free(m->uv); free(m->tris); free(m->glcmds); free(m->frames); free(m); return(0); }
|
||||||
s->uv = (md3uv_t *)calloc(s->numverts, sizeof(md3uv_t)); if (!s->uv) { free(s->tris); free(s); free(m3->head.frames); free(m3); free(m->skinfn); free(m->basepath); free(m->uv); free(m->tris); free(m->glcmds); free(m->frames); free(m); return(0); }
|
s->uv = (md3uv_t *)calloc(s->numverts, sizeof(md3uv_t)); if (!s->uv) { free(s->tris); free(s); free(m3->head.frames); free(m3); free(m->skinfn); free(m->basepath); free(m->uv); free(m->tris); free(m->glcmds); free(m->frames); free(m); return(0); }
|
||||||
s->xyzn = (md3xyzn_t *)calloc(s->numverts * m->numframes, sizeof(md3xyzn_t)); if (!s->xyzn) { free(s->uv); free(s->tris); free(s); free(m3->head.frames); free(m3); free(m->skinfn); free(m->basepath); free(m->uv); free(m->tris); free(m->glcmds); free(m->frames); free(m); return(0); }
|
s->xyzn = (md3xyzn_t *)calloc(s->numverts * m->numframes, sizeof(md3xyzn_t)); if (!s->xyzn) { free(s->uv); free(s->tris); free(s); free(m3->head.frames); free(m3); free(m->skinfn); free(m->basepath); free(m->uv); free(m->tris); free(m->glcmds); free(m->frames); free(m); return(0); }
|
||||||
|
|
||||||
//memoryusage += (s->numverts * m->numframes * sizeof(md3xyzn_t));
|
//memoryusage += (s->numverts * m->numframes * sizeof(md3xyzn_t));
|
||||||
//OSD_Printf("Current model geometry memory usage : %i.\n", memoryusage);
|
//OSD_Printf("Current model geometry memory usage : %i.\n", memoryusage);
|
||||||
|
|
||||||
|
@ -1052,9 +1057,12 @@ m->basepath = (char *)malloc(i+1); if (!m->basepath) { free(m->uv); free(m->tris
|
||||||
while (k < m->numframes)
|
while (k < m->numframes)
|
||||||
{
|
{
|
||||||
f = (md2frame_t *)&m->frames[k*m->framebytes];
|
f = (md2frame_t *)&m->frames[k*m->framebytes];
|
||||||
s->xyzn[(k*s->numverts) + (i*3) + j].x = ((f->verts[m->tris[i].v[j]].v[0] * f->mul.x) + f->add.x);
|
//s->xyzn[(k*s->numverts) + (i*3) + j].x = ((f->verts[m->tris[i].v[j]].v[0] * f->mul.x) + f->add.x);
|
||||||
s->xyzn[(k*s->numverts) + (i*3) + j].y = ((f->verts[m->tris[i].v[j]].v[1] * f->mul.y) + f->add.y);
|
//s->xyzn[(k*s->numverts) + (i*3) + j].y = ((f->verts[m->tris[i].v[j]].v[1] * f->mul.y) + f->add.y);
|
||||||
s->xyzn[(k*s->numverts) + (i*3) + j].z = ((f->verts[m->tris[i].v[j]].v[2] * f->mul.z) + f->add.z);
|
//s->xyzn[(k*s->numverts) + (i*3) + j].z = ((f->verts[m->tris[i].v[j]].v[2] * f->mul.z) + f->add.z);
|
||||||
|
s->xyzn[(k*s->numverts) + (i*3) + j].x = f->verts[m->tris[i].v[j]].v[0];
|
||||||
|
s->xyzn[(k*s->numverts) + (i*3) + j].y = f->verts[m->tris[i].v[j]].v[1];
|
||||||
|
s->xyzn[(k*s->numverts) + (i*3) + j].z = f->verts[m->tris[i].v[j]].v[2];
|
||||||
k++;
|
k++;
|
||||||
}
|
}
|
||||||
j++;
|
j++;
|
||||||
|
@ -1349,6 +1357,8 @@ static md3model *md3load (int fil)
|
||||||
m = (md3model *)calloc(1,sizeof(md3model)); if (!m) return(0);
|
m = (md3model *)calloc(1,sizeof(md3model)); if (!m) return(0);
|
||||||
m->mdnum = 3; m->texid = 0; m->scale = .01;
|
m->mdnum = 3; m->texid = 0; m->scale = .01;
|
||||||
|
|
||||||
|
m->muladdframes = NULL;
|
||||||
|
|
||||||
kread(fil,&m->head,sizeof(md3head_t));
|
kread(fil,&m->head,sizeof(md3head_t));
|
||||||
m->head.id = B_LITTLE32(m->head.id); m->head.vers = B_LITTLE32(m->head.vers);
|
m->head.id = B_LITTLE32(m->head.id); m->head.vers = B_LITTLE32(m->head.vers);
|
||||||
m->head.flags = B_LITTLE32(m->head.flags); m->head.numframes = B_LITTLE32(m->head.numframes);
|
m->head.flags = B_LITTLE32(m->head.flags); m->head.numframes = B_LITTLE32(m->head.numframes);
|
||||||
|
@ -1500,15 +1510,25 @@ static int md3draw (md3model *m, spritetype *tspr)
|
||||||
|
|
||||||
//create current&next frame's vertex list from whole list
|
//create current&next frame's vertex list from whole list
|
||||||
|
|
||||||
if (m->head.flags == 1337)
|
|
||||||
mult = 1 * m->scale; // md2
|
|
||||||
else
|
|
||||||
mult = (1.0/64.0) * m->scale;
|
|
||||||
f = m->interpol; g = 1-f;
|
f = m->interpol; g = 1-f;
|
||||||
m0.x = mult*g; m1.x = mult*f;
|
|
||||||
m0.y = mult*g; m1.y = mult*f;
|
if (m->head.flags == 1337)
|
||||||
m0.z = mult*g; m1.z = mult*f;
|
{ // md2
|
||||||
a0.x = a0.y = 0; a0.z = m->zadd*m->scale;
|
m0.x = m->scale * g * m->muladdframes[m->cframe*2].x; m1.x = m->scale * f * m->muladdframes[m->nframe*2].x;
|
||||||
|
m0.y = m->scale * g * m->muladdframes[m->cframe*2].y; m1.y = m->scale * f * m->muladdframes[m->nframe*2].y;
|
||||||
|
m0.z = m->scale * g * m->muladdframes[m->cframe*2].z; m1.z = m->scale * f * m->muladdframes[m->nframe*2].z;
|
||||||
|
a0.x = m->muladdframes[m->cframe*2+1].x * m->scale; a0.x = (m->muladdframes[m->nframe*2+1].x * m->scale - a0.x)*f+a0.x;
|
||||||
|
a0.y = m->muladdframes[m->cframe*2+1].y * m->scale; a0.y = (m->muladdframes[m->nframe*2+1].y * m->scale - a0.y)*f+a0.y;
|
||||||
|
a0.z = m->muladdframes[m->cframe*2+1].z * m->scale; a0.z = (m->muladdframes[m->nframe*2+1].z * m->scale - a0.z)*f+a0.z + m->zadd*m->scale;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m0.x = (1.0/64.0) * m->scale * g; m1.x = (1.0/64.0) * m->scale *f;
|
||||||
|
m0.y = (1.0/64.0) * m->scale * g; m1.y = (1.0/64.0) * m->scale *f;
|
||||||
|
m0.z = (1.0/64.0) * m->scale * g; m1.z = (1.0/64.0) * m->scale *f;
|
||||||
|
a0.x = a0.y = 0; a0.z = m->zadd*m->scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Parkar: Moved up to be able to use k0 for the y-flipping code
|
// Parkar: Moved up to be able to use k0 for the y-flipping code
|
||||||
k0 = tspr->z;
|
k0 = tspr->z;
|
||||||
|
@ -1612,8 +1632,8 @@ if (tspr->cstat&2) { if (!(tspr->cstat&512)) pc[3] = 0.66; else pc[3] = 0.33; }
|
||||||
if (tspr->cstat&2) bglEnable(GL_BLEND); else bglDisable(GL_BLEND);
|
if (tspr->cstat&2) bglEnable(GL_BLEND); else bglDisable(GL_BLEND);
|
||||||
}
|
}
|
||||||
bglColor4f(pc[0],pc[1],pc[2],pc[3]);
|
bglColor4f(pc[0],pc[1],pc[2],pc[3]);
|
||||||
if (m->head.flags == 1337)
|
//if (m->head.flags == 1337)
|
||||||
bglColor4f(0.0f, 0.0f, 1.0f, 1.0f);
|
// bglColor4f(0.0f, 0.0f, 1.0f, 1.0f);
|
||||||
//------------
|
//------------
|
||||||
|
|
||||||
// PLAG: Cleaner model rotation code
|
// PLAG: Cleaner model rotation code
|
||||||
|
@ -1857,6 +1877,8 @@ static void md3free (md3model *m)
|
||||||
|
|
||||||
if (m->texid) free(m->texid);
|
if (m->texid) free(m->texid);
|
||||||
|
|
||||||
|
if (m->muladdframes) free(m->muladdframes);
|
||||||
|
|
||||||
free(m);
|
free(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ float polymostmodelmatrix[16];
|
||||||
// tesselation variables
|
// tesselation variables
|
||||||
GLUtesselator* prtess;
|
GLUtesselator* prtess;
|
||||||
int tempverticescount;
|
int tempverticescount;
|
||||||
GLdouble* tempvertices;
|
GLdouble tempvertice[3];
|
||||||
|
|
||||||
// Polymer cvars
|
// Polymer cvars
|
||||||
char pr_verbosity = 1; // 0: silent, 1: errors and one-times, 2: multiple-times, 3: flood
|
char pr_verbosity = 1; // 0: silent, 1: errors and one-times, 2: multiple-times, 3: flood
|
||||||
|
@ -51,7 +51,7 @@ void polymer_glinit(void)
|
||||||
bglViewport(0, 0, 1024, 768);
|
bglViewport(0, 0, 1024, 768);
|
||||||
|
|
||||||
// texturing
|
// texturing
|
||||||
bglEnable(GL_TEXTURE_2D);
|
bglDisable(GL_TEXTURE_2D);
|
||||||
//bglEnable(GL_TEXTURE_GEN_S);
|
//bglEnable(GL_TEXTURE_GEN_S);
|
||||||
//bglEnable(GL_TEXTURE_GEN_T);
|
//bglEnable(GL_TEXTURE_GEN_T);
|
||||||
params[0] = GL_OBJECT_LINEAR;
|
params[0] = GL_OBJECT_LINEAR;
|
||||||
|
@ -84,6 +84,7 @@ int polymer_updategeometry(short sectnum)
|
||||||
sectortype *sec;
|
sectortype *sec;
|
||||||
walltype *wal;
|
walltype *wal;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
long ceilz, florz;
|
||||||
|
|
||||||
s = prsectors[sectnum];
|
s = prsectors[sectnum];
|
||||||
sec = §or[sectnum];
|
sec = §or[sectnum];
|
||||||
|
@ -105,13 +106,16 @@ int polymer_updategeometry(short sectnum)
|
||||||
else
|
else
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while (i < s->wallcount)
|
while (i < s->wallcount)
|
||||||
{
|
{
|
||||||
s->verts[i].wallnum = sec->wallptr + i;
|
s->verts[i].wallnum = sec->wallptr + i;
|
||||||
s->verts[i].v[2] = -wal->x;
|
s->verts[i].v[2] = -wal->x;
|
||||||
s->verts[i].v[0] = wal->y;
|
s->verts[i].v[0] = wal->y;
|
||||||
s->verts[i].v[1] = -sec->floorz;
|
getzsofslope(sectnum, wal->x, wal->y, &ceilz, &florz);
|
||||||
|
s->verts[i].v[1] = -florz;
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
wal = &wall[sec->wallptr + i];
|
wal = &wall[sec->wallptr + i];
|
||||||
|
@ -123,25 +127,24 @@ int polymer_updategeometry(short sectnum)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This callback is called by the tesselator when it detects an intersection between contours (HELLO ROTATING SPOTLIGHT IN E1L1).
|
// This callback is called by the tesselator when it detects an intersection between contours (HELLO ROTATING SPOTLIGHT IN E1L1).
|
||||||
// In this case, we create a new temporary vertex at the intersection point which will be freed after the polygon is drawn.
|
void PR_CALLBACK polymer_tesscombine(GLdouble v[3], GLdouble *data[4], GLfloat weight[4], GLdouble **out)
|
||||||
void polymer_tesscombine(GLdouble v[3], GLdouble *data[4], GLfloat weight[4], GLdouble **out)
|
|
||||||
{
|
{
|
||||||
GLdouble *ptr;
|
GLdouble* ptr;
|
||||||
|
|
||||||
tempverticescount++;
|
//tempverticescount++;
|
||||||
tempvertices = realloc(tempvertices, tempverticescount * sizeof(GLdouble) * 3);
|
//tempvertices = realloc(tempvertices, tempverticescount * sizeof(GLdouble) * 3);
|
||||||
tempvertices[(tempverticescount * 3) - 3] = v[0];
|
tempvertice[0] = v[0];
|
||||||
tempvertices[(tempverticescount * 3) - 2] = v[1];
|
tempvertice[1] = v[1];
|
||||||
tempvertices[(tempverticescount * 3) - 1] = v[2];
|
tempvertice[2] = v[2];
|
||||||
|
|
||||||
ptr = &tempvertices[(tempverticescount - 1) * 3];
|
ptr = tempvertice;
|
||||||
*out = ptr;
|
*out = ptr;
|
||||||
|
|
||||||
if (pr_verbosity >= 2) OSD_Printf("PR : Created additional geometry for sector tesselation.\n");
|
if (pr_verbosity >= 2) OSD_Printf("PR : Created additional geometry for sector tesselation.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// This callback is called by the tesselator whenever it raises an error.
|
// This callback is called by the tesselator whenever it raises an error.
|
||||||
void polymer_tesserror(GLenum error)
|
void PR_CALLBACK polymer_tesserror(GLenum error)
|
||||||
{
|
{
|
||||||
if (pr_verbosity >= 1) OSD_Printf("PR : Tesselation error number %i reported : %s.\n", error, gluErrorString(errno));
|
if (pr_verbosity >= 1) OSD_Printf("PR : Tesselation error number %i reported : %s.\n", error, gluErrorString(errno));
|
||||||
}
|
}
|
||||||
|
@ -171,8 +174,8 @@ int polymer_buildfloor(short sectnum)
|
||||||
|
|
||||||
gluTessProperty(prtess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_POSITIVE);
|
gluTessProperty(prtess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_POSITIVE);
|
||||||
|
|
||||||
tempverticescount = 0;
|
//tempverticescount = 0;
|
||||||
tempvertices = NULL;
|
//tempvertice = NULL;
|
||||||
|
|
||||||
gluTessBeginPolygon(prtess, NULL);
|
gluTessBeginPolygon(prtess, NULL);
|
||||||
gluTessBeginContour(prtess);
|
gluTessBeginContour(prtess);
|
||||||
|
@ -193,12 +196,12 @@ int polymer_buildfloor(short sectnum)
|
||||||
|
|
||||||
bglEndList();
|
bglEndList();
|
||||||
|
|
||||||
if (tempverticescount)
|
/*if (tempverticescount)
|
||||||
{
|
{
|
||||||
free(tempvertices);
|
free(tempvertices);
|
||||||
tempvertices = NULL;
|
tempvertices = NULL;
|
||||||
tempverticescount = 0;
|
tempverticescount = 0;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (pr_verbosity >= 2) OSD_Printf("PR : Tesselated floor of sector %i.\n", sectnum);
|
if (pr_verbosity >= 2) OSD_Printf("PR : Tesselated floor of sector %i.\n", sectnum);
|
||||||
|
|
||||||
|
@ -255,7 +258,7 @@ void polymer_drawsector(long daposx, long daposy, long daposz, short
|
||||||
polymer_updategeometry(sectnum);
|
polymer_updategeometry(sectnum);
|
||||||
polymer_buildfloor(sectnum);
|
polymer_buildfloor(sectnum);
|
||||||
}
|
}
|
||||||
else if (prsectors[sectnum]->invalidate)
|
else if ((prsectors[sectnum]->invalidate) || 1)
|
||||||
{
|
{
|
||||||
if (pr_verbosity >= 2) OSD_Printf("PR : Sector %i invalidated. Tesselating...\n", sectnum);
|
if (pr_verbosity >= 2) OSD_Printf("PR : Sector %i invalidated. Tesselating...\n", sectnum);
|
||||||
polymer_updategeometry(sectnum);
|
polymer_updategeometry(sectnum);
|
||||||
|
|
Loading…
Reference in a new issue