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.193 by root, Sun Jul 1 03:12:34 2007 UTC vs.
Revision 1.203 by root, Thu Jul 19 13:45:16 2007 UTC

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#include <SDL.h> 30#include <SDL.h>
31#include <SDL_thread.h>
31#include <SDL_endian.h> 32#include <SDL_endian.h>
32#include <SDL_image.h> 33#include <SDL_image.h>
33#include <SDL_mixer.h> 34#include <SDL_mixer.h>
34#include <SDL_opengl.h> 35#include <SDL_opengl.h>
35 36
587 opengl_fontmap = pango_opengl_font_map_new (); 588 opengl_fontmap = pango_opengl_font_map_new ();
588 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0); 589 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0);
589 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap); 590 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap);
590} 591}
591 592
593char *
594SDL_GetError ()
595
592int 596int
593SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE) 597SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE)
594 598
595void 599void
596SDL_Quit () 600SDL_Quit ()
597 601
598void 602void
599SDL_ListModes () 603SDL_ListModes (int rgb, int alpha)
600 PPCODE: 604 PPCODE:
601{ 605{
602 SDL_Rect **m; 606 SDL_Rect **m;
603 607
604 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 5); 608 SDL_GL_SetAttribute (SDL_GL_RED_SIZE , rgb);
605 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 5); 609 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb);
606 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5); 610 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE , rgb);
607 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 1); 611 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, alpha);
608 612
609 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 613 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
610 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0); 614 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE , 0);
611 615
612 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE, 0); 616 SDL_GL_SetAttribute (SDL_GL_ACCUM_RED_SIZE , 0);
613 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 617 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
614 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE, 0); 618 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0);
615 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 619 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
616 620
617 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 621 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
618#if SDL_VERSION_ATLEAST(1,2,10) 622#if SDL_VERSION_ATLEAST(1,2,10)
619 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1); 623 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1);
620 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1); 624 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1);
621#endif 625#endif
622 626
623 SDL_EnableUNICODE (1);
624 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
625
626 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 627 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
627 628
628 if (m && m != (SDL_Rect **)-1) 629 if (m && m != (SDL_Rect **)-1)
629 while (*m) 630 while (*m)
630 { 631 {
632 if ((*m)->w >= 640 && (*m)->h >= 480)
633 {
631 AV *av = newAV (); 634 AV *av = newAV ();
632 av_push (av, newSViv ((*m)->w)); 635 av_push (av, newSViv ((*m)->w));
633 av_push (av, newSViv ((*m)->h)); 636 av_push (av, newSViv ((*m)->h));
637 av_push (av, newSViv (rgb));
638 av_push (av, newSViv (alpha));
634 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 639 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
640 }
635 641
636 ++m; 642 ++m;
637 } 643 }
638} 644}
639 645
640char *
641SDL_GetError ()
642
643int 646int
644SDL_SetVideoMode (int w, int h, int fullscreen) 647SDL_SetVideoMode (int w, int h, int rgb, int alpha, int fullscreen)
645 CODE: 648 CODE:
649{
650 SDL_EnableUNICODE (1);
651 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
652
653 SDL_GL_SetAttribute (SDL_GL_RED_SIZE , rgb);
654 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb);
655 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE , rgb);
656 SDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, alpha);
657
646 RETVAL = !!SDL_SetVideoMode ( 658 RETVAL = !!SDL_SetVideoMode (
647 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0) 659 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0)
648 ); 660 );
661
649 if (RETVAL) 662 if (RETVAL)
650 { 663 {
651 av_clear (texture_av); 664 av_clear (texture_av);
652 665
653 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 666 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
654# define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 667#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
655# include "glfunc.h" 668#include "glfunc.h"
656# undef GL_FUNC 669#undef GL_FUNC
657
658 } 670 }
671}
659 OUTPUT: 672 OUTPUT:
660 RETVAL 673 RETVAL
661 674
662void 675void
663SDL_GL_SwapBuffers () 676SDL_GL_SwapBuffers ()
664 677
665char * 678char *
666SDL_GetKeyName (int sym) 679SDL_GetKeyName (int sym)
667 680
681int
682SDL_GetAppState ()
683
668void 684void
669SDL_PollEvent () 685poll_events ()
670 PPCODE: 686 PPCODE:
671{ 687{
672 SDL_Event ev; 688 SDL_Event ev;
673 689
674 while (SDL_PollEvent (&ev)) 690 SDL_PumpEvents ();
691 while (SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_ALLEVENTS) > 0)
675 { 692 {
676 HV *hv = newHV (); 693 HV *hv = newHV ();
677 hv_store (hv, "type", 4, newSViv (ev.type), 0); 694 hv_store (hv, "type", 4, newSViv (ev.type), 0);
678 695
679 switch (ev.type) 696 switch (ev.type)
691 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0); 708 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
692 hv_store (hv, "state", 5, newSViv (ev.active.state), 0); 709 hv_store (hv, "state", 5, newSViv (ev.active.state), 0);
693 break; 710 break;
694 711
695 case SDL_MOUSEMOTION: 712 case SDL_MOUSEMOTION:
713 {
714 int state = ev.motion.state;
715 int x = ev.motion.x;
716 int y = ev.motion.y;
717 int xrel = ev.motion.xrel;
718 int yrel = ev.motion.yrel;
719
720 /* do simplistic event compression */
721 while (SDL_PeepEvents (&ev, 1, SDL_PEEKEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION)) > 0
722 && state == ev.motion.state)
723 {
724 xrel += ev.motion.xrel;
725 yrel += ev.motion.yrel;
726 x = ev.motion.x;
727 y = ev.motion.y;
728 SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION));
729 }
730
696 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 731 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0);
697
698 hv_store (hv, "state", 5, newSViv (ev.motion.state), 0); 732 hv_store (hv, "state", 5, newSViv (state), 0);
699 hv_store (hv, "x", 1, newSViv (ev.motion.x), 0); 733 hv_store (hv, "x", 1, newSViv (x), 0);
700 hv_store (hv, "y", 1, newSViv (ev.motion.y), 0); 734 hv_store (hv, "y", 1, newSViv (y), 0);
701 hv_store (hv, "xrel", 4, newSViv (ev.motion.xrel), 0); 735 hv_store (hv, "xrel", 4, newSViv (xrel), 0);
702 hv_store (hv, "yrel", 4, newSViv (ev.motion.yrel), 0); 736 hv_store (hv, "yrel", 4, newSViv (yrel), 0);
737 }
703 break; 738 break;
704 739
705 case SDL_MOUSEBUTTONDOWN: 740 case SDL_MOUSEBUTTONDOWN:
706 case SDL_MOUSEBUTTONUP: 741 case SDL_MOUSEBUTTONUP:
707 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 742 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0);
1220 flags 1255 flags
1221 ); 1256 );
1222 1257
1223MODULE = CFPlus PACKAGE = CFPlus::Texture 1258MODULE = CFPlus PACKAGE = CFPlus::Texture
1224 1259
1225void 1260int minpot (int n)
1226pad2pot (SV *data_, SV *w_, SV *h_)
1227 CODE:
1228{
1229 int ow = SvIV (w_);
1230 int oh = SvIV (h_);
1231 1261
1232 if (ow && oh) 1262void
1263pad (SV *data_, int ow, int oh, int nw, int nh)
1264 CODE:
1265{
1266 if ((nw != ow || nh != oh) && SvOK (data_))
1233 { 1267 {
1234 int nw = minpot (ow);
1235 int nh = minpot (oh);
1236
1237 if (nw != ow || nh != oh)
1238 {
1239 if (SvOK (data_))
1240 {
1241 STRLEN datalen; 1268 STRLEN datalen;
1242 char *data = SvPVbyte (data_, datalen); 1269 char *data = SvPVbyte (data_, datalen);
1243 int bpp = datalen / (ow * oh); 1270 int bpp = datalen / (ow * oh);
1244 SV *result_ = sv_2mortal (newSV (nw * nh * bpp)); 1271 SV *result_ = sv_2mortal (newSV (nw * nh * bpp));
1245 1272
1246 SvPOK_only (result_); 1273 SvPOK_only (result_);
1247 SvCUR_set (result_, nw * nh * bpp); 1274 SvCUR_set (result_, nw * nh * bpp);
1248 1275
1249 memset (SvPVX (result_), 0, nw * nh * bpp); 1276 memset (SvPVX (result_), 0, nw * nh * bpp);
1250 while (oh--) 1277 while (oh--)
1251 memcpy (SvPVX (result_) + oh * nw * bpp, data + oh * ow * bpp, ow * bpp); 1278 memcpy (SvPVX (result_) + oh * nw * bpp, data + oh * ow * bpp, ow * bpp);
1252 1279
1253 sv_setsv (data_, result_); 1280 sv_setsv (data_, result_);
1254 }
1255
1256 sv_setiv (w_, nw);
1257 sv_setiv (h_, nh);
1258 }
1259 } 1281 }
1260} 1282}
1261 1283
1262void 1284void
1263draw_quad (SV *self, float x, float y, float w = 0., float h = 0.) 1285draw_quad (SV *self, float x, float y, float w = 0., float h = 0.)
1305 { 1327 {
1306 glDisable (GL_ALPHA_TEST); 1328 glDisable (GL_ALPHA_TEST);
1307 glDisable (GL_BLEND); 1329 glDisable (GL_BLEND);
1308 } 1330 }
1309} 1331}
1332
1333IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type)
1334 CODE:
1335{
1336 GLint width;
1337 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, 0);
1338 glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
1339 RETVAL = width > 0;
1340}
1341 OUTPUT:
1342 RETVAL
1310 1343
1311MODULE = CFPlus PACKAGE = CFPlus::Map 1344MODULE = CFPlus PACKAGE = CFPlus::Map
1312 1345
1313CFPlus::Map 1346CFPlus::Map
1314new (SV *class) 1347new (SV *class)
1927 glDisable (GL_BLEND); 1960 glDisable (GL_BLEND);
1928 glDisable (GL_TEXTURE_2D); 1961 glDisable (GL_TEXTURE_2D);
1929} 1962}
1930 1963
1931void 1964void
1932fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) 1965fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh, int smoothing, const char *matrix)
1933 PPCODE: 1966 PPCODE:
1934{ 1967{
1935 int x, y; 1968 int x, y;
1936 int sw4 = (sw + 3) & ~3; 1969 int sw4 = (sw + 3) & ~3;
1937 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh)); 1970 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh));
1957 darkness[y * sw4 + x] = cell->darkness 1990 darkness[y * sw4 + x] = cell->darkness
1958 ? 255 - (cell->darkness - 1) 1991 ? 255 - (cell->darkness - 1)
1959 : 255 - FOW_DARKNESS; 1992 : 255 - FOW_DARKNESS;
1960 } 1993 }
1961 } 1994 }
1995
1996 if (smoothing)
1997 {
1998 SV *darkness2_sv = sv_2mortal (newSV (sw4 * sh));
1999 uint8_t *darkness2 = (uint8_t *)SvPVX (darkness2_sv);
2000
2001 SvPOK_only (darkness2_sv);
2002 SvCUR_set (darkness2_sv, sw4 * sh);
2003
2004 for (y = 0; y < sh; ++y)
2005 for (x = 0; x < sw4; ++x)
2006 {
2007 float *f = (float *)matrix;
2008 int dx, dy;
2009 float sum = 0.f;
2010
2011 for (dy = -1; dy <= 1; ++dy)
2012 for (dx = -1; dx <= 1; ++dx)
2013 {
2014 unsigned int x2 = x + dx;
2015 unsigned int y2 = y + dy;
2016
2017 sum += (x2 < sw && y2 < sh ? darkness [y2 * sw4 + x2] : 255) * *f++;
2018 }
2019
2020 darkness2 [y * sw4 + x] = sum > 255. ? 255. : sum;
2021 }
2022
2023 darkness_sv = darkness2_sv;
2024 }
1962 2025
1963 EXTEND (SP, 3); 2026 EXTEND (SP, 3);
1964 PUSHs (sv_2mortal (newSViv (sw4))); 2027 PUSHs (sv_2mortal (newSViv (sw4)));
1965 PUSHs (sv_2mortal (newSViv (sh))); 2028 PUSHs (sv_2mortal (newSViv (sh)));
1966 PUSHs (darkness_sv); 2029 PUSHs (darkness_sv);
2140 CODE: 2203 CODE:
2141 RETVAL = Mix_VolumeMusic (volume); 2204 RETVAL = Mix_VolumeMusic (volume);
2142 OUTPUT: 2205 OUTPUT:
2143 RETVAL 2206 RETVAL
2144 2207
2208int
2209fade_out (int ms)
2210 CODE:
2211 RETVAL = Mix_FadeOutMusic (ms);
2212 OUTPUT:
2213 RETVAL
2214
2145CFPlus::MixMusic 2215CFPlus::MixMusic
2146new_from_file (SV *class, char *path) 2216new_from_file (SV *class, char *path)
2147 CODE: 2217 CODE:
2148 RETVAL = Mix_LoadMUS (path); 2218 RETVAL = Mix_LoadMUS (path);
2149 OUTPUT: 2219 OUTPUT:
2156 2226
2157int 2227int
2158play (CFPlus::MixMusic self, int loops = -1) 2228play (CFPlus::MixMusic self, int loops = -1)
2159 CODE: 2229 CODE:
2160 RETVAL = Mix_PlayMusic (self, loops); 2230 RETVAL = Mix_PlayMusic (self, loops);
2231 OUTPUT:
2232 RETVAL
2233
2234int
2235fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2236 CODE:
2237 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position);
2161 OUTPUT: 2238 OUTPUT:
2162 RETVAL 2239 RETVAL
2163 2240
2164MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2241MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2165 2242
2169 static const struct { 2246 static const struct {
2170 const char *name; 2247 const char *name;
2171 IV iv; 2248 IV iv;
2172 } *civ, const_iv[] = { 2249 } *civ, const_iv[] = {
2173# define const_iv(name) { # name, (IV)name } 2250# define const_iv(name) { # name, (IV)name }
2251 const_iv (GL_VENDOR),
2252 const_iv (GL_VERSION),
2253 const_iv (GL_EXTENSIONS),
2174 const_iv (GL_COLOR_MATERIAL), 2254 const_iv (GL_COLOR_MATERIAL),
2175 const_iv (GL_SMOOTH), 2255 const_iv (GL_SMOOTH),
2176 const_iv (GL_FLAT), 2256 const_iv (GL_FLAT),
2177 const_iv (GL_DITHER), 2257 const_iv (GL_DITHER),
2178 const_iv (GL_BLEND), 2258 const_iv (GL_BLEND),
2205 const_iv (GL_LUMINANCE), 2285 const_iv (GL_LUMINANCE),
2206 const_iv (GL_LUMINANCE_ALPHA), 2286 const_iv (GL_LUMINANCE_ALPHA),
2207 const_iv (GL_FLOAT), 2287 const_iv (GL_FLOAT),
2208 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2288 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2209 const_iv (GL_COMPILE), 2289 const_iv (GL_COMPILE),
2290 const_iv (GL_PROXY_TEXTURE_1D),
2291 const_iv (GL_PROXY_TEXTURE_2D),
2210 const_iv (GL_TEXTURE_1D), 2292 const_iv (GL_TEXTURE_1D),
2211 const_iv (GL_TEXTURE_2D), 2293 const_iv (GL_TEXTURE_2D),
2212 const_iv (GL_TEXTURE_ENV), 2294 const_iv (GL_TEXTURE_ENV),
2213 const_iv (GL_TEXTURE_MAG_FILTER), 2295 const_iv (GL_TEXTURE_MAG_FILTER),
2214 const_iv (GL_TEXTURE_MIN_FILTER), 2296 const_iv (GL_TEXTURE_MIN_FILTER),
2280 CODE: 2362 CODE:
2281 RETVAL = (char *)glGetString (GL_EXTENSIONS); 2363 RETVAL = (char *)glGetString (GL_EXTENSIONS);
2282 OUTPUT: 2364 OUTPUT:
2283 RETVAL 2365 RETVAL
2284 2366
2367const char *glGetString (GLenum pname)
2368
2369GLint glGetInteger (GLenum pname)
2370 CODE:
2371 glGetIntegerv (pname, &RETVAL);
2372 OUTPUT:
2373 RETVAL
2374
2375GLdouble glGetDouble (GLenum pname)
2376 CODE:
2377 glGetDoublev (pname, &RETVAL);
2378 OUTPUT:
2379 RETVAL
2380
2285int glGetError () 2381int glGetError ()
2286 2382
2287void glFinish () 2383void glFinish ()
2288 2384
2289void glClear (int mask) 2385void glClear (int mask)
2411 2507
2412void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 2508void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
2413 2509
2414void glDrawPixels (int width, int height, int format, int type, char *pixels) 2510void glDrawPixels (int width, int height, int format, int type, char *pixels)
2415 2511
2512void glPixelZoom (float x, float y)
2513
2416void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR) 2514void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
2417 2515
2418int glGenTexture () 2516int glGenTexture ()
2419 CODE: 2517 CODE:
2420 RETVAL = gen_texture (); 2518 RETVAL = gen_texture ();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines