124 lines
3.7 KiB
C++
124 lines
3.7 KiB
C++
|
|
||
|
#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];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|