#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]; } } }