97 lines
2.4 KiB
C++
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;}
|
|
}
|
|
}
|
|
}
|
|
|