room101/LIGHTMAP.CPP

124 lines
3.7 KiB
C++
Raw Normal View History

#include "lightmap.hpp"
#include "effects.hpp"
/*******************************************************************************
** LightMapExpand
*******************************************************************************/
void
LightMapExpand(Picture* dst, Picture* lightmap, Picture* tile, int level, int dx, int dy)
{
int i, j, u, v, l, ll, line, a, b;
int y[2000], yy[2000];
Pixel* p;
dx /= (16 / level);
dy /= (16 / level);
PictureCreate(dst, (lightmap->width - 1) * level, (lightmap->height - 1) * level);
EffectTile(dst, tile, -dx, -dy);
/*
**
*/
for (v = 0; v < lightmap->height - 1; v++)
{
for (u = 0; u < lightmap->width; u++)
{
a = INT_TO_FIX(PixelRed(lightmap->pixels[v + 0][u]));
b = INT_TO_FIX(PixelRed(lightmap->pixels[v + 1][u]));
y[u] = a;
yy[u] = (b - a) / level;
}
line = v * level;
for (i = 0; i < level; i++, line++)
{
p = dst->pixels[line];
for (u = 0; u < lightmap->width - 1; u++)
{
l = y[u];
ll = (y[u + 1] - y[u]) / level;
for (j = 0; j < level; j++, p++, l += ll)
{
PixelSetRed(p, (PixelRed(*p) * l) / INT_TO_FIX(31));
}
y[u] += yy[u];
}
y[u] += yy[u];
}
}
/*
**
*/
for (v = 0; v < lightmap->height - 1; v++)
{
for (u = 0; u < lightmap->width; u++)
{
a = INT_TO_FIX(PixelGreen(lightmap->pixels[v + 0][u]));
b = INT_TO_FIX(PixelGreen(lightmap->pixels[v + 1][u]));
y[u] = a;
yy[u] = (b - a) / level;
}
line = v * level;
for (i = 0; i < level; i++, line++)
{
p = dst->pixels[line];
for (u = 0; u < lightmap->width - 1; u++)
{
l = y[u];
ll = (y[u + 1] - y[u]) / level;
for (j = 0; j < level; j++, p++, l += ll)
{
PixelSetGreen(p, (PixelGreen(*p) * l) / INT_TO_FIX(31));
}
y[u] += yy[u];
}
y[u] += yy[u];
}
}
/*
**
*/
for (v = 0; v < lightmap->height - 1; v++)
{
for (u = 0; u < lightmap->width; u++)
{
a = INT_TO_FIX(PixelBlue(lightmap->pixels[v + 0][u]));
b = INT_TO_FIX(PixelBlue(lightmap->pixels[v + 1][u]));
y[u] = a;
yy[u] = (b - a) / level;
}
line = v * level;
for (i = 0; i < level; i++, line++)
{
p = dst->pixels[line];
for (u = 0; u < lightmap->width - 1; u++)
{
l = y[u];
ll = (y[u + 1] - y[u]) / level;
for (j = 0; j < level; j++, p++, l += ll)
{
PixelSetBlue(p, (PixelBlue(*p) * l) / INT_TO_FIX(31));
}
y[u] += yy[u];
}
y[u] += yy[u];
}
}
}