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.192 by root, Fri Apr 27 21:27:51 2007 UTC vs.
Revision 1.202 by root, Tue Jul 17 18:34:24 2007 UTC

6# include <wininet.h> 6# include <wininet.h>
7# pragma warning(disable:4244) 7# pragma warning(disable:4244)
8# pragma warning(disable:4761) 8# pragma warning(disable:4761)
9#endif 9#endif
10 10
11//#define DEBUG 1
12#if DEBUG
13# include <valgrind/memcheck.h>
14#endif
15
11#include "EXTERN.h" 16#include "EXTERN.h"
12#include "perl.h" 17#include "perl.h"
13#include "XSUB.h" 18#include "XSUB.h"
14 19
15#ifdef _WIN32 20#ifdef _WIN32
21#include <string.h> 26#include <string.h>
22#include <stdio.h> 27#include <stdio.h>
23#include <stdlib.h> 28#include <stdlib.h>
24 29
25#include <SDL.h> 30#include <SDL.h>
31#include <SDL_thread.h>
26#include <SDL_endian.h> 32#include <SDL_endian.h>
27#include <SDL_image.h> 33#include <SDL_image.h>
28#include <SDL_mixer.h> 34#include <SDL_mixer.h>
29#include <SDL_opengl.h> 35#include <SDL_opengl.h>
30 36
582 opengl_fontmap = pango_opengl_font_map_new (); 588 opengl_fontmap = pango_opengl_font_map_new ();
583 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);
584 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap); 590 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap);
585} 591}
586 592
593char *
594SDL_GetError ()
595
587int 596int
588SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE) 597SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE)
589 598
590void 599void
591SDL_Quit () 600SDL_Quit ()
592 601
593void 602void
594SDL_ListModes () 603SDL_ListModes (int rgb, int alpha)
595 PPCODE: 604 PPCODE:
596{ 605{
597 SDL_Rect **m; 606 SDL_Rect **m;
598 607
599 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 5); 608 SDL_GL_SetAttribute (SDL_GL_RED_SIZE , rgb);
600 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5); 609 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb);
601 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5); 610 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE , rgb);
602 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1); 611 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, alpha);
603 612
604 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 613 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
605 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0); 614 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE , 0);
606 615
607 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0); 616 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE , 0);
608 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 617 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
609 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0); 618 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0);
610 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 619 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
611 620
612 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 621 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
613#if SDL_VERSION_ATLEAST(1,2,10) 622#if SDL_VERSION_ATLEAST(1,2,10)
614 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1); 623 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1);
615 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1); 624 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1);
616#endif 625#endif
617 626
618 SDL_EnableUNICODE (1);
619 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
620
621 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 627 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
622 628
623 if (m && m != (SDL_Rect **)-1) 629 if (m && m != (SDL_Rect **)-1)
624 while (*m) 630 while (*m)
625 { 631 {
632 if ((*m)->w >= 640 && (*m)->h >= 480)
633 {
626 AV *av = newAV (); 634 AV *av = newAV ();
627 av_push (av, newSViv ((*m)->w)); 635 av_push (av, newSViv ((*m)->w));
628 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));
629 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 639 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
640 }
630 641
631 ++m; 642 ++m;
632 } 643 }
633} 644}
634 645
635char *
636SDL_GetError ()
637
638int 646int
639SDL_SetVideoMode (int w, int h, int fullscreen) 647SDL_SetVideoMode (int w, int h, int rgb, int alpha, int fullscreen)
640 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
641 RETVAL = !!SDL_SetVideoMode ( 658 RETVAL = !!SDL_SetVideoMode (
642 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0) 659 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0)
643 ); 660 );
661
644 if (RETVAL) 662 if (RETVAL)
645 { 663 {
646 av_clear (texture_av); 664 av_clear (texture_av);
647 665
648 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 666 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
649# 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);
650# include "glfunc.h" 668#include "glfunc.h"
651# undef GL_FUNC 669#undef GL_FUNC
652
653 } 670 }
671}
654 OUTPUT: 672 OUTPUT:
655 RETVAL 673 RETVAL
656 674
657void 675void
658SDL_GL_SwapBuffers () 676SDL_GL_SwapBuffers ()
659 677
660char * 678char *
661SDL_GetKeyName (int sym) 679SDL_GetKeyName (int sym)
662 680
681int
682SDL_GetAppState ()
683
663void 684void
664SDL_PollEvent () 685poll_events ()
665 PPCODE: 686 PPCODE:
666{ 687{
667 SDL_Event ev; 688 SDL_Event ev;
668 689
669 while (SDL_PollEvent (&ev)) 690 SDL_PumpEvents ();
691 while (SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_ALLEVENTS) > 0)
670 { 692 {
671 HV *hv = newHV (); 693 HV *hv = newHV ();
672 hv_store (hv, "type", 4, newSViv (ev.type), 0); 694 hv_store (hv, "type", 4, newSViv (ev.type), 0);
673 695
674 switch (ev.type) 696 switch (ev.type)
686 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0); 708 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
687 hv_store (hv, "state", 5, newSViv (ev.active.state), 0); 709 hv_store (hv, "state", 5, newSViv (ev.active.state), 0);
688 break; 710 break;
689 711
690 case SDL_MOUSEMOTION: 712 case SDL_MOUSEMOTION:
713 {
714 int state = ev.motion.state;
715 int x = ev.motion.x;
716 int y = ev.motion.y;
717 int xrel = ev.motion.xrel;
718 int yrel = ev.motion.yrel;
719
720 /* do simplistic event compression */
721 while (SDL_PeepEvents (&ev, 1, SDL_PEEKEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION)) > 0
722 && state == ev.motion.state)
723 {
724 xrel += ev.motion.xrel;
725 yrel += ev.motion.yrel;
726 x = ev.motion.x;
727 y = ev.motion.y;
728 SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION));
729 }
730
691 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 731 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0);
692
693 hv_store (hv, "state", 5, newSViv (ev.motion.state), 0); 732 hv_store (hv, "state", 5, newSViv (state), 0);
694 hv_store (hv, "x", 1, newSViv (ev.motion.x), 0); 733 hv_store (hv, "x", 1, newSViv (x), 0);
695 hv_store (hv, "y", 1, newSViv (ev.motion.y), 0); 734 hv_store (hv, "y", 1, newSViv (y), 0);
696 hv_store (hv, "xrel", 4, newSViv (ev.motion.xrel), 0); 735 hv_store (hv, "xrel", 4, newSViv (xrel), 0);
697 hv_store (hv, "yrel", 4, newSViv (ev.motion.yrel), 0); 736 hv_store (hv, "yrel", 4, newSViv (yrel), 0);
737 }
698 break; 738 break;
699 739
700 case SDL_MOUSEBUTTONDOWN: 740 case SDL_MOUSEBUTTONDOWN:
701 case SDL_MOUSEBUTTONUP: 741 case SDL_MOUSEBUTTONUP:
702 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 742 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0);
882 ExitThread (retval); // unclean, please beam me up 922 ExitThread (retval); // unclean, please beam me up
883#else 923#else
884 _exit (retval); 924 _exit (retval);
885#endif 925#endif
886 926
927void
928debug ()
929 CODE:
930{
931#if DEBUG
932 VALGRIND_DO_LEAK_CHECK;
933#endif
934}
935
887MODULE = CFPlus PACKAGE = CFPlus::Font 936MODULE = CFPlus PACKAGE = CFPlus::Font
888 937
889CFPlus::Font 938CFPlus::Font
890new_from_file (SV *class, char *path, int id = 0) 939new_from_file (SV *class, char *path, int id = 0)
891 CODE: 940 CODE:
1206 flags 1255 flags
1207 ); 1256 );
1208 1257
1209MODULE = CFPlus PACKAGE = CFPlus::Texture 1258MODULE = CFPlus PACKAGE = CFPlus::Texture
1210 1259
1260int minpot (int n)
1261
1211void 1262void
1212pad2pot (SV *data_, SV *w_, SV *h_) 1263pad2pot (SV *data_, SV *w_, SV *h_)
1213 CODE: 1264 CODE:
1214{ 1265{
1215 int ow = SvIV (w_); 1266 int ow = SvIV (w_);
1291 { 1342 {
1292 glDisable (GL_ALPHA_TEST); 1343 glDisable (GL_ALPHA_TEST);
1293 glDisable (GL_BLEND); 1344 glDisable (GL_BLEND);
1294 } 1345 }
1295} 1346}
1347
1348IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type)
1349 CODE:
1350{
1351 GLint width;
1352 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, 0);
1353 glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
1354 RETVAL = width > 0;
1355}
1356 OUTPUT:
1357 RETVAL
1296 1358
1297MODULE = CFPlus PACKAGE = CFPlus::Map 1359MODULE = CFPlus PACKAGE = CFPlus::Map
1298 1360
1299CFPlus::Map 1361CFPlus::Map
1300new (SV *class) 1362new (SV *class)
1913 glDisable (GL_BLEND); 1975 glDisable (GL_BLEND);
1914 glDisable (GL_TEXTURE_2D); 1976 glDisable (GL_TEXTURE_2D);
1915} 1977}
1916 1978
1917void 1979void
1918fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) 1980fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh, int smoothing, const char *matrix)
1919 PPCODE: 1981 PPCODE:
1920{ 1982{
1921 int x, y; 1983 int x, y;
1922 int sw4 = (sw + 3) & ~3; 1984 int sw4 = (sw + 3) & ~3;
1923 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh)); 1985 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh));
1943 darkness[y * sw4 + x] = cell->darkness 2005 darkness[y * sw4 + x] = cell->darkness
1944 ? 255 - (cell->darkness - 1) 2006 ? 255 - (cell->darkness - 1)
1945 : 255 - FOW_DARKNESS; 2007 : 255 - FOW_DARKNESS;
1946 } 2008 }
1947 } 2009 }
2010
2011 if (smoothing)
2012 {
2013 SV *darkness2_sv = sv_2mortal (newSV (sw4 * sh));
2014 uint8_t *darkness2 = (uint8_t *)SvPVX (darkness2_sv);
2015
2016 SvPOK_only (darkness2_sv);
2017 SvCUR_set (darkness2_sv, sw4 * sh);
2018
2019 for (y = 0; y < sh; ++y)
2020 for (x = 0; x < sw4; ++x)
2021 {
2022 float *f = (float *)matrix;
2023 int dx, dy;
2024 float sum = 0.f;
2025
2026 for (dy = -1; dy <= 1; ++dy)
2027 for (dx = -1; dx <= 1; ++dx)
2028 {
2029 unsigned int x2 = x + dx;
2030 unsigned int y2 = y + dy;
2031
2032 sum += (x2 < sw && y2 < sh ? darkness [y2 * sw4 + x2] : 255) * *f++;
2033 }
2034
2035 darkness2 [y * sw4 + x] = sum > 255. ? 255. : sum;
2036 }
2037
2038 darkness_sv = darkness2_sv;
2039 }
1948 2040
1949 EXTEND (SP, 3); 2041 EXTEND (SP, 3);
1950 PUSHs (sv_2mortal (newSViv (sw4))); 2042 PUSHs (sv_2mortal (newSViv (sw4)));
1951 PUSHs (sv_2mortal (newSViv (sh))); 2043 PUSHs (sv_2mortal (newSViv (sh)));
1952 PUSHs (darkness_sv); 2044 PUSHs (darkness_sv);
2126 CODE: 2218 CODE:
2127 RETVAL = Mix_VolumeMusic (volume); 2219 RETVAL = Mix_VolumeMusic (volume);
2128 OUTPUT: 2220 OUTPUT:
2129 RETVAL 2221 RETVAL
2130 2222
2223int
2224fade_out (int ms)
2225 CODE:
2226 RETVAL = Mix_FadeOutMusic (ms);
2227 OUTPUT:
2228 RETVAL
2229
2131CFPlus::MixMusic 2230CFPlus::MixMusic
2132new_from_file (SV *class, char *path) 2231new_from_file (SV *class, char *path)
2133 CODE: 2232 CODE:
2134 RETVAL = Mix_LoadMUS (path); 2233 RETVAL = Mix_LoadMUS (path);
2135 OUTPUT: 2234 OUTPUT:
2142 2241
2143int 2242int
2144play (CFPlus::MixMusic self, int loops = -1) 2243play (CFPlus::MixMusic self, int loops = -1)
2145 CODE: 2244 CODE:
2146 RETVAL = Mix_PlayMusic (self, loops); 2245 RETVAL = Mix_PlayMusic (self, loops);
2246 OUTPUT:
2247 RETVAL
2248
2249int
2250fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2251 CODE:
2252 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position);
2147 OUTPUT: 2253 OUTPUT:
2148 RETVAL 2254 RETVAL
2149 2255
2150MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2256MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2151 2257
2155 static const struct { 2261 static const struct {
2156 const char *name; 2262 const char *name;
2157 IV iv; 2263 IV iv;
2158 } *civ, const_iv[] = { 2264 } *civ, const_iv[] = {
2159# define const_iv(name) { # name, (IV)name } 2265# define const_iv(name) { # name, (IV)name }
2266 const_iv (GL_VENDOR),
2267 const_iv (GL_VERSION),
2268 const_iv (GL_EXTENSIONS),
2160 const_iv (GL_COLOR_MATERIAL), 2269 const_iv (GL_COLOR_MATERIAL),
2161 const_iv (GL_SMOOTH), 2270 const_iv (GL_SMOOTH),
2162 const_iv (GL_FLAT), 2271 const_iv (GL_FLAT),
2163 const_iv (GL_DITHER), 2272 const_iv (GL_DITHER),
2164 const_iv (GL_BLEND), 2273 const_iv (GL_BLEND),
2191 const_iv (GL_LUMINANCE), 2300 const_iv (GL_LUMINANCE),
2192 const_iv (GL_LUMINANCE_ALPHA), 2301 const_iv (GL_LUMINANCE_ALPHA),
2193 const_iv (GL_FLOAT), 2302 const_iv (GL_FLOAT),
2194 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2303 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2195 const_iv (GL_COMPILE), 2304 const_iv (GL_COMPILE),
2305 const_iv (GL_PROXY_TEXTURE_1D),
2306 const_iv (GL_PROXY_TEXTURE_2D),
2196 const_iv (GL_TEXTURE_1D), 2307 const_iv (GL_TEXTURE_1D),
2197 const_iv (GL_TEXTURE_2D), 2308 const_iv (GL_TEXTURE_2D),
2198 const_iv (GL_TEXTURE_ENV), 2309 const_iv (GL_TEXTURE_ENV),
2199 const_iv (GL_TEXTURE_MAG_FILTER), 2310 const_iv (GL_TEXTURE_MAG_FILTER),
2200 const_iv (GL_TEXTURE_MIN_FILTER), 2311 const_iv (GL_TEXTURE_MIN_FILTER),
2266 CODE: 2377 CODE:
2267 RETVAL = (char *)glGetString (GL_EXTENSIONS); 2378 RETVAL = (char *)glGetString (GL_EXTENSIONS);
2268 OUTPUT: 2379 OUTPUT:
2269 RETVAL 2380 RETVAL
2270 2381
2382const char *glGetString (GLenum pname)
2383
2384GLint glGetInteger (GLenum pname)
2385 CODE:
2386 glGetIntegerv (pname, &RETVAL);
2387 OUTPUT:
2388 RETVAL
2389
2390GLdouble glGetDouble (GLenum pname)
2391 CODE:
2392 glGetDoublev (pname, &RETVAL);
2393 OUTPUT:
2394 RETVAL
2395
2271int glGetError () 2396int glGetError ()
2272 2397
2273void glFinish () 2398void glFinish ()
2274 2399
2275void glClear (int mask) 2400void glClear (int mask)
2397 2522
2398void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 2523void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
2399 2524
2400void glDrawPixels (int width, int height, int format, int type, char *pixels) 2525void glDrawPixels (int width, int height, int format, int type, char *pixels)
2401 2526
2527void glPixelZoom (float x, float y)
2528
2402void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR) 2529void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
2403 2530
2404int glGenTexture () 2531int glGenTexture ()
2405 CODE: 2532 CODE:
2406 RETVAL = gen_texture (); 2533 RETVAL = gen_texture ();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines