From 4a3ffadecba57e64ebd8f6f6c4d15744c38e52b9 Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Mon, 8 Apr 2024 16:12:48 +1000 Subject: [PATCH] Expose assets lua callbacks to patch contexts --- .../windowconfig/graphicsmenu.config.patch.lua | 2 -- source/application/StarRenderer.hpp | 2 +- source/application/StarRenderer_opengl.cpp | 8 ++++---- source/application/StarRenderer_opengl.hpp | 4 ++-- source/base/StarAssets.cpp | 17 ++++++++++++----- source/base/StarAssets.hpp | 2 +- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/assets/opensb/interface/windowconfig/graphicsmenu.config.patch.lua b/assets/opensb/interface/windowconfig/graphicsmenu.config.patch.lua index ab154a4..7e9081a 100644 --- a/assets/opensb/interface/windowconfig/graphicsmenu.config.patch.lua +++ b/assets/opensb/interface/windowconfig/graphicsmenu.config.patch.lua @@ -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) diff --git a/source/application/StarRenderer.hpp b/source/application/StarRenderer.hpp index a926df0..2a156f7 100644 --- a/source/application/StarRenderer.hpp +++ b/source/application/StarRenderer.hpp @@ -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; }; } diff --git a/source/application/StarRenderer_opengl.cpp b/source/application/StarRenderer_opengl.cpp index c816049..d8b26e8 100644 --- a/source/application/StarRenderer_opengl.cpp +++ b/source/application/StarRenderer_opengl.cpp @@ -482,8 +482,8 @@ void OpenGlRenderer::renderBuffer(RenderBufferPtr const& renderBuffer, Mat3F con renderGlBuffer(*convert(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) diff --git a/source/application/StarRenderer_opengl.hpp b/source/application/StarRenderer_opengl.hpp index 563ac96..61c67c9 100644 --- a/source/application/StarRenderer_opengl.hpp +++ b/source/application/StarRenderer_opengl.hpp @@ -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 createGlRenderBuffer(); - void flushImmediatePrimitives(); + void flushImmediatePrimitives(Mat3F const& transformation = Mat3F::identity()); void renderGlBuffer(GlRenderBuffer const& renderBuffer, Mat3F const& transformation); diff --git a/source/base/StarAssets.cpp b/source/base/StarAssets.cpp index 7c1a67b..b334b31 100644 --- a/source/base/StarAssets.cpp +++ b/source/base/StarAssets.cpp @@ -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("byExtension", bind(&Assets::scanExtension, this, _1)); callbacks.registerCallbackWithSignature("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 const& a, Maybe 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::readPng(p->source->open(p->sourceName))); if (!p->patchSources.empty()) { - MutexLocker luaLocker(m_luaMutex); + RecursiveMutexLocker luaLocker(m_luaMutex); LuaEngine* luaEngine = as(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) { diff --git a/source/base/StarAssets.hpp b/source/base/StarAssets.hpp index 952e024..54cbb2f 100644 --- a/source/base/StarAssets.hpp +++ b/source/base/StarAssets.hpp @@ -320,7 +320,7 @@ private: // Lua RefPtr m_luaEngine; // dumb but to avoid including Lua.hpp in here... mutable StringMap m_patchContexts; - mutable Mutex m_luaMutex; + mutable RecursiveMutex m_luaMutex; // Paths of all used asset sources, in load order. StringList m_assetSources;