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.209 by root, Sat Jul 21 22:54:52 2007 UTC vs.
Revision 1.219 by root, Mon Aug 6 05:06:32 2007 UTC

25#include <math.h> 25#include <math.h>
26#include <string.h> 26#include <string.h>
27#include <stdio.h> 27#include <stdio.h>
28#include <stdlib.h> 28#include <stdlib.h>
29 29
30#define USE_RWOPS 1 // for SDL_mixer:LoadMUS_RW
31
30#include <SDL.h> 32#include <SDL.h>
31#include <SDL_thread.h> 33#include <SDL_thread.h>
32#include <SDL_endian.h> 34#include <SDL_endian.h>
33#include <SDL_image.h> 35#include <SDL_image.h>
34#include <SDL_mixer.h> 36#include <SDL_mixer.h>
112 114
113#include "pango-font.c" 115#include "pango-font.c"
114#include "pango-fontmap.c" 116#include "pango-fontmap.c"
115#include "pango-render.c" 117#include "pango-render.c"
116 118
119typedef IV CFPlus__Channel;
120typedef SDL_RWops *CFPlus__RW;
117typedef Mix_Chunk *CFPlus__MixChunk; 121typedef Mix_Chunk *CFPlus__MixChunk;
118typedef Mix_Music *CFPlus__MixMusic; 122typedef Mix_Music *CFPlus__MixMusic;
119 123
120typedef PangoFontDescription *CFPlus__Font; 124typedef PangoFontDescription *CFPlus__Font;
121 125
800 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("CFPlus::UI::Event", 1)))); 804 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("CFPlus::UI::Event", 1))));
801 } 805 }
802} 806}
803 807
804int 808int
805Mix_OpenAudio (int frequency = 48000, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 2048) 809Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 1024)
806 POSTCALL: 810 POSTCALL:
807 Mix_HookMusicFinished (music_finished); 811 Mix_HookMusicFinished (music_finished);
808 Mix_ChannelFinished (channel_finished); 812 Mix_ChannelFinished (channel_finished);
809 813
810void 814void
811Mix_CloseAudio () 815Mix_CloseAudio ()
812 816
813int 817int
814Mix_AllocateChannels (int numchans = -1) 818Mix_AllocateChannels (int numchans = -1)
819
820const char *
821Mix_GetError ()
815 822
816void 823void
817lowdelay (int fd, int val = 1) 824lowdelay (int fd, int val = 1)
818 CODE: 825 CODE:
819 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val)); 826 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val));
861 STRLEN image_len; 868 STRLEN image_len;
862 char *image = (char *)SvPVbyte (image_, image_len); 869 char *image = (char *)SvPVbyte (image_, image_len);
863 SDL_Surface *surface, *surface2; 870 SDL_Surface *surface, *surface2;
864 SDL_PixelFormat fmt; 871 SDL_PixelFormat fmt;
865 SDL_RWops *rw = ix 872 SDL_RWops *rw = ix
866 ? SDL_RWFromFile (image, "r") 873 ? SDL_RWFromFile (image, "rb")
867 : SDL_RWFromConstMem (image, image_len); 874 : SDL_RWFromConstMem (image, image_len);
868 875
869 if (!rw) 876 if (!rw)
870 croak ("load_image: %s", SDL_GetError ()); 877 croak ("load_image: %s", SDL_GetError ());
871 878
1343 HV *hv = (HV *)SvRV (self); 1350 HV *hv = (HV *)SvRV (self);
1344 float s = SvNV (*hv_fetch (hv, "s", 1, 1)); 1351 float s = SvNV (*hv_fetch (hv, "s", 1, 1));
1345 float t = SvNV (*hv_fetch (hv, "t", 1, 1)); 1352 float t = SvNV (*hv_fetch (hv, "t", 1, 1));
1346 int name = SvIV (*hv_fetch (hv, "name", 4, 1)); 1353 int name = SvIV (*hv_fetch (hv, "name", 4, 1));
1347 1354
1355 if (name <= 0)
1356 XSRETURN_EMPTY;
1357
1348 if (items < 5) 1358 if (items < 5)
1349 { 1359 {
1350 w = SvNV (*hv_fetch (hv, "w", 1, 1)); 1360 w = SvNV (*hv_fetch (hv, "w", 1, 1));
1351 h = SvNV (*hv_fetch (hv, "h", 1, 1)); 1361 h = SvNV (*hv_fetch (hv, "h", 1, 1));
1352 } 1362 }
1689 RETVAL = map_sv; 1699 RETVAL = map_sv;
1690} 1700}
1691 OUTPUT: 1701 OUTPUT:
1692 RETVAL 1702 RETVAL
1693 1703
1694void 1704SV *
1695draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T) 1705draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T)
1696 CODE: 1706 CODE:
1697{ 1707{
1698 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1708 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
1699 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 1709 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
1700 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k) 1710 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k)
1701 smooth_key skey; 1711 smooth_key skey;
1702 int x, y, z; 1712 int x, y, z;
1703 int last_name; 1713 int last_name;
1714 AV *missing = newAV ();
1715 RETVAL = newRV_noinc ((SV *)missing);
1704 1716
1705 // thats current max. sorry. 1717 // thats current max. sorry.
1706 if (sw > 255) sw = 255; 1718 if (sw > 255) sw = 255;
1707 if (sh > 255) sh = 255; 1719 if (sh > 255) sh = 255;
1708 1720
1716 glEnable (GL_TEXTURE_2D); 1728 glEnable (GL_TEXTURE_2D);
1717 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1729 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1718 1730
1719 glBegin (GL_QUADS); 1731 glBegin (GL_QUADS);
1720 1732
1721 last_name = 0; 1733 last_name = -1;
1722 1734
1723 mx += self->x; 1735 mx += self->x;
1724 my += self->y; 1736 my += self->y;
1725 1737
1726 // first pass: determine smooth_max 1738 // first pass: determine smooth_max
1761 tileid tile = cell->tile [z]; 1773 tileid tile = cell->tile [z];
1762 1774
1763 if (tile) 1775 if (tile)
1764 { 1776 {
1765 maptex tex = self->tex [tile]; 1777 maptex tex = self->tex [tile];
1766 int px = (x + 1) * T - tex.w; 1778 int px, py;
1767 int py = (y + 1) * T - tex.h;
1768 1779
1769 // suppressing texture state switches here 1780 // suppressing texture state switches here
1770 // is only moderately effective, but worth the extra effort 1781 // is only moderately effective, but worth the extra effort
1771 if (last_name != tex.name) 1782 if (last_name != tex.name)
1772 { 1783 {
1773 if (!tex.name) 1784 if (!tex.name)
1785 {
1786 av_push (missing, newSViv (tile));
1774 tex = self->tex [2]; /* missing, replace by noface */ 1787 tex = self->tex [2]; /* missing, replace by noface */
1788 }
1775 1789
1776 glEnd (); 1790 glEnd ();
1777 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1791 glBindTexture (GL_TEXTURE_2D, last_name = tex.name);
1778 glBegin (GL_QUADS); 1792 glBegin (GL_QUADS);
1779 } 1793 }
1794
1795 px = (x + 1) * T - tex.w;
1796 py = (y + 1) * T - tex.h;
1780 1797
1781 glTexCoord2f (0 , 0 ); glVertex2f (px , py ); 1798 glTexCoord2f (0 , 0 ); glVertex2f (px , py );
1782 glTexCoord2f (0 , tex.t); glVertex2f (px , py + tex.h); 1799 glTexCoord2f (0 , tex.t); glVertex2f (px , py + tex.h);
1783 glTexCoord2f (tex.s, tex.t); glVertex2f (px + tex.w, py + tex.h); 1800 glTexCoord2f (tex.s, tex.t); glVertex2f (px + tex.w, py + tex.h);
1784 glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py ); 1801 glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py );
1880 // this time naively avoiding texture state changes 1897 // this time naively avoiding texture state changes
1881 // save gobs of state changes. 1898 // save gobs of state changes.
1882 if (last_name != tex.name) 1899 if (last_name != tex.name)
1883 { 1900 {
1884 if (!tex.name) 1901 if (!tex.name)
1902 {
1903 av_push (missing, newSViv (skey->tile));
1885 continue; // smoothing not yet available 1904 continue; // smoothing not yet available
1905 }
1886 1906
1887 glEnd (); 1907 glEnd ();
1888 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1908 glBindTexture (GL_TEXTURE_2D, last_name = tex.name);
1889 glBegin (GL_QUADS); 1909 glBegin (GL_QUADS);
1890 } 1910 }
1951 px + width - 2 - cell->stat_hp * (width - 4) / 255, py - 1); 1971 px + width - 2 - cell->stat_hp * (width - 4) / 255, py - 1);
1952 } 1972 }
1953 } 1973 }
1954 } 1974 }
1955} 1975}
1976 OUTPUT:
1977 RETVAL
1956 1978
1957void 1979void
1958draw_magicmap (CFPlus::Map self, int dx, int dy, int w, int h, unsigned char *data) 1980draw_magicmap (CFPlus::Map self, int dx, int dy, int w, int h, unsigned char *data)
1959 CODE: 1981 CODE:
1960{ 1982{
2232 } 2254 }
2233 } 2255 }
2234 } 2256 }
2235} 2257}
2236 2258
2259MODULE = CFPlus PACKAGE = CFPlus::RW
2260
2261CFPlus::RW
2262new (SV *class, SV *data_sv)
2263 CODE:
2264{
2265 STRLEN datalen;
2266 char *data = SvPVbyte (data_sv, datalen);
2267
2268 RETVAL = SDL_RWFromConstMem (data, datalen);
2269}
2270 OUTPUT:
2271 RETVAL
2272
2273CFPlus::RW
2274new_from_file (SV *class, const char *path, const char *mode = "rb")
2275 CODE:
2276 RETVAL = SDL_RWFromFile (path, mode);
2277 OUTPUT:
2278 RETVAL
2279
2280# fails on win32:
2281# CFPlus.xs(2268) : error C2059: syntax error : '('
2282#void
2283#close (CFPlus::RW self)
2284# CODE:
2285# (self->(close)) (self);
2286
2287MODULE = CFPlus PACKAGE = CFPlus::Channel
2288
2289PROTOTYPES: DISABLE
2290
2291CFPlus::Channel
2292find ()
2293 CODE:
2294{
2295 RETVAL = Mix_GroupAvailable (-1);
2296
2297 if (RETVAL < 0)
2298 {
2299 RETVAL = Mix_GroupOldest (-1);
2300
2301 if (RETVAL < 0)
2302 XSRETURN_UNDEF;
2303
2304 Mix_HaltChannel (RETVAL);
2305 }
2306
2307 Mix_UnregisterAllEffects (RETVAL);
2308 Mix_Volume (RETVAL, 128);
2309}
2310 OUTPUT:
2311 RETVAL
2312
2313void
2314halt (CFPlus::Channel self)
2315 CODE:
2316 Mix_HaltChannel (self);
2317
2318void
2319expire (CFPlus::Channel self, int ticks = -1)
2320 CODE:
2321 Mix_ExpireChannel (self, ticks);
2322
2323void
2324fade_out (CFPlus::Channel self, int ticks = -1)
2325 CODE:
2326 Mix_FadeOutChannel (self, ticks);
2327
2328int
2329volume (CFPlus::Channel self, int volume)
2330 CODE:
2331 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128));
2332 OUTPUT:
2333 RETVAL
2334
2335void
2336unregister_all_effects (CFPlus::Channel self)
2337 CODE:
2338 Mix_UnregisterAllEffects (self);
2339
2340void
2341set_panning (CFPlus::Channel self, int left, int right)
2342 CODE:
2343 left = CLAMP (left , 0, 255);
2344 right = CLAMP (right, 0, 255);
2345 Mix_SetPanning (self, left, right);
2346
2347void
2348set_distance (CFPlus::Channel self, int distance)
2349 CODE:
2350 Mix_SetDistance (self, CLAMP (distance, 0, 255));
2351
2352void
2353set_position (CFPlus::Channel self, int angle, int distance)
2354 CODE:
2355 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2356
2357void
2358set_reverse_stereo (CFPlus::Channel self, int flip)
2359 CODE:
2360 Mix_SetReverseStereo (self, flip);
2361
2237MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2362MODULE = CFPlus PACKAGE = CFPlus::MixChunk
2238 2363
2239PROTOTYPES: DISABLE 2364PROTOTYPES: DISABLE
2240 2365
2241CFPlus::MixChunk 2366CFPlus::MixChunk
2242new_from_file (SV *class, char *path) 2367new (SV *class, CFPlus::RW rwops)
2243 CODE: 2368 CODE:
2244 RETVAL = Mix_LoadWAV (path); 2369 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2245 OUTPUT: 2370 OUTPUT:
2246 RETVAL 2371 RETVAL
2247 2372
2248void 2373void
2249DESTROY (CFPlus::MixChunk self) 2374DESTROY (CFPlus::MixChunk self)
2251 Mix_FreeChunk (self); 2376 Mix_FreeChunk (self);
2252 2377
2253int 2378int
2254volume (CFPlus::MixChunk self, int volume = -1) 2379volume (CFPlus::MixChunk self, int volume = -1)
2255 CODE: 2380 CODE:
2381 if (items > 1)
2382 volume = CLAMP (volume, 0, 128);
2256 RETVAL = Mix_VolumeChunk (self, volume); 2383 RETVAL = Mix_VolumeChunk (self, volume);
2257 OUTPUT: 2384 OUTPUT:
2258 RETVAL 2385 RETVAL
2259 2386
2260int 2387CFPlus::Channel
2261play (CFPlus::MixChunk self, int channel = -1, int loops = 0, int ticks = -1) 2388play (CFPlus::MixChunk self, CFPlus::Channel channel = -1, int loops = 0, int ticks = -1)
2262 CODE: 2389 CODE:
2390{
2263 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks); 2391 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
2392
2393 if (RETVAL < 0)
2394 XSRETURN_UNDEF;
2395
2396 if (channel < 0)
2397 {
2398 Mix_UnregisterAllEffects (RETVAL);
2399 Mix_Volume (RETVAL, 128);
2400 }
2401}
2264 OUTPUT: 2402 OUTPUT:
2265 RETVAL 2403 RETVAL
2266 2404
2267MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2405MODULE = CFPlus PACKAGE = CFPlus::MixMusic
2268 2406
2269int 2407int
2270volume (int volume = -1) 2408volume (int volume = -1)
2271 PROTOTYPE: ;$ 2409 PROTOTYPE: ;$
2272 CODE: 2410 CODE:
2411 if (items > 0)
2412 volume = CLAMP (volume, 0, 128);
2273 RETVAL = Mix_VolumeMusic (volume); 2413 RETVAL = Mix_VolumeMusic (volume);
2274 OUTPUT: 2414 OUTPUT:
2275 RETVAL 2415 RETVAL
2276 2416
2277int 2417void
2278fade_out (int ms) 2418fade_out (int ms)
2279 CODE: 2419 CODE:
2280 RETVAL = Mix_FadeOutMusic (ms); 2420 Mix_FadeOutMusic (ms);
2281 OUTPUT: 2421
2282 RETVAL 2422void
2423halt ()
2424 CODE:
2425 Mix_HaltMusic ();
2283 2426
2284CFPlus::MixMusic 2427CFPlus::MixMusic
2285new_from_file (SV *class, char *path) 2428new (SV *class, CFPlus::RW rwops)
2286 CODE: 2429 CODE:
2287 RETVAL = Mix_LoadMUS (path); 2430 RETVAL = Mix_LoadMUS_RW (rwops);
2288 OUTPUT: 2431 OUTPUT:
2289 RETVAL 2432 RETVAL
2290 2433
2291void 2434void
2292DESTROY (CFPlus::MixMusic self) 2435DESTROY (CFPlus::MixMusic self)
2298 CODE: 2441 CODE:
2299 RETVAL = Mix_PlayMusic (self, loops); 2442 RETVAL = Mix_PlayMusic (self, loops);
2300 OUTPUT: 2443 OUTPUT:
2301 RETVAL 2444 RETVAL
2302 2445
2303int 2446void
2304fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position) 2447fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2305 CODE: 2448 CODE:
2306 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position); 2449 Mix_FadeInMusicPos (self, loops, ms, position);
2307 OUTPUT:
2308 RETVAL
2309 2450
2310MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2451MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2311 2452
2312PROTOTYPES: ENABLE 2453PROTOTYPES: ENABLE
2313 2454
2547 2688
2548void glTexCoord (float s, float t) 2689void glTexCoord (float s, float t)
2549 CODE: 2690 CODE:
2550 glTexCoord2f (s, t); 2691 glTexCoord2f (s, t);
2551 2692
2693void glRect (float x1, float y1, float x2, float y2)
2694 CODE:
2695 glRectf (x1, y1, x2, y2);
2696
2552PROTOTYPES: ENABLE 2697PROTOTYPES: ENABLE
2553 2698
2554void glBegin (int mode) 2699void glBegin (int mode)
2555 2700
2556void glEnd () 2701void glEnd ()

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines