diff --git a/doc/en/scripting/ui.md b/doc/en/scripting/ui.md index 0df1ed72..4cac91b7 100644 --- a/doc/en/scripting/ui.md +++ b/doc/en/scripting/ui.md @@ -180,6 +180,7 @@ Here, *color* can be specified in the following ways: | data:clear() | clears the canvas | | data:clear(*color*) | fills the canvas with the specified RGBA color | | data:update() | applies changes to the canvas and uploads it to the GPU | +| data:set_data(data: table) | replaces pixel data (width * height * 4 numbers) | ## Inventory diff --git a/doc/ru/scripting/ui.md b/doc/ru/scripting/ui.md index f3a3c44f..137ff57b 100644 --- a/doc/ru/scripting/ui.md +++ b/doc/ru/scripting/ui.md @@ -172,15 +172,16 @@ document["worlds-panel"]:clear() - r: int, g: int, b: int - r: int, g: int, b: int, a: int -| Метод | Описание | -|----------------------------------------------------------|-----------------------------------------------------| -| data:at(x: int, y: int) | возвращает RGBA пиксель по указанным координатам | -| data:set(x: int, y: int, *цвет*) | изменяет RGBA пиксель по указанным координатам | -| data:line(x1: int, y1: int, x2: int, y2: int, *цвет*) | рисует линию с указанным RGBA цветом | -| data:blit(src: Canvas, dst_x: int, dst_y: int) | рисует src-холст на указанных координатах | -| data:clear() | очищает холст | -| data:clear(*цвет*) | заполняет холст указанным RGBA цветом | -| data:update() | применяет изменения и загружает холст в видеопамять | +| Метод | Описание | +|----------------------------------------------------------|------------------------------------------------------| +| data:at(x: int, y: int) | возвращает RGBA пиксель по указанным координатам | +| data:set(x: int, y: int, *цвет*) | изменяет RGBA пиксель по указанным координатам | +| data:line(x1: int, y1: int, x2: int, y2: int, *цвет*) | рисует линию с указанным RGBA цветом | +| data:blit(src: Canvas, dst_x: int, dst_y: int) | рисует src-холст на указанных координатах | +| data:clear() | очищает холст | +| data:clear(*цвет*) | заполняет холст указанным RGBA цветом | +| data:update() | применяет изменения и загружает холст в видеопамять | +| data:set_data(data: table) | заменяет данные пикселей (ширина * высота * 4 чисел) | ## Inventory (inventory) diff --git a/src/graphics/ui/elements/Canvas.hpp b/src/graphics/ui/elements/Canvas.hpp index ae1f02b0..adfb5e2a 100644 --- a/src/graphics/ui/elements/Canvas.hpp +++ b/src/graphics/ui/elements/Canvas.hpp @@ -26,4 +26,4 @@ namespace gui { std::shared_ptr<::Texture> mTexture; std::shared_ptr mData; }; -} \ No newline at end of file +} diff --git a/src/logic/scripting/lua/usertypes/lua_type_canvas.cpp b/src/logic/scripting/lua/usertypes/lua_type_canvas.cpp index f041c1ff..944f62a2 100644 --- a/src/logic/scripting/lua/usertypes/lua_type_canvas.cpp +++ b/src/logic/scripting/lua/usertypes/lua_type_canvas.cpp @@ -132,6 +132,25 @@ static int l_blit(State* L) { return 0; } +static int l_set_data(State* L) { + auto& canvas = require_canvas(L, 1); + auto& image = canvas.data(); + auto data = image.getData(); + int len = objlen(L, 2); + if (len < image.getDataSize()) { + throw std::runtime_error( + "data size mismatch expected " + + std::to_string(image.getDataSize()) + ", got " + std::to_string(len) + ); + } + for (size_t i = 0; i < len; i++) { + rawgeti(L, i + 1, 2); + data[i] = tointeger(L, -1); + pop(L); + } + return 0; +} + static int l_update(State* L) { if (auto canvas = touserdata(L, 1)) { if (canvas->hasTexture()) { @@ -148,6 +167,7 @@ static std::unordered_map methods { {"blit", lua::wrap}, {"clear", lua::wrap}, {"update", lua::wrap}, + {"set_data", lua::wrap}, }; static int l_meta_index(State* L) {