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.51 by root, Wed Apr 19 20:46:44 2006 UTC vs.
Revision 1.72 by root, Fri May 5 19:10:16 2006 UTC

9#include <string.h> 9#include <string.h>
10#include <stdio.h> 10#include <stdio.h>
11 11
12#include <SDL.h> 12#include <SDL.h>
13#include <SDL_image.h> 13#include <SDL_image.h>
14#include <SDL_mixer.h>
14#include <SDL_opengl.h> 15#include <SDL_opengl.h>
15 16
16#include <glib/gmacros.h> 17#include <glib/gmacros.h>
17 18
18#include <pango/pango.h> 19#include <pango/pango.h>
32 typedef signed char int8_t; 33 typedef signed char int8_t;
33 typedef signed short int16_t; 34 typedef signed short int16_t;
34 typedef signed int int32_t; 35 typedef signed int int32_t;
35#endif 36#endif
36 37
38#include "glext.h"
39
37#define FOW_DARKNESS 32 40#define FOW_DARKNESS 32
38 41
39#define MAP_EXTEND_X 32 42#define MAP_EXTEND_X 32
40#define MAP_EXTEND_Y 512 43#define MAP_EXTEND_Y 512
41 44
42static PangoContext *context; 45#define MIN_FONT_HEIGHT 10
43static PangoFontMap *fontmap; 46
47#define GL_CALL(type,func,args) \
48 { \
49 static int init_; \
50 static type fptr_; \
51 \
52 if (!init_) \
53 { \
54 init_ = 1; \
55 fptr_ = (type)SDL_GL_GetProcAddress (# func); \
56 } \
57 \
58 if (fptr_) \
59 fptr_ args; \
60 }
61
62typedef Mix_Chunk *CFClient__MixChunk;
63typedef Mix_Music *CFClient__MixMusic;
64
65typedef PangoFontDescription *CFClient__Font;
44 66
45typedef struct cf_layout { 67typedef struct cf_layout {
46 PangoLayout *pl; 68 PangoLayout *pl;
47 int base_height; 69 int base_height;
70 CFClient__Font font;
48} *CFClient__Layout; 71} *CFClient__Layout;
72
73static CFClient__Font default_font;
74static PangoContext *context;
75static PangoFontMap *fontmap;
49 76
50static void 77static void
51substitute_func (FcPattern *pattern, gpointer data) 78substitute_func (FcPattern *pattern, gpointer data)
52{ 79{
53 FcPatternAddBool (pattern, FC_HINTING , 1); 80 FcPatternAddBool (pattern, FC_HINTING , 1);
54 FcPatternAddBool (pattern, FC_AUTOHINT, 0); 81 FcPatternAddBool (pattern, FC_AUTOHINT, 0);
55} 82}
56 83
57static void 84static void
58layout_update (CFClient__Layout self) 85layout_update_font (CFClient__Layout self)
59{ 86{
60 /* use a random scale factor to account for unknown descenders, 0.8 works 87 /* use a random scale factor to account for unknown descenders, 0.8 works
61 * reasonably well with bitstream vera 88 * reasonably well with bitstream vera
62 */ 89 */
63 PangoFontDescription *font = pango_context_get_font_description (context); 90 PangoFontDescription *font = self->font ? self->font : default_font;
64 91
65 int height = self->base_height * (PANGO_SCALE * 8 / 10);
66
67 if (pango_font_description_get_size (font) != height)
68 {
69 pango_font_description_set_absolute_size (font, height); 92 pango_font_description_set_absolute_size (font,
70 pango_layout_context_changed (self->pl); 93 MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10));
71 } 94
95 pango_layout_set_font_description (self->pl, font);
72} 96}
73 97
74static void 98static void
75layout_get_pixel_size (CFClient__Layout self, int *w, int *h) 99layout_get_pixel_size (CFClient__Layout self, int *w, int *h)
76{ 100{
77 layout_update (self);
78
79 pango_layout_get_pixel_size (self->pl, w, h); 101 pango_layout_get_pixel_size (self->pl, w, h);
80 102
81 *w = (*w + 3) & ~3; 103 *w = (*w + 3) & ~3;
82 if (!*w) *w = 1; 104 if (!*w) *w = 1;
83 if (!*h) *h = 1; 105 if (!*h) *h = 1;
233 break; 255 break;
234 256
235 row->col[x - row->c0].darkness = -1; 257 row->col[x - row->c0].darkness = -1;
236 } 258 }
237 } 259 }
260}
261
262static void
263music_finished ()
264{
265 SDL_UserEvent ev;
266
267 ev.type = SDL_USEREVENT;
268 ev.code = 0;
269 ev.data1 = 0;
270 ev.data2 = 0;
271
272 SDL_PushEvent ((SDL_Event *)&ev);
273}
274
275static void
276channel_finished (int channel)
277{
278 SDL_UserEvent ev;
279
280 ev.type = SDL_USEREVENT;
281 ev.code = 1;
282 ev.data1 = (void *)channel;
283 ev.data2 = 0;
284
285 SDL_PushEvent ((SDL_Event *)&ev);
238} 286}
239 287
240MODULE = CFClient PACKAGE = CFClient 288MODULE = CFClient PACKAGE = CFClient
241 289
242PROTOTYPES: ENABLE 290PROTOTYPES: ENABLE
382 430
383 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 431 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
384 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 432 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
385 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0); 433 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0);
386 434
435 SDL_EnableUNICODE (1);
436 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
437
387 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 438 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
388 439
389 if (m && m != (SDL_Rect **)-1) 440 if (m && m != (SDL_Rect **)-1)
390 while (*m) 441 while (*m)
391 { 442 {
407 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 458 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
408 OUTPUT: 459 OUTPUT:
409 RETVAL 460 RETVAL
410 461
411void 462void
463SDL_GL_SwapBuffers ()
464
465void
466SDL_PollEvent ()
467 PPCODE:
468{
469 SDL_Event ev;
470
471 while (SDL_PollEvent (&ev))
472 {
473 HV *hv = newHV ();
474 hv_store (hv, "type", 4, newSViv (ev.type), 0);
475
476 switch (ev.type)
477 {
478 case SDL_KEYDOWN:
479 case SDL_KEYUP:
480 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
481 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0);
482 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod), 0);
483 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0);
484 break;
485
486 case SDL_ACTIVEEVENT:
487 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
488 hv_store (hv, "state", 5, newSViv (ev.active.state), 0);
489 break;
490
491 case SDL_MOUSEMOTION:
492 hv_store (hv, "state", 5, newSViv (ev.motion.state), 0);
493 hv_store (hv, "x", 1, newSViv (ev.motion.x), 0);
494 hv_store (hv, "y", 1, newSViv (ev.motion.y), 0);
495 hv_store (hv, "xrel", 4, newSViv (ev.motion.xrel), 0);
496 hv_store (hv, "yrel", 4, newSViv (ev.motion.yrel), 0);
497 break;
498
499 case SDL_MOUSEBUTTONDOWN:
500 case SDL_MOUSEBUTTONUP:
501 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
502 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
503 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
504 hv_store (hv, "y", 1, newSViv (ev.button.y), 0);
505 break;
506
507 case SDL_USEREVENT:
508 hv_store (hv, "code", 4, newSViv (ev.user.code), 0);
509 hv_store (hv, "data1", 5, newSViv ((IV)ev.user.data1), 0);
510 hv_store (hv, "data2", 5, newSViv ((IV)ev.user.data2), 0);
511 break;
512 }
513
514 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv)));
515 }
516}
517
518int
519Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512)
520 POSTCALL:
521 Mix_HookMusicFinished (music_finished);
522 Mix_ChannelFinished (channel_finished);
523
524void
525Mix_CloseAudio ()
526
527int
528Mix_AllocateChannels (int numchans = -1)
529
530void
412lowdelay (int fd, int val = 1) 531lowdelay (int fd, int val = 1)
413 CODE: 532 CODE:
414#ifndef _WIN32 533#ifndef _WIN32
415 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val)); 534 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val));
416#endif 535#endif
431 550
432void 551void
433add_font (char *file) 552add_font (char *file)
434 CODE: 553 CODE:
435 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */ 554 FcConfigAppFontAddFile (0, (const FcChar8 *)file); /* no idea wether this is required */
436
437void
438set_font (char *file)
439 CODE:
440{
441 int count;
442 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)file, 0, 0, &count);
443 PangoFontDescription *font = pango_fc_font_description_from_pattern (pattern, 0);
444 FcPatternDestroy (pattern);
445 pango_context_set_font_description (context, font);
446}
447 555
448void 556void
449load_image_inline (SV *image_) 557load_image_inline (SV *image_)
450 ALIAS: 558 ALIAS:
451 load_image_file = 1 559 load_image_file = 1
533 PUSHs (sv_2mortal (newSViv (b / y))); 641 PUSHs (sv_2mortal (newSViv (b / y)));
534 PUSHs (sv_2mortal (newSViv (a / y))); 642 PUSHs (sv_2mortal (newSViv (a / y)));
535} 643}
536 644
537void 645void
646error (char *message)
647 CODE:
648#ifdef _WIN32
649 MessageBox (0, message, "Crossfire+ Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
650#else
651 fprintf (stderr, "ERROR: %s\n", message);
652#endif
653
654void
538fatal (char *message) 655fatal (char *message)
539 CODE: 656 CODE:
540#ifdef _WIN32 657#ifdef _WIN32
541 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); 658 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
542#else 659#else
543 fprintf (stderr, "FATAL: %s\n", message); 660 fprintf (stderr, "FATAL: %s\n", message);
544#endif 661#endif
545 exit (1); 662 exit (1);
546 663
664MODULE = CFClient PACKAGE = CFClient::Font
665
666CFClient::Font
667new_from_file (SV *class, char *path, int id = 0)
668 CODE:
669{
670 int count;
671 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count);
672 RETVAL = pango_fc_font_description_from_pattern (pattern, 0);
673 FcPatternDestroy (pattern);
674}
675 OUTPUT:
676 RETVAL
677
678void
679DESTROY (CFClient::Font self)
680 CODE:
681 pango_font_description_free (self);
682
683void
684make_default (CFClient::Font self)
685 CODE:
686 default_font = self;
687
547MODULE = CFClient PACKAGE = CFClient::Layout 688MODULE = CFClient PACKAGE = CFClient::Layout
548 689
549CFClient::Layout 690CFClient::Layout
550new (SV *class, int base_height = 10) 691new (SV *class, int base_height = MIN_FONT_HEIGHT)
551 CODE: 692 CODE:
552 New (0, RETVAL, 1, struct cf_layout); 693 New (0, RETVAL, 1, struct cf_layout);
694 RETVAL->pl = pango_layout_new (context);
553 RETVAL->base_height = base_height; 695 RETVAL->base_height = base_height;
554 RETVAL->pl = pango_layout_new (context); 696 RETVAL->font = 0;
555 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 697 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
698 pango_layout_set_font_description (RETVAL->pl, default_font);
556 OUTPUT: 699 OUTPUT:
557 RETVAL 700 RETVAL
558 701
559void 702void
560DESTROY (CFClient::Layout self) 703DESTROY (CFClient::Layout self)
589 SvUTF8_on (RETVAL); 732 SvUTF8_on (RETVAL);
590 OUTPUT: 733 OUTPUT:
591 RETVAL 734 RETVAL
592 735
593void 736void
737set_font (CFClient::Layout self, CFClient::Font font = 0)
738 CODE:
739 if (self->font != font)
740 {
741 self->font = font;
742 layout_update_font (self);
743 }
744
745void
594set_height (CFClient::Layout self, int base_height) 746set_height (CFClient::Layout self, int base_height)
595 CODE: 747 CODE:
748 if (self->base_height != base_height)
749 {
596 self->base_height = base_height; 750 self->base_height = base_height;
751 layout_update_font (self);
752 }
597 753
598void 754void
599set_width (CFClient::Layout self, int max_width = -1) 755set_width (CFClient::Layout self, int max_width = -1)
600 CODE: 756 CODE:
601 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE); 757 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE);
604size (CFClient::Layout self) 760size (CFClient::Layout self)
605 PPCODE: 761 PPCODE:
606{ 762{
607 int w, h; 763 int w, h;
608 764
609 layout_update (self);
610 layout_get_pixel_size (self, &w, &h); 765 layout_get_pixel_size (self, &w, &h);
611 766
612 EXTEND (SP, 2); 767 EXTEND (SP, 2);
613 PUSHs (sv_2mortal (newSViv (w))); 768 PUSHs (sv_2mortal (newSViv (w)));
614 PUSHs (sv_2mortal (newSViv (h))); 769 PUSHs (sv_2mortal (newSViv (h)));
617int 772int
618xy_to_index (CFClient::Layout self, int x, int y) 773xy_to_index (CFClient::Layout self, int x, int y)
619 CODE: 774 CODE:
620{ 775{
621 int index, trailing; 776 int index, trailing;
622
623 layout_update (self);
624 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing); 777 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing);
625
626 RETVAL = index; 778 RETVAL = index;
627} 779}
628 OUTPUT: 780 OUTPUT:
629 RETVAL 781 RETVAL
630 782
631void 783void
632cursor_pos (CFClient::Layout self, int index) 784cursor_pos (CFClient::Layout self, int index)
633 PPCODE: 785 PPCODE:
634{ 786{
635 PangoRectangle strong_pos; 787 PangoRectangle strong_pos;
636 layout_update (self);
637 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0); 788 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0);
638 789
639 EXTEND (SP, 3); 790 EXTEND (SP, 3);
640 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE))); 791 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE)));
641 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE))); 792 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE)));
648{ 799{
649 SV *retval; 800 SV *retval;
650 int w, h; 801 int w, h;
651 FT_Bitmap bitmap; 802 FT_Bitmap bitmap;
652 803
653 layout_update (self);
654 layout_get_pixel_size (self, &w, &h); 804 layout_get_pixel_size (self, &w, &h);
655 805
656 retval = newSV (w * h); 806 retval = newSV (w * h);
657 SvPOK_only (retval); 807 SvPOK_only (retval);
658 SvCUR_set (retval, w * h); 808 SvCUR_set (retval, w * h);
869 cell->darkness = -1; 1019 cell->darkness = -1;
870 } 1020 }
871} 1021}
872 1022
873SV * 1023SV *
874mapmap (CFClient::Map self, int w, int h) 1024mapmap (CFClient::Map self, int x0, int y0, int w, int h)
875 CODE: 1025 CODE:
876{ 1026{
877 int x0, x1, x; 1027 int x1, x;
878 int y0, y1, y; 1028 int y1, y;
879 int z; 1029 int z;
880 SV *map_sv = newSV (w * h * sizeof (uint32_t)); 1030 SV *map_sv = newSV (w * h * sizeof (uint32_t));
881 uint32_t *map = (uint32_t *)SvPVX (map_sv); 1031 uint32_t *map = (uint32_t *)SvPVX (map_sv);
882 1032
883 SvPOK_only (map_sv); 1033 SvPOK_only (map_sv);
884 SvCUR_set (map_sv, w * h * sizeof (uint32_t)); 1034 SvCUR_set (map_sv, w * h * sizeof (uint32_t));
885 1035
886 x0 = self->x - w / 2; x1 = x0 + w; 1036 x0 += self->x; x1 = x0 + w;
887 y0 = self->y - h / 2; y1 = y0 + h; 1037 y0 += self->y; y1 = y0 + h;
888 1038
889 for (y = y0; y < y1; y++) 1039 for (y = y0; y < y1; y++)
890 { 1040 {
891 maprow *row = 0 <= y && y < self->rows 1041 maprow *row = 0 <= y && y < self->rows
892 ? self->row + y 1042 ? self->row + y
1032 *data++ = 0; /* version 0 format */ 1182 *data++ = 0; /* version 0 format */
1033 *data++ = w >> 8; *data++ = w; 1183 *data++ = w >> 8; *data++ = w;
1034 *data++ = h >> 8; *data++ = h; 1184 *data++ = h >> 8; *data++ = h;
1035 1185
1036 // we need to do this 'cause we don't keep an absolute coord system for rows 1186 // we need to do this 'cause we don't keep an absolute coord system for rows
1037 // TODO: treat rows as we treat 1187 // TODO: treat rows as we treat columns
1038 map_get_row (self, y0 + self->y - self->oy);//D 1188 map_get_row (self, y0 + self->y - self->oy);//D
1039 map_get_row (self, y0 + self->y - self->oy + h - 1);//D 1189 map_get_row (self, y0 + self->y - self->oy + h - 1);//D
1040 1190
1041 x0 += self->x - self->ox; 1191 x0 += self->x - self->ox;
1042 y0 += self->y - self->oy; 1192 y0 += self->y - self->oy;
1106 1256
1107 w = *data++ << 8; w |= *data++; 1257 w = *data++ << 8; w |= *data++;
1108 h = *data++ << 8; h |= *data++; 1258 h = *data++ << 8; h |= *data++;
1109 1259
1110 // we need to do this 'cause we don't keep an absolute coord system for rows 1260 // we need to do this 'cause we don't keep an absolute coord system for rows
1111 // TODO: treat rows as we treat 1261 // TODO: treat rows as we treat columns
1112 map_get_row (self, y0 + self->y - self->oy);//D 1262 map_get_row (self, y0 + self->y - self->oy);//D
1113 map_get_row (self, y0 + self->y - self->oy + h - 1);//D 1263 map_get_row (self, y0 + self->y - self->oy + h - 1);//D
1114 1264
1115 x0 += self->x - self->ox; 1265 x0 += self->x - self->ox;
1116 y0 += self->y - self->oy; 1266 y0 += self->y - self->oy;
1151 } 1301 }
1152 } 1302 }
1153 } 1303 }
1154} 1304}
1155 1305
1306MODULE = CFClient PACKAGE = CFClient::MixChunk
1307
1308CFClient::MixChunk
1309new_from_file (SV *class, char *path)
1310 CODE:
1311 RETVAL = Mix_LoadWAV (path);
1312 OUTPUT:
1313 RETVAL
1314
1315void
1316DESTROY (CFClient::MixChunk self)
1317 CODE:
1318 Mix_FreeChunk (self);
1319
1320int
1321volume (CFClient::MixChunk self, int volume = -1)
1322 CODE:
1323 RETVAL = Mix_VolumeChunk (self, volume);
1324 OUTPUT:
1325 RETVAL
1326
1327int
1328play (CFClient::MixChunk self, int channel = -1, int loops = 0, int ticks = -1)
1329 CODE:
1330 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
1331 OUTPUT:
1332 RETVAL
1333
1334MODULE = CFClient PACKAGE = CFClient::MixMusic
1335
1336int
1337volume (int volume = -1)
1338 CODE:
1339 RETVAL = Mix_VolumeMusic (volume);
1340 OUTPUT:
1341 RETVAL
1342
1343CFClient::MixMusic
1344new_from_file (SV *class, char *path)
1345 CODE:
1346 RETVAL = Mix_LoadMUS (path);
1347 OUTPUT:
1348 RETVAL
1349
1350void
1351DESTROY (CFClient::MixMusic self)
1352 CODE:
1353 Mix_FreeMusic (self);
1354
1355int
1356play (CFClient::MixMusic self, int loops = -1)
1357 CODE:
1358 RETVAL = Mix_PlayMusic (self, loops);
1359 OUTPUT:
1360 RETVAL
1361
1362MODULE = CFClient PACKAGE = CFClient::OpenGL
1363
1364BOOT:
1365{
1366 HV *stash = gv_stashpv ("CFClient::OpenGL", 1);
1367 static const struct {
1368 const char *name;
1369 IV iv;
1370 } *civ, const_iv[] = {
1371# define const_iv(name) { # name, (IV)name }
1372 const_iv (GL_COLOR_MATERIAL),
1373 const_iv (GL_SMOOTH),
1374 const_iv (GL_FLAT),
1375 const_iv (GL_DITHER),
1376 const_iv (GL_BLEND),
1377 const_iv (GL_SCISSOR_TEST),
1378 const_iv (GL_AND),
1379 const_iv (GL_ONE),
1380 const_iv (GL_ZERO),
1381 const_iv (GL_SRC_ALPHA),
1382 const_iv (GL_SRC_ALPHA_SATURATE),
1383 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1384 const_iv (GL_ONE_MINUS_DST_ALPHA),
1385 const_iv (GL_RGB),
1386 const_iv (GL_RGBA),
1387 const_iv (GL_UNSIGNED_BYTE),
1388 const_iv (GL_ALPHA),
1389 const_iv (GL_FLOAT),
1390 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
1391 const_iv (GL_COMPILE),
1392 const_iv (GL_TEXTURE_1D),
1393 const_iv (GL_TEXTURE_2D),
1394 const_iv (GL_TEXTURE_ENV),
1395 const_iv (GL_TEXTURE_MAG_FILTER),
1396 const_iv (GL_TEXTURE_MIN_FILTER),
1397 const_iv (GL_TEXTURE_ENV_MODE),
1398 const_iv (GL_TEXTURE_WRAP_S),
1399 const_iv (GL_TEXTURE_WRAP_T),
1400 const_iv (GL_CLAMP),
1401 const_iv (GL_REPEAT),
1402 const_iv (GL_NEAREST),
1403 const_iv (GL_LINEAR),
1404 const_iv (GL_NEAREST_MIPMAP_NEAREST),
1405 const_iv (GL_LINEAR_MIPMAP_NEAREST),
1406 const_iv (GL_NEAREST_MIPMAP_LINEAR),
1407 const_iv (GL_LINEAR_MIPMAP_LINEAR),
1408 const_iv (GL_GENERATE_MIPMAP),
1409 const_iv (GL_MODULATE),
1410 const_iv (GL_DECAL),
1411 const_iv (GL_REPLACE),
1412 const_iv (GL_COLOR_BUFFER_BIT),
1413 const_iv (GL_PROJECTION),
1414 const_iv (GL_MODELVIEW),
1415 const_iv (GL_COLOR_LOGIC_OP),
1416 const_iv (GL_SEPARABLE_2D),
1417 const_iv (GL_CONVOLUTION_2D),
1418 const_iv (GL_CONVOLUTION_BORDER_MODE),
1419 const_iv (GL_CONSTANT_BORDER),
1420 const_iv (GL_LINES),
1421 const_iv (GL_QUADS),
1422 const_iv (GL_LINE_LOOP),
1423 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
1424 const_iv (GL_FASTEST),
1425# undef const_iv
1426 };
1427
1428 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
1429 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
1430}
1431
1432int glGetError ()
1433
1434void glClear (int mask)
1435
1436void glClearColor (float r, float g, float b, float a = 1.0)
1437 PROTOTYPE: @
1438
1439void glEnable (int cap)
1440
1441void glDisable (int cap)
1442
1443void glShadeModel (int mode)
1444
1445void glHint (int target, int mode)
1446
1447void glBlendFunc (int sfactor, int dfactor)
1448
1449void glLogicOp (int opcode)
1450
1451void glColorMask (int red, int green, int blue, int alpha)
1452
1453void glMatrixMode (int mode)
1454
1455void glPushMatrix ()
1456
1457void glPopMatrix ()
1458
1459void glLoadIdentity ()
1460
1461# near and far are due to microsofts buggy c compiler
1462void glOrtho (double left, double right, double bottom, double top, double near_, double far_)
1463
1464void glViewport (int x, int y, int width, int height)
1465
1466void glScissor (int x, int y, int width, int height)
1467
1468void glTranslate (float x, float y, float z = 0.)
1469 CODE:
1470 glTranslatef (x, y, z);
1471
1472void glScale (float x, float y, float z = 1.)
1473 CODE:
1474 glScalef (x, y, z);
1475
1476void glRotate (float angle, float x, float y, float z)
1477 CODE:
1478 glRotatef (angle, x, y, z);
1479
1480void glBegin (int mode)
1481
1482void glEnd ()
1483
1484void glColor (float r, float g, float b, float a = 1.0)
1485 PROTOTYPE: @
1486 CODE:
1487 glColor4ub (r * 255., g * 255., b * 255., a * 255.);
1488
1489void glVertex (float x, float y, float z = 0.)
1490 CODE:
1491 glVertex3f (x, y, z);
1492
1493void glTexCoord (float s, float t)
1494 CODE:
1495 glTexCoord2f (s, t);
1496
1497void glTexEnv (int target, int pname, float param)
1498 CODE:
1499 glTexEnvf (target, pname, param);
1500
1501void glTexParameter (int target, int pname, float param)
1502 CODE:
1503 glTexParameterf (target, pname, param);
1504
1505void glBindTexture (int target, int name)
1506
1507void glConvolutionParameter (int target, int pname, float params)
1508 CODE:
1509 GL_CALL (PFNGLCONVOLUTIONPARAMETERFEXTPROC, glConvolutionParameterf, (target, pname, params));
1510
1511void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data)
1512 CODE:
1513 GL_CALL (PFNGLCONVOLUTIONFILTER2DEXTPROC, glConvolutionFilter2D,
1514 (target, internalformat, width, height, format, type, data));
1515
1516void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column)
1517 CODE:
1518 GL_CALL (PFNGLSEPARABLEFILTER2DEXTPROC, glSeparableFilter2D,
1519 (target, internalformat, width, height, format, type, row, column));
1520
1521void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data)
1522
1523void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
1524
1525void glRasterPos (int x, int y)
1526 CODE:
1527 glRasterPos2i (x, y);
1528
1529void glCopyPixels (int x, int y, int width, int height, int type = GL_COLOR)
1530
1531int glGenTexture ()
1532 CODE:
1533{
1534 GLuint name;
1535 glGenTextures (1, &name);
1536 RETVAL = name;
1537}
1538 OUTPUT:
1539 RETVAL
1540
1541void glDeleteTexture (int name)
1542 CODE:
1543{
1544 GLuint name_ = name;
1545 glDeleteTextures (1, &name_);
1546}
1547
1548int glGenList ()
1549 CODE:
1550 RETVAL = glGenLists (1);
1551 OUTPUT:
1552 RETVAL
1553
1554void glDeleteList (int list)
1555 CODE:
1556 glDeleteLists (list, 1);
1557
1558void glNewList (int list, int mode = GL_COMPILE)
1559
1560void glEndList ()
1561
1562void glCallList (int list)
1563

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines