Don't step over the bounds of the plane buffer in buffertoplane (now computeplane).

git-svn-id: https://svn.eduke32.com/eduke32@1334 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
plagman 2009-04-19 17:23:07 +00:00
parent 711db577ab
commit 9241ab974a
2 changed files with 26 additions and 15 deletions

View file

@ -291,7 +291,7 @@ static int32_t polymer_initwall(int16_t wallnum);
static void polymer_updatewall(int16_t wallnum);
static void polymer_drawwall(int16_t sectnum, int16_t wallnum);
// HSR
static void polymer_buffertoplane(GLfloat* buffer, GLushort* indices, int32_t indicecount, GLfloat* plane, GLfloat* t, GLfloat* b, GLfloat* n);
static void polymer_computeplane(_prplane* p);
static inline void polymer_crossproduct(GLfloat* in_a, GLfloat* in_b, GLfloat* out);
static inline void polymer_transformpoint(float* inpos, float* pos, float* matrix);
static inline void polymer_pokesector(int16_t sectnum);

View file

@ -988,7 +988,7 @@ void polymer_drawsprite(int32_t snum)
i++;
}
polymer_buffertoplane(spriteplane.buffer, NULL, 4, spriteplane.plane, spriteplane.t, spriteplane.b, spriteplane.n);
polymer_computeplane(&spriteplane);
spriteplane.lightcount = 0;
i = 0;
@ -1765,10 +1765,8 @@ finish:
if (wallinvalidate)
{
s->invalidid++;
polymer_buffertoplane(s->floor.buffer, s->floor.indices, s->indicescount, s->floor.plane,
s->floor.t, s->floor.b, s->floor.n);
polymer_buffertoplane(s->ceil.buffer, s->ceil.indices, s->indicescount, s->ceil.plane,
s->ceil.t, s->ceil.b, s->ceil.n);
polymer_computeplane(&s->floor);
polymer_computeplane(&s->ceil);
}
s->controlstate = 1;
@ -2331,10 +2329,10 @@ static void polymer_updatewall(int16_t wallnum)
w->cap[10] += 1048576; // this one is arbitrary
if (w->underover & 1)
polymer_buffertoplane(w->wall.buffer, NULL, 4, w->wall.plane, w->wall.t, w->wall.b, w->wall.n);
polymer_computeplane(&w->wall);
if (w->underover & 2)
polymer_buffertoplane(w->over.buffer, NULL, 4, w->over.plane, w->over.t, w->over.b, w->over.n);
polymer_buffertoplane(w->mask.buffer, NULL, 4, w->mask.plane, w->mask.t, w->mask.b, w->mask.n);
polymer_computeplane(&w->over);
polymer_computeplane(&w->mask);
if ((pr_vbos > 0))
{
@ -2409,17 +2407,28 @@ static void polymer_drawwall(int16_t sectnum, int16_t wallnum)
if (pr_verbosity >= 3) OSD_Printf("PR : Finished drawing wall %i...\n", wallnum);
}
#define INDICE(n) ((indices) ? (indices[i+n]*5) : ((i+n)*5))
#define INDICE(n) ((p->indices) ? (p->indices[i+n]*5) : ((i+n)*5))
// HSR
static void polymer_buffertoplane(GLfloat* buffer, GLushort* indices, int32_t indicecount, GLfloat* plane, GLfloat* t, GLfloat* b, GLfloat* n)
static void polymer_computeplane(_prplane* p)
{
GLfloat vec1[5], vec2[5], norm, r;// BxN[3], NxT[3], TxB[3];
int32_t i;
GLfloat* buffer;
GLfloat* t;
GLfloat* b;
GLfloat* n;
GLfloat* plane;
if (indices && (indicecount < 3))
if (p->indices && (p->indicescount < 3))
return; // corrupt sector (E3L4, I'm looking at you)
buffer = p->buffer;
t = p->t;
b = p->b;
n = p->n;
plane = p->plane;
i = 0;
do
{
@ -2439,7 +2448,9 @@ static void polymer_buffertoplane(GLfloat* buffer, GLushort* indices, in
norm = plane[0] * plane[0] + plane[1] * plane[1] + plane[2] * plane[2];
if (norm >= 15000) // hack to work around a precision issue with slopes
// hack to work around a precision issue with slopes
if ((norm >= 15000) ||
(((p->indices) ? p->indices[i+2] : i+2) >= p->vertcount))
{
// normalize the normal/plane equation and calculate its plane norm
norm = -sqrt(norm);
@ -2508,9 +2519,9 @@ static void polymer_buffertoplane(GLfloat* buffer, GLushort* indices, in
break;
}
i+= 3;
i+= 1;
}
while (i < indicecount);
while (i < p->indicescount);
}
static inline void polymer_crossproduct(GLfloat* in_a, GLfloat* in_b, GLfloat* out)