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.198 by root, Sun Jul 15 21:42:02 2007 UTC vs.
Revision 1.204 by root, Thu Jul 19 14:54:50 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
587 opengl_fontmap = pango_opengl_font_map_new (); 588 opengl_fontmap = pango_opengl_font_map_new ();
588 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0); 589 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0);
589 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap); 590 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap);
590} 591}
591 592
593char *
594SDL_GetError ()
595
592int 596int
593SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE) 597SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE)
594 598
595void 599void
596SDL_Quit () 600SDL_Quit ()
597 601
598void 602void
599SDL_ListModes () 603SDL_ListModes (int rgb, int alpha)
600 PPCODE: 604 PPCODE:
601{ 605{
602 SDL_Rect **m; 606 SDL_Rect **m;
603 607
604 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 5); 608 SDL_GL_SetAttribute (SDL_GL_RED_SIZE , rgb);
605 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5); 609 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb);
606 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5); 610 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE , rgb);
607 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1); 611 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, alpha);
608 612
609 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 613 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
610 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0); 614 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE , 0);
611 615
612 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0); 616 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE , 0);
613 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 617 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
614 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0); 618 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0);
615 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 619 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
616 620
617 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 621 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
618#if SDL_VERSION_ATLEAST(1,2,10) 622#if SDL_VERSION_ATLEAST(1,2,10)
619 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1); 623 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1);
620 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1); 624 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1);
621#endif 625#endif
622 626
623 SDL_EnableUNICODE (1);
624 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
625
626 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 627 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
627 628
628 if (m && m != (SDL_Rect **)-1) 629 if (m && m != (SDL_Rect **)-1)
629 while (*m) 630 while (*m)
630 { 631 {
632 if ((*m)->w >= 640 && (*m)->h >= 480)
633 {
631 AV *av = newAV (); 634 AV *av = newAV ();
632 av_push (av, newSViv ((*m)->w)); 635 av_push (av, newSViv ((*m)->w));
633 av_push (av, newSViv ((*m)->h)); 636 av_push (av, newSViv ((*m)->h));
637 av_push (av, newSViv (rgb));
638 av_push (av, newSViv (alpha));
634 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 639 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
640 }
635 641
636 ++m; 642 ++m;
637 } 643 }
638} 644}
639 645
640char *
641SDL_GetError ()
642
643int 646int
644SDL_SetVideoMode (int w, int h, int fullscreen) 647SDL_SetVideoMode (int w, int h, int rgb, int alpha, int fullscreen)
645 CODE: 648 CODE:
649{
650 SDL_EnableUNICODE (1);
651 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
652
653 SDL_GL_SetAttribute (SDL_GL_RED_SIZE , rgb);
654 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb);
655 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE , rgb);
656 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, alpha);
657
646 RETVAL = !!SDL_SetVideoMode ( 658 RETVAL = !!SDL_SetVideoMode (
647 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0) 659 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0)
648 ); 660 );
661
649 if (RETVAL) 662 if (RETVAL)
650 { 663 {
651 av_clear (texture_av); 664 av_clear (texture_av);
652 665
653 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 666 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
654# define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 667#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
655# include "glfunc.h" 668#include "glfunc.h"
656# undef GL_FUNC 669#undef GL_FUNC
657
658 } 670 }
671}
659 OUTPUT: 672 OUTPUT:
660 RETVAL 673 RETVAL
661 674
662void 675void
663SDL_GL_SwapBuffers () 676SDL_GL_SwapBuffers ()
1242 flags 1255 flags
1243 ); 1256 );
1244 1257
1245MODULE = CFPlus PACKAGE = CFPlus::Texture 1258MODULE = CFPlus PACKAGE = CFPlus::Texture
1246 1259
1247void 1260int minpot (int n)
1248pad2pot (SV *data_, SV *w_, SV *h_)
1249 CODE:
1250{
1251 int ow = SvIV (w_);
1252 int oh = SvIV (h_);
1253 1261
1254 if (ow && oh) 1262void
1263pad (SV *data_, int ow, int oh, int nw, int nh)
1264 CODE:
1265{
1266 if ((nw != ow || nh != oh) && SvOK (data_))
1255 { 1267 {
1256 int nw = minpot (ow);
1257 int nh = minpot (oh);
1258
1259 if (nw != ow || nh != oh)
1260 {
1261 if (SvOK (data_))
1262 {
1263 STRLEN datalen; 1268 STRLEN datalen;
1264 char *data = SvPVbyte (data_, datalen); 1269 char *data = SvPVbyte (data_, datalen);
1265 int bpp = datalen / (ow * oh); 1270 int bpp = datalen / (ow * oh);
1266 SV *result_ = sv_2mortal (newSV (nw * nh * bpp)); 1271 SV *result_ = sv_2mortal (newSV (nw * nh * bpp));
1267 1272
1268 SvPOK_only (result_); 1273 SvPOK_only (result_);
1269 SvCUR_set (result_, nw * nh * bpp); 1274 SvCUR_set (result_, nw * nh * bpp);
1270 1275
1271 memset (SvPVX (result_), 0, nw * nh * bpp); 1276 memset (SvPVX (result_), 0, nw * nh * bpp);
1272 while (oh--) 1277 while (oh--)
1273 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);
1274 1279
1275 sv_setsv (data_, result_); 1280 sv_setsv (data_, result_);
1276 }
1277
1278 sv_setiv (w_, nw);
1279 sv_setiv (h_, nh);
1280 }
1281 } 1281 }
1282} 1282}
1283 1283
1284void 1284void
1285draw_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.)
1327 { 1327 {
1328 glDisable (GL_ALPHA_TEST); 1328 glDisable (GL_ALPHA_TEST);
1329 glDisable (GL_BLEND); 1329 glDisable (GL_BLEND);
1330 } 1330 }
1331} 1331}
1332
1333IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type)
1334 CODE:
1335{
1336 GLint width;
1337 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, 0);
1338 glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
1339 RETVAL = width > 0;
1340}
1341 OUTPUT:
1342 RETVAL
1332 1343
1333MODULE = CFPlus PACKAGE = CFPlus::Map 1344MODULE = CFPlus PACKAGE = CFPlus::Map
1334 1345
1335CFPlus::Map 1346CFPlus::Map
1336new (SV *class) 1347new (SV *class)
1953void 1964void
1954fow_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)
1955 PPCODE: 1966 PPCODE:
1956{ 1967{
1957 int x, y; 1968 int x, y;
1969 int sw1 = sw + 2;
1970 int sh1 = sh + 2;
1971 int sh3 = sh * 3;
1958 int sw4 = (sw + 3) & ~3; 1972 int sw34 = (sw * 3 + 3) & ~3;
1973 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
1959 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh)); 1974 SV *darkness3_sv = sv_2mortal (newSV (sw34 * sh3));
1960 uint8_t *darkness = (uint8_t *)SvPVX (darkness_sv); 1975 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
1961 1976
1962 memset (darkness, 255, sw4 * sh);
1963 SvPOK_only (darkness_sv); 1977 SvPOK_only (darkness3_sv);
1964 SvCUR_set (darkness_sv, sw4 * sh); 1978 SvCUR_set (darkness3_sv, sw34 * sh3);
1965 1979
1966 mx += self->x; 1980 mx += self->x - 1;
1967 my += self->y; 1981 my += self->y - 1;
1968 1982
1983 memset (darkness1, 255, sw1 * sh1);
1984
1969 for (y = 0; y < sh; y++) 1985 for (y = 0; y < sh1; y++)
1970 if (0 <= y + my && y + my < self->rows) 1986 if (0 <= y + my && y + my < self->rows)
1971 { 1987 {
1972 maprow *row = self->row + (y + my); 1988 maprow *row = self->row + (y + my);
1973 1989
1974 for (x = 0; x < sw; x++) 1990 for (x = 0; x < sw1; x++)
1975 if (row->c0 <= x + mx && x + mx < row->c1) 1991 if (row->c0 <= x + mx && x + mx < row->c1)
1976 { 1992 {
1977 mapcell *cell = row->col + (x + mx - row->c0); 1993 mapcell *cell = row->col + (x + mx - row->c0);
1978 1994
1979 darkness[y * sw4 + x] = cell->darkness 1995 darkness1 [y * sw1 + x] = cell->darkness
1980 ? 255 - (cell->darkness - 1) 1996 ? 255 - (cell->darkness - 1)
1981 : 255 - FOW_DARKNESS; 1997 : 255 - FOW_DARKNESS;
1982 } 1998 }
1983 } 1999 }
1984 2000
2001 for (y = 0; y < sh; ++y)
2002 for (x = 0; x < sw; ++x)
2003 {
2004 uint8_t d11 = darkness1 [(y ) * sw1 + x ];
2005 uint8_t d21 = darkness1 [(y ) * sw1 + x + 1];
2006 uint8_t d31 = darkness1 [(y ) * sw1 + x + 2];
2007 uint8_t d12 = darkness1 [(y + 1) * sw1 + x ];
2008 uint8_t d22 = darkness1 [(y + 1) * sw1 + x + 1];
2009 uint8_t d32 = darkness1 [(y + 1) * sw1 + x + 2];
2010 uint8_t d13 = darkness1 [(y + 2) * sw1 + x ];
2011 uint8_t d23 = darkness1 [(y + 2) * sw1 + x + 1];
2012 uint8_t d33 = darkness1 [(y + 2) * sw1 + x + 2];
2013
2014 uint8_t r11 = (d11 + d21 + d12) / 3;
2015 uint8_t r21 = d21;
2016 uint8_t r31 = (d21 + d31 + d32) / 3;
2017
2018 uint8_t r12 = d12;
2019 uint8_t r22 = d22;
2020 uint8_t r32 = d32;
2021
2022 uint8_t r13 = (d13 + d23 + d12) / 3;
2023 uint8_t r23 = d23;
2024 uint8_t r33 = (d23 + d33 + d32) / 3;
2025
2026 darkness3 [(y * 3 ) * sw34 + (x * 3 )] = MAX (d22, r11);
2027 darkness3 [(y * 3 ) * sw34 + (x * 3 + 1)] = MAX (d22, r21);
2028 darkness3 [(y * 3 ) * sw34 + (x * 3 + 2)] = MAX (d22, r31);
2029 darkness3 [(y * 3 + 1) * sw34 + (x * 3 )] = MAX (d22, r12);
2030 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 1)] = MAX (d22, r22);
2031 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 2)] = MAX (d22, r32);
2032 darkness3 [(y * 3 + 2) * sw34 + (x * 3 )] = MAX (d22, r13);
2033 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 1)] = MAX (d22, r23);
2034 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 2)] = MAX (d22, r33);
2035 }
2036
2037 free (darkness1);
2038
1985 EXTEND (SP, 3); 2039 EXTEND (SP, 3);
1986 PUSHs (sv_2mortal (newSViv (sw4))); 2040 PUSHs (sv_2mortal (newSViv (sw34)));
1987 PUSHs (sv_2mortal (newSViv (sh))); 2041 PUSHs (sv_2mortal (newSViv (sh3)));
1988 PUSHs (darkness_sv); 2042 PUSHs (darkness3_sv);
1989} 2043}
1990 2044
1991SV * 2045SV *
1992get_rect (CFPlus::Map self, int x0, int y0, int w, int h) 2046get_rect (CFPlus::Map self, int x0, int y0, int w, int h)
1993 CODE: 2047 CODE:
2205 static const struct { 2259 static const struct {
2206 const char *name; 2260 const char *name;
2207 IV iv; 2261 IV iv;
2208 } *civ, const_iv[] = { 2262 } *civ, const_iv[] = {
2209# define const_iv(name) { # name, (IV)name } 2263# define const_iv(name) { # name, (IV)name }
2264 const_iv (GL_VENDOR),
2265 const_iv (GL_VERSION),
2266 const_iv (GL_EXTENSIONS),
2210 const_iv (GL_COLOR_MATERIAL), 2267 const_iv (GL_COLOR_MATERIAL),
2211 const_iv (GL_SMOOTH), 2268 const_iv (GL_SMOOTH),
2212 const_iv (GL_FLAT), 2269 const_iv (GL_FLAT),
2213 const_iv (GL_DITHER), 2270 const_iv (GL_DITHER),
2214 const_iv (GL_BLEND), 2271 const_iv (GL_BLEND),
2241 const_iv (GL_LUMINANCE), 2298 const_iv (GL_LUMINANCE),
2242 const_iv (GL_LUMINANCE_ALPHA), 2299 const_iv (GL_LUMINANCE_ALPHA),
2243 const_iv (GL_FLOAT), 2300 const_iv (GL_FLOAT),
2244 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2301 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2245 const_iv (GL_COMPILE), 2302 const_iv (GL_COMPILE),
2303 const_iv (GL_PROXY_TEXTURE_1D),
2304 const_iv (GL_PROXY_TEXTURE_2D),
2246 const_iv (GL_TEXTURE_1D), 2305 const_iv (GL_TEXTURE_1D),
2247 const_iv (GL_TEXTURE_2D), 2306 const_iv (GL_TEXTURE_2D),
2248 const_iv (GL_TEXTURE_ENV), 2307 const_iv (GL_TEXTURE_ENV),
2249 const_iv (GL_TEXTURE_MAG_FILTER), 2308 const_iv (GL_TEXTURE_MAG_FILTER),
2250 const_iv (GL_TEXTURE_MIN_FILTER), 2309 const_iv (GL_TEXTURE_MIN_FILTER),
2316 CODE: 2375 CODE:
2317 RETVAL = (char *)glGetString (GL_EXTENSIONS); 2376 RETVAL = (char *)glGetString (GL_EXTENSIONS);
2318 OUTPUT: 2377 OUTPUT:
2319 RETVAL 2378 RETVAL
2320 2379
2380const char *glGetString (GLenum pname)
2381
2382GLint glGetInteger (GLenum pname)
2383 CODE:
2384 glGetIntegerv (pname, &RETVAL);
2385 OUTPUT:
2386 RETVAL
2387
2388GLdouble glGetDouble (GLenum pname)
2389 CODE:
2390 glGetDoublev (pname, &RETVAL);
2391 OUTPUT:
2392 RETVAL
2393
2321int glGetError () 2394int glGetError ()
2322 2395
2323void glFinish () 2396void glFinish ()
2324 2397
2325void glClear (int mask) 2398void glClear (int mask)
2447 2520
2448void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 2521void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
2449 2522
2450void glDrawPixels (int width, int height, int format, int type, char *pixels) 2523void glDrawPixels (int width, int height, int format, int type, char *pixels)
2451 2524
2525void glPixelZoom (float x, float y)
2526
2452void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR) 2527void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
2453 2528
2454int glGenTexture () 2529int glGenTexture ()
2455 CODE: 2530 CODE:
2456 RETVAL = gen_texture (); 2531 RETVAL = gen_texture ();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines