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.292 by root, Fri Dec 4 15:04:56 2009 UTC vs.
Revision 1.302 by root, Tue Apr 20 10:53:11 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 64 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
95 99
96#define KMOD_LRAM 0x10000 // our extension 100#define KMOD_LRAM 0x10000 // our extension
97 101
98#define TEXID_SPEECH 1 102#define TEXID_SPEECH 1
99#define TEXID_NOFACE 2 103#define TEXID_NOFACE 2
100#define TEXID_HIDDEN 3
101 104
102static AV *texture_av; 105static AV *texture_av;
103 106
104static struct 107static struct
105{ 108{
821 824
822IV minpot (UV n) 825IV minpot (UV n)
823 826
824IV popcount (UV n) 827IV popcount (UV n)
825 828
829NV distance (NV dx, NV dy)
830 CODE:
831 RETVAL = pow (dx * dx + dy * dy, 0.5);
832 OUTPUT:
833 RETVAL
834
826void 835void
827pango_init () 836pango_init ()
828 CODE: 837 CODE:
829{ 838{
830 opengl_fontmap = pango_opengl_font_map_new (); 839 opengl_fontmap = pango_opengl_font_map_new ();
921 930
922 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra"); 931 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
923#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);
924#include "glfunc.h" 933#include "glfunc.h"
925#undef GL_FUNC 934#undef GL_FUNC
935
936 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
937 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
926 } 938 }
927} 939}
928 OUTPUT: 940 OUTPUT:
929 RETVAL 941 RETVAL
930 942
1658 glDisable (GL_ALPHA_TEST); 1670 glDisable (GL_ALPHA_TEST);
1659 glDisable (GL_BLEND); 1671 glDisable (GL_BLEND);
1660 } 1672 }
1661} 1673}
1662 1674
1675void
1676draw_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)
1677 PROTOTYPE: @
1678 CODE:
1679{
1680 glEnable (GL_BLEND);
1681 glBlendFunc (intensity ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1682 glEnable (GL_TEXTURE_2D);
1683 glBindTexture (GL_TEXTURE_2D, name1);
1684
1685 glColor3f (intensity, intensity, intensity);
1686 glPushMatrix ();
1687 glScalef (1./3, 1./3, 1.);
1688
1689 if (blend > 0.f)
1690 {
1691 float dx3 = dx * -3.f / w;
1692 float dy3 = dy * -3.f / h;
1693 GLfloat env_color[4] = { 0., 0., 0., blend };
1694
1695 /* interpolate the two shadow textures */
1696 /* stage 0 == rgb(glcolor) + alpha(t0) */
1697 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1698
1699 /* stage 1 == rgb(glcolor) + alpha(interpolate t0, t1, texenv) */
1700 gl.ActiveTexture (GL_TEXTURE1);
1701 glEnable (GL_TEXTURE_2D);
1702 glBindTexture (GL_TEXTURE_2D, name2);
1703 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
1704
1705 /* rgb == rgb(glcolor) */
1706 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
1707 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
1708 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
1709
1710 /* alpha = interpolate t0, t1 by env_alpha */
1711 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
1712
1713 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE);
1714 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
1715 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
1716
1717 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
1718 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
1719
1720 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
1721 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA);
1722
1723 glBegin (GL_QUADS);
1724 gl.MultiTexCoord2f (GL_TEXTURE0, 0, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 , dy3 ); glVertex2i (0, 0);
1725 gl.MultiTexCoord2f (GL_TEXTURE0, 0, t); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 , dy3 + t); glVertex2i (0, h);
1726 gl.MultiTexCoord2f (GL_TEXTURE0, s, t); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 + t); glVertex2i (w, h);
1727 gl.MultiTexCoord2f (GL_TEXTURE0, s, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 ); glVertex2i (w, 0);
1728 glEnd ();
1729
1730 glDisable (GL_TEXTURE_2D);
1731 gl.ActiveTexture (GL_TEXTURE0);
1732 }
1733 else
1734 {
1735 /* simple blending of one texture, also opengl <1.3 path */
1736 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1737
1738 glBegin (GL_QUADS);
1739 glTexCoord2f (0, 0); glVertex2f (0, 0);
1740 glTexCoord2f (0, t); glVertex2f (0, h);
1741 glTexCoord2f (s, t); glVertex2f (w, h);
1742 glTexCoord2f (s, 0); glVertex2f (w, 0);
1743 glEnd ();
1744 }
1745
1746 /* draw ?-marks or equivalent, this is very clumsy code :/ */
1747 {
1748 int x, y;
1749 int dx3 = dx * 3;
1750 int dy3 = dy * 3;
1751
1752 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1753 glBindTexture (GL_TEXTURE_2D, hidden_tex);
1754 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1755 glTranslatef (-1., -1., 0);
1756 glBegin (GL_QUADS);
1757
1758 for (y = 1; y < h; y += 3)
1759 {
1760 int y1 = y - dy3;
1761 int y1valid = y1 >= 0 && y1 < h;
1762
1763 for (x = 1; x < w; x += 3)
1764 {
1765 int x1 = x - dx3;
1766 uint8_t h1 = data1 [x + y * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1767 uint8_t h2;
1768
1769 if (y1valid && x1 >= 0 && x1 < w)
1770 h2 = data2 [x1 + y1 * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1771 else
1772 h2 = 1; /* out of range == invisible */
1773
1774 if (h1 || h2)
1775 {
1776 float alpha = h1 == h2 ? 1.f : h1 ? 1.f - blend : blend;
1777 glColor4f (1., 1., 1., alpha);
1778
1779 glTexCoord2f (0, 0.); glVertex2i (x , y );
1780 glTexCoord2f (0, 1.); glVertex2i (x , y + 3);
1781 glTexCoord2f (1, 1.); glVertex2i (x + 3, y + 3);
1782 glTexCoord2f (1, 0.); glVertex2i (x + 3, y );
1783 }
1784 }
1785 }
1786 }
1787
1788 glEnd ();
1789
1790 glPopMatrix ();
1791
1792 glDisable (GL_TEXTURE_2D);
1793 glDisable (GL_BLEND);
1794}
1795
1663IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type) 1796IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type)
1664 CODE: 1797 CODE:
1665{ 1798{
1666 GLint width; 1799 GLint width;
1667 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, 0); 1800 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, 0);
1881 { 2014 {
1882 ext = *data++; 2015 ext = *data++;
1883 cmd = ext & 0x7f; 2016 cmd = ext & 0x7f;
1884 2017
1885 if (cmd < 4) 2018 if (cmd < 4)
1886 cell->darkness = 255 - ext * 64 + 1; 2019 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
1887 else if (cmd == 5) // health 2020 else if (cmd == 5) // health
1888 { 2021 {
1889 cell->stat_width = 1; 2022 cell->stat_width = 1;
1890 cell->stat_hp = *data++; 2023 cell->stat_hp = *data++;
1891 } 2024 }
2012 int pl_x, pl_y; 2145 int pl_x, pl_y;
2013 maptex pl_tex; 2146 maptex pl_tex;
2014 rc_t *rc = rc_alloc (); 2147 rc_t *rc = rc_alloc ();
2015 rc_t *rc_ov = rc_alloc (); 2148 rc_t *rc_ov = rc_alloc ();
2016 rc_key_t key; 2149 rc_key_t key;
2017 rc_array_t *arr, *arr_hidden; 2150 rc_array_t *arr;
2018 2151
2019 pl_tex.name = 0; 2152 pl_tex.name = 0;
2020 2153
2021 // that's current max. sorry. 2154 // that's current max. sorry.
2022 if (sw > 255) sw = 255; 2155 if (sw > 255) sw = 255;
2059 } 2192 }
2060 2193
2061 glEnable (GL_BLEND); 2194 glEnable (GL_BLEND);
2062 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2195 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2063 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2196 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
2064
2065 key.texname = self->tex [TEXID_HIDDEN].name;
2066 arr_hidden = rc_array (rc_ov, &key);
2067 2197
2068 for (z = 0; z <= 2; z++) 2198 for (z = 0; z <= 2; z++)
2069 { 2199 {
2070 memset (smooth_level, 0, sizeof (smooth_level)); 2200 memset (smooth_level, 0, sizeof (smooth_level));
2071 key.texname = -1; 2201 key.texname = -1;
2151 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400); 2281 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400);
2152 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800); 2282 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800);
2153 } 2283 }
2154 } 2284 }
2155 2285
2156 if (expect_false (z == 2)) 2286 if (expect_false (z == 2) && expect_false (cell->flags))
2157 { 2287 {
2158 /* draw question marks on top of hidden spaces */ 2288 // overlays such as the speech bubble, probably more to come
2159 if (!cell->darkness) 2289 if (cell->flags & 1)
2160 { 2290 {
2161 maptex tex = self->tex [TEXID_HIDDEN];
2162 int px = (x + 1) * T - tex.w;
2163 int py = (y + 1) * T - tex.h;
2164
2165 rc_t2f_v3f (arr_hidden, 0 , 0 , px , py , 0);
2166 rc_t2f_v3f (arr_hidden, 0 , tex.t, px , py + tex.h, 0);
2167 rc_t2f_v3f (arr_hidden, tex.s, tex.t, px + tex.w, py + tex.h, 0);
2168 rc_t2f_v3f (arr_hidden, tex.s, 0 , px + tex.w, py , 0);
2169 }
2170
2171 if (expect_false (cell->flags))
2172 {
2173 // overlays such as the speech bubble, probably more to come
2174 if (cell->flags & 1)
2175 {
2176 rc_key_t key_ov = key; 2291 rc_key_t key_ov = key;
2177 maptex tex = self->tex [TEXID_SPEECH]; 2292 maptex tex = self->tex [TEXID_SPEECH];
2178 rc_array_t *arr; 2293 rc_array_t *arr;
2179 int px = x * T + T * 2 / 32; 2294 int px = x * T + T * 2 / 32;
2180 int py = y * T - T * 6 / 32; 2295 int py = y * T - T * 6 / 32;
2181 2296
2182 key_ov.texname = tex.name; 2297 key_ov.texname = tex.name;
2183 arr = rc_array (rc_ov, &key_ov); 2298 arr = rc_array (rc_ov, &key_ov);
2184 2299
2185 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2300 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2186 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2301 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0);
2187 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0); 2302 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0);
2188 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0); 2303 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
2189 }
2190 } 2304 }
2191 } 2305 }
2192 } 2306 }
2193 } 2307 }
2194 2308
2337 } 2451 }
2338 } 2452 }
2339} 2453}
2340 2454
2341void 2455void
2342draw_magicmap (DC::Map self, int dx, int dy, int w, int h, unsigned char *data) 2456draw_magicmap (DC::Map self, int w, int h, unsigned char *data)
2343 CODE: 2457 CODE:
2344{ 2458{
2345 static float color[16][3] = { 2459 static float color[16][3] = {
2346 { 0.00F, 0.00F, 0.00F }, 2460 { 0.00f, 0.00f, 0.00f },
2347 { 1.00F, 1.00F, 1.00F }, 2461 { 1.00f, 1.00f, 1.00f },
2348 { 0.00F, 0.00F, 0.55F }, 2462 { 0.00f, 0.00f, 0.55f },
2349 { 1.00F, 0.00F, 0.00F }, 2463 { 1.00f, 0.00f, 0.00f },
2350 2464
2351 { 1.00F, 0.54F, 0.00F }, 2465 { 1.00f, 0.54f, 0.00f },
2352 { 0.11F, 0.56F, 1.00F }, 2466 { 0.11f, 0.56f, 1.00f },
2353 { 0.93F, 0.46F, 0.00F }, 2467 { 0.93f, 0.46f, 0.00f },
2354 { 0.18F, 0.54F, 0.34F }, 2468 { 0.18f, 0.54f, 0.34f },
2355 2469
2356 { 0.56F, 0.73F, 0.56F }, 2470 { 0.56f, 0.73f, 0.56f },
2357 { 0.80F, 0.80F, 0.80F }, 2471 { 0.80f, 0.80f, 0.80f },
2358 { 0.55F, 0.41F, 0.13F }, 2472 { 0.55f, 0.41f, 0.13f },
2359 { 0.99F, 0.77F, 0.26F }, 2473 { 0.99f, 0.77f, 0.26f },
2360 2474
2361 { 0.74F, 0.65F, 0.41F }, 2475 { 0.74f, 0.65f, 0.41f },
2362 2476
2363 { 0.00F, 1.00F, 1.00F }, 2477 { 0.00f, 1.00f, 1.00f },
2364 { 1.00F, 0.00F, 1.00F }, 2478 { 1.00f, 0.00f, 1.00f },
2365 { 1.00F, 1.00F, 0.00F }, 2479 { 1.00f, 1.00f, 0.00f },
2366 }; 2480 };
2367 2481
2368 int x, y; 2482 int x, y;
2369 2483
2370 glEnable (GL_TEXTURE_2D); 2484 glEnable (GL_TEXTURE_2D);
2371 /* GL_REPLACE would be correct, as we don't need to modulate alpha, 2485 /* GL_REPLACE would be correct, as we don't need to modulate alpha,
2372 * but the nvidia driver (185.18.14) mishandles alpha textures 2486 * but the nvidia driver (185.18.14) mishandles alpha textures
2373 * ansd takes the colour from god knows where instead of using 2487 * and takes the colour from god knows where instead of using
2374 * Cp. MODULATE results in the same colour, but slightly different 2488 * Cp. MODULATE results in the same colour, but slightly different
2375 * alpha, but atcually gives us the correct colour with nvidia. 2489 * alpha, but atcually gives us the correct colour with nvidia.
2376 */ 2490 */
2377 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 2491 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
2378 glEnable (GL_BLEND); 2492 glEnable (GL_BLEND);
2386 2500
2387 if (m) 2501 if (m)
2388 { 2502 {
2389 float *c = color [m & 15]; 2503 float *c = color [m & 15];
2390 2504
2391 float tx1 = m & 0x40 ? 0.5 : 0.; 2505 float tx1 = m & 0x40 ? 0.5f : 0.f;
2392 float tx2 = tx1 + 0.5; 2506 float tx2 = tx1 + 0.5f;
2393 2507
2394 glColor4f (c[0], c[1], c[2], 1); 2508 glColor4f (c[0], c[1], c[2], 1);
2395 glTexCoord2f (tx1, 0.); glVertex2i (x , y ); 2509 glTexCoord2f (tx1, 0.); glVertex2i (x , y );
2396 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1); 2510 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1);
2397 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1); 2511 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1);
2407void 2521void
2408fow_texture (DC::Map self, int mx, int my, int sw, int sh) 2522fow_texture (DC::Map self, int mx, int my, int sw, int sh)
2409 PPCODE: 2523 PPCODE:
2410{ 2524{
2411 int x, y; 2525 int x, y;
2412 int sw1 = sw + 2; 2526 int sw1 = sw + 2;
2413 int sh1 = sh + 2; 2527 int sh1 = sh + 2;
2414 int sh3 = sh * 3; 2528 int sh3 = sh * 3;
2415 int sw34 = (sw * 3 + 3) & ~3; 2529 int sw3 = sw * 3;
2416 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1); 2530 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2417 SV *darkness3_sv = sv_2mortal (newSV (sw34 * sh3)); 2531 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2418 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv); 2532 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2419 2533
2420 SvPOK_only (darkness3_sv); 2534 SvPOK_only (darkness3_sv);
2421 SvCUR_set (darkness3_sv, sw34 * sh3); 2535 SvCUR_set (darkness3_sv, sw3 * sh3);
2422 2536
2423 mx += self->x - 1; 2537 mx += self->x - 1;
2424 my += self->y - 1; 2538 my += self->y - 1;
2425
2426 memset (darkness1, 255 - FOW_DARKNESS, sw1 * sh1);
2427 2539
2428 for (y = 0; y < sh1; y++) 2540 for (y = 0; y < sh1; y++)
2429 if (0 <= y + my && y + my < self->rows) 2541 if (0 <= y + my && y + my < self->rows)
2430 { 2542 {
2431 maprow *row = self->row + (y + my); 2543 maprow *row = self->row + (y + my);
2434 if (row->c0 <= x + mx && x + mx < row->c1) 2546 if (row->c0 <= x + mx && x + mx < row->c1)
2435 { 2547 {
2436 mapcell *cell = row->col + (x + mx - row->c0); 2548 mapcell *cell = row->col + (x + mx - row->c0);
2437 2549
2438 darkness1 [y * sw1 + x] = cell->darkness 2550 darkness1 [y * sw1 + x] = cell->darkness
2439 ? 255 - (cell->darkness - 1) 2551 ? DARKNESS_ADJUST (255 - (cell->darkness - 1))
2440 : 255 - FOW_DARKNESS; 2552 : DARKNESS_ADJUST (255 - FOW_DARKNESS);
2441 } 2553 }
2442 } 2554 }
2443 2555
2444 for (y = 0; y < sh; ++y) 2556 for (y = 0; y < sh; ++y)
2445 for (x = 0; x < sw; ++x) 2557 for (x = 0; x < sw; ++x)
2464 2576
2465 uint8_t r13 = (d13 + d23 + d12) / 3; 2577 uint8_t r13 = (d13 + d23 + d12) / 3;
2466 uint8_t r23 = d23; 2578 uint8_t r23 = d23;
2467 uint8_t r33 = (d23 + d33 + d32) / 3; 2579 uint8_t r33 = (d23 + d33 + d32) / 3;
2468 2580
2469 darkness3 [(y * 3 ) * sw34 + (x * 3 )] = MAX (d22, r11); 2581 darkness3 [(y * 3 ) * sw3 + (x * 3 )] = MAX (d22, r11);
2470 darkness3 [(y * 3 ) * sw34 + (x * 3 + 1)] = MAX (d22, r21); 2582 darkness3 [(y * 3 ) * sw3 + (x * 3 + 1)] = MAX (d22, r21);
2471 darkness3 [(y * 3 ) * sw34 + (x * 3 + 2)] = MAX (d22, r31); 2583 darkness3 [(y * 3 ) * sw3 + (x * 3 + 2)] = MAX (d22, r31);
2472 darkness3 [(y * 3 + 1) * sw34 + (x * 3 )] = MAX (d22, r12); 2584 darkness3 [(y * 3 + 1) * sw3 + (x * 3 )] = MAX (d22, r12);
2473 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 1)] = MAX (d22, r22); 2585 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 1)] = MAX (d22, r22); /* this MUST be == d22 */
2474 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 2)] = MAX (d22, r32); 2586 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 2)] = MAX (d22, r32);
2475 darkness3 [(y * 3 + 2) * sw34 + (x * 3 )] = MAX (d22, r13); 2587 darkness3 [(y * 3 + 2) * sw3 + (x * 3 )] = MAX (d22, r13);
2476 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 1)] = MAX (d22, r23); 2588 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 1)] = MAX (d22, r23);
2477 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 2)] = MAX (d22, r33); 2589 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 2)] = MAX (d22, r33);
2478 } 2590 }
2479 2591
2480 free (darkness1); 2592 free (darkness1);
2481 2593
2482 EXTEND (SP, 3); 2594 EXTEND (SP, 3);
2483 PUSHs (sv_2mortal (newSViv (sw34))); 2595 PUSHs (sv_2mortal (newSViv (sw3)));
2484 PUSHs (sv_2mortal (newSViv (sh3))); 2596 PUSHs (sv_2mortal (newSViv (sh3)));
2485 PUSHs (darkness3_sv); 2597 PUSHs (darkness3_sv);
2486} 2598}
2487 2599
2488SV * 2600SV *
2686 if (RETVAL < 0) 2798 if (RETVAL < 0)
2687 { 2799 {
2688 RETVAL = Mix_GroupOldest (-1); 2800 RETVAL = Mix_GroupOldest (-1);
2689 2801
2690 if (RETVAL < 0) 2802 if (RETVAL < 0)
2803 {
2804 // happens sometimes, maybe it just stopped playing(?)
2805 RETVAL = Mix_GroupAvailable (-1);
2806
2807 if (RETVAL < 0)
2691 XSRETURN_UNDEF; 2808 XSRETURN_UNDEF;
2692 2809 }
2810 else
2693 Mix_HaltChannel (RETVAL); 2811 Mix_HaltChannel (RETVAL);
2694 } 2812 }
2695 2813
2696 Mix_UnregisterAllEffects (RETVAL); 2814 Mix_UnregisterAllEffects (RETVAL);
2697 Mix_Volume (RETVAL, 128); 2815 Mix_Volume (RETVAL, 128);
2698} 2816}
2745void 2863void
2746set_position_r (DC::Channel self, int dx, int dy, int maxdistance) 2864set_position_r (DC::Channel self, int dx, int dy, int maxdistance)
2747 CODE: 2865 CODE:
2748{ 2866{
2749 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance)); 2867 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2750 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI); 2868 int angle = atan2f (dx, -dy) * 180.f / (float)M_PI + 360.f;
2751 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255)); 2869 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2752} 2870}
2753 2871
2754void 2872void
2755set_reverse_stereo (DC::Channel self, int flip) 2873set_reverse_stereo (DC::Channel self, int flip)
2757 Mix_SetReverseStereo (self, flip); 2875 Mix_SetReverseStereo (self, flip);
2758 2876
2759MODULE = Deliantra::Client PACKAGE = DC::MixChunk 2877MODULE = Deliantra::Client PACKAGE = DC::MixChunk
2760 2878
2761PROTOTYPES: DISABLE 2879PROTOTYPES: DISABLE
2880
2881void
2882decoders ()
2883 PPCODE:
2884#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2885 int i, num = Mix_GetNumChunkDecoders ();
2886 EXTEND (SP, num);
2887 for (i = 0; i < num; ++i)
2888 PUSHs (sv_2mortal (newSVpv (Mix_GetChunkDecoder (i), 0)));
2889#else
2890 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2891#endif
2762 2892
2763DC::MixChunk 2893DC::MixChunk
2764new (SV *class, DC::RW rwops) 2894new (SV *class, DC::RW rwops)
2765 CODE: 2895 CODE:
2766 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2896 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2799 OUTPUT: 2929 OUTPUT:
2800 RETVAL 2930 RETVAL
2801 2931
2802MODULE = Deliantra::Client PACKAGE = DC::MixMusic 2932MODULE = Deliantra::Client PACKAGE = DC::MixMusic
2803 2933
2934void
2935decoders ()
2936 PPCODE:
2937#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2938 int i, num = Mix_GetNumMusicDecoders ();
2939 EXTEND (SP, num);
2940 for (i = 0; i < num; ++i)
2941 PUSHs (sv_2mortal (newSVpv (Mix_GetMusicDecoder (i), 0)));
2942#else
2943 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2944#endif
2945
2804int 2946int
2805volume (int volume = -1) 2947volume (int volume = -1)
2806 PROTOTYPE: ;$ 2948 PROTOTYPE: ;$
2807 CODE: 2949 CODE:
2808 if (items > 0) 2950 if (items > 0)
2818 2960
2819void 2961void
2820halt () 2962halt ()
2821 CODE: 2963 CODE:
2822 Mix_HaltMusic (); 2964 Mix_HaltMusic ();
2965
2966int
2967playing ()
2968 CODE:
2969 RETVAL = Mix_PlayingMusic ();
2970 OUTPUT:
2971 RETVAL
2823 2972
2824DC::MixMusic 2973DC::MixMusic
2825new (SV *class, DC::RW rwops) 2974new (SV *class, DC::RW rwops)
2826 CODE: 2975 CODE:
2827 RETVAL = Mix_LoadMUS_RW (rwops); 2976 RETVAL = Mix_LoadMUS_RW (rwops);
2858 } *civ, const_iv[] = { 3007 } *civ, const_iv[] = {
2859# define const_iv(name) { # name, (IV)name } 3008# define const_iv(name) { # name, (IV)name }
2860 const_iv (GL_VENDOR), 3009 const_iv (GL_VENDOR),
2861 const_iv (GL_VERSION), 3010 const_iv (GL_VERSION),
2862 const_iv (GL_EXTENSIONS), 3011 const_iv (GL_EXTENSIONS),
3012 const_iv (GL_MAX_TEXTURE_UNITS),
2863 const_iv (GL_COLOR_MATERIAL), 3013 const_iv (GL_COLOR_MATERIAL),
2864 const_iv (GL_SMOOTH), 3014 const_iv (GL_SMOOTH),
2865 const_iv (GL_FLAT), 3015 const_iv (GL_FLAT),
2866 const_iv (GL_DITHER), 3016 const_iv (GL_DITHER),
2867 const_iv (GL_BLEND), 3017 const_iv (GL_BLEND),
2879 const_iv (GL_ZERO), 3029 const_iv (GL_ZERO),
2880 const_iv (GL_SRC_ALPHA), 3030 const_iv (GL_SRC_ALPHA),
2881 const_iv (GL_DST_ALPHA), 3031 const_iv (GL_DST_ALPHA),
2882 const_iv (GL_ONE_MINUS_SRC_ALPHA), 3032 const_iv (GL_ONE_MINUS_SRC_ALPHA),
2883 const_iv (GL_ONE_MINUS_DST_ALPHA), 3033 const_iv (GL_ONE_MINUS_DST_ALPHA),
3034 const_iv (GL_SRC_COLOR),
3035 const_iv (GL_DST_COLOR),
3036 const_iv (GL_ONE_MINUS_SRC_COLOR),
3037 const_iv (GL_ONE_MINUS_DST_COLOR),
2884 const_iv (GL_SRC_ALPHA_SATURATE), 3038 const_iv (GL_SRC_ALPHA_SATURATE),
2885 const_iv (GL_RGB), 3039 const_iv (GL_RGB),
2886 const_iv (GL_RGBA), 3040 const_iv (GL_RGBA),
2887 const_iv (GL_RGBA4), 3041 const_iv (GL_RGBA4),
2888 const_iv (GL_RGBA8), 3042 const_iv (GL_RGBA8),
3197 3351
3198void glEndList () 3352void glEndList ()
3199 3353
3200void glCallList (int list) 3354void glCallList (int list)
3201 3355
3356void c_init ()
3357 CODE:
3358 glPixelStorei (GL_PACK_ALIGNMENT , 1);
3359 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
3360
3202MODULE = Deliantra::Client PACKAGE = DC::UI::Base 3361MODULE = Deliantra::Client PACKAGE = DC::UI::Base
3203 3362
3204PROTOTYPES: DISABLE 3363PROTOTYPES: DISABLE
3205 3364
3206void 3365void

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines