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.224 by root, Sat Aug 11 11:21:46 2007 UTC vs.
Revision 1.270 by root, Sun Jul 20 15:05:13 2008 UTC

46 46
47#include <glib/gmacros.h> 47#include <glib/gmacros.h>
48 48
49#include <pango/pango.h> 49#include <pango/pango.h>
50 50
51#ifndef PANGO_VERSION_CHECK
52# define PANGO_VERSION_CHECK(a,b,c) 0
53#endif
54
55#if !PANGO_VERSION_CHECK (1, 15, 2)
56# define pango_layout_get_line_readonly pango_layout_get_line
57# define pango_layout_get_lines_readonly pango_layout_get_lines
58# define pango_layout_iter_get_line_readonly pango_layout_iter_get_line
59# define pango_layout_iter_get_run_readonly pango_layout_iter_get_run
60#endif
61
51#ifndef _WIN32 62#ifndef _WIN32
52# include <sys/types.h> 63# include <sys/types.h>
53# include <sys/socket.h> 64# include <sys/socket.h>
54# include <netinet/in.h> 65# include <netinet/in.h>
55# include <netinet/tcp.h> 66# include <netinet/tcp.h>
56# include <inttypes.h> 67# include <inttypes.h>
57#endif 68#endif
58 69
70#if __GNUC__ >= 4
71# define expect(expr,value) __builtin_expect ((expr),(value))
72#else
73# define expect(expr,value) (expr)
74#endif
75
76#define expect_false(expr) expect ((expr) != 0, 0)
77#define expect_true(expr) expect ((expr) != 0, 1)
78
59#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */ 79#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */
60 80
61#define FOW_DARKNESS 32 81#define FOW_DARKNESS 32
62 82
63#define MAP_EXTEND_X 32 83#define MAP_EXTEND_X 32
64#define MAP_EXTEND_Y 512 84#define MAP_EXTEND_Y 512
65 85
66#define MIN_FONT_HEIGHT 10 86#define MIN_FONT_HEIGHT 10
67 87
68#if 0 88/* mask out modifiers we are not interested in */
69# define PARACHUTE SDL_INIT_NOPARACHUTE 89#define MOD_MASK (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META)
70#else
71# define PARACHUTE 0
72#endif
73 90
74static AV *texture_av; 91static AV *texture_av;
75 92
76static struct 93static struct
77{ 94{
120 137
121#include "pango-font.c" 138#include "pango-font.c"
122#include "pango-fontmap.c" 139#include "pango-fontmap.c"
123#include "pango-render.c" 140#include "pango-render.c"
124 141
125typedef IV CFPlus__Channel; 142typedef IV DC__Channel;
126typedef SDL_RWops *CFPlus__RW; 143typedef SDL_RWops *DC__RW;
127typedef Mix_Chunk *CFPlus__MixChunk; 144typedef Mix_Chunk *DC__MixChunk;
128typedef Mix_Music *CFPlus__MixMusic; 145typedef Mix_Music *DC__MixMusic;
129 146
130typedef PangoFontDescription *CFPlus__Font; 147typedef PangoFontDescription *DC__Font;
131 148
132static int 149static int
133shape_attr_p (PangoLayoutRun *run) 150shape_attr_p (PangoLayoutRun *run)
134{ 151{
135 GSList *attrs = run->item->analysis.extra_attrs; 152 GSList *attrs = run->item->analysis.extra_attrs;
149 166
150typedef struct cf_layout { 167typedef struct cf_layout {
151 PangoLayout *pl; 168 PangoLayout *pl;
152 float r, g, b, a; // default color for rgba mode 169 float r, g, b, a; // default color for rgba mode
153 int base_height; 170 int base_height;
154 CFPlus__Font font; 171 DC__Font font;
172 rc_t *rc;
155} *CFPlus__Layout; 173} *DC__Layout;
156 174
157static CFPlus__Font default_font; 175static DC__Font default_font;
158static PangoContext *opengl_context; 176static PangoContext *opengl_context;
159static PangoFontMap *opengl_fontmap; 177static PangoFontMap *opengl_fontmap;
160 178
161static void 179static void
162substitute_func (FcPattern *pattern, gpointer data) 180substitute_func (FcPattern *pattern, gpointer data)
167#endif 185#endif
168 FcPatternAddBool (pattern, FC_AUTOHINT, 0); 186 FcPatternAddBool (pattern, FC_AUTOHINT, 0);
169} 187}
170 188
171static void 189static void
172layout_update_font (CFPlus__Layout self) 190layout_update_font (DC__Layout self)
173{ 191{
174 /* use a random scale factor to account for unknown descenders, 0.8 works 192 /* use a random scale factor to account for unknown descenders, 0.8 works
175 * reasonably well with bitstream vera 193 * reasonably well with dejavu/bistream fonts
176 */ 194 */
177 PangoFontDescription *font = self->font ? self->font : default_font; 195 PangoFontDescription *font = self->font ? self->font : default_font;
178 196
179 pango_font_description_set_absolute_size (font, 197 pango_font_description_set_absolute_size (font,
180 MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10)); 198 MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10));
181 199
182 pango_layout_set_font_description (self->pl, font); 200 pango_layout_set_font_description (self->pl, font);
183} 201}
184 202
185static void 203static void
186layout_get_pixel_size (CFPlus__Layout self, int *w, int *h) 204layout_get_pixel_size (DC__Layout self, int *w, int *h)
187{ 205{
188 PangoRectangle rect; 206 PangoRectangle rect;
189 207
190 // get_pixel_* wrongly rounds down 208 // get_pixel_* wrongly rounds down
191 pango_layout_get_extents (self->pl, 0, &rect); 209 pango_layout_get_extents (self->pl, 0, &rect);
202 220
203typedef uint16_t tileid; 221typedef uint16_t tileid;
204typedef uint16_t faceid; 222typedef uint16_t faceid;
205 223
206typedef struct { 224typedef struct {
207 int name; 225 GLuint name;
208 int w, h; 226 int w, h;
209 float s, t; 227 float s, t;
210 uint8_t r, g, b, a; 228 uint8_t r, g, b, a;
211 tileid smoothtile; 229 tileid smoothtile;
212 uint8_t smoothlevel; 230 uint8_t smoothlevel;
230 int faces; tileid *face2tile; // [faceid] 248 int faces; tileid *face2tile; // [faceid]
231 int texs; maptex *tex; // [tileid] 249 int texs; maptex *tex; // [tileid]
232 250
233 int32_t rows; 251 int32_t rows;
234 maprow *row; 252 maprow *row;
235} *CFPlus__Map; 253} *DC__Map;
236 254
237static char * 255static char *
238prepend (char *ptr, int sze, int inc) 256prepend (char *ptr, int sze, int inc)
239{ 257{
240 char *p; 258 char *p;
278 self->texs *= 2; 296 self->texs *= 2;
279 } 297 }
280} 298}
281 299
282static maprow * 300static maprow *
283map_get_row (CFPlus__Map self, int y) 301map_get_row (DC__Map self, int y)
284{ 302{
285 if (0 > y) 303 if (0 > y)
286 { 304 {
287 int extend = - y + MAP_EXTEND_Y; 305 int extend = - y + MAP_EXTEND_Y;
288 Prepend (maprow, self->row, self->rows, extend); 306 Prepend (maprow, self->row, self->rows, extend);
326 344
327 return row->col + (x - row->c0); 345 return row->col + (x - row->c0);
328} 346}
329 347
330static mapcell * 348static mapcell *
331map_get_cell (CFPlus__Map self, int x, int y) 349map_get_cell (DC__Map self, int x, int y)
332{ 350{
333 return row_get_cell (map_get_row (self, y), x); 351 return row_get_cell (map_get_row (self, y), x);
334} 352}
335 353
336static void 354static void
337map_clear (CFPlus__Map self) 355map_clear (DC__Map self)
338{ 356{
339 int r; 357 int r;
340 358
341 for (r = 0; r < self->rows; r++) 359 for (r = 0; r < self->rows; r++)
342 Safefree (self->row[r].col); 360 Safefree (self->row[r].col);
349 self->oy = 0; 367 self->oy = 0;
350 self->row = 0; 368 self->row = 0;
351 self->rows = 0; 369 self->rows = 0;
352} 370}
353 371
372#define CELL_CLEAR(cell) \
373 do { \
374 if ((cell)->player) \
375 (cell)->tile [2] = 0; \
376 (cell)->darkness = 0; \
377 (cell)->stat_hp = 0; \
378 (cell)->flags = 0; \
379 (cell)->player = 0; \
380 } while (0)
381
354static void 382static void
355map_blank (CFPlus__Map self, int x0, int y0, int w, int h) 383map_blank (DC__Map self, int x0, int y0, int w, int h)
356{ 384{
357 int x, y; 385 int x, y;
358 maprow *row; 386 maprow *row;
359 mapcell *cell; 387 mapcell *cell;
360 388
372 if (x >= row->c1) 400 if (x >= row->c1)
373 break; 401 break;
374 402
375 cell = row->col + x - row->c0; 403 cell = row->col + x - row->c0;
376 404
377 cell->darkness = 0; 405 CELL_CLEAR (cell);
378 cell->stat_hp = 0;
379 cell->flags = 0;
380 cell->player = 0;
381 } 406 }
382 } 407 }
383} 408}
384 409
385typedef struct { 410typedef struct {
439 n |= n >> 16; 464 n |= n >> 16;
440 465
441 return n + 1; 466 return n + 1;
442} 467}
443 468
469static unsigned int
470popcount (unsigned int n)
471{
472 n -= (n >> 1) & 0x55555555U;
473 n = ((n >> 2) & 0x33333333U) + (n & 0x33333333U);
474 n = ((n >> 4) + n) & 0x0f0f0f0fU;
475 n *= 0x01010101U;
476
477 return n >> 24;
478}
479
444/* SDL should provide this, really. */ 480/* SDL should provide this, really. */
445#define SDLK_MODIFIER_MIN 300 481#define SDLK_MODIFIER_MIN 300
446#define SDLK_MODIFIER_MAX 314 482#define SDLK_MODIFIER_MAX 314
447 483
448/******************************************************************************/ 484/******************************************************************************/
486 return 0; 522 return 0;
487 523
488 return 1; 524 return 1;
489} 525}
490 526
491MODULE = CFPlus PACKAGE = CFPlus 527MODULE = Deliantra::Client PACKAGE = DC
492 528
493PROTOTYPES: ENABLE 529PROTOTYPES: ENABLE
494 530
495BOOT: 531BOOT:
496{ 532{
497 HV *stash = gv_stashpv ("CFPlus", 1); 533 HV *stash = gv_stashpv ("DC", 1);
498 static const struct { 534 static const struct {
499 const char *name; 535 const char *name;
500 IV iv; 536 IV iv;
501 } *civ, const_iv[] = { 537 } *civ, const_iv[] = {
502# define const_iv(name) { # name, (IV)name } 538# define const_iv(name) { # name, (IV)name }
524 560
525 const_iv (SDL_APPINPUTFOCUS), 561 const_iv (SDL_APPINPUTFOCUS),
526 const_iv (SDL_APPMOUSEFOCUS), 562 const_iv (SDL_APPMOUSEFOCUS),
527 const_iv (SDL_APPACTIVE), 563 const_iv (SDL_APPACTIVE),
528 564
565 const_iv (SDLK_FIRST),
566 const_iv (SDLK_LAST),
529 const_iv (SDLK_KP0), 567 const_iv (SDLK_KP0),
530 const_iv (SDLK_KP1), 568 const_iv (SDLK_KP1),
531 const_iv (SDLK_KP2), 569 const_iv (SDLK_KP2),
532 const_iv (SDLK_KP3), 570 const_iv (SDLK_KP3),
533 const_iv (SDLK_KP4), 571 const_iv (SDLK_KP4),
605 const_iv (KMOD_LMETA), 643 const_iv (KMOD_LMETA),
606 const_iv (KMOD_RMETA), 644 const_iv (KMOD_RMETA),
607 const_iv (KMOD_NUM), 645 const_iv (KMOD_NUM),
608 const_iv (KMOD_CAPS), 646 const_iv (KMOD_CAPS),
609 const_iv (KMOD_MODE), 647 const_iv (KMOD_MODE),
648
649 const_iv (MIX_DEFAULT_FORMAT),
650
651 const_iv (SDL_INIT_TIMER),
652 const_iv (SDL_INIT_AUDIO),
653 const_iv (SDL_INIT_VIDEO),
654 const_iv (SDL_INIT_CDROM),
655 const_iv (SDL_INIT_JOYSTICK),
656 const_iv (SDL_INIT_EVERYTHING),
657 const_iv (SDL_INIT_NOPARACHUTE),
658 const_iv (SDL_INIT_EVENTTHREAD),
659
660 const_iv (SDL_GL_RED_SIZE),
661 const_iv (SDL_GL_GREEN_SIZE),
662 const_iv (SDL_GL_BLUE_SIZE),
663 const_iv (SDL_GL_ALPHA_SIZE),
664 const_iv (SDL_GL_DOUBLEBUFFER),
665 const_iv (SDL_GL_BUFFER_SIZE),
666 const_iv (SDL_GL_DEPTH_SIZE),
667 const_iv (SDL_GL_STENCIL_SIZE),
668 const_iv (SDL_GL_ACCUM_RED_SIZE),
669 const_iv (SDL_GL_ACCUM_GREEN_SIZE),
670 const_iv (SDL_GL_ACCUM_BLUE_SIZE),
671 const_iv (SDL_GL_ACCUM_ALPHA_SIZE),
672 const_iv (SDL_GL_STEREO),
673 const_iv (SDL_GL_MULTISAMPLEBUFFERS),
674 const_iv (SDL_GL_MULTISAMPLESAMPLES),
675 const_iv (SDL_GL_ACCELERATED_VISUAL),
676 const_iv (SDL_GL_SWAP_CONTROL),
677
678 const_iv (FOW_DARKNESS)
610# undef const_iv 679# undef const_iv
611 }; 680 };
612 681
613 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 682 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
614 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 683 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
632 701
633NV floor (NV x) 702NV floor (NV x)
634 703
635NV ceil (NV x) 704NV ceil (NV x)
636 705
706NV ceilabs (NV x)
707 CODE:
708 RETVAL = x < 0. ? - ceil (-x) : ceil (x);
709 OUTPUT:
710 RETVAL
711
712IV minpot (UV n)
713
714IV popcount (UV n)
715
637void 716void
638pango_init () 717pango_init ()
639 CODE: 718 CODE:
640{ 719{
641 opengl_fontmap = pango_opengl_font_map_new (); 720 opengl_fontmap = pango_opengl_font_map_new ();
642 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0); 721 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0);
643 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap); 722 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap);
723 /*pango_context_set_font_description (opengl_context, default_font);*/
724#if PANGO_VERSION_CHECK (1, 15, 2)
725 pango_context_set_language (opengl_context, pango_language_from_string ("en"));
726 /*pango_context_set_base_dir (opengl_context, PANGO_DIRECTION_WEAK_LTR);*/
727#endif
644} 728}
645 729
646char *
647SDL_GetError () 730char *SDL_GetError ()
648 731
649int 732int SDL_Init (U32 flags)
650SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE)
651 733
652void 734int SDL_InitSubSystem (U32 flags)
735
736void SDL_QuitSubSystem (U32 flags)
737
653SDL_Quit () 738void SDL_Quit ()
739
740int SDL_GL_SetAttribute (int attr, int value)
741
742int SDL_GL_GetAttribute (int attr)
743 CODE:
744 if (SDL_GL_GetAttribute (attr, &RETVAL))
745 XSRETURN_UNDEF;
746 OUTPUT:
747 RETVAL
654 748
655void 749void
656SDL_ListModes (int rgb, int alpha) 750SDL_ListModes (int rgb, int alpha)
657 PPCODE: 751 PPCODE:
658{ 752{
670 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 764 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
671 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0); 765 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0);
672 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 766 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
673 767
674 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 768 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
675#if SDL_VERSION_ATLEAST(1,2,10)
676 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1);
677 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1); 769 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1);
678#endif
679 770
680 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 771 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
681 772
682 if (m && m != (SDL_Rect **)-1) 773 if (m && m != (SDL_Rect **)-1)
683 while (*m) 774 while (*m)
684 { 775 {
685 if ((*m)->w >= 640 && (*m)->h >= 480) 776 if ((*m)->w >= 400 && (*m)->h >= 300)
686 { 777 {
687 AV *av = newAV (); 778 AV *av = newAV ();
688 av_push (av, newSViv ((*m)->w)); 779 av_push (av, newSViv ((*m)->w));
689 av_push (av, newSViv ((*m)->h)); 780 av_push (av, newSViv ((*m)->h));
690 av_push (av, newSViv (rgb)); 781 av_push (av, newSViv (rgb));
714 805
715 if (RETVAL) 806 if (RETVAL)
716 { 807 {
717 av_clear (texture_av); 808 av_clear (texture_av);
718 809
719 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 810 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
720#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 811#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
721#include "glfunc.h" 812#include "glfunc.h"
722#undef GL_FUNC 813#undef GL_FUNC
723 } 814 }
724} 815}
731char * 822char *
732SDL_GetKeyName (int sym) 823SDL_GetKeyName (int sym)
733 824
734int 825int
735SDL_GetAppState () 826SDL_GetAppState ()
827
828int
829SDL_GetModState ()
736 830
737void 831void
738poll_events () 832poll_events ()
739 PPCODE: 833 PPCODE:
740{ 834{
750 { 844 {
751 case SDL_KEYDOWN: 845 case SDL_KEYDOWN:
752 case SDL_KEYUP: 846 case SDL_KEYUP:
753 hv_store (hv, "state", 5, newSViv (ev.key.state), 0); 847 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
754 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0); 848 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0);
755 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod), 0); 849 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod & MOD_MASK), 0);
756 hv_store (hv, "cmod", 4, newSViv (SDL_GetModState ()), 0); /* current mode */ 850 hv_store (hv, "cmod", 4, newSViv (SDL_GetModState () & MOD_MASK), 0); /* current mode */
757 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0); 851 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0);
758 break; 852 break;
759 853
760 case SDL_ACTIVEEVENT: 854 case SDL_ACTIVEEVENT:
761 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0); 855 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
779 x = ev.motion.x; 873 x = ev.motion.x;
780 y = ev.motion.y; 874 y = ev.motion.y;
781 SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION)); 875 SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION));
782 } 876 }
783 877
784 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 878 hv_store (hv, "mod", 3, newSViv (SDL_GetModState () & MOD_MASK), 0);
785 hv_store (hv, "state", 5, newSViv (state), 0); 879 hv_store (hv, "state", 5, newSViv (state), 0);
786 hv_store (hv, "x", 1, newSViv (x), 0); 880 hv_store (hv, "x", 1, newSViv (x), 0);
787 hv_store (hv, "y", 1, newSViv (y), 0); 881 hv_store (hv, "y", 1, newSViv (y), 0);
788 hv_store (hv, "xrel", 4, newSViv (xrel), 0); 882 hv_store (hv, "xrel", 4, newSViv (xrel), 0);
789 hv_store (hv, "yrel", 4, newSViv (yrel), 0); 883 hv_store (hv, "yrel", 4, newSViv (yrel), 0);
790 } 884 }
791 break; 885 break;
792 886
793 case SDL_MOUSEBUTTONDOWN: 887 case SDL_MOUSEBUTTONDOWN:
794 case SDL_MOUSEBUTTONUP: 888 case SDL_MOUSEBUTTONUP:
795 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 889 hv_store (hv, "mod", 3, newSViv (SDL_GetModState () & MOD_MASK), 0);
796 890
797 hv_store (hv, "button", 6, newSViv (ev.button.button), 0); 891 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
798 hv_store (hv, "state", 5, newSViv (ev.button.state), 0); 892 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
799 hv_store (hv, "x", 1, newSViv (ev.button.x), 0); 893 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
800 hv_store (hv, "y", 1, newSViv (ev.button.y), 0); 894 hv_store (hv, "y", 1, newSViv (ev.button.y), 0);
805 hv_store (hv, "data1", 5, newSViv ((IV)ev.user.data1), 0); 899 hv_store (hv, "data1", 5, newSViv ((IV)ev.user.data1), 0);
806 hv_store (hv, "data2", 5, newSViv ((IV)ev.user.data2), 0); 900 hv_store (hv, "data2", 5, newSViv ((IV)ev.user.data2), 0);
807 break; 901 break;
808 } 902 }
809 903
810 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("CFPlus::UI::Event", 1)))); 904 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1))));
811 } 905 }
812} 906}
813 907
814int 908int
815Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 1024) 909Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096)
816 POSTCALL: 910 POSTCALL:
817 Mix_HookMusicFinished (music_finished); 911 Mix_HookMusicFinished (music_finished);
818 Mix_ChannelFinished (channel_finished); 912 Mix_ChannelFinished (channel_finished);
913
914void
915Mix_QuerySpec ()
916 PPCODE:
917{
918 int freq, channels;
919 Uint16 format;
920
921 if (Mix_QuerySpec (&freq, &format, &channels))
922 {
923 EXTEND (SP, 3);
924 PUSHs (sv_2mortal (newSViv (freq)));
925 PUSHs (sv_2mortal (newSViv (format)));
926 PUSHs (sv_2mortal (newSViv (channels)));
927 }
928}
819 929
820void 930void
821Mix_CloseAudio () 931Mix_CloseAudio ()
822 932
823int 933int
858 } 968 }
859 } 969 }
860#endif 970#endif
861} 971}
862 972
863void 973int
864add_font (char *file) 974add_font (char *file)
865 CODE: 975 CODE:
866 FcConfigAppFontAddFile (0, (const FcChar8 *)file); 976 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file);
977 OUTPUT:
978 RETVAL
867 979
868void 980void
869load_image_inline (SV *image_) 981load_image_inline (SV *image_)
870 ALIAS: 982 ALIAS:
871 load_image_file = 1 983 load_image_file = 1
957void 1069void
958error (char *message) 1070error (char *message)
959 CODE: 1071 CODE:
960 fprintf (stderr, "ERROR: %s\n", message); 1072 fprintf (stderr, "ERROR: %s\n", message);
961#ifdef _WIN32 1073#ifdef _WIN32
962 MessageBox (0, message, "Crossfire+ Error", MB_OK | MB_ICONERROR); 1074 MessageBox (0, message, "Deliantra Client Error", MB_OK | MB_ICONERROR);
963#endif 1075#endif
964 1076
965void 1077void
966fatal (char *message) 1078fatal (char *message)
967 CODE: 1079 CODE:
968 fprintf (stderr, "FATAL: %s\n", message); 1080 fprintf (stderr, "FATAL: %s\n", message);
969#ifdef _WIN32 1081#ifdef _WIN32
970 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR); 1082 MessageBox (0, message, "Deliantra Client Fatal Error", MB_OK | MB_ICONERROR);
971#endif 1083#endif
972 _exit (1); 1084 _exit (1);
973 1085
974void 1086void
975_exit (int retval = 0) 1087_exit (int retval = 0)
987#if DEBUG 1099#if DEBUG
988 VALGRIND_DO_LEAK_CHECK; 1100 VALGRIND_DO_LEAK_CHECK;
989#endif 1101#endif
990} 1102}
991 1103
992MODULE = CFPlus PACKAGE = CFPlus::Font 1104MODULE = Deliantra::Client PACKAGE = DC::Font
993 1105
994PROTOTYPES: DISABLE 1106PROTOTYPES: DISABLE
995 1107
996CFPlus::Font 1108DC::Font
997new_from_file (SV *class, char *path, int id = 0) 1109new_from_file (SV *class, char *path, int id = 0)
998 CODE: 1110 CODE:
999{ 1111{
1000 int count; 1112 int count;
1001 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count); 1113 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count);
1004} 1116}
1005 OUTPUT: 1117 OUTPUT:
1006 RETVAL 1118 RETVAL
1007 1119
1008void 1120void
1009DESTROY (CFPlus::Font self) 1121DESTROY (DC::Font self)
1010 CODE: 1122 CODE:
1011 pango_font_description_free (self); 1123 pango_font_description_free (self);
1012 1124
1013void 1125void
1014make_default (CFPlus::Font self) 1126make_default (DC::Font self)
1015 PROTOTYPE: $ 1127 PROTOTYPE: $
1016 CODE: 1128 CODE:
1017 default_font = self; 1129 default_font = self;
1018 1130
1019MODULE = CFPlus PACKAGE = CFPlus::Layout 1131MODULE = Deliantra::Client PACKAGE = DC::Layout
1020 1132
1021PROTOTYPES: DISABLE 1133PROTOTYPES: DISABLE
1022 1134
1023void 1135void
1024reset_glyph_cache () 1136glyph_cache_backup ()
1025 PROTOTYPE: 1137 PROTOTYPE:
1026 CODE: 1138 CODE:
1139 tc_backup ();
1140
1141void
1142glyph_cache_restore ()
1143 PROTOTYPE:
1144 CODE:
1027 tc_clear (); 1145 tc_restore ();
1028 1146
1029CFPlus::Layout 1147DC::Layout
1030new (SV *class) 1148new (SV *class)
1031 CODE: 1149 CODE:
1032 New (0, RETVAL, 1, struct cf_layout); 1150 New (0, RETVAL, 1, struct cf_layout);
1033 1151
1034 RETVAL->pl = pango_layout_new (opengl_context); 1152 RETVAL->pl = pango_layout_new (opengl_context);
1036 RETVAL->g = 1.; 1154 RETVAL->g = 1.;
1037 RETVAL->b = 1.; 1155 RETVAL->b = 1.;
1038 RETVAL->a = 1.; 1156 RETVAL->a = 1.;
1039 RETVAL->base_height = MIN_FONT_HEIGHT; 1157 RETVAL->base_height = MIN_FONT_HEIGHT;
1040 RETVAL->font = 0; 1158 RETVAL->font = 0;
1159 RETVAL->rc = rc_alloc ();
1041 1160
1042 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 1161 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
1043 layout_update_font (RETVAL); 1162 layout_update_font (RETVAL);
1044 OUTPUT: 1163 OUTPUT:
1045 RETVAL 1164 RETVAL
1046 1165
1047void 1166void
1048DESTROY (CFPlus::Layout self) 1167DESTROY (DC::Layout self)
1049 CODE: 1168 CODE:
1050 g_object_unref (self->pl); 1169 g_object_unref (self->pl);
1170 rc_free (self->rc);
1051 Safefree (self); 1171 Safefree (self);
1052 1172
1053void 1173void
1054set_text (CFPlus::Layout self, SV *text_) 1174set_text (DC::Layout self, SV *text_)
1055 CODE: 1175 CODE:
1056{ 1176{
1057 STRLEN textlen; 1177 STRLEN textlen;
1058 char *text = SvPVutf8 (text_, textlen); 1178 char *text = SvPVutf8 (text_, textlen);
1059 1179
1060 pango_layout_set_text (self->pl, text, textlen); 1180 pango_layout_set_text (self->pl, text, textlen);
1061} 1181}
1062 1182
1063void 1183void
1064set_markup (CFPlus::Layout self, SV *text_) 1184set_markup (DC::Layout self, SV *text_)
1065 CODE: 1185 CODE:
1066{ 1186{
1067 STRLEN textlen; 1187 STRLEN textlen;
1068 char *text = SvPVutf8 (text_, textlen); 1188 char *text = SvPVutf8 (text_, textlen);
1069 1189
1070 pango_layout_set_markup (self->pl, text, textlen); 1190 pango_layout_set_markup (self->pl, text, textlen);
1071} 1191}
1072 1192
1073void 1193void
1074set_shapes (CFPlus::Layout self, ...) 1194set_shapes (DC::Layout self, ...)
1075 CODE: 1195 CODE:
1076{ 1196{
1077 PangoAttrList *attrs = 0; 1197 PangoAttrList *attrs = 0;
1078 const char *text = pango_layout_get_text (self->pl); 1198 const char *text = pango_layout_get_text (self->pl);
1079 const char *pos = text; 1199 const char *pos = text;
1114 if (attrs) 1234 if (attrs)
1115 pango_layout_set_attributes (self->pl, attrs); 1235 pango_layout_set_attributes (self->pl, attrs);
1116} 1236}
1117 1237
1118void 1238void
1119get_shapes (CFPlus::Layout self) 1239get_shapes (DC::Layout self)
1120 PPCODE: 1240 PPCODE:
1121{ 1241{
1122 PangoLayoutIter *iter = pango_layout_get_iter (self->pl); 1242 PangoLayoutIter *iter = pango_layout_get_iter (self->pl);
1123 1243
1124 do 1244 do
1125 { 1245 {
1126 PangoLayoutRun *run = pango_layout_iter_get_run (iter); 1246 PangoLayoutRun *run = pango_layout_iter_get_run_readonly (iter);
1127 1247
1128 if (run && shape_attr_p (run)) 1248 if (run && shape_attr_p (run))
1129 { 1249 {
1130 PangoRectangle extents; 1250 PangoRectangle extents;
1131 pango_layout_iter_get_run_extents (iter, 0, &extents); 1251 pango_layout_iter_get_run_extents (iter, 0, &extents);
1139 1259
1140 pango_layout_iter_free (iter); 1260 pango_layout_iter_free (iter);
1141} 1261}
1142 1262
1143int 1263int
1144has_wrapped (CFPlus::Layout self) 1264has_wrapped (DC::Layout self)
1145 CODE: 1265 CODE:
1146{ 1266{
1147 int lines = 1; 1267 int lines = 1;
1148 const char *text = pango_layout_get_text (self->pl); 1268 const char *text = pango_layout_get_text (self->pl);
1149 1269
1154} 1274}
1155 OUTPUT: 1275 OUTPUT:
1156 RETVAL 1276 RETVAL
1157 1277
1158SV * 1278SV *
1159get_text (CFPlus::Layout self) 1279get_text (DC::Layout self)
1160 CODE: 1280 CODE:
1161 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0); 1281 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0);
1162 sv_utf8_decode (RETVAL); 1282 sv_utf8_decode (RETVAL);
1163 OUTPUT: 1283 OUTPUT:
1164 RETVAL 1284 RETVAL
1165 1285
1166void 1286void
1167set_foreground (CFPlus::Layout self, float r, float g, float b, float a = 1.) 1287set_foreground (DC::Layout self, float r, float g, float b, float a = 1.)
1168 CODE: 1288 CODE:
1169 self->r = r; 1289 self->r = r;
1170 self->g = g; 1290 self->g = g;
1171 self->b = b; 1291 self->b = b;
1172 self->a = a; 1292 self->a = a;
1173 1293
1174void 1294void
1175set_font (CFPlus::Layout self, CFPlus::Font font = 0) 1295set_font (DC::Layout self, DC::Font font = 0)
1176 CODE: 1296 CODE:
1177 if (self->font != font) 1297 if (self->font != font)
1178 { 1298 {
1179 self->font = font; 1299 self->font = font;
1180 layout_update_font (self); 1300 layout_update_font (self);
1181 } 1301 }
1182 1302
1183void 1303void
1184set_height (CFPlus::Layout self, int base_height) 1304set_height (DC::Layout self, int base_height)
1185 CODE: 1305 CODE:
1186 if (self->base_height != base_height) 1306 if (self->base_height != base_height)
1187 { 1307 {
1188 self->base_height = base_height; 1308 self->base_height = base_height;
1189 layout_update_font (self); 1309 layout_update_font (self);
1190 } 1310 }
1191 1311
1192void 1312void
1193set_width (CFPlus::Layout self, int max_width = -1) 1313set_width (DC::Layout self, int max_width = -1)
1194 CODE: 1314 CODE:
1195 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE); 1315 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE);
1196 1316
1197void 1317void
1198set_indent (CFPlus::Layout self, int indent) 1318set_indent (DC::Layout self, int indent)
1199 CODE: 1319 CODE:
1200 pango_layout_set_indent (self->pl, indent * PANGO_SCALE); 1320 pango_layout_set_indent (self->pl, indent * PANGO_SCALE);
1201 1321
1202void 1322void
1203set_spacing (CFPlus::Layout self, int spacing) 1323set_spacing (DC::Layout self, int spacing)
1204 CODE: 1324 CODE:
1205 pango_layout_set_spacing (self->pl, spacing * PANGO_SCALE); 1325 pango_layout_set_spacing (self->pl, spacing * PANGO_SCALE);
1206 1326
1207void 1327void
1208set_ellipsise (CFPlus::Layout self, int ellipsise) 1328set_ellipsise (DC::Layout self, int ellipsise)
1209 CODE: 1329 CODE:
1210 pango_layout_set_ellipsize (self->pl, 1330 pango_layout_set_ellipsize (self->pl,
1211 ellipsise == 1 ? PANGO_ELLIPSIZE_START 1331 ellipsise == 1 ? PANGO_ELLIPSIZE_START
1212 : ellipsise == 2 ? PANGO_ELLIPSIZE_MIDDLE 1332 : ellipsise == 2 ? PANGO_ELLIPSIZE_MIDDLE
1213 : ellipsise == 3 ? PANGO_ELLIPSIZE_END 1333 : ellipsise == 3 ? PANGO_ELLIPSIZE_END
1214 : PANGO_ELLIPSIZE_NONE 1334 : PANGO_ELLIPSIZE_NONE
1215 ); 1335 );
1216 1336
1217void 1337void
1218set_single_paragraph_mode (CFPlus::Layout self, int spm) 1338set_single_paragraph_mode (DC::Layout self, int spm)
1219 CODE: 1339 CODE:
1220 pango_layout_set_single_paragraph_mode (self->pl, !!spm); 1340 pango_layout_set_single_paragraph_mode (self->pl, !!spm);
1221 1341
1222void 1342void
1223size (CFPlus::Layout self) 1343size (DC::Layout self)
1224 PPCODE: 1344 PPCODE:
1225{ 1345{
1226 int w, h; 1346 int w, h;
1227 1347
1228 layout_get_pixel_size (self, &w, &h); 1348 layout_get_pixel_size (self, &w, &h);
1231 PUSHs (sv_2mortal (newSViv (w))); 1351 PUSHs (sv_2mortal (newSViv (w)));
1232 PUSHs (sv_2mortal (newSViv (h))); 1352 PUSHs (sv_2mortal (newSViv (h)));
1233} 1353}
1234 1354
1235int 1355int
1236descent (CFPlus::Layout self) 1356descent (DC::Layout self)
1237 CODE: 1357 CODE:
1238{ 1358{
1239 PangoRectangle rect; 1359 PangoRectangle rect;
1240 PangoLayoutLine *line = pango_layout_get_line (self->pl, 0); 1360 PangoLayoutLine *line = pango_layout_get_line_readonly (self->pl, 0);
1241 pango_layout_line_get_pixel_extents (line, 0, &rect); 1361 pango_layout_line_get_pixel_extents (line, 0, &rect);
1242 RETVAL = PANGO_DESCENT (rect); 1362 RETVAL = PANGO_DESCENT (rect);
1243} 1363}
1244 OUTPUT: 1364 OUTPUT:
1245 RETVAL 1365 RETVAL
1246 1366
1247int 1367int
1248xy_to_index (CFPlus::Layout self, int x, int y) 1368xy_to_index (DC::Layout self, int x, int y)
1249 CODE: 1369 CODE:
1250{ 1370{
1251 int index, trailing; 1371 int index, trailing;
1252 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing); 1372 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing);
1253 RETVAL = index + trailing; 1373 RETVAL = index + trailing;
1254} 1374}
1255 OUTPUT: 1375 OUTPUT:
1256 RETVAL 1376 RETVAL
1257 1377
1258void 1378void
1259cursor_pos (CFPlus::Layout self, int index) 1379cursor_pos (DC::Layout self, int index)
1260 PPCODE: 1380 PPCODE:
1261{ 1381{
1262 PangoRectangle strong_pos; 1382 PangoRectangle pos;
1263 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0); 1383 pango_layout_get_cursor_pos (self->pl, index, &pos, 0);
1264 1384
1265 EXTEND (SP, 3); 1385 EXTEND (SP, 3);
1266 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE))); 1386 PUSHs (sv_2mortal (newSViv (pos.x / PANGO_SCALE)));
1267 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE))); 1387 PUSHs (sv_2mortal (newSViv (pos.y / PANGO_SCALE)));
1268 PUSHs (sv_2mortal (newSViv (strong_pos.height / PANGO_SCALE))); 1388 PUSHs (sv_2mortal (newSViv (pos.height / PANGO_SCALE)));
1269} 1389}
1270 1390
1271void 1391void
1272index_to_line_x (CFPlus::Layout self, int index, int trailing = 0) 1392index_to_line_x (DC::Layout self, int index, int trailing = 0)
1273 PPCODE: 1393 PPCODE:
1274{ 1394{
1275 int line, x; 1395 int line, x;
1276 1396
1277 pango_layout_index_to_line_x (self->pl, index, trailing, &line, &x); 1397 pango_layout_index_to_line_x (self->pl, index, trailing, &line, &x);
1398#if !PANGO_VERSION_CHECK (1, 17, 3)
1278 /* pango bug: line is between 1..numlines, not 0..numlines-1 */ 1399 /* pango bug: line is between 1..numlines, not 0..numlines-1 */
1279 1400 --line;
1401#endif
1280 EXTEND (SP, 2); 1402 EXTEND (SP, 2);
1281 PUSHs (sv_2mortal (newSViv (line - 1))); 1403 PUSHs (sv_2mortal (newSViv (line)));
1282 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE))); 1404 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE)));
1283} 1405}
1284 1406
1285void 1407void
1286line_x_to_index (CFPlus::Layout self, int line, int x) 1408line_x_to_index (DC::Layout self, int line, int x)
1287 PPCODE: 1409 PPCODE:
1288{ 1410{
1289 PangoLayoutLine *lp; 1411 PangoLayoutLine *lp;
1290 int index, trailing; 1412 int index, trailing;
1291 1413
1292 if (line < 0) 1414 if (line < 0)
1293 XSRETURN_EMPTY; 1415 XSRETURN_EMPTY;
1294 1416
1295 if (!(lp = pango_layout_get_line (self->pl, line))) 1417 if (!(lp = pango_layout_get_line_readonly (self->pl, line)))
1296 XSRETURN_EMPTY; /* do better */ 1418 XSRETURN_EMPTY; /* do better */
1297 1419
1298 pango_layout_line_x_to_index (lp, x * PANGO_SCALE, &index, &trailing); 1420 pango_layout_line_x_to_index (lp, x * PANGO_SCALE, &index, &trailing);
1299 1421
1300 EXTEND (SP, 2); 1422 EXTEND (SP, 2);
1306 PUSHs (sv_2mortal (newSViv (trailing))); 1428 PUSHs (sv_2mortal (newSViv (trailing)));
1307 } 1429 }
1308} 1430}
1309 1431
1310void 1432void
1311render (CFPlus::Layout self, float x, float y, int flags = 0) 1433render (DC::Layout self, float x, float y, int flags = 0)
1312 PPCODE: 1434 CODE:
1435 rc_clear (self->rc);
1313 pango_opengl_render_layout_subpixel ( 1436 pango_opengl_render_layout_subpixel (
1314 self->pl, 1437 self->pl,
1438 self->rc,
1315 x * PANGO_SCALE, y * PANGO_SCALE, 1439 x * PANGO_SCALE, y * PANGO_SCALE,
1316 self->r, self->g, self->b, self->a, 1440 self->r, self->g, self->b, self->a,
1317 flags 1441 flags
1318 ); 1442 );
1443 // we assume that context_change actually clears/frees stuff
1444 // and does not do any recomputation...
1445 pango_layout_context_changed (self->pl);
1319 1446
1320MODULE = CFPlus PACKAGE = CFPlus::Texture 1447void
1448draw (DC::Layout self)
1449 CODE:
1450{
1451 glEnable (GL_TEXTURE_2D);
1452 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1453 glEnable (GL_BLEND);
1454 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
1455 GL_ONE , GL_ONE_MINUS_SRC_ALPHA);
1456 glEnable (GL_ALPHA_TEST);
1457 glAlphaFunc (GL_GREATER, 7.f / 255.f);
1458
1459 rc_draw (self->rc);
1460
1461 glDisable (GL_ALPHA_TEST);
1462 glDisable (GL_BLEND);
1463 glDisable (GL_TEXTURE_2D);
1464}
1465
1466MODULE = Deliantra::Client PACKAGE = DC::Texture
1321 1467
1322PROTOTYPES: ENABLE 1468PROTOTYPES: ENABLE
1323
1324int minpot (int n)
1325 1469
1326void 1470void
1327pad (SV *data_, int ow, int oh, int nw, int nh) 1471pad (SV *data_, int ow, int oh, int nw, int nh)
1328 CODE: 1472 CODE:
1329{ 1473{
1406 RETVAL = width > 0; 1550 RETVAL = width > 0;
1407} 1551}
1408 OUTPUT: 1552 OUTPUT:
1409 RETVAL 1553 RETVAL
1410 1554
1411MODULE = CFPlus PACKAGE = CFPlus::Map 1555MODULE = Deliantra::Client PACKAGE = DC::Map
1412 1556
1413PROTOTYPES: DISABLE 1557PROTOTYPES: DISABLE
1414 1558
1415CFPlus::Map 1559DC::Map
1416new (SV *class) 1560new (SV *class)
1417 CODE: 1561 CODE:
1418 New (0, RETVAL, 1, struct map); 1562 New (0, RETVAL, 1, struct map);
1419 RETVAL->x = 0; 1563 RETVAL->x = 0;
1420 RETVAL->y = 0; 1564 RETVAL->y = 0;
1428 RETVAL->row = 0; 1572 RETVAL->row = 0;
1429 OUTPUT: 1573 OUTPUT:
1430 RETVAL 1574 RETVAL
1431 1575
1432void 1576void
1433DESTROY (CFPlus::Map self) 1577DESTROY (DC::Map self)
1434 CODE: 1578 CODE:
1435{ 1579{
1436 map_clear (self); 1580 map_clear (self);
1437 Safefree (self->face2tile); 1581 Safefree (self->face2tile);
1438 Safefree (self->tex); 1582 Safefree (self->tex);
1439 Safefree (self); 1583 Safefree (self);
1440} 1584}
1441 1585
1442void 1586void
1443resize (CFPlus::Map self, int map_width, int map_height) 1587resize (DC::Map self, int map_width, int map_height)
1444 CODE: 1588 CODE:
1445 self->w = map_width; 1589 self->w = map_width;
1446 self->h = map_height; 1590 self->h = map_height;
1447 1591
1448void 1592void
1449clear (CFPlus::Map self) 1593clear (DC::Map self)
1450 CODE: 1594 CODE:
1451 map_clear (self); 1595 map_clear (self);
1452 1596
1453void 1597void
1454set_tileid (CFPlus::Map self, int face, int tile) 1598set_tileid (DC::Map self, int face, int tile)
1455 CODE: 1599 CODE:
1456{ 1600{
1457 need_facenum (self, face); self->face2tile [face] = tile; 1601 need_facenum (self, face); self->face2tile [face] = tile;
1458 need_texid (self, tile); 1602 need_texid (self, tile);
1459} 1603}
1460 1604
1461void 1605void
1462set_smooth (CFPlus::Map self, int face, int smooth, int level) 1606set_smooth (DC::Map self, int face, int smooth, int level)
1463 CODE: 1607 CODE:
1464{ 1608{
1465 tileid texid; 1609 tileid texid;
1466 maptex *tex; 1610 maptex *tex;
1467 1611
1480 tex->smoothtile = self->face2tile [smooth]; 1624 tex->smoothtile = self->face2tile [smooth];
1481 tex->smoothlevel = level; 1625 tex->smoothlevel = level;
1482} 1626}
1483 1627
1484void 1628void
1485set_texture (CFPlus::Map self, int texid, int name, int w, int h, float s, float t, int r, int g, int b, int a) 1629set_texture (DC::Map self, int texid, int name, int w, int h, float s, float t, int r, int g, int b, int a)
1486 CODE: 1630 CODE:
1487{ 1631{
1488 need_texid (self, texid); 1632 need_texid (self, texid);
1489 1633
1490 { 1634 {
1510 // from transparent color bleeding and ugly wrapping effects. 1654 // from transparent color bleeding and ugly wrapping effects.
1511 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1655 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1512} 1656}
1513 1657
1514int 1658int
1515ox (CFPlus::Map self) 1659ox (DC::Map self)
1516 ALIAS: 1660 ALIAS:
1517 oy = 1 1661 oy = 1
1518 x = 2 1662 x = 2
1519 y = 3 1663 y = 3
1520 w = 4 1664 w = 4
1531 } 1675 }
1532 OUTPUT: 1676 OUTPUT:
1533 RETVAL 1677 RETVAL
1534 1678
1535void 1679void
1536scroll (CFPlus::Map self, int dx, int dy) 1680scroll (DC::Map self, int dx, int dy)
1537 CODE: 1681 CODE:
1538{ 1682{
1539 if (dx > 0) 1683 if (dx > 0)
1540 map_blank (self, self->x, self->y, dx, self->h); 1684 map_blank (self, self->x, self->y, dx, self->h);
1541 else if (dx < 0) 1685 else if (dx < 0)
1557 self->y += MAP_EXTEND_Y; 1701 self->y += MAP_EXTEND_Y;
1558 } 1702 }
1559} 1703}
1560 1704
1561SV * 1705SV *
1562map1a_update (CFPlus::Map self, SV *data_, int extmap) 1706map1a_update (DC::Map self, SV *data_, int extmap)
1563 CODE: 1707 CODE:
1564{ 1708{
1565 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 1709 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
1566 uint8_t *data_end = (uint8_t *)SvEND (data_); 1710 uint8_t *data_end = (uint8_t *)SvEND (data_);
1567 mapcell *cell; 1711 mapcell *cell;
1595 uint8_t ext, cmd; 1739 uint8_t ext, cmd;
1596 1740
1597 do 1741 do
1598 { 1742 {
1599 ext = *data++; 1743 ext = *data++;
1600 cmd = ext & 0x3f; 1744 cmd = ext & 0x7f;
1601 1745
1602 if (cmd < 4) 1746 if (cmd < 4)
1603 cell->darkness = 255 - ext * 64 + 1; 1747 cell->darkness = 255 - ext * 64 + 1;
1604 else if (cmd == 5) // health 1748 else if (cmd == 5) // health
1605 { 1749 {
1608 } 1752 }
1609 else if (cmd == 6) // monster width 1753 else if (cmd == 6) // monster width
1610 cell->stat_width = *data++ + 1; 1754 cell->stat_width = *data++ + 1;
1611 else if (cmd == 0x47) 1755 else if (cmd == 0x47)
1612 { 1756 {
1613 if (*data == 4) 1757 if (*data == 1) cell->player = data [1];
1614 ; // decode player count 1758 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
1759 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
1760 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
1615 1761
1616 data += *data + 1; 1762 data += *data + 1;
1617 } 1763 }
1618 else if (cmd == 8) // cell flags 1764 else if (cmd == 8) // cell flags
1619 cell->flags = *data++; 1765 cell->flags = *data++;
1649 } 1795 }
1650 } 1796 }
1651 } 1797 }
1652 } 1798 }
1653 else 1799 else
1654 cell->darkness = 0; 1800 CELL_CLEAR (cell);
1655 } 1801 }
1656} 1802}
1657 OUTPUT: 1803 OUTPUT:
1658 RETVAL 1804 RETVAL
1659 1805
1660SV * 1806SV *
1661mapmap (CFPlus::Map self, int x0, int y0, int w, int h) 1807mapmap (DC::Map self, int x0, int y0, int w, int h)
1662 CODE: 1808 CODE:
1663{ 1809{
1664 int x1, x; 1810 int x1, x;
1665 int y1, y; 1811 int y1, y;
1666 int z; 1812 int z;
1711} 1857}
1712 OUTPUT: 1858 OUTPUT:
1713 RETVAL 1859 RETVAL
1714 1860
1715void 1861void
1716draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T) 1862draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0)
1717 CODE: 1863 CODE:
1718{ 1864{
1719 int x, y, z; 1865 int x, y, z;
1720 1866
1721 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1867 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
1722 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 1868 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
1723 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k) 1869 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k)
1724 smooth_key skey; 1870 smooth_key skey;
1725 1871 int pl_x, pl_y;
1872 maptex pl_tex;
1726 rc_t *rc = rc_alloc (); 1873 rc_t *rc = rc_alloc ();
1727 rc_key_t key; 1874 rc_key_t key;
1728 rc_array_t *arr; 1875 rc_array_t *arr;
1876
1877 pl_tex.name = 0;
1729 1878
1730 // thats current max. sorry. 1879 // thats current max. sorry.
1731 if (sw > 255) sw = 255; 1880 if (sw > 255) sw = 255;
1732 if (sh > 255) sh = 255; 1881 if (sh > 255) sh = 255;
1733 1882
1788 tileid tile = cell->tile [z]; 1937 tileid tile = cell->tile [z];
1789 1938
1790 if (tile) 1939 if (tile)
1791 { 1940 {
1792 maptex tex = self->tex [tile]; 1941 maptex tex = self->tex [tile];
1793 int px, py; 1942 int px = (x + 1) * T - tex.w;
1943 int py = (y + 1) * T - tex.h;
1794 1944
1795 // suppressing texture state switches here
1796 // is only moderately effective, but worth the extra effort
1797 if (key.texname != tex.name) 1945 if (key.texname != tex.name)
1798 { 1946 {
1799 if (!tex.name) 1947 if (!tex.name)
1800 tex = self->tex [2]; /* missing, replace by noface */ 1948 tex = self->tex [2]; /* missing, replace by noface */
1801 1949
1802 key.texname = tex.name; 1950 key.texname = tex.name;
1803 arr = rc_array (rc, &key); 1951 arr = rc_array (rc, &key);
1804 } 1952 }
1805 1953
1806 px = (x + 1) * T - tex.w; 1954 if (expect_false (cell->player == player) && expect_false (z == 2))
1807 py = (y + 1) * T - tex.h; 1955 {
1956 pl_x = px;
1957 pl_y = py;
1958 pl_tex = tex;
1959 continue;
1960 }
1808 1961
1809 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 1962 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1810 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0); 1963 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
1811 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0); 1964 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0);
1812 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0); 1965 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
1813 1966
1814 if (cell->flags && z == 2) 1967 if (expect_false (cell->flags) && expect_false (z == 2))
1815 { 1968 {
1816 // overlays such as the speech bubble, probably more to come 1969 // overlays such as the speech bubble, probably more to come
1817 if (cell->flags & 1) 1970 if (cell->flags & 1)
1818 { 1971 {
1819 maptex tex = self->tex [1]; 1972 maptex tex = self->tex [1];
1884 // go through all smoothlevels, lowest to highest, then draw. 2037 // go through all smoothlevels, lowest to highest, then draw.
1885 // this is basically counting sort 2038 // this is basically counting sort
1886 { 2039 {
1887 int w, b; 2040 int w, b;
1888 2041
2042 glEnable (GL_TEXTURE_2D);
2043 glBegin (GL_QUADS);
1889 for (w = 0; w < 256 / 32; ++w) 2044 for (w = 0; w < 256 / 32; ++w)
1890 { 2045 {
1891 uint32_t smask = smooth_level [w]; 2046 uint32_t smask = smooth_level [w];
1892 if (smask) 2047 if (smask)
1893 for (b = 0; b < 32; ++b) 2048 for (b = 0; b < 32; ++b)
1918 { 2073 {
1919 // this time avoiding texture state changes 2074 // this time avoiding texture state changes
1920 // save gobs of state changes. 2075 // save gobs of state changes.
1921 if (key.texname != tex.name) 2076 if (key.texname != tex.name)
1922 { 2077 {
2078 glEnd ();
1923 key.texname = tex.name; 2079 glBindTexture (GL_TEXTURE_2D, key.texname = tex.name);
1924 arr = rc_array (rc, &key); 2080 glBegin (GL_QUADS);
1925 } 2081 }
1926 2082
1927 if (border) 2083 if (border)
1928 { 2084 {
1929 float ox = border * dx; 2085 float ox = border * dx;
1930 2086
1931 rc_t2f_v3f (arr, ox , 0.f , px , py , 0); 2087 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
1932 rc_t2f_v3f (arr, ox , dy , px , py + T, 0); 2088 glTexCoord2f (ox , dy ); glVertex2i (px , py + T);
1933 rc_t2f_v3f (arr, ox + dx, dy , px + T, py + T, 0); 2089 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T);
1934 rc_t2f_v3f (arr, ox + dx, 0.f , px + T, py , 0); 2090 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py );
1935 } 2091 }
1936 2092
1937 if (corner) 2093 if (corner)
1938 { 2094 {
1939 float ox = corner * dx; 2095 float ox = corner * dx;
1940 2096
1941 rc_t2f_v3f (arr, ox , dy , px , py , 0); 2097 glTexCoord2f (ox , dy ); glVertex2i (px , py );
1942 rc_t2f_v3f (arr, ox , dy * 2.f, px , py + T, 0); 2098 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T);
1943 rc_t2f_v3f (arr, ox + dx, dy * 2.f, px + T, py + T, 0); 2099 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T);
1944 rc_t2f_v3f (arr, ox + dx, dy , px + T, py , 0); 2100 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py );
1945 } 2101 }
1946 } 2102 }
1947 } 2103 }
1948 } 2104 }
1949 } 2105 }
1950 } 2106 }
2107
2108 glEnd ();
2109 glDisable (GL_TEXTURE_2D);
2110 key.texname = -1;
1951 } 2111 }
1952 2112
1953 hv_clear (smooth); 2113 hv_clear (smooth);
2114 }
2115
2116 if (pl_tex.name)
2117 {
2118 maptex tex = pl_tex;
2119 int px = pl_x + sdx;
2120 int py = pl_y + sdy;
2121
2122 key.texname = tex.name;
2123 arr = rc_array (rc, &key);
2124
2125 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2126 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
2127 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0);
2128 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
2129
1954 rc_draw (rc); 2130 rc_draw (rc);
1955 rc_clear (rc);
1956 } 2131 }
1957 2132
1958 glDisable (GL_BLEND); 2133 glDisable (GL_BLEND);
1959 rc_free (rc); 2134 rc_free (rc);
1960 2135
1989 } 2164 }
1990 } 2165 }
1991} 2166}
1992 2167
1993void 2168void
1994draw_magicmap (CFPlus::Map self, int dx, int dy, int w, int h, unsigned char *data) 2169draw_magicmap (DC::Map self, int dx, int dy, int w, int h, unsigned char *data)
1995 CODE: 2170 CODE:
1996{ 2171{
1997 static float color[16][3] = { 2172 static float color[16][3] = {
1998 { 0.00F, 0.00F, 0.00F }, 2173 { 0.00F, 0.00F, 0.00F },
1999 { 1.00F, 1.00F, 1.00F }, 2174 { 1.00F, 1.00F, 1.00F },
2049 glDisable (GL_BLEND); 2224 glDisable (GL_BLEND);
2050 glDisable (GL_TEXTURE_2D); 2225 glDisable (GL_TEXTURE_2D);
2051} 2226}
2052 2227
2053void 2228void
2054fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) 2229fow_texture (DC::Map self, int mx, int my, int sw, int sh)
2055 PPCODE: 2230 PPCODE:
2056{ 2231{
2057 int x, y; 2232 int x, y;
2058 int sw1 = sw + 2; 2233 int sw1 = sw + 2;
2059 int sh1 = sh + 2; 2234 int sh1 = sh + 2;
2067 SvCUR_set (darkness3_sv, sw34 * sh3); 2242 SvCUR_set (darkness3_sv, sw34 * sh3);
2068 2243
2069 mx += self->x - 1; 2244 mx += self->x - 1;
2070 my += self->y - 1; 2245 my += self->y - 1;
2071 2246
2072 memset (darkness1, 255, sw1 * sh1); 2247 memset (darkness1, 255 - FOW_DARKNESS, sw1 * sh1);
2073 2248
2074 for (y = 0; y < sh1; y++) 2249 for (y = 0; y < sh1; y++)
2075 if (0 <= y + my && y + my < self->rows) 2250 if (0 <= y + my && y + my < self->rows)
2076 { 2251 {
2077 maprow *row = self->row + (y + my); 2252 maprow *row = self->row + (y + my);
2130 PUSHs (sv_2mortal (newSViv (sh3))); 2305 PUSHs (sv_2mortal (newSViv (sh3)));
2131 PUSHs (darkness3_sv); 2306 PUSHs (darkness3_sv);
2132} 2307}
2133 2308
2134SV * 2309SV *
2135get_rect (CFPlus::Map self, int x0, int y0, int w, int h) 2310get_rect (DC::Map self, int x0, int y0, int w, int h)
2136 CODE: 2311 CODE:
2137{ 2312{
2138 int x, y, x1, y1; 2313 int x, y, x1, y1;
2139 SV *data_sv = newSV (w * h * 7 + 5); 2314 SV *data_sv = newSV (w * h * 7 + 5);
2140 uint8_t *data = (uint8_t *)SvPVX (data_sv); 2315 uint8_t *data = (uint8_t *)SvPVX (data_sv);
2197 else 2372 else
2198 *data++ = 0; 2373 *data++ = 0;
2199 } 2374 }
2200 } 2375 }
2201 2376
2377 /* if size is w*h + 5 then no data has been found */
2378 if (data - (uint8_t *)SvPVX (data_sv) != w * h + 5)
2379 {
2202 SvPOK_only (data_sv); 2380 SvPOK_only (data_sv);
2203 SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv)); 2381 SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv));
2382 }
2383
2204 RETVAL = data_sv; 2384 RETVAL = data_sv;
2205} 2385}
2206 OUTPUT: 2386 OUTPUT:
2207 RETVAL 2387 RETVAL
2208 2388
2209void 2389void
2210set_rect (CFPlus::Map self, int x0, int y0, uint8_t *data) 2390set_rect (DC::Map self, int x0, int y0, SV *data_sv)
2211 PPCODE: 2391 PPCODE:
2212{ 2392{
2213 int x, y, z; 2393 int x, y, z;
2214 int w, h; 2394 int w, h;
2215 int x1, y1; 2395 int x1, y1;
2396 STRLEN len;
2397 uint8_t *data, *end;
2398
2399 len = SvLEN (data_sv);
2400 SvGROW (data_sv, len + 8); // reserve at least 7+ bytes more
2401 data = SvPVbyte_nolen (data_sv);
2402 end = data + len + 8;
2403
2404 if (len < 5)
2405 XSRETURN_EMPTY;
2216 2406
2217 if (*data++ != 0) 2407 if (*data++ != 0)
2218 return; /* version mismatch */ 2408 XSRETURN_EMPTY; /* version mismatch */
2219 2409
2220 w = *data++ << 8; w |= *data++; 2410 w = *data++ << 8; w |= *data++;
2221 h = *data++ << 8; h |= *data++; 2411 h = *data++ << 8; h |= *data++;
2222 2412
2223 // we need to do this 'cause we don't keep an absolute coord system for rows 2413 // we need to do this 'cause we don't keep an absolute coord system for rows
2235 { 2425 {
2236 maprow *row = map_get_row (self, y); 2426 maprow *row = map_get_row (self, y);
2237 2427
2238 for (x = x0; x < x1; x++) 2428 for (x = x0; x < x1; x++)
2239 { 2429 {
2430 uint8_t flags;
2431
2432 if (data + 7 >= end)
2433 XSRETURN_EMPTY;
2434
2240 uint8_t flags = *data++; 2435 flags = *data++;
2241 2436
2242 if (flags) 2437 if (flags)
2243 { 2438 {
2244 mapcell *cell = row_get_cell (row, x); 2439 mapcell *cell = row_get_cell (row, x);
2245 tileid tile[3] = { 0, 0, 0 }; 2440 tileid tile[3] = { 0, 0, 0 };
2248 if (flags & 2) { tile[1] = *data++ << 8; tile[1] |= *data++; } 2443 if (flags & 2) { tile[1] = *data++ << 8; tile[1] |= *data++; }
2249 if (flags & 4) { tile[2] = *data++ << 8; tile[2] |= *data++; } 2444 if (flags & 4) { tile[2] = *data++ << 8; tile[2] |= *data++; }
2250 2445
2251 if (cell->darkness == 0) 2446 if (cell->darkness == 0)
2252 { 2447 {
2253 cell->darkness = 0; 2448 /*cell->darkness = 0;*/
2449 EXTEND (SP, 3);
2254 2450
2255 for (z = 0; z <= 2; z++) 2451 for (z = 0; z <= 2; z++)
2256 { 2452 {
2257 tileid t = tile [z]; 2453 tileid t = tile [z];
2258 2454
2259 if (t >= self->texs || (t && !self->tex [t].name)) 2455 if (t >= self->texs || (t && !self->tex [t].name))
2260 { 2456 {
2261 XPUSHs (sv_2mortal (newSViv (t))); 2457 PUSHs (sv_2mortal (newSViv (t)));
2262 need_texid (self, t); 2458 need_texid (self, t);
2263 } 2459 }
2264 2460
2265 cell->tile [z] = t; 2461 cell->tile [z] = t;
2266 } 2462 }
2268 } 2464 }
2269 } 2465 }
2270 } 2466 }
2271} 2467}
2272 2468
2273MODULE = CFPlus PACKAGE = CFPlus::RW 2469MODULE = Deliantra::Client PACKAGE = DC::RW
2274 2470
2275CFPlus::RW 2471DC::RW
2276new (SV *class, SV *data_sv) 2472new (SV *class, SV *data_sv)
2277 CODE: 2473 CODE:
2278{ 2474{
2279 STRLEN datalen; 2475 STRLEN datalen;
2280 char *data = SvPVbyte (data_sv, datalen); 2476 char *data = SvPVbyte (data_sv, datalen);
2282 RETVAL = SDL_RWFromConstMem (data, datalen); 2478 RETVAL = SDL_RWFromConstMem (data, datalen);
2283} 2479}
2284 OUTPUT: 2480 OUTPUT:
2285 RETVAL 2481 RETVAL
2286 2482
2287CFPlus::RW 2483DC::RW
2288new_from_file (SV *class, const char *path, const char *mode = "rb") 2484new_from_file (SV *class, const char *path, const char *mode = "rb")
2289 CODE: 2485 CODE:
2290 RETVAL = SDL_RWFromFile (path, mode); 2486 RETVAL = SDL_RWFromFile (path, mode);
2291 OUTPUT: 2487 OUTPUT:
2292 RETVAL 2488 RETVAL
2293 2489
2294# fails on win32: 2490# fails on win32:
2295# CFPlus.xs(2268) : error C2059: syntax error : '(' 2491# dc.xs(2268) : error C2059: syntax error : '('
2296#void 2492#void
2297#close (CFPlus::RW self) 2493#close (DC::RW self)
2298# CODE: 2494# CODE:
2299# (self->(close)) (self); 2495# (self->(close)) (self);
2300 2496
2301MODULE = CFPlus PACKAGE = CFPlus::Channel 2497MODULE = Deliantra::Client PACKAGE = DC::Channel
2302 2498
2303PROTOTYPES: DISABLE 2499PROTOTYPES: DISABLE
2304 2500
2305CFPlus::Channel 2501DC::Channel
2306find () 2502find ()
2307 CODE: 2503 CODE:
2308{ 2504{
2309 RETVAL = Mix_GroupAvailable (-1); 2505 RETVAL = Mix_GroupAvailable (-1);
2310 2506
2323} 2519}
2324 OUTPUT: 2520 OUTPUT:
2325 RETVAL 2521 RETVAL
2326 2522
2327void 2523void
2328halt (CFPlus::Channel self) 2524halt (DC::Channel self)
2329 CODE: 2525 CODE:
2330 Mix_HaltChannel (self); 2526 Mix_HaltChannel (self);
2331 2527
2332void 2528void
2333expire (CFPlus::Channel self, int ticks = -1) 2529expire (DC::Channel self, int ticks = -1)
2334 CODE: 2530 CODE:
2335 Mix_ExpireChannel (self, ticks); 2531 Mix_ExpireChannel (self, ticks);
2336 2532
2337void 2533void
2338fade_out (CFPlus::Channel self, int ticks = -1) 2534fade_out (DC::Channel self, int ticks = -1)
2339 CODE: 2535 CODE:
2340 Mix_FadeOutChannel (self, ticks); 2536 Mix_FadeOutChannel (self, ticks);
2341 2537
2342int 2538int
2343volume (CFPlus::Channel self, int volume) 2539volume (DC::Channel self, int volume)
2344 CODE: 2540 CODE:
2345 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128)); 2541 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128));
2346 OUTPUT: 2542 OUTPUT:
2347 RETVAL 2543 RETVAL
2348 2544
2349void 2545void
2350unregister_all_effects (CFPlus::Channel self) 2546unregister_all_effects (DC::Channel self)
2351 CODE: 2547 CODE:
2352 Mix_UnregisterAllEffects (self); 2548 Mix_UnregisterAllEffects (self);
2353 2549
2354void 2550void
2355set_panning (CFPlus::Channel self, int left, int right) 2551set_panning (DC::Channel self, int left, int right)
2356 CODE: 2552 CODE:
2357 left = CLAMP (left , 0, 255); 2553 left = CLAMP (left , 0, 255);
2358 right = CLAMP (right, 0, 255); 2554 right = CLAMP (right, 0, 255);
2359 Mix_SetPanning (self, left, right); 2555 Mix_SetPanning (self, left, right);
2360 2556
2361void 2557void
2362set_distance (CFPlus::Channel self, int distance) 2558set_distance (DC::Channel self, int distance)
2363 CODE: 2559 CODE:
2364 Mix_SetDistance (self, CLAMP (distance, 0, 255)); 2560 Mix_SetDistance (self, CLAMP (distance, 0, 255));
2365 2561
2366void 2562void
2367set_position (CFPlus::Channel self, int angle, int distance) 2563set_position (DC::Channel self, int angle, int distance)
2368 CODE: 2564 CODE:
2369 2565
2370void 2566void
2371set_position_r (CFPlus::Channel self, int dx, int dy, int maxdistance) 2567set_position_r (DC::Channel self, int dx, int dy, int maxdistance)
2372 CODE: 2568 CODE:
2373{ 2569{
2374 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance)); 2570 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2375 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI); 2571 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI);
2376 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255)); 2572 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2377} 2573}
2378 2574
2379void 2575void
2380set_reverse_stereo (CFPlus::Channel self, int flip) 2576set_reverse_stereo (DC::Channel self, int flip)
2381 CODE: 2577 CODE:
2382 Mix_SetReverseStereo (self, flip); 2578 Mix_SetReverseStereo (self, flip);
2383 2579
2384MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2580MODULE = Deliantra::Client PACKAGE = DC::MixChunk
2385 2581
2386PROTOTYPES: DISABLE 2582PROTOTYPES: DISABLE
2387 2583
2388CFPlus::MixChunk 2584DC::MixChunk
2389new (SV *class, CFPlus::RW rwops) 2585new (SV *class, DC::RW rwops)
2390 CODE: 2586 CODE:
2391 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2587 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2392 OUTPUT: 2588 OUTPUT:
2393 RETVAL 2589 RETVAL
2394 2590
2395void 2591void
2396DESTROY (CFPlus::MixChunk self) 2592DESTROY (DC::MixChunk self)
2397 CODE: 2593 CODE:
2398 Mix_FreeChunk (self); 2594 Mix_FreeChunk (self);
2399 2595
2400int 2596int
2401volume (CFPlus::MixChunk self, int volume = -1) 2597volume (DC::MixChunk self, int volume = -1)
2402 CODE: 2598 CODE:
2403 if (items > 1) 2599 if (items > 1)
2404 volume = CLAMP (volume, 0, 128); 2600 volume = CLAMP (volume, 0, 128);
2405 RETVAL = Mix_VolumeChunk (self, volume); 2601 RETVAL = Mix_VolumeChunk (self, volume);
2406 OUTPUT: 2602 OUTPUT:
2407 RETVAL 2603 RETVAL
2408 2604
2409CFPlus::Channel 2605DC::Channel
2410play (CFPlus::MixChunk self, CFPlus::Channel channel = -1, int loops = 0, int ticks = -1) 2606play (DC::MixChunk self, DC::Channel channel = -1, int loops = 0, int ticks = -1)
2411 CODE: 2607 CODE:
2412{ 2608{
2413 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks); 2609 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
2414 2610
2415 if (RETVAL < 0) 2611 if (RETVAL < 0)
2422 } 2618 }
2423} 2619}
2424 OUTPUT: 2620 OUTPUT:
2425 RETVAL 2621 RETVAL
2426 2622
2427MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2623MODULE = Deliantra::Client PACKAGE = DC::MixMusic
2428 2624
2429int 2625int
2430volume (int volume = -1) 2626volume (int volume = -1)
2431 PROTOTYPE: ;$ 2627 PROTOTYPE: ;$
2432 CODE: 2628 CODE:
2444void 2640void
2445halt () 2641halt ()
2446 CODE: 2642 CODE:
2447 Mix_HaltMusic (); 2643 Mix_HaltMusic ();
2448 2644
2449CFPlus::MixMusic 2645DC::MixMusic
2450new (SV *class, CFPlus::RW rwops) 2646new (SV *class, DC::RW rwops)
2451 CODE: 2647 CODE:
2452 RETVAL = Mix_LoadMUS_RW (rwops); 2648 RETVAL = Mix_LoadMUS_RW (rwops);
2453 OUTPUT: 2649 OUTPUT:
2454 RETVAL 2650 RETVAL
2455 2651
2456void 2652void
2457DESTROY (CFPlus::MixMusic self) 2653DESTROY (DC::MixMusic self)
2458 CODE: 2654 CODE:
2459 Mix_FreeMusic (self); 2655 Mix_FreeMusic (self);
2460 2656
2461int 2657int
2462play (CFPlus::MixMusic self, int loops = -1) 2658play (DC::MixMusic self, int loops = -1)
2463 CODE: 2659 CODE:
2464 RETVAL = Mix_PlayMusic (self, loops); 2660 RETVAL = Mix_PlayMusic (self, loops);
2465 OUTPUT: 2661 OUTPUT:
2466 RETVAL 2662 RETVAL
2467 2663
2468void 2664void
2469fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position) 2665fade_in_pos (DC::MixMusic self, int loops, int ms, double position)
2470 CODE: 2666 CODE:
2471 Mix_FadeInMusicPos (self, loops, ms, position); 2667 Mix_FadeInMusicPos (self, loops, ms, position);
2472 2668
2473MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2669MODULE = Deliantra::Client PACKAGE = DC::OpenGL
2474 2670
2475PROTOTYPES: ENABLE 2671PROTOTYPES: ENABLE
2476 2672
2477BOOT: 2673BOOT:
2478{ 2674{
2479 HV *stash = gv_stashpv ("CFPlus::OpenGL", 1); 2675 HV *stash = gv_stashpv ("DC::OpenGL", 1);
2480 static const struct { 2676 static const struct {
2481 const char *name; 2677 const char *name;
2482 IV iv; 2678 IV iv;
2483 } *civ, const_iv[] = { 2679 } *civ, const_iv[] = {
2484# define const_iv(name) { # name, (IV)name } 2680# define const_iv(name) { # name, (IV)name }
2519 const_iv (GL_INTENSITY), 2715 const_iv (GL_INTENSITY),
2520 const_iv (GL_LUMINANCE), 2716 const_iv (GL_LUMINANCE),
2521 const_iv (GL_LUMINANCE_ALPHA), 2717 const_iv (GL_LUMINANCE_ALPHA),
2522 const_iv (GL_FLOAT), 2718 const_iv (GL_FLOAT),
2523 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2719 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2720 const_iv (GL_COMPRESSED_ALPHA_ARB),
2721 const_iv (GL_COMPRESSED_LUMINANCE_ARB),
2722 const_iv (GL_COMPRESSED_LUMINANCE_ALPHA_ARB),
2723 const_iv (GL_COMPRESSED_INTENSITY_ARB),
2724 const_iv (GL_COMPRESSED_RGB_ARB),
2725 const_iv (GL_COMPRESSED_RGBA_ARB),
2524 const_iv (GL_COMPILE), 2726 const_iv (GL_COMPILE),
2525 const_iv (GL_PROXY_TEXTURE_1D), 2727 const_iv (GL_PROXY_TEXTURE_1D),
2526 const_iv (GL_PROXY_TEXTURE_2D), 2728 const_iv (GL_PROXY_TEXTURE_2D),
2527 const_iv (GL_TEXTURE_1D), 2729 const_iv (GL_TEXTURE_1D),
2528 const_iv (GL_TEXTURE_2D), 2730 const_iv (GL_TEXTURE_2D),
2567 const_iv (GL_PERSPECTIVE_CORRECTION_HINT), 2769 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
2568 const_iv (GL_POINT_SMOOTH_HINT), 2770 const_iv (GL_POINT_SMOOTH_HINT),
2569 const_iv (GL_LINE_SMOOTH_HINT), 2771 const_iv (GL_LINE_SMOOTH_HINT),
2570 const_iv (GL_POLYGON_SMOOTH_HINT), 2772 const_iv (GL_POLYGON_SMOOTH_HINT),
2571 const_iv (GL_GENERATE_MIPMAP_HINT), 2773 const_iv (GL_GENERATE_MIPMAP_HINT),
2774 const_iv (GL_TEXTURE_COMPRESSION_HINT),
2572 const_iv (GL_FASTEST), 2775 const_iv (GL_FASTEST),
2573 const_iv (GL_DONT_CARE), 2776 const_iv (GL_DONT_CARE),
2574 const_iv (GL_NICEST), 2777 const_iv (GL_NICEST),
2575 const_iv (GL_V2F), 2778 const_iv (GL_V2F),
2576 const_iv (GL_V3F), 2779 const_iv (GL_V3F),
2584 2787
2585 texture_av = newAV (); 2788 texture_av = newAV ();
2586 AvREAL_off (texture_av); 2789 AvREAL_off (texture_av);
2587} 2790}
2588 2791
2792void
2793disable_GL_EXT_blend_func_separate ()
2794 CODE:
2795 gl.BlendFuncSeparate = 0;
2796 gl.BlendFuncSeparateEXT = 0;
2797
2589char * 2798char *
2590gl_vendor () 2799gl_vendor ()
2591 CODE: 2800 CODE:
2592 RETVAL = (char *)glGetString (GL_VENDOR); 2801 RETVAL = (char *)glGetString (GL_VENDOR);
2593 OUTPUT: 2802 OUTPUT:
2714 2923
2715void glRect (float x1, float y1, float x2, float y2) 2924void glRect (float x1, float y1, float x2, float y2)
2716 CODE: 2925 CODE:
2717 glRectf (x1, y1, x2, y2); 2926 glRectf (x1, y1, x2, y2);
2718 2927
2928void glRect_lineloop (float x1, float y1, float x2, float y2)
2929 CODE:
2930 glBegin (GL_LINE_LOOP);
2931 glVertex2f (x1, y1);
2932 glVertex2f (x2, y1);
2933 glVertex2f (x2, y2);
2934 glVertex2f (x1, y2);
2935 glEnd ();
2936
2719PROTOTYPES: ENABLE 2937PROTOTYPES: ENABLE
2720 2938
2721void glBegin (int mode) 2939void glBegin (int mode)
2722 2940
2723void glEnd () 2941void glEnd ()
2755void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column) 2973void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column)
2756 CODE: 2974 CODE:
2757 if (gl.SeparableFilter2D) 2975 if (gl.SeparableFilter2D)
2758 gl.SeparableFilter2D (target, internalformat, width, height, format, type, row, column); 2976 gl.SeparableFilter2D (target, internalformat, width, height, format, type, row, column);
2759 2977
2760void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data) 2978void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data = 0)
2761 2979
2762void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 2980void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
2763 2981
2764void glDrawPixels (int width, int height, int format, int type, char *pixels) 2982void glDrawPixels (int width, int height, int format, int type, char *pixels)
2765 2983
2791 3009
2792void glEndList () 3010void glEndList ()
2793 3011
2794void glCallList (int list) 3012void glCallList (int list)
2795 3013
2796MODULE = CFPlus PACKAGE = CFPlus::UI::Base 3014MODULE = Deliantra::Client PACKAGE = DC::UI::Base
2797 3015
2798PROTOTYPES: DISABLE 3016PROTOTYPES: DISABLE
2799 3017
2800void 3018void
2801find_widget (SV *self, NV x, NV y) 3019find_widget (SV *self, NV x, NV y)
2805 XPUSHs (self); 3023 XPUSHs (self);
2806} 3024}
2807 3025
2808BOOT: 3026BOOT:
2809{ 3027{
2810 hover_gv = gv_fetchpv ("CFPlus::UI::HOVER", 1, SVt_NV); 3028 hover_gv = gv_fetchpv ("DC::UI::HOVER", 1, SVt_NV);
2811 3029
2812 draw_x_gv = gv_fetchpv ("CFPlus::UI::Base::draw_x", 1, SVt_NV); 3030 draw_x_gv = gv_fetchpv ("DC::UI::Base::draw_x", 1, SVt_NV);
2813 draw_y_gv = gv_fetchpv ("CFPlus::UI::Base::draw_y", 1, SVt_NV); 3031 draw_y_gv = gv_fetchpv ("DC::UI::Base::draw_y", 1, SVt_NV);
2814 draw_w_gv = gv_fetchpv ("CFPlus::UI::Base::draw_w", 1, SVt_NV); 3032 draw_w_gv = gv_fetchpv ("DC::UI::Base::draw_w", 1, SVt_NV);
2815 draw_h_gv = gv_fetchpv ("CFPlus::UI::Base::draw_h", 1, SVt_NV); 3033 draw_h_gv = gv_fetchpv ("DC::UI::Base::draw_h", 1, SVt_NV);
2816} 3034}
2817 3035
2818void 3036void
2819draw (SV *self) 3037draw (SV *self)
2820 CODE: 3038 CODE:
2824 NV x, y, w, h; 3042 NV x, y, w, h;
2825 SV *draw_x_sv = GvSV (draw_x_gv); 3043 SV *draw_x_sv = GvSV (draw_x_gv);
2826 SV *draw_y_sv = GvSV (draw_y_gv); 3044 SV *draw_y_sv = GvSV (draw_y_gv);
2827 SV *draw_w_sv = GvSV (draw_w_gv); 3045 SV *draw_w_sv = GvSV (draw_w_gv);
2828 SV *draw_h_sv = GvSV (draw_h_gv); 3046 SV *draw_h_sv = GvSV (draw_h_gv);
2829 SV *hover;
2830 double draw_x, draw_y, draw_w, draw_h; 3047 double draw_x, draw_y;
2831 3048
2832 if (!SvROK (self)) 3049 if (!SvROK (self))
2833 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self)); 3050 croak ("DC::Base::draw: %s not a reference", SvPV_nolen (self));
2834 3051
2835 hv = (HV *)SvRV (self); 3052 hv = (HV *)SvRV (self);
2836 3053
2837 if (SvTYPE (hv) != SVt_PVHV) 3054 if (SvTYPE (hv) != SVt_PVHV)
2838 croak ("CFPlus::Base::draw: %s not a hashref", SvPV_nolen (self)); 3055 croak ("DC::Base::draw: %s not a hashref", SvPV_nolen (self));
2839 3056
2840 svp = hv_fetch (hv, "w", 1, 0); w = svp ? SvNV (*svp) : 0.; 3057 svp = hv_fetch (hv, "w", 1, 0); w = svp ? SvNV (*svp) : 0.;
2841 svp = hv_fetch (hv, "h", 1, 0); h = svp ? SvNV (*svp) : 0.; 3058 svp = hv_fetch (hv, "h", 1, 0); h = svp ? SvNV (*svp) : 0.;
2842 3059
2843 if (!h || !w) 3060 if (!h || !w)
2863 { 3080 {
2864 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0); 3081 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0);
2865 3082
2866 if (svp && SvTRUE (*svp)) 3083 if (svp && SvTRUE (*svp))
2867 { 3084 {
2868 glColor4f (1*0.2f, 0.8*0.2f, 0.5*0.2f, 0.2f); 3085 glColor4f (1.0f * 0.2f, 0.8f * 0.2f, 0.5f * 0.2f, 0.2f);
2869 glEnable (GL_BLEND); 3086 glEnable (GL_BLEND);
2870 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 3087 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
2871 glBegin (GL_QUADS); 3088 glBegin (GL_QUADS);
2872 glVertex2f (0, 0); 3089 glVertex2f (0, 0);
2873 glVertex2f (w, 0); 3090 glVertex2f (w, 0);
2876 glEnd (); 3093 glEnd ();
2877 glDisable (GL_BLEND); 3094 glDisable (GL_BLEND);
2878 } 3095 }
2879 } 3096 }
2880#if 0 3097#if 0
2881 if ($ENV{CFPLUS_DEBUG} & 1) { 3098 // draw borders, for debugging
2882 glPushMatrix; 3099 glPushMatrix ();
2883 glColor 1, 1, 0, 1; 3100 glColor4f (1., 1., 0., 1.);
2884 glTranslate 0.375, 0.375; 3101 glTranslatef (.5, .5, 0.);
2885 glBegin GL_LINE_LOOP; 3102 glBegin (GL_LINE_LOOP);
2886 glVertex 0 , 0; 3103 glVertex2f (0 , 0);
2887 glVertex $self->{w} - 1, 0; 3104 glVertex2f (w - 1, 0);
2888 glVertex $self->{w} - 1, $self->{h} - 1; 3105 glVertex2f (w - 1, h - 1);
2889 glVertex 0 , $self->{h} - 1; 3106 glVertex2f (0 , h - 1);
2890 glEnd; 3107 glEnd ();
2891 glPopMatrix; 3108 glPopMatrix ();
2892 #CFPlus::UI::Label->new (w => $self->{w}, h => $self->{h}, text => $self, fontsize => 0)->_draw;
2893 }
2894#endif 3109#endif
2895 PUSHMARK (SP); 3110 PUSHMARK (SP);
2896 XPUSHs (self); 3111 XPUSHs (self);
2897 PUTBACK; 3112 PUTBACK;
2898 call_method ("_draw", G_VOID | G_DISCARD); 3113 call_method ("_draw", G_VOID | G_DISCARD);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines