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.178 by root, Tue Apr 10 11:12:53 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);
701Mix_AllocateChannels (int numchans = -1) 758Mix_AllocateChannels (int numchans = -1)
702 759
703void 760void
704lowdelay (int fd, int val = 1) 761lowdelay (int fd, int val = 1)
705 CODE: 762 CODE:
706#ifndef _WIN32
707 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val)); 763 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val));
708#endif
709 764
710void 765void
711win32_proxy_info () 766win32_proxy_info ()
712 PPCODE: 767 PPCODE:
713{ 768{
854 ExitThread (retval); // unclean, please beam me up 909 ExitThread (retval); // unclean, please beam me up
855#else 910#else
856 _exit (retval); 911 _exit (retval);
857#endif 912#endif
858 913
914void
915debug ()
916 CODE:
917{
918#if DEBUG
919 VALGRIND_DO_LEAK_CHECK;
920#endif
921}
922
859MODULE = CFPlus PACKAGE = CFPlus::Font 923MODULE = CFPlus PACKAGE = CFPlus::Font
860 924
861CFPlus::Font 925CFPlus::Font
862new_from_file (SV *class, char *path, int id = 0) 926new_from_file (SV *class, char *path, int id = 0)
863 CODE: 927 CODE:
1178 flags 1242 flags
1179 ); 1243 );
1180 1244
1181MODULE = CFPlus PACKAGE = CFPlus::Texture 1245MODULE = CFPlus PACKAGE = CFPlus::Texture
1182 1246
1247int minpot (int n)
1248
1183void 1249void
1184pad2pot (SV *data_, SV *w_, SV *h_) 1250pad2pot (SV *data_, SV *w_, SV *h_)
1185 CODE: 1251 CODE:
1186{ 1252{
1187 int ow = SvIV (w_); 1253 int ow = SvIV (w_);
1263 { 1329 {
1264 glDisable (GL_ALPHA_TEST); 1330 glDisable (GL_ALPHA_TEST);
1265 glDisable (GL_BLEND); 1331 glDisable (GL_BLEND);
1266 } 1332 }
1267} 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
1268 1345
1269MODULE = CFPlus PACKAGE = CFPlus::Map 1346MODULE = CFPlus PACKAGE = CFPlus::Map
1270 1347
1271CFPlus::Map 1348CFPlus::Map
1272new (SV *class) 1349new (SV *class)
1393 CODE: 1470 CODE:
1394{ 1471{
1395 if (dx > 0) 1472 if (dx > 0)
1396 map_blank (self, self->x, self->y, dx, self->h); 1473 map_blank (self, self->x, self->y, dx, self->h);
1397 else if (dx < 0) 1474 else if (dx < 0)
1398 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);
1399 1476
1400 if (dy > 0) 1477 if (dy > 0)
1401 map_blank (self, self->x, self->y, self->w, dy); 1478 map_blank (self, self->x, self->y, self->w, dy);
1402 else if (dy < 0) 1479 else if (dy < 0)
1403 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);
1404 1481
1405 self->ox += dx; self->x += dx; 1482 self->ox += dx; self->x += dx;
1406 self->oy += dy; self->y += dy; 1483 self->oy += dy; self->y += dy;
1407 1484
1408 while (self->y < 0) 1485 while (self->y < 0)
1462 } 1539 }
1463 else if (cmd == 6) // monster width 1540 else if (cmd == 6) // monster width
1464 cell->stat_width = *data++ + 1; 1541 cell->stat_width = *data++ + 1;
1465 else if (cmd == 0x47) 1542 else if (cmd == 0x47)
1466 { 1543 {
1467 if (*data == 8) 1544 if (*data == 4)
1468 ; // decode player uuid 1545 ; // decode player count
1469 1546
1470 data += *data + 1; 1547 data += *data + 1;
1471 } 1548 }
1472 else if (cmd == 8) // cell flags 1549 else if (cmd == 8) // cell flags
1473 cell->flags = *data++; 1550 cell->flags = *data++;
1683 smooth_level [tex.smoothlevel >> 5] |= ((uint32_t)1) << (tex.smoothlevel & 31); 1760 smooth_level [tex.smoothlevel >> 5] |= ((uint32_t)1) << (tex.smoothlevel & 31);
1684 1761
1685 // 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
1686 // shifted +1|+1 so we always stay positive. 1763 // shifted +1|+1 so we always stay positive.
1687 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
1688 // full tile 1777 // full tile
1689 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);
1690 1779
1691 // borders 1780 // borders
1692 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);
1693 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);
1694 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);
1695 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);
1696 1785
1697 // corners 1786 // corners
1698 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);
1702 } 1791 }
1703 } 1792 }
1704 } 1793 }
1705 } 1794 }
1706 1795
1707 // go through all smoothlevels, lowest to highest, then draw 1796 // go through all smoothlevels, lowest to highest, then draw.
1708 // this is basically counting sort 1797 // this is basically counting sort
1709 { 1798 {
1710 int w, b; 1799 int w, b;
1711 1800
1712 for (w = 0; w < 256 / 32; ++w) 1801 for (w = 0; w < 256 / 32; ++w)
1723 while ((he = hv_iternext (smooth))) 1812 while ((he = hv_iternext (smooth)))
1724 { 1813 {
1725 smooth_key *skey = (smooth_key *)HeKEY (he); 1814 smooth_key *skey = (smooth_key *)HeKEY (he);
1726 IV bits = SvIVX (HeVAL (he)); 1815 IV bits = SvIVX (HeVAL (he));
1727 1816
1728 // bits is ___n cccc CCCC bbbb
1729 // n do not draw borders&corners
1730 // c draw these corners, but...
1731 // C ... not these
1732 // b draw these borders
1733
1734 if (!(bits & 0x1000) 1817 if (!(bits & 0x1000)
1735 && skey->level == level 1818 && skey->level == level
1736 && level >= smooth_max [skey->x][skey->y]) 1819 && level > smooth_max [skey->x][skey->y])
1737 { 1820 {
1738 maptex tex = self->tex [skey->tile]; 1821 maptex tex = self->tex [skey->tile];
1739 int px = (((int)skey->x) - 1) * T; 1822 int px = (((int)skey->x) - 1) * T;
1740 int py = (((int)skey->y) - 1) * T; 1823 int py = (((int)skey->y) - 1) * T;
1741 int border = bits & 15; 1824 int border = bits & 15;
2092 CODE: 2175 CODE:
2093 RETVAL = Mix_VolumeMusic (volume); 2176 RETVAL = Mix_VolumeMusic (volume);
2094 OUTPUT: 2177 OUTPUT:
2095 RETVAL 2178 RETVAL
2096 2179
2180int
2181fade_out (int ms)
2182 CODE:
2183 RETVAL = Mix_FadeOutMusic (ms);
2184 OUTPUT:
2185 RETVAL
2186
2097CFPlus::MixMusic 2187CFPlus::MixMusic
2098new_from_file (SV *class, char *path) 2188new_from_file (SV *class, char *path)
2099 CODE: 2189 CODE:
2100 RETVAL = Mix_LoadMUS (path); 2190 RETVAL = Mix_LoadMUS (path);
2101 OUTPUT: 2191 OUTPUT:
2108 2198
2109int 2199int
2110play (CFPlus::MixMusic self, int loops = -1) 2200play (CFPlus::MixMusic self, int loops = -1)
2111 CODE: 2201 CODE:
2112 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);
2113 OUTPUT: 2210 OUTPUT:
2114 RETVAL 2211 RETVAL
2115 2212
2116MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2213MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2117 2214
2121 static const struct { 2218 static const struct {
2122 const char *name; 2219 const char *name;
2123 IV iv; 2220 IV iv;
2124 } *civ, const_iv[] = { 2221 } *civ, const_iv[] = {
2125# 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),
2126 const_iv (GL_COLOR_MATERIAL), 2226 const_iv (GL_COLOR_MATERIAL),
2127 const_iv (GL_SMOOTH), 2227 const_iv (GL_SMOOTH),
2128 const_iv (GL_FLAT), 2228 const_iv (GL_FLAT),
2129 const_iv (GL_DITHER), 2229 const_iv (GL_DITHER),
2130 const_iv (GL_BLEND), 2230 const_iv (GL_BLEND),
2157 const_iv (GL_LUMINANCE), 2257 const_iv (GL_LUMINANCE),
2158 const_iv (GL_LUMINANCE_ALPHA), 2258 const_iv (GL_LUMINANCE_ALPHA),
2159 const_iv (GL_FLOAT), 2259 const_iv (GL_FLOAT),
2160 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2260 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2161 const_iv (GL_COMPILE), 2261 const_iv (GL_COMPILE),
2262 const_iv (GL_PROXY_TEXTURE_1D),
2263 const_iv (GL_PROXY_TEXTURE_2D),
2162 const_iv (GL_TEXTURE_1D), 2264 const_iv (GL_TEXTURE_1D),
2163 const_iv (GL_TEXTURE_2D), 2265 const_iv (GL_TEXTURE_2D),
2164 const_iv (GL_TEXTURE_ENV), 2266 const_iv (GL_TEXTURE_ENV),
2165 const_iv (GL_TEXTURE_MAG_FILTER), 2267 const_iv (GL_TEXTURE_MAG_FILTER),
2166 const_iv (GL_TEXTURE_MIN_FILTER), 2268 const_iv (GL_TEXTURE_MIN_FILTER),
2206# undef const_iv 2308# undef const_iv
2207 }; 2309 };
2208 2310
2209 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; )
2210 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);
2211} 2316}
2212 2317
2213char * 2318char *
2214gl_vendor () 2319gl_vendor ()
2215 CODE: 2320 CODE:
2226 2331
2227char * 2332char *
2228gl_extensions () 2333gl_extensions ()
2229 CODE: 2334 CODE:
2230 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);
2231 OUTPUT: 2350 OUTPUT:
2232 RETVAL 2351 RETVAL
2233 2352
2234int glGetError () 2353int glGetError ()
2235 2354
2360 2479
2361void 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)
2362 2481
2363void glDrawPixels (int width, int height, int format, int type, char *pixels) 2482void glDrawPixels (int width, int height, int format, int type, char *pixels)
2364 2483
2484void glPixelZoom (float x, float y)
2485
2365void 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)
2366 2487
2367int glGenTexture () 2488int glGenTexture ()
2368 CODE: 2489 CODE:
2369{ 2490 RETVAL = gen_texture ();
2370 GLuint name;
2371 glGenTextures (1, &name);
2372 RETVAL = name;
2373}
2374 OUTPUT: 2491 OUTPUT:
2375 RETVAL 2492 RETVAL
2376 2493
2377void glDeleteTexture (int name) 2494void glDeleteTexture (int name)
2378 CODE: 2495 CODE:
2379{
2380 GLuint name_ = name;
2381 glDeleteTextures (1, &name_); 2496 del_texture (name);
2382} 2497
2383
2384int glGenList () 2498int glGenList ()
2385 CODE: 2499 CODE:
2386 RETVAL = glGenLists (1); 2500 RETVAL = glGenLists (1);
2387 OUTPUT: 2501 OUTPUT:
2388 RETVAL 2502 RETVAL

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines