Expose assets lua callbacks to patch contexts

This commit is contained in:
Kae 2024-04-08 16:12:48 +10:00
parent 9ef38ce076
commit 4a3ffadecb
6 changed files with 20 additions and 15 deletions

View File

@ -17,7 +17,6 @@ end
function patch(config)
local layout = config.paneLayout
layout.panefeature.positionLocked = false
-- Create the camera pan speed widgets
shift(clone(layout, "zoomLabel", "cameraSpeedLabel"), 100).value = "CAMERA PAN SPEED"
shift(clone(layout, "zoomSlider", "cameraSpeedSlider"), 100)
@ -26,7 +25,6 @@ function patch(config)
config.cameraSpeedList = jarray()
for i = 1, 50 do config.cameraSpeedList[i] = i / 10 end
for i = 1, 32 do config.zoomList[i] = i end
-- Create anti-aliasing toggle
shift(clone(layout, "multiTextureLabel", "antiAliasingLabel"), 98).value = "SUPER-SAMPLED AA"
shift(clone(layout, "multiTextureCheckbox", "antiAliasingCheckbox"), 99)

View File

@ -161,7 +161,7 @@ public:
virtual void render(RenderPrimitive primitive) = 0;
virtual void renderBuffer(RenderBufferPtr const& renderBuffer, Mat3F const& transformation = Mat3F::identity()) = 0;
virtual void flush() = 0;
virtual void flush(Mat3F const& transformation = Mat3F::identity()) = 0;
};
}

View File

@ -482,8 +482,8 @@ void OpenGlRenderer::renderBuffer(RenderBufferPtr const& renderBuffer, Mat3F con
renderGlBuffer(*convert<GlRenderBuffer>(renderBuffer.get()), transformation);
}
void OpenGlRenderer::flush() {
flushImmediatePrimitives();
void OpenGlRenderer::flush(Mat3F const& transformation) {
flushImmediatePrimitives(transformation);
}
void OpenGlRenderer::setScreenSize(Vec2U screenSize) {
@ -889,13 +889,13 @@ void OpenGlRenderer::uploadTextureImage(PixelFormat pixelFormat, Vec2U size, uin
glTexImage2D(GL_TEXTURE_2D, 0, internalFormat.value(format), size[0], size[1], 0, format, type, data);
}
void OpenGlRenderer::flushImmediatePrimitives() {
void OpenGlRenderer::flushImmediatePrimitives(Mat3F const& transformation) {
if (m_immediatePrimitives.empty())
return;
m_immediateRenderBuffer->set(m_immediatePrimitives);
m_immediatePrimitives.resize(0);
renderGlBuffer(*m_immediateRenderBuffer, Mat3F::identity());
renderGlBuffer(*m_immediateRenderBuffer, transformation);
}
auto OpenGlRenderer::createGlTexture(ImageView const& image, TextureAddressing addressing, TextureFiltering filtering)

View File

@ -42,7 +42,7 @@ public:
void render(RenderPrimitive primitive) override;
void renderBuffer(RenderBufferPtr const& renderBuffer, Mat3F const& transformation) override;
void flush() override;
void flush(Mat3F const& transformation) override;
void setScreenSize(Vec2U screenSize);
@ -205,7 +205,7 @@ private:
shared_ptr<GlRenderBuffer> createGlRenderBuffer();
void flushImmediatePrimitives();
void flushImmediatePrimitives(Mat3F const& transformation = Mat3F::identity());
void renderGlBuffer(GlRenderBuffer const& renderBuffer, Mat3F const& transformation);

View File

@ -118,8 +118,8 @@ Assets::Assets(Settings settings, StringList assetSources) {
table.set(p.first, luaEngine->createWrappedFunction(p.second));
luaEngine->setGlobal(name, table);
};
pushGlobalContext("sb", LuaBindings::makeUtilityCallbacks());
auto decorateLuaContext = [this](LuaContext& context, MemoryAssetSourcePtr newFiles) {
auto makeBaseAssetCallbacks = [this]() {
LuaCallbacks callbacks;
callbacks.registerCallbackWithSignature<StringSet, String>("byExtension", bind(&Assets::scanExtension, this, _1));
callbacks.registerCallbackWithSignature<Json, String>("json", bind(&Assets::json, this, _1));
@ -132,7 +132,7 @@ Assets::Assets(Settings settings, StringList assetSources) {
callbacks.registerCallback("image", [this](String const& path) -> Image {
auto assetImage = image(path);
if (assetImage->bytesPerPixel() == 3)
return assetImage->convert(PixelFormat::RGBA32);
return assetImage->convert(PixelFormat::RGBA32);
else
return *assetImage;
});
@ -140,7 +140,14 @@ Assets::Assets(Settings settings, StringList assetSources) {
callbacks.registerCallback("scan", [this](Maybe<String> const& a, Maybe<String> const& b) -> StringList {
return b ? scan(a.value(), *b) : scan(a.value());
});
return callbacks;
};
pushGlobalContext("sb", LuaBindings::makeUtilityCallbacks());
pushGlobalContext("assets", makeBaseAssetCallbacks());
auto decorateLuaContext = [&](LuaContext& context, MemoryAssetSourcePtr newFiles) {
auto callbacks = makeBaseAssetCallbacks();
if (newFiles) {
callbacks.registerCallback("add", [&newFiles](LuaEngine& engine, String const& path, LuaValue const& data) {
ByteArray bytes;
@ -872,7 +879,7 @@ ImageConstPtr Assets::readImage(String const& path) const {
image = make_shared<Image>(Image::readPng(p->source->open(p->sourceName)));
if (!p->patchSources.empty()) {
MutexLocker luaLocker(m_luaMutex);
RecursiveMutexLocker luaLocker(m_luaMutex);
LuaEngine* luaEngine = as<LuaEngine>(m_luaEngine.get());
LuaValue result = luaEngine->createUserData(*image);
luaLocker.unlock();
@ -953,7 +960,7 @@ Json Assets::readJson(String const& path) const {
auto& patchSource = pair.second;
auto patchStream = patchSource->read(patchPath);
if (patchPath.endsWith(".lua")) {
MutexLocker luaLocker(m_luaMutex);
RecursiveMutexLocker luaLocker(m_luaMutex);
// Kae: i don't like that lock. perhaps have a LuaEngine and patch context cache per worker thread later on?
LuaContextPtr& context = m_patchContexts[patchPath];
if (!context) {

View File

@ -320,7 +320,7 @@ private:
// Lua
RefPtr<RefCounter> m_luaEngine; // dumb but to avoid including Lua.hpp in here...
mutable StringMap<LuaContextPtr> m_patchContexts;
mutable Mutex m_luaMutex;
mutable RecursiveMutex m_luaMutex;
// Paths of all used asset sources, in load order.
StringList m_assetSources;