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.188 by root, Sat Apr 21 23:47:50 2007 UTC vs.
Revision 1.200 by root, Tue Jul 17 16:02:13 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
65#define GL_FUNC(ptr,name) ptr name; 70#define GL_FUNC(ptr,name) ptr name;
66#include "glfunc.h" 71#include "glfunc.h"
67#undef GL_FUNC 72#undef GL_FUNC
68} gl; 73} gl;
69 74
75static void
70static void gl_BlendFuncSeparate (GLenum sa, GLenum da, GLenum saa, GLenum daa) 76gl_BlendFuncSeparate (GLenum sa, GLenum da, GLenum saa, GLenum daa)
71{ 77{
72 if (gl.BlendFuncSeparate) 78 if (gl.BlendFuncSeparate)
73 gl.BlendFuncSeparate (sa, da, saa, daa); 79 gl.BlendFuncSeparate (sa, da, saa, daa);
74 else if (gl.BlendFuncSeparateEXT) 80 else if (gl.BlendFuncSeparateEXT)
75 gl.BlendFuncSeparateEXT (sa, da, saa, daa); 81 gl.BlendFuncSeparateEXT (sa, da, saa, daa);
76 else 82 else
77 glBlendFunc (sa, da); 83 glBlendFunc (sa, da);
84}
85
86static GLuint
87gen_texture ()
88{
89 GLuint name;
90
91 if (AvFILL (texture_av) >= 0)
92 name = (GLuint)(size_t)av_pop (texture_av);
93 else
94 glGenTextures (1, &name);
95
96 return name;
97}
98
99static void
100del_texture (GLuint name)
101{
102 /* make a half-assed attempt at returning the memory used by the texture */
103 /* textures are frequently being reused by cfplus anyway */
104 /*glBindTexture (GL_TEXTURE_2D, name);*/
105 /*glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, 0, 0, 0, GL_ALPHA, GL_UNSIGNED_BYTE, 0);*/
106 av_push (texture_av, (SV *)(size_t)name);
107 glDeleteTextures (1, &name);
78} 108}
79 109
80#include "texcache.c" 110#include "texcache.c"
81 111
82#include "pango-font.c" 112#include "pango-font.c"
557 opengl_fontmap = pango_opengl_font_map_new (); 587 opengl_fontmap = pango_opengl_font_map_new ();
558 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0); 588 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0);
559 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap); 589 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap);
560} 590}
561 591
592char *
593SDL_GetError ()
594
562int 595int
563SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE) 596SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE)
564 597
565void 598void
566SDL_Quit () 599SDL_Quit ()
567 600
568void 601void
569SDL_ListModes () 602SDL_ListModes (int rgb, int alpha)
570 PPCODE: 603 PPCODE:
571{ 604{
572 SDL_Rect **m; 605 SDL_Rect **m;
573 606
574 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 5); 607 SDL_GL_SetAttribute (SDL_GL_RED_SIZE , rgb);
575 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5); 608 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb);
576 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5); 609 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE , rgb);
577 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1); 610 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, alpha);
578 611
579 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 612 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
580 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0); 613 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE , 0);
581 614
582 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0); 615 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE , 0);
583 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 616 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
584 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0); 617 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0);
585 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 618 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
586 619
587 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 620 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
588#if SDL_VERSION_ATLEAST(1,2,10) 621#if SDL_VERSION_ATLEAST(1,2,10)
589 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1); 622 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1);
590 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1); 623 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1);
591#endif 624#endif
592 625
593 SDL_EnableUNICODE (1);
594 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
595
596 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 626 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
597 627
598 if (m && m != (SDL_Rect **)-1) 628 if (m && m != (SDL_Rect **)-1)
599 while (*m) 629 while (*m)
600 { 630 {
631 if ((*m)->w >= 640 && (*m)->h >= 480)
632 {
601 AV *av = newAV (); 633 AV *av = newAV ();
602 av_push (av, newSViv ((*m)->w)); 634 av_push (av, newSViv ((*m)->w));
603 av_push (av, newSViv ((*m)->h)); 635 av_push (av, newSViv ((*m)->h));
636 av_push (av, newSViv (rgb));
637 av_push (av, newSViv (alpha));
604 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 638 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
639 }
605 640
606 ++m; 641 ++m;
607 } 642 }
608} 643}
609 644
610char *
611SDL_GetError ()
612
613int 645int
614SDL_SetVideoMode (int w, int h, int fullscreen) 646SDL_SetVideoMode (int w, int h, int rgb, int alpha, int fullscreen)
615 CODE: 647 CODE:
648{
649 SDL_EnableUNICODE (1);
650 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
651
652 SDL_GL_SetAttribute (SDL_GL_RED_SIZE , rgb);
653 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb);
654 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE , rgb);
655 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, alpha);
656
616 RETVAL = !!SDL_SetVideoMode ( 657 RETVAL = !!SDL_SetVideoMode (
617 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0) 658 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0)
618 ); 659 );
660
619 if (RETVAL) 661 if (RETVAL)
620 { 662 {
621 av_clear (texture_av); 663 av_clear (texture_av);
622 664
623 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 665 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
624# define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 666#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
625# include "glfunc.h" 667#include "glfunc.h"
626# undef GL_FUNC 668#undef GL_FUNC
627
628 } 669 }
670}
629 OUTPUT: 671 OUTPUT:
630 RETVAL 672 RETVAL
631 673
632void 674void
633SDL_GL_SwapBuffers () 675SDL_GL_SwapBuffers ()
634 676
635char * 677char *
636SDL_GetKeyName (int sym) 678SDL_GetKeyName (int sym)
637 679
680int
681SDL_GetAppState ()
682
638void 683void
639SDL_PollEvent () 684poll_events ()
640 PPCODE: 685 PPCODE:
641{ 686{
642 SDL_Event ev; 687 SDL_Event ev;
643 688
644 while (SDL_PollEvent (&ev)) 689 SDL_PumpEvents ();
690 while (SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_ALLEVENTS) > 0)
645 { 691 {
646 HV *hv = newHV (); 692 HV *hv = newHV ();
647 hv_store (hv, "type", 4, newSViv (ev.type), 0); 693 hv_store (hv, "type", 4, newSViv (ev.type), 0);
648 694
649 switch (ev.type) 695 switch (ev.type)
661 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0); 707 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
662 hv_store (hv, "state", 5, newSViv (ev.active.state), 0); 708 hv_store (hv, "state", 5, newSViv (ev.active.state), 0);
663 break; 709 break;
664 710
665 case SDL_MOUSEMOTION: 711 case SDL_MOUSEMOTION:
712 {
713 int state = ev.motion.state;
714 int x = ev.motion.x;
715 int y = ev.motion.y;
716 int xrel = ev.motion.xrel;
717 int yrel = ev.motion.yrel;
718
719 /* do simplistic event compression */
720 while (SDL_PeepEvents (&ev, 1, SDL_PEEKEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION)) > 0
721 && state == ev.motion.state)
722 {
723 xrel += ev.motion.xrel;
724 yrel += ev.motion.yrel;
725 x = ev.motion.x;
726 y = ev.motion.y;
727 SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION));
728 }
729
666 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 730 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0);
667
668 hv_store (hv, "state", 5, newSViv (ev.motion.state), 0); 731 hv_store (hv, "state", 5, newSViv (state), 0);
669 hv_store (hv, "x", 1, newSViv (ev.motion.x), 0); 732 hv_store (hv, "x", 1, newSViv (x), 0);
670 hv_store (hv, "y", 1, newSViv (ev.motion.y), 0); 733 hv_store (hv, "y", 1, newSViv (y), 0);
671 hv_store (hv, "xrel", 4, newSViv (ev.motion.xrel), 0); 734 hv_store (hv, "xrel", 4, newSViv (xrel), 0);
672 hv_store (hv, "yrel", 4, newSViv (ev.motion.yrel), 0); 735 hv_store (hv, "yrel", 4, newSViv (yrel), 0);
736 }
673 break; 737 break;
674 738
675 case SDL_MOUSEBUTTONDOWN: 739 case SDL_MOUSEBUTTONDOWN:
676 case SDL_MOUSEBUTTONUP: 740 case SDL_MOUSEBUTTONUP:
677 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 741 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0);
857 ExitThread (retval); // unclean, please beam me up 921 ExitThread (retval); // unclean, please beam me up
858#else 922#else
859 _exit (retval); 923 _exit (retval);
860#endif 924#endif
861 925
926void
927debug ()
928 CODE:
929{
930#if DEBUG
931 VALGRIND_DO_LEAK_CHECK;
932#endif
933}
934
862MODULE = CFPlus PACKAGE = CFPlus::Font 935MODULE = CFPlus PACKAGE = CFPlus::Font
863 936
864CFPlus::Font 937CFPlus::Font
865new_from_file (SV *class, char *path, int id = 0) 938new_from_file (SV *class, char *path, int id = 0)
866 CODE: 939 CODE:
1181 flags 1254 flags
1182 ); 1255 );
1183 1256
1184MODULE = CFPlus PACKAGE = CFPlus::Texture 1257MODULE = CFPlus PACKAGE = CFPlus::Texture
1185 1258
1259int minpot (int n)
1260
1186void 1261void
1187pad2pot (SV *data_, SV *w_, SV *h_) 1262pad2pot (SV *data_, SV *w_, SV *h_)
1188 CODE: 1263 CODE:
1189{ 1264{
1190 int ow = SvIV (w_); 1265 int ow = SvIV (w_);
1266 { 1341 {
1267 glDisable (GL_ALPHA_TEST); 1342 glDisable (GL_ALPHA_TEST);
1268 glDisable (GL_BLEND); 1343 glDisable (GL_BLEND);
1269 } 1344 }
1270} 1345}
1346
1347IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type)
1348 CODE:
1349{
1350 GLint width;
1351 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, 0);
1352 glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
1353 RETVAL = width > 0;
1354}
1355 OUTPUT:
1356 RETVAL
1271 1357
1272MODULE = CFPlus PACKAGE = CFPlus::Map 1358MODULE = CFPlus PACKAGE = CFPlus::Map
1273 1359
1274CFPlus::Map 1360CFPlus::Map
1275new (SV *class) 1361new (SV *class)
1740 smooth_key *skey = (smooth_key *)HeKEY (he); 1826 smooth_key *skey = (smooth_key *)HeKEY (he);
1741 IV bits = SvIVX (HeVAL (he)); 1827 IV bits = SvIVX (HeVAL (he));
1742 1828
1743 if (!(bits & 0x1000) 1829 if (!(bits & 0x1000)
1744 && skey->level == level 1830 && skey->level == level
1745 && level >= smooth_max [skey->x][skey->y]) 1831 && level > smooth_max [skey->x][skey->y])
1746 { 1832 {
1747 maptex tex = self->tex [skey->tile]; 1833 maptex tex = self->tex [skey->tile];
1748 int px = (((int)skey->x) - 1) * T; 1834 int px = (((int)skey->x) - 1) * T;
1749 int py = (((int)skey->y) - 1) * T; 1835 int py = (((int)skey->y) - 1) * T;
1750 int border = bits & 15; 1836 int border = bits & 15;
2101 CODE: 2187 CODE:
2102 RETVAL = Mix_VolumeMusic (volume); 2188 RETVAL = Mix_VolumeMusic (volume);
2103 OUTPUT: 2189 OUTPUT:
2104 RETVAL 2190 RETVAL
2105 2191
2192int
2193fade_out (int ms)
2194 CODE:
2195 RETVAL = Mix_FadeOutMusic (ms);
2196 OUTPUT:
2197 RETVAL
2198
2106CFPlus::MixMusic 2199CFPlus::MixMusic
2107new_from_file (SV *class, char *path) 2200new_from_file (SV *class, char *path)
2108 CODE: 2201 CODE:
2109 RETVAL = Mix_LoadMUS (path); 2202 RETVAL = Mix_LoadMUS (path);
2110 OUTPUT: 2203 OUTPUT:
2117 2210
2118int 2211int
2119play (CFPlus::MixMusic self, int loops = -1) 2212play (CFPlus::MixMusic self, int loops = -1)
2120 CODE: 2213 CODE:
2121 RETVAL = Mix_PlayMusic (self, loops); 2214 RETVAL = Mix_PlayMusic (self, loops);
2215 OUTPUT:
2216 RETVAL
2217
2218int
2219fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2220 CODE:
2221 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position);
2122 OUTPUT: 2222 OUTPUT:
2123 RETVAL 2223 RETVAL
2124 2224
2125MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2225MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2126 2226
2130 static const struct { 2230 static const struct {
2131 const char *name; 2231 const char *name;
2132 IV iv; 2232 IV iv;
2133 } *civ, const_iv[] = { 2233 } *civ, const_iv[] = {
2134# define const_iv(name) { # name, (IV)name } 2234# define const_iv(name) { # name, (IV)name }
2235 const_iv (GL_VENDOR),
2236 const_iv (GL_VERSION),
2237 const_iv (GL_EXTENSIONS),
2135 const_iv (GL_COLOR_MATERIAL), 2238 const_iv (GL_COLOR_MATERIAL),
2136 const_iv (GL_SMOOTH), 2239 const_iv (GL_SMOOTH),
2137 const_iv (GL_FLAT), 2240 const_iv (GL_FLAT),
2138 const_iv (GL_DITHER), 2241 const_iv (GL_DITHER),
2139 const_iv (GL_BLEND), 2242 const_iv (GL_BLEND),
2166 const_iv (GL_LUMINANCE), 2269 const_iv (GL_LUMINANCE),
2167 const_iv (GL_LUMINANCE_ALPHA), 2270 const_iv (GL_LUMINANCE_ALPHA),
2168 const_iv (GL_FLOAT), 2271 const_iv (GL_FLOAT),
2169 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2272 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2170 const_iv (GL_COMPILE), 2273 const_iv (GL_COMPILE),
2274 const_iv (GL_PROXY_TEXTURE_1D),
2275 const_iv (GL_PROXY_TEXTURE_2D),
2171 const_iv (GL_TEXTURE_1D), 2276 const_iv (GL_TEXTURE_1D),
2172 const_iv (GL_TEXTURE_2D), 2277 const_iv (GL_TEXTURE_2D),
2173 const_iv (GL_TEXTURE_ENV), 2278 const_iv (GL_TEXTURE_ENV),
2174 const_iv (GL_TEXTURE_MAG_FILTER), 2279 const_iv (GL_TEXTURE_MAG_FILTER),
2175 const_iv (GL_TEXTURE_MIN_FILTER), 2280 const_iv (GL_TEXTURE_MIN_FILTER),
2241 CODE: 2346 CODE:
2242 RETVAL = (char *)glGetString (GL_EXTENSIONS); 2347 RETVAL = (char *)glGetString (GL_EXTENSIONS);
2243 OUTPUT: 2348 OUTPUT:
2244 RETVAL 2349 RETVAL
2245 2350
2351char *glGetString (GLenum pname)
2352
2353GLint glGetInteger (GLenum pname)
2354 CODE:
2355 glGetIntegerv (pname, &RETVAL);
2356 OUTPUT:
2357 RETVAL
2358
2359GLdouble glGetDouble (GLenum pname)
2360 CODE:
2361 glGetDoublev (pname, &RETVAL);
2362 OUTPUT:
2363 RETVAL
2364
2246int glGetError () 2365int glGetError ()
2247 2366
2248void glFinish () 2367void glFinish ()
2249 2368
2250void glClear (int mask) 2369void glClear (int mask)
2372 2491
2373void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 2492void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
2374 2493
2375void glDrawPixels (int width, int height, int format, int type, char *pixels) 2494void glDrawPixels (int width, int height, int format, int type, char *pixels)
2376 2495
2496void glPixelZoom (float x, float y)
2497
2377void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR) 2498void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
2378 2499
2379int glGenTexture () 2500int glGenTexture ()
2380 CODE: 2501 CODE:
2381{ 2502 RETVAL = gen_texture ();
2382 GLuint name;
2383 if (AvFILL (texture_av) >= 0)
2384 name = (GLuint)av_pop (texture_av);
2385 else
2386 glGenTextures (1, &name);
2387 RETVAL = name;
2388}
2389 OUTPUT: 2503 OUTPUT:
2390 RETVAL 2504 RETVAL
2391 2505
2392void glDeleteTexture (int name) 2506void glDeleteTexture (int name)
2393 CODE: 2507 CODE:
2394{ 2508 del_texture (name);
2395 /* make a half-assed attempt at returning the memory used by the texture */ 2509
2396 /* textures are frequently being reused by cfplus anyway */
2397 glBindTexture (GL_TEXTURE_2D, name);
2398 glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, 0, 0, 0, GL_ALPHA, GL_UNSIGNED_BYTE, 0);
2399 av_push (texture_av, (SV *)name);
2400 /*glDeleteTextures (1, &name_);*/
2401}
2402
2403int glGenList () 2510int glGenList ()
2404 CODE: 2511 CODE:
2405 RETVAL = glGenLists (1); 2512 RETVAL = glGenLists (1);
2406 OUTPUT: 2513 OUTPUT:
2407 RETVAL 2514 RETVAL

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines