Squashed 'deps/nostalgia/' changes from 430cae16..5e90f8d4

5e90f8d4 [studio] Move task runner to draw call
fd4619bc [studio,turbine] Fix Turbine sleep logic, tweak Studio default sleep values
128ddb2c [turbine/gba] Fix ticksMs function signature
f34704d8 [nostalgia/core/studio] Fix AddSubsheetCommand::undo to undo ID idx change
fb5d3545 [nostalgia/core/studio] Cleanup
2180f7bf [nostalgia/core] Fix validateSubSheetIdx
dcad4440 [keel] Make GBA AssetRef changeable

git-subtree-dir: deps/nostalgia
git-subtree-split: 5e90f8d45434fa36b6e113357cf05a6cf53bfae5
This commit is contained in:
Gary Talent 2024-06-02 11:33:36 -05:00
parent a0d6019480
commit fc2dec6438
13 changed files with 48 additions and 51 deletions

View File

@ -238,7 +238,7 @@ ox::Error resizeSubsheet(TileSheet::SubSheet &ss, int8_t pBpp, ox::Size const&sz
* @return a valid version of idx
*/
[[nodiscard]]
TileSheet::SubSheetIdx validateSubSheetIdx(TileSheet const&ts, TileSheet::SubSheetIdx const&idx) noexcept;
TileSheet::SubSheetIdx validateSubSheetIdx(TileSheet const&ts, TileSheet::SubSheetIdx idx) noexcept;
[[nodiscard]]
TileSheet::SubSheet const&getSubSheet(

View File

@ -46,9 +46,11 @@ ox::Error AddSubSheetCommand::undo() noexcept {
parent.columns = s.columns;
parent.pixels = std::move(s.pixels);
parent.subsheets.clear();
--m_img.idIt;
} else {
for (auto idx = m_addedSheets.rbegin(); idx != m_addedSheets.rend(); ++idx) {
oxReturnError(rmSubSheet(m_img, *idx));
--m_img.idIt;
}
}
return {};

View File

@ -212,8 +212,8 @@ void TileSheetEditorImGui::draw(studio::StudioContext&) noexcept {
}
}
auto const paneSize = ImGui::GetContentRegionAvail();
auto const tileSheetParentSize = ImVec2(paneSize.x - m_palViewWidth, paneSize.y);
auto const fbSize = ox::Vec2(tileSheetParentSize.x - 16, tileSheetParentSize.y - 16);
auto const tileSheetParentSize = ImVec2{paneSize.x - m_palViewWidth, paneSize.y};
auto const fbSize = ox::Vec2{tileSheetParentSize.x - 16, tileSheetParentSize.y - 16};
ImGui::BeginChild("TileSheetView", tileSheetParentSize, true);
{
drawTileSheet(fbSize);
@ -225,7 +225,7 @@ void TileSheetEditorImGui::draw(studio::StudioContext&) noexcept {
auto const controlsSize = ImGui::GetContentRegionAvail();
ImGui::BeginChild("ToolBox", {m_palViewWidth - 24, 30}, true);
{
auto const btnSz = ImVec2(45, 14);
auto const btnSz = ImVec2{45, 14};
if (ImGui::Selectable("Select", m_tool == TileSheetTool::Select, 0, btnSz)) {
m_tool = TileSheetTool::Select;
}
@ -388,7 +388,7 @@ ox::Error TileSheetEditorImGui::exportSubhseetToPng(int scale) noexcept {
void TileSheetEditorImGui::drawTileSheet(ox::Vec2 const&fbSize) noexcept {
auto const winPos = ImGui::GetWindowPos();
auto const fbSizei = ox::Size(static_cast<int>(fbSize.x), static_cast<int>(fbSize.y));
auto const fbSizei = ox::Size{static_cast<int>(fbSize.x), static_cast<int>(fbSize.y)};
if (m_framebuffer.width != fbSizei.width || m_framebuffer.height != fbSizei.height) {
glutils::resizeInitFrameBuffer(m_framebuffer, fbSizei.width, fbSizei.height);
m_view.resizeView(fbSize);
@ -404,11 +404,11 @@ void TileSheetEditorImGui::drawTileSheet(ox::Vec2 const&fbSize) noexcept {
ImGui::Image(
ig::toImTextureID(m_framebuffer.color.id),
static_cast<ImVec2>(fbSize),
ImVec2(0, 1),
ImVec2(1, 0));
{0, 1},
{1, 0});
// handle input, this must come after drawing
auto const&io = ImGui::GetIO();
auto const mousePos = ox::Vec2(ImGui::GetMousePos());
auto const mousePos = ox::Vec2{ImGui::GetMousePos()};
if (ImGui::IsItemHovered()) {
auto const wheel = io.MouseWheel;
auto const wheelh = io.MouseWheelH;
@ -436,7 +436,7 @@ void TileSheetEditorImGui::drawTileSheet(ox::Vec2 const&fbSize) noexcept {
}
}
if (ImGui::BeginPopupContextItem("TileMenu", ImGuiPopupFlags_MouseButtonRight)) {
auto const popupPos = ox::Vec2(ImGui::GetWindowPos());
auto const popupPos = ox::Vec2{ImGui::GetWindowPos()};
if (ImGui::MenuItem("Insert Tile")) {
m_view.insertTile(fbSize, clickPos(winPos, popupPos));
}
@ -504,8 +504,8 @@ void TileSheetEditorImGui::drawPaletteSelector() noexcept {
auto ic = ImGui::GetColorU32(ImVec4(redf(c), greenf(c), bluef(c), 1));
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ic);
ImGui::TableNextColumn();
auto const&name = pal.colorInfo[i].name;
ImGui::Text("%s", name.c_str());
auto const&name = i < pal.colorInfo.size() ? pal.colorInfo[i].name.c_str() : "";
ImGui::Text("%s", name);
ImGui::TableNextColumn();
ImGui::Text("(%02d, %02d, %02d)", red16(c), green16(c), blue16(c));
ImGui::TableNextRow();
@ -556,7 +556,7 @@ void TileSheetEditorImGui::SubSheetEditor::draw(turbine::Context &tctx) noexcept
auto const modSize = m_cols > 0;
auto constexpr popupWidth = 235.f;
auto const popupHeight = modSize ? 130.f : 85.f;
auto const popupSz = ImVec2(popupWidth, popupHeight);
auto const popupSz = ImVec2{popupWidth, popupHeight};
if (ig::BeginPopup(tctx, popupName, m_show, popupSz)) {
ImGui::InputText("Name", m_name.data(), m_name.cap());
if (modSize) {
@ -581,7 +581,7 @@ void TileSheetEditorImGui::ExportMenu::draw(turbine::Context &tctx) noexcept {
}
constexpr auto popupWidth = 235.f;
constexpr auto popupHeight = 85.f;
constexpr auto popupSz = ImVec2(popupWidth, popupHeight);
constexpr auto popupSz = ImVec2{popupWidth, popupHeight};
if (ig::BeginPopup(tctx, popupName, m_show, popupSz)) {
ImGui::InputInt("Scale", &m_scale);
m_scale = ox::clamp(m_scale, 1, 50);

View File

@ -191,27 +191,28 @@ ox::Result<ox::StringView> getNameFor(TileSheet::SubSheet const&ss, SubSheetId p
TileSheet::SubSheetIdx validateSubSheetIdx(
TileSheet::SubSheetIdx const&pIdx,
TileSheet::SubSheetIdx &&pIdx,
std::size_t pIdxIt,
TileSheet::SubSheet const&pSubsheet) noexcept {
if (pIdxIt == pIdx.size()) {
return pIdx;
if (pIdxIt >= pIdx.size()) {
return std::move(pIdx);
}
const auto currentIdx = pIdx[pIdxIt];
auto &currentIdx = pIdx[pIdxIt];
if (pSubsheet.subsheets.size() <= currentIdx) {
auto out = pIdx;
if (!pSubsheet.subsheets.empty()) {
*out.back().value = pSubsheet.subsheets.size() - 1;
if (pSubsheet.subsheets.empty()) {
// currentIdx could not be repaired, remove
// this and all succeeding idxs and return
pIdx.resize(pIdxIt);
return std::move(pIdx);
} else {
out.pop_back();
currentIdx = pSubsheet.subsheets.size() - 1;
}
return out;
}
return validateSubSheetIdx(pIdx, pIdxIt + 1, pSubsheet.subsheets[pIdx[pIdxIt]]);
return validateSubSheetIdx(std::move(pIdx), pIdxIt + 1, pSubsheet.subsheets[currentIdx]);
}
TileSheet::SubSheetIdx validateSubSheetIdx(TileSheet const&ts, TileSheet::SubSheetIdx const&idx) noexcept {
return validateSubSheetIdx(idx, 0, ts.subsheet);
TileSheet::SubSheetIdx validateSubSheetIdx(TileSheet const&ts, TileSheet::SubSheetIdx idx) noexcept {
return validateSubSheetIdx(std::move(idx), 0, ts.subsheet);
}
const TileSheet::SubSheet &getSubSheet(

View File

@ -302,7 +302,7 @@ class AssetManager {
template<typename T>
class AssetRef {
private:
T const*const m_obj = nullptr;
T const* m_obj = nullptr;
public:
constexpr AssetRef() noexcept = default;

View File

@ -28,12 +28,6 @@ class StudioUIDrawer: public turbine::gl::Drawer {
}
};
static int updateHandler(turbine::Context &ctx) noexcept {
auto sctx = turbine::applicationData<studio::StudioContext>(ctx);
sctx->ui.update();
return 16;
}
static void keyEventHandler(turbine::Context &ctx, turbine::Key key, bool down) noexcept {
auto sctx = turbine::applicationData<studio::StudioContext>(ctx);
sctx->ui.handleKeyEvent(key, down);
@ -45,9 +39,8 @@ static ox::Error runApp(
ox::UPtr<ox::FileSystem> &&fs) noexcept {
oxRequireM(ctx, turbine::init(std::move(fs), appName));
turbine::setWindowTitle(*ctx, keelCtx(*ctx).appName);
turbine::setUpdateHandler(*ctx, updateHandler);
turbine::setKeyEventHandler(*ctx, keyEventHandler);
turbine::setConstantRefresh(*ctx, false);
turbine::setRefreshWithin(*ctx, 0);
StudioUI ui(*ctx, projectDataDir);
StudioUIDrawer drawer(ui);
turbine::gl::addDrawer(*ctx, &drawer);
@ -68,7 +61,7 @@ static ox::Error run(
static_cast<uint64_t>(time << 1)
});
// run app
auto const err = runApp(appName, projectDataDir, ox::UPtr<ox::FileSystem>(nullptr));
auto const err = runApp(appName, projectDataDir, ox::UPtr<ox::FileSystem>{});
oxAssert(err, "Something went wrong...");
return err;
}

View File

@ -78,10 +78,6 @@ StudioUI::StudioUI(turbine::Context &ctx, ox::StringView projectDataDir) noexcep
}
}
void StudioUI::update() noexcept {
m_taskRunner.update(m_ctx);
}
void StudioUI::handleKeyEvent(turbine::Key key, bool down) noexcept {
for (auto p : m_popups) {
if (p->isOpen()) {
@ -124,6 +120,7 @@ void StudioUI::draw() noexcept {
}
ImGui::End();
handleKeyInput();
m_taskRunner.update(m_ctx);
}
void StudioUI::drawMenu() noexcept {
@ -212,7 +209,6 @@ void StudioUI::drawTabs() noexcept {
}
if (m_activeEditorOnLastDraw != e.get()) [[unlikely]] {
m_activeEditor->onActivated();
turbine::setConstantRefresh(m_ctx, m_activeEditor->requiresConstantRefresh());
}
e->draw(m_sctx);
m_activeEditorOnLastDraw = e.get();

View File

@ -50,8 +50,6 @@ class StudioUI: public ox::SignalHandler {
public:
explicit StudioUI(turbine::Context &ctx, ox::StringView projectDataDir) noexcept;
void update() noexcept;
void handleKeyEvent(turbine::Key, bool down) noexcept;
[[nodiscard]]

View File

@ -43,6 +43,12 @@ ox::Bounds getWindowBounds(Context &ctx) noexcept;
ox::Error setWindowBounds(Context &ctx, ox::Bounds const&bnds) noexcept;
void setConstantRefresh(Context &ctx, bool r) noexcept;
/**
* Tells Turbine to refresh the screen within the specified period of time.
* If the requested value is greater than the current value, the call has no effect.
* @param ctx - Context
* @param ms - milliseconds
*/
void setRefreshWithin(Context &ctx, int ms) noexcept;
}

View File

@ -71,7 +71,7 @@ ox::Result<ContextUPtr> init(
void shutdown(Context&) noexcept {
}
uint64_t ticksMs(Context&) noexcept {
uint64_t ticksMs(Context const&) noexcept {
return g_timerMs;
}

View File

@ -22,8 +22,7 @@ class Context {
int uninterruptedRefreshes = 3;
ox::UPtr<BaseClipboardObject> clipboard;
struct GLFWwindow *window = nullptr;
// sets screen refresh to constant instead of only on event
bool constantRefresh = true;
int refreshWithinMs = 0;
ox::Vector<gl::Drawer*, 5> drawers;
int64_t startTime = 0;
uint64_t wakeupTime = 0;

View File

@ -260,8 +260,8 @@ ox::Error setWindowBounds(Context &ctx, ox::Bounds const&bnds) noexcept {
return {};
}
void setConstantRefresh(Context &ctx, bool r) noexcept {
ctx.constantRefresh = r;
void setRefreshWithin(Context &ctx, int ms) noexcept {
ctx.refreshWithinMs = ox::min(ms, ctx.refreshWithinMs);
}
}

View File

@ -69,6 +69,7 @@ static void tickFps(Context &ctx, uint64_t nowMs) noexcept {
ox::Error run(Context &ctx) noexcept {
int sleepTime = 0;
while (!glfwWindowShouldClose(ctx.window)) {
ctx.refreshWithinMs = 10 * 1000; // refresh within 10 seconds
glfwPollEvents();
auto const ticks = ticksMs(ctx);
if (ctx.wakeupTime <= ticks) {
@ -79,15 +80,16 @@ ox::Error run(Context &ctx) noexcept {
ctx.wakeupTime = ~uint64_t(0);
}
} else {
sleepTime = 10;
sleepTime = static_cast<int>(ctx.wakeupTime - ticks);
}
tickFps(ctx, ticks);
draw(ctx);
if (!ctx.constantRefresh) {
auto const realSleepTime = ox::min(ctx.refreshWithinMs, sleepTime);
if (realSleepTime) {
if (ctx.uninterruptedRefreshes) {
--ctx.uninterruptedRefreshes;
} else {
glfwWaitEventsTimeout(sleepTime);
glfwWaitEventsTimeout(static_cast<double>(realSleepTime) / 1000);
}
}
}