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.212 by root, Sun Jul 29 03:58:26 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 = 4096)
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
858 STRLEN image_len; 865 STRLEN image_len;
859 char *image = (char *)SvPVbyte (image_, image_len); 866 char *image = (char *)SvPVbyte (image_, image_len);
860 SDL_Surface *surface, *surface2; 867 SDL_Surface *surface, *surface2;
861 SDL_PixelFormat fmt; 868 SDL_PixelFormat fmt;
862 SDL_RWops *rw = ix 869 SDL_RWops *rw = ix
863 ? SDL_RWFromFile (image, "r") 870 ? SDL_RWFromFile (image, "rb")
864 : SDL_RWFromConstMem (image, image_len); 871 : SDL_RWFromConstMem (image, image_len);
865 872
866 if (!rw) 873 if (!rw)
867 croak ("load_image: %s", SDL_GetError ()); 874 croak ("load_image: %s", SDL_GetError ());
868 875
2229 } 2236 }
2230 } 2237 }
2231 } 2238 }
2232} 2239}
2233 2240
2241MODULE = CFPlus PACKAGE = CFPlus::RW
2242
2243CFPlus::RW
2244new (SV *class, SV *data_sv)
2245 CODE:
2246{
2247 STRLEN datalen;
2248 char *data = SvPVbyte (data_sv, datalen);
2249
2250 RETVAL = SDL_RWFromConstMem (data, datalen);
2251}
2252 OUTPUT:
2253 RETVAL
2254
2255CFPlus::RW
2256new_from_file (SV *class, const char *path, const char *mode = "rb")
2257 CODE:
2258 RETVAL = SDL_RWFromFile (path, mode);
2259 OUTPUT:
2260 RETVAL
2261
2262void
2263close (CFPlus::RW self)
2264 CODE:
2265 SDL_RWclose (self);
2266
2267MODULE = CFPlus PACKAGE = CFPlus::Channel
2268
2269PROTOTYPES: DISABLE
2270
2271int
2272volume (CFPlus::Channel self, int volume)
2273 CODE:
2274 RETVAL = Mix_Volume (self, volume);
2275 OUTPUT:
2276 RETVAL
2277
2278int
2279unregister_all_effects (CFPlus::Channel self)
2280 CODE:
2281 RETVAL = Mix_UnregisterAllEffects (self);
2282 OUTPUT:
2283 RETVAL
2284
2285int
2286set_panning (CFPlus::Channel self, int left, int right)
2287 CODE:
2288 RETVAL = Mix_SetPanning (self, left, right);
2289 OUTPUT:
2290 RETVAL
2291
2292int
2293set_distance (CFPlus::Channel self, int distance)
2294 CODE:
2295 RETVAL = Mix_SetDistance (self, distance);
2296 OUTPUT:
2297 RETVAL
2298
2299int
2300set_position (CFPlus::Channel self, int angle, int distance)
2301 CODE:
2302 RETVAL = Mix_SetPosition (self, angle, distance);
2303 OUTPUT:
2304 RETVAL
2305
2306int
2307set_reverse_stereo (CFPlus::Channel self, int flip)
2308 CODE:
2309 RETVAL = Mix_SetReverseStereo (self, flip);
2310 OUTPUT:
2311 RETVAL
2312
2234MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2313MODULE = CFPlus PACKAGE = CFPlus::MixChunk
2235 2314
2236PROTOTYPES: DISABLE 2315PROTOTYPES: DISABLE
2237 2316
2238CFPlus::MixChunk 2317CFPlus::MixChunk
2239new_from_file (SV *class, char *path) 2318new (SV *class, CFPlus::RW rwops)
2240 CODE: 2319 CODE:
2241 RETVAL = Mix_LoadWAV (path); 2320 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2242 OUTPUT: 2321 OUTPUT:
2243 RETVAL 2322 RETVAL
2244 2323
2245void 2324void
2246DESTROY (CFPlus::MixChunk self) 2325DESTROY (CFPlus::MixChunk self)
2252 CODE: 2331 CODE:
2253 RETVAL = Mix_VolumeChunk (self, volume); 2332 RETVAL = Mix_VolumeChunk (self, volume);
2254 OUTPUT: 2333 OUTPUT:
2255 RETVAL 2334 RETVAL
2256 2335
2257int 2336CFPlus::Channel
2258play (CFPlus::MixChunk self, int channel = -1, int loops = 0, int ticks = -1) 2337play (CFPlus::MixChunk self, int channel = -1, int loops = 0, int ticks = -1)
2259 CODE: 2338 CODE:
2260 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks); 2339 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
2340 Mix_UnregisterAllEffects (RETVAL);
2261 OUTPUT: 2341 OUTPUT:
2262 RETVAL 2342 RETVAL
2263 2343
2264MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2344MODULE = CFPlus PACKAGE = CFPlus::MixMusic
2265 2345
2276 CODE: 2356 CODE:
2277 RETVAL = Mix_FadeOutMusic (ms); 2357 RETVAL = Mix_FadeOutMusic (ms);
2278 OUTPUT: 2358 OUTPUT:
2279 RETVAL 2359 RETVAL
2280 2360
2361void
2362halt ()
2363 CODE:
2364 Mix_HaltMusic ();
2365
2281CFPlus::MixMusic 2366CFPlus::MixMusic
2282new_from_file (SV *class, char *path) 2367new (SV *class, CFPlus::RW rwops)
2283 CODE: 2368 CODE:
2284 RETVAL = Mix_LoadMUS (path); 2369 RETVAL = Mix_LoadMUS_RW (rwops);
2285 OUTPUT: 2370 OUTPUT:
2286 RETVAL 2371 RETVAL
2287 2372
2288void 2373void
2289DESTROY (CFPlus::MixMusic self) 2374DESTROY (CFPlus::MixMusic self)
2544 2629
2545void glTexCoord (float s, float t) 2630void glTexCoord (float s, float t)
2546 CODE: 2631 CODE:
2547 glTexCoord2f (s, t); 2632 glTexCoord2f (s, t);
2548 2633
2634void glRect (float x1, float y1, float x2, float y2)
2635 CODE:
2636 glRectf (x1, y1, x2, y2);
2637
2549PROTOTYPES: ENABLE 2638PROTOTYPES: ENABLE
2550 2639
2551void glBegin (int mode) 2640void glBegin (int mode)
2552 2641
2553void glEnd () 2642void glEnd ()
2626MODULE = CFPlus PACKAGE = CFPlus::UI::Base 2715MODULE = CFPlus PACKAGE = CFPlus::UI::Base
2627 2716
2628PROTOTYPES: DISABLE 2717PROTOTYPES: DISABLE
2629 2718
2630void 2719void
2631find_widget (SV *widget, NV x, NV y) 2720find_widget (SV *self, NV x, NV y)
2632 PPCODE: 2721 PPCODE:
2633{ 2722{
2634 if (within_widget (widget, x, y)) 2723 if (within_widget (self, x, y))
2635 XPUSHs (widget); 2724 XPUSHs (self);
2636} 2725}
2637 2726
2727BOOT:
2728{
2729 hover_gv = gv_fetchpv ("CFPlus::UI::HOVER", 1, SVt_NV);
2730
2731 draw_x_gv = gv_fetchpv ("CFPlus::UI::Base::draw_x", 1, SVt_NV);
2732 draw_y_gv = gv_fetchpv ("CFPlus::UI::Base::draw_y", 1, SVt_NV);
2733 draw_w_gv = gv_fetchpv ("CFPlus::UI::Base::draw_w", 1, SVt_NV);
2734 draw_h_gv = gv_fetchpv ("CFPlus::UI::Base::draw_h", 1, SVt_NV);
2735}
2736
2737void
2738draw (SV *self)
2739 CODE:
2740{
2741 HV *hv;
2742 SV **svp;
2743 NV x, y, w, h;
2744 SV *draw_x_sv = GvSV (draw_x_gv);
2745 SV *draw_y_sv = GvSV (draw_y_gv);
2746 SV *draw_w_sv = GvSV (draw_w_gv);
2747 SV *draw_h_sv = GvSV (draw_h_gv);
2748 SV *hover;
2749 double draw_x, draw_y, draw_w, draw_h;
2750
2751 if (!SvROK (self))
2752 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self));
2753
2754 hv = (HV *)SvRV (self);
2755
2756 if (SvTYPE (hv) != SVt_PVHV)
2757 croak ("CFPlus::Base::draw: %s not a hashref", SvPV_nolen (self));
2758
2759 svp = hv_fetch (hv, "w", 1, 0); w = svp ? SvNV (*svp) : 0.;
2760 svp = hv_fetch (hv, "h", 1, 0); h = svp ? SvNV (*svp) : 0.;
2761
2762 if (!h || !w)
2763 XSRETURN_EMPTY;
2764
2765 svp = hv_fetch (hv, "x", 1, 0); x = svp ? SvNV (*svp) : 0.;
2766 svp = hv_fetch (hv, "y", 1, 0); y = svp ? SvNV (*svp) : 0.;
2767
2768 draw_x = SvNV (draw_x_sv) + x;
2769 draw_y = SvNV (draw_y_sv) + y;
2770
2771 if (draw_x + w < 0 || draw_x >= SvNV (draw_w_sv)
2772 || draw_y + h < 0 || draw_y >= SvNV (draw_h_sv))
2773 XSRETURN_EMPTY;
2774
2775 sv_setnv (draw_x_sv, draw_x);
2776 sv_setnv (draw_y_sv, draw_y);
2777
2778 glPushMatrix ();
2779 glTranslated (x, y, 0);
2780
2781 if (SvROK (GvSV (hover_gv)) && SvRV (GvSV (hover_gv)) == (SV *)hv)
2782 {
2783 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0);
2784
2785 if (svp && SvTRUE (*svp))
2786 {
2787 glColor4f (1*0.2f, 0.8*0.2f, 0.5*0.2f, 0.2f);
2788 glEnable (GL_BLEND);
2789 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
2790 glBegin (GL_QUADS);
2791 glVertex2f (0, 0);
2792 glVertex2f (w, 0);
2793 glVertex2f (w, h);
2794 glVertex2f (0, h);
2795 glEnd ();
2796 glDisable (GL_BLEND);
2797 }
2798 }
2799#if 0
2800 if ($ENV{CFPLUS_DEBUG} & 1) {
2801 glPushMatrix;
2802 glColor 1, 1, 0, 1;
2803 glTranslate 0.375, 0.375;
2804 glBegin GL_LINE_LOOP;
2805 glVertex 0 , 0;
2806 glVertex $self->{w} - 1, 0;
2807 glVertex $self->{w} - 1, $self->{h} - 1;
2808 glVertex 0 , $self->{h} - 1;
2809 glEnd;
2810 glPopMatrix;
2811 #CFPlus::UI::Label->new (w => $self->{w}, h => $self->{h}, text => $self, fontsize => 0)->_draw;
2812 }
2813#endif
2814 PUSHMARK (SP);
2815 XPUSHs (self);
2816 PUTBACK;
2817 call_method ("_draw", G_VOID | G_DISCARD);
2818 SPAGAIN;
2819
2820 glPopMatrix ();
2821
2822 draw_x = draw_x - x; sv_setnv (draw_x_sv, draw_x);
2823 draw_y = draw_y - y; sv_setnv (draw_y_sv, draw_y);
2824}
2825

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines