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.210 by root, Tue Jul 24 18:24:03 2007 UTC vs.
Revision 1.223 by root, Sat Aug 11 11:07:08 2007 UTC

17#include "perl.h" 17#include "perl.h"
18#include "XSUB.h" 18#include "XSUB.h"
19 19
20#ifdef _WIN32 20#ifdef _WIN32
21# undef pipe 21# undef pipe
22// microsoft vs. C
23# define sqrtf(x) sqrt(x)
24# define roundf(x) (int)(x)
25# define atan2f(x,y) atan2(x,y)
26# define M_PI 3.14159265f
22#endif 27#endif
23 28
24#include <assert.h> 29#include <assert.h>
25#include <math.h> 30#include <math.h>
26#include <string.h> 31#include <string.h>
27#include <stdio.h> 32#include <stdio.h>
28#include <stdlib.h> 33#include <stdlib.h>
34
35#define USE_RWOPS 1 // for SDL_mixer:LoadMUS_RW
29 36
30#include <SDL.h> 37#include <SDL.h>
31#include <SDL_thread.h> 38#include <SDL_thread.h>
32#include <SDL_endian.h> 39#include <SDL_endian.h>
33#include <SDL_image.h> 40#include <SDL_image.h>
107 av_push (texture_av, (SV *)(size_t)name); 114 av_push (texture_av, (SV *)(size_t)name);
108 glDeleteTextures (1, &name); 115 glDeleteTextures (1, &name);
109} 116}
110 117
111#include "texcache.c" 118#include "texcache.c"
119#include "rendercache.c"
112 120
113#include "pango-font.c" 121#include "pango-font.c"
114#include "pango-fontmap.c" 122#include "pango-fontmap.c"
115#include "pango-render.c" 123#include "pango-render.c"
116 124
125typedef IV CFPlus__Channel;
126typedef SDL_RWops *CFPlus__RW;
117typedef Mix_Chunk *CFPlus__MixChunk; 127typedef Mix_Chunk *CFPlus__MixChunk;
118typedef Mix_Music *CFPlus__MixMusic; 128typedef Mix_Music *CFPlus__MixMusic;
119 129
120typedef PangoFontDescription *CFPlus__Font; 130typedef PangoFontDescription *CFPlus__Font;
121 131
800 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("CFPlus::UI::Event", 1)))); 810 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("CFPlus::UI::Event", 1))));
801 } 811 }
802} 812}
803 813
804int 814int
805Mix_OpenAudio (int frequency = 48000, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 2048) 815Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 1024)
806 POSTCALL: 816 POSTCALL:
807 Mix_HookMusicFinished (music_finished); 817 Mix_HookMusicFinished (music_finished);
808 Mix_ChannelFinished (channel_finished); 818 Mix_ChannelFinished (channel_finished);
809 819
810void 820void
811Mix_CloseAudio () 821Mix_CloseAudio ()
812 822
813int 823int
814Mix_AllocateChannels (int numchans = -1) 824Mix_AllocateChannels (int numchans = -1)
825
826const char *
827Mix_GetError ()
815 828
816void 829void
817lowdelay (int fd, int val = 1) 830lowdelay (int fd, int val = 1)
818 CODE: 831 CODE:
819 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val)); 832 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&val, sizeof (val));
861 STRLEN image_len; 874 STRLEN image_len;
862 char *image = (char *)SvPVbyte (image_, image_len); 875 char *image = (char *)SvPVbyte (image_, image_len);
863 SDL_Surface *surface, *surface2; 876 SDL_Surface *surface, *surface2;
864 SDL_PixelFormat fmt; 877 SDL_PixelFormat fmt;
865 SDL_RWops *rw = ix 878 SDL_RWops *rw = ix
866 ? SDL_RWFromFile (image, "r") 879 ? SDL_RWFromFile (image, "rb")
867 : SDL_RWFromConstMem (image, image_len); 880 : SDL_RWFromConstMem (image, image_len);
868 881
869 if (!rw) 882 if (!rw)
870 croak ("load_image: %s", SDL_GetError ()); 883 croak ("load_image: %s", SDL_GetError ());
871 884
1343 HV *hv = (HV *)SvRV (self); 1356 HV *hv = (HV *)SvRV (self);
1344 float s = SvNV (*hv_fetch (hv, "s", 1, 1)); 1357 float s = SvNV (*hv_fetch (hv, "s", 1, 1));
1345 float t = SvNV (*hv_fetch (hv, "t", 1, 1)); 1358 float t = SvNV (*hv_fetch (hv, "t", 1, 1));
1346 int name = SvIV (*hv_fetch (hv, "name", 4, 1)); 1359 int name = SvIV (*hv_fetch (hv, "name", 4, 1));
1347 1360
1361 if (name <= 0)
1362 XSRETURN_EMPTY;
1363
1348 if (items < 5) 1364 if (items < 5)
1349 { 1365 {
1350 w = SvNV (*hv_fetch (hv, "w", 1, 1)); 1366 w = SvNV (*hv_fetch (hv, "w", 1, 1));
1351 h = SvNV (*hv_fetch (hv, "h", 1, 1)); 1367 h = SvNV (*hv_fetch (hv, "h", 1, 1));
1352 } 1368 }
1540 self->rows += MAP_EXTEND_Y; 1556 self->rows += MAP_EXTEND_Y;
1541 self->y += MAP_EXTEND_Y; 1557 self->y += MAP_EXTEND_Y;
1542 } 1558 }
1543} 1559}
1544 1560
1545void 1561SV *
1546map1a_update (CFPlus::Map self, SV *data_, int extmap) 1562map1a_update (CFPlus::Map self, SV *data_, int extmap)
1547 CODE: 1563 CODE:
1548{ 1564{
1549 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 1565 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
1550 uint8_t *data_end = (uint8_t *)SvEND (data_); 1566 uint8_t *data_end = (uint8_t *)SvEND (data_);
1551 mapcell *cell; 1567 mapcell *cell;
1552 int x, y, flags; 1568 int x, y, z, flags;
1569 AV *missing = newAV ();
1570 RETVAL = newRV_noinc ((SV *)missing);
1553 1571
1554 while (data < data_end - 1) 1572 while (data < data_end - 1)
1555 { 1573 {
1556 flags = (data [0] << 8) + data [1]; data += 2; 1574 flags = (data [0] << 8) + data [1]; data += 2;
1557 1575
1608 } 1626 }
1609 else 1627 else
1610 cell->darkness = *data++ + 1; 1628 cell->darkness = *data++ + 1;
1611 } 1629 }
1612 1630
1631 for (z = 0; z <= 2; ++z)
1613 if (flags & 4) 1632 if (flags & (4 >> z))
1614 { 1633 {
1615 faceid face = (data [0] << 8) + data [1]; data += 2; 1634 faceid face = (data [0] << 8) + data [1]; data += 2;
1616 need_facenum (self, face); 1635 need_facenum (self, face);
1617 cell->tile [0] = self->face2tile [face]; 1636 cell->tile [z] = self->face2tile [face];
1637
1638 if (cell->tile [z])
1639 {
1640 maptex *tex = self->tex + cell->tile [z];
1641 if (!tex->name)
1642 av_push (missing, newSViv (cell->tile [z]));
1643
1644 if (tex->smoothtile)
1645 {
1646 maptex *smooth = self->tex + tex->smoothtile;
1647 if (!smooth->name)
1648 av_push (missing, newSViv (tex->smoothtile));
1649 }
1650 }
1618 } 1651 }
1619
1620 if (flags & 2)
1621 {
1622 faceid face = (data [0] << 8) + data [1]; data += 2;
1623 need_facenum (self, face);
1624 cell->tile [1] = self->face2tile [face];
1625 }
1626
1627 if (flags & 1)
1628 {
1629 faceid face = (data [0] << 8) + data [1]; data += 2;
1630 need_facenum (self, face);
1631 cell->tile [2] = self->face2tile [face];
1632 }
1633 } 1652 }
1634 else 1653 else
1635 cell->darkness = 0; 1654 cell->darkness = 0;
1636 } 1655 }
1637} 1656}
1657 OUTPUT:
1658 RETVAL
1638 1659
1639SV * 1660SV *
1640mapmap (CFPlus::Map self, int x0, int y0, int w, int h) 1661mapmap (CFPlus::Map self, int x0, int y0, int w, int h)
1641 CODE: 1662 CODE:
1642{ 1663{
1693 1714
1694void 1715void
1695draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T) 1716draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T)
1696 CODE: 1717 CODE:
1697{ 1718{
1719 int x, y, z;
1720
1698 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1721 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
1699 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 1722 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
1700 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k) 1723 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k)
1701 smooth_key skey; 1724 smooth_key skey;
1702 int x, y, z; 1725
1703 int last_name; 1726 rc_t *rc = rc_alloc ();
1727 rc_key_t key;
1728 rc_array_t *arr;
1704 1729
1705 // thats current max. sorry. 1730 // thats current max. sorry.
1706 if (sw > 255) sw = 255; 1731 if (sw > 255) sw = 255;
1707 if (sh > 255) sh = 255; 1732 if (sh > 255) sh = 255;
1708 1733
1709 // clear key, in case of extra padding 1734 // clear key, in case of extra padding
1710 memset (&skey, 0, sizeof (skey)); 1735 memset (&skey, 0, sizeof (skey));
1711 1736
1712 glColor4ub (255, 255, 255, 255); 1737 memset (&key, 0, sizeof (key));
1713 1738 key.r = 255;
1714 glEnable (GL_BLEND); 1739 key.g = 255;
1715 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 1740 key.b = 255;
1716 glEnable (GL_TEXTURE_2D); 1741 key.a = 255;
1717 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1742 key.mode = GL_QUADS;
1718 1743 key.format = GL_T2F_V3F;
1719 glBegin (GL_QUADS); 1744 key.texname = -1;
1720
1721 last_name = 0;
1722 1745
1723 mx += self->x; 1746 mx += self->x;
1724 my += self->y; 1747 my += self->y;
1725 1748
1726 // first pass: determine smooth_max 1749 // first pass: determine smooth_max
1742 MAX (self->tex [cell->tile [0]].smoothlevel, 1765 MAX (self->tex [cell->tile [0]].smoothlevel,
1743 MAX (self->tex [cell->tile [1]].smoothlevel, 1766 MAX (self->tex [cell->tile [1]].smoothlevel,
1744 self->tex [cell->tile [2]].smoothlevel)); 1767 self->tex [cell->tile [2]].smoothlevel));
1745 } 1768 }
1746 } 1769 }
1770
1771 glEnable (GL_BLEND);
1772 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1773 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1747 1774
1748 for (z = 0; z <= 2; z++) 1775 for (z = 0; z <= 2; z++)
1749 { 1776 {
1750 memset (smooth_level, 0, sizeof (smooth_level)); 1777 memset (smooth_level, 0, sizeof (smooth_level));
1751 1778
1761 tileid tile = cell->tile [z]; 1788 tileid tile = cell->tile [z];
1762 1789
1763 if (tile) 1790 if (tile)
1764 { 1791 {
1765 maptex tex = self->tex [tile]; 1792 maptex tex = self->tex [tile];
1766 int px = (x + 1) * T - tex.w; 1793 int px, py;
1767 int py = (y + 1) * T - tex.h;
1768 1794
1769 // suppressing texture state switches here 1795 // suppressing texture state switches here
1770 // is only moderately effective, but worth the extra effort 1796 // is only moderately effective, but worth the extra effort
1771 if (last_name != tex.name) 1797 if (key.texname != tex.name)
1772 { 1798 {
1773 if (!tex.name) 1799 if (!tex.name)
1774 tex = self->tex [2]; /* missing, replace by noface */ 1800 tex = self->tex [2]; /* missing, replace by noface */
1775 1801
1776 glEnd (); 1802 key.texname = tex.name;
1777 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1803 arr = rc_array (rc, &key);
1778 glBegin (GL_QUADS);
1779 } 1804 }
1780 1805
1781 glTexCoord2f (0 , 0 ); glVertex2f (px , py ); 1806 px = (x + 1) * T - tex.w;
1807 py = (y + 1) * T - tex.h;
1808
1809 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1782 glTexCoord2f (0 , tex.t); glVertex2f (px , py + tex.h); 1810 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
1783 glTexCoord2f (tex.s, tex.t); glVertex2f (px + tex.w, py + tex.h); 1811 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0);
1784 glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py ); 1812 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
1785 1813
1786 if (cell->flags && z == 2) 1814 if (cell->flags && z == 2)
1787 { 1815 {
1816 // overlays such as the speech bubble, probably more to come
1788 if (cell->flags & 1) 1817 if (cell->flags & 1)
1789 { 1818 {
1790 maptex tex = self->tex [1]; 1819 maptex tex = self->tex [1];
1791 int px = x * T + T * 2 / 32; 1820 int px = x * T + T * 2 / 32;
1792 int py = y * T - T * 6 / 32; 1821 int py = y * T - T * 6 / 32;
1793 1822
1823 if (tex.name)
1794 glEnd (); 1824 {
1795 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1825 if (key.texname != tex.name)
1826 {
1827 key.texname = tex.name;
1828 arr = rc_array (rc, &key);
1829 }
1830
1831 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1832 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0);
1833 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0);
1834 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
1796 glBegin (GL_QUADS); 1835 }
1797
1798 glTexCoord2f (0 , 0 ); glVertex2f (px , py );
1799 glTexCoord2f (0 , tex.t); glVertex2f (px , py + T);
1800 glTexCoord2f (tex.s, tex.t); glVertex2f (px + T, py + T);
1801 glTexCoord2f (tex.s, 0 ); glVertex2f (px + T, py );
1802 } 1836 }
1803 } 1837 }
1804 1838
1805 // update smooth hash 1839 // update smooth hash
1806 if (tex.smoothtile) 1840 if (tex.smoothtile)
1875 int border = bits & 15; 1909 int border = bits & 15;
1876 int corner = (bits >> 8) & ~(bits >> 4) & 15; 1910 int corner = (bits >> 8) & ~(bits >> 4) & 15;
1877 float dx = tex.s * .0625f; // 16 images/row 1911 float dx = tex.s * .0625f; // 16 images/row
1878 float dy = tex.t * .5f ; // 2 images/column 1912 float dy = tex.t * .5f ; // 2 images/column
1879 1913
1880 // this time naively avoiding texture state changes
1881 // save gobs of state changes.
1882 if (last_name != tex.name) 1914 if (tex.name)
1883 { 1915 {
1916 // this time avoiding texture state changes
1917 // save gobs of state changes.
1884 if (!tex.name) 1918 if (key.texname != tex.name)
1885 continue; // smoothing not yet available
1886
1887 glEnd (); 1919 {
1888 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1920 key.texname = tex.name;
1889 glBegin (GL_QUADS); 1921 arr = rc_array (rc, &key);
1890 } 1922 }
1891 1923
1892 if (border) 1924 if (border)
1893 { 1925 {
1894 float ox = border * dx; 1926 float ox = border * dx;
1895 1927
1896 glTexCoord2f (ox , 0.f ); glVertex2f (px , py ); 1928 rc_t2f_v3f (arr, ox , 0.f , px , py , 0);
1897 glTexCoord2f (ox , dy ); glVertex2f (px , py + T); 1929 rc_t2f_v3f (arr, ox , dy , px , py + T, 0);
1898 glTexCoord2f (ox + dx, dy ); glVertex2f (px + T, py + T); 1930 rc_t2f_v3f (arr, ox + dx, dy , px + T, py + T, 0);
1899 glTexCoord2f (ox + dx, 0.f ); glVertex2f (px + T, py ); 1931 rc_t2f_v3f (arr, ox + dx, 0.f , px + T, py , 0);
1900 } 1932 }
1901 1933
1902 if (corner) 1934 if (corner)
1903 { 1935 {
1904 float ox = corner * dx; 1936 float ox = corner * dx;
1905 1937
1906 glTexCoord2f (ox , dy ); glVertex2f (px , py ); 1938 rc_t2f_v3f (arr, ox , dy , px , py , 0);
1907 glTexCoord2f (ox , dy * 2.f); glVertex2f (px , py + T); 1939 rc_t2f_v3f (arr, ox , dy * 2.f, px , py + T, 0);
1908 glTexCoord2f (ox + dx, dy * 2.f); glVertex2f (px + T, py + T); 1940 rc_t2f_v3f (arr, ox + dx, dy * 2.f, px + T, py + T, 0);
1909 glTexCoord2f (ox + dx, dy ); glVertex2f (px + T, py ); 1941 rc_t2f_v3f (arr, ox + dx, dy , px + T, py , 0);
1942 }
1910 } 1943 }
1911 } 1944 }
1912 } 1945 }
1913 } 1946 }
1914 } 1947 }
1915 } 1948 }
1916 1949
1917 hv_clear (smooth); 1950 hv_clear (smooth);
1951 rc_draw (rc);
1952 rc_clear (rc);
1918 } 1953 }
1919 1954
1920 glEnd ();
1921
1922 glDisable (GL_TEXTURE_2D);
1923 glDisable (GL_BLEND); 1955 glDisable (GL_BLEND);
1956 rc_free (rc);
1924 1957
1925 // top layer: overlays such as the health bar 1958 // top layer: overlays such as the health bar
1926 for (y = 0; y < sh; y++) 1959 for (y = 0; y < sh; y++)
1927 if (0 <= y + my && y + my < self->rows) 1960 if (0 <= y + my && y + my < self->rows)
1928 { 1961 {
2232 } 2265 }
2233 } 2266 }
2234 } 2267 }
2235} 2268}
2236 2269
2270MODULE = CFPlus PACKAGE = CFPlus::RW
2271
2272CFPlus::RW
2273new (SV *class, SV *data_sv)
2274 CODE:
2275{
2276 STRLEN datalen;
2277 char *data = SvPVbyte (data_sv, datalen);
2278
2279 RETVAL = SDL_RWFromConstMem (data, datalen);
2280}
2281 OUTPUT:
2282 RETVAL
2283
2284CFPlus::RW
2285new_from_file (SV *class, const char *path, const char *mode = "rb")
2286 CODE:
2287 RETVAL = SDL_RWFromFile (path, mode);
2288 OUTPUT:
2289 RETVAL
2290
2291# fails on win32:
2292# CFPlus.xs(2268) : error C2059: syntax error : '('
2293#void
2294#close (CFPlus::RW self)
2295# CODE:
2296# (self->(close)) (self);
2297
2298MODULE = CFPlus PACKAGE = CFPlus::Channel
2299
2300PROTOTYPES: DISABLE
2301
2302CFPlus::Channel
2303find ()
2304 CODE:
2305{
2306 RETVAL = Mix_GroupAvailable (-1);
2307
2308 if (RETVAL < 0)
2309 {
2310 RETVAL = Mix_GroupOldest (-1);
2311
2312 if (RETVAL < 0)
2313 XSRETURN_UNDEF;
2314
2315 Mix_HaltChannel (RETVAL);
2316 }
2317
2318 Mix_UnregisterAllEffects (RETVAL);
2319 Mix_Volume (RETVAL, 128);
2320}
2321 OUTPUT:
2322 RETVAL
2323
2324void
2325halt (CFPlus::Channel self)
2326 CODE:
2327 Mix_HaltChannel (self);
2328
2329void
2330expire (CFPlus::Channel self, int ticks = -1)
2331 CODE:
2332 Mix_ExpireChannel (self, ticks);
2333
2334void
2335fade_out (CFPlus::Channel self, int ticks = -1)
2336 CODE:
2337 Mix_FadeOutChannel (self, ticks);
2338
2339int
2340volume (CFPlus::Channel self, int volume)
2341 CODE:
2342 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128));
2343 OUTPUT:
2344 RETVAL
2345
2346void
2347unregister_all_effects (CFPlus::Channel self)
2348 CODE:
2349 Mix_UnregisterAllEffects (self);
2350
2351void
2352set_panning (CFPlus::Channel self, int left, int right)
2353 CODE:
2354 left = CLAMP (left , 0, 255);
2355 right = CLAMP (right, 0, 255);
2356 Mix_SetPanning (self, left, right);
2357
2358void
2359set_distance (CFPlus::Channel self, int distance)
2360 CODE:
2361 Mix_SetDistance (self, CLAMP (distance, 0, 255));
2362
2363void
2364set_position (CFPlus::Channel self, int angle, int distance)
2365 CODE:
2366
2367void
2368set_position_r (CFPlus::Channel self, int dx, int dy, int maxdistance)
2369 CODE:
2370{
2371 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2372 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI);
2373 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2374}
2375
2376void
2377set_reverse_stereo (CFPlus::Channel self, int flip)
2378 CODE:
2379 Mix_SetReverseStereo (self, flip);
2380
2237MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2381MODULE = CFPlus PACKAGE = CFPlus::MixChunk
2238 2382
2239PROTOTYPES: DISABLE 2383PROTOTYPES: DISABLE
2240 2384
2241CFPlus::MixChunk 2385CFPlus::MixChunk
2242new_from_file (SV *class, char *path) 2386new (SV *class, CFPlus::RW rwops)
2243 CODE: 2387 CODE:
2244 RETVAL = Mix_LoadWAV (path); 2388 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2245 OUTPUT: 2389 OUTPUT:
2246 RETVAL 2390 RETVAL
2247 2391
2248void 2392void
2249DESTROY (CFPlus::MixChunk self) 2393DESTROY (CFPlus::MixChunk self)
2251 Mix_FreeChunk (self); 2395 Mix_FreeChunk (self);
2252 2396
2253int 2397int
2254volume (CFPlus::MixChunk self, int volume = -1) 2398volume (CFPlus::MixChunk self, int volume = -1)
2255 CODE: 2399 CODE:
2400 if (items > 1)
2401 volume = CLAMP (volume, 0, 128);
2256 RETVAL = Mix_VolumeChunk (self, volume); 2402 RETVAL = Mix_VolumeChunk (self, volume);
2257 OUTPUT: 2403 OUTPUT:
2258 RETVAL 2404 RETVAL
2259 2405
2260int 2406CFPlus::Channel
2261play (CFPlus::MixChunk self, int channel = -1, int loops = 0, int ticks = -1) 2407play (CFPlus::MixChunk self, CFPlus::Channel channel = -1, int loops = 0, int ticks = -1)
2262 CODE: 2408 CODE:
2409{
2263 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks); 2410 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
2411
2412 if (RETVAL < 0)
2413 XSRETURN_UNDEF;
2414
2415 if (channel < 0)
2416 {
2417 Mix_UnregisterAllEffects (RETVAL);
2418 Mix_Volume (RETVAL, 128);
2419 }
2420}
2264 OUTPUT: 2421 OUTPUT:
2265 RETVAL 2422 RETVAL
2266 2423
2267MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2424MODULE = CFPlus PACKAGE = CFPlus::MixMusic
2268 2425
2269int 2426int
2270volume (int volume = -1) 2427volume (int volume = -1)
2271 PROTOTYPE: ;$ 2428 PROTOTYPE: ;$
2272 CODE: 2429 CODE:
2430 if (items > 0)
2431 volume = CLAMP (volume, 0, 128);
2273 RETVAL = Mix_VolumeMusic (volume); 2432 RETVAL = Mix_VolumeMusic (volume);
2274 OUTPUT: 2433 OUTPUT:
2275 RETVAL 2434 RETVAL
2276 2435
2277int 2436void
2278fade_out (int ms) 2437fade_out (int ms)
2279 CODE: 2438 CODE:
2280 RETVAL = Mix_FadeOutMusic (ms); 2439 Mix_FadeOutMusic (ms);
2281 OUTPUT: 2440
2282 RETVAL 2441void
2442halt ()
2443 CODE:
2444 Mix_HaltMusic ();
2283 2445
2284CFPlus::MixMusic 2446CFPlus::MixMusic
2285new_from_file (SV *class, char *path) 2447new (SV *class, CFPlus::RW rwops)
2286 CODE: 2448 CODE:
2287 RETVAL = Mix_LoadMUS (path); 2449 RETVAL = Mix_LoadMUS_RW (rwops);
2288 OUTPUT: 2450 OUTPUT:
2289 RETVAL 2451 RETVAL
2290 2452
2291void 2453void
2292DESTROY (CFPlus::MixMusic self) 2454DESTROY (CFPlus::MixMusic self)
2298 CODE: 2460 CODE:
2299 RETVAL = Mix_PlayMusic (self, loops); 2461 RETVAL = Mix_PlayMusic (self, loops);
2300 OUTPUT: 2462 OUTPUT:
2301 RETVAL 2463 RETVAL
2302 2464
2303int 2465void
2304fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position) 2466fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position)
2305 CODE: 2467 CODE:
2306 RETVAL = Mix_FadeInMusicPos (self, loops, ms, position); 2468 Mix_FadeInMusicPos (self, loops, ms, position);
2307 OUTPUT:
2308 RETVAL
2309 2469
2310MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2470MODULE = CFPlus PACKAGE = CFPlus::OpenGL
2311 2471
2312PROTOTYPES: ENABLE 2472PROTOTYPES: ENABLE
2313 2473

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines