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.294 by root, Sat Dec 19 05:06:56 2009 UTC vs.
Revision 1.311 by root, Tue Dec 27 09:17:27 2011 UTC

19 19
20#ifdef _WIN32 20#ifdef _WIN32
21# undef pipe 21# undef pipe
22// microsoft vs. C 22// microsoft vs. C
23# define sqrtf(x) sqrt(x) 23# define sqrtf(x) sqrt(x)
24# define roundf(x) (int)(x)
25# define atan2f(x,y) atan2(x,y) 24# define atan2f(x,y) atan2(x,y)
26# define M_PI 3.14159265f 25# define M_PI 3.14159265f
27#endif 26#endif
28 27
29#include <assert.h> 28#include <assert.h>
42#include <SDL_opengl.h> 41#include <SDL_opengl.h>
43 42
44/* work around os x broken headers */ 43/* work around os x broken headers */
45#ifdef __MACOSX__ 44#ifdef __MACOSX__
46typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); 45typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
46typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
47typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
47#endif 48#endif
48 49
49#define PANGO_ENABLE_BACKEND 50#define PANGO_ENABLE_BACKEND
50#define G_DISABLE_CAST_CHECKS 51#define G_DISABLE_CAST_CHECKS
51 52
81#define expect_false(expr) expect ((expr) != 0, 0) 82#define expect_false(expr) expect ((expr) != 0, 0)
82#define expect_true(expr) expect ((expr) != 0, 1) 83#define expect_true(expr) expect ((expr) != 0, 1)
83 84
84#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */ 85#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */
85 86
87/* this is used as fow flag as well, so has to have a different value */
88/* then anything that is computed by incoming darkness */
86#define FOW_DARKNESS 64 89#define FOW_DARKNESS 50
87#define DARKNESS_ADJUST(n) ((29 * (int)(n)) >> 5) /* times 0.9 */ 90#define DARKNESS_ADJUST(n) (n)
88 91
89#define MAP_EXTEND_X 32 92#define MAP_EXTEND_X 32
90#define MAP_EXTEND_Y 512 93#define MAP_EXTEND_Y 512
91 94
92#define MIN_FONT_HEIGHT 10 95#define MIN_FONT_HEIGHT 10
96 99
97#define KMOD_LRAM 0x10000 // our extension 100#define KMOD_LRAM 0x10000 // our extension
98 101
99#define TEXID_SPEECH 1 102#define TEXID_SPEECH 1
100#define TEXID_NOFACE 2 103#define TEXID_NOFACE 2
101#define TEXID_HIDDEN 3 104
105static char *
106fast_sv_grow (SV *sv, STRLEN need)
107{
108 STRLEN len = SvLEN (sv);
109 STRLEN want = SvCUR (sv) + need;
110
111 if (expect_false (len < want))
112 {
113 do
114 len *= 2;
115 while (len < want);
116
117 sv_grow (sv, len);
118 }
119
120 SvCUR_set (sv, want);
121 return SvEND (sv) - need;
122}
102 123
103static AV *texture_av; 124static AV *texture_av;
104 125
105static struct 126static struct
106{ 127{
461 482
462 SDL_PushEvent ((SDL_Event *)&ev); 483 SDL_PushEvent ((SDL_Event *)&ev);
463} 484}
464 485
465static unsigned int 486static unsigned int
487div255 (unsigned int n)
488{
489 return (n + (n >> 8)) >> 8;
490}
491
492static unsigned int
466minpot (unsigned int n) 493minpot (unsigned int n)
467{ 494{
468 if (!n) 495 if (!n)
469 return 0; 496 return 0;
470 497
553 580
554static void 581static void
555deliantra_main () 582deliantra_main ()
556{ 583{
557 char *argv[] = { 0 }; 584 char *argv[] = { 0 };
558 call_argv ("::main", G_DISCARD | G_VOID, argv); 585 call_argv ("DC::Main::main", G_DISCARD | G_VOID, argv);
559} 586}
560 587
561#ifdef __MACOSX__ 588#ifdef __MACOSX__
562 /* to due surprising braindamage on the side of SDL design, we 589 /* to due surprising braindamage on the side of SDL design, we
563 * do some mind-boggling hack here: SDL requires a custom main() 590 * do some mind-boggling hack here: SDL requires a custom main()
564 * on OS X, so... we provide one and call the original main(), which, 591 * on OS X, so... we provide one and call the original main(), which,
565 * due to share dlibrary magic, calls -lSDLmain's main, not perl's main, 592 * due to shared library magic, calls -lSDLmain's main, not perl's main,
566 * and which calls our main (== SDL_main) back. 593 * and which calls our main (== SDL_main) back.
567 */ 594 */
568 extern C_LINKAGE int 595 extern C_LINKAGE int
569 main (int argc, char *argv[]) 596 main (int argc, char *argv[])
570 { 597 {
794 821
795 const_iv (FOW_DARKNESS) 822 const_iv (FOW_DARKNESS)
796# undef const_iv 823# undef const_iv
797 }; 824 };
798 825
799 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 826 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
800 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 827 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
801 828
802 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK); 829 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK);
803 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE); 830 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE);
804} 831}
805 832
821NV ceil (NV x) 848NV ceil (NV x)
822 849
823IV minpot (UV n) 850IV minpot (UV n)
824 851
825IV popcount (UV n) 852IV popcount (UV n)
853
854NV distance (NV dx, NV dy)
855 CODE:
856 RETVAL = pow (dx * dx + dy * dy, 0.5);
857 OUTPUT:
858 RETVAL
826 859
827void 860void
828pango_init () 861pango_init ()
829 CODE: 862 CODE:
830{ 863{
922 955
923 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra"); 956 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
924#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 957#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
925#include "glfunc.h" 958#include "glfunc.h"
926#undef GL_FUNC 959#undef GL_FUNC
960
961 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
962 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
927 } 963 }
928} 964}
929 OUTPUT: 965 OUTPUT:
930 RETVAL 966 RETVAL
931 967
939SDL_GetAppState () 975SDL_GetAppState ()
940 976
941int 977int
942SDL_GetModState () 978SDL_GetModState ()
943 979
980int
981SDL_WaitEvent ()
982 C_ARGS: 0
983
944void 984void
985SDL_PumpEvents ()
986
987void
945poll_events () 988peep_events ()
946 PPCODE: 989 PPCODE:
947{ 990{
948 SDL_Event ev; 991 SDL_Event ev;
949 992
950 SDL_PumpEvents (); 993 SDL_PumpEvents ();
1016 1059
1017 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1)))); 1060 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1))));
1018 } 1061 }
1019} 1062}
1020 1063
1064char *
1065SDL_AudioDriverName ()
1066 CODE:
1067{
1068 char buf [256];
1069 if (!SDL_AudioDriverName (buf, sizeof (buf)))
1070 XSRETURN_UNDEF;
1071
1072 RETVAL = buf;
1073}
1074 OUTPUT:
1075 RETVAL
1076
1021int 1077int
1022Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096) 1078Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096)
1023 POSTCALL: 1079 POSTCALL:
1024 Mix_HookMusicFinished (music_finished); 1080 Mix_HookMusicFinished (music_finished);
1025 Mix_ChannelFinished (channel_finished); 1081 Mix_ChannelFinished (channel_finished);
1087add_font (char *file) 1143add_font (char *file)
1088 CODE: 1144 CODE:
1089 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file); 1145 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file);
1090 OUTPUT: 1146 OUTPUT:
1091 RETVAL 1147 RETVAL
1148
1149void
1150IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1151
1152void
1153Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_MP3 | MIX_INIT_OGG)
1092 1154
1093void 1155void
1094load_image_inline (SV *image_) 1156load_image_inline (SV *image_)
1095 ALIAS: 1157 ALIAS:
1096 load_image_file = 1 1158 load_image_file = 1
1660 glDisable (GL_BLEND); 1722 glDisable (GL_BLEND);
1661 } 1723 }
1662} 1724}
1663 1725
1664void 1726void
1665draw_fow_texture (float intensity, int name1, float s1, float t1, float w1, float h1, float blend = 0.f, float dx = 0.f, float dy = 0.f, int name2 = 0, float s2 = 0.f, float t2 = 0.f, float w2 = 0.f, float h2 = 0.f) 1727draw_fow_texture (float intensity, int hidden_tex, int name1, uint8_t *data1, float s, float t, int w, int h, float blend = 0.f, int dx = 0, int dy = 0, int name2 = 0, uint8_t *data2 = data1)
1666 PROTOTYPE: @ 1728 PROTOTYPE: @
1667 CODE: 1729 CODE:
1668{ 1730{
1731 glEnable (GL_BLEND);
1732 glBlendFunc (intensity ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1669 glEnable (GL_TEXTURE_2D); 1733 glEnable (GL_TEXTURE_2D);
1670 glEnable (GL_BLEND);
1671 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1672 glBindTexture (GL_TEXTURE_2D, name1); 1734 glBindTexture (GL_TEXTURE_2D, name1);
1673 1735
1674 glColor3f (intensity, intensity, intensity); 1736 glColor3f (intensity, intensity, intensity);
1675 glPushMatrix (); 1737 glPushMatrix ();
1676 glScalef (1./3, 1./3, 1.); 1738 glScalef (1./3, 1./3, 1.);
1677 1739
1678 if (blend > 0.f) 1740 if (blend > 0.f)
1679 { 1741 {
1680 float S2, T2; /* 0. 0. for texture 2 */ 1742 float dx3 = dx * -3.f / w;
1681 float w = w1 > w2 ? w1 : w2; 1743 float dy3 = dy * -3.f / h;
1682 float h = h1 > h2 ? h1 : h2;
1683 GLfloat env_color[4] = { 0., 0., 0., blend }; 1744 GLfloat env_color[4] = { 0., 0., 0., blend };
1684 1745
1685 /* interpolate the two shadow textures */ 1746 /* interpolate the two shadow textures */
1686 /* stage 0 == rgb(glcolor) + alpha(t0) */ 1747 /* stage 0 == rgb(glcolor) + alpha(t0) */
1687 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1748 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1692 glBindTexture (GL_TEXTURE_2D, name2); 1753 glBindTexture (GL_TEXTURE_2D, name2);
1693 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 1754 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
1694 1755
1695 /* rgb == rgb(glcolor) */ 1756 /* rgb == rgb(glcolor) */
1696 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); 1757 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
1697 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT); 1758 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
1698 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 1759 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
1699 1760
1700 /* alpha = interpolate t0, t1 by env_alpha */ 1761 /* alpha = interpolate t0, t1 by env_alpha */
1701 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color); 1762 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
1702 1763
1708 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); 1769 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
1709 1770
1710 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT); 1771 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
1711 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA); 1772 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA);
1712 1773
1713 s1 *= w / w1;
1714 t1 *= h / h1;
1715
1716 dx *= -3.f / w2;
1717 dy *= -3.f / h2;
1718 dx *= w / w2;
1719 dy *= h / h2;
1720
1721 s2 *= w / w2;
1722 t2 *= h / h2;
1723
1724 glBegin (GL_QUADS); 1774 glBegin (GL_QUADS);
1725 gl.MultiTexCoord2f (GL_TEXTURE0, 0, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx , dy ); glVertex2f ( 0, 0); 1775 gl.MultiTexCoord2f (GL_TEXTURE0, 0, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 , dy3 ); glVertex2i (0, 0);
1726 gl.MultiTexCoord2f (GL_TEXTURE0, 0, t1); gl.MultiTexCoord2f (GL_TEXTURE1, dx , dy + t2); glVertex2f ( 0, h1); 1776 gl.MultiTexCoord2f (GL_TEXTURE0, 0, t); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 , dy3 + t); glVertex2i (0, h);
1727 gl.MultiTexCoord2f (GL_TEXTURE0, s1, t1); gl.MultiTexCoord2f (GL_TEXTURE1, dx + s2, dy + t2); glVertex2f (w1, h1); 1777 gl.MultiTexCoord2f (GL_TEXTURE0, s, t); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 + t); glVertex2i (w, h);
1728 gl.MultiTexCoord2f (GL_TEXTURE0, s1, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx + s2, dy ); glVertex2f (w1, 0); 1778 gl.MultiTexCoord2f (GL_TEXTURE0, s, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 ); glVertex2i (w, 0);
1729 glEnd (); 1779 glEnd ();
1730 1780
1731 glDisable (GL_TEXTURE_2D); 1781 glDisable (GL_TEXTURE_2D);
1732 gl.ActiveTexture (GL_TEXTURE0); 1782 gl.ActiveTexture (GL_TEXTURE0);
1733 } 1783 }
1735 { 1785 {
1736 /* simple blending of one texture, also opengl <1.3 path */ 1786 /* simple blending of one texture, also opengl <1.3 path */
1737 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1787 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1738 1788
1739 glBegin (GL_QUADS); 1789 glBegin (GL_QUADS);
1740 glTexCoord2f ( 0, 0); glVertex2f ( 0, 0); 1790 glTexCoord2f (0, 0); glVertex2f (0, 0);
1741 glTexCoord2f ( 0, t1); glVertex2f ( 0, h1); 1791 glTexCoord2f (0, t); glVertex2f (0, h);
1742 glTexCoord2f (s1, t1); glVertex2f (w1, h1); 1792 glTexCoord2f (s, t); glVertex2f (w, h);
1743 glTexCoord2f (s1, 0); glVertex2f (w1, 0); 1793 glTexCoord2f (s, 0); glVertex2f (w, 0);
1744 glEnd (); 1794 glEnd ();
1745 } 1795 }
1796
1797 /* draw ?-marks or equivalent, this is very clumsy code :/ */
1798 {
1799 int x, y;
1800 int dx3 = dx * 3;
1801 int dy3 = dy * 3;
1802
1803 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1804 glBindTexture (GL_TEXTURE_2D, hidden_tex);
1805 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1806 glTranslatef (-1., -1., 0);
1807 glBegin (GL_QUADS);
1808
1809 for (y = 1; y < h; y += 3)
1810 {
1811 int y1 = y - dy3;
1812 int y1valid = y1 >= 0 && y1 < h;
1813
1814 for (x = 1; x < w; x += 3)
1815 {
1816 int x1 = x - dx3;
1817 uint8_t h1 = data1 [x + y * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1818 uint8_t h2;
1819
1820 if (y1valid && x1 >= 0 && x1 < w)
1821 h2 = data2 [x1 + y1 * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1822 else
1823 h2 = 1; /* out of range == invisible */
1824
1825 if (h1 || h2)
1826 {
1827 float alpha = h1 == h2 ? 1.f : h1 ? 1.f - blend : blend;
1828 glColor4f (1., 1., 1., alpha);
1829
1830 glTexCoord2f (0, 0.); glVertex2i (x , y );
1831 glTexCoord2f (0, 1.); glVertex2i (x , y + 3);
1832 glTexCoord2f (1, 1.); glVertex2i (x + 3, y + 3);
1833 glTexCoord2f (1, 0.); glVertex2i (x + 3, y );
1834 }
1835 }
1836 }
1837 }
1838
1839 glEnd ();
1746 1840
1747 glPopMatrix (); 1841 glPopMatrix ();
1748 1842
1749 glDisable (GL_TEXTURE_2D); 1843 glDisable (GL_TEXTURE_2D);
1750 glDisable (GL_BLEND); 1844 glDisable (GL_BLEND);
1971 { 2065 {
1972 ext = *data++; 2066 ext = *data++;
1973 cmd = ext & 0x7f; 2067 cmd = ext & 0x7f;
1974 2068
1975 if (cmd < 4) 2069 if (cmd < 4)
1976 cell->darkness = 255 - ext * 64 + 1; 2070 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
1977 else if (cmd == 5) // health 2071 else if (cmd == 5) // health
1978 { 2072 {
1979 cell->stat_width = 1; 2073 cell->stat_width = 1;
1980 cell->stat_hp = *data++; 2074 cell->stat_hp = *data++;
1981 } 2075 }
2056 ? self->row + y 2150 ? self->row + y
2057 : 0; 2151 : 0;
2058 2152
2059 for (x = x0; x < x1; x++) 2153 for (x = x0; x < x1; x++)
2060 { 2154 {
2061 int r = 32, g = 32, b = 32, a = 192; 2155 unsigned int r = 32, g = 32, b = 32, a = 192;
2062 2156
2063 if (row && row->c0 <= x && x < row->c1) 2157 if (row && row->c0 <= x && x < row->c1)
2064 { 2158 {
2065 mapcell *cell = row->col + (x - row->c0); 2159 mapcell *cell = row->col + (x - row->c0);
2066 2160
2068 { 2162 {
2069 maptex tex = self->tex [cell->tile [z]]; 2163 maptex tex = self->tex [cell->tile [z]];
2070 int a0 = 255 - tex.a; 2164 int a0 = 255 - tex.a;
2071 int a1 = tex.a; 2165 int a1 = tex.a;
2072 2166
2073 r = (r * a0 + tex.r * a1) / 255; 2167 r = div255 (r * a0 + tex.r * a1);
2074 g = (g * a0 + tex.g * a1) / 255; 2168 g = div255 (g * a0 + tex.g * a1);
2075 b = (b * a0 + tex.b * a1) / 255; 2169 b = div255 (b * a0 + tex.b * a1);
2076 a = (a * a0 + tex.a * a1) / 255; 2170 a = div255 (a * a0 + tex.a * a1);
2077 } 2171 }
2078 } 2172 }
2079 2173
2080 *map++ = (r ) 2174 *map++ = (r )
2081 | (g << 8) 2175 | (g << 8)
2088} 2182}
2089 OUTPUT: 2183 OUTPUT:
2090 RETVAL 2184 RETVAL
2091 2185
2092void 2186void
2093draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0) 2187draw (DC::Map self, int mx, int my, int sw, int sh, int Tw, int Th, U32 player = 0xffffffff, int sdx = 0, int sdy = 0)
2094 CODE: 2188 CODE:
2095{ 2189{
2096 int x, y, z; 2190 int x, y, z;
2097 2191
2098 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 2192 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2102 int pl_x, pl_y; 2196 int pl_x, pl_y;
2103 maptex pl_tex; 2197 maptex pl_tex;
2104 rc_t *rc = rc_alloc (); 2198 rc_t *rc = rc_alloc ();
2105 rc_t *rc_ov = rc_alloc (); 2199 rc_t *rc_ov = rc_alloc ();
2106 rc_key_t key; 2200 rc_key_t key;
2107 rc_array_t *arr, *arr_hidden; 2201 rc_array_t *arr;
2108 2202
2109 pl_tex.name = 0; 2203 pl_tex.name = 0;
2110 2204
2111 // that's current max. sorry. 2205 // that's current max. sorry.
2112 if (sw > 255) sw = 255; 2206 if (sw > 255) sw = 255;
2149 } 2243 }
2150 2244
2151 glEnable (GL_BLEND); 2245 glEnable (GL_BLEND);
2152 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2246 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2153 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2247 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
2154
2155 key.texname = self->tex [TEXID_HIDDEN].name;
2156 arr_hidden = rc_array (rc_ov, &key);
2157 2248
2158 for (z = 0; z <= 2; z++) 2249 for (z = 0; z <= 2; z++)
2159 { 2250 {
2160 memset (smooth_level, 0, sizeof (smooth_level)); 2251 memset (smooth_level, 0, sizeof (smooth_level));
2161 key.texname = -1; 2252 key.texname = -1;
2185 2276
2186 key.texname = tex.name; 2277 key.texname = tex.name;
2187 arr = rc_array (rc, &key); 2278 arr = rc_array (rc, &key);
2188 } 2279 }
2189 2280
2190 px = (x + 1) * T - tex.w; 2281 px = (x + 1) * Th - tex.w;
2191 py = (y + 1) * T - tex.h; 2282 py = (y + 1) * Tw - tex.h;
2192 2283
2193 if (expect_false (cell->player == player) && expect_false (z == 2)) 2284 if (expect_false (cell->player == player) && expect_false (z == 2))
2194 { 2285 {
2195 pl_x = px; 2286 pl_x = px;
2196 pl_y = py; 2287 pl_y = py;
2241 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400); 2332 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400);
2242 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800); 2333 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800);
2243 } 2334 }
2244 } 2335 }
2245 2336
2246 if (expect_false (z == 2)) 2337 if (expect_false (z == 2) && expect_false (cell->flags))
2247 { 2338 {
2248 /* draw question marks on top of hidden spaces */ 2339 // overlays such as the speech bubble, probably more to come
2249 if (!cell->darkness) 2340 if (cell->flags & 1)
2250 { 2341 {
2251 maptex tex = self->tex [TEXID_HIDDEN];
2252 int px = (x + 1) * T - tex.w;
2253 int py = (y + 1) * T - tex.h;
2254
2255 rc_t2f_v3f (arr_hidden, 0 , 0 , px , py , 0);
2256 rc_t2f_v3f (arr_hidden, 0 , tex.t, px , py + tex.h, 0);
2257 rc_t2f_v3f (arr_hidden, tex.s, tex.t, px + tex.w, py + tex.h, 0);
2258 rc_t2f_v3f (arr_hidden, tex.s, 0 , px + tex.w, py , 0);
2259 }
2260
2261 if (expect_false (cell->flags))
2262 {
2263 // overlays such as the speech bubble, probably more to come
2264 if (cell->flags & 1)
2265 {
2266 rc_key_t key_ov = key; 2342 rc_key_t key_ov = key;
2267 maptex tex = self->tex [TEXID_SPEECH]; 2343 maptex tex = self->tex [TEXID_SPEECH];
2268 rc_array_t *arr; 2344 rc_array_t *arr;
2269 int px = x * T + T * 2 / 32; 2345 int px = x * Tw + Tw * 2 / 32;
2270 int py = y * T - T * 6 / 32; 2346 int py = y * Th - Th * 6 / 32;
2271 2347
2272 key_ov.texname = tex.name; 2348 key_ov.texname = tex.name;
2273 arr = rc_array (rc_ov, &key_ov); 2349 arr = rc_array (rc_ov, &key_ov);
2274 2350
2275 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2351 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2276 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2352 rc_t2f_v3f (arr, 0 , tex.t, px , py + Th, 0);
2277 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0); 2353 rc_t2f_v3f (arr, tex.s, tex.t, px + Tw, py + Th, 0);
2278 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0); 2354 rc_t2f_v3f (arr, tex.s, 0 , px + Tw, py , 0);
2279 }
2280 } 2355 }
2281 } 2356 }
2282 } 2357 }
2283 } 2358 }
2284 2359
2311 if (!(bits & 0x1000) 2386 if (!(bits & 0x1000)
2312 && skey->level == level 2387 && skey->level == level
2313 && level > smooth_max [skey->x][skey->y]) 2388 && level > smooth_max [skey->x][skey->y])
2314 { 2389 {
2315 maptex tex = self->tex [skey->tile]; 2390 maptex tex = self->tex [skey->tile];
2316 int px = (((int)skey->x) - 1) * T; 2391 int px = (((int)skey->x) - 1) * Tw;
2317 int py = (((int)skey->y) - 1) * T; 2392 int py = (((int)skey->y) - 1) * Th;
2318 int border = bits & 15; 2393 int border = bits & 15;
2319 int corner = (bits >> 8) & ~(bits >> 4) & 15; 2394 int corner = (bits >> 8) & ~(bits >> 4) & 15;
2320 float dx = tex.s * .0625f; // 16 images/row 2395 float dx = tex.s * .0625f; // 16 images/row
2321 float dy = tex.t * .5f ; // 2 images/column 2396 float dy = tex.t * .5f ; // 2 images/column
2322 2397
2335 2410
2336 if (border) 2411 if (border)
2337 { 2412 {
2338 float ox = border * dx; 2413 float ox = border * dx;
2339 2414
2340 glTexCoord2f (ox , 0.f ); glVertex2i (px , py ); 2415 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
2341 glTexCoord2f (ox , dy ); glVertex2i (px , py + T); 2416 glTexCoord2f (ox , dy ); glVertex2i (px , py + Th);
2342 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T); 2417 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py + Th);
2343 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py ); 2418 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + Tw, py );
2344 } 2419 }
2345 2420
2346 if (corner) 2421 if (corner)
2347 { 2422 {
2348 float ox = corner * dx; 2423 float ox = corner * dx;
2349 2424
2350 glTexCoord2f (ox , dy ); glVertex2i (px , py ); 2425 glTexCoord2f (ox , dy ); glVertex2i (px , py );
2351 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T); 2426 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + Th);
2352 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T); 2427 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + Tw, py + Th);
2353 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py ); 2428 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py );
2354 } 2429 }
2355 } 2430 }
2356 } 2431 }
2357 } 2432 }
2358 } 2433 }
2399 for (x = 0; x < sw; x++) 2474 for (x = 0; x < sw; x++)
2400 if (row->c0 <= x + mx && x + mx < row->c1) 2475 if (row->c0 <= x + mx && x + mx < row->c1)
2401 { 2476 {
2402 mapcell *cell = row->col + (x + mx - row->c0); 2477 mapcell *cell = row->col + (x + mx - row->c0);
2403 2478
2404 int px = x * T; 2479 int px = x * Tw;
2405 int py = y * T; 2480 int py = y * Th;
2406 2481
2407 if (expect_false (cell->player == player)) 2482 if (expect_false (cell->player == player))
2408 { 2483 {
2409 px += sdx; 2484 px += sdx;
2410 py += sdy; 2485 py += sdy;
2411 } 2486 }
2412 2487
2413 if (cell->stat_hp) 2488 if (cell->stat_hp)
2414 { 2489 {
2415 int width = cell->stat_width * T; 2490 int width = cell->stat_width * Tw;
2416 int thick = (sh * T / 32 + 27) / 28 + 1 + cell->stat_width; 2491 int thick = (sh * Th / 32 + 27) / 28 + 1 + cell->stat_width;
2417 2492
2418 glColor3ub (0, 0, 0); 2493 glColor3ub (0, 0, 0);
2419 glRectf (px + 1, py - thick - 2, 2494 glRectf (px + 1, py - thick - 2,
2420 px + width - 1, py); 2495 px + width - 1, py);
2421 2496
2427 } 2502 }
2428 } 2503 }
2429} 2504}
2430 2505
2431void 2506void
2432draw_magicmap (DC::Map self, int dx, int dy, int w, int h, unsigned char *data) 2507draw_magicmap (DC::Map self, int w, int h, unsigned char *data)
2433 CODE: 2508 CODE:
2434{ 2509{
2435 static float color[16][3] = { 2510 static float color[16][3] = {
2436 { 0.00F, 0.00F, 0.00F }, 2511 { 0.00f, 0.00f, 0.00f },
2437 { 1.00F, 1.00F, 1.00F }, 2512 { 1.00f, 1.00f, 1.00f },
2438 { 0.00F, 0.00F, 0.55F }, 2513 { 0.00f, 0.00f, 0.55f },
2439 { 1.00F, 0.00F, 0.00F }, 2514 { 1.00f, 0.00f, 0.00f },
2440 2515
2441 { 1.00F, 0.54F, 0.00F }, 2516 { 1.00f, 0.54f, 0.00f },
2442 { 0.11F, 0.56F, 1.00F }, 2517 { 0.11f, 0.56f, 1.00f },
2443 { 0.93F, 0.46F, 0.00F }, 2518 { 0.93f, 0.46f, 0.00f },
2444 { 0.18F, 0.54F, 0.34F }, 2519 { 0.18f, 0.54f, 0.34f },
2445 2520
2446 { 0.56F, 0.73F, 0.56F }, 2521 { 0.56f, 0.73f, 0.56f },
2447 { 0.80F, 0.80F, 0.80F }, 2522 { 0.80f, 0.80f, 0.80f },
2448 { 0.55F, 0.41F, 0.13F }, 2523 { 0.55f, 0.41f, 0.13f },
2449 { 0.99F, 0.77F, 0.26F }, 2524 { 0.99f, 0.77f, 0.26f },
2450 2525
2451 { 0.74F, 0.65F, 0.41F }, 2526 { 0.74f, 0.65f, 0.41f },
2452 2527
2453 { 0.00F, 1.00F, 1.00F }, 2528 { 0.00f, 1.00f, 1.00f },
2454 { 1.00F, 0.00F, 1.00F }, 2529 { 1.00f, 0.00f, 1.00f },
2455 { 1.00F, 1.00F, 0.00F }, 2530 { 1.00f, 1.00f, 0.00f },
2456 }; 2531 };
2457 2532
2458 int x, y; 2533 int x, y;
2459 2534
2460 glEnable (GL_TEXTURE_2D); 2535 glEnable (GL_TEXTURE_2D);
2461 /* GL_REPLACE would be correct, as we don't need to modulate alpha, 2536 /* GL_REPLACE would be correct, as we don't need to modulate alpha,
2462 * but the nvidia driver (185.18.14) mishandles alpha textures 2537 * but the nvidia driver (185.18.14) mishandles alpha textures
2463 * ansd takes the colour from god knows where instead of using 2538 * and takes the colour from god knows where instead of using
2464 * Cp. MODULATE results in the same colour, but slightly different 2539 * Cp. MODULATE results in the same colour, but slightly different
2465 * alpha, but atcually gives us the correct colour with nvidia. 2540 * alpha, but atcually gives us the correct colour with nvidia.
2466 */ 2541 */
2467 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 2542 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
2468 glEnable (GL_BLEND); 2543 glEnable (GL_BLEND);
2476 2551
2477 if (m) 2552 if (m)
2478 { 2553 {
2479 float *c = color [m & 15]; 2554 float *c = color [m & 15];
2480 2555
2481 float tx1 = m & 0x40 ? 0.5 : 0.; 2556 float tx1 = m & 0x40 ? 0.5f : 0.f;
2482 float tx2 = tx1 + 0.5; 2557 float tx2 = tx1 + 0.5f;
2483 2558
2484 glColor4f (c[0], c[1], c[2], 1); 2559 glColor4f (c[0], c[1], c[2], 1);
2485 glTexCoord2f (tx1, 0.); glVertex2i (x , y ); 2560 glTexCoord2f (tx1, 0.); glVertex2i (x , y );
2486 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1); 2561 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1);
2487 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1); 2562 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1);
2497void 2572void
2498fow_texture (DC::Map self, int mx, int my, int sw, int sh) 2573fow_texture (DC::Map self, int mx, int my, int sw, int sh)
2499 PPCODE: 2574 PPCODE:
2500{ 2575{
2501 int x, y; 2576 int x, y;
2502 int sw1 = sw + 2; 2577 int sw1 = sw + 2;
2503 int sh1 = sh + 2; 2578 int sh1 = sh + 2;
2504 int sh3 = sh * 3; 2579 int sh3 = sh * 3;
2505 int sw34 = (sw * 3 + 3) & ~3; 2580 int sw3 = sw * 3;
2581 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2582 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2506 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1); 2583 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2507 SV *darkness3_sv = sv_2mortal (newSV (sw34 * sh3)); 2584 memset (darkness1, 0, sw1*sh1);
2508 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2509 2585
2510 SvPOK_only (darkness3_sv); 2586 SvPOK_only (darkness3_sv);
2511 SvCUR_set (darkness3_sv, sw34 * sh3); 2587 SvCUR_set (darkness3_sv, sw3 * sh3);
2512 2588
2513 mx += self->x - 1; 2589 mx += self->x - 1;
2514 my += self->y - 1; 2590 my += self->y - 1;
2515
2516 memset (darkness1, DARKNESS_ADJUST (255 - FOW_DARKNESS), sw1 * sh1);
2517 2591
2518 for (y = 0; y < sh1; y++) 2592 for (y = 0; y < sh1; y++)
2519 if (0 <= y + my && y + my < self->rows) 2593 if (0 <= y + my && y + my < self->rows)
2520 { 2594 {
2521 maprow *row = self->row + (y + my); 2595 maprow *row = self->row + (y + my);
2554 2628
2555 uint8_t r13 = (d13 + d23 + d12) / 3; 2629 uint8_t r13 = (d13 + d23 + d12) / 3;
2556 uint8_t r23 = d23; 2630 uint8_t r23 = d23;
2557 uint8_t r33 = (d23 + d33 + d32) / 3; 2631 uint8_t r33 = (d23 + d33 + d32) / 3;
2558 2632
2559 darkness3 [(y * 3 ) * sw34 + (x * 3 )] = MAX (d22, r11); 2633 darkness3 [(y * 3 ) * sw3 + (x * 3 )] = MAX (d22, r11);
2560 darkness3 [(y * 3 ) * sw34 + (x * 3 + 1)] = MAX (d22, r21); 2634 darkness3 [(y * 3 ) * sw3 + (x * 3 + 1)] = MAX (d22, r21);
2561 darkness3 [(y * 3 ) * sw34 + (x * 3 + 2)] = MAX (d22, r31); 2635 darkness3 [(y * 3 ) * sw3 + (x * 3 + 2)] = MAX (d22, r31);
2562 darkness3 [(y * 3 + 1) * sw34 + (x * 3 )] = MAX (d22, r12); 2636 darkness3 [(y * 3 + 1) * sw3 + (x * 3 )] = MAX (d22, r12);
2563 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 1)] = MAX (d22, r22); 2637 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 1)] = MAX (d22, r22); /* this MUST be == d22 */
2564 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 2)] = MAX (d22, r32); 2638 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 2)] = MAX (d22, r32);
2565 darkness3 [(y * 3 + 2) * sw34 + (x * 3 )] = MAX (d22, r13); 2639 darkness3 [(y * 3 + 2) * sw3 + (x * 3 )] = MAX (d22, r13);
2566 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 1)] = MAX (d22, r23); 2640 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 1)] = MAX (d22, r23);
2567 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 2)] = MAX (d22, r33); 2641 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 2)] = MAX (d22, r33);
2568 } 2642 }
2569 2643
2570 free (darkness1); 2644 free (darkness1);
2571 2645
2572 EXTEND (SP, 3); 2646 EXTEND (SP, 3);
2573 PUSHs (sv_2mortal (newSViv (sw34))); 2647 PUSHs (sv_2mortal (newSViv (sw3)));
2574 PUSHs (sv_2mortal (newSViv (sh3))); 2648 PUSHs (sv_2mortal (newSViv (sh3)));
2575 PUSHs (darkness3_sv); 2649 PUSHs (darkness3_sv);
2576} 2650}
2577 2651
2578SV * 2652SV *
2776 if (RETVAL < 0) 2850 if (RETVAL < 0)
2777 { 2851 {
2778 RETVAL = Mix_GroupOldest (-1); 2852 RETVAL = Mix_GroupOldest (-1);
2779 2853
2780 if (RETVAL < 0) 2854 if (RETVAL < 0)
2855 {
2856 // happens sometimes, maybe it just stopped playing(?)
2857 RETVAL = Mix_GroupAvailable (-1);
2858
2859 if (RETVAL < 0)
2781 XSRETURN_UNDEF; 2860 XSRETURN_UNDEF;
2782 2861 }
2862 else
2783 Mix_HaltChannel (RETVAL); 2863 Mix_HaltChannel (RETVAL);
2784 } 2864 }
2785 2865
2786 Mix_UnregisterAllEffects (RETVAL); 2866 Mix_UnregisterAllEffects (RETVAL);
2787 Mix_Volume (RETVAL, 128); 2867 Mix_Volume (RETVAL, 128);
2788} 2868}
2835void 2915void
2836set_position_r (DC::Channel self, int dx, int dy, int maxdistance) 2916set_position_r (DC::Channel self, int dx, int dy, int maxdistance)
2837 CODE: 2917 CODE:
2838{ 2918{
2839 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance)); 2919 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2840 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI); 2920 int angle = atan2f (dx, -dy) * 180.f / (float)M_PI + 360.f;
2841 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255)); 2921 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2842} 2922}
2843 2923
2844void 2924void
2845set_reverse_stereo (DC::Channel self, int flip) 2925set_reverse_stereo (DC::Channel self, int flip)
2847 Mix_SetReverseStereo (self, flip); 2927 Mix_SetReverseStereo (self, flip);
2848 2928
2849MODULE = Deliantra::Client PACKAGE = DC::MixChunk 2929MODULE = Deliantra::Client PACKAGE = DC::MixChunk
2850 2930
2851PROTOTYPES: DISABLE 2931PROTOTYPES: DISABLE
2932
2933void
2934decoders ()
2935 PPCODE:
2936#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2937 int i, num = Mix_GetNumChunkDecoders ();
2938 EXTEND (SP, num);
2939 for (i = 0; i < num; ++i)
2940 PUSHs (sv_2mortal (newSVpv (Mix_GetChunkDecoder (i), 0)));
2941#else
2942 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2943#endif
2852 2944
2853DC::MixChunk 2945DC::MixChunk
2854new (SV *class, DC::RW rwops) 2946new (SV *class, DC::RW rwops)
2855 CODE: 2947 CODE:
2856 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2948 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2889 OUTPUT: 2981 OUTPUT:
2890 RETVAL 2982 RETVAL
2891 2983
2892MODULE = Deliantra::Client PACKAGE = DC::MixMusic 2984MODULE = Deliantra::Client PACKAGE = DC::MixMusic
2893 2985
2986void
2987decoders ()
2988 PPCODE:
2989#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2990 int i, num = Mix_GetNumMusicDecoders ();
2991 EXTEND (SP, num);
2992 for (i = 0; i < num; ++i)
2993 PUSHs (sv_2mortal (newSVpv (Mix_GetMusicDecoder (i), 0)));
2994#else
2995 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2996#endif
2997
2894int 2998int
2895volume (int volume = -1) 2999volume (int volume = -1)
2896 PROTOTYPE: ;$ 3000 PROTOTYPE: ;$
2897 CODE: 3001 CODE:
2898 if (items > 0) 3002 if (items > 0)
2908 3012
2909void 3013void
2910halt () 3014halt ()
2911 CODE: 3015 CODE:
2912 Mix_HaltMusic (); 3016 Mix_HaltMusic ();
3017
3018int
3019playing ()
3020 CODE:
3021 RETVAL = Mix_PlayingMusic ();
3022 OUTPUT:
3023 RETVAL
2913 3024
2914DC::MixMusic 3025DC::MixMusic
2915new (SV *class, DC::RW rwops) 3026new (SV *class, DC::RW rwops)
2916 CODE: 3027 CODE:
2917 RETVAL = Mix_LoadMUS_RW (rwops); 3028 RETVAL = Mix_LoadMUS_RW (rwops);
3057 const_iv (GL_FUNC_SUBTRACT), 3168 const_iv (GL_FUNC_SUBTRACT),
3058 const_iv (GL_FUNC_REVERSE_SUBTRACT), 3169 const_iv (GL_FUNC_REVERSE_SUBTRACT),
3059# undef const_iv 3170# undef const_iv
3060 }; 3171 };
3061 3172
3062 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 3173 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
3063 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 3174 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
3064 3175
3065 texture_av = newAV (); 3176 texture_av = newAV ();
3066 AvREAL_off (texture_av); 3177 AvREAL_off (texture_av);
3067} 3178}
3068 3179
3111 RETVAL 3222 RETVAL
3112 3223
3113int glGetError () 3224int glGetError ()
3114 3225
3115void glFinish () 3226void glFinish ()
3227
3228void glFlush ()
3116 3229
3117void glClear (int mask) 3230void glClear (int mask)
3118 3231
3119void glClearColor (float r, float g, float b, float a = 1.0) 3232void glClearColor (float r, float g, float b, float a = 1.0)
3120 PROTOTYPE: @ 3233 PROTOTYPE: @
3291void glNewList (int list, int mode = GL_COMPILE) 3404void glNewList (int list, int mode = GL_COMPILE)
3292 3405
3293void glEndList () 3406void glEndList ()
3294 3407
3295void glCallList (int list) 3408void glCallList (int list)
3409
3410void c_init ()
3411 CODE:
3412 glPixelStorei (GL_PACK_ALIGNMENT , 1);
3413 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
3296 3414
3297MODULE = Deliantra::Client PACKAGE = DC::UI::Base 3415MODULE = Deliantra::Client PACKAGE = DC::UI::Base
3298 3416
3299PROTOTYPES: DISABLE 3417PROTOTYPES: DISABLE
3300 3418

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines