mirror of
https://github.com/aseprite/aseprite.git
synced 2025-01-15 19:52:05 +00:00
[lua] Add test about saving/loading/modifying tilemap w/flags
Something interesting is that Image:drawPixel() must ask for a rehash to the tileset when the tile is modified, maybe we can find a better way to handle this in the future.
This commit is contained in:
parent
b43fbe2249
commit
d3a8a10517
@ -178,7 +178,7 @@ namespace app {
|
|||||||
void push_tile(lua_State* L, const doc::Tileset* tileset, doc::tile_index ti);
|
void push_tile(lua_State* L, const doc::Tileset* tileset, doc::tile_index ti);
|
||||||
void push_tile_properties(lua_State* L, const doc::Tileset* tileset, doc::tile_index ti, const std::string& extID);
|
void push_tile_properties(lua_State* L, const doc::Tileset* tileset, doc::tile_index ti, const std::string& extID);
|
||||||
void push_tileset(lua_State* L, const doc::Tileset* tileset);
|
void push_tileset(lua_State* L, const doc::Tileset* tileset);
|
||||||
void push_tileset_image(lua_State* L, doc::Tileset* tileset, doc::Image* image);
|
void push_tileset_image(lua_State* L, doc::Tileset* tileset, doc::tile_index ti);
|
||||||
void push_tilesets(lua_State* L, doc::Tilesets* tilesets);
|
void push_tilesets(lua_State* L, doc::Tilesets* tilesets);
|
||||||
void push_tool(lua_State* L, app::tools::Tool* tool);
|
void push_tool(lua_State* L, app::tools::Tool* tool);
|
||||||
void push_version(lua_State* L, const base::Version& ver);
|
void push_version(lua_State* L, const base::Version& ver);
|
||||||
|
@ -51,6 +51,7 @@ struct ImageObj {
|
|||||||
doc::ObjectId imageId = 0;
|
doc::ObjectId imageId = 0;
|
||||||
doc::ObjectId celId = 0;
|
doc::ObjectId celId = 0;
|
||||||
doc::ObjectId tilesetId = 0;
|
doc::ObjectId tilesetId = 0;
|
||||||
|
doc::tile_index ti = 0;
|
||||||
ImageObj(doc::Image* image)
|
ImageObj(doc::Image* image)
|
||||||
: imageId(image->id()) {
|
: imageId(image->id()) {
|
||||||
}
|
}
|
||||||
@ -58,9 +59,12 @@ struct ImageObj {
|
|||||||
: imageId(cel->image()->id())
|
: imageId(cel->image()->id())
|
||||||
, celId(cel->id()) {
|
, celId(cel->id()) {
|
||||||
}
|
}
|
||||||
ImageObj(doc::Tileset* tileset, doc::Image* image)
|
ImageObj(doc::Tileset* tileset,
|
||||||
|
doc::tile_index ti,
|
||||||
|
doc::Image* image)
|
||||||
: imageId(image->id())
|
: imageId(image->id())
|
||||||
, tilesetId(tileset->id()) {
|
, tilesetId(tileset->id())
|
||||||
|
, ti(ti) {
|
||||||
}
|
}
|
||||||
ImageObj(const ImageObj&) = delete;
|
ImageObj(const ImageObj&) = delete;
|
||||||
ImageObj& operator=(const ImageObj&) = delete;
|
ImageObj& operator=(const ImageObj&) = delete;
|
||||||
@ -264,6 +268,14 @@ int Image_drawPixel(lua_State* L)
|
|||||||
else
|
else
|
||||||
color = convert_args_into_pixel_color(L, 4, img->pixelFormat());
|
color = convert_args_into_pixel_color(L, 4, img->pixelFormat());
|
||||||
doc::put_pixel(img, x, y, color);
|
doc::put_pixel(img, x, y, color);
|
||||||
|
|
||||||
|
// Rehash tileset
|
||||||
|
if (obj->tilesetId) {
|
||||||
|
if (doc::Tileset* ts = obj->tileset(L)) {
|
||||||
|
ts->incrementVersion();
|
||||||
|
ts->notifyTileContentChange(obj->ti);
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,9 +791,13 @@ void push_image(lua_State* L, doc::Image* image)
|
|||||||
push_new<ImageObj>(L, image);
|
push_new<ImageObj>(L, image);
|
||||||
}
|
}
|
||||||
|
|
||||||
void push_tileset_image(lua_State* L, doc::Tileset* tileset, doc::Image* image)
|
void push_tileset_image(lua_State* L, doc::Tileset* tileset, doc::tile_index ti)
|
||||||
{
|
{
|
||||||
push_new<ImageObj>(L, tileset, image);
|
doc::ImageRef image = tileset->get(ti);
|
||||||
|
if (image)
|
||||||
|
push_new<ImageObj>(L, tileset, ti, image.get());
|
||||||
|
else
|
||||||
|
lua_pushnil(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
doc::Image* may_get_image_from_arg(lua_State* L, int index)
|
doc::Image* may_get_image_from_arg(lua_State* L, int index)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// Aseprite
|
// Aseprite
|
||||||
// Copyright (C) 2018-2019 Igara Studio S.A.
|
// Copyright (C) 2018-2023 Igara Studio S.A.
|
||||||
// Copyright (C) 2018 David Capello
|
// Copyright (C) 2018 David Capello
|
||||||
//
|
//
|
||||||
// This program is distributed under the terms of
|
// This program is distributed under the terms of
|
||||||
@ -102,6 +102,12 @@ inline void setfield_integer(lua_State* L, const char* key, const T& value) {
|
|||||||
lua_setfield(L, -2, key);
|
lua_setfield(L, -2, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline void setfield_uinteger(lua_State* L, const char* key, const T& value) {
|
||||||
|
lua_pushinteger(L, value);
|
||||||
|
lua_setfield(L, -2, key);
|
||||||
|
}
|
||||||
|
|
||||||
#define REG_CLASS(L, T) { \
|
#define REG_CLASS(L, T) { \
|
||||||
luaL_newmetatable(L, get_mtname<T>()); \
|
luaL_newmetatable(L, get_mtname<T>()); \
|
||||||
lua_getglobal(L, "__generic_mt_index"); \
|
lua_getglobal(L, "__generic_mt_index"); \
|
||||||
|
@ -116,6 +116,12 @@ void register_app_pixel_color_object(lua_State* L)
|
|||||||
lua_pushvalue(L, -2); // Copy table
|
lua_pushvalue(L, -2); // Copy table
|
||||||
lua_rawset(L, -4);
|
lua_rawset(L, -4);
|
||||||
luaL_setfuncs(L, PixelColor_methods, 0);
|
luaL_setfuncs(L, PixelColor_methods, 0);
|
||||||
|
|
||||||
|
// Masks for tile flags
|
||||||
|
setfield_uinteger(L, "TILE_XFLIP", doc::tile_f_xflip);
|
||||||
|
setfield_uinteger(L, "TILE_YFLIP", doc::tile_f_yflip);
|
||||||
|
setfield_uinteger(L, "TILE_DFLIP", doc::tile_f_dflip);
|
||||||
|
|
||||||
lua_pop(L, 2); // Pop table & app global
|
lua_pop(L, 2); // Pop table & app global
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,11 +48,7 @@ int Tile_get_image(lua_State* L)
|
|||||||
if (!ts)
|
if (!ts)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ImageRef image = ts->get(tile->ti);
|
push_tileset_image(L, ts, tile->ti);
|
||||||
if (image)
|
|
||||||
push_tileset_image(L, ts, image.get());
|
|
||||||
else
|
|
||||||
lua_pushnil(L);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,12 +41,8 @@ int Tileset_len(lua_State* L)
|
|||||||
int Tileset_getTile(lua_State* L)
|
int Tileset_getTile(lua_State* L)
|
||||||
{
|
{
|
||||||
auto tileset = get_docobj<Tileset>(L, 1);
|
auto tileset = get_docobj<Tileset>(L, 1);
|
||||||
tile_index i = lua_tointeger(L, 2);
|
tile_index ti = lua_tointeger(L, 2);
|
||||||
ImageRef image = tileset->get(i);
|
push_tileset_image(L, tileset, ti);
|
||||||
if (image)
|
|
||||||
push_tileset_image(L, tileset, image.get());
|
|
||||||
else
|
|
||||||
lua_pushnil(L);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1226,4 +1226,103 @@ do
|
|||||||
assert(spr.tilesets[1] == tilemapLay1.tileset)
|
assert(spr.tilesets[1] == tilemapLay1.tileset)
|
||||||
assert(spr.tilesets[2] == tilemapLay2.tileset)
|
assert(spr.tilesets[2] == tilemapLay2.tileset)
|
||||||
assert(spr.tilesets[3] == tilemapLay3.tileset)
|
assert(spr.tilesets[3] == tilemapLay3.tileset)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
-- Test tilemaps with flags (flips)
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
do
|
||||||
|
local spr = Sprite(8, 8, ColorMode.INDEXED)
|
||||||
|
|
||||||
|
-- Create a new tilemap (delete the default regular layer)
|
||||||
|
app.command.NewLayer{ tilemap=true, gridBounds=Rectangle{ 0, 0, 2, 2 } }
|
||||||
|
local mapLay = app.layer
|
||||||
|
spr:deleteLayer(spr.layers[1])
|
||||||
|
assert(#mapLay.cels == 0)
|
||||||
|
|
||||||
|
-- Set a palette just for testing/preview the result
|
||||||
|
spr:setPalette(Palette{ fromResource="Teletext" })
|
||||||
|
|
||||||
|
-- Create one tile with these pixels (indexes):
|
||||||
|
-- 12
|
||||||
|
-- 34
|
||||||
|
local tile = spr:newTile(mapLay.tileset, 1)
|
||||||
|
array_to_pixels({ 1, 2,
|
||||||
|
3, 4 }, tile.image)
|
||||||
|
|
||||||
|
-- Fill the tilemap with this only tile
|
||||||
|
app.useTool{ tool='paint_bucket', color=1, layer=mapLay,
|
||||||
|
tilemapMode=TilemapMode.TILES,
|
||||||
|
points={ Point(0, 0) }}
|
||||||
|
|
||||||
|
assert(#mapLay.cels == 1)
|
||||||
|
local map = mapLay.cels[1].image
|
||||||
|
assert(map.width == 4)
|
||||||
|
assert(map.height == 4)
|
||||||
|
|
||||||
|
-- Constants
|
||||||
|
local x = app.pixelColor.TILE_XFLIP
|
||||||
|
local y = app.pixelColor.TILE_YFLIP
|
||||||
|
local d = app.pixelColor.TILE_DFLIP
|
||||||
|
|
||||||
|
-- Normal (tile without flags)
|
||||||
|
-- 12
|
||||||
|
-- 34
|
||||||
|
map:drawPixel(0, 0, 1)
|
||||||
|
|
||||||
|
-- Flip X
|
||||||
|
-- 21
|
||||||
|
-- 43
|
||||||
|
map:drawPixel(1, 0, 1|x)
|
||||||
|
|
||||||
|
-- Flip Y
|
||||||
|
-- 34
|
||||||
|
-- 12
|
||||||
|
map:drawPixel(0, 1, 1|y)
|
||||||
|
|
||||||
|
-- Flip X+Y
|
||||||
|
-- 43
|
||||||
|
-- 21
|
||||||
|
map:drawPixel(1, 1, 1|x|y)
|
||||||
|
|
||||||
|
-- Flip D
|
||||||
|
-- 31
|
||||||
|
-- 42
|
||||||
|
map:drawPixel(2, 2, 1|d)
|
||||||
|
|
||||||
|
-- Flip X+D
|
||||||
|
-- 42
|
||||||
|
-- 31
|
||||||
|
map:drawPixel(3, 2, 1|x|d)
|
||||||
|
|
||||||
|
-- Flip Y+D
|
||||||
|
-- 13
|
||||||
|
-- 24
|
||||||
|
map:drawPixel(2, 3, 1|y|d)
|
||||||
|
|
||||||
|
-- Flip X+Y+D
|
||||||
|
-- 24
|
||||||
|
-- 13
|
||||||
|
map:drawPixel(3, 3, 1|x|y|d)
|
||||||
|
|
||||||
|
-- Clear areas
|
||||||
|
app.useTool{ tool='filled_rectangle', color=0, layer=mapLay,
|
||||||
|
tilemapMode=TilemapMode.TILES,
|
||||||
|
points={ Point(0, 4), Point(3, 7) }}
|
||||||
|
app.useTool{ tool='filled_rectangle', color=0, layer=mapLay,
|
||||||
|
tilemapMode=TilemapMode.TILES,
|
||||||
|
points={ Point(4, 0), Point(7, 3) }}
|
||||||
|
|
||||||
|
-- Save, load, and test if the tilemap were saved correctly with the
|
||||||
|
-- given flags
|
||||||
|
spr:saveAs('_test_tile_flags.aseprite')
|
||||||
|
spr:close()
|
||||||
|
|
||||||
|
local spr2 = app.open('_test_tile_flags.aseprite')
|
||||||
|
local map2 = spr2.layers[1].cels[1].image
|
||||||
|
expect_img(map2, { 1, (1|x), 0, 0,
|
||||||
|
1|y, (1|x|y), 0, 0,
|
||||||
|
0, 0, 1|d, (1|x|d),
|
||||||
|
0, 0, 1|y|d, (1|x|y|d) })
|
||||||
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user