ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/Client.xs
(Generate patch)

Comparing deliantra/Deliantra-Client/Client.xs (file contents):
Revision 1.200 by root, Tue Jul 17 16:02:13 2007 UTC vs.
Revision 1.203 by root, Thu Jul 19 13:45:16 2007 UTC

26#include <string.h> 26#include <string.h>
27#include <stdio.h> 27#include <stdio.h>
28#include <stdlib.h> 28#include <stdlib.h>
29 29
30#include <SDL.h> 30#include <SDL.h>
31#include <SDL_thread.h>
31#include <SDL_endian.h> 32#include <SDL_endian.h>
32#include <SDL_image.h> 33#include <SDL_image.h>
33#include <SDL_mixer.h> 34#include <SDL_mixer.h>
34#include <SDL_opengl.h> 35#include <SDL_opengl.h>
35 36
1257MODULE = CFPlus PACKAGE = CFPlus::Texture 1258MODULE = CFPlus PACKAGE = CFPlus::Texture
1258 1259
1259int minpot (int n) 1260int minpot (int n)
1260 1261
1261void 1262void
1262pad2pot (SV *data_, SV *w_, SV *h_) 1263pad (SV *data_, int ow, int oh, int nw, int nh)
1263 CODE: 1264 CODE:
1264{ 1265{
1265 int ow = SvIV (w_); 1266 if ((nw != ow || nh != oh) && SvOK (data_))
1266 int oh = SvIV (h_);
1267
1268 if (ow && oh)
1269 { 1267 {
1270 int nw = minpot (ow);
1271 int nh = minpot (oh);
1272
1273 if (nw != ow || nh != oh)
1274 {
1275 if (SvOK (data_))
1276 {
1277 STRLEN datalen; 1268 STRLEN datalen;
1278 char *data = SvPVbyte (data_, datalen); 1269 char *data = SvPVbyte (data_, datalen);
1279 int bpp = datalen / (ow * oh); 1270 int bpp = datalen / (ow * oh);
1280 SV *result_ = sv_2mortal (newSV (nw * nh * bpp)); 1271 SV *result_ = sv_2mortal (newSV (nw * nh * bpp));
1281 1272
1282 SvPOK_only (result_); 1273 SvPOK_only (result_);
1283 SvCUR_set (result_, nw * nh * bpp); 1274 SvCUR_set (result_, nw * nh * bpp);
1284 1275
1285 memset (SvPVX (result_), 0, nw * nh * bpp); 1276 memset (SvPVX (result_), 0, nw * nh * bpp);
1286 while (oh--) 1277 while (oh--)
1287 memcpy (SvPVX (result_) + oh * nw * bpp, data + oh * ow * bpp, ow * bpp); 1278 memcpy (SvPVX (result_) + oh * nw * bpp, data + oh * ow * bpp, ow * bpp);
1288 1279
1289 sv_setsv (data_, result_); 1280 sv_setsv (data_, result_);
1290 }
1291
1292 sv_setiv (w_, nw);
1293 sv_setiv (h_, nh);
1294 }
1295 } 1281 }
1296} 1282}
1297 1283
1298void 1284void
1299draw_quad (SV *self, float x, float y, float w = 0., float h = 0.) 1285draw_quad (SV *self, float x, float y, float w = 0., float h = 0.)
1974 glDisable (GL_BLEND); 1960 glDisable (GL_BLEND);
1975 glDisable (GL_TEXTURE_2D); 1961 glDisable (GL_TEXTURE_2D);
1976} 1962}
1977 1963
1978void 1964void
1979fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) 1965fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh, int smoothing, const char *matrix)
1980 PPCODE: 1966 PPCODE:
1981{ 1967{
1982 int x, y; 1968 int x, y;
1983 int sw4 = (sw + 3) & ~3; 1969 int sw4 = (sw + 3) & ~3;
1984 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh)); 1970 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh));
2004 darkness[y * sw4 + x] = cell->darkness 1990 darkness[y * sw4 + x] = cell->darkness
2005 ? 255 - (cell->darkness - 1) 1991 ? 255 - (cell->darkness - 1)
2006 : 255 - FOW_DARKNESS; 1992 : 255 - FOW_DARKNESS;
2007 } 1993 }
2008 } 1994 }
1995
1996 if (smoothing)
1997 {
1998 SV *darkness2_sv = sv_2mortal (newSV (sw4 * sh));
1999 uint8_t *darkness2 = (uint8_t *)SvPVX (darkness2_sv);
2000
2001 SvPOK_only (darkness2_sv);
2002 SvCUR_set (darkness2_sv, sw4 * sh);
2003
2004 for (y = 0; y < sh; ++y)
2005 for (x = 0; x < sw4; ++x)
2006 {
2007 float *f = (float *)matrix;
2008 int dx, dy;
2009 float sum = 0.f;
2010
2011 for (dy = -1; dy <= 1; ++dy)
2012 for (dx = -1; dx <= 1; ++dx)
2013 {
2014 unsigned int x2 = x + dx;
2015 unsigned int y2 = y + dy;
2016
2017 sum += (x2 < sw && y2 < sh ? darkness [y2 * sw4 + x2] : 255) * *f++;
2018 }
2019
2020 darkness2 [y * sw4 + x] = sum > 255. ? 255. : sum;
2021 }
2022
2023 darkness_sv = darkness2_sv;
2024 }
2009 2025
2010 EXTEND (SP, 3); 2026 EXTEND (SP, 3);
2011 PUSHs (sv_2mortal (newSViv (sw4))); 2027 PUSHs (sv_2mortal (newSViv (sw4)));
2012 PUSHs (sv_2mortal (newSViv (sh))); 2028 PUSHs (sv_2mortal (newSViv (sh)));
2013 PUSHs (darkness_sv); 2029 PUSHs (darkness_sv);
2346 CODE: 2362 CODE:
2347 RETVAL = (char *)glGetString (GL_EXTENSIONS); 2363 RETVAL = (char *)glGetString (GL_EXTENSIONS);
2348 OUTPUT: 2364 OUTPUT:
2349 RETVAL 2365 RETVAL
2350 2366
2351char *glGetString (GLenum pname) 2367const char *glGetString (GLenum pname)
2352 2368
2353GLint glGetInteger (GLenum pname) 2369GLint glGetInteger (GLenum pname)
2354 CODE: 2370 CODE:
2355 glGetIntegerv (pname, &RETVAL); 2371 glGetIntegerv (pname, &RETVAL);
2356 OUTPUT: 2372 OUTPUT:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines