Merge pull request #486 from MihailRis/canvas_shares_texture
add canvas:create_texture(...)
This commit is contained in:
commit
63f508d430
@ -184,6 +184,7 @@ Here, *color* can be specified in the following ways:
|
|||||||
| data:clear(*color*) | fills the canvas with the specified RGBA color |
|
| 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:update() | applies changes to the canvas and uploads it to the GPU |
|
||||||
| data:set_data(data: table<int>) | replaces pixel data (width * height * 4 numbers) |
|
| data:set_data(data: table<int>) | replaces pixel data (width * height * 4 numbers) |
|
||||||
|
| data:create_texture(name: str) | creates and shares texture to renderer |
|
||||||
|
|
||||||
|
|
||||||
## Inventory
|
## Inventory
|
||||||
|
|||||||
@ -185,6 +185,7 @@ document["worlds-panel"]:clear()
|
|||||||
| data:clear(*цвет*) | заполняет холст указанным RGBA цветом |
|
| data:clear(*цвет*) | заполняет холст указанным RGBA цветом |
|
||||||
| data:update() | применяет изменения и загружает холст в видеопамять |
|
| data:update() | применяет изменения и загружает холст в видеопамять |
|
||||||
| data:set_data(data: table<int>) | заменяет данные пикселей (ширина * высота * 4 чисел) |
|
| data:set_data(data: table<int>) | заменяет данные пикселей (ширина * высота * 4 чисел) |
|
||||||
|
| data:create_texture(name: str) | создаёт и делится текстурой с рендерером |
|
||||||
|
|
||||||
## Inventory (inventory)
|
## Inventory (inventory)
|
||||||
|
|
||||||
|
|||||||
@ -72,6 +72,11 @@ public:
|
|||||||
assets[typeid(T)][name].reset(asset.release());
|
assets[typeid(T)][name].reset(asset.release());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void store(std::shared_ptr<T> asset, const std::string& name) {
|
||||||
|
assets[typeid(T)][name] = std::move(asset);
|
||||||
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
T* get(const std::string& name) const {
|
T* get(const std::string& name) const {
|
||||||
const auto& mapIter = assets.find(typeid(T));
|
const auto& mapIter = assets.find(typeid(T));
|
||||||
|
|||||||
@ -165,7 +165,7 @@ assetload::postfunc assetload::font(
|
|||||||
textures.emplace_back(nullptr);
|
textures.emplace_back(nullptr);
|
||||||
} else {
|
} else {
|
||||||
auto texture = Texture::from(page.get());
|
auto texture = Texture::from(page.get());
|
||||||
texture->setMipMapping(false);
|
texture->setMipMapping(false, true);
|
||||||
textures.emplace_back(std::move(texture));
|
textures.emplace_back(std::move(texture));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -71,14 +71,20 @@ void GLTexture::setNearestFilter() {
|
|||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLTexture::setMipMapping(bool flag) {
|
void GLTexture::setMipMapping(bool flag, bool pixelated) {
|
||||||
bind();
|
bind();
|
||||||
if (flag) {
|
if (flag) {
|
||||||
glTexParameteri(
|
glTexParameteri(
|
||||||
GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST
|
GL_TEXTURE_2D,
|
||||||
|
GL_TEXTURE_MIN_FILTER,
|
||||||
|
pixelated ? GL_NEAREST : GL_LINEAR_MIPMAP_NEAREST
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(
|
||||||
|
GL_TEXTURE_2D,
|
||||||
|
GL_TEXTURE_MIN_FILTER,
|
||||||
|
pixelated ? GL_NEAREST : GL_LINEAR
|
||||||
|
);
|
||||||
}
|
}
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,7 +18,7 @@ public:
|
|||||||
|
|
||||||
virtual void reload(const ImageData& image) override;
|
virtual void reload(const ImageData& image) override;
|
||||||
|
|
||||||
virtual void setMipMapping(bool flag) override;
|
virtual void setMipMapping(bool flag, bool pixelated) override;
|
||||||
|
|
||||||
virtual std::unique_ptr<ImageData> readData() override;
|
virtual std::unique_ptr<ImageData> readData() override;
|
||||||
virtual uint getId() const override;
|
virtual uint getId() const override;
|
||||||
|
|||||||
@ -34,7 +34,7 @@ public:
|
|||||||
|
|
||||||
virtual uint getId() const = 0;
|
virtual uint getId() const = 0;
|
||||||
|
|
||||||
virtual void setMipMapping(bool flag) = 0;
|
virtual void setMipMapping(bool flag, bool pixelated) = 0;
|
||||||
|
|
||||||
static std::unique_ptr<Texture> from(const ImageData* image);
|
static std::unique_ptr<Texture> from(const ImageData* image);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -114,7 +114,7 @@ void PrecipitationRenderer::render(
|
|||||||
|
|
||||||
batch->begin();
|
batch->begin();
|
||||||
auto& texture = assets.require<Texture>(weather.fall.texture);
|
auto& texture = assets.require<Texture>(weather.fall.texture);
|
||||||
texture.setMipMapping(false);
|
texture.setMipMapping(false, true);
|
||||||
batch->setTexture(&texture, {});
|
batch->setTexture(&texture, {});
|
||||||
|
|
||||||
const struct {
|
const struct {
|
||||||
|
|||||||
@ -118,6 +118,12 @@ namespace lua {
|
|||||||
return mTexture != nullptr;
|
return mTexture != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto shareTexture() const {
|
||||||
|
return mTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
void createTexture();
|
||||||
|
|
||||||
static int createMetatable(lua::State*);
|
static int createMetatable(lua::State*);
|
||||||
inline static std::string TYPENAME = "Canvas";
|
inline static std::string TYPENAME = "Canvas";
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -4,6 +4,8 @@
|
|||||||
#include "graphics/core/Texture.hpp"
|
#include "graphics/core/Texture.hpp"
|
||||||
#include "logic/scripting/lua/lua_custom_types.hpp"
|
#include "logic/scripting/lua/lua_custom_types.hpp"
|
||||||
#include "logic/scripting/lua/lua_util.hpp"
|
#include "logic/scripting/lua/lua_util.hpp"
|
||||||
|
#include "engine/Engine.hpp"
|
||||||
|
#include "assets/Assets.hpp"
|
||||||
|
|
||||||
using namespace lua;
|
using namespace lua;
|
||||||
|
|
||||||
@ -13,6 +15,11 @@ LuaCanvas::LuaCanvas(
|
|||||||
: mTexture(std::move(inTexture)), mData(std::move(inData)) {
|
: mTexture(std::move(inTexture)), mData(std::move(inData)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LuaCanvas::createTexture() {
|
||||||
|
mTexture = Texture::from(mData.get());
|
||||||
|
mTexture->setMipMapping(false, true);
|
||||||
|
}
|
||||||
|
|
||||||
union RGBA {
|
union RGBA {
|
||||||
struct {
|
struct {
|
||||||
uint8_t r, g, b, a;
|
uint8_t r, g, b, a;
|
||||||
@ -166,6 +173,19 @@ static int l_update(State* L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int l_create_texture(State* L) {
|
||||||
|
if (auto canvas = touserdata<LuaCanvas>(L, 1)) {
|
||||||
|
if (!canvas->hasTexture()) {
|
||||||
|
canvas->createTexture();
|
||||||
|
}
|
||||||
|
if (canvas->hasTexture()) {
|
||||||
|
std::string name = require_string(L, 2);
|
||||||
|
scripting::engine->getAssets()->store(canvas->shareTexture(), name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static std::unordered_map<std::string, lua_CFunction> methods {
|
static std::unordered_map<std::string, lua_CFunction> methods {
|
||||||
{"at", lua::wrap<l_at>},
|
{"at", lua::wrap<l_at>},
|
||||||
{"set", lua::wrap<l_set>},
|
{"set", lua::wrap<l_set>},
|
||||||
@ -173,6 +193,7 @@ static std::unordered_map<std::string, lua_CFunction> methods {
|
|||||||
{"blit", lua::wrap<l_blit>},
|
{"blit", lua::wrap<l_blit>},
|
||||||
{"clear", lua::wrap<l_clear>},
|
{"clear", lua::wrap<l_clear>},
|
||||||
{"update", lua::wrap<l_update>},
|
{"update", lua::wrap<l_update>},
|
||||||
|
{"create_texture", lua::wrap<l_create_texture>},
|
||||||
{"_set_data", lua::wrap<l_set_data>},
|
{"_set_data", lua::wrap<l_set_data>},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user