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.303 by root, Thu Apr 22 11:18:04 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
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
102 104
103static AV *texture_av; 105static AV *texture_av;
104 106
105static struct 107static struct
106{ 108{
822 824
823IV minpot (UV n) 825IV minpot (UV n)
824 826
825IV popcount (UV n) 827IV popcount (UV n)
826 828
829NV distance (NV dx, NV dy)
830 CODE:
831 RETVAL = pow (dx * dx + dy * dy, 0.5);
832 OUTPUT:
833 RETVAL
834
827void 835void
828pango_init () 836pango_init ()
829 CODE: 837 CODE:
830{ 838{
831 opengl_fontmap = pango_opengl_font_map_new (); 839 opengl_fontmap = pango_opengl_font_map_new ();
922 930
923 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra"); 931 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
924#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);
925#include "glfunc.h" 933#include "glfunc.h"
926#undef GL_FUNC 934#undef GL_FUNC
935
936 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
937 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
927 } 938 }
928} 939}
929 OUTPUT: 940 OUTPUT:
930 RETVAL 941 RETVAL
931 942
1015 } 1026 }
1016 1027
1017 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))));
1018 } 1029 }
1019} 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
1020 1044
1021int 1045int
1022Mix_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)
1023 POSTCALL: 1047 POSTCALL:
1024 Mix_HookMusicFinished (music_finished); 1048 Mix_HookMusicFinished (music_finished);
1660 glDisable (GL_BLEND); 1684 glDisable (GL_BLEND);
1661 } 1685 }
1662} 1686}
1663 1687
1664void 1688void
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) 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)
1666 PROTOTYPE: @ 1690 PROTOTYPE: @
1667 CODE: 1691 CODE:
1668{ 1692{
1693 glEnable (GL_BLEND);
1694 glBlendFunc (intensity ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1669 glEnable (GL_TEXTURE_2D); 1695 glEnable (GL_TEXTURE_2D);
1670 glEnable (GL_BLEND);
1671 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1672 glBindTexture (GL_TEXTURE_2D, name1); 1696 glBindTexture (GL_TEXTURE_2D, name1);
1673 1697
1674 glColor3f (intensity, intensity, intensity); 1698 glColor3f (intensity, intensity, intensity);
1675 glPushMatrix (); 1699 glPushMatrix ();
1676 glScalef (1./3, 1./3, 1.); 1700 glScalef (1./3, 1./3, 1.);
1677 1701
1678 if (blend > 0.f) 1702 if (blend > 0.f)
1679 { 1703 {
1680 float S2, T2; /* 0. 0. for texture 2 */ 1704 float dx3 = dx * -3.f / w;
1681 float w = w1 > w2 ? w1 : w2; 1705 float dy3 = dy * -3.f / h;
1682 float h = h1 > h2 ? h1 : h2;
1683 GLfloat env_color[4] = { 0., 0., 0., blend }; 1706 GLfloat env_color[4] = { 0., 0., 0., blend };
1684 1707
1685 /* interpolate the two shadow textures */ 1708 /* interpolate the two shadow textures */
1686 /* stage 0 == rgb(glcolor) + alpha(t0) */ 1709 /* stage 0 == rgb(glcolor) + alpha(t0) */
1687 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1710 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1692 glBindTexture (GL_TEXTURE_2D, name2); 1715 glBindTexture (GL_TEXTURE_2D, name2);
1693 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 1716 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
1694 1717
1695 /* rgb == rgb(glcolor) */ 1718 /* rgb == rgb(glcolor) */
1696 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); 1719 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
1697 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT); 1720 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
1698 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 1721 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
1699 1722
1700 /* alpha = interpolate t0, t1 by env_alpha */ 1723 /* alpha = interpolate t0, t1 by env_alpha */
1701 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color); 1724 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
1702 1725
1708 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); 1731 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
1709 1732
1710 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT); 1733 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
1711 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA); 1734 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA);
1712 1735
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); 1736 glBegin (GL_QUADS);
1725 gl.MultiTexCoord2f (GL_TEXTURE0, 0, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx , dy ); glVertex2f ( 0, 0); 1737 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); 1738 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); 1739 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); 1740 gl.MultiTexCoord2f (GL_TEXTURE0, s, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 ); glVertex2i (w, 0);
1729 glEnd (); 1741 glEnd ();
1730 1742
1731 glDisable (GL_TEXTURE_2D); 1743 glDisable (GL_TEXTURE_2D);
1732 gl.ActiveTexture (GL_TEXTURE0); 1744 gl.ActiveTexture (GL_TEXTURE0);
1733 } 1745 }
1735 { 1747 {
1736 /* simple blending of one texture, also opengl <1.3 path */ 1748 /* simple blending of one texture, also opengl <1.3 path */
1737 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1749 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1738 1750
1739 glBegin (GL_QUADS); 1751 glBegin (GL_QUADS);
1740 glTexCoord2f ( 0, 0); glVertex2f ( 0, 0); 1752 glTexCoord2f (0, 0); glVertex2f (0, 0);
1741 glTexCoord2f ( 0, t1); glVertex2f ( 0, h1); 1753 glTexCoord2f (0, t); glVertex2f (0, h);
1742 glTexCoord2f (s1, t1); glVertex2f (w1, h1); 1754 glTexCoord2f (s, t); glVertex2f (w, h);
1743 glTexCoord2f (s1, 0); glVertex2f (w1, 0); 1755 glTexCoord2f (s, 0); glVertex2f (w, 0);
1744 glEnd (); 1756 glEnd ();
1745 } 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 ();
1746 1802
1747 glPopMatrix (); 1803 glPopMatrix ();
1748 1804
1749 glDisable (GL_TEXTURE_2D); 1805 glDisable (GL_TEXTURE_2D);
1750 glDisable (GL_BLEND); 1806 glDisable (GL_BLEND);
1971 { 2027 {
1972 ext = *data++; 2028 ext = *data++;
1973 cmd = ext & 0x7f; 2029 cmd = ext & 0x7f;
1974 2030
1975 if (cmd < 4) 2031 if (cmd < 4)
1976 cell->darkness = 255 - ext * 64 + 1; 2032 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
1977 else if (cmd == 5) // health 2033 else if (cmd == 5) // health
1978 { 2034 {
1979 cell->stat_width = 1; 2035 cell->stat_width = 1;
1980 cell->stat_hp = *data++; 2036 cell->stat_hp = *data++;
1981 } 2037 }
2102 int pl_x, pl_y; 2158 int pl_x, pl_y;
2103 maptex pl_tex; 2159 maptex pl_tex;
2104 rc_t *rc = rc_alloc (); 2160 rc_t *rc = rc_alloc ();
2105 rc_t *rc_ov = rc_alloc (); 2161 rc_t *rc_ov = rc_alloc ();
2106 rc_key_t key; 2162 rc_key_t key;
2107 rc_array_t *arr, *arr_hidden; 2163 rc_array_t *arr;
2108 2164
2109 pl_tex.name = 0; 2165 pl_tex.name = 0;
2110 2166
2111 // that's current max. sorry. 2167 // that's current max. sorry.
2112 if (sw > 255) sw = 255; 2168 if (sw > 255) sw = 255;
2149 } 2205 }
2150 2206
2151 glEnable (GL_BLEND); 2207 glEnable (GL_BLEND);
2152 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2208 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2153 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2209 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 2210
2158 for (z = 0; z <= 2; z++) 2211 for (z = 0; z <= 2; z++)
2159 { 2212 {
2160 memset (smooth_level, 0, sizeof (smooth_level)); 2213 memset (smooth_level, 0, sizeof (smooth_level));
2161 key.texname = -1; 2214 key.texname = -1;
2241 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);
2242 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);
2243 } 2296 }
2244 } 2297 }
2245 2298
2246 if (expect_false (z == 2)) 2299 if (expect_false (z == 2) && expect_false (cell->flags))
2247 { 2300 {
2248 /* draw question marks on top of hidden spaces */ 2301 // overlays such as the speech bubble, probably more to come
2249 if (!cell->darkness) 2302 if (cell->flags & 1)
2250 { 2303 {
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; 2304 rc_key_t key_ov = key;
2267 maptex tex = self->tex [TEXID_SPEECH]; 2305 maptex tex = self->tex [TEXID_SPEECH];
2268 rc_array_t *arr; 2306 rc_array_t *arr;
2269 int px = x * T + T * 2 / 32; 2307 int px = x * T + T * 2 / 32;
2270 int py = y * T - T * 6 / 32; 2308 int py = y * T - T * 6 / 32;
2271 2309
2272 key_ov.texname = tex.name; 2310 key_ov.texname = tex.name;
2273 arr = rc_array (rc_ov, &key_ov); 2311 arr = rc_array (rc_ov, &key_ov);
2274 2312
2275 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2313 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2276 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2314 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0);
2277 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0); 2315 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0);
2278 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0); 2316 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
2279 }
2280 } 2317 }
2281 } 2318 }
2282 } 2319 }
2283 } 2320 }
2284 2321
2427 } 2464 }
2428 } 2465 }
2429} 2466}
2430 2467
2431void 2468void
2432draw_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)
2433 CODE: 2470 CODE:
2434{ 2471{
2435 static float color[16][3] = { 2472 static float color[16][3] = {
2436 { 0.00F, 0.00F, 0.00F }, 2473 { 0.00f, 0.00f, 0.00f },
2437 { 1.00F, 1.00F, 1.00F }, 2474 { 1.00f, 1.00f, 1.00f },
2438 { 0.00F, 0.00F, 0.55F }, 2475 { 0.00f, 0.00f, 0.55f },
2439 { 1.00F, 0.00F, 0.00F }, 2476 { 1.00f, 0.00f, 0.00f },
2440 2477
2441 { 1.00F, 0.54F, 0.00F }, 2478 { 1.00f, 0.54f, 0.00f },
2442 { 0.11F, 0.56F, 1.00F }, 2479 { 0.11f, 0.56f, 1.00f },
2443 { 0.93F, 0.46F, 0.00F }, 2480 { 0.93f, 0.46f, 0.00f },
2444 { 0.18F, 0.54F, 0.34F }, 2481 { 0.18f, 0.54f, 0.34f },
2445 2482
2446 { 0.56F, 0.73F, 0.56F }, 2483 { 0.56f, 0.73f, 0.56f },
2447 { 0.80F, 0.80F, 0.80F }, 2484 { 0.80f, 0.80f, 0.80f },
2448 { 0.55F, 0.41F, 0.13F }, 2485 { 0.55f, 0.41f, 0.13f },
2449 { 0.99F, 0.77F, 0.26F }, 2486 { 0.99f, 0.77f, 0.26f },
2450 2487
2451 { 0.74F, 0.65F, 0.41F }, 2488 { 0.74f, 0.65f, 0.41f },
2452 2489
2453 { 0.00F, 1.00F, 1.00F }, 2490 { 0.00f, 1.00f, 1.00f },
2454 { 1.00F, 0.00F, 1.00F }, 2491 { 1.00f, 0.00f, 1.00f },
2455 { 1.00F, 1.00F, 0.00F }, 2492 { 1.00f, 1.00f, 0.00f },
2456 }; 2493 };
2457 2494
2458 int x, y; 2495 int x, y;
2459 2496
2460 glEnable (GL_TEXTURE_2D); 2497 glEnable (GL_TEXTURE_2D);
2461 /* GL_REPLACE would be correct, as we don't need to modulate alpha, 2498 /* GL_REPLACE would be correct, as we don't need to modulate alpha,
2462 * but the nvidia driver (185.18.14) mishandles alpha textures 2499 * but the nvidia driver (185.18.14) mishandles alpha textures
2463 * ansd takes the colour from god knows where instead of using 2500 * and takes the colour from god knows where instead of using
2464 * Cp. MODULATE results in the same colour, but slightly different 2501 * Cp. MODULATE results in the same colour, but slightly different
2465 * alpha, but atcually gives us the correct colour with nvidia. 2502 * alpha, but atcually gives us the correct colour with nvidia.
2466 */ 2503 */
2467 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 2504 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
2468 glEnable (GL_BLEND); 2505 glEnable (GL_BLEND);
2476 2513
2477 if (m) 2514 if (m)
2478 { 2515 {
2479 float *c = color [m & 15]; 2516 float *c = color [m & 15];
2480 2517
2481 float tx1 = m & 0x40 ? 0.5 : 0.; 2518 float tx1 = m & 0x40 ? 0.5f : 0.f;
2482 float tx2 = tx1 + 0.5; 2519 float tx2 = tx1 + 0.5f;
2483 2520
2484 glColor4f (c[0], c[1], c[2], 1); 2521 glColor4f (c[0], c[1], c[2], 1);
2485 glTexCoord2f (tx1, 0.); glVertex2i (x , y ); 2522 glTexCoord2f (tx1, 0.); glVertex2i (x , y );
2486 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1); 2523 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1);
2487 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1); 2524 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1);
2497void 2534void
2498fow_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)
2499 PPCODE: 2536 PPCODE:
2500{ 2537{
2501 int x, y; 2538 int x, y;
2502 int sw1 = sw + 2; 2539 int sw1 = sw + 2;
2503 int sh1 = sh + 2; 2540 int sh1 = sh + 2;
2504 int sh3 = sh * 3; 2541 int sh3 = sh * 3;
2505 int sw34 = (sw * 3 + 3) & ~3; 2542 int sw3 = sw * 3;
2506 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1); 2543 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2507 SV *darkness3_sv = sv_2mortal (newSV (sw34 * sh3)); 2544 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2508 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv); 2545 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2509 2546
2510 SvPOK_only (darkness3_sv); 2547 SvPOK_only (darkness3_sv);
2511 SvCUR_set (darkness3_sv, sw34 * sh3); 2548 SvCUR_set (darkness3_sv, sw3 * sh3);
2512 2549
2513 mx += self->x - 1; 2550 mx += self->x - 1;
2514 my += self->y - 1; 2551 my += self->y - 1;
2515
2516 memset (darkness1, DARKNESS_ADJUST (255 - FOW_DARKNESS), sw1 * sh1);
2517 2552
2518 for (y = 0; y < sh1; y++) 2553 for (y = 0; y < sh1; y++)
2519 if (0 <= y + my && y + my < self->rows) 2554 if (0 <= y + my && y + my < self->rows)
2520 { 2555 {
2521 maprow *row = self->row + (y + my); 2556 maprow *row = self->row + (y + my);
2554 2589
2555 uint8_t r13 = (d13 + d23 + d12) / 3; 2590 uint8_t r13 = (d13 + d23 + d12) / 3;
2556 uint8_t r23 = d23; 2591 uint8_t r23 = d23;
2557 uint8_t r33 = (d23 + d33 + d32) / 3; 2592 uint8_t r33 = (d23 + d33 + d32) / 3;
2558 2593
2559 darkness3 [(y * 3 ) * sw34 + (x * 3 )] = MAX (d22, r11); 2594 darkness3 [(y * 3 ) * sw3 + (x * 3 )] = MAX (d22, r11);
2560 darkness3 [(y * 3 ) * sw34 + (x * 3 + 1)] = MAX (d22, r21); 2595 darkness3 [(y * 3 ) * sw3 + (x * 3 + 1)] = MAX (d22, r21);
2561 darkness3 [(y * 3 ) * sw34 + (x * 3 + 2)] = MAX (d22, r31); 2596 darkness3 [(y * 3 ) * sw3 + (x * 3 + 2)] = MAX (d22, r31);
2562 darkness3 [(y * 3 + 1) * sw34 + (x * 3 )] = MAX (d22, r12); 2597 darkness3 [(y * 3 + 1) * sw3 + (x * 3 )] = MAX (d22, r12);
2563 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 */
2564 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 2)] = MAX (d22, r32); 2599 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 2)] = MAX (d22, r32);
2565 darkness3 [(y * 3 + 2) * sw34 + (x * 3 )] = MAX (d22, r13); 2600 darkness3 [(y * 3 + 2) * sw3 + (x * 3 )] = MAX (d22, r13);
2566 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 1)] = MAX (d22, r23); 2601 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 1)] = MAX (d22, r23);
2567 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 2)] = MAX (d22, r33); 2602 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 2)] = MAX (d22, r33);
2568 } 2603 }
2569 2604
2570 free (darkness1); 2605 free (darkness1);
2571 2606
2572 EXTEND (SP, 3); 2607 EXTEND (SP, 3);
2573 PUSHs (sv_2mortal (newSViv (sw34))); 2608 PUSHs (sv_2mortal (newSViv (sw3)));
2574 PUSHs (sv_2mortal (newSViv (sh3))); 2609 PUSHs (sv_2mortal (newSViv (sh3)));
2575 PUSHs (darkness3_sv); 2610 PUSHs (darkness3_sv);
2576} 2611}
2577 2612
2578SV * 2613SV *
2776 if (RETVAL < 0) 2811 if (RETVAL < 0)
2777 { 2812 {
2778 RETVAL = Mix_GroupOldest (-1); 2813 RETVAL = Mix_GroupOldest (-1);
2779 2814
2780 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)
2781 XSRETURN_UNDEF; 2821 XSRETURN_UNDEF;
2782 2822 }
2823 else
2783 Mix_HaltChannel (RETVAL); 2824 Mix_HaltChannel (RETVAL);
2784 } 2825 }
2785 2826
2786 Mix_UnregisterAllEffects (RETVAL); 2827 Mix_UnregisterAllEffects (RETVAL);
2787 Mix_Volume (RETVAL, 128); 2828 Mix_Volume (RETVAL, 128);
2788} 2829}
2835void 2876void
2836set_position_r (DC::Channel self, int dx, int dy, int maxdistance) 2877set_position_r (DC::Channel self, int dx, int dy, int maxdistance)
2837 CODE: 2878 CODE:
2838{ 2879{
2839 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));
2840 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;
2841 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255)); 2882 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2842} 2883}
2843 2884
2844void 2885void
2845set_reverse_stereo (DC::Channel self, int flip) 2886set_reverse_stereo (DC::Channel self, int flip)
2847 Mix_SetReverseStereo (self, flip); 2888 Mix_SetReverseStereo (self, flip);
2848 2889
2849MODULE = Deliantra::Client PACKAGE = DC::MixChunk 2890MODULE = Deliantra::Client PACKAGE = DC::MixChunk
2850 2891
2851PROTOTYPES: 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
2852 2905
2853DC::MixChunk 2906DC::MixChunk
2854new (SV *class, DC::RW rwops) 2907new (SV *class, DC::RW rwops)
2855 CODE: 2908 CODE:
2856 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2909 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2889 OUTPUT: 2942 OUTPUT:
2890 RETVAL 2943 RETVAL
2891 2944
2892MODULE = Deliantra::Client PACKAGE = DC::MixMusic 2945MODULE = Deliantra::Client PACKAGE = DC::MixMusic
2893 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
2894int 2959int
2895volume (int volume = -1) 2960volume (int volume = -1)
2896 PROTOTYPE: ;$ 2961 PROTOTYPE: ;$
2897 CODE: 2962 CODE:
2898 if (items > 0) 2963 if (items > 0)
2908 2973
2909void 2974void
2910halt () 2975halt ()
2911 CODE: 2976 CODE:
2912 Mix_HaltMusic (); 2977 Mix_HaltMusic ();
2978
2979int
2980playing ()
2981 CODE:
2982 RETVAL = Mix_PlayingMusic ();
2983 OUTPUT:
2984 RETVAL
2913 2985
2914DC::MixMusic 2986DC::MixMusic
2915new (SV *class, DC::RW rwops) 2987new (SV *class, DC::RW rwops)
2916 CODE: 2988 CODE:
2917 RETVAL = Mix_LoadMUS_RW (rwops); 2989 RETVAL = Mix_LoadMUS_RW (rwops);
3292 3364
3293void glEndList () 3365void glEndList ()
3294 3366
3295void glCallList (int list) 3367void glCallList (int list)
3296 3368
3369void c_init ()
3370 CODE:
3371 glPixelStorei (GL_PACK_ALIGNMENT , 1);
3372 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
3373
3297MODULE = Deliantra::Client PACKAGE = DC::UI::Base 3374MODULE = Deliantra::Client PACKAGE = DC::UI::Base
3298 3375
3299PROTOTYPES: DISABLE 3376PROTOTYPES: DISABLE
3300 3377
3301void 3378void

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines