Changeset 207 for trunk/src/lua/lua_area.cc
- Timestamp:
- 08/19/13 07:42:00 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lua/lua_area.cc
r206 r207 11 11 #include "nv/random.hh" 12 12 13 static const char* NLUA_AREA_METATABLE = "area"; 14 15 bool nlua_is_area( lua_State* L, int index ) 16 { 17 return luaL_testudata( L, index, NLUA_AREA_METATABLE ) != 0; 18 } 19 20 nv::rectangle nlua_to_area( lua_State* L, int index ) 21 { 22 return *(nv::rectangle*)luaL_checkudata( L, index, NLUA_AREA_METATABLE ); 23 } 24 25 nv::rectangle* nlua_to_parea( lua_State* L, int index ) 26 { 27 return (nv::rectangle*)luaL_checkudata( L, index, NLUA_AREA_METATABLE ); 28 } 29 30 void nlua_push_area( lua_State* L, const nv::rectangle& v ) 31 { 32 new (lua_newuserdata(L, sizeof(nv::rectangle))) nv::rectangle(v); 33 luaL_setmetatable( L, NLUA_AREA_METATABLE ); 34 } 13 const char* nv::lua::detail::AREA_METATABLE = "area"; 14 15 using nv::lua::detail::is_coord; 16 using nv::lua::detail::to_coord; 17 using nv::lua::detail::to_pcoord; 18 using nv::lua::detail::push_coord; 19 20 using nv::lua::detail::is_area; 21 using nv::lua::detail::to_area; 22 using nv::lua::detail::to_parea; 23 using nv::lua::detail::push_area; 35 24 36 25 static void nlua_area_construct( lua_State* L, int sidx ) 37 26 { 38 if ( nlua_is_coord( L, sidx ) )39 { 40 if ( nlua_is_coord( L, sidx+1 ) )27 if ( is_coord( L, sidx ) ) 28 { 29 if ( is_coord( L, sidx+1 ) ) 41 30 { 42 nv::rectangle a( nlua_to_coord( L, sidx ), nlua_to_coord( L, sidx+1 ) );43 nlua_push_area( L, a );31 nv::rectangle a( to_coord( L, sidx ), to_coord( L, sidx+1 ) ); 32 push_area( L, a ); 44 33 return; 45 34 } … … 51 40 nv::ivec2( lua_tointeger( L, sidx+2 ), lua_tointeger( L, sidx+3 ) ) 52 41 ); 53 nlua_push_area( L, a );42 push_area( L, a ); 54 43 } 55 44 … … 69 58 static int nlua_area_eq( lua_State* L ) 70 59 { 71 lua_pushboolean( L, nlua_to_area( L, 1 ) == nlua_to_area( L, 2 ) );60 lua_pushboolean( L, to_area( L, 1 ) == to_area( L, 2 ) ); 72 61 return 1; 73 62 } … … 75 64 static int nlua_area_get( lua_State* L ) 76 65 { 77 nv::rectangle r( nlua_to_area( L, 1 ) );78 nlua_push_coord( L, r.ul );79 nlua_push_coord( L, r.lr );66 nv::rectangle r( to_area( L, 1 ) ); 67 push_coord( L, r.ul ); 68 push_coord( L, r.lr ); 80 69 return 2; 81 70 } … … 83 72 static int nlua_area_clone( lua_State* L ) 84 73 { 85 nlua_push_area( L, *nlua_to_parea( L, 1 ) );74 push_area( L, *to_parea( L, 1 ) ); 86 75 return 1; 87 76 } … … 89 78 static int nlua_area_index( lua_State* L ) 90 79 { 91 nv::rectangle* a = nlua_to_parea( L, 1 );80 nv::rectangle* a = to_parea( L, 1 ); 92 81 std::size_t l; 93 82 const char* index = lua_tolstring( L, 2, &l ); 94 83 if ( l == 1 && index[0] == 'a' ) 95 84 { 96 nlua_push_coord( L, a->ul );85 push_coord( L, a->ul ); 97 86 } 98 87 else if ( l == 1 && index[0] == 'b' ) 99 88 { 100 nlua_push_coord( L, a->lr );89 push_coord( L, a->lr ); 101 90 } 102 91 else … … 111 100 static int nlua_area_newindex( lua_State* L ) 112 101 { 113 nv::rectangle* a = nlua_to_parea( L, 1 );102 nv::rectangle* a = to_parea( L, 1 ); 114 103 std::size_t l; 115 104 const char* index = lua_tolstring( L, 2, &l ); 116 nv::ivec2 value( nlua_to_coord( L, 3 ) );105 nv::ivec2 value( to_coord( L, 3 ) ); 117 106 if ( l == 1 && index[0] == 'a' ) 118 107 { … … 128 117 static int lua_area_coords_closure( lua_State* L ) 129 118 { 130 nv::rectangle* a( nlua_to_parea( L, lua_upvalueindex(1) ) );131 nv::ivec2* c( nlua_to_pcoord( L, lua_upvalueindex(2) ) );119 nv::rectangle* a( to_parea( L, lua_upvalueindex(1) ) ); 120 nv::ivec2* c( to_pcoord( L, lua_upvalueindex(2) ) ); 132 121 133 122 c->x++; … … 144 133 } 145 134 146 nlua_push_coord( L, *c );135 push_coord( L, *c ); 147 136 return 1; 148 137 } … … 150 139 static int nlua_area_coords( lua_State* L ) 151 140 { 152 nv::rectangle* a( nlua_to_parea( L, 1 ) );141 nv::rectangle* a( to_parea( L, 1 ) ); 153 142 nv::ivec2 c( a->ul ); 154 143 c.x--; 155 nlua_push_coord( L, c );144 push_coord( L, c ); 156 145 lua_pushcclosure( L, lua_area_coords_closure, 2 ); 157 146 return 1; … … 160 149 static int nlua_area_edges_closure( lua_State* L ) 161 150 { 162 nv::rectangle* a( nlua_to_parea( L, lua_upvalueindex(1) ) );163 nv::ivec2* c( nlua_to_pcoord( L, lua_upvalueindex(2) ) );151 nv::rectangle* a( to_parea( L, lua_upvalueindex(1) ) ); 152 nv::ivec2* c( to_pcoord( L, lua_upvalueindex(2) ) ); 164 153 165 154 c->x++; … … 178 167 179 168 180 nlua_push_coord( L, *c );169 push_coord( L, *c ); 181 170 return 1; 182 171 } … … 184 173 static int nlua_area_edges( lua_State* L ) 185 174 { 186 nv::rectangle* a( nlua_to_parea( L, 1 ) );175 nv::rectangle* a( to_parea( L, 1 ) ); 187 176 nv::ivec2 c( a->ul ); 188 177 c.x--; 189 nlua_push_coord( L, c );178 push_coord( L, c ); 190 179 lua_pushcclosure( L, nlua_area_edges_closure, 2 ); 191 180 return 1; … … 203 192 static int nlua_area_corners( lua_State* L ) 204 193 { 205 nv::rectangle* a = nlua_to_parea( L, 1 );194 nv::rectangle* a = to_parea( L, 1 ); 206 195 207 196 lua_createtable(L, 4, 0); 208 nlua_push_coord( L, a->ul );197 push_coord( L, a->ul ); 209 198 lua_rawseti( L, -2, 1 ); 210 nlua_push_coord( L, a->ur() );199 push_coord( L, a->ur() ); 211 200 lua_rawseti( L, -2, 2 ); 212 nlua_push_coord( L, a->ll() );201 push_coord( L, a->ll() ); 213 202 lua_rawseti( L, -2, 3 ); 214 nlua_push_coord( L, a->lr );203 push_coord( L, a->lr ); 215 204 lua_rawseti( L, -2, 4 ); 216 205 … … 222 211 static int nlua_area_shrink( lua_State* L ) 223 212 { 224 nv::rectangle* a = nlua_to_parea( L, 1 );213 nv::rectangle* a = to_parea( L, 1 ); 225 214 a->shrink( static_cast< int >( lua_tointeger( L, 2 ) ) ); 226 215 return 0; … … 229 218 static int nlua_area_shrinked( lua_State* L ) 230 219 { 231 nv::rectangle* a = nlua_to_parea( L, 1 );232 nlua_push_area( L, a->shrinked( static_cast< int >( lua_tointeger( L, 2 ) ) ) );220 nv::rectangle* a = to_parea( L, 1 ); 221 push_area( L, a->shrinked( static_cast< int >( lua_tointeger( L, 2 ) ) ) ); 233 222 return 1; 234 223 } … … 236 225 static int nlua_area_expand( lua_State* L ) 237 226 { 238 nv::rectangle* a = nlua_to_parea( L, 1 );227 nv::rectangle* a = to_parea( L, 1 ); 239 228 a->expand( static_cast< int >( lua_tointeger( L, 2 ) ) ); 240 229 return 0; … … 243 232 static int nlua_area_expanded( lua_State* L ) 244 233 { 245 nv::rectangle* a = nlua_to_parea( L, 1 );246 nlua_push_area( L, a->expanded( static_cast< int >( lua_tointeger( L, 2 ) ) ) );234 nv::rectangle* a = to_parea( L, 1 ); 235 push_area( L, a->expanded( static_cast< int >( lua_tointeger( L, 2 ) ) ) ); 247 236 return 1; 248 237 } … … 250 239 static int nlua_area_clamp( lua_State* L ) 251 240 { 252 nv::rectangle* a1 = nlua_to_parea( L, 1 );253 nv::rectangle* a2 = nlua_to_parea( L, 2 );241 nv::rectangle* a1 = to_parea( L, 1 ); 242 nv::rectangle* a2 = to_parea( L, 2 ); 254 243 a1->clamp_to( *a2 ); 255 244 return 0; … … 258 247 static int nlua_area_clamped( lua_State* L ) 259 248 { 260 nv::rectangle a1 = nlua_to_area( L, 1 );261 nv::rectangle* a2 = nlua_to_parea( L, 2 );249 nv::rectangle a1 = to_area( L, 1 ); 250 nv::rectangle* a2 = to_parea( L, 2 ); 262 251 a1.clamp_to( *a2 ); 263 nlua_push_area( L, a1 );252 push_area( L, a1 ); 264 253 return 1; 265 254 } … … 267 256 static int nlua_area_clamp_coord( lua_State* L ) 268 257 { 269 nv::rectangle* a = nlua_to_parea( L, 1 );270 nv::ivec2* c = nlua_to_pcoord( L, 2 );258 nv::rectangle* a = to_parea( L, 1 ); 259 nv::ivec2* c = to_pcoord( L, 2 ); 271 260 *c = glm::clamp( *c, a->ul, a->lr ); 272 261 return 0; … … 275 264 static int nlua_area_clamped_coord( lua_State* L ) 276 265 { 277 nv::rectangle* a = nlua_to_parea( L, 1 );278 nv::ivec2* c = nlua_to_pcoord( L, 2 );279 nlua_push_coord( L, glm::clamp( *c, a->ul, a->lr ) );266 nv::rectangle* a = to_parea( L, 1 ); 267 nv::ivec2* c = to_pcoord( L, 2 ); 268 push_coord( L, glm::clamp( *c, a->ul, a->lr ) ); 280 269 return 0; 281 270 } … … 283 272 static int nlua_area_fix( lua_State* L ) 284 273 { 285 nv::rectangle* a = nlua_to_parea( L, 1 );274 nv::rectangle* a = to_parea( L, 1 ); 286 275 if ( a->ul.x > a->lr.x ) a->ul.x = a->lr.x; 287 276 if ( a->ul.y > a->lr.y ) a->ul.y = a->lr.y; … … 291 280 static int nlua_area_proper( lua_State* L ) 292 281 { 293 nv::rectangle* a = nlua_to_parea( L, 1 );282 nv::rectangle* a = to_parea( L, 1 ); 294 283 lua_pushboolean( L, a->ul.x <= a->lr.x && a->ul.y <= a->lr.y ); 295 284 return 1; … … 298 287 static int nlua_area_dim( lua_State* L ) 299 288 { 300 nv::rectangle* a = nlua_to_parea( L, 1 );301 nlua_push_coord( L, a->ul - a->lr + nv::ivec2(1,1) );289 nv::rectangle* a = to_parea( L, 1 ); 290 push_coord( L, a->ul - a->lr + nv::ivec2(1,1) ); 302 291 return 1; 303 292 } … … 305 294 static int nlua_area_size( lua_State* L ) 306 295 { 307 nv::rectangle* a = nlua_to_parea( L, 1 );296 nv::rectangle* a = to_parea( L, 1 ); 308 297 lua_pushinteger( L, a->get_enclosed_area() ); 309 298 return 1; … … 312 301 static int nlua_area_contains( lua_State* L ) 313 302 { 314 lua_pushboolean( L, nlua_to_parea( L, 1 )->contains( nlua_to_coord( L, 2 ) ) );303 lua_pushboolean( L, to_parea( L, 1 )->contains( to_coord( L, 2 ) ) ); 315 304 return 1; 316 305 } … … 318 307 static int nlua_area_is_edge( lua_State* L ) 319 308 { 320 nv::rectangle a = nlua_to_area( L, 1 );321 nv::ivec2 c = nlua_to_coord( L, 2 );309 nv::rectangle a = to_area( L, 1 ); 310 nv::ivec2 c = to_coord( L, 2 ); 322 311 lua_pushboolean( L, a.contains( c ) && ( c.x == a.ul.x || c.x == a.lr.x || c.y == a.ul.y || c.y == a.lr.y ) ); 323 312 return 1; … … 326 315 static int nlua_area_around( lua_State* L ) 327 316 { 328 nv::ivec2 c = nlua_to_coord( L, 1 );317 nv::ivec2 c = to_coord( L, 1 ); 329 318 int amount = static_cast< int >( lua_tointeger( L, 1 ) ); 330 319 nv::ivec2 shift( amount, amount ); 331 nlua_push_area( L, nv::rectangle( c - shift, c + shift ) );320 push_area( L, nv::rectangle( c - shift, c + shift ) ); 332 321 return 1; 333 322 } … … 335 324 static int nlua_area_tostring( lua_State* L ) 336 325 { 337 nv::rectangle a = nlua_to_area( L, 1 );326 nv::rectangle a = to_area( L, 1 ); 338 327 std::string s = "("; 339 328 s += nv::to_string(a.ul.x); … … 351 340 static int nlua_area_random_edge_coord( lua_State* L ) 352 341 { 353 nv::rectangle area = nlua_to_area( L, 1 );342 nv::rectangle area = to_area( L, 1 ); 354 343 nv::ivec2 a = area.ul; 355 344 nv::ivec2 b = area.lr; … … 368 357 result = ( roll < ys ) ? nv::ivec2( a.x, a.y + roll + 1 ) : nv::ivec2( b.x, a.y + roll - ys + 1); 369 358 } 370 nlua_push_coord( L, result );359 push_coord( L, result ); 371 360 return 1; 372 361 } … … 374 363 static int nlua_area_random_inner_edge_coord( lua_State* L ) 375 364 { 376 nv::rectangle area = nlua_to_area( L, 1 );365 nv::rectangle area = to_area( L, 1 ); 377 366 nv::ivec2 a = area.ul; 378 367 nv::ivec2 b = area.lr; … … 391 380 result = ( roll < ys ) ? nv::ivec2( a.x, a.y + roll + 1 ) : nv::ivec2( b.x, a.y + roll - ys + 1); 392 381 } 393 nlua_push_coord( L, result );382 push_coord( L, result ); 394 383 return 1; 395 384 } … … 397 386 static int nlua_area_random_coord( lua_State* L ) 398 387 { 399 nv::rectangle area = nlua_to_area( L, 1 );400 nlua_push_coord( L, nv::random::get().range( area.ul, area.lr ) );388 nv::rectangle area = to_area( L, 1 ); 389 push_coord( L, nv::random::get().range( area.ul, area.lr ) ); 401 390 return 1; 402 391 } … … 404 393 static int nlua_area_random_subarea( lua_State* L ) 405 394 { 406 nv::rectangle area = nlua_to_area( L, 1 );407 nv::ivec2 dim = nlua_to_coord( L, 2 );395 nv::rectangle area = to_area( L, 1 ); 396 nv::ivec2 dim = to_coord( L, 2 ); 408 397 nv::ivec2 start = nv::random::get().range( area.ul, area.lr - dim ); 409 nlua_push_area( L, nv::rectangle( start, start + dim ) );398 push_area( L, nv::rectangle( start, start + dim ) ); 410 399 return 1; 411 400 } … … 466 455 }; 467 456 468 luaL_newmetatable( L, NLUA_AREA_METATABLE );457 luaL_newmetatable( L, nv::lua::detail::AREA_METATABLE ); 469 458 nlua_register( L, nlua_area_m, -1 ); 470 459 lua_createtable( L, 0, 0 ); … … 481 470 } 482 471 483 void n lua_register_area( lua_State* L )472 void nv::lua::register_area( lua_State* L ) 484 473 { 485 474 int stack = lua_gettop( L );
Note: See TracChangeset
for help on using the changeset viewer.