source: trunk/src/lua/lua_gfx.cc @ 507

Last change on this file since 507 was 507, checked in by epyon, 9 years ago
  • missing files added
File size: 5.2 KB
RevLine 
[507]1// Copyright (C) 2016-2016 ChaosForge Ltd
2// http://chaosforge.org/
3//
4// This file is part of Nova libraries.
5// For conditions of distribution and use, see copying.txt file in root folder.
6
7#include "nv/lua/lua_gfx.hh"
8
9#include "nv/base/capi.hh"
10#include "nv/lua/lua_raw.hh"
11#include "nv/lua/lua_templates.hh"
12
13using nv::lua::detail::is_color_mask;
14using nv::lua::detail::to_color_mask;
15using nv::lua::detail::to_pcolor_mask;
16using nv::lua::detail::push_color_mask;
17
18using nv::lua::detail::is_scissor_test;
19using nv::lua::detail::to_scissor_test;
20using nv::lua::detail::to_pscissor_test;
21using nv::lua::detail::push_scissor_test;
22
23using nv::lua::detail::is_clear_state;
24using nv::lua::detail::to_clear_state;
25using nv::lua::detail::to_pclear_state;
26using nv::lua::detail::push_clear_state;
27
28static int nlua_color_mask_tostring( lua_State * L )
29{
30        nv::color_mask* m = to_pcolor_mask( L, 1 );
31        lua_pushfstring( L, "color_mask(%s%s%s%s)",
32                m->red ? "R" : "-",
33                m->red ? "G" : "-",
34                m->red ? "B" : "-",
35                m->red ? "A" : "-"
36        );
37        return 1;
38}
39
40static int nlua_color_mask_index( lua_State * L )
41{
42        nv::color_mask* m = to_pcolor_mask( L, 1 );
43        size_t len = 0;
44        const char * key = lua_tolstring( L, 2, &len );
45        if ( len > 0 )
46        {
47                char k = key[0];
48                if ( k == 'r' && ( len == 1 || nv::nvstrcmp( key, "red" ) == 0 ) )
49                {
50                        lua_pushboolean( L, m->red ); return 1;
51                }
52                if ( k == 'g' && ( len == 1 || nv::nvstrcmp( key, "green" ) == 0 ) )
53                {
54                        lua_pushboolean( L, m->green ); return 1;
55                }
56                if ( k == 'b' && ( len == 1 || nv::nvstrcmp( key, "blue" ) == 0 ) )
57                {
58                        lua_pushboolean( L, m->blue ); return 1;
59                }
60                if ( k == 'a' && ( len == 1 || nv::nvstrcmp( key, "alpha" ) == 0 ) )
61                {
62                        lua_pushboolean( L, m->alpha ); return 1;
63                }
64        }
65
66        luaL_getmetafield( L, 1, "__functions" );
67        lua_pushvalue( L, 2 );
68        lua_rawget( L, -2 );
69        return 1;
70}
71
72static int nlua_color_mask_newindex( lua_State * L )
73{
74        nv::color_mask* m = to_pcolor_mask( L, 1 );
75        size_t len = 0;
76        const char * key = lua_tolstring( L, 2, &len );
77        if ( len > 0 )
78        {
79                char k = key[0];
80                if ( k == 'r' && ( len == 1 || nv::nvstrcmp( key, "red" ) == 0 ) )
81                {
82                        m->red   = lua_toboolean( L, 3 ) != 0; return 0;
83                }
84                if ( k == 'g' && ( len == 1 || nv::nvstrcmp( key, "green" ) == 0 ) )
85                {
86                        m->green = lua_toboolean( L, 3 ) != 0; return 0;
87                }
88                if ( k == 'b' && ( len == 1 || nv::nvstrcmp( key, "blue" ) == 0 ) )
89                {
90                        m->blue  = lua_toboolean( L, 3 ) != 0; return 0;
91                }
92                if ( k == 'a' && ( len == 1 || nv::nvstrcmp( key, "alpha" ) == 0 ) )
93                {
94                        m->alpha = lua_toboolean( L, 3 ) != 0; return 0;
95                }
96        }
97        luaL_error( L, "color_mask : unknown index - %s", lua_tostring( L, 2 ) );
98        return 0;
99}
100
101static int luaopen_color_mask( lua_State * L )
102{
103        struct constructor
104        {
105                static inline nv::color_mask construct( lua_State* L, int index )
106                {
107                        int args = lua_gettop( L ) - index;
108                        bool r = args >= 0 ? lua_toboolean( L, index + 0 ) != 0 : true;
109                        bool g = args >= 1 ? lua_toboolean( L, index + 1 ) != 0 : true;
110                        bool b = args >= 2 ? lua_toboolean( L, index + 2 ) != 0 : true;
111                        bool a = args >= 3 ? lua_toboolean( L, index + 3 ) != 0 : true;
112                        return nv::color_mask( r, g, b, a );
113                }
114        };
115
116        NV_LUA_STACK_ASSERT( L, 1 );
117        static const struct luaL_Reg nlua_color_mask_sf[] = {
118                { "new",            nv::lua::detail::new_impl<nv::color_mask, constructor> },
119                { NULL, NULL }
120        };
121
122        static const struct luaL_Reg nlua_color_mask_f[] = {
123                { "clone",          nv::lua::detail::clone_impl<nv::color_mask> },
124                { "tostring",       nlua_color_mask_tostring },
125                { NULL, NULL }
126        };
127
128        static const struct luaL_Reg nlua_color_mask_sm[] = {
129                { "__call",          nv::lua::detail::call_impl<nv::color_mask, constructor> },
130                { NULL, NULL }
131        };
132
133        static const struct luaL_Reg nlua_color_mask_m[] = {
134                { "__eq",       nv::lua::detail::eq_impl<nv::color_mask> },
135                { "__index",    nlua_color_mask_index },
136                { "__newindex", nlua_color_mask_newindex },
137                { "__tostring", nlua_color_mask_tostring },
138                { NULL, NULL }
139        };
140
141        luaL_newmetatable( L, nv::lua::pass_traits<nv::color_mask>::metatable() );
142        nlua_register( L, nlua_color_mask_m, -1 );
143        lua_createtable( L, 0, 0 );
144        nlua_register( L, nlua_color_mask_f, -1 );
145        lua_setfield( L, -2, "__functions" );
146        lua_pop( L, 1 );
147
148        lua_createtable( L, 0, 0 );
149        nlua_register( L, nlua_color_mask_sf, -1 );
150        lua_createtable( L, 0, 0 );
151        nlua_register( L, nlua_color_mask_sm, -1 );
152        lua_setmetatable( L, -2 );
153
154//      nv::lua::detail::push_vec( L, T() );
155//      lua_setfield( L, -2, "ZERO" );
156//      nv::lua::detail::push_vec( L, nlua_vec_constructor<T, sizeof( T ) / sizeof( typename T::value_type )>::unit() );
157//      lua_setfield( L, -2, "UNIT" );
158
159        return 1;
160}
161
162static int luaopen_scissor_test( lua_State * L )
163{
164        NV_LUA_STACK_ASSERT( L, 1 );
165        return 1;
166}
167
168static int luaopen_clear_state( lua_State * L )
169{
170        NV_LUA_STACK_ASSERT( L, 1 );
171        return 1;
172}
173
174
175void nv::lua::register_gfx( lua_State* L )
176{
177        int stack = lua_gettop( L );
178        nlua_requiref( L, "color_mask", luaopen_color_mask, 1 );
179        nlua_requiref( L, "scissor_test", luaopen_scissor_test, 1 );
180        nlua_requiref( L, "clear_state", luaopen_clear_state, 1 );
181        lua_settop( L, stack );
182}
Note: See TracBrowser for help on using the repository browser.