--- deliantra/Deliantra-Client/Client.xs 2007/07/17 16:02:13 1.200 +++ deliantra/Deliantra-Client/Client.xs 2007/07/17 17:39:06 1.201 @@ -1976,7 +1976,7 @@ } void -fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) +fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh, int smoothing, const char *matrix) PPCODE: { int x, y; @@ -2007,6 +2007,36 @@ } } + if (smoothing) + { + SV *darkness2_sv = sv_2mortal (newSV (sw4 * sh)); + uint8_t *darkness2 = (uint8_t *)SvPVX (darkness2_sv); + + SvPOK_only (darkness2_sv); + SvCUR_set (darkness2_sv, sw4 * sh); + + for (y = 0; y < sh; ++y) + for (x = 0; x < sw4; ++x) + { + float *f = (float *)matrix; + int dx, dy; + float sum = 0.f; + + for (dy = -1; dy <= 1; ++dy) + for (dx = -1; dx <= 1; ++dx) + { + unsigned int x2 = x + dx; + unsigned int y2 = y + dy; + + sum += (x2 < sw && y2 < sh ? darkness [y2 * sw4 + x2] : 255) * *f++; + } + + darkness2 [y * sw4 + x] = sum > 255. ? 255. : sum; + } + + darkness_sv = darkness2_sv; + } + EXTEND (SP, 3); PUSHs (sv_2mortal (newSViv (sw4))); PUSHs (sv_2mortal (newSViv (sh))); @@ -2348,7 +2378,7 @@ OUTPUT: RETVAL -char *glGetString (GLenum pname) +const char *glGetString (GLenum pname) GLint glGetInteger (GLenum pname) CODE: