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.302 by root, Tue Apr 20 10:53:11 2010 UTC vs.
Revision 1.314 by root, Wed Jan 18 15:31:51 2012 UTC

99 99
100#define KMOD_LRAM 0x10000 // our extension 100#define KMOD_LRAM 0x10000 // our extension
101 101
102#define TEXID_SPEECH 1 102#define TEXID_SPEECH 1
103#define TEXID_NOFACE 2 103#define TEXID_NOFACE 2
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}
104 123
105static AV *texture_av; 124static AV *texture_av;
106 125
107static struct 126static struct
108{ 127{
463 482
464 SDL_PushEvent ((SDL_Event *)&ev); 483 SDL_PushEvent ((SDL_Event *)&ev);
465} 484}
466 485
467static unsigned int 486static unsigned int
487div255 (unsigned int n)
488{
489 return (n + (n >> 8)) >> 8;
490}
491
492static unsigned int
468minpot (unsigned int n) 493minpot (unsigned int n)
469{ 494{
470 if (!n) 495 if (!n)
471 return 0; 496 return 0;
472 497
552 577
553 return mod; 578 return mod;
554} 579}
555 580
556static void 581static void
557deliantra_main () 582deliantra_main (SV *real_main)
558{ 583{
559 char *argv[] = { 0 }; 584 dSP;
560 call_argv ("::main", G_DISCARD | G_VOID, argv); 585
586 PUSHMARK (SP);
587 call_sv (real_main, G_DISCARD | G_VOID);
561} 588}
562 589
563#ifdef __MACOSX__ 590#ifdef __MACOSX__
591 static SV *real_main;
592
564 /* to due surprising braindamage on the side of SDL design, we 593 /* to due surprising braindamage on the side of SDL design, we
565 * do some mind-boggling hack here: SDL requires a custom main() 594 * do some mind-boggling hack here: SDL requires a custom main()
566 * 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,
567 * 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,
568 * and which calls our main (== SDL_main) back. 597 * and which calls our main (== SDL_main) back.
569 */ 598 */
570 extern C_LINKAGE int 599 extern C_LINKAGE int
571 main (int argc, char *argv[]) 600 main (int argc, char *argv[])
572 { 601 {
573 deliantra_main (); 602 deliantra_main (real_main);
574 } 603 }
575 604
576 #undef main 605 #undef main
577 606
578 extern C_LINKAGE int main (int argc, char *argv[]); 607 extern C_LINKAGE int main (int argc, char *argv[]);
579 608
580 static void 609 static void
581 SDL_braino (void) 610 SDL_main_hack (SV *real_main_)
582 { 611 {
612 real_main = real_main;
613
583 char *argv[] = { "deliantra client", 0 }; 614 char *argv[] = { "deliantra client", 0 };
584 (main) (1, argv); 615 (main) (1, argv);
585 } 616 }
586#else 617#else
587 static void 618 static void
588 SDL_braino (void) 619 SDL_main_hack (SV *real_main)
589 { 620 {
590 deliantra_main (); 621 deliantra_main (real_main);
591 } 622 }
592#endif 623#endif
593 624
594MODULE = Deliantra::Client PACKAGE = DC 625MODULE = Deliantra::Client PACKAGE = DC
595 626
796 827
797 const_iv (FOW_DARKNESS) 828 const_iv (FOW_DARKNESS)
798# undef const_iv 829# undef const_iv
799 }; 830 };
800 831
801 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--)
802 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 833 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
803 834
804 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK); 835 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK);
805 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE); 836 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE);
806} 837}
807 838
846#endif 877#endif
847} 878}
848 879
849char *SDL_GetError () 880char *SDL_GetError ()
850 881
851void SDL_braino () 882void SDL_main_hack (SV *real_main)
883 PROTOTYPE: &
852 884
853int SDL_Init (U32 flags) 885int SDL_Init (U32 flags)
854 886
855int SDL_InitSubSystem (U32 flags) 887int SDL_InitSubSystem (U32 flags)
856 888
925 ); 957 );
926 958
927 if (RETVAL) 959 if (RETVAL)
928 { 960 {
929 av_clear (texture_av); 961 av_clear (texture_av);
930
931 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
932#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);
933#include "glfunc.h" 963#include "glfunc.h"
934#undef GL_FUNC 964#undef GL_FUNC
935
936 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB; 965 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
937 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB; 966 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
938 } 967 }
939} 968}
940 OUTPUT: 969 OUTPUT:
941 RETVAL 970 RETVAL
942 971
943void 972void
973SDL_WM_SetCaption (const char *title, const char *icon)
974
975void
944SDL_GL_SwapBuffers () 976SDL_GL_SwapBuffers ()
945 977
946char * 978char *
947SDL_GetKeyName (int sym) 979SDL_GetKeyName (int sym)
948 980
950SDL_GetAppState () 982SDL_GetAppState ()
951 983
952int 984int
953SDL_GetModState () 985SDL_GetModState ()
954 986
987int
988SDL_WaitEvent ()
989 C_ARGS: 0
990
955void 991void
992SDL_PumpEvents ()
993
994void
956poll_events () 995peep_events ()
957 PPCODE: 996 PPCODE:
958{ 997{
959 SDL_Event ev; 998 SDL_Event ev;
960 999
961 SDL_PumpEvents (); 1000 SDL_PumpEvents ();
1027 1066
1028 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))));
1029 } 1068 }
1030} 1069}
1031 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
1032int 1084int
1033Mix_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)
1034 POSTCALL: 1086 POSTCALL:
1035 Mix_HookMusicFinished (music_finished); 1087 Mix_HookMusicFinished (music_finished);
1036 Mix_ChannelFinished (channel_finished); 1088 Mix_ChannelFinished (channel_finished);
1098add_font (char *file) 1150add_font (char *file)
1099 CODE: 1151 CODE:
1100 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file); 1152 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file);
1101 OUTPUT: 1153 OUTPUT:
1102 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)
1103 1162
1104void 1163void
1105load_image_inline (SV *image_) 1164load_image_inline (SV *image_)
1106 ALIAS: 1165 ALIAS:
1107 load_image_file = 1 1166 load_image_file = 1
2099 ? self->row + y 2158 ? self->row + y
2100 : 0; 2159 : 0;
2101 2160
2102 for (x = x0; x < x1; x++) 2161 for (x = x0; x < x1; x++)
2103 { 2162 {
2104 int r = 32, g = 32, b = 32, a = 192; 2163 unsigned int r = 32, g = 32, b = 32, a = 192;
2105 2164
2106 if (row && row->c0 <= x && x < row->c1) 2165 if (row && row->c0 <= x && x < row->c1)
2107 { 2166 {
2108 mapcell *cell = row->col + (x - row->c0); 2167 mapcell *cell = row->col + (x - row->c0);
2109 2168
2111 { 2170 {
2112 maptex tex = self->tex [cell->tile [z]]; 2171 maptex tex = self->tex [cell->tile [z]];
2113 int a0 = 255 - tex.a; 2172 int a0 = 255 - tex.a;
2114 int a1 = tex.a; 2173 int a1 = tex.a;
2115 2174
2116 r = (r * a0 + tex.r * a1) / 255; 2175 r = div255 (r * a0 + tex.r * a1);
2117 g = (g * a0 + tex.g * a1) / 255; 2176 g = div255 (g * a0 + tex.g * a1);
2118 b = (b * a0 + tex.b * a1) / 255; 2177 b = div255 (b * a0 + tex.b * a1);
2119 a = (a * a0 + tex.a * a1) / 255; 2178 a = div255 (a * a0 + tex.a * a1);
2120 } 2179 }
2121 } 2180 }
2122 2181
2123 *map++ = (r ) 2182 *map++ = (r )
2124 | (g << 8) 2183 | (g << 8)
2131} 2190}
2132 OUTPUT: 2191 OUTPUT:
2133 RETVAL 2192 RETVAL
2134 2193
2135void 2194void
2136draw (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)
2137 CODE: 2196 CODE:
2138{ 2197{
2139 int x, y, z; 2198 int x, y, z;
2140 2199
2141 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 2200 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2225 2284
2226 key.texname = tex.name; 2285 key.texname = tex.name;
2227 arr = rc_array (rc, &key); 2286 arr = rc_array (rc, &key);
2228 } 2287 }
2229 2288
2230 px = (x + 1) * T - tex.w; 2289 px = (x + 1) * Th - tex.w;
2231 py = (y + 1) * T - tex.h; 2290 py = (y + 1) * Tw - tex.h;
2232 2291
2233 if (expect_false (cell->player == player) && expect_false (z == 2)) 2292 if (expect_false (cell->player == player) && expect_false (z == 2))
2234 { 2293 {
2235 pl_x = px; 2294 pl_x = px;
2236 pl_y = py; 2295 pl_y = py;
2289 if (cell->flags & 1) 2348 if (cell->flags & 1)
2290 { 2349 {
2291 rc_key_t key_ov = key; 2350 rc_key_t key_ov = key;
2292 maptex tex = self->tex [TEXID_SPEECH]; 2351 maptex tex = self->tex [TEXID_SPEECH];
2293 rc_array_t *arr; 2352 rc_array_t *arr;
2294 int px = x * T + T * 2 / 32; 2353 int px = x * Tw + Tw * 2 / 32;
2295 int py = y * T - T * 6 / 32; 2354 int py = y * Th - Th * 6 / 32;
2296 2355
2297 key_ov.texname = tex.name; 2356 key_ov.texname = tex.name;
2298 arr = rc_array (rc_ov, &key_ov); 2357 arr = rc_array (rc_ov, &key_ov);
2299 2358
2300 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2359 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2301 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2360 rc_t2f_v3f (arr, 0 , tex.t, px , py + Th, 0);
2302 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);
2303 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0); 2362 rc_t2f_v3f (arr, tex.s, 0 , px + Tw, py , 0);
2304 } 2363 }
2305 } 2364 }
2306 } 2365 }
2307 } 2366 }
2308 2367
2335 if (!(bits & 0x1000) 2394 if (!(bits & 0x1000)
2336 && skey->level == level 2395 && skey->level == level
2337 && level > smooth_max [skey->x][skey->y]) 2396 && level > smooth_max [skey->x][skey->y])
2338 { 2397 {
2339 maptex tex = self->tex [skey->tile]; 2398 maptex tex = self->tex [skey->tile];
2340 int px = (((int)skey->x) - 1) * T; 2399 int px = (((int)skey->x) - 1) * Tw;
2341 int py = (((int)skey->y) - 1) * T; 2400 int py = (((int)skey->y) - 1) * Th;
2342 int border = bits & 15; 2401 int border = bits & 15;
2343 int corner = (bits >> 8) & ~(bits >> 4) & 15; 2402 int corner = (bits >> 8) & ~(bits >> 4) & 15;
2344 float dx = tex.s * .0625f; // 16 images/row 2403 float dx = tex.s * .0625f; // 16 images/row
2345 float dy = tex.t * .5f ; // 2 images/column 2404 float dy = tex.t * .5f ; // 2 images/column
2346 2405
2359 2418
2360 if (border) 2419 if (border)
2361 { 2420 {
2362 float ox = border * dx; 2421 float ox = border * dx;
2363 2422
2364 glTexCoord2f (ox , 0.f ); glVertex2i (px , py ); 2423 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
2365 glTexCoord2f (ox , dy ); glVertex2i (px , py + T); 2424 glTexCoord2f (ox , dy ); glVertex2i (px , py + Th);
2366 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T); 2425 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py + Th);
2367 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py ); 2426 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + Tw, py );
2368 } 2427 }
2369 2428
2370 if (corner) 2429 if (corner)
2371 { 2430 {
2372 float ox = corner * dx; 2431 float ox = corner * dx;
2373 2432
2374 glTexCoord2f (ox , dy ); glVertex2i (px , py ); 2433 glTexCoord2f (ox , dy ); glVertex2i (px , py );
2375 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T); 2434 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + Th);
2376 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T); 2435 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + Tw, py + Th);
2377 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py ); 2436 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py );
2378 } 2437 }
2379 } 2438 }
2380 } 2439 }
2381 } 2440 }
2382 } 2441 }
2423 for (x = 0; x < sw; x++) 2482 for (x = 0; x < sw; x++)
2424 if (row->c0 <= x + mx && x + mx < row->c1) 2483 if (row->c0 <= x + mx && x + mx < row->c1)
2425 { 2484 {
2426 mapcell *cell = row->col + (x + mx - row->c0); 2485 mapcell *cell = row->col + (x + mx - row->c0);
2427 2486
2428 int px = x * T; 2487 int px = x * Tw;
2429 int py = y * T; 2488 int py = y * Th;
2430 2489
2431 if (expect_false (cell->player == player)) 2490 if (expect_false (cell->player == player))
2432 { 2491 {
2433 px += sdx; 2492 px += sdx;
2434 py += sdy; 2493 py += sdy;
2435 } 2494 }
2436 2495
2437 if (cell->stat_hp) 2496 if (cell->stat_hp)
2438 { 2497 {
2439 int width = cell->stat_width * T; 2498 int width = cell->stat_width * Tw;
2440 int thick = (sh * T / 32 + 27) / 28 + 1 + cell->stat_width; 2499 int thick = (sh * Th / 32 + 27) / 28 + 1 + cell->stat_width;
2441 2500
2442 glColor3ub (0, 0, 0); 2501 glColor3ub (0, 0, 0);
2443 glRectf (px + 1, py - thick - 2, 2502 glRectf (px + 1, py - thick - 2,
2444 px + width - 1, py); 2503 px + width - 1, py);
2445 2504
2525 int x, y; 2584 int x, y;
2526 int sw1 = sw + 2; 2585 int sw1 = sw + 2;
2527 int sh1 = sh + 2; 2586 int sh1 = sh + 2;
2528 int sh3 = sh * 3; 2587 int sh3 = sh * 3;
2529 int sw3 = sw * 3; 2588 int sw3 = sw * 3;
2530 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2531 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3)); 2589 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2532 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);
2533 2593
2534 SvPOK_only (darkness3_sv); 2594 SvPOK_only (darkness3_sv);
2535 SvCUR_set (darkness3_sv, sw3 * sh3); 2595 SvCUR_set (darkness3_sv, sw3 * sh3);
2536 2596
2537 mx += self->x - 1; 2597 mx += self->x - 1;
3116 const_iv (GL_FUNC_SUBTRACT), 3176 const_iv (GL_FUNC_SUBTRACT),
3117 const_iv (GL_FUNC_REVERSE_SUBTRACT), 3177 const_iv (GL_FUNC_REVERSE_SUBTRACT),
3118# undef const_iv 3178# undef const_iv
3119 }; 3179 };
3120 3180
3121 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--)
3122 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 3182 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
3123 3183
3124 texture_av = newAV (); 3184 texture_av = newAV ();
3125 AvREAL_off (texture_av); 3185 AvREAL_off (texture_av);
3126} 3186}
3127 3187
3170 RETVAL 3230 RETVAL
3171 3231
3172int glGetError () 3232int glGetError ()
3173 3233
3174void glFinish () 3234void glFinish ()
3235
3236void glFlush ()
3175 3237
3176void glClear (int mask) 3238void glClear (int mask)
3177 3239
3178void glClearColor (float r, float g, float b, float a = 1.0) 3240void glClearColor (float r, float g, float b, float a = 1.0)
3179 PROTOTYPE: @ 3241 PROTOTYPE: @

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines