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.279 by root, Thu Oct 2 15:59:40 2008 UTC vs.
Revision 1.304 by root, Fri Apr 23 16:30:38 2010 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 32 89#define FOW_DARKNESS 50
90#define DARKNESS_ADJUST(n) (n)
87 91
88#define MAP_EXTEND_X 32 92#define MAP_EXTEND_X 32
89#define MAP_EXTEND_Y 512 93#define MAP_EXTEND_Y 512
90 94
91#define MIN_FONT_HEIGHT 10 95#define MIN_FONT_HEIGHT 10
92 96
93/* mask out modifiers we are not interested in */ 97/* mask out modifiers we are not interested in */
94#define MOD_MASK (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META) 98#define MOD_MASK (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META)
95 99
96#define KMOD_LRAM 0x10000 // our extension 100#define KMOD_LRAM 0x10000 // our extension
101
102#define TEXID_SPEECH 1
103#define TEXID_NOFACE 2
97 104
98static AV *texture_av; 105static AV *texture_av;
99 106
100static struct 107static struct
101{ 108{
233 int w, h; 240 int w, h;
234 float s, t; 241 float s, t;
235 uint8_t r, g, b, a; 242 uint8_t r, g, b, a;
236 tileid smoothtile; 243 tileid smoothtile;
237 uint8_t smoothlevel; 244 uint8_t smoothlevel;
245 uint8_t unused; /* set to zero on use */
238} maptex; 246} maptex;
239 247
240typedef struct { 248typedef struct {
241 uint32_t player; 249 uint32_t player;
242 tileid tile[3]; 250 tileid tile[3];
816 824
817IV minpot (UV n) 825IV minpot (UV n)
818 826
819IV popcount (UV n) 827IV popcount (UV n)
820 828
829NV distance (NV dx, NV dy)
830 CODE:
831 RETVAL = pow (dx * dx + dy * dy, 0.5);
832 OUTPUT:
833 RETVAL
834
821void 835void
822pango_init () 836pango_init ()
823 CODE: 837 CODE:
824{ 838{
825 opengl_fontmap = pango_opengl_font_map_new (); 839 opengl_fontmap = pango_opengl_font_map_new ();
916 930
917 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra"); 931 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
918#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 932#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
919#include "glfunc.h" 933#include "glfunc.h"
920#undef GL_FUNC 934#undef GL_FUNC
935
936 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
937 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
921 } 938 }
922} 939}
923 OUTPUT: 940 OUTPUT:
924 RETVAL 941 RETVAL
925 942
1009 } 1026 }
1010 1027
1011 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1)))); 1028 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1))));
1012 } 1029 }
1013} 1030}
1031
1032char *
1033SDL_AudioDriverName ()
1034 CODE:
1035{
1036 char buf [256];
1037 if (!SDL_AudioDriverName (buf, sizeof (buf)))
1038 XSRETURN_UNDEF;
1039
1040 RETVAL = buf;
1041}
1042 OUTPUT:
1043 RETVAL
1014 1044
1015int 1045int
1016Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096) 1046Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096)
1017 POSTCALL: 1047 POSTCALL:
1018 Mix_HookMusicFinished (music_finished); 1048 Mix_HookMusicFinished (music_finished);
1206#if DEBUG 1236#if DEBUG
1207 VALGRIND_DO_LEAK_CHECK; 1237 VALGRIND_DO_LEAK_CHECK;
1208#endif 1238#endif
1209} 1239}
1210 1240
1241int
1242SvREFCNT (SV *sv)
1243 CODE:
1244 RETVAL = SvREFCNT (sv);
1245 OUTPUT:
1246 RETVAL
1247
1211MODULE = Deliantra::Client PACKAGE = DC::Font 1248MODULE = Deliantra::Client PACKAGE = DC::Font
1212 1249
1213PROTOTYPES: DISABLE 1250PROTOTYPES: DISABLE
1214 1251
1215DC::Font 1252DC::Font
1644 if (ix) 1681 if (ix)
1645 { 1682 {
1646 glDisable (GL_ALPHA_TEST); 1683 glDisable (GL_ALPHA_TEST);
1647 glDisable (GL_BLEND); 1684 glDisable (GL_BLEND);
1648 } 1685 }
1686}
1687
1688void
1689draw_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)
1690 PROTOTYPE: @
1691 CODE:
1692{
1693 glEnable (GL_BLEND);
1694 glBlendFunc (intensity ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1695 glEnable (GL_TEXTURE_2D);
1696 glBindTexture (GL_TEXTURE_2D, name1);
1697
1698 glColor3f (intensity, intensity, intensity);
1699 glPushMatrix ();
1700 glScalef (1./3, 1./3, 1.);
1701
1702 if (blend > 0.f)
1703 {
1704 float dx3 = dx * -3.f / w;
1705 float dy3 = dy * -3.f / h;
1706 GLfloat env_color[4] = { 0., 0., 0., blend };
1707
1708 /* interpolate the two shadow textures */
1709 /* stage 0 == rgb(glcolor) + alpha(t0) */
1710 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1711
1712 /* stage 1 == rgb(glcolor) + alpha(interpolate t0, t1, texenv) */
1713 gl.ActiveTexture (GL_TEXTURE1);
1714 glEnable (GL_TEXTURE_2D);
1715 glBindTexture (GL_TEXTURE_2D, name2);
1716 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
1717
1718 /* rgb == rgb(glcolor) */
1719 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
1720 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
1721 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
1722
1723 /* alpha = interpolate t0, t1 by env_alpha */
1724 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
1725
1726 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE);
1727 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
1728 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
1729
1730 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
1731 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
1732
1733 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
1734 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA);
1735
1736 glBegin (GL_QUADS);
1737 gl.MultiTexCoord2f (GL_TEXTURE0, 0, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 , dy3 ); glVertex2i (0, 0);
1738 gl.MultiTexCoord2f (GL_TEXTURE0, 0, t); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 , dy3 + t); glVertex2i (0, h);
1739 gl.MultiTexCoord2f (GL_TEXTURE0, s, t); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 + t); glVertex2i (w, h);
1740 gl.MultiTexCoord2f (GL_TEXTURE0, s, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 ); glVertex2i (w, 0);
1741 glEnd ();
1742
1743 glDisable (GL_TEXTURE_2D);
1744 gl.ActiveTexture (GL_TEXTURE0);
1745 }
1746 else
1747 {
1748 /* simple blending of one texture, also opengl <1.3 path */
1749 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1750
1751 glBegin (GL_QUADS);
1752 glTexCoord2f (0, 0); glVertex2f (0, 0);
1753 glTexCoord2f (0, t); glVertex2f (0, h);
1754 glTexCoord2f (s, t); glVertex2f (w, h);
1755 glTexCoord2f (s, 0); glVertex2f (w, 0);
1756 glEnd ();
1757 }
1758
1759 /* draw ?-marks or equivalent, this is very clumsy code :/ */
1760 {
1761 int x, y;
1762 int dx3 = dx * 3;
1763 int dy3 = dy * 3;
1764
1765 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1766 glBindTexture (GL_TEXTURE_2D, hidden_tex);
1767 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1768 glTranslatef (-1., -1., 0);
1769 glBegin (GL_QUADS);
1770
1771 for (y = 1; y < h; y += 3)
1772 {
1773 int y1 = y - dy3;
1774 int y1valid = y1 >= 0 && y1 < h;
1775
1776 for (x = 1; x < w; x += 3)
1777 {
1778 int x1 = x - dx3;
1779 uint8_t h1 = data1 [x + y * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1780 uint8_t h2;
1781
1782 if (y1valid && x1 >= 0 && x1 < w)
1783 h2 = data2 [x1 + y1 * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1784 else
1785 h2 = 1; /* out of range == invisible */
1786
1787 if (h1 || h2)
1788 {
1789 float alpha = h1 == h2 ? 1.f : h1 ? 1.f - blend : blend;
1790 glColor4f (1., 1., 1., alpha);
1791
1792 glTexCoord2f (0, 0.); glVertex2i (x , y );
1793 glTexCoord2f (0, 1.); glVertex2i (x , y + 3);
1794 glTexCoord2f (1, 1.); glVertex2i (x + 3, y + 3);
1795 glTexCoord2f (1, 0.); glVertex2i (x + 3, y );
1796 }
1797 }
1798 }
1799 }
1800
1801 glEnd ();
1802
1803 glPopMatrix ();
1804
1805 glDisable (GL_TEXTURE_2D);
1806 glDisable (GL_BLEND);
1649} 1807}
1650 1808
1651IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type) 1809IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type)
1652 CODE: 1810 CODE:
1653{ 1811{
1759 //glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1917 //glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1760 // use uglier nearest interpolation because linear suffers 1918 // use uglier nearest interpolation because linear suffers
1761 // from transparent color bleeding and ugly wrapping effects. 1919 // from transparent color bleeding and ugly wrapping effects.
1762 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1920 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1763} 1921}
1922
1923void
1924expire_textures (DC::Map self, int texid, int count)
1925 PPCODE:
1926 for (; texid < self->texs && count; ++texid, --count)
1927 {
1928 maptex *tex = self->tex + texid;
1929
1930 if (tex->name)
1931 {
1932 if (tex->unused)
1933 {
1934 tex->name = 0;
1935 tex->unused = 0;
1936 XPUSHs (sv_2mortal (newSViv (texid)));
1937 }
1938 else
1939 tex->unused = 1;
1940 }
1941 }
1764 1942
1765int 1943int
1766ox (DC::Map self) 1944ox (DC::Map self)
1767 ALIAS: 1945 ALIAS:
1768 oy = 1 1946 oy = 1
1849 { 2027 {
1850 ext = *data++; 2028 ext = *data++;
1851 cmd = ext & 0x7f; 2029 cmd = ext & 0x7f;
1852 2030
1853 if (cmd < 4) 2031 if (cmd < 4)
1854 cell->darkness = 255 - ext * 64 + 1; 2032 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
1855 else if (cmd == 5) // health 2033 else if (cmd == 5) // health
1856 { 2034 {
1857 cell->stat_width = 1; 2035 cell->stat_width = 1;
1858 cell->stat_hp = *data++; 2036 cell->stat_hp = *data++;
1859 } 2037 }
1889 cell->tile [z] = self->face2tile [face]; 2067 cell->tile [z] = self->face2tile [face];
1890 2068
1891 if (cell->tile [z]) 2069 if (cell->tile [z])
1892 { 2070 {
1893 maptex *tex = self->tex + cell->tile [z]; 2071 maptex *tex = self->tex + cell->tile [z];
2072 tex->unused = 0;
1894 if (!tex->name) 2073 if (!tex->name)
1895 av_push (missing, newSViv (cell->tile [z])); 2074 av_push (missing, newSViv (cell->tile [z]));
1896 2075
1897 if (tex->smoothtile) 2076 if (tex->smoothtile)
1898 { 2077 {
1899 maptex *smooth = self->tex + tex->smoothtile; 2078 maptex *smooth = self->tex + tex->smoothtile;
2079 smooth->unused = 0;
1900 if (!smooth->name) 2080 if (!smooth->name)
1901 av_push (missing, newSViv (tex->smoothtile)); 2081 av_push (missing, newSViv (tex->smoothtile));
1902 } 2082 }
1903 } 2083 }
1904 } 2084 }
1975 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 2155 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
1976 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k) 2156 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k)
1977 smooth_key skey; 2157 smooth_key skey;
1978 int pl_x, pl_y; 2158 int pl_x, pl_y;
1979 maptex pl_tex; 2159 maptex pl_tex;
1980 rc_t *rc = rc_alloc (); 2160 rc_t *rc = rc_alloc ();
2161 rc_t *rc_ov = rc_alloc ();
1981 rc_key_t key; 2162 rc_key_t key;
1982 rc_array_t *arr; 2163 rc_array_t *arr;
1983 2164
1984 pl_tex.name = 0; 2165 pl_tex.name = 0;
1985 2166
1986 // thats current max. sorry. 2167 // that's current max. sorry.
1987 if (sw > 255) sw = 255; 2168 if (sw > 255) sw = 255;
1988 if (sh > 255) sh = 255; 2169 if (sh > 255) sh = 255;
1989 2170
1990 // clear key, in case of extra padding 2171 // clear key, in case of extra padding
1991 memset (&skey, 0, sizeof (skey)); 2172 memset (&skey, 0, sizeof (skey));
1995 key.g = 255; 2176 key.g = 255;
1996 key.b = 255; 2177 key.b = 255;
1997 key.a = 255; 2178 key.a = 255;
1998 key.mode = GL_QUADS; 2179 key.mode = GL_QUADS;
1999 key.format = GL_T2F_V3F; 2180 key.format = GL_T2F_V3F;
2000 key.texname = -1;
2001 2181
2002 mx += self->x; 2182 mx += self->x;
2003 my += self->y; 2183 my += self->y;
2004 2184
2005 // first pass: determine smooth_max 2185 // first pass: determine smooth_max
2029 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2209 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
2030 2210
2031 for (z = 0; z <= 2; z++) 2211 for (z = 0; z <= 2; z++)
2032 { 2212 {
2033 memset (smooth_level, 0, sizeof (smooth_level)); 2213 memset (smooth_level, 0, sizeof (smooth_level));
2214 key.texname = -1;
2034 2215
2035 for (y = 0; y < sh; y++) 2216 for (y = 0; y < sh; y++)
2036 if (0 <= y + my && y + my < self->rows) 2217 if (0 <= y + my && y + my < self->rows)
2037 { 2218 {
2038 maprow *row = self->row + (y + my); 2219 maprow *row = self->row + (y + my);
2044 tileid tile = cell->tile [z]; 2225 tileid tile = cell->tile [z];
2045 2226
2046 if (tile) 2227 if (tile)
2047 { 2228 {
2048 maptex tex = self->tex [tile]; 2229 maptex tex = self->tex [tile];
2049 int px = (x + 1) * T - tex.w; 2230 int px, py;
2050 int py = (y + 1) * T - tex.h;
2051 2231
2052 if (key.texname != tex.name) 2232 if (key.texname != tex.name)
2053 { 2233 {
2234 self->tex [tile].unused = 0;
2235
2054 if (!tex.name) 2236 if (!tex.name)
2055 tex = self->tex [2]; /* missing, replace by noface */ 2237 tex = self->tex [TEXID_NOFACE]; /* missing, replace by noface */
2056 2238
2057 key.texname = tex.name; 2239 key.texname = tex.name;
2058 arr = rc_array (rc, &key); 2240 arr = rc_array (rc, &key);
2059 } 2241 }
2242
2243 px = (x + 1) * T - tex.w;
2244 py = (y + 1) * T - tex.h;
2060 2245
2061 if (expect_false (cell->player == player) && expect_false (z == 2)) 2246 if (expect_false (cell->player == player) && expect_false (z == 2))
2062 { 2247 {
2063 pl_x = px; 2248 pl_x = px;
2064 pl_y = py; 2249 pl_y = py;
2069 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2254 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2070 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0); 2255 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
2071 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0); 2256 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0);
2072 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0); 2257 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
2073 2258
2074 if (expect_false (cell->flags) && expect_false (z == 2))
2075 {
2076 // overlays such as the speech bubble, probably more to come
2077 if (cell->flags & 1)
2078 {
2079 maptex tex = self->tex [1];
2080 int px = x * T + T * 2 / 32;
2081 int py = y * T - T * 6 / 32;
2082
2083 if (tex.name)
2084 {
2085 if (key.texname != tex.name)
2086 {
2087 key.texname = tex.name;
2088 arr = rc_array (rc, &key);
2089 }
2090
2091 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2092 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0);
2093 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0);
2094 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
2095 }
2096 }
2097 }
2098
2099 // update smooth hash 2259 // update smooth hash
2100 if (tex.smoothtile) 2260 if (tex.smoothtile)
2101 { 2261 {
2102 skey.tile = tex.smoothtile; 2262 skey.tile = tex.smoothtile;
2103 skey.level = tex.smoothlevel; 2263 skey.level = tex.smoothlevel;
2131 // corners 2291 // corners
2132 skey.x = x + 2; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0100); 2292 skey.x = x + 2; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0100);
2133 skey.x = x ; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0200); 2293 skey.x = x ; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0200);
2134 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400); 2294 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400);
2135 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800); 2295 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800);
2296 }
2297 }
2298
2299 if (expect_false (z == 2) && expect_false (cell->flags))
2300 {
2301 // overlays such as the speech bubble, probably more to come
2302 if (cell->flags & 1)
2303 {
2304 rc_key_t key_ov = key;
2305 maptex tex = self->tex [TEXID_SPEECH];
2306 rc_array_t *arr;
2307 int px = x * T + T * 2 / 32;
2308 int py = y * T - T * 6 / 32;
2309
2310 key_ov.texname = tex.name;
2311 arr = rc_array (rc_ov, &key_ov);
2312
2313 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2314 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0);
2315 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0);
2316 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
2136 } 2317 }
2137 } 2318 }
2138 } 2319 }
2139 } 2320 }
2140 2321
2180 { 2361 {
2181 // this time avoiding texture state changes 2362 // this time avoiding texture state changes
2182 // save gobs of state changes. 2363 // save gobs of state changes.
2183 if (key.texname != tex.name) 2364 if (key.texname != tex.name)
2184 { 2365 {
2366 self->tex [skey->tile].unused = 0;
2367
2185 glEnd (); 2368 glEnd ();
2186 glBindTexture (GL_TEXTURE_2D, key.texname = tex.name); 2369 glBindTexture (GL_TEXTURE_2D, key.texname = tex.name);
2187 glBegin (GL_QUADS); 2370 glBegin (GL_QUADS);
2188 } 2371 }
2189 2372
2235 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0); 2418 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
2236 2419
2237 rc_draw (rc); 2420 rc_draw (rc);
2238 } 2421 }
2239 2422
2423 rc_draw (rc_ov);
2424 rc_clear (rc_ov);
2425
2240 glDisable (GL_BLEND); 2426 glDisable (GL_BLEND);
2241 rc_free (rc); 2427 rc_free (rc);
2428 rc_free (rc_ov);
2242 2429
2243 // top layer: overlays such as the health bar 2430 // top layer: overlays such as the health bar
2244 for (y = 0; y < sh; y++) 2431 for (y = 0; y < sh; y++)
2245 if (0 <= y + my && y + my < self->rows) 2432 if (0 <= y + my && y + my < self->rows)
2246 { 2433 {
2277 } 2464 }
2278 } 2465 }
2279} 2466}
2280 2467
2281void 2468void
2282draw_magicmap (DC::Map self, int dx, int dy, int w, int h, unsigned char *data) 2469draw_magicmap (DC::Map self, int w, int h, unsigned char *data)
2283 CODE: 2470 CODE:
2284{ 2471{
2285 static float color[16][3] = { 2472 static float color[16][3] = {
2286 { 0.00F, 0.00F, 0.00F }, 2473 { 0.00f, 0.00f, 0.00f },
2287 { 1.00F, 1.00F, 1.00F }, 2474 { 1.00f, 1.00f, 1.00f },
2288 { 0.00F, 0.00F, 0.55F }, 2475 { 0.00f, 0.00f, 0.55f },
2289 { 1.00F, 0.00F, 0.00F }, 2476 { 1.00f, 0.00f, 0.00f },
2290 2477
2291 { 1.00F, 0.54F, 0.00F }, 2478 { 1.00f, 0.54f, 0.00f },
2292 { 0.11F, 0.56F, 1.00F }, 2479 { 0.11f, 0.56f, 1.00f },
2293 { 0.93F, 0.46F, 0.00F }, 2480 { 0.93f, 0.46f, 0.00f },
2294 { 0.18F, 0.54F, 0.34F }, 2481 { 0.18f, 0.54f, 0.34f },
2295 2482
2296 { 0.56F, 0.73F, 0.56F }, 2483 { 0.56f, 0.73f, 0.56f },
2297 { 0.80F, 0.80F, 0.80F }, 2484 { 0.80f, 0.80f, 0.80f },
2298 { 0.55F, 0.41F, 0.13F }, 2485 { 0.55f, 0.41f, 0.13f },
2299 { 0.99F, 0.77F, 0.26F }, 2486 { 0.99f, 0.77f, 0.26f },
2300 2487
2301 { 0.74F, 0.65F, 0.41F }, 2488 { 0.74f, 0.65f, 0.41f },
2302 2489
2303 { 0.00F, 1.00F, 1.00F }, 2490 { 0.00f, 1.00f, 1.00f },
2304 { 1.00F, 0.00F, 1.00F }, 2491 { 1.00f, 0.00f, 1.00f },
2305 { 1.00F, 1.00F, 0.00F }, 2492 { 1.00f, 1.00f, 0.00f },
2306 }; 2493 };
2307 2494
2308 int x, y; 2495 int x, y;
2309 2496
2310 glEnable (GL_TEXTURE_2D); 2497 glEnable (GL_TEXTURE_2D);
2498 /* GL_REPLACE would be correct, as we don't need to modulate alpha,
2499 * but the nvidia driver (185.18.14) mishandles alpha textures
2500 * and takes the colour from god knows where instead of using
2501 * Cp. MODULATE results in the same colour, but slightly different
2502 * alpha, but atcually gives us the correct colour with nvidia.
2503 */
2311 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2504 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
2312 glEnable (GL_BLEND); 2505 glEnable (GL_BLEND);
2313 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2506 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2314 glBegin (GL_QUADS); 2507 glBegin (GL_QUADS);
2315 2508
2316 for (y = 0; y < h; y++) 2509 for (y = 0; y < h; y++)
2320 2513
2321 if (m) 2514 if (m)
2322 { 2515 {
2323 float *c = color [m & 15]; 2516 float *c = color [m & 15];
2324 2517
2325 float tx1 = m & 0x40 ? 0.5 : 0.; 2518 float tx1 = m & 0x40 ? 0.5f : 0.f;
2326 float tx2 = tx1 + 0.5; 2519 float tx2 = tx1 + 0.5f;
2327 2520
2328 glColor4f (c[0], c[1], c[2], 0.75); 2521 glColor4f (c[0], c[1], c[2], 1);
2329 glTexCoord2f (tx1, 0.); glVertex2i (x , y ); 2522 glTexCoord2f (tx1, 0.); glVertex2i (x , y );
2330 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1); 2523 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1);
2331 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1); 2524 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1);
2332 glTexCoord2f (tx2, 0.); glVertex2i (x + 1, y ); 2525 glTexCoord2f (tx2, 0.); glVertex2i (x + 1, y );
2333 } 2526 }
2341void 2534void
2342fow_texture (DC::Map self, int mx, int my, int sw, int sh) 2535fow_texture (DC::Map self, int mx, int my, int sw, int sh)
2343 PPCODE: 2536 PPCODE:
2344{ 2537{
2345 int x, y; 2538 int x, y;
2346 int sw1 = sw + 2; 2539 int sw1 = sw + 2;
2347 int sh1 = sh + 2; 2540 int sh1 = sh + 2;
2348 int sh3 = sh * 3; 2541 int sh3 = sh * 3;
2349 int sw34 = (sw * 3 + 3) & ~3; 2542 int sw3 = sw * 3;
2350 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1); 2543 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2351 SV *darkness3_sv = sv_2mortal (newSV (sw34 * sh3)); 2544 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2352 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv); 2545 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2353 2546
2354 SvPOK_only (darkness3_sv); 2547 SvPOK_only (darkness3_sv);
2355 SvCUR_set (darkness3_sv, sw34 * sh3); 2548 SvCUR_set (darkness3_sv, sw3 * sh3);
2356 2549
2357 mx += self->x - 1; 2550 mx += self->x - 1;
2358 my += self->y - 1; 2551 my += self->y - 1;
2359
2360 memset (darkness1, 255 - FOW_DARKNESS, sw1 * sh1);
2361 2552
2362 for (y = 0; y < sh1; y++) 2553 for (y = 0; y < sh1; y++)
2363 if (0 <= y + my && y + my < self->rows) 2554 if (0 <= y + my && y + my < self->rows)
2364 { 2555 {
2365 maprow *row = self->row + (y + my); 2556 maprow *row = self->row + (y + my);
2368 if (row->c0 <= x + mx && x + mx < row->c1) 2559 if (row->c0 <= x + mx && x + mx < row->c1)
2369 { 2560 {
2370 mapcell *cell = row->col + (x + mx - row->c0); 2561 mapcell *cell = row->col + (x + mx - row->c0);
2371 2562
2372 darkness1 [y * sw1 + x] = cell->darkness 2563 darkness1 [y * sw1 + x] = cell->darkness
2373 ? 255 - (cell->darkness - 1) 2564 ? DARKNESS_ADJUST (255 - (cell->darkness - 1))
2374 : 255 - FOW_DARKNESS; 2565 : DARKNESS_ADJUST (255 - FOW_DARKNESS);
2375 } 2566 }
2376 } 2567 }
2377 2568
2378 for (y = 0; y < sh; ++y) 2569 for (y = 0; y < sh; ++y)
2379 for (x = 0; x < sw; ++x) 2570 for (x = 0; x < sw; ++x)
2398 2589
2399 uint8_t r13 = (d13 + d23 + d12) / 3; 2590 uint8_t r13 = (d13 + d23 + d12) / 3;
2400 uint8_t r23 = d23; 2591 uint8_t r23 = d23;
2401 uint8_t r33 = (d23 + d33 + d32) / 3; 2592 uint8_t r33 = (d23 + d33 + d32) / 3;
2402 2593
2403 darkness3 [(y * 3 ) * sw34 + (x * 3 )] = MAX (d22, r11); 2594 darkness3 [(y * 3 ) * sw3 + (x * 3 )] = MAX (d22, r11);
2404 darkness3 [(y * 3 ) * sw34 + (x * 3 + 1)] = MAX (d22, r21); 2595 darkness3 [(y * 3 ) * sw3 + (x * 3 + 1)] = MAX (d22, r21);
2405 darkness3 [(y * 3 ) * sw34 + (x * 3 + 2)] = MAX (d22, r31); 2596 darkness3 [(y * 3 ) * sw3 + (x * 3 + 2)] = MAX (d22, r31);
2406 darkness3 [(y * 3 + 1) * sw34 + (x * 3 )] = MAX (d22, r12); 2597 darkness3 [(y * 3 + 1) * sw3 + (x * 3 )] = MAX (d22, r12);
2407 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 1)] = MAX (d22, r22); 2598 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 1)] = MAX (d22, r22); /* this MUST be == d22 */
2408 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 2)] = MAX (d22, r32); 2599 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 2)] = MAX (d22, r32);
2409 darkness3 [(y * 3 + 2) * sw34 + (x * 3 )] = MAX (d22, r13); 2600 darkness3 [(y * 3 + 2) * sw3 + (x * 3 )] = MAX (d22, r13);
2410 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 1)] = MAX (d22, r23); 2601 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 1)] = MAX (d22, r23);
2411 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 2)] = MAX (d22, r33); 2602 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 2)] = MAX (d22, r33);
2412 } 2603 }
2413 2604
2414 free (darkness1); 2605 free (darkness1);
2415 2606
2416 EXTEND (SP, 3); 2607 EXTEND (SP, 3);
2417 PUSHs (sv_2mortal (newSViv (sw34))); 2608 PUSHs (sv_2mortal (newSViv (sw3)));
2418 PUSHs (sv_2mortal (newSViv (sh3))); 2609 PUSHs (sv_2mortal (newSViv (sh3)));
2419 PUSHs (darkness3_sv); 2610 PUSHs (darkness3_sv);
2420} 2611}
2421 2612
2422SV * 2613SV *
2620 if (RETVAL < 0) 2811 if (RETVAL < 0)
2621 { 2812 {
2622 RETVAL = Mix_GroupOldest (-1); 2813 RETVAL = Mix_GroupOldest (-1);
2623 2814
2624 if (RETVAL < 0) 2815 if (RETVAL < 0)
2816 {
2817 // happens sometimes, maybe it just stopped playing(?)
2818 RETVAL = Mix_GroupAvailable (-1);
2819
2820 if (RETVAL < 0)
2625 XSRETURN_UNDEF; 2821 XSRETURN_UNDEF;
2626 2822 }
2823 else
2627 Mix_HaltChannel (RETVAL); 2824 Mix_HaltChannel (RETVAL);
2628 } 2825 }
2629 2826
2630 Mix_UnregisterAllEffects (RETVAL); 2827 Mix_UnregisterAllEffects (RETVAL);
2631 Mix_Volume (RETVAL, 128); 2828 Mix_Volume (RETVAL, 128);
2632} 2829}
2679void 2876void
2680set_position_r (DC::Channel self, int dx, int dy, int maxdistance) 2877set_position_r (DC::Channel self, int dx, int dy, int maxdistance)
2681 CODE: 2878 CODE:
2682{ 2879{
2683 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance)); 2880 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2684 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI); 2881 int angle = atan2f (dx, -dy) * 180.f / (float)M_PI + 360.f;
2685 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255)); 2882 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2686} 2883}
2687 2884
2688void 2885void
2689set_reverse_stereo (DC::Channel self, int flip) 2886set_reverse_stereo (DC::Channel self, int flip)
2691 Mix_SetReverseStereo (self, flip); 2888 Mix_SetReverseStereo (self, flip);
2692 2889
2693MODULE = Deliantra::Client PACKAGE = DC::MixChunk 2890MODULE = Deliantra::Client PACKAGE = DC::MixChunk
2694 2891
2695PROTOTYPES: DISABLE 2892PROTOTYPES: DISABLE
2893
2894void
2895decoders ()
2896 PPCODE:
2897#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2898 int i, num = Mix_GetNumChunkDecoders ();
2899 EXTEND (SP, num);
2900 for (i = 0; i < num; ++i)
2901 PUSHs (sv_2mortal (newSVpv (Mix_GetChunkDecoder (i), 0)));
2902#else
2903 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2904#endif
2696 2905
2697DC::MixChunk 2906DC::MixChunk
2698new (SV *class, DC::RW rwops) 2907new (SV *class, DC::RW rwops)
2699 CODE: 2908 CODE:
2700 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2909 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2733 OUTPUT: 2942 OUTPUT:
2734 RETVAL 2943 RETVAL
2735 2944
2736MODULE = Deliantra::Client PACKAGE = DC::MixMusic 2945MODULE = Deliantra::Client PACKAGE = DC::MixMusic
2737 2946
2947void
2948decoders ()
2949 PPCODE:
2950#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2951 int i, num = Mix_GetNumMusicDecoders ();
2952 EXTEND (SP, num);
2953 for (i = 0; i < num; ++i)
2954 PUSHs (sv_2mortal (newSVpv (Mix_GetMusicDecoder (i), 0)));
2955#else
2956 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2957#endif
2958
2738int 2959int
2739volume (int volume = -1) 2960volume (int volume = -1)
2740 PROTOTYPE: ;$ 2961 PROTOTYPE: ;$
2741 CODE: 2962 CODE:
2742 if (items > 0) 2963 if (items > 0)
2752 2973
2753void 2974void
2754halt () 2975halt ()
2755 CODE: 2976 CODE:
2756 Mix_HaltMusic (); 2977 Mix_HaltMusic ();
2978
2979int
2980playing ()
2981 CODE:
2982 RETVAL = Mix_PlayingMusic ();
2983 OUTPUT:
2984 RETVAL
2757 2985
2758DC::MixMusic 2986DC::MixMusic
2759new (SV *class, DC::RW rwops) 2987new (SV *class, DC::RW rwops)
2760 CODE: 2988 CODE:
2761 RETVAL = Mix_LoadMUS_RW (rwops); 2989 RETVAL = Mix_LoadMUS_RW (rwops);
2792 } *civ, const_iv[] = { 3020 } *civ, const_iv[] = {
2793# define const_iv(name) { # name, (IV)name } 3021# define const_iv(name) { # name, (IV)name }
2794 const_iv (GL_VENDOR), 3022 const_iv (GL_VENDOR),
2795 const_iv (GL_VERSION), 3023 const_iv (GL_VERSION),
2796 const_iv (GL_EXTENSIONS), 3024 const_iv (GL_EXTENSIONS),
3025 const_iv (GL_MAX_TEXTURE_UNITS),
2797 const_iv (GL_COLOR_MATERIAL), 3026 const_iv (GL_COLOR_MATERIAL),
2798 const_iv (GL_SMOOTH), 3027 const_iv (GL_SMOOTH),
2799 const_iv (GL_FLAT), 3028 const_iv (GL_FLAT),
2800 const_iv (GL_DITHER), 3029 const_iv (GL_DITHER),
2801 const_iv (GL_BLEND), 3030 const_iv (GL_BLEND),
2813 const_iv (GL_ZERO), 3042 const_iv (GL_ZERO),
2814 const_iv (GL_SRC_ALPHA), 3043 const_iv (GL_SRC_ALPHA),
2815 const_iv (GL_DST_ALPHA), 3044 const_iv (GL_DST_ALPHA),
2816 const_iv (GL_ONE_MINUS_SRC_ALPHA), 3045 const_iv (GL_ONE_MINUS_SRC_ALPHA),
2817 const_iv (GL_ONE_MINUS_DST_ALPHA), 3046 const_iv (GL_ONE_MINUS_DST_ALPHA),
3047 const_iv (GL_SRC_COLOR),
3048 const_iv (GL_DST_COLOR),
3049 const_iv (GL_ONE_MINUS_SRC_COLOR),
3050 const_iv (GL_ONE_MINUS_DST_COLOR),
2818 const_iv (GL_SRC_ALPHA_SATURATE), 3051 const_iv (GL_SRC_ALPHA_SATURATE),
2819 const_iv (GL_RGB), 3052 const_iv (GL_RGB),
2820 const_iv (GL_RGBA), 3053 const_iv (GL_RGBA),
2821 const_iv (GL_RGBA4), 3054 const_iv (GL_RGBA4),
2822 const_iv (GL_RGBA8), 3055 const_iv (GL_RGBA8),
2890 const_iv (GL_NICEST), 3123 const_iv (GL_NICEST),
2891 const_iv (GL_V2F), 3124 const_iv (GL_V2F),
2892 const_iv (GL_V3F), 3125 const_iv (GL_V3F),
2893 const_iv (GL_T2F_V3F), 3126 const_iv (GL_T2F_V3F),
2894 const_iv (GL_T2F_N3F_V3F), 3127 const_iv (GL_T2F_N3F_V3F),
3128 const_iv (GL_FUNC_ADD),
3129 const_iv (GL_FUNC_SUBTRACT),
3130 const_iv (GL_FUNC_REVERSE_SUBTRACT),
2895# undef const_iv 3131# undef const_iv
2896 }; 3132 };
2897 3133
2898 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 3134 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
2899 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 3135 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
2906disable_GL_EXT_blend_func_separate () 3142disable_GL_EXT_blend_func_separate ()
2907 CODE: 3143 CODE:
2908 gl.BlendFuncSeparate = 0; 3144 gl.BlendFuncSeparate = 0;
2909 gl.BlendFuncSeparateEXT = 0; 3145 gl.BlendFuncSeparateEXT = 0;
2910 3146
3147void
3148apple_nvidia_bug (int enable)
3149
2911char * 3150char *
2912gl_vendor () 3151gl_vendor ()
2913 CODE: 3152 CODE:
2914 RETVAL = (char *)glGetString (GL_VENDOR); 3153 RETVAL = (char *)glGetString (GL_VENDOR);
2915 OUTPUT: 3154 OUTPUT:
2945 3184
2946int glGetError () 3185int glGetError ()
2947 3186
2948void glFinish () 3187void glFinish ()
2949 3188
3189void glFlush ()
3190
2950void glClear (int mask) 3191void glClear (int mask)
2951 3192
2952void glClearColor (float r, float g, float b, float a = 1.0) 3193void glClearColor (float r, float g, float b, float a = 1.0)
2953 PROTOTYPE: @ 3194 PROTOTYPE: @
2954 3195
2963void glBlendFunc (int sfactor, int dfactor) 3204void glBlendFunc (int sfactor, int dfactor)
2964 3205
2965void glBlendFuncSeparate (int sa, int da, int saa, int daa) 3206void glBlendFuncSeparate (int sa, int da, int saa, int daa)
2966 CODE: 3207 CODE:
2967 gl_BlendFuncSeparate (sa, da, saa, daa); 3208 gl_BlendFuncSeparate (sa, da, saa, daa);
3209
3210# void glBlendEquation (int se)
2968 3211
2969void glDepthMask (int flag) 3212void glDepthMask (int flag)
2970 3213
2971void glLogicOp (int opcode) 3214void glLogicOp (int opcode)
2972 3215
3122void glNewList (int list, int mode = GL_COMPILE) 3365void glNewList (int list, int mode = GL_COMPILE)
3123 3366
3124void glEndList () 3367void glEndList ()
3125 3368
3126void glCallList (int list) 3369void glCallList (int list)
3370
3371void c_init ()
3372 CODE:
3373 glPixelStorei (GL_PACK_ALIGNMENT , 1);
3374 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
3127 3375
3128MODULE = Deliantra::Client PACKAGE = DC::UI::Base 3376MODULE = Deliantra::Client PACKAGE = DC::UI::Base
3129 3377
3130PROTOTYPES: DISABLE 3378PROTOTYPES: DISABLE
3131 3379

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines