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.180 by root, Fri Apr 13 18:11:26 2007 UTC vs.
Revision 1.199 by root, Tue Jul 17 13:53:02 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
56# define PARACHUTE SDL_INIT_NOPARACHUTE 61# define PARACHUTE SDL_INIT_NOPARACHUTE
57#else 62#else
58# define PARACHUTE 0 63# define PARACHUTE 0
59#endif 64#endif
60 65
66static AV *texture_av;
67
61static struct 68static struct
62{ 69{
63#define GL_FUNC(ptr,name) ptr name; 70#define GL_FUNC(ptr,name) ptr name;
64#include "glfunc.h" 71#include "glfunc.h"
65#undef GL_FUNC 72#undef GL_FUNC
66} gl; 73} gl;
67 74
75static void
68static void gl_BlendFuncSeparate (GLenum sa, GLenum da, GLenum saa, GLenum daa) 76gl_BlendFuncSeparate (GLenum sa, GLenum da, GLenum saa, GLenum daa)
69{ 77{
70 if (gl.BlendFuncSeparate) 78 if (gl.BlendFuncSeparate)
71 gl.BlendFuncSeparate (sa, da, saa, daa); 79 gl.BlendFuncSeparate (sa, da, saa, daa);
72 else if (gl.BlendFuncSeparateEXT) 80 else if (gl.BlendFuncSeparateEXT)
73 gl.BlendFuncSeparateEXT (sa, da, saa, daa); 81 gl.BlendFuncSeparateEXT (sa, da, saa, daa);
74 else 82 else
75 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);
76} 108}
77 109
78#include "texcache.c" 110#include "texcache.c"
79 111
80#include "pango-font.c" 112#include "pango-font.c"
345} smooth_key; 377} smooth_key;
346 378
347static void 379static void
348smooth_or_bits (HV *hv, smooth_key *key, IV bits) 380smooth_or_bits (HV *hv, smooth_key *key, IV bits)
349{ 381{
350 SV **sv = hv_fetch (hv, (char *)key, sizeof (key), 1); 382 SV **sv = hv_fetch (hv, (char *)key, sizeof (*key), 1);
351 383
352 if (SvIOK (*sv)) 384 if (SvIOK (*sv))
353 SvIV_set (*sv, SvIVX (*sv) | bits); 385 SvIV_set (*sv, SvIVX (*sv) | bits);
354 else 386 else
355 sv_setiv (*sv, bits); 387 sv_setiv (*sv, bits);
614 RETVAL = !!SDL_SetVideoMode ( 646 RETVAL = !!SDL_SetVideoMode (
615 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0) 647 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0)
616 ); 648 );
617 if (RETVAL) 649 if (RETVAL)
618 { 650 {
651 av_clear (texture_av);
652
619 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 653 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
620# define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 654# define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
621# include "glfunc.h" 655# include "glfunc.h"
622# undef GL_FUNC 656# undef GL_FUNC
657
623 } 658 }
624 OUTPUT: 659 OUTPUT:
625 RETVAL 660 RETVAL
626 661
627void 662void
628SDL_GL_SwapBuffers () 663SDL_GL_SwapBuffers ()
629 664
630char * 665char *
631SDL_GetKeyName (int sym) 666SDL_GetKeyName (int sym)
632 667
668int
669SDL_GetAppState ()
670
633void 671void
634SDL_PollEvent () 672poll_events ()
635 PPCODE: 673 PPCODE:
636{ 674{
637 SDL_Event ev; 675 SDL_Event ev;
638 676
639 while (SDL_PollEvent (&ev)) 677 SDL_PumpEvents ();
678 while (SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_ALLEVENTS) > 0)
640 { 679 {
641 HV *hv = newHV (); 680 HV *hv = newHV ();
642 hv_store (hv, "type", 4, newSViv (ev.type), 0); 681 hv_store (hv, "type", 4, newSViv (ev.type), 0);
643 682
644 switch (ev.type) 683 switch (ev.type)
656 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0); 695 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
657 hv_store (hv, "state", 5, newSViv (ev.active.state), 0); 696 hv_store (hv, "state", 5, newSViv (ev.active.state), 0);
658 break; 697 break;
659 698
660 case SDL_MOUSEMOTION: 699 case SDL_MOUSEMOTION:
700 {
701 int state = ev.motion.state;
702 int x = ev.motion.x;
703 int y = ev.motion.y;
704 int xrel = ev.motion.xrel;
705 int yrel = ev.motion.yrel;
706
707 /* do simplistic event compression */
708 while (SDL_PeepEvents (&ev, 1, SDL_PEEKEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION)) > 0
709 && state == ev.motion.state)
710 {
711 xrel += ev.motion.xrel;
712 yrel += ev.motion.yrel;
713 x = ev.motion.x;
714 y = ev.motion.y;
715 SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION));
716 }
717
661 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 718 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0);
662
663 hv_store (hv, "state", 5, newSViv (ev.motion.state), 0); 719 hv_store (hv, "state", 5, newSViv (state), 0);
664 hv_store (hv, "x", 1, newSViv (ev.motion.x), 0); 720 hv_store (hv, "x", 1, newSViv (x), 0);
665 hv_store (hv, "y", 1, newSViv (ev.motion.y), 0); 721 hv_store (hv, "y", 1, newSViv (y), 0);
666 hv_store (hv, "xrel", 4, newSViv (ev.motion.xrel), 0); 722 hv_store (hv, "xrel", 4, newSViv (xrel), 0);
667 hv_store (hv, "yrel", 4, newSViv (ev.motion.yrel), 0); 723 hv_store (hv, "yrel", 4, newSViv (yrel), 0);
724 }
668 break; 725 break;
669 726
670 case SDL_MOUSEBUTTONDOWN: 727 case SDL_MOUSEBUTTONDOWN:
671 case SDL_MOUSEBUTTONUP: 728 case SDL_MOUSEBUTTONUP:
672 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 729 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0);
852 ExitThread (retval); // unclean, please beam me up 909 ExitThread (retval); // unclean, please beam me up
853#else 910#else
854 _exit (retval); 911 _exit (retval);
855#endif 912#endif
856 913
914void
915debug ()
916 CODE:
917{
918#if DEBUG
919 VALGRIND_DO_LEAK_CHECK;
920#endif
921}
922
857MODULE = CFPlus PACKAGE = CFPlus::Font 923MODULE = CFPlus PACKAGE = CFPlus::Font
858 924
859CFPlus::Font 925CFPlus::Font
860new_from_file (SV *class, char *path, int id = 0) 926new_from_file (SV *class, char *path, int id = 0)
861 CODE: 927 CODE:
1176 flags 1242 flags
1177 ); 1243 );
1178 1244
1179MODULE = CFPlus PACKAGE = CFPlus::Texture 1245MODULE = CFPlus PACKAGE = CFPlus::Texture
1180 1246
1247int minpot (int n)
1248
1181void 1249void
1182pad2pot (SV *data_, SV *w_, SV *h_) 1250pad2pot (SV *data_, SV *w_, SV *h_)
1183 CODE: 1251 CODE:
1184{ 1252{
1185 int ow = SvIV (w_); 1253 int ow = SvIV (w_);
1261 { 1329 {
1262 glDisable (GL_ALPHA_TEST); 1330 glDisable (GL_ALPHA_TEST);
1263 glDisable (GL_BLEND); 1331 glDisable (GL_BLEND);
1264 } 1332 }
1265} 1333}
1334
1335IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type)
1336 CODE:
1337{
1338 GLint width;
1339 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, 0);
1340 glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
1341 RETVAL = width > 0;
1342}
1343 OUTPUT:
1344 RETVAL
1266 1345
1267MODULE = CFPlus PACKAGE = CFPlus::Map 1346MODULE = CFPlus PACKAGE = CFPlus::Map
1268 1347
1269CFPlus::Map 1348CFPlus::Map
1270new (SV *class) 1349new (SV *class)
1391 CODE: 1470 CODE:
1392{ 1471{
1393 if (dx > 0) 1472 if (dx > 0)
1394 map_blank (self, self->x, self->y, dx, self->h); 1473 map_blank (self, self->x, self->y, dx, self->h);
1395 else if (dx < 0) 1474 else if (dx < 0)
1396 map_blank (self, self->x + self->w + dx + 1, self->y, -dx, self->h); 1475 map_blank (self, self->x + self->w + dx, self->y, -dx, self->h);
1397 1476
1398 if (dy > 0) 1477 if (dy > 0)
1399 map_blank (self, self->x, self->y, self->w, dy); 1478 map_blank (self, self->x, self->y, self->w, dy);
1400 else if (dy < 0) 1479 else if (dy < 0)
1401 map_blank (self, self->x, self->y + self->h + dy + 1, self->w, -dy); 1480 map_blank (self, self->x, self->y + self->h + dy, self->w, -dy);
1402 1481
1403 self->ox += dx; self->x += dx; 1482 self->ox += dx; self->x += dx;
1404 self->oy += dy; self->y += dy; 1483 self->oy += dy; self->y += dy;
1405 1484
1406 while (self->y < 0) 1485 while (self->y < 0)
1460 } 1539 }
1461 else if (cmd == 6) // monster width 1540 else if (cmd == 6) // monster width
1462 cell->stat_width = *data++ + 1; 1541 cell->stat_width = *data++ + 1;
1463 else if (cmd == 0x47) 1542 else if (cmd == 0x47)
1464 { 1543 {
1465 if (*data == 8) 1544 if (*data == 4)
1466 ; // decode player uuid 1545 ; // decode player count
1467 1546
1468 data += *data + 1; 1547 data += *data + 1;
1469 } 1548 }
1470 else if (cmd == 8) // cell flags 1549 else if (cmd == 8) // cell flags
1471 cell->flags = *data++; 1550 cell->flags = *data++;
1712 } 1791 }
1713 } 1792 }
1714 } 1793 }
1715 } 1794 }
1716 1795
1717 // go through all smoothlevels, lowest to highest, then draw 1796 // go through all smoothlevels, lowest to highest, then draw.
1718 // this is basically counting sort 1797 // this is basically counting sort
1719 { 1798 {
1720 int w, b; 1799 int w, b;
1721 1800
1722 for (w = 0; w < 256 / 32; ++w) 1801 for (w = 0; w < 256 / 32; ++w)
1735 smooth_key *skey = (smooth_key *)HeKEY (he); 1814 smooth_key *skey = (smooth_key *)HeKEY (he);
1736 IV bits = SvIVX (HeVAL (he)); 1815 IV bits = SvIVX (HeVAL (he));
1737 1816
1738 if (!(bits & 0x1000) 1817 if (!(bits & 0x1000)
1739 && skey->level == level 1818 && skey->level == level
1740 && level >= smooth_max [skey->x][skey->y]) 1819 && level > smooth_max [skey->x][skey->y])
1741 { 1820 {
1742 maptex tex = self->tex [skey->tile]; 1821 maptex tex = self->tex [skey->tile];
1743 int px = (((int)skey->x) - 1) * T; 1822 int px = (((int)skey->x) - 1) * T;
1744 int py = (((int)skey->y) - 1) * T; 1823 int py = (((int)skey->y) - 1) * T;
1745 int border = bits & 15; 1824 int border = bits & 15;
2096 CODE: 2175 CODE:
2097 RETVAL = Mix_VolumeMusic (volume); 2176 RETVAL = Mix_VolumeMusic (volume);
2098 OUTPUT: 2177 OUTPUT:
2099 RETVAL 2178 RETVAL
2100 2179
2180int
2181fade_out (int ms)
2182 CODE:
2183 RETVAL = Mix_FadeOutMusic (ms);
2184 OUTPUT:
2185 RETVAL
2186
2101CFPlus::MixMusic 2187CFPlus::MixMusic
2102new_from_file (SV *class, char *path) 2188new_from_file (SV *class, char *path)
2103 CODE: 2189 CODE:
2104 RETVAL = Mix_LoadMUS (path); 2190 RETVAL = Mix_LoadMUS (path);
2105 OUTPUT: 2191 OUTPUT:
2112 2198
2113int 2199int
2114play (CFPlus::MixMusic self, int loops = -1) 2200play (CFPlus::MixMusic self, int loops = -1)
2115 CODE: 2201 CODE:
2116 RETVAL = Mix_PlayMusic (self, loops); 2202 RETVAL = Mix_PlayMusic (self, loops);
2203 OUTPUT:
2204 RETVAL
2205
2206int
2207fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2208 CODE:
2209 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position);
2117 OUTPUT: 2210 OUTPUT:
2118 RETVAL 2211 RETVAL
2119 2212
2120MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2213MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2121 2214
2125 static const struct { 2218 static const struct {
2126 const char *name; 2219 const char *name;
2127 IV iv; 2220 IV iv;
2128 } *civ, const_iv[] = { 2221 } *civ, const_iv[] = {
2129# define const_iv(name) { # name, (IV)name } 2222# define const_iv(name) { # name, (IV)name }
2223 const_iv (GL_VENDOR),
2224 const_iv (GL_VERSION),
2225 const_iv (GL_EXTENSIONS),
2130 const_iv (GL_COLOR_MATERIAL), 2226 const_iv (GL_COLOR_MATERIAL),
2131 const_iv (GL_SMOOTH), 2227 const_iv (GL_SMOOTH),
2132 const_iv (GL_FLAT), 2228 const_iv (GL_FLAT),
2133 const_iv (GL_DITHER), 2229 const_iv (GL_DITHER),
2134 const_iv (GL_BLEND), 2230 const_iv (GL_BLEND),
2161 const_iv (GL_LUMINANCE), 2257 const_iv (GL_LUMINANCE),
2162 const_iv (GL_LUMINANCE_ALPHA), 2258 const_iv (GL_LUMINANCE_ALPHA),
2163 const_iv (GL_FLOAT), 2259 const_iv (GL_FLOAT),
2164 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2260 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2165 const_iv (GL_COMPILE), 2261 const_iv (GL_COMPILE),
2262 const_iv (GL_PROXY_TEXTURE_1D),
2263 const_iv (GL_PROXY_TEXTURE_2D),
2166 const_iv (GL_TEXTURE_1D), 2264 const_iv (GL_TEXTURE_1D),
2167 const_iv (GL_TEXTURE_2D), 2265 const_iv (GL_TEXTURE_2D),
2168 const_iv (GL_TEXTURE_ENV), 2266 const_iv (GL_TEXTURE_ENV),
2169 const_iv (GL_TEXTURE_MAG_FILTER), 2267 const_iv (GL_TEXTURE_MAG_FILTER),
2170 const_iv (GL_TEXTURE_MIN_FILTER), 2268 const_iv (GL_TEXTURE_MIN_FILTER),
2210# undef const_iv 2308# undef const_iv
2211 }; 2309 };
2212 2310
2213 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 2311 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
2214 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 2312 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
2313
2314 texture_av = newAV ();
2315 AvREAL_off (texture_av);
2215} 2316}
2216 2317
2217char * 2318char *
2218gl_vendor () 2319gl_vendor ()
2219 CODE: 2320 CODE:
2230 2331
2231char * 2332char *
2232gl_extensions () 2333gl_extensions ()
2233 CODE: 2334 CODE:
2234 RETVAL = (char *)glGetString (GL_EXTENSIONS); 2335 RETVAL = (char *)glGetString (GL_EXTENSIONS);
2336 OUTPUT:
2337 RETVAL
2338
2339char *glGetString (GLenum pname)
2340
2341GLint glGetInteger (GLenum pname)
2342 CODE:
2343 glGetIntegerv (pname, &RETVAL);
2344 OUTPUT:
2345 RETVAL
2346
2347GLdouble glGetDouble (GLenum pname)
2348 CODE:
2349 glGetDoublev (pname, &RETVAL);
2235 OUTPUT: 2350 OUTPUT:
2236 RETVAL 2351 RETVAL
2237 2352
2238int glGetError () 2353int glGetError ()
2239 2354
2364 2479
2365void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 2480void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
2366 2481
2367void glDrawPixels (int width, int height, int format, int type, char *pixels) 2482void glDrawPixels (int width, int height, int format, int type, char *pixels)
2368 2483
2484void glPixelZoom (float x, float y)
2485
2369void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR) 2486void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
2370 2487
2371int glGenTexture () 2488int glGenTexture ()
2372 CODE: 2489 CODE:
2373{ 2490 RETVAL = gen_texture ();
2374 GLuint name;
2375 glGenTextures (1, &name);
2376 RETVAL = name;
2377}
2378 OUTPUT: 2491 OUTPUT:
2379 RETVAL 2492 RETVAL
2380 2493
2381void glDeleteTexture (int name) 2494void glDeleteTexture (int name)
2382 CODE: 2495 CODE:
2383{
2384 GLuint name_ = name;
2385 glDeleteTextures (1, &name_); 2496 del_texture (name);
2386} 2497
2387
2388int glGenList () 2498int glGenList ()
2389 CODE: 2499 CODE:
2390 RETVAL = glGenLists (1); 2500 RETVAL = glGenLists (1);
2391 OUTPUT: 2501 OUTPUT:
2392 RETVAL 2502 RETVAL

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines