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.219 by root, Mon Aug 6 05:06:32 2007 UTC vs.
Revision 1.235 by root, Tue Aug 28 01:23:47 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>
109 av_push (texture_av, (SV *)(size_t)name); 114 av_push (texture_av, (SV *)(size_t)name);
110 glDeleteTextures (1, &name); 115 glDeleteTextures (1, &name);
111} 116}
112 117
113#include "texcache.c" 118#include "texcache.c"
119#include "rendercache.c"
114 120
115#include "pango-font.c" 121#include "pango-font.c"
116#include "pango-fontmap.c" 122#include "pango-fontmap.c"
117#include "pango-render.c" 123#include "pango-render.c"
118 124
144typedef struct cf_layout { 150typedef struct cf_layout {
145 PangoLayout *pl; 151 PangoLayout *pl;
146 float r, g, b, a; // default color for rgba mode 152 float r, g, b, a; // default color for rgba mode
147 int base_height; 153 int base_height;
148 CFPlus__Font font; 154 CFPlus__Font font;
155 rc_t *rc;
149} *CFPlus__Layout; 156} *CFPlus__Layout;
150 157
151static CFPlus__Font default_font; 158static CFPlus__Font default_font;
152static PangoContext *opengl_context; 159static PangoContext *opengl_context;
153static PangoFontMap *opengl_fontmap; 160static PangoFontMap *opengl_fontmap;
196 203
197typedef uint16_t tileid; 204typedef uint16_t tileid;
198typedef uint16_t faceid; 205typedef uint16_t faceid;
199 206
200typedef struct { 207typedef struct {
201 int name; 208 GLuint name;
202 int w, h; 209 int w, h;
203 float s, t; 210 float s, t;
204 uint8_t r, g, b, a; 211 uint8_t r, g, b, a;
205 tileid smoothtile; 212 tileid smoothtile;
206 uint8_t smoothlevel; 213 uint8_t smoothlevel;
431 n |= n >> 4; 438 n |= n >> 4;
432 n |= n >> 8; 439 n |= n >> 8;
433 n |= n >> 16; 440 n |= n >> 16;
434 441
435 return n + 1; 442 return n + 1;
443}
444
445static unsigned int
446popcount (unsigned int n)
447{
448 n -= (n >> 1) & 0x55555555U;
449 n = ((n >> 2) & 0x33333333U) + (n & 0x33333333U);
450 n = ((n >> 4) + n) & 0x0f0f0f0fU;
451 n *= 0x01010101U;
452
453 return n >> 24;
436} 454}
437 455
438/* SDL should provide this, really. */ 456/* SDL should provide this, really. */
439#define SDLK_MODIFIER_MIN 300 457#define SDLK_MODIFIER_MIN 300
440#define SDLK_MODIFIER_MAX 314 458#define SDLK_MODIFIER_MAX 314
518 536
519 const_iv (SDL_APPINPUTFOCUS), 537 const_iv (SDL_APPINPUTFOCUS),
520 const_iv (SDL_APPMOUSEFOCUS), 538 const_iv (SDL_APPMOUSEFOCUS),
521 const_iv (SDL_APPACTIVE), 539 const_iv (SDL_APPACTIVE),
522 540
541 const_iv (SDLK_FIRST),
542 const_iv (SDLK_LAST),
523 const_iv (SDLK_KP0), 543 const_iv (SDLK_KP0),
524 const_iv (SDLK_KP1), 544 const_iv (SDLK_KP1),
525 const_iv (SDLK_KP2), 545 const_iv (SDLK_KP2),
526 const_iv (SDLK_KP3), 546 const_iv (SDLK_KP3),
527 const_iv (SDLK_KP4), 547 const_iv (SDLK_KP4),
626 646
627NV floor (NV x) 647NV floor (NV x)
628 648
629NV ceil (NV x) 649NV ceil (NV x)
630 650
651IV minpot (UV n)
652
653IV popcount (UV n)
654
631void 655void
632pango_init () 656pango_init ()
633 CODE: 657 CODE:
634{ 658{
635 opengl_fontmap = pango_opengl_font_map_new (); 659 opengl_fontmap = pango_opengl_font_map_new ();
708 732
709 if (RETVAL) 733 if (RETVAL)
710 { 734 {
711 av_clear (texture_av); 735 av_clear (texture_av);
712 736
713 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 737 SDL_WM_SetCaption ("Crossfire TRT Client " VERSION, "Crossfire TRT");
714#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 738#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
715#include "glfunc.h" 739#include "glfunc.h"
716#undef GL_FUNC 740#undef GL_FUNC
717 } 741 }
718} 742}
1030 RETVAL->g = 1.; 1054 RETVAL->g = 1.;
1031 RETVAL->b = 1.; 1055 RETVAL->b = 1.;
1032 RETVAL->a = 1.; 1056 RETVAL->a = 1.;
1033 RETVAL->base_height = MIN_FONT_HEIGHT; 1057 RETVAL->base_height = MIN_FONT_HEIGHT;
1034 RETVAL->font = 0; 1058 RETVAL->font = 0;
1059 RETVAL->rc = rc_alloc ();
1035 1060
1036 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 1061 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
1037 layout_update_font (RETVAL); 1062 layout_update_font (RETVAL);
1038 OUTPUT: 1063 OUTPUT:
1039 RETVAL 1064 RETVAL
1040 1065
1041void 1066void
1042DESTROY (CFPlus::Layout self) 1067DESTROY (CFPlus::Layout self)
1043 CODE: 1068 CODE:
1044 g_object_unref (self->pl); 1069 g_object_unref (self->pl);
1070 rc_free (self->rc);
1045 Safefree (self); 1071 Safefree (self);
1046 1072
1047void 1073void
1048set_text (CFPlus::Layout self, SV *text_) 1074set_text (CFPlus::Layout self, SV *text_)
1049 CODE: 1075 CODE:
1301 } 1327 }
1302} 1328}
1303 1329
1304void 1330void
1305render (CFPlus::Layout self, float x, float y, int flags = 0) 1331render (CFPlus::Layout self, float x, float y, int flags = 0)
1306 PPCODE: 1332 CODE:
1333 rc_clear (self->rc);
1307 pango_opengl_render_layout_subpixel ( 1334 pango_opengl_render_layout_subpixel (
1308 self->pl, 1335 self->pl,
1336 self->rc,
1309 x * PANGO_SCALE, y * PANGO_SCALE, 1337 x * PANGO_SCALE, y * PANGO_SCALE,
1310 self->r, self->g, self->b, self->a, 1338 self->r, self->g, self->b, self->a,
1311 flags 1339 flags
1312 ); 1340 );
1341 // we assume that context_change actually clears/frees stuff
1342 // and does not do any recomputation...
1343 pango_layout_context_changed (self->pl);
1344
1345void
1346draw (CFPlus::Layout self)
1347 CODE:
1348{
1349 glEnable (GL_TEXTURE_2D);
1350 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1351 glEnable (GL_BLEND);
1352 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
1353 GL_ONE , GL_ONE_MINUS_SRC_ALPHA);
1354 glEnable (GL_ALPHA_TEST);
1355 glAlphaFunc (GL_GREATER, 7.f / 255.f);
1356
1357 rc_draw (self->rc);
1358
1359 glDisable (GL_ALPHA_TEST);
1360 glDisable (GL_BLEND);
1361 glDisable (GL_TEXTURE_2D);
1362}
1313 1363
1314MODULE = CFPlus PACKAGE = CFPlus::Texture 1364MODULE = CFPlus PACKAGE = CFPlus::Texture
1315 1365
1316PROTOTYPES: ENABLE 1366PROTOTYPES: ENABLE
1317
1318int minpot (int n)
1319 1367
1320void 1368void
1321pad (SV *data_, int ow, int oh, int nw, int nh) 1369pad (SV *data_, int ow, int oh, int nw, int nh)
1322 CODE: 1370 CODE:
1323{ 1371{
1550 self->rows += MAP_EXTEND_Y; 1598 self->rows += MAP_EXTEND_Y;
1551 self->y += MAP_EXTEND_Y; 1599 self->y += MAP_EXTEND_Y;
1552 } 1600 }
1553} 1601}
1554 1602
1555void 1603SV *
1556map1a_update (CFPlus::Map self, SV *data_, int extmap) 1604map1a_update (CFPlus::Map self, SV *data_, int extmap)
1557 CODE: 1605 CODE:
1558{ 1606{
1559 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 1607 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
1560 uint8_t *data_end = (uint8_t *)SvEND (data_); 1608 uint8_t *data_end = (uint8_t *)SvEND (data_);
1561 mapcell *cell; 1609 mapcell *cell;
1562 int x, y, flags; 1610 int x, y, z, flags;
1611 AV *missing = newAV ();
1612 RETVAL = newRV_noinc ((SV *)missing);
1563 1613
1564 while (data < data_end - 1) 1614 while (data < data_end - 1)
1565 { 1615 {
1566 flags = (data [0] << 8) + data [1]; data += 2; 1616 flags = (data [0] << 8) + data [1]; data += 2;
1567 1617
1618 } 1668 }
1619 else 1669 else
1620 cell->darkness = *data++ + 1; 1670 cell->darkness = *data++ + 1;
1621 } 1671 }
1622 1672
1673 for (z = 0; z <= 2; ++z)
1623 if (flags & 4) 1674 if (flags & (4 >> z))
1624 { 1675 {
1625 faceid face = (data [0] << 8) + data [1]; data += 2; 1676 faceid face = (data [0] << 8) + data [1]; data += 2;
1626 need_facenum (self, face); 1677 need_facenum (self, face);
1627 cell->tile [0] = self->face2tile [face]; 1678 cell->tile [z] = self->face2tile [face];
1679
1680 if (cell->tile [z])
1681 {
1682 maptex *tex = self->tex + cell->tile [z];
1683 if (!tex->name)
1684 av_push (missing, newSViv (cell->tile [z]));
1685
1686 if (tex->smoothtile)
1687 {
1688 maptex *smooth = self->tex + tex->smoothtile;
1689 if (!smooth->name)
1690 av_push (missing, newSViv (tex->smoothtile));
1691 }
1692 }
1628 } 1693 }
1629
1630 if (flags & 2)
1631 {
1632 faceid face = (data [0] << 8) + data [1]; data += 2;
1633 need_facenum (self, face);
1634 cell->tile [1] = self->face2tile [face];
1635 }
1636
1637 if (flags & 1)
1638 {
1639 faceid face = (data [0] << 8) + data [1]; data += 2;
1640 need_facenum (self, face);
1641 cell->tile [2] = self->face2tile [face];
1642 }
1643 } 1694 }
1644 else 1695 else
1645 cell->darkness = 0; 1696 cell->darkness = 0;
1646 } 1697 }
1647} 1698}
1699 OUTPUT:
1700 RETVAL
1648 1701
1649SV * 1702SV *
1650mapmap (CFPlus::Map self, int x0, int y0, int w, int h) 1703mapmap (CFPlus::Map self, int x0, int y0, int w, int h)
1651 CODE: 1704 CODE:
1652{ 1705{
1699 RETVAL = map_sv; 1752 RETVAL = map_sv;
1700} 1753}
1701 OUTPUT: 1754 OUTPUT:
1702 RETVAL 1755 RETVAL
1703 1756
1704SV * 1757void
1705draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T) 1758draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T)
1706 CODE: 1759 CODE:
1707{ 1760{
1761 int x, y, z;
1762
1708 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1763 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
1709 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 1764 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
1710 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k) 1765 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k)
1711 smooth_key skey; 1766 smooth_key skey;
1712 int x, y, z; 1767
1713 int last_name; 1768 rc_t *rc = rc_alloc ();
1714 AV *missing = newAV (); 1769 rc_key_t key;
1715 RETVAL = newRV_noinc ((SV *)missing); 1770 rc_array_t *arr;
1716 1771
1717 // thats current max. sorry. 1772 // thats current max. sorry.
1718 if (sw > 255) sw = 255; 1773 if (sw > 255) sw = 255;
1719 if (sh > 255) sh = 255; 1774 if (sh > 255) sh = 255;
1720 1775
1721 // clear key, in case of extra padding 1776 // clear key, in case of extra padding
1722 memset (&skey, 0, sizeof (skey)); 1777 memset (&skey, 0, sizeof (skey));
1723 1778
1724 glColor4ub (255, 255, 255, 255); 1779 memset (&key, 0, sizeof (key));
1725 1780 key.r = 255;
1726 glEnable (GL_BLEND); 1781 key.g = 255;
1727 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 1782 key.b = 255;
1728 glEnable (GL_TEXTURE_2D); 1783 key.a = 255;
1729 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1784 key.mode = GL_QUADS;
1730 1785 key.format = GL_T2F_V3F;
1731 glBegin (GL_QUADS);
1732
1733 last_name = -1; 1786 key.texname = -1;
1734 1787
1735 mx += self->x; 1788 mx += self->x;
1736 my += self->y; 1789 my += self->y;
1737 1790
1738 // first pass: determine smooth_max 1791 // first pass: determine smooth_max
1754 MAX (self->tex [cell->tile [0]].smoothlevel, 1807 MAX (self->tex [cell->tile [0]].smoothlevel,
1755 MAX (self->tex [cell->tile [1]].smoothlevel, 1808 MAX (self->tex [cell->tile [1]].smoothlevel,
1756 self->tex [cell->tile [2]].smoothlevel)); 1809 self->tex [cell->tile [2]].smoothlevel));
1757 } 1810 }
1758 } 1811 }
1812
1813 glEnable (GL_BLEND);
1814 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1815 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1759 1816
1760 for (z = 0; z <= 2; z++) 1817 for (z = 0; z <= 2; z++)
1761 { 1818 {
1762 memset (smooth_level, 0, sizeof (smooth_level)); 1819 memset (smooth_level, 0, sizeof (smooth_level));
1763 1820
1775 if (tile) 1832 if (tile)
1776 { 1833 {
1777 maptex tex = self->tex [tile]; 1834 maptex tex = self->tex [tile];
1778 int px, py; 1835 int px, py;
1779 1836
1780 // suppressing texture state switches here
1781 // is only moderately effective, but worth the extra effort
1782 if (last_name != tex.name) 1837 if (key.texname != tex.name)
1783 { 1838 {
1784 if (!tex.name) 1839 if (!tex.name)
1785 {
1786 av_push (missing, newSViv (tile));
1787 tex = self->tex [2]; /* missing, replace by noface */ 1840 tex = self->tex [2]; /* missing, replace by noface */
1788 }
1789 1841
1790 glEnd (); 1842 key.texname = tex.name;
1791 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1843 arr = rc_array (rc, &key);
1792 glBegin (GL_QUADS);
1793 } 1844 }
1794 1845
1795 px = (x + 1) * T - tex.w; 1846 px = (x + 1) * T - tex.w;
1796 py = (y + 1) * T - tex.h; 1847 py = (y + 1) * T - tex.h;
1797 1848
1798 glTexCoord2f (0 , 0 ); glVertex2f (px , py ); 1849 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1799 glTexCoord2f (0 , tex.t); glVertex2f (px , py + tex.h); 1850 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
1800 glTexCoord2f (tex.s, tex.t); glVertex2f (px + tex.w, py + tex.h); 1851 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0);
1801 glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py ); 1852 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
1802 1853
1803 if (cell->flags && z == 2) 1854 if (cell->flags && z == 2)
1804 { 1855 {
1856 // overlays such as the speech bubble, probably more to come
1805 if (cell->flags & 1) 1857 if (cell->flags & 1)
1806 { 1858 {
1807 maptex tex = self->tex [1]; 1859 maptex tex = self->tex [1];
1808 int px = x * T + T * 2 / 32; 1860 int px = x * T + T * 2 / 32;
1809 int py = y * T - T * 6 / 32; 1861 int py = y * T - T * 6 / 32;
1810 1862
1863 if (tex.name)
1811 glEnd (); 1864 {
1812 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1865 if (key.texname != tex.name)
1866 {
1867 key.texname = tex.name;
1868 arr = rc_array (rc, &key);
1869 }
1870
1871 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1872 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0);
1873 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0);
1874 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
1813 glBegin (GL_QUADS); 1875 }
1814
1815 glTexCoord2f (0 , 0 ); glVertex2f (px , py );
1816 glTexCoord2f (0 , tex.t); glVertex2f (px , py + T);
1817 glTexCoord2f (tex.s, tex.t); glVertex2f (px + T, py + T);
1818 glTexCoord2f (tex.s, 0 ); glVertex2f (px + T, py );
1819 } 1876 }
1820 } 1877 }
1821 1878
1822 // update smooth hash 1879 // update smooth hash
1823 if (tex.smoothtile) 1880 if (tex.smoothtile)
1859 } 1916 }
1860 } 1917 }
1861 } 1918 }
1862 } 1919 }
1863 1920
1921 rc_draw (rc);
1922 rc_clear (rc);
1923
1864 // go through all smoothlevels, lowest to highest, then draw. 1924 // go through all smoothlevels, lowest to highest, then draw.
1865 // this is basically counting sort 1925 // this is basically counting sort
1866 { 1926 {
1867 int w, b; 1927 int w, b;
1868 1928
1929 glEnable (GL_TEXTURE_2D);
1930 glBegin (GL_QUADS);
1869 for (w = 0; w < 256 / 32; ++w) 1931 for (w = 0; w < 256 / 32; ++w)
1870 { 1932 {
1871 uint32_t smask = smooth_level [w]; 1933 uint32_t smask = smooth_level [w];
1872 if (smask) 1934 if (smask)
1873 for (b = 0; b < 32; ++b) 1935 for (b = 0; b < 32; ++b)
1892 int border = bits & 15; 1954 int border = bits & 15;
1893 int corner = (bits >> 8) & ~(bits >> 4) & 15; 1955 int corner = (bits >> 8) & ~(bits >> 4) & 15;
1894 float dx = tex.s * .0625f; // 16 images/row 1956 float dx = tex.s * .0625f; // 16 images/row
1895 float dy = tex.t * .5f ; // 2 images/column 1957 float dy = tex.t * .5f ; // 2 images/column
1896 1958
1897 // this time naively avoiding texture state changes
1898 // save gobs of state changes.
1899 if (last_name != tex.name) 1959 if (tex.name)
1900 { 1960 {
1961 // this time avoiding texture state changes
1962 // save gobs of state changes.
1901 if (!tex.name) 1963 if (key.texname != tex.name)
1902 { 1964 {
1903 av_push (missing, newSViv (skey->tile)); 1965 glEnd ();
1904 continue; // smoothing not yet available 1966 glBindTexture (GL_TEXTURE_2D, key.texname = tex.name);
1967 glBegin (GL_QUADS);
1905 } 1968 }
1906 1969
1907 glEnd ();
1908 glBindTexture (GL_TEXTURE_2D, last_name = tex.name);
1909 glBegin (GL_QUADS);
1910 }
1911
1912 if (border) 1970 if (border)
1913 { 1971 {
1914 float ox = border * dx; 1972 float ox = border * dx;
1915 1973
1916 glTexCoord2f (ox , 0.f ); glVertex2f (px , py ); 1974 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
1917 glTexCoord2f (ox , dy ); glVertex2f (px , py + T); 1975 glTexCoord2f (ox , dy ); glVertex2i (px , py + T);
1918 glTexCoord2f (ox + dx, dy ); glVertex2f (px + T, py + T); 1976 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T);
1919 glTexCoord2f (ox + dx, 0.f ); glVertex2f (px + T, py ); 1977 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py );
1920 } 1978 }
1921 1979
1922 if (corner) 1980 if (corner)
1923 { 1981 {
1924 float ox = corner * dx; 1982 float ox = corner * dx;
1925 1983
1926 glTexCoord2f (ox , dy ); glVertex2f (px , py ); 1984 glTexCoord2f (ox , dy ); glVertex2i (px , py );
1927 glTexCoord2f (ox , dy * 2.f); glVertex2f (px , py + T); 1985 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T);
1928 glTexCoord2f (ox + dx, dy * 2.f); glVertex2f (px + T, py + T); 1986 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T);
1929 glTexCoord2f (ox + dx, dy ); glVertex2f (px + T, py ); 1987 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py );
1988 }
1930 } 1989 }
1931 } 1990 }
1932 } 1991 }
1933 } 1992 }
1934 } 1993 }
1994
1995 glEnd ();
1996 glDisable (GL_TEXTURE_2D);
1997 key.texname = -1;
1935 } 1998 }
1936 1999
1937 hv_clear (smooth); 2000 hv_clear (smooth);
1938 } 2001 }
1939 2002
1940 glEnd ();
1941
1942 glDisable (GL_TEXTURE_2D);
1943 glDisable (GL_BLEND); 2003 glDisable (GL_BLEND);
2004 rc_free (rc);
1944 2005
1945 // top layer: overlays such as the health bar 2006 // top layer: overlays such as the health bar
1946 for (y = 0; y < sh; y++) 2007 for (y = 0; y < sh; y++)
1947 if (0 <= y + my && y + my < self->rows) 2008 if (0 <= y + my && y + my < self->rows)
1948 { 2009 {
1971 px + width - 2 - cell->stat_hp * (width - 4) / 255, py - 1); 2032 px + width - 2 - cell->stat_hp * (width - 4) / 255, py - 1);
1972 } 2033 }
1973 } 2034 }
1974 } 2035 }
1975} 2036}
1976 OUTPUT:
1977 RETVAL
1978 2037
1979void 2038void
1980draw_magicmap (CFPlus::Map self, int dx, int dy, int w, int h, unsigned char *data) 2039draw_magicmap (CFPlus::Map self, int dx, int dy, int w, int h, unsigned char *data)
1981 CODE: 2040 CODE:
1982{ 2041{
2199 int x, y, z; 2258 int x, y, z;
2200 int w, h; 2259 int w, h;
2201 int x1, y1; 2260 int x1, y1;
2202 2261
2203 if (*data++ != 0) 2262 if (*data++ != 0)
2204 return; /* version mismatch */ 2263 XSRETURN_EMPTY; /* version mismatch */
2205 2264
2206 w = *data++ << 8; w |= *data++; 2265 w = *data++ << 8; w |= *data++;
2207 h = *data++ << 8; h |= *data++; 2266 h = *data++ << 8; h |= *data++;
2208 2267
2209 // we need to do this 'cause we don't keep an absolute coord system for rows 2268 // we need to do this 'cause we don't keep an absolute coord system for rows
2350 Mix_SetDistance (self, CLAMP (distance, 0, 255)); 2409 Mix_SetDistance (self, CLAMP (distance, 0, 255));
2351 2410
2352void 2411void
2353set_position (CFPlus::Channel self, int angle, int distance) 2412set_position (CFPlus::Channel self, int angle, int distance)
2354 CODE: 2413 CODE:
2414
2415void
2416set_position_r (CFPlus::Channel self, int dx, int dy, int maxdistance)
2417 CODE:
2418{
2419 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2420 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI);
2355 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255)); 2421 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2422}
2356 2423
2357void 2424void
2358set_reverse_stereo (CFPlus::Channel self, int flip) 2425set_reverse_stereo (CFPlus::Channel self, int flip)
2359 CODE: 2426 CODE:
2360 Mix_SetReverseStereo (self, flip); 2427 Mix_SetReverseStereo (self, flip);
2497 const_iv (GL_INTENSITY), 2564 const_iv (GL_INTENSITY),
2498 const_iv (GL_LUMINANCE), 2565 const_iv (GL_LUMINANCE),
2499 const_iv (GL_LUMINANCE_ALPHA), 2566 const_iv (GL_LUMINANCE_ALPHA),
2500 const_iv (GL_FLOAT), 2567 const_iv (GL_FLOAT),
2501 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2568 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2569 const_iv (GL_COMPRESSED_ALPHA_ARB),
2570 const_iv (GL_COMPRESSED_LUMINANCE_ARB),
2571 const_iv (GL_COMPRESSED_LUMINANCE_ALPHA_ARB),
2572 const_iv (GL_COMPRESSED_INTENSITY_ARB),
2573 const_iv (GL_COMPRESSED_RGB_ARB),
2574 const_iv (GL_COMPRESSED_RGBA_ARB),
2502 const_iv (GL_COMPILE), 2575 const_iv (GL_COMPILE),
2503 const_iv (GL_PROXY_TEXTURE_1D), 2576 const_iv (GL_PROXY_TEXTURE_1D),
2504 const_iv (GL_PROXY_TEXTURE_2D), 2577 const_iv (GL_PROXY_TEXTURE_2D),
2505 const_iv (GL_TEXTURE_1D), 2578 const_iv (GL_TEXTURE_1D),
2506 const_iv (GL_TEXTURE_2D), 2579 const_iv (GL_TEXTURE_2D),
2545 const_iv (GL_PERSPECTIVE_CORRECTION_HINT), 2618 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
2546 const_iv (GL_POINT_SMOOTH_HINT), 2619 const_iv (GL_POINT_SMOOTH_HINT),
2547 const_iv (GL_LINE_SMOOTH_HINT), 2620 const_iv (GL_LINE_SMOOTH_HINT),
2548 const_iv (GL_POLYGON_SMOOTH_HINT), 2621 const_iv (GL_POLYGON_SMOOTH_HINT),
2549 const_iv (GL_GENERATE_MIPMAP_HINT), 2622 const_iv (GL_GENERATE_MIPMAP_HINT),
2623 const_iv (GL_TEXTURE_COMPRESSION_HINT),
2550 const_iv (GL_FASTEST), 2624 const_iv (GL_FASTEST),
2551 const_iv (GL_DONT_CARE), 2625 const_iv (GL_DONT_CARE),
2552 const_iv (GL_NICEST), 2626 const_iv (GL_NICEST),
2553 const_iv (GL_V2F), 2627 const_iv (GL_V2F),
2554 const_iv (GL_V3F), 2628 const_iv (GL_V3F),
2562 2636
2563 texture_av = newAV (); 2637 texture_av = newAV ();
2564 AvREAL_off (texture_av); 2638 AvREAL_off (texture_av);
2565} 2639}
2566 2640
2641void
2642disable_GL_EXT_blend_func_separate ()
2643 CODE:
2644 gl.BlendFuncSeparate = 0;
2645 gl.BlendFuncSeparateEXT = 0;
2646
2567char * 2647char *
2568gl_vendor () 2648gl_vendor ()
2569 CODE: 2649 CODE:
2570 RETVAL = (char *)glGetString (GL_VENDOR); 2650 RETVAL = (char *)glGetString (GL_VENDOR);
2571 OUTPUT: 2651 OUTPUT:
2692 2772
2693void glRect (float x1, float y1, float x2, float y2) 2773void glRect (float x1, float y1, float x2, float y2)
2694 CODE: 2774 CODE:
2695 glRectf (x1, y1, x2, y2); 2775 glRectf (x1, y1, x2, y2);
2696 2776
2777void glRect_lineloop (float x1, float y1, float x2, float y2)
2778 CODE:
2779 glBegin (GL_LINE_LOOP);
2780 glVertex2f (x1, y1);
2781 glVertex2f (x2, y1);
2782 glVertex2f (x2, y2);
2783 glVertex2f (x1, y2);
2784 glEnd ();
2785
2697PROTOTYPES: ENABLE 2786PROTOTYPES: ENABLE
2698 2787
2699void glBegin (int mode) 2788void glBegin (int mode)
2700 2789
2701void glEnd () 2790void glEnd ()
2802 NV x, y, w, h; 2891 NV x, y, w, h;
2803 SV *draw_x_sv = GvSV (draw_x_gv); 2892 SV *draw_x_sv = GvSV (draw_x_gv);
2804 SV *draw_y_sv = GvSV (draw_y_gv); 2893 SV *draw_y_sv = GvSV (draw_y_gv);
2805 SV *draw_w_sv = GvSV (draw_w_gv); 2894 SV *draw_w_sv = GvSV (draw_w_gv);
2806 SV *draw_h_sv = GvSV (draw_h_gv); 2895 SV *draw_h_sv = GvSV (draw_h_gv);
2807 SV *hover;
2808 double draw_x, draw_y, draw_w, draw_h; 2896 double draw_x, draw_y;
2809 2897
2810 if (!SvROK (self)) 2898 if (!SvROK (self))
2811 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self)); 2899 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self));
2812 2900
2813 hv = (HV *)SvRV (self); 2901 hv = (HV *)SvRV (self);
2841 { 2929 {
2842 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0); 2930 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0);
2843 2931
2844 if (svp && SvTRUE (*svp)) 2932 if (svp && SvTRUE (*svp))
2845 { 2933 {
2846 glColor4f (1*0.2f, 0.8*0.2f, 0.5*0.2f, 0.2f); 2934 glColor4f (1.0f * 0.2f, 0.8f * 0.2f, 0.5f * 0.2f, 0.2f);
2847 glEnable (GL_BLEND); 2935 glEnable (GL_BLEND);
2848 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 2936 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
2849 glBegin (GL_QUADS); 2937 glBegin (GL_QUADS);
2850 glVertex2f (0, 0); 2938 glVertex2f (0, 0);
2851 glVertex2f (w, 0); 2939 glVertex2f (w, 0);
2854 glEnd (); 2942 glEnd ();
2855 glDisable (GL_BLEND); 2943 glDisable (GL_BLEND);
2856 } 2944 }
2857 } 2945 }
2858#if 0 2946#if 0
2859 if ($ENV{CFPLUS_DEBUG} & 1) { 2947 // draw borders, for debugging
2860 glPushMatrix; 2948 glPushMatrix ();
2861 glColor 1, 1, 0, 1; 2949 glColor4f (1., 1., 0., 1.);
2862 glTranslate 0.375, 0.375; 2950 glTranslatef (.5, .5, 0.);
2863 glBegin GL_LINE_LOOP; 2951 glBegin (GL_LINE_LOOP);
2864 glVertex 0 , 0; 2952 glVertex2f (0 , 0);
2865 glVertex $self->{w} - 1, 0; 2953 glVertex2f (w - 1, 0);
2866 glVertex $self->{w} - 1, $self->{h} - 1; 2954 glVertex2f (w - 1, h - 1);
2867 glVertex 0 , $self->{h} - 1; 2955 glVertex2f (0 , h - 1);
2868 glEnd; 2956 glEnd ();
2869 glPopMatrix; 2957 glPopMatrix ();
2870 #CFPlus::UI::Label->new (w => $self->{w}, h => $self->{h}, text => $self, fontsize => 0)->_draw;
2871 }
2872#endif 2958#endif
2873 PUSHMARK (SP); 2959 PUSHMARK (SP);
2874 XPUSHs (self); 2960 XPUSHs (self);
2875 PUTBACK; 2961 PUTBACK;
2876 call_method ("_draw", G_VOID | G_DISCARD); 2962 call_method ("_draw", G_VOID | G_DISCARD);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines