room101/DDATMAP.CPP

97 lines
2.4 KiB
C++

#include "ddatmap.hpp"
#include "convex.hpp"
/*******************************************************************************
** DDATextureMap
*******************************************************************************/
void
DDATextureMap(
Picture* dst,
Picture* texture,
Picture* zbuffer)
{
ScanLine* lt;
ScanLine* rt;
ScanLine* sl;
int y, xd, x1, x2;
int u, uu, v, vv, w, ww, z, zz;
Pixel* fb;
Pixel** tb;
Pixel* zb;
for (y = scantop; y < scanbot && y < dst->height; y++)
{
lt = &scanleft[y];
rt = &scanright[y];
x1 = FIX_TO_INT(lt->x);
x2 = FIX_TO_INT(rt->x);
xd = x2 - x1;
if (xd > 0)
{
#undef AFFINE
#define AFFINE sl->z = z; sl++; z += zz;
xd = x2 - x1;
z = lt->z;
zz = (rt->z - z) / xd;
sl = scanline;
for (; xd > 0; xd--) {AFFINE;}
#undef AFFINE
#define AFFINE sl->u = u; sl++; u += uu;
xd = x2 - x1;
u = lt->u;
uu = (rt->u - u) / xd;
sl = scanline;
for (; xd > 0; xd--) {AFFINE;}
#undef AFFINE
#define AFFINE sl->v = v; sl++; v += vv;
xd = x2 - x1;
v = lt->v;
vv = (rt->v - v) / xd;
sl = scanline;
for (; xd > 0; xd--) {AFFINE;}
#undef AFFINE
#define AFFINE sl->w = w; sl++; w += ww;
xd = x2 - x1;
w = lt->w;
ww = (rt->w - w) / xd;
sl = scanline;
for (; xd > 0; xd--) {AFFINE;}
tb = texture->pixels;
fb = &dst->pixels[y][x1];
zb = &zbuffer->pixels[y][x1];
#undef AFFINE
#define AFFINE \
if (FIX_TO_INT(sl->z) < *zb) \
{ \
*fb = tb[FIX_TO_INT(sl->v)][FIX_TO_INT(sl->u)]; \
*zb = FIX_TO_INT(sl->z); \
} \
fb++; zb++; sl++;
xd = x2 - x1;
sl = scanline;
for (; xd > 0; xd--) {AFFINE;}
}
}
}