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.296 by root, Mon Dec 21 23:52:34 2009 UTC vs.
Revision 1.314 by root, Wed Jan 18 15:31:51 2012 UTC

41#include <SDL_opengl.h> 41#include <SDL_opengl.h>
42 42
43/* work around os x broken headers */ 43/* work around os x broken headers */
44#ifdef __MACOSX__ 44#ifdef __MACOSX__
45typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); 45typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
46typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
47typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
46#endif 48#endif
47 49
48#define PANGO_ENABLE_BACKEND 50#define PANGO_ENABLE_BACKEND
49#define G_DISABLE_CAST_CHECKS 51#define G_DISABLE_CAST_CHECKS
50 52
97 99
98#define KMOD_LRAM 0x10000 // our extension 100#define KMOD_LRAM 0x10000 // our extension
99 101
100#define TEXID_SPEECH 1 102#define TEXID_SPEECH 1
101#define TEXID_NOFACE 2 103#define TEXID_NOFACE 2
102#define TEXID_HIDDEN 3 104
105static char *
106fast_sv_grow (SV *sv, STRLEN need)
107{
108 STRLEN len = SvLEN (sv);
109 STRLEN want = SvCUR (sv) + need;
110
111 if (expect_false (len < want))
112 {
113 do
114 len *= 2;
115 while (len < want);
116
117 sv_grow (sv, len);
118 }
119
120 SvCUR_set (sv, want);
121 return SvEND (sv) - need;
122}
103 123
104static AV *texture_av; 124static AV *texture_av;
105 125
106static struct 126static struct
107{ 127{
462 482
463 SDL_PushEvent ((SDL_Event *)&ev); 483 SDL_PushEvent ((SDL_Event *)&ev);
464} 484}
465 485
466static unsigned int 486static unsigned int
487div255 (unsigned int n)
488{
489 return (n + (n >> 8)) >> 8;
490}
491
492static unsigned int
467minpot (unsigned int n) 493minpot (unsigned int n)
468{ 494{
469 if (!n) 495 if (!n)
470 return 0; 496 return 0;
471 497
551 577
552 return mod; 578 return mod;
553} 579}
554 580
555static void 581static void
556deliantra_main () 582deliantra_main (SV *real_main)
557{ 583{
558 char *argv[] = { 0 }; 584 dSP;
559 call_argv ("::main", G_DISCARD | G_VOID, argv); 585
586 PUSHMARK (SP);
587 call_sv (real_main, G_DISCARD | G_VOID);
560} 588}
561 589
562#ifdef __MACOSX__ 590#ifdef __MACOSX__
591 static SV *real_main;
592
563 /* to due surprising braindamage on the side of SDL design, we 593 /* to due surprising braindamage on the side of SDL design, we
564 * do some mind-boggling hack here: SDL requires a custom main() 594 * do some mind-boggling hack here: SDL requires a custom main()
565 * on OS X, so... we provide one and call the original main(), which, 595 * on OS X, so... we provide one and call the original main(), which,
566 * due to share dlibrary magic, calls -lSDLmain's main, not perl's main, 596 * due to shared library magic, calls -lSDLmain's main, not perl's main,
567 * and which calls our main (== SDL_main) back. 597 * and which calls our main (== SDL_main) back.
568 */ 598 */
569 extern C_LINKAGE int 599 extern C_LINKAGE int
570 main (int argc, char *argv[]) 600 main (int argc, char *argv[])
571 { 601 {
572 deliantra_main (); 602 deliantra_main (real_main);
573 } 603 }
574 604
575 #undef main 605 #undef main
576 606
577 extern C_LINKAGE int main (int argc, char *argv[]); 607 extern C_LINKAGE int main (int argc, char *argv[]);
578 608
579 static void 609 static void
580 SDL_braino (void) 610 SDL_main_hack (SV *real_main_)
581 { 611 {
612 real_main = real_main;
613
582 char *argv[] = { "deliantra client", 0 }; 614 char *argv[] = { "deliantra client", 0 };
583 (main) (1, argv); 615 (main) (1, argv);
584 } 616 }
585#else 617#else
586 static void 618 static void
587 SDL_braino (void) 619 SDL_main_hack (SV *real_main)
588 { 620 {
589 deliantra_main (); 621 deliantra_main (real_main);
590 } 622 }
591#endif 623#endif
592 624
593MODULE = Deliantra::Client PACKAGE = DC 625MODULE = Deliantra::Client PACKAGE = DC
594 626
795 827
796 const_iv (FOW_DARKNESS) 828 const_iv (FOW_DARKNESS)
797# undef const_iv 829# undef const_iv
798 }; 830 };
799 831
800 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 832 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
801 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 833 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
802 834
803 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK); 835 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK);
804 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE); 836 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE);
805} 837}
806 838
845#endif 877#endif
846} 878}
847 879
848char *SDL_GetError () 880char *SDL_GetError ()
849 881
850void SDL_braino () 882void SDL_main_hack (SV *real_main)
883 PROTOTYPE: &
851 884
852int SDL_Init (U32 flags) 885int SDL_Init (U32 flags)
853 886
854int SDL_InitSubSystem (U32 flags) 887int SDL_InitSubSystem (U32 flags)
855 888
924 ); 957 );
925 958
926 if (RETVAL) 959 if (RETVAL)
927 { 960 {
928 av_clear (texture_av); 961 av_clear (texture_av);
929
930 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
931#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 962#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
932#include "glfunc.h" 963#include "glfunc.h"
933#undef GL_FUNC 964#undef GL_FUNC
965 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
966 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
934 } 967 }
935} 968}
936 OUTPUT: 969 OUTPUT:
937 RETVAL 970 RETVAL
938 971
939void 972void
973SDL_WM_SetCaption (const char *title, const char *icon)
974
975void
940SDL_GL_SwapBuffers () 976SDL_GL_SwapBuffers ()
941 977
942char * 978char *
943SDL_GetKeyName (int sym) 979SDL_GetKeyName (int sym)
944 980
946SDL_GetAppState () 982SDL_GetAppState ()
947 983
948int 984int
949SDL_GetModState () 985SDL_GetModState ()
950 986
987int
988SDL_WaitEvent ()
989 C_ARGS: 0
990
951void 991void
992SDL_PumpEvents ()
993
994void
952poll_events () 995peep_events ()
953 PPCODE: 996 PPCODE:
954{ 997{
955 SDL_Event ev; 998 SDL_Event ev;
956 999
957 SDL_PumpEvents (); 1000 SDL_PumpEvents ();
1023 1066
1024 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1)))); 1067 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1))));
1025 } 1068 }
1026} 1069}
1027 1070
1071char *
1072SDL_AudioDriverName ()
1073 CODE:
1074{
1075 char buf [256];
1076 if (!SDL_AudioDriverName (buf, sizeof (buf)))
1077 XSRETURN_UNDEF;
1078
1079 RETVAL = buf;
1080}
1081 OUTPUT:
1082 RETVAL
1083
1028int 1084int
1029Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096) 1085Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096)
1030 POSTCALL: 1086 POSTCALL:
1031 Mix_HookMusicFinished (music_finished); 1087 Mix_HookMusicFinished (music_finished);
1032 Mix_ChannelFinished (channel_finished); 1088 Mix_ChannelFinished (channel_finished);
1094add_font (char *file) 1150add_font (char *file)
1095 CODE: 1151 CODE:
1096 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file); 1152 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file);
1097 OUTPUT: 1153 OUTPUT:
1098 RETVAL 1154 RETVAL
1155
1156void
1157IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1158
1159# MIX_INIT_MP3 gives smpeg + libstdc++ + libgcc_s
1160void
1161Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_OGG)
1099 1162
1100void 1163void
1101load_image_inline (SV *image_) 1164load_image_inline (SV *image_)
1102 ALIAS: 1165 ALIAS:
1103 load_image_file = 1 1166 load_image_file = 1
1671void 1734void
1672draw_fow_texture (float intensity, int hidden_tex, int name1, uint8_t *data1, float s, float t, int w, int h, float blend = 0.f, int dx = 0, int dy = 0, int name2 = 0, uint8_t *data2 = data1) 1735draw_fow_texture (float intensity, int hidden_tex, int name1, uint8_t *data1, float s, float t, int w, int h, float blend = 0.f, int dx = 0, int dy = 0, int name2 = 0, uint8_t *data2 = data1)
1673 PROTOTYPE: @ 1736 PROTOTYPE: @
1674 CODE: 1737 CODE:
1675{ 1738{
1739 glEnable (GL_BLEND);
1740 glBlendFunc (intensity ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1676 glEnable (GL_TEXTURE_2D); 1741 glEnable (GL_TEXTURE_2D);
1677 glEnable (GL_BLEND);
1678 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1679 glBindTexture (GL_TEXTURE_2D, name1); 1742 glBindTexture (GL_TEXTURE_2D, name1);
1680 1743
1681 glColor3f (intensity, intensity, intensity); 1744 glColor3f (intensity, intensity, intensity);
1682 glPushMatrix (); 1745 glPushMatrix ();
1683 glScalef (1./3, 1./3, 1.); 1746 glScalef (1./3, 1./3, 1.);
1698 glBindTexture (GL_TEXTURE_2D, name2); 1761 glBindTexture (GL_TEXTURE_2D, name2);
1699 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 1762 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
1700 1763
1701 /* rgb == rgb(glcolor) */ 1764 /* rgb == rgb(glcolor) */
1702 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); 1765 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
1703 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT); 1766 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
1704 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 1767 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
1705 1768
1706 /* alpha = interpolate t0, t1 by env_alpha */ 1769 /* alpha = interpolate t0, t1 by env_alpha */
1707 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color); 1770 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
1708 1771
2095 ? self->row + y 2158 ? self->row + y
2096 : 0; 2159 : 0;
2097 2160
2098 for (x = x0; x < x1; x++) 2161 for (x = x0; x < x1; x++)
2099 { 2162 {
2100 int r = 32, g = 32, b = 32, a = 192; 2163 unsigned int r = 32, g = 32, b = 32, a = 192;
2101 2164
2102 if (row && row->c0 <= x && x < row->c1) 2165 if (row && row->c0 <= x && x < row->c1)
2103 { 2166 {
2104 mapcell *cell = row->col + (x - row->c0); 2167 mapcell *cell = row->col + (x - row->c0);
2105 2168
2107 { 2170 {
2108 maptex tex = self->tex [cell->tile [z]]; 2171 maptex tex = self->tex [cell->tile [z]];
2109 int a0 = 255 - tex.a; 2172 int a0 = 255 - tex.a;
2110 int a1 = tex.a; 2173 int a1 = tex.a;
2111 2174
2112 r = (r * a0 + tex.r * a1) / 255; 2175 r = div255 (r * a0 + tex.r * a1);
2113 g = (g * a0 + tex.g * a1) / 255; 2176 g = div255 (g * a0 + tex.g * a1);
2114 b = (b * a0 + tex.b * a1) / 255; 2177 b = div255 (b * a0 + tex.b * a1);
2115 a = (a * a0 + tex.a * a1) / 255; 2178 a = div255 (a * a0 + tex.a * a1);
2116 } 2179 }
2117 } 2180 }
2118 2181
2119 *map++ = (r ) 2182 *map++ = (r )
2120 | (g << 8) 2183 | (g << 8)
2127} 2190}
2128 OUTPUT: 2191 OUTPUT:
2129 RETVAL 2192 RETVAL
2130 2193
2131void 2194void
2132draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0) 2195draw (DC::Map self, int mx, int my, int sw, int sh, int Tw, int Th, U32 player = 0xffffffff, int sdx = 0, int sdy = 0)
2133 CODE: 2196 CODE:
2134{ 2197{
2135 int x, y, z; 2198 int x, y, z;
2136 2199
2137 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 2200 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2141 int pl_x, pl_y; 2204 int pl_x, pl_y;
2142 maptex pl_tex; 2205 maptex pl_tex;
2143 rc_t *rc = rc_alloc (); 2206 rc_t *rc = rc_alloc ();
2144 rc_t *rc_ov = rc_alloc (); 2207 rc_t *rc_ov = rc_alloc ();
2145 rc_key_t key; 2208 rc_key_t key;
2146 rc_array_t *arr, *arr_hidden; 2209 rc_array_t *arr;
2147 2210
2148 pl_tex.name = 0; 2211 pl_tex.name = 0;
2149 2212
2150 // that's current max. sorry. 2213 // that's current max. sorry.
2151 if (sw > 255) sw = 255; 2214 if (sw > 255) sw = 255;
2188 } 2251 }
2189 2252
2190 glEnable (GL_BLEND); 2253 glEnable (GL_BLEND);
2191 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2254 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2192 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2255 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
2193
2194 key.texname = self->tex [TEXID_HIDDEN].name;
2195 arr_hidden = rc_array (rc_ov, &key);
2196 2256
2197 for (z = 0; z <= 2; z++) 2257 for (z = 0; z <= 2; z++)
2198 { 2258 {
2199 memset (smooth_level, 0, sizeof (smooth_level)); 2259 memset (smooth_level, 0, sizeof (smooth_level));
2200 key.texname = -1; 2260 key.texname = -1;
2224 2284
2225 key.texname = tex.name; 2285 key.texname = tex.name;
2226 arr = rc_array (rc, &key); 2286 arr = rc_array (rc, &key);
2227 } 2287 }
2228 2288
2229 px = (x + 1) * T - tex.w; 2289 px = (x + 1) * Th - tex.w;
2230 py = (y + 1) * T - tex.h; 2290 py = (y + 1) * Tw - tex.h;
2231 2291
2232 if (expect_false (cell->player == player) && expect_false (z == 2)) 2292 if (expect_false (cell->player == player) && expect_false (z == 2))
2233 { 2293 {
2234 pl_x = px; 2294 pl_x = px;
2235 pl_y = py; 2295 pl_y = py;
2288 if (cell->flags & 1) 2348 if (cell->flags & 1)
2289 { 2349 {
2290 rc_key_t key_ov = key; 2350 rc_key_t key_ov = key;
2291 maptex tex = self->tex [TEXID_SPEECH]; 2351 maptex tex = self->tex [TEXID_SPEECH];
2292 rc_array_t *arr; 2352 rc_array_t *arr;
2293 int px = x * T + T * 2 / 32; 2353 int px = x * Tw + Tw * 2 / 32;
2294 int py = y * T - T * 6 / 32; 2354 int py = y * Th - Th * 6 / 32;
2295 2355
2296 key_ov.texname = tex.name; 2356 key_ov.texname = tex.name;
2297 arr = rc_array (rc_ov, &key_ov); 2357 arr = rc_array (rc_ov, &key_ov);
2298 2358
2299 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2359 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2300 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2360 rc_t2f_v3f (arr, 0 , tex.t, px , py + Th, 0);
2301 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0); 2361 rc_t2f_v3f (arr, tex.s, tex.t, px + Tw, py + Th, 0);
2302 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0); 2362 rc_t2f_v3f (arr, tex.s, 0 , px + Tw, py , 0);
2303 } 2363 }
2304 } 2364 }
2305 } 2365 }
2306 } 2366 }
2307 2367
2334 if (!(bits & 0x1000) 2394 if (!(bits & 0x1000)
2335 && skey->level == level 2395 && skey->level == level
2336 && level > smooth_max [skey->x][skey->y]) 2396 && level > smooth_max [skey->x][skey->y])
2337 { 2397 {
2338 maptex tex = self->tex [skey->tile]; 2398 maptex tex = self->tex [skey->tile];
2339 int px = (((int)skey->x) - 1) * T; 2399 int px = (((int)skey->x) - 1) * Tw;
2340 int py = (((int)skey->y) - 1) * T; 2400 int py = (((int)skey->y) - 1) * Th;
2341 int border = bits & 15; 2401 int border = bits & 15;
2342 int corner = (bits >> 8) & ~(bits >> 4) & 15; 2402 int corner = (bits >> 8) & ~(bits >> 4) & 15;
2343 float dx = tex.s * .0625f; // 16 images/row 2403 float dx = tex.s * .0625f; // 16 images/row
2344 float dy = tex.t * .5f ; // 2 images/column 2404 float dy = tex.t * .5f ; // 2 images/column
2345 2405
2358 2418
2359 if (border) 2419 if (border)
2360 { 2420 {
2361 float ox = border * dx; 2421 float ox = border * dx;
2362 2422
2363 glTexCoord2f (ox , 0.f ); glVertex2i (px , py ); 2423 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
2364 glTexCoord2f (ox , dy ); glVertex2i (px , py + T); 2424 glTexCoord2f (ox , dy ); glVertex2i (px , py + Th);
2365 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T); 2425 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py + Th);
2366 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py ); 2426 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + Tw, py );
2367 } 2427 }
2368 2428
2369 if (corner) 2429 if (corner)
2370 { 2430 {
2371 float ox = corner * dx; 2431 float ox = corner * dx;
2372 2432
2373 glTexCoord2f (ox , dy ); glVertex2i (px , py ); 2433 glTexCoord2f (ox , dy ); glVertex2i (px , py );
2374 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T); 2434 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + Th);
2375 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T); 2435 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + Tw, py + Th);
2376 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py ); 2436 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py );
2377 } 2437 }
2378 } 2438 }
2379 } 2439 }
2380 } 2440 }
2381 } 2441 }
2422 for (x = 0; x < sw; x++) 2482 for (x = 0; x < sw; x++)
2423 if (row->c0 <= x + mx && x + mx < row->c1) 2483 if (row->c0 <= x + mx && x + mx < row->c1)
2424 { 2484 {
2425 mapcell *cell = row->col + (x + mx - row->c0); 2485 mapcell *cell = row->col + (x + mx - row->c0);
2426 2486
2427 int px = x * T; 2487 int px = x * Tw;
2428 int py = y * T; 2488 int py = y * Th;
2429 2489
2430 if (expect_false (cell->player == player)) 2490 if (expect_false (cell->player == player))
2431 { 2491 {
2432 px += sdx; 2492 px += sdx;
2433 py += sdy; 2493 py += sdy;
2434 } 2494 }
2435 2495
2436 if (cell->stat_hp) 2496 if (cell->stat_hp)
2437 { 2497 {
2438 int width = cell->stat_width * T; 2498 int width = cell->stat_width * Tw;
2439 int thick = (sh * T / 32 + 27) / 28 + 1 + cell->stat_width; 2499 int thick = (sh * Th / 32 + 27) / 28 + 1 + cell->stat_width;
2440 2500
2441 glColor3ub (0, 0, 0); 2501 glColor3ub (0, 0, 0);
2442 glRectf (px + 1, py - thick - 2, 2502 glRectf (px + 1, py - thick - 2,
2443 px + width - 1, py); 2503 px + width - 1, py);
2444 2504
2524 int x, y; 2584 int x, y;
2525 int sw1 = sw + 2; 2585 int sw1 = sw + 2;
2526 int sh1 = sh + 2; 2586 int sh1 = sh + 2;
2527 int sh3 = sh * 3; 2587 int sh3 = sh * 3;
2528 int sw3 = sw * 3; 2588 int sw3 = sw * 3;
2529 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2530 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3)); 2589 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2531 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv); 2590 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2591 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2592 memset (darkness1, 0, sw1*sh1);
2532 2593
2533 SvPOK_only (darkness3_sv); 2594 SvPOK_only (darkness3_sv);
2534 SvCUR_set (darkness3_sv, sw3 * sh3); 2595 SvCUR_set (darkness3_sv, sw3 * sh3);
2535 2596
2536 mx += self->x - 1; 2597 mx += self->x - 1;
2797 if (RETVAL < 0) 2858 if (RETVAL < 0)
2798 { 2859 {
2799 RETVAL = Mix_GroupOldest (-1); 2860 RETVAL = Mix_GroupOldest (-1);
2800 2861
2801 if (RETVAL < 0) 2862 if (RETVAL < 0)
2863 {
2864 // happens sometimes, maybe it just stopped playing(?)
2865 RETVAL = Mix_GroupAvailable (-1);
2866
2867 if (RETVAL < 0)
2802 XSRETURN_UNDEF; 2868 XSRETURN_UNDEF;
2803 2869 }
2870 else
2804 Mix_HaltChannel (RETVAL); 2871 Mix_HaltChannel (RETVAL);
2805 } 2872 }
2806 2873
2807 Mix_UnregisterAllEffects (RETVAL); 2874 Mix_UnregisterAllEffects (RETVAL);
2808 Mix_Volume (RETVAL, 128); 2875 Mix_Volume (RETVAL, 128);
2809} 2876}
2868 Mix_SetReverseStereo (self, flip); 2935 Mix_SetReverseStereo (self, flip);
2869 2936
2870MODULE = Deliantra::Client PACKAGE = DC::MixChunk 2937MODULE = Deliantra::Client PACKAGE = DC::MixChunk
2871 2938
2872PROTOTYPES: DISABLE 2939PROTOTYPES: DISABLE
2940
2941void
2942decoders ()
2943 PPCODE:
2944#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2945 int i, num = Mix_GetNumChunkDecoders ();
2946 EXTEND (SP, num);
2947 for (i = 0; i < num; ++i)
2948 PUSHs (sv_2mortal (newSVpv (Mix_GetChunkDecoder (i), 0)));
2949#else
2950 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2951#endif
2873 2952
2874DC::MixChunk 2953DC::MixChunk
2875new (SV *class, DC::RW rwops) 2954new (SV *class, DC::RW rwops)
2876 CODE: 2955 CODE:
2877 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2956 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2910 OUTPUT: 2989 OUTPUT:
2911 RETVAL 2990 RETVAL
2912 2991
2913MODULE = Deliantra::Client PACKAGE = DC::MixMusic 2992MODULE = Deliantra::Client PACKAGE = DC::MixMusic
2914 2993
2994void
2995decoders ()
2996 PPCODE:
2997#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2998 int i, num = Mix_GetNumMusicDecoders ();
2999 EXTEND (SP, num);
3000 for (i = 0; i < num; ++i)
3001 PUSHs (sv_2mortal (newSVpv (Mix_GetMusicDecoder (i), 0)));
3002#else
3003 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
3004#endif
3005
2915int 3006int
2916volume (int volume = -1) 3007volume (int volume = -1)
2917 PROTOTYPE: ;$ 3008 PROTOTYPE: ;$
2918 CODE: 3009 CODE:
2919 if (items > 0) 3010 if (items > 0)
2929 3020
2930void 3021void
2931halt () 3022halt ()
2932 CODE: 3023 CODE:
2933 Mix_HaltMusic (); 3024 Mix_HaltMusic ();
3025
3026int
3027playing ()
3028 CODE:
3029 RETVAL = Mix_PlayingMusic ();
3030 OUTPUT:
3031 RETVAL
2934 3032
2935DC::MixMusic 3033DC::MixMusic
2936new (SV *class, DC::RW rwops) 3034new (SV *class, DC::RW rwops)
2937 CODE: 3035 CODE:
2938 RETVAL = Mix_LoadMUS_RW (rwops); 3036 RETVAL = Mix_LoadMUS_RW (rwops);
3078 const_iv (GL_FUNC_SUBTRACT), 3176 const_iv (GL_FUNC_SUBTRACT),
3079 const_iv (GL_FUNC_REVERSE_SUBTRACT), 3177 const_iv (GL_FUNC_REVERSE_SUBTRACT),
3080# undef const_iv 3178# undef const_iv
3081 }; 3179 };
3082 3180
3083 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 3181 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
3084 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 3182 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
3085 3183
3086 texture_av = newAV (); 3184 texture_av = newAV ();
3087 AvREAL_off (texture_av); 3185 AvREAL_off (texture_av);
3088} 3186}
3089 3187
3132 RETVAL 3230 RETVAL
3133 3231
3134int glGetError () 3232int glGetError ()
3135 3233
3136void glFinish () 3234void glFinish ()
3235
3236void glFlush ()
3137 3237
3138void glClear (int mask) 3238void glClear (int mask)
3139 3239
3140void glClearColor (float r, float g, float b, float a = 1.0) 3240void glClearColor (float r, float g, float b, float a = 1.0)
3141 PROTOTYPE: @ 3241 PROTOTYPE: @

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines