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.179 by root, Wed Apr 11 04:32:51 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++;
1681 smooth_level [tex.smoothlevel >> 5] |= ((uint32_t)1) << (tex.smoothlevel & 31); 1760 smooth_level [tex.smoothlevel >> 5] |= ((uint32_t)1) << (tex.smoothlevel & 31);
1682 1761
1683 // add bits to current tile and all neighbours. skey.x|y is 1762 // add bits to current tile and all neighbours. skey.x|y is
1684 // shifted +1|+1 so we always stay positive. 1763 // shifted +1|+1 so we always stay positive.
1685 1764
1765 // bits is ___n cccc CCCC bbbb
1766 // n do not draw borders&corners
1767 // c draw these corners, but...
1768 // C ... not these
1769 // b draw these borders
1770
1771 // borders: 1 ┃· 2 ━━ 4 ·┃ 8 ··
1772 // ┃· ·· ·┃ ━━
1773
1774 // corners: 1 ┛· 2 ·┗ 4 ·· 8 ··
1775 // ·· ·· ·┏ ┓·
1776
1686 // full tile 1777 // full tile
1687 skey.x = x + 1; skey.y = y + 1; smooth_or_bits (smooth, &skey, 0x1000); 1778 skey.x = x + 1; skey.y = y + 1; smooth_or_bits (smooth, &skey, 0x1000);
1688 1779
1689 // borders 1780 // borders
1690 skey.x = x + 2; skey.y = y + 1; smooth_or_bits (smooth, &skey, 0x0031); 1781 skey.x = x + 2; skey.y = y + 1; smooth_or_bits (smooth, &skey, 0x0091);
1691 skey.x = x + 1; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0092); 1782 skey.x = x + 1; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0032);
1692 skey.x = x ; skey.y = y + 1; smooth_or_bits (smooth, &skey, 0x0064); 1783 skey.x = x ; skey.y = y + 1; smooth_or_bits (smooth, &skey, 0x0064);
1693 skey.x = x + 1; skey.y = y ; smooth_or_bits (smooth, &skey, 0x00c8); 1784 skey.x = x + 1; skey.y = y ; smooth_or_bits (smooth, &skey, 0x00c8);
1694 1785
1695 // corners 1786 // corners
1696 skey.x = x + 2; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0100); 1787 skey.x = x + 2; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0100);
1700 } 1791 }
1701 } 1792 }
1702 } 1793 }
1703 } 1794 }
1704 1795
1705 // go through all smoothlevels, lowest to highest, then draw 1796 // go through all smoothlevels, lowest to highest, then draw.
1706 // this is basically counting sort 1797 // this is basically counting sort
1707 { 1798 {
1708 int w, b; 1799 int w, b;
1709 1800
1710 for (w = 0; w < 256 / 32; ++w) 1801 for (w = 0; w < 256 / 32; ++w)
1721 while ((he = hv_iternext (smooth))) 1812 while ((he = hv_iternext (smooth)))
1722 { 1813 {
1723 smooth_key *skey = (smooth_key *)HeKEY (he); 1814 smooth_key *skey = (smooth_key *)HeKEY (he);
1724 IV bits = SvIVX (HeVAL (he)); 1815 IV bits = SvIVX (HeVAL (he));
1725 1816
1726 // bits is ___n cccc CCCC bbbb
1727 // n do not draw borders&corners
1728 // c draw these corners, but...
1729 // C ... not these
1730 // b draw these borders
1731
1732 if (!(bits & 0x1000) 1817 if (!(bits & 0x1000)
1733 && skey->level == level 1818 && skey->level == level
1734 && level >= smooth_max [skey->x][skey->y]) 1819 && level > smooth_max [skey->x][skey->y])
1735 { 1820 {
1736 maptex tex = self->tex [skey->tile]; 1821 maptex tex = self->tex [skey->tile];
1737 int px = (((int)skey->x) - 1) * T; 1822 int px = (((int)skey->x) - 1) * T;
1738 int py = (((int)skey->y) - 1) * T; 1823 int py = (((int)skey->y) - 1) * T;
1739 int border = bits & 15; 1824 int border = bits & 15;
2090 CODE: 2175 CODE:
2091 RETVAL = Mix_VolumeMusic (volume); 2176 RETVAL = Mix_VolumeMusic (volume);
2092 OUTPUT: 2177 OUTPUT:
2093 RETVAL 2178 RETVAL
2094 2179
2180int
2181fade_out (int ms)
2182 CODE:
2183 RETVAL = Mix_FadeOutMusic (ms);
2184 OUTPUT:
2185 RETVAL
2186
2095CFPlus::MixMusic 2187CFPlus::MixMusic
2096new_from_file (SV *class, char *path) 2188new_from_file (SV *class, char *path)
2097 CODE: 2189 CODE:
2098 RETVAL = Mix_LoadMUS (path); 2190 RETVAL = Mix_LoadMUS (path);
2099 OUTPUT: 2191 OUTPUT:
2106 2198
2107int 2199int
2108play (CFPlus::MixMusic self, int loops = -1) 2200play (CFPlus::MixMusic self, int loops = -1)
2109 CODE: 2201 CODE:
2110 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);
2111 OUTPUT: 2210 OUTPUT:
2112 RETVAL 2211 RETVAL
2113 2212
2114MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2213MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2115 2214
2119 static const struct { 2218 static const struct {
2120 const char *name; 2219 const char *name;
2121 IV iv; 2220 IV iv;
2122 } *civ, const_iv[] = { 2221 } *civ, const_iv[] = {
2123# 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),
2124 const_iv (GL_COLOR_MATERIAL), 2226 const_iv (GL_COLOR_MATERIAL),
2125 const_iv (GL_SMOOTH), 2227 const_iv (GL_SMOOTH),
2126 const_iv (GL_FLAT), 2228 const_iv (GL_FLAT),
2127 const_iv (GL_DITHER), 2229 const_iv (GL_DITHER),
2128 const_iv (GL_BLEND), 2230 const_iv (GL_BLEND),
2155 const_iv (GL_LUMINANCE), 2257 const_iv (GL_LUMINANCE),
2156 const_iv (GL_LUMINANCE_ALPHA), 2258 const_iv (GL_LUMINANCE_ALPHA),
2157 const_iv (GL_FLOAT), 2259 const_iv (GL_FLOAT),
2158 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2260 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2159 const_iv (GL_COMPILE), 2261 const_iv (GL_COMPILE),
2262 const_iv (GL_PROXY_TEXTURE_1D),
2263 const_iv (GL_PROXY_TEXTURE_2D),
2160 const_iv (GL_TEXTURE_1D), 2264 const_iv (GL_TEXTURE_1D),
2161 const_iv (GL_TEXTURE_2D), 2265 const_iv (GL_TEXTURE_2D),
2162 const_iv (GL_TEXTURE_ENV), 2266 const_iv (GL_TEXTURE_ENV),
2163 const_iv (GL_TEXTURE_MAG_FILTER), 2267 const_iv (GL_TEXTURE_MAG_FILTER),
2164 const_iv (GL_TEXTURE_MIN_FILTER), 2268 const_iv (GL_TEXTURE_MIN_FILTER),
2204# undef const_iv 2308# undef const_iv
2205 }; 2309 };
2206 2310
2207 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; )
2208 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);
2209} 2316}
2210 2317
2211char * 2318char *
2212gl_vendor () 2319gl_vendor ()
2213 CODE: 2320 CODE:
2224 2331
2225char * 2332char *
2226gl_extensions () 2333gl_extensions ()
2227 CODE: 2334 CODE:
2228 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);
2229 OUTPUT: 2350 OUTPUT:
2230 RETVAL 2351 RETVAL
2231 2352
2232int glGetError () 2353int glGetError ()
2233 2354
2358 2479
2359void 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)
2360 2481
2361void glDrawPixels (int width, int height, int format, int type, char *pixels) 2482void glDrawPixels (int width, int height, int format, int type, char *pixels)
2362 2483
2484void glPixelZoom (float x, float y)
2485
2363void 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)
2364 2487
2365int glGenTexture () 2488int glGenTexture ()
2366 CODE: 2489 CODE:
2367{ 2490 RETVAL = gen_texture ();
2368 GLuint name;
2369 glGenTextures (1, &name);
2370 RETVAL = name;
2371}
2372 OUTPUT: 2491 OUTPUT:
2373 RETVAL 2492 RETVAL
2374 2493
2375void glDeleteTexture (int name) 2494void glDeleteTexture (int name)
2376 CODE: 2495 CODE:
2377{
2378 GLuint name_ = name;
2379 glDeleteTextures (1, &name_); 2496 del_texture (name);
2380} 2497
2381
2382int glGenList () 2498int glGenList ()
2383 CODE: 2499 CODE:
2384 RETVAL = glGenLists (1); 2500 RETVAL = glGenLists (1);
2385 OUTPUT: 2501 OUTPUT:
2386 RETVAL 2502 RETVAL

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines