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.208 by root, Sat Jul 21 16:07:53 2007 UTC vs.
Revision 1.217 by root, Wed Aug 1 12:43:31 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
434/* SDL should provide this, really. */ 438/* SDL should provide this, really. */
435#define SDLK_MODIFIER_MIN 300 439#define SDLK_MODIFIER_MIN 300
436#define SDLK_MODIFIER_MAX 314 440#define SDLK_MODIFIER_MAX 314
437 441
438/******************************************************************************/ 442/******************************************************************************/
443
444static GV *draw_x_gv, *draw_y_gv, *draw_w_gv, *draw_h_gv;
445static GV *hover_gv;
439 446
440static int 447static int
441within_widget (SV *widget, NV x, NV y) 448within_widget (SV *widget, NV x, NV y)
442{ 449{
443 HV *self; 450 HV *self;
797 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))));
798 } 805 }
799} 806}
800 807
801int 808int
802Mix_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)
803 POSTCALL: 810 POSTCALL:
804 Mix_HookMusicFinished (music_finished); 811 Mix_HookMusicFinished (music_finished);
805 Mix_ChannelFinished (channel_finished); 812 Mix_ChannelFinished (channel_finished);
806 813
807void 814void
808Mix_CloseAudio () 815Mix_CloseAudio ()
809 816
810int 817int
811Mix_AllocateChannels (int numchans = -1) 818Mix_AllocateChannels (int numchans = -1)
819
820const char *
821Mix_GetError ()
812 822
813void 823void
814lowdelay (int fd, int val = 1) 824lowdelay (int fd, int val = 1)
815 CODE: 825 CODE:
816 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val)); 826 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val));
858 STRLEN image_len; 868 STRLEN image_len;
859 char *image = (char *)SvPVbyte (image_, image_len); 869 char *image = (char *)SvPVbyte (image_, image_len);
860 SDL_Surface *surface, *surface2; 870 SDL_Surface *surface, *surface2;
861 SDL_PixelFormat fmt; 871 SDL_PixelFormat fmt;
862 SDL_RWops *rw = ix 872 SDL_RWops *rw = ix
863 ? SDL_RWFromFile (image, "r") 873 ? SDL_RWFromFile (image, "rb")
864 : SDL_RWFromConstMem (image, image_len); 874 : SDL_RWFromConstMem (image, image_len);
865 875
866 if (!rw) 876 if (!rw)
867 croak ("load_image: %s", SDL_GetError ()); 877 croak ("load_image: %s", SDL_GetError ());
868 878
2229 } 2239 }
2230 } 2240 }
2231 } 2241 }
2232} 2242}
2233 2243
2244MODULE = CFPlus PACKAGE = CFPlus::RW
2245
2246CFPlus::RW
2247new (SV *class, SV *data_sv)
2248 CODE:
2249{
2250 STRLEN datalen;
2251 char *data = SvPVbyte (data_sv, datalen);
2252
2253 RETVAL = SDL_RWFromConstMem (data, datalen);
2254}
2255 OUTPUT:
2256 RETVAL
2257
2258CFPlus::RW
2259new_from_file (SV *class, const char *path, const char *mode = "rb")
2260 CODE:
2261 RETVAL = SDL_RWFromFile (path, mode);
2262 OUTPUT:
2263 RETVAL
2264
2265void
2266close (CFPlus::RW self)
2267 CODE:
2268 SDL_RWclose (self);
2269
2270MODULE = CFPlus PACKAGE = CFPlus::Channel
2271
2272PROTOTYPES: DISABLE
2273
2274CFPlus::Channel
2275find ()
2276 CODE:
2277{
2278 RETVAL = Mix_GroupAvailable (-1);
2279
2280 if (RETVAL < 0)
2281 {
2282 RETVAL = Mix_GroupOldest (-1);
2283
2284 if (RETVAL < 0)
2285 XSRETURN_UNDEF;
2286
2287 Mix_HaltChannel (RETVAL);
2288 }
2289
2290 Mix_UnregisterAllEffects (RETVAL);
2291 Mix_Volume (RETVAL, 128);
2292}
2293 OUTPUT:
2294 RETVAL
2295
2296void
2297halt (CFPlus::Channel self)
2298 CODE:
2299 Mix_HaltChannel (self);
2300
2301void
2302expire (CFPlus::Channel self, int ticks = -1)
2303 CODE:
2304 Mix_ExpireChannel (self, ticks);
2305
2306void
2307fade_out (CFPlus::Channel self, int ticks = -1)
2308 CODE:
2309 Mix_FadeOutChannel (self, ticks);
2310
2311int
2312volume (CFPlus::Channel self, int volume)
2313 CODE:
2314 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128));
2315 OUTPUT:
2316 RETVAL
2317
2318void
2319unregister_all_effects (CFPlus::Channel self)
2320 CODE:
2321 Mix_UnregisterAllEffects (self);
2322
2323void
2324set_panning (CFPlus::Channel self, int left, int right)
2325 CODE:
2326 left = CLAMP (left , 0, 255);
2327 right = CLAMP (right, 0, 255);
2328 Mix_SetPanning (self, left, right);
2329
2330void
2331set_distance (CFPlus::Channel self, int distance)
2332 CODE:
2333 Mix_SetDistance (self, CLAMP (distance, 0, 255));
2334
2335void
2336set_position (CFPlus::Channel self, int angle, int distance)
2337 CODE:
2338 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2339
2340void
2341set_reverse_stereo (CFPlus::Channel self, int flip)
2342 CODE:
2343 Mix_SetReverseStereo (self, flip);
2344
2234MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2345MODULE = CFPlus PACKAGE = CFPlus::MixChunk
2235 2346
2236PROTOTYPES: DISABLE 2347PROTOTYPES: DISABLE
2237 2348
2238CFPlus::MixChunk 2349CFPlus::MixChunk
2239new_from_file (SV *class, char *path) 2350new (SV *class, CFPlus::RW rwops)
2240 CODE: 2351 CODE:
2241 RETVAL = Mix_LoadWAV (path); 2352 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2242 OUTPUT: 2353 OUTPUT:
2243 RETVAL 2354 RETVAL
2244 2355
2245void 2356void
2246DESTROY (CFPlus::MixChunk self) 2357DESTROY (CFPlus::MixChunk self)
2248 Mix_FreeChunk (self); 2359 Mix_FreeChunk (self);
2249 2360
2250int 2361int
2251volume (CFPlus::MixChunk self, int volume = -1) 2362volume (CFPlus::MixChunk self, int volume = -1)
2252 CODE: 2363 CODE:
2364 if (items > 1)
2365 volume = CLAMP (volume, 0, 128);
2253 RETVAL = Mix_VolumeChunk (self, volume); 2366 RETVAL = Mix_VolumeChunk (self, volume);
2254 OUTPUT: 2367 OUTPUT:
2255 RETVAL 2368 RETVAL
2256 2369
2257int 2370CFPlus::Channel
2258play (CFPlus::MixChunk self, int channel = -1, int loops = 0, int ticks = -1) 2371play (CFPlus::MixChunk self, CFPlus::Channel channel = -1, int loops = 0, int ticks = -1)
2259 CODE: 2372 CODE:
2373{
2260 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks); 2374 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
2375
2376 if (RETVAL < 0)
2377 XSRETURN_UNDEF;
2378
2379 if (channel < 0)
2380 {
2381 Mix_UnregisterAllEffects (RETVAL);
2382 Mix_Volume (RETVAL, 128);
2383 }
2384}
2261 OUTPUT: 2385 OUTPUT:
2262 RETVAL 2386 RETVAL
2263 2387
2264MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2388MODULE = CFPlus PACKAGE = CFPlus::MixMusic
2265 2389
2266int 2390int
2267volume (int volume = -1) 2391volume (int volume = -1)
2268 PROTOTYPE: ;$ 2392 PROTOTYPE: ;$
2269 CODE: 2393 CODE:
2394 if (items > 0)
2395 volume = CLAMP (volume, 0, 128);
2270 RETVAL = Mix_VolumeMusic (volume); 2396 RETVAL = Mix_VolumeMusic (volume);
2271 OUTPUT: 2397 OUTPUT:
2272 RETVAL 2398 RETVAL
2273 2399
2274int 2400void
2275fade_out (int ms) 2401fade_out (int ms)
2276 CODE: 2402 CODE:
2277 RETVAL = Mix_FadeOutMusic (ms); 2403 Mix_FadeOutMusic (ms);
2278 OUTPUT: 2404
2279 RETVAL 2405void
2406halt ()
2407 CODE:
2408 Mix_HaltMusic ();
2280 2409
2281CFPlus::MixMusic 2410CFPlus::MixMusic
2282new_from_file (SV *class, char *path) 2411new (SV *class, CFPlus::RW rwops)
2283 CODE: 2412 CODE:
2284 RETVAL = Mix_LoadMUS (path); 2413 RETVAL = Mix_LoadMUS_RW (rwops);
2285 OUTPUT: 2414 OUTPUT:
2286 RETVAL 2415 RETVAL
2287 2416
2288void 2417void
2289DESTROY (CFPlus::MixMusic self) 2418DESTROY (CFPlus::MixMusic self)
2295 CODE: 2424 CODE:
2296 RETVAL = Mix_PlayMusic (self, loops); 2425 RETVAL = Mix_PlayMusic (self, loops);
2297 OUTPUT: 2426 OUTPUT:
2298 RETVAL 2427 RETVAL
2299 2428
2300int 2429void
2301fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position) 2430fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2302 CODE: 2431 CODE:
2303 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position); 2432 Mix_FadeInMusicPos (self, loops, ms, position);
2304 OUTPUT:
2305 RETVAL
2306 2433
2307MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2434MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2308 2435
2309PROTOTYPES: ENABLE 2436PROTOTYPES: ENABLE
2310 2437
2544 2671
2545void glTexCoord (float s, float t) 2672void glTexCoord (float s, float t)
2546 CODE: 2673 CODE:
2547 glTexCoord2f (s, t); 2674 glTexCoord2f (s, t);
2548 2675
2676void glRect (float x1, float y1, float x2, float y2)
2677 CODE:
2678 glRectf (x1, y1, x2, y2);
2679
2549PROTOTYPES: ENABLE 2680PROTOTYPES: ENABLE
2550 2681
2551void glBegin (int mode) 2682void glBegin (int mode)
2552 2683
2553void glEnd () 2684void glEnd ()
2626MODULE = CFPlus PACKAGE = CFPlus::UI::Base 2757MODULE = CFPlus PACKAGE = CFPlus::UI::Base
2627 2758
2628PROTOTYPES: DISABLE 2759PROTOTYPES: DISABLE
2629 2760
2630void 2761void
2631find_widget (SV *widget, NV x, NV y) 2762find_widget (SV *self, NV x, NV y)
2632 PPCODE: 2763 PPCODE:
2633{ 2764{
2634 if (within_widget (widget, x, y)) 2765 if (within_widget (self, x, y))
2635 XPUSHs (widget); 2766 XPUSHs (self);
2636} 2767}
2637 2768
2769BOOT:
2770{
2771 hover_gv = gv_fetchpv ("CFPlus::UI::HOVER", 1, SVt_NV);
2772
2773 draw_x_gv = gv_fetchpv ("CFPlus::UI::Base::draw_x", 1, SVt_NV);
2774 draw_y_gv = gv_fetchpv ("CFPlus::UI::Base::draw_y", 1, SVt_NV);
2775 draw_w_gv = gv_fetchpv ("CFPlus::UI::Base::draw_w", 1, SVt_NV);
2776 draw_h_gv = gv_fetchpv ("CFPlus::UI::Base::draw_h", 1, SVt_NV);
2777}
2778
2779void
2780draw (SV *self)
2781 CODE:
2782{
2783 HV *hv;
2784 SV **svp;
2785 NV x, y, w, h;
2786 SV *draw_x_sv = GvSV (draw_x_gv);
2787 SV *draw_y_sv = GvSV (draw_y_gv);
2788 SV *draw_w_sv = GvSV (draw_w_gv);
2789 SV *draw_h_sv = GvSV (draw_h_gv);
2790 SV *hover;
2791 double draw_x, draw_y, draw_w, draw_h;
2792
2793 if (!SvROK (self))
2794 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self));
2795
2796 hv = (HV *)SvRV (self);
2797
2798 if (SvTYPE (hv) != SVt_PVHV)
2799 croak ("CFPlus::Base::draw: %s not a hashref", SvPV_nolen (self));
2800
2801 svp = hv_fetch (hv, "w", 1, 0); w = svp ? SvNV (*svp) : 0.;
2802 svp = hv_fetch (hv, "h", 1, 0); h = svp ? SvNV (*svp) : 0.;
2803
2804 if (!h || !w)
2805 XSRETURN_EMPTY;
2806
2807 svp = hv_fetch (hv, "x", 1, 0); x = svp ? SvNV (*svp) : 0.;
2808 svp = hv_fetch (hv, "y", 1, 0); y = svp ? SvNV (*svp) : 0.;
2809
2810 draw_x = SvNV (draw_x_sv) + x;
2811 draw_y = SvNV (draw_y_sv) + y;
2812
2813 if (draw_x + w < 0 || draw_x >= SvNV (draw_w_sv)
2814 || draw_y + h < 0 || draw_y >= SvNV (draw_h_sv))
2815 XSRETURN_EMPTY;
2816
2817 sv_setnv (draw_x_sv, draw_x);
2818 sv_setnv (draw_y_sv, draw_y);
2819
2820 glPushMatrix ();
2821 glTranslated (x, y, 0);
2822
2823 if (SvROK (GvSV (hover_gv)) && SvRV (GvSV (hover_gv)) == (SV *)hv)
2824 {
2825 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0);
2826
2827 if (svp && SvTRUE (*svp))
2828 {
2829 glColor4f (1*0.2f, 0.8*0.2f, 0.5*0.2f, 0.2f);
2830 glEnable (GL_BLEND);
2831 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
2832 glBegin (GL_QUADS);
2833 glVertex2f (0, 0);
2834 glVertex2f (w, 0);
2835 glVertex2f (w, h);
2836 glVertex2f (0, h);
2837 glEnd ();
2838 glDisable (GL_BLEND);
2839 }
2840 }
2841#if 0
2842 if ($ENV{CFPLUS_DEBUG} & 1) {
2843 glPushMatrix;
2844 glColor 1, 1, 0, 1;
2845 glTranslate 0.375, 0.375;
2846 glBegin GL_LINE_LOOP;
2847 glVertex 0 , 0;
2848 glVertex $self->{w} - 1, 0;
2849 glVertex $self->{w} - 1, $self->{h} - 1;
2850 glVertex 0 , $self->{h} - 1;
2851 glEnd;
2852 glPopMatrix;
2853 #CFPlus::UI::Label->new (w => $self->{w}, h => $self->{h}, text => $self, fontsize => 0)->_draw;
2854 }
2855#endif
2856 PUSHMARK (SP);
2857 XPUSHs (self);
2858 PUTBACK;
2859 call_method ("_draw", G_VOID | G_DISCARD);
2860 SPAGAIN;
2861
2862 glPopMatrix ();
2863
2864 draw_x = draw_x - x; sv_setnv (draw_x_sv, draw_x);
2865 draw_y = draw_y - y; sv_setnv (draw_y_sv, draw_y);
2866}
2867

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines