From 611df32bdb02e80feecba9e0084a9fa723913c0d Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Thu, 20 Feb 2025 23:38:27 -0600 Subject: [PATCH] Squashed 'deps/nostalgia/' changes from 26fc5565..d0a32e24 d0a32e24 [ox/std] Add Vector::remove 03d4a573 [nostalgia,studio] Add ability to navigate from tile sheet to palette color a2e41e65 Merge commit '4e94c925686cdda4b1ac777045dd7a17c7dc0329' 40a7caff [ox/std] Make bounds checking its own option enable-able in release builds git-subtree-dir: deps/nostalgia git-subtree-split: d0a32e247eb9f5f3847c5d03708b455ee698ea96 --- deps/ox/src/ox/std/array.hpp | 4 ++-- deps/ox/src/ox/std/defines.hpp | 6 ++++++ deps/ox/src/ox/std/error.hpp | 13 ++++++++++++ deps/ox/src/ox/std/iterator.hpp | 6 +++--- deps/ox/src/ox/std/span.hpp | 8 +++---- deps/ox/src/ox/std/vector.hpp | 17 +++++++++++++-- .../paletteeditor/paletteeditor-imgui.cpp | 21 +++++++++++++++++++ .../paletteeditor/paletteeditor-imgui.hpp | 2 ++ .../tilesheeteditor/tilesheeteditor-imgui.cpp | 6 +++++- src/olympic/studio/applib/src/studioapp.cpp | 10 +++++++++ src/olympic/studio/applib/src/studioapp.hpp | 2 ++ .../studio/modlib/include/studio/context.hpp | 2 ++ .../studio/modlib/include/studio/editor.hpp | 2 ++ src/olympic/studio/modlib/src/editor.cpp | 2 ++ 14 files changed, 89 insertions(+), 12 deletions(-) diff --git a/deps/ox/src/ox/std/array.hpp b/deps/ox/src/ox/std/array.hpp index 32281de..7a212f0 100644 --- a/deps/ox/src/ox/std/array.hpp +++ b/deps/ox/src/ox/std/array.hpp @@ -181,13 +181,13 @@ constexpr Array &Array::operator=(Array &&other) noe template constexpr T &Array::operator[](std::size_t i) noexcept { - ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Array access overflow"); + boundsCheck(__FILE__, __LINE__, i, size(), "Array access overflow"); return m_items[i]; } template constexpr const T &Array::operator[](std::size_t i) const noexcept { - ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Array access overflow"); + boundsCheck(__FILE__, __LINE__, i, size(), "Array access overflow"); return m_items[i]; } diff --git a/deps/ox/src/ox/std/defines.hpp b/deps/ox/src/ox/std/defines.hpp index 0c274a7..63d75b0 100644 --- a/deps/ox/src/ox/std/defines.hpp +++ b/deps/ox/src/ox/std/defines.hpp @@ -41,6 +41,12 @@ constexpr auto Debug = true; constexpr auto Debug = false; #endif +#if defined(OX_CHECK_BOUNDS) +constexpr auto CheckBounds = true; +#else +constexpr auto CheckBounds = Debug; +#endif + #if defined(NDEBUG) constexpr auto NDebug = true; #else diff --git a/deps/ox/src/ox/std/error.hpp b/deps/ox/src/ox/std/error.hpp index 8161e10..6030a52 100644 --- a/deps/ox/src/ox/std/error.hpp +++ b/deps/ox/src/ox/std/error.hpp @@ -330,4 +330,17 @@ constexpr void primitiveAssert(char const*file, int line, bool pass, char const* } } +constexpr void boundsCheck( + char const*file, + int const line, + size_t const i, + size_t const sz, + char const*msg) noexcept { + if constexpr(defines::CheckBounds) { + if (i >= sz) [[unlikely]] { + panic(file, line, msg, ox::Error{1}); + } + } +} + } diff --git a/deps/ox/src/ox/std/iterator.hpp b/deps/ox/src/ox/std/iterator.hpp index 1f06297..381a854 100644 --- a/deps/ox/src/ox/std/iterator.hpp +++ b/deps/ox/src/ox/std/iterator.hpp @@ -133,17 +133,17 @@ struct SpanIterator { } constexpr PtrType operator->() const noexcept { - ox::primitiveAssert(__FILE__, __LINE__, m_offset < m_max, "SpanIterator access overflow"); + boundsCheck(__FILE__, __LINE__, m_offset, m_max, "SpanIterator access overflow"); return &m_t[m_offset]; } constexpr RefType operator*() const noexcept { - ox::primitiveAssert(__FILE__, __LINE__, m_offset < m_max, "SpanIterator access overflow"); + boundsCheck(__FILE__, __LINE__, m_offset, m_max, "SpanIterator access overflow"); return m_t[m_offset]; } constexpr RefType operator[](std::size_t s) const noexcept { - ox::primitiveAssert(__FILE__, __LINE__, s < m_max, "SpanIterator access overflow"); + boundsCheck(__FILE__, __LINE__, s, m_max, "SpanIterator access overflow"); return m_t[s]; } diff --git a/deps/ox/src/ox/std/span.hpp b/deps/ox/src/ox/std/span.hpp index 3114aa0..a0b7f99 100644 --- a/deps/ox/src/ox/std/span.hpp +++ b/deps/ox/src/ox/std/span.hpp @@ -129,22 +129,22 @@ class Span { } constexpr T &operator[](std::size_t i) noexcept { - ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Span access overflow"); + boundsCheck(__FILE__, __LINE__, i, size(), "Span access overflow"); return m_items[i]; } constexpr T const&operator[](std::size_t i) const noexcept { - ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Span access overflow"); + boundsCheck(__FILE__, __LINE__, i, size(), "Span access overflow"); return m_items[i]; } constexpr Span operator+(size_t i) const noexcept { - ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Span access overflow"); + boundsCheck(__FILE__, __LINE__, i, size(), "Span access overflow"); return {m_items + i, m_size - i}; } constexpr Span operator+=(size_t i) noexcept { - ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Span access overflow"); + boundsCheck(__FILE__, __LINE__, i, size(), "Span access overflow"); m_items += i; m_size -= i; return *this; diff --git a/deps/ox/src/ox/std/vector.hpp b/deps/ox/src/ox/std/vector.hpp index b5b4f44..a8868bd 100644 --- a/deps/ox/src/ox/std/vector.hpp +++ b/deps/ox/src/ox/std/vector.hpp @@ -311,6 +311,8 @@ class Vector: detail::VectorAllocator { */ constexpr Error unordered_erase(std::size_t pos) noexcept(useNoexcept); + constexpr Error remove(T const &val); + constexpr void reserve(std::size_t cap) noexcept(useNoexcept); constexpr void shrink_to_fit() noexcept(useNoexcept); @@ -427,13 +429,13 @@ constexpr Vector &Vector constexpr T &Vector::operator[](std::size_t i) noexcept { - ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Vector access overflow"); + boundsCheck(__FILE__, __LINE__, i, size(), "Vector access overflow"); return m_items[i]; } template constexpr const T &Vector::operator[](std::size_t i) const noexcept { - ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Vector access overflow"); + boundsCheck(__FILE__, __LINE__, i, size(), "Vector access overflow"); return m_items[i]; } @@ -659,6 +661,17 @@ constexpr Error Vector::unordered_erase(std::size return ox::Error(0); } +template +constexpr ox::Error Vector::remove(T const &val) { + for (size_t i{}; auto const &v : *this) { + if (v == val) { + return erase(i).error; + } + ++i; + } + return ox::Error{1, "element not found"}; +} + template constexpr void Vector::reserve(std::size_t cap) noexcept(useNoexcept) { if (cap <= m_cap) { diff --git a/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp b/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp index 8a43307..2f01775 100644 --- a/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp +++ b/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp @@ -94,6 +94,27 @@ ox::Error PaletteEditorImGui::saveItem() noexcept { return m_sctx.project->writeObj(itemPath(), m_pal, ox::ClawFormat::Organic); } +void PaletteEditorImGui::navigateTo(ox::StringViewCR arg) noexcept { + auto const args = ox::split<2>(arg, ';'); + if (args.size() < 2) { + return; + } + auto const &color = args[0]; + auto const &page = args[1]; + { + auto const [c, err] = atoi(color); + if (!err && static_cast(c) < colorCnt(m_pal)) { + m_selectedColorRow = static_cast(c); + } + } + { + auto const [pg, err] = atoi(page); + if (!err && static_cast(pg) < m_pal.pages.size()) { + m_page = static_cast(pg); + } + } +} + void PaletteEditorImGui::drawColumnLeftAlign(ox::CStringView txt) noexcept { ImGui::TableNextColumn(); ImGui::Text("%s", txt.c_str()); diff --git a/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp b/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp index f3865e3..1ad127d 100644 --- a/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp +++ b/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp @@ -45,6 +45,8 @@ class PaletteEditorImGui: public studio::Editor { protected: ox::Error saveItem() noexcept final; + void navigateTo(ox::StringViewCR arg) noexcept override; + private: static void drawColumnLeftAlign(ox::CStringView txt) noexcept; diff --git a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp index 8b79ae4..20c9203 100644 --- a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp +++ b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp @@ -565,9 +565,13 @@ void TileSheetEditorImGui::drawPaletteMenu() noexcept { label.c_str(), rowSelected, ImGuiSelectableFlags_SpanAllColumns)) { m_view.setPalIdx(i); } + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(0)) { + auto const rqst = ox::sfmt>("{};{}", i, m_model.palettePage()); + oxLogError(studio::navigateTo(m_sctx, m_model.palPath(), rqst)); + } // Column: color RGB ImGui::TableNextColumn(); - auto ic = ImGui::GetColorU32(ImVec4(redf(c), greenf(c), bluef(c), 1)); + auto const ic = ImGui::GetColorU32({redf(c), greenf(c), bluef(c), 1}); ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ic); ImGui::TableNextColumn(); auto const&name = i < pal.colorNames.size() ? pal.colorNames[i].c_str() : ""; diff --git a/src/olympic/studio/applib/src/studioapp.cpp b/src/olympic/studio/applib/src/studioapp.cpp index ea2b04b..a17e8c5 100644 --- a/src/olympic/studio/applib/src/studioapp.cpp +++ b/src/olympic/studio/applib/src/studioapp.cpp @@ -18,6 +18,10 @@ namespace studio { +ox::Error navigateTo(StudioContext &ctx, ox::StringViewCR filePath, ox::StringViewCR args) noexcept { + return ctx.ui.navigateTo(filePath, args); +} + namespace ig { extern bool s_mainWinHasFocus; } @@ -107,6 +111,12 @@ void StudioUI::handleKeyEvent(turbine::Key const key, bool const down) noexcept } } +ox::Error StudioUI::navigateTo(ox::StringViewCR path, ox::StringViewCR navArgs) noexcept { + OX_RETURN_ERROR(openFile(path)); + m_activeEditor->navigateTo(navArgs); + return {}; +} + void StudioUI::draw() noexcept { glutils::clearScreen(); drawMenu(); diff --git a/src/olympic/studio/applib/src/studioapp.hpp b/src/olympic/studio/applib/src/studioapp.hpp index 6809102..a37c531 100644 --- a/src/olympic/studio/applib/src/studioapp.hpp +++ b/src/olympic/studio/applib/src/studioapp.hpp @@ -68,6 +68,8 @@ class StudioUI: public ox::SignalHandler { void handleKeyEvent(turbine::Key, bool down) noexcept; + ox::Error navigateTo(ox::StringViewCR path, ox::StringViewCR navArgs = {}) noexcept; + [[nodiscard]] constexpr Project *project() noexcept { return m_project.get(); diff --git a/src/olympic/studio/modlib/include/studio/context.hpp b/src/olympic/studio/modlib/include/studio/context.hpp index 970d27e..f14fe0e 100644 --- a/src/olympic/studio/modlib/include/studio/context.hpp +++ b/src/olympic/studio/modlib/include/studio/context.hpp @@ -27,4 +27,6 @@ inline keel::Context &keelCtx(StudioContext &ctx) noexcept { return keelCtx(ctx.tctx); } +ox::Error navigateTo(StudioContext &ctx, ox::StringViewCR filePath, ox::StringViewCR args) noexcept; + } diff --git a/src/olympic/studio/modlib/include/studio/editor.hpp b/src/olympic/studio/modlib/include/studio/editor.hpp index db6db91..20e9ec6 100644 --- a/src/olympic/studio/modlib/include/studio/editor.hpp +++ b/src/olympic/studio/modlib/include/studio/editor.hpp @@ -99,6 +99,8 @@ class BaseEditor: public Widget { [[nodiscard]] virtual UndoStack *undoStack() noexcept; + virtual void navigateTo(ox::StringViewCR arg) noexcept; + void setRequiresConstantRefresh(bool value) noexcept; // signals diff --git a/src/olympic/studio/modlib/src/editor.cpp b/src/olympic/studio/modlib/src/editor.cpp index 8aef151..37f4f23 100644 --- a/src/olympic/studio/modlib/src/editor.cpp +++ b/src/olympic/studio/modlib/src/editor.cpp @@ -106,6 +106,8 @@ UndoStack *BaseEditor::undoStack() noexcept { return nullptr; } +void BaseEditor::navigateTo(ox::StringViewCR) noexcept {} + Editor::Editor(StudioContext &ctx, ox::StringParam itemPath) noexcept: m_itemPath(std::move(itemPath)),