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.194 by root, Thu Jul 12 17:56:50 2007 UTC vs.
Revision 1.202 by root, Tue Jul 17 18:34:24 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
1260int minpot (int n)
1261
1225void 1262void
1226pad2pot (SV *data_, SV *w_, SV *h_) 1263pad2pot (SV *data_, SV *w_, SV *h_)
1227 CODE: 1264 CODE:
1228{ 1265{
1229 int ow = SvIV (w_); 1266 int ow = SvIV (w_);
1305 { 1342 {
1306 glDisable (GL_ALPHA_TEST); 1343 glDisable (GL_ALPHA_TEST);
1307 glDisable (GL_BLEND); 1344 glDisable (GL_BLEND);
1308 } 1345 }
1309} 1346}
1347
1348IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type)
1349 CODE:
1350{
1351 GLint width;
1352 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, 0);
1353 glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
1354 RETVAL = width > 0;
1355}
1356 OUTPUT:
1357 RETVAL
1310 1358
1311MODULE = CFPlus PACKAGE = CFPlus::Map 1359MODULE = CFPlus PACKAGE = CFPlus::Map
1312 1360
1313CFPlus::Map 1361CFPlus::Map
1314new (SV *class) 1362new (SV *class)
1927 glDisable (GL_BLEND); 1975 glDisable (GL_BLEND);
1928 glDisable (GL_TEXTURE_2D); 1976 glDisable (GL_TEXTURE_2D);
1929} 1977}
1930 1978
1931void 1979void
1932fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) 1980fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh, int smoothing, const char *matrix)
1933 PPCODE: 1981 PPCODE:
1934{ 1982{
1935 int x, y; 1983 int x, y;
1936 int sw4 = (sw + 3) & ~3; 1984 int sw4 = (sw + 3) & ~3;
1937 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh)); 1985 SV *darkness_sv = sv_2mortal (newSV (sw4 * sh));
1957 darkness[y * sw4 + x] = cell->darkness 2005 darkness[y * sw4 + x] = cell->darkness
1958 ? 255 - (cell->darkness - 1) 2006 ? 255 - (cell->darkness - 1)
1959 : 255 - FOW_DARKNESS; 2007 : 255 - FOW_DARKNESS;
1960 } 2008 }
1961 } 2009 }
2010
2011 if (smoothing)
2012 {
2013 SV *darkness2_sv = sv_2mortal (newSV (sw4 * sh));
2014 uint8_t *darkness2 = (uint8_t *)SvPVX (darkness2_sv);
2015
2016 SvPOK_only (darkness2_sv);
2017 SvCUR_set (darkness2_sv, sw4 * sh);
2018
2019 for (y = 0; y < sh; ++y)
2020 for (x = 0; x < sw4; ++x)
2021 {
2022 float *f = (float *)matrix;
2023 int dx, dy;
2024 float sum = 0.f;
2025
2026 for (dy = -1; dy <= 1; ++dy)
2027 for (dx = -1; dx <= 1; ++dx)
2028 {
2029 unsigned int x2 = x + dx;
2030 unsigned int y2 = y + dy;
2031
2032 sum += (x2 < sw && y2 < sh ? darkness [y2 * sw4 + x2] : 255) * *f++;
2033 }
2034
2035 darkness2 [y * sw4 + x] = sum > 255. ? 255. : sum;
2036 }
2037
2038 darkness_sv = darkness2_sv;
2039 }
1962 2040
1963 EXTEND (SP, 3); 2041 EXTEND (SP, 3);
1964 PUSHs (sv_2mortal (newSViv (sw4))); 2042 PUSHs (sv_2mortal (newSViv (sw4)));
1965 PUSHs (sv_2mortal (newSViv (sh))); 2043 PUSHs (sv_2mortal (newSViv (sh)));
1966 PUSHs (darkness_sv); 2044 PUSHs (darkness_sv);
2166 CODE: 2244 CODE:
2167 RETVAL = Mix_PlayMusic (self, loops); 2245 RETVAL = Mix_PlayMusic (self, loops);
2168 OUTPUT: 2246 OUTPUT:
2169 RETVAL 2247 RETVAL
2170 2248
2249int
2250fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2251 CODE:
2252 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position);
2253 OUTPUT:
2254 RETVAL
2255
2171MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2256MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2172 2257
2173BOOT: 2258BOOT:
2174{ 2259{
2175 HV *stash = gv_stashpv ("CFPlus::OpenGL", 1); 2260 HV *stash = gv_stashpv ("CFPlus::OpenGL", 1);
2176 static const struct { 2261 static const struct {
2177 const char *name; 2262 const char *name;
2178 IV iv; 2263 IV iv;
2179 } *civ, const_iv[] = { 2264 } *civ, const_iv[] = {
2180# define const_iv(name) { # name, (IV)name } 2265# define const_iv(name) { # name, (IV)name }
2266 const_iv (GL_VENDOR),
2267 const_iv (GL_VERSION),
2268 const_iv (GL_EXTENSIONS),
2181 const_iv (GL_COLOR_MATERIAL), 2269 const_iv (GL_COLOR_MATERIAL),
2182 const_iv (GL_SMOOTH), 2270 const_iv (GL_SMOOTH),
2183 const_iv (GL_FLAT), 2271 const_iv (GL_FLAT),
2184 const_iv (GL_DITHER), 2272 const_iv (GL_DITHER),
2185 const_iv (GL_BLEND), 2273 const_iv (GL_BLEND),
2212 const_iv (GL_LUMINANCE), 2300 const_iv (GL_LUMINANCE),
2213 const_iv (GL_LUMINANCE_ALPHA), 2301 const_iv (GL_LUMINANCE_ALPHA),
2214 const_iv (GL_FLOAT), 2302 const_iv (GL_FLOAT),
2215 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2303 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2216 const_iv (GL_COMPILE), 2304 const_iv (GL_COMPILE),
2305 const_iv (GL_PROXY_TEXTURE_1D),
2306 const_iv (GL_PROXY_TEXTURE_2D),
2217 const_iv (GL_TEXTURE_1D), 2307 const_iv (GL_TEXTURE_1D),
2218 const_iv (GL_TEXTURE_2D), 2308 const_iv (GL_TEXTURE_2D),
2219 const_iv (GL_TEXTURE_ENV), 2309 const_iv (GL_TEXTURE_ENV),
2220 const_iv (GL_TEXTURE_MAG_FILTER), 2310 const_iv (GL_TEXTURE_MAG_FILTER),
2221 const_iv (GL_TEXTURE_MIN_FILTER), 2311 const_iv (GL_TEXTURE_MIN_FILTER),
2287 CODE: 2377 CODE:
2288 RETVAL = (char *)glGetString (GL_EXTENSIONS); 2378 RETVAL = (char *)glGetString (GL_EXTENSIONS);
2289 OUTPUT: 2379 OUTPUT:
2290 RETVAL 2380 RETVAL
2291 2381
2382const char *glGetString (GLenum pname)
2383
2384GLint glGetInteger (GLenum pname)
2385 CODE:
2386 glGetIntegerv (pname, &RETVAL);
2387 OUTPUT:
2388 RETVAL
2389
2390GLdouble glGetDouble (GLenum pname)
2391 CODE:
2392 glGetDoublev (pname, &RETVAL);
2393 OUTPUT:
2394 RETVAL
2395
2292int glGetError () 2396int glGetError ()
2293 2397
2294void glFinish () 2398void glFinish ()
2295 2399
2296void glClear (int mask) 2400void glClear (int mask)
2418 2522
2419void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 2523void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
2420 2524
2421void glDrawPixels (int width, int height, int format, int type, char *pixels) 2525void glDrawPixels (int width, int height, int format, int type, char *pixels)
2422 2526
2527void glPixelZoom (float x, float y)
2528
2423void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR) 2529void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
2424 2530
2425int glGenTexture () 2531int glGenTexture ()
2426 CODE: 2532 CODE:
2427 RETVAL = gen_texture (); 2533 RETVAL = gen_texture ();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines