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.222 by root, Sat Aug 11 06:34:26 2007 UTC vs.
Revision 1.235 by root, Tue Aug 28 01:23:47 2007 UTC

114 av_push (texture_av, (SV *)(size_t)name); 114 av_push (texture_av, (SV *)(size_t)name);
115 glDeleteTextures (1, &name); 115 glDeleteTextures (1, &name);
116} 116}
117 117
118#include "texcache.c" 118#include "texcache.c"
119#include "rendercache.c"
119 120
120#include "pango-font.c" 121#include "pango-font.c"
121#include "pango-fontmap.c" 122#include "pango-fontmap.c"
122#include "pango-render.c" 123#include "pango-render.c"
123 124
149typedef struct cf_layout { 150typedef struct cf_layout {
150 PangoLayout *pl; 151 PangoLayout *pl;
151 float r, g, b, a; // default color for rgba mode 152 float r, g, b, a; // default color for rgba mode
152 int base_height; 153 int base_height;
153 CFPlus__Font font; 154 CFPlus__Font font;
155 rc_t *rc;
154} *CFPlus__Layout; 156} *CFPlus__Layout;
155 157
156static CFPlus__Font default_font; 158static CFPlus__Font default_font;
157static PangoContext *opengl_context; 159static PangoContext *opengl_context;
158static PangoFontMap *opengl_fontmap; 160static PangoFontMap *opengl_fontmap;
201 203
202typedef uint16_t tileid; 204typedef uint16_t tileid;
203typedef uint16_t faceid; 205typedef uint16_t faceid;
204 206
205typedef struct { 207typedef struct {
206 int name; 208 GLuint name;
207 int w, h; 209 int w, h;
208 float s, t; 210 float s, t;
209 uint8_t r, g, b, a; 211 uint8_t r, g, b, a;
210 tileid smoothtile; 212 tileid smoothtile;
211 uint8_t smoothlevel; 213 uint8_t smoothlevel;
436 n |= n >> 4; 438 n |= n >> 4;
437 n |= n >> 8; 439 n |= n >> 8;
438 n |= n >> 16; 440 n |= n >> 16;
439 441
440 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;
441} 454}
442 455
443/* SDL should provide this, really. */ 456/* SDL should provide this, really. */
444#define SDLK_MODIFIER_MIN 300 457#define SDLK_MODIFIER_MIN 300
445#define SDLK_MODIFIER_MAX 314 458#define SDLK_MODIFIER_MAX 314
523 536
524 const_iv (SDL_APPINPUTFOCUS), 537 const_iv (SDL_APPINPUTFOCUS),
525 const_iv (SDL_APPMOUSEFOCUS), 538 const_iv (SDL_APPMOUSEFOCUS),
526 const_iv (SDL_APPACTIVE), 539 const_iv (SDL_APPACTIVE),
527 540
541 const_iv (SDLK_FIRST),
542 const_iv (SDLK_LAST),
528 const_iv (SDLK_KP0), 543 const_iv (SDLK_KP0),
529 const_iv (SDLK_KP1), 544 const_iv (SDLK_KP1),
530 const_iv (SDLK_KP2), 545 const_iv (SDLK_KP2),
531 const_iv (SDLK_KP3), 546 const_iv (SDLK_KP3),
532 const_iv (SDLK_KP4), 547 const_iv (SDLK_KP4),
631 646
632NV floor (NV x) 647NV floor (NV x)
633 648
634NV ceil (NV x) 649NV ceil (NV x)
635 650
651IV minpot (UV n)
652
653IV popcount (UV n)
654
636void 655void
637pango_init () 656pango_init ()
638 CODE: 657 CODE:
639{ 658{
640 opengl_fontmap = pango_opengl_font_map_new (); 659 opengl_fontmap = pango_opengl_font_map_new ();
713 732
714 if (RETVAL) 733 if (RETVAL)
715 { 734 {
716 av_clear (texture_av); 735 av_clear (texture_av);
717 736
718 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 737 SDL_WM_SetCaption ("Crossfire TRT Client " VERSION, "Crossfire TRT");
719#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);
720#include "glfunc.h" 739#include "glfunc.h"
721#undef GL_FUNC 740#undef GL_FUNC
722 } 741 }
723} 742}
1035 RETVAL->g = 1.; 1054 RETVAL->g = 1.;
1036 RETVAL->b = 1.; 1055 RETVAL->b = 1.;
1037 RETVAL->a = 1.; 1056 RETVAL->a = 1.;
1038 RETVAL->base_height = MIN_FONT_HEIGHT; 1057 RETVAL->base_height = MIN_FONT_HEIGHT;
1039 RETVAL->font = 0; 1058 RETVAL->font = 0;
1059 RETVAL->rc = rc_alloc ();
1040 1060
1041 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 1061 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
1042 layout_update_font (RETVAL); 1062 layout_update_font (RETVAL);
1043 OUTPUT: 1063 OUTPUT:
1044 RETVAL 1064 RETVAL
1045 1065
1046void 1066void
1047DESTROY (CFPlus::Layout self) 1067DESTROY (CFPlus::Layout self)
1048 CODE: 1068 CODE:
1049 g_object_unref (self->pl); 1069 g_object_unref (self->pl);
1070 rc_free (self->rc);
1050 Safefree (self); 1071 Safefree (self);
1051 1072
1052void 1073void
1053set_text (CFPlus::Layout self, SV *text_) 1074set_text (CFPlus::Layout self, SV *text_)
1054 CODE: 1075 CODE:
1306 } 1327 }
1307} 1328}
1308 1329
1309void 1330void
1310render (CFPlus::Layout self, float x, float y, int flags = 0) 1331render (CFPlus::Layout self, float x, float y, int flags = 0)
1311 PPCODE: 1332 CODE:
1333 rc_clear (self->rc);
1312 pango_opengl_render_layout_subpixel ( 1334 pango_opengl_render_layout_subpixel (
1313 self->pl, 1335 self->pl,
1336 self->rc,
1314 x * PANGO_SCALE, y * PANGO_SCALE, 1337 x * PANGO_SCALE, y * PANGO_SCALE,
1315 self->r, self->g, self->b, self->a, 1338 self->r, self->g, self->b, self->a,
1316 flags 1339 flags
1317 ); 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}
1318 1363
1319MODULE = CFPlus PACKAGE = CFPlus::Texture 1364MODULE = CFPlus PACKAGE = CFPlus::Texture
1320 1365
1321PROTOTYPES: ENABLE 1366PROTOTYPES: ENABLE
1322
1323int minpot (int n)
1324 1367
1325void 1368void
1326pad (SV *data_, int ow, int oh, int nw, int nh) 1369pad (SV *data_, int ow, int oh, int nw, int nh)
1327 CODE: 1370 CODE:
1328{ 1371{
1713 1756
1714void 1757void
1715draw (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)
1716 CODE: 1759 CODE:
1717{ 1760{
1761 int x, y, z;
1762
1718 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1763 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
1719 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
1720 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)
1721 smooth_key skey; 1766 smooth_key skey;
1722 int x, y, z; 1767
1723 int last_name; 1768 rc_t *rc = rc_alloc ();
1769 rc_key_t key;
1770 rc_array_t *arr;
1724 1771
1725 // thats current max. sorry. 1772 // thats current max. sorry.
1726 if (sw > 255) sw = 255; 1773 if (sw > 255) sw = 255;
1727 if (sh > 255) sh = 255; 1774 if (sh > 255) sh = 255;
1728 1775
1729 // clear key, in case of extra padding 1776 // clear key, in case of extra padding
1730 memset (&skey, 0, sizeof (skey)); 1777 memset (&skey, 0, sizeof (skey));
1731 1778
1732 glColor4ub (255, 255, 255, 255); 1779 memset (&key, 0, sizeof (key));
1733 1780 key.r = 255;
1734 glEnable (GL_BLEND); 1781 key.g = 255;
1735 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 1782 key.b = 255;
1736 glEnable (GL_TEXTURE_2D); 1783 key.a = 255;
1737 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1784 key.mode = GL_QUADS;
1738 1785 key.format = GL_T2F_V3F;
1739 glBegin (GL_QUADS);
1740
1741 last_name = -1; 1786 key.texname = -1;
1742 1787
1743 mx += self->x; 1788 mx += self->x;
1744 my += self->y; 1789 my += self->y;
1745 1790
1746 // first pass: determine smooth_max 1791 // first pass: determine smooth_max
1762 MAX (self->tex [cell->tile [0]].smoothlevel, 1807 MAX (self->tex [cell->tile [0]].smoothlevel,
1763 MAX (self->tex [cell->tile [1]].smoothlevel, 1808 MAX (self->tex [cell->tile [1]].smoothlevel,
1764 self->tex [cell->tile [2]].smoothlevel)); 1809 self->tex [cell->tile [2]].smoothlevel));
1765 } 1810 }
1766 } 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);
1767 1816
1768 for (z = 0; z <= 2; z++) 1817 for (z = 0; z <= 2; z++)
1769 { 1818 {
1770 memset (smooth_level, 0, sizeof (smooth_level)); 1819 memset (smooth_level, 0, sizeof (smooth_level));
1771 1820
1783 if (tile) 1832 if (tile)
1784 { 1833 {
1785 maptex tex = self->tex [tile]; 1834 maptex tex = self->tex [tile];
1786 int px, py; 1835 int px, py;
1787 1836
1788 // suppressing texture state switches here
1789 // is only moderately effective, but worth the extra effort
1790 if (last_name != tex.name) 1837 if (key.texname != tex.name)
1791 { 1838 {
1792 if (!tex.name) 1839 if (!tex.name)
1793 tex = self->tex [2]; /* missing, replace by noface */ 1840 tex = self->tex [2]; /* missing, replace by noface */
1794 1841
1795 glEnd (); 1842 key.texname = tex.name;
1796 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1843 arr = rc_array (rc, &key);
1797 glBegin (GL_QUADS);
1798 } 1844 }
1799 1845
1800 px = (x + 1) * T - tex.w; 1846 px = (x + 1) * T - tex.w;
1801 py = (y + 1) * T - tex.h; 1847 py = (y + 1) * T - tex.h;
1802 1848
1803 glTexCoord2f (0 , 0 ); glVertex2f (px , py ); 1849 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1804 glTexCoord2f (0 , tex.t); glVertex2f (px , py + tex.h); 1850 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
1805 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);
1806 glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py ); 1852 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
1807 1853
1808 if (cell->flags && z == 2) 1854 if (cell->flags && z == 2)
1809 { 1855 {
1856 // overlays such as the speech bubble, probably more to come
1810 if (cell->flags & 1) 1857 if (cell->flags & 1)
1811 { 1858 {
1812 maptex tex = self->tex [1]; 1859 maptex tex = self->tex [1];
1813 int px = x * T + T * 2 / 32; 1860 int px = x * T + T * 2 / 32;
1814 int py = y * T - T * 6 / 32; 1861 int py = y * T - T * 6 / 32;
1815 1862
1863 if (tex.name)
1816 glEnd (); 1864 {
1817 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);
1818 glBegin (GL_QUADS); 1875 }
1819
1820 glTexCoord2f (0 , 0 ); glVertex2f (px , py );
1821 glTexCoord2f (0 , tex.t); glVertex2f (px , py + T);
1822 glTexCoord2f (tex.s, tex.t); glVertex2f (px + T, py + T);
1823 glTexCoord2f (tex.s, 0 ); glVertex2f (px + T, py );
1824 } 1876 }
1825 } 1877 }
1826 1878
1827 // update smooth hash 1879 // update smooth hash
1828 if (tex.smoothtile) 1880 if (tex.smoothtile)
1864 } 1916 }
1865 } 1917 }
1866 } 1918 }
1867 } 1919 }
1868 1920
1921 rc_draw (rc);
1922 rc_clear (rc);
1923
1869 // go through all smoothlevels, lowest to highest, then draw. 1924 // go through all smoothlevels, lowest to highest, then draw.
1870 // this is basically counting sort 1925 // this is basically counting sort
1871 { 1926 {
1872 int w, b; 1927 int w, b;
1873 1928
1929 glEnable (GL_TEXTURE_2D);
1930 glBegin (GL_QUADS);
1874 for (w = 0; w < 256 / 32; ++w) 1931 for (w = 0; w < 256 / 32; ++w)
1875 { 1932 {
1876 uint32_t smask = smooth_level [w]; 1933 uint32_t smask = smooth_level [w];
1877 if (smask) 1934 if (smask)
1878 for (b = 0; b < 32; ++b) 1935 for (b = 0; b < 32; ++b)
1897 int border = bits & 15; 1954 int border = bits & 15;
1898 int corner = (bits >> 8) & ~(bits >> 4) & 15; 1955 int corner = (bits >> 8) & ~(bits >> 4) & 15;
1899 float dx = tex.s * .0625f; // 16 images/row 1956 float dx = tex.s * .0625f; // 16 images/row
1900 float dy = tex.t * .5f ; // 2 images/column 1957 float dy = tex.t * .5f ; // 2 images/column
1901 1958
1902 // this time naively avoiding texture state changes
1903 // save gobs of state changes.
1904 if (last_name != tex.name) 1959 if (tex.name)
1905 { 1960 {
1961 // this time avoiding texture state changes
1962 // save gobs of state changes.
1906 if (!tex.name) 1963 if (key.texname != tex.name)
1907 continue; // smoothing not yet available 1964 {
1908
1909 glEnd (); 1965 glEnd ();
1910 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1966 glBindTexture (GL_TEXTURE_2D, key.texname = tex.name);
1911 glBegin (GL_QUADS); 1967 glBegin (GL_QUADS);
1912 } 1968 }
1913 1969
1914 if (border) 1970 if (border)
1915 { 1971 {
1916 float ox = border * dx; 1972 float ox = border * dx;
1917 1973
1918 glTexCoord2f (ox , 0.f ); glVertex2f (px , py ); 1974 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
1919 glTexCoord2f (ox , dy ); glVertex2f (px , py + T); 1975 glTexCoord2f (ox , dy ); glVertex2i (px , py + T);
1920 glTexCoord2f (ox + dx, dy ); glVertex2f (px + T, py + T); 1976 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T);
1921 glTexCoord2f (ox + dx, 0.f ); glVertex2f (px + T, py ); 1977 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py );
1922 } 1978 }
1923 1979
1924 if (corner) 1980 if (corner)
1925 { 1981 {
1926 float ox = corner * dx; 1982 float ox = corner * dx;
1927 1983
1928 glTexCoord2f (ox , dy ); glVertex2f (px , py ); 1984 glTexCoord2f (ox , dy ); glVertex2i (px , py );
1929 glTexCoord2f (ox , dy * 2.f); glVertex2f (px , py + T); 1985 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T);
1930 glTexCoord2f (ox + dx, dy * 2.f); glVertex2f (px + T, py + T); 1986 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T);
1931 glTexCoord2f (ox + dx, dy ); glVertex2f (px + T, py ); 1987 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py );
1988 }
1932 } 1989 }
1933 } 1990 }
1934 } 1991 }
1935 } 1992 }
1936 } 1993 }
1994
1995 glEnd ();
1996 glDisable (GL_TEXTURE_2D);
1997 key.texname = -1;
1937 } 1998 }
1938 1999
1939 hv_clear (smooth); 2000 hv_clear (smooth);
1940 } 2001 }
1941 2002
1942 glEnd ();
1943
1944 glDisable (GL_TEXTURE_2D);
1945 glDisable (GL_BLEND); 2003 glDisable (GL_BLEND);
2004 rc_free (rc);
1946 2005
1947 // top layer: overlays such as the health bar 2006 // top layer: overlays such as the health bar
1948 for (y = 0; y < sh; y++) 2007 for (y = 0; y < sh; y++)
1949 if (0 <= y + my && y + my < self->rows) 2008 if (0 <= y + my && y + my < self->rows)
1950 { 2009 {
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
2505 const_iv (GL_INTENSITY), 2564 const_iv (GL_INTENSITY),
2506 const_iv (GL_LUMINANCE), 2565 const_iv (GL_LUMINANCE),
2507 const_iv (GL_LUMINANCE_ALPHA), 2566 const_iv (GL_LUMINANCE_ALPHA),
2508 const_iv (GL_FLOAT), 2567 const_iv (GL_FLOAT),
2509 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),
2510 const_iv (GL_COMPILE), 2575 const_iv (GL_COMPILE),
2511 const_iv (GL_PROXY_TEXTURE_1D), 2576 const_iv (GL_PROXY_TEXTURE_1D),
2512 const_iv (GL_PROXY_TEXTURE_2D), 2577 const_iv (GL_PROXY_TEXTURE_2D),
2513 const_iv (GL_TEXTURE_1D), 2578 const_iv (GL_TEXTURE_1D),
2514 const_iv (GL_TEXTURE_2D), 2579 const_iv (GL_TEXTURE_2D),
2553 const_iv (GL_PERSPECTIVE_CORRECTION_HINT), 2618 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
2554 const_iv (GL_POINT_SMOOTH_HINT), 2619 const_iv (GL_POINT_SMOOTH_HINT),
2555 const_iv (GL_LINE_SMOOTH_HINT), 2620 const_iv (GL_LINE_SMOOTH_HINT),
2556 const_iv (GL_POLYGON_SMOOTH_HINT), 2621 const_iv (GL_POLYGON_SMOOTH_HINT),
2557 const_iv (GL_GENERATE_MIPMAP_HINT), 2622 const_iv (GL_GENERATE_MIPMAP_HINT),
2623 const_iv (GL_TEXTURE_COMPRESSION_HINT),
2558 const_iv (GL_FASTEST), 2624 const_iv (GL_FASTEST),
2559 const_iv (GL_DONT_CARE), 2625 const_iv (GL_DONT_CARE),
2560 const_iv (GL_NICEST), 2626 const_iv (GL_NICEST),
2561 const_iv (GL_V2F), 2627 const_iv (GL_V2F),
2562 const_iv (GL_V3F), 2628 const_iv (GL_V3F),
2570 2636
2571 texture_av = newAV (); 2637 texture_av = newAV ();
2572 AvREAL_off (texture_av); 2638 AvREAL_off (texture_av);
2573} 2639}
2574 2640
2641void
2642disable_GL_EXT_blend_func_separate ()
2643 CODE:
2644 gl.BlendFuncSeparate = 0;
2645 gl.BlendFuncSeparateEXT = 0;
2646
2575char * 2647char *
2576gl_vendor () 2648gl_vendor ()
2577 CODE: 2649 CODE:
2578 RETVAL = (char *)glGetString (GL_VENDOR); 2650 RETVAL = (char *)glGetString (GL_VENDOR);
2579 OUTPUT: 2651 OUTPUT:
2700 2772
2701void glRect (float x1, float y1, float x2, float y2) 2773void glRect (float x1, float y1, float x2, float y2)
2702 CODE: 2774 CODE:
2703 glRectf (x1, y1, x2, y2); 2775 glRectf (x1, y1, x2, y2);
2704 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
2705PROTOTYPES: ENABLE 2786PROTOTYPES: ENABLE
2706 2787
2707void glBegin (int mode) 2788void glBegin (int mode)
2708 2789
2709void glEnd () 2790void glEnd ()
2810 NV x, y, w, h; 2891 NV x, y, w, h;
2811 SV *draw_x_sv = GvSV (draw_x_gv); 2892 SV *draw_x_sv = GvSV (draw_x_gv);
2812 SV *draw_y_sv = GvSV (draw_y_gv); 2893 SV *draw_y_sv = GvSV (draw_y_gv);
2813 SV *draw_w_sv = GvSV (draw_w_gv); 2894 SV *draw_w_sv = GvSV (draw_w_gv);
2814 SV *draw_h_sv = GvSV (draw_h_gv); 2895 SV *draw_h_sv = GvSV (draw_h_gv);
2815 SV *hover;
2816 double draw_x, draw_y, draw_w, draw_h; 2896 double draw_x, draw_y;
2817 2897
2818 if (!SvROK (self)) 2898 if (!SvROK (self))
2819 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self)); 2899 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self));
2820 2900
2821 hv = (HV *)SvRV (self); 2901 hv = (HV *)SvRV (self);
2849 { 2929 {
2850 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0); 2930 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0);
2851 2931
2852 if (svp && SvTRUE (*svp)) 2932 if (svp && SvTRUE (*svp))
2853 { 2933 {
2854 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);
2855 glEnable (GL_BLEND); 2935 glEnable (GL_BLEND);
2856 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 2936 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
2857 glBegin (GL_QUADS); 2937 glBegin (GL_QUADS);
2858 glVertex2f (0, 0); 2938 glVertex2f (0, 0);
2859 glVertex2f (w, 0); 2939 glVertex2f (w, 0);
2862 glEnd (); 2942 glEnd ();
2863 glDisable (GL_BLEND); 2943 glDisable (GL_BLEND);
2864 } 2944 }
2865 } 2945 }
2866#if 0 2946#if 0
2867 if ($ENV{CFPLUS_DEBUG} & 1) { 2947 // draw borders, for debugging
2868 glPushMatrix; 2948 glPushMatrix ();
2869 glColor 1, 1, 0, 1; 2949 glColor4f (1., 1., 0., 1.);
2870 glTranslate 0.375, 0.375; 2950 glTranslatef (.5, .5, 0.);
2871 glBegin GL_LINE_LOOP; 2951 glBegin (GL_LINE_LOOP);
2872 glVertex 0 , 0; 2952 glVertex2f (0 , 0);
2873 glVertex $self->{w} - 1, 0; 2953 glVertex2f (w - 1, 0);
2874 glVertex $self->{w} - 1, $self->{h} - 1; 2954 glVertex2f (w - 1, h - 1);
2875 glVertex 0 , $self->{h} - 1; 2955 glVertex2f (0 , h - 1);
2876 glEnd; 2956 glEnd ();
2877 glPopMatrix; 2957 glPopMatrix ();
2878 #CFPlus::UI::Label->new (w => $self->{w}, h => $self->{h}, text => $self, fontsize => 0)->_draw;
2879 }
2880#endif 2958#endif
2881 PUSHMARK (SP); 2959 PUSHMARK (SP);
2882 XPUSHs (self); 2960 XPUSHs (self);
2883 PUTBACK; 2961 PUTBACK;
2884 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