[keel,nostalgia,turbine] Cleanup

This commit is contained in:
Gary Talent 2023-11-23 01:46:11 -06:00
parent a84a829769
commit b946e428ad
30 changed files with 120 additions and 122 deletions

View File

@ -17,7 +17,6 @@ target_link_libraries(
OxFS OxFS
OxModel OxModel
OxPreloader OxPreloader
OxStd
) )
install( install(
@ -45,4 +44,4 @@ install(
if(TURBINE_BUILD_TYPE STREQUAL "Native") if(TURBINE_BUILD_TYPE STREQUAL "Native")
add_subdirectory(test) add_subdirectory(test)
endif() endif()

View File

@ -56,20 +56,24 @@ ox::Result<keel::AssetRef<T>> readObjFile(
path = ctx->uuidToPath[assetId]; path = ctx->uuidToPath[assetId];
} else { } else {
path = assetId; path = assetId;
uuidStr = ctx->pathToUuid[path].toString(); // Warning: StringView to String
uuidStr = ctx->pathToUuid[ox::String(path)].toString();
assetId = uuidStr; assetId = uuidStr;
} }
if (forceLoad) { if (forceLoad) {
oxRequire(buff, ctx->rom->read(path)); oxRequire(buff, ctx->rom->read(path));
oxRequire(obj, readConvert(ctx, buff)); oxRequire(obj, readConvert(ctx, buff));
oxRequire(cached, ctx->assetManager.setAsset(assetId, obj)); // Warning: StringView to String
oxRequire(cached, ctx->assetManager.setAsset(ox::String(assetId), obj));
return cached; return cached;
} else { } else {
auto [cached, err] = ctx->assetManager.getAsset<T>(assetId); // Warning: StringView to String
auto [cached, err] = ctx->assetManager.getAsset<T>(ox::String(assetId));
if (err) { if (err) {
oxRequire(buff, ctx->rom->read(path)); oxRequire(buff, ctx->rom->read(path));
oxRequire(obj, readConvert(ctx, buff)); oxRequire(obj, readConvert(ctx, buff));
oxReturnError(ctx->assetManager.setAsset(assetId, obj).moveTo(&cached)); // Warning: StringView to String
oxReturnError(ctx->assetManager.setAsset(ox::String(assetId), obj).moveTo(&cached));
} }
return cached; return cached;
} }
@ -103,12 +107,14 @@ ox::Result<AssetRef<T>> setAsset(keel::Context *ctx, ox::StringView assetId, T c
} }
ox::UUIDStr idStr; ox::UUIDStr idStr;
if (assetId[0] == '/') { if (assetId[0] == '/') {
const auto [id, err] = ctx->pathToUuid.at(assetId); // Warning: StringView to String
const auto [id, err] = ctx->pathToUuid.at(ox::String(assetId));
oxReturnError(err); oxReturnError(err);
idStr = id->toString(); idStr = id->toString();
assetId = idStr; assetId = idStr;
} }
return ctx->assetManager.setAsset(assetId, asset); // Warning: StringView to String
return ctx->assetManager.setAsset(ox::String(assetId), asset);
#else #else
return OxError(1, "Not supported on this platform"); return OxError(1, "Not supported on this platform");
#endif #endif

View File

@ -15,20 +15,11 @@
namespace nostalgia::core { namespace nostalgia::core {
ox::Result<PaletteEditorImGui*> PaletteEditorImGui::make(turbine::Context *ctx, ox::CRStringView path) noexcept { PaletteEditorImGui::PaletteEditorImGui(turbine::Context *ctx, ox::String path):
ox::UniquePtr<PaletteEditorImGui> out; m_ctx(ctx),
try { m_itemPath(std::move(path)),
out = ox::UniquePtr<PaletteEditorImGui>(new PaletteEditorImGui); m_itemName(m_itemPath.substr(std::find(m_itemPath.rbegin(), m_itemPath.rend(), '/').offset() + 1)),
} catch (...) { m_pal(*keel::readObj<Palette>(&m_ctx->keelCtx, ox::FileAddress(m_itemPath.c_str())).unwrapThrow()) {
return OxError(1);
}
out->m_ctx = ctx;
out->m_itemPath = path;
const auto lastSlash = std::find(out->m_itemPath.rbegin(), out->m_itemPath.rend(), '/').offset();
out->m_itemName = out->m_itemPath.substr(lastSlash + 1);
oxRequire(pal, keel::readObj<Palette>(&out->m_ctx->keelCtx, ox::FileAddress(out->m_itemPath.c_str())));
out->m_pal = *pal;
return out.release();
} }
const ox::String &PaletteEditorImGui::itemName() const noexcept { const ox::String &PaletteEditorImGui::itemName() const noexcept {
@ -93,21 +84,25 @@ void PaletteEditorImGui::draw(turbine::Context*) noexcept {
ImGui::TableSetupColumn("Blue", ImGuiTableColumnFlags_WidthFixed, 50); ImGui::TableSetupColumn("Blue", ImGuiTableColumnFlags_WidthFixed, 50);
ImGui::TableSetupColumn("Color Preview", ImGuiTableColumnFlags_NoHide); ImGui::TableSetupColumn("Color Preview", ImGuiTableColumnFlags_NoHide);
ImGui::TableHeadersRow(); ImGui::TableHeadersRow();
constexpr auto colVal = [] (unsigned num) {
ox::Array<char, 4> numStr;
ImGui::TableNextColumn();
ox_itoa(num, numStr.data());
ImGui::SetCursorPosX(
ImGui::GetCursorPosX() + ImGui::GetColumnWidth() - ImGui::CalcTextSize(numStr.data()).x);
ImGui::Text("%s", numStr.data());
};
for (auto i = 0u; const auto c : m_pal.colors) { for (auto i = 0u; const auto c : m_pal.colors) {
ImGui::PushID(static_cast<int>(i)); ImGui::PushID(static_cast<int>(i));
ImGui::TableNextRow(); ImGui::TableNextRow();
// Color No. // Color No.
ImGui::TableNextColumn(); colVal(i);
ImGui::Text("%d", i);
// Red // Red
ImGui::TableNextColumn(); colVal(red16(c));
ImGui::Text("%d", red16(c));
// Green // Green
ImGui::TableNextColumn(); colVal(green16(c));
ImGui::Text("%d", green16(c));
// Blue // Blue
ImGui::TableNextColumn(); colVal(blue16(c));
ImGui::Text("%d", blue16(c));
// ColorPreview // ColorPreview
ImGui::TableNextColumn(); ImGui::TableNextColumn();
const auto ic = ImGui::GetColorU32(ImVec4(redf(c), greenf(c), bluef(c), 1)); const auto ic = ImGui::GetColorU32(ImVec4(redf(c), greenf(c), bluef(c), 1));

View File

@ -15,15 +15,15 @@ class PaletteEditorImGui: public studio::Editor {
private: private:
turbine::Context *m_ctx = nullptr; turbine::Context *m_ctx = nullptr;
ox::String m_itemName;
ox::String m_itemPath; ox::String m_itemPath;
ox::String m_itemName;
Palette m_pal; Palette m_pal;
std::size_t m_selectedRow = 0; std::size_t m_selectedRow = 0;
PaletteEditorImGui() noexcept = default; PaletteEditorImGui() noexcept = default;
public: public:
static ox::Result<PaletteEditorImGui*> make(turbine::Context *ctx, ox::CRStringView path) noexcept; PaletteEditorImGui(turbine::Context *ctx, ox::String path);
/** /**
* Returns the name of item being edited. * Returns the name of item being edited.

View File

@ -17,13 +17,13 @@ class StudioModule: public studio::Module {
{ {
{FileExt_ng}, {FileExt_ng},
[ctx](ox::CRStringView path) -> ox::Result<studio::BaseEditor*> { [ctx](ox::CRStringView path) -> ox::Result<studio::BaseEditor*> {
return ox::makeCatch<TileSheetEditorImGui>(ctx, path); return ox::makeCatch<TileSheetEditorImGui>(ctx, ox::String(path));
} }
}, },
{ {
{FileExt_npal}, {FileExt_npal},
[ctx](ox::CRStringView path) -> ox::Result<studio::BaseEditor*> { [ctx](ox::CRStringView path) -> ox::Result<studio::BaseEditor*> {
return PaletteEditorImGui::make(ctx, path); return ox::makeCatch<PaletteEditorImGui>(ctx, ox::String(path));
} }
} }
}; };

View File

@ -38,9 +38,9 @@ ox::Error toPngFile(const ox::String &path, const TileSheet::SubSheet &s, const
return OxError(static_cast<ox::ErrorCode>(lodepng_encode_file(path.c_str(), outData.data(), width, height, fmt, 8))); return OxError(static_cast<ox::ErrorCode>(lodepng_encode_file(path.c_str(), outData.data(), width, height, fmt, 8)));
} }
TileSheetEditorImGui::TileSheetEditorImGui(turbine::Context *ctx, ox::CRStringView path): m_tileSheetEditor(ctx, path) { TileSheetEditorImGui::TileSheetEditorImGui(turbine::Context *ctx, ox::String path): m_tileSheetEditor(ctx, path) {
m_ctx = ctx; m_ctx = ctx;
m_itemPath = path; m_itemPath = std::move(path);
const auto lastSlash = ox::find(m_itemPath.rbegin(), m_itemPath.rend(), '/').offset(); const auto lastSlash = ox::find(m_itemPath.rbegin(), m_itemPath.rend(), '/').offset();
m_itemName = m_itemPath.substr(lastSlash + 1); m_itemName = m_itemPath.substr(lastSlash + 1);
// init palette idx // init palette idx
@ -393,7 +393,7 @@ void TileSheetEditorImGui::drawPaletteSelector() noexcept {
} }
} }
ox::Error TileSheetEditorImGui::updateActiveSubsheet(const ox::String &name, int cols, int rows) noexcept { ox::Error TileSheetEditorImGui::updateActiveSubsheet(const ox::StringView &name, int cols, int rows) noexcept {
return model()->updateSubsheet(model()->activeSubSheetIdx(), name, cols, rows); return model()->updateSubsheet(model()->activeSubSheetIdx(), name, cols, rows);
} }

View File

@ -55,7 +55,7 @@ class TileSheetEditorImGui: public studio::BaseEditor {
Tool m_tool = Tool::Draw; Tool m_tool = Tool::Draw;
public: public:
TileSheetEditorImGui(turbine::Context *ctx, ox::CRStringView path); TileSheetEditorImGui(turbine::Context *ctx, ox::String path);
~TileSheetEditorImGui() override = default; ~TileSheetEditorImGui() override = default;
@ -116,7 +116,7 @@ class TileSheetEditorImGui: public studio::BaseEditor {
void drawPaletteSelector() noexcept; void drawPaletteSelector() noexcept;
ox::Error updateActiveSubsheet(const ox::String &name, int cols, int rows) noexcept; ox::Error updateActiveSubsheet(const ox::StringView &name, int cols, int rows) noexcept;
// slots // slots
private: private:

View File

@ -488,13 +488,13 @@ class UpdateSubSheetCommand: public TileSheetCommand {
UpdateSubSheetCommand( UpdateSubSheetCommand(
TileSheet &img, TileSheet &img,
TileSheet::SubSheetIdx idx, TileSheet::SubSheetIdx idx,
const ox::String &name, ox::String name,
int cols, int cols,
int rows) noexcept: int rows) noexcept:
m_img(img), m_img(img),
m_idx(std::move(idx)) { m_idx(std::move(idx)) {
m_sheet = m_img.getSubSheet(m_idx); m_sheet = m_img.getSubSheet(m_idx);
m_newName = name; m_newName = std::move(name);
m_newCols = cols; m_newCols = cols;
m_newRows = rows; m_newRows = rows;
} }
@ -682,8 +682,8 @@ void TileSheetEditorModel::deleteTiles(const TileSheet::SubSheetIdx &idx, std::s
pushCommand(ox::make<DeleteTilesCommand>(m_img, idx, tileIdx, tileCnt)); pushCommand(ox::make<DeleteTilesCommand>(m_img, idx, tileIdx, tileCnt));
} }
ox::Error TileSheetEditorModel::updateSubsheet(const TileSheet::SubSheetIdx &idx, const ox::String &name, int cols, int rows) noexcept { ox::Error TileSheetEditorModel::updateSubsheet(const TileSheet::SubSheetIdx &idx, const ox::StringView &name, int cols, int rows) noexcept {
pushCommand(ox::make<UpdateSubSheetCommand>(m_img, idx, name, cols, rows)); pushCommand(ox::make<UpdateSubSheetCommand>(m_img, idx, ox::String(name), cols, rows));
return {}; return {};
} }

View File

@ -72,7 +72,7 @@ class TileSheetEditorModel: public ox::SignalHandler {
void deleteTiles(const TileSheet::SubSheetIdx &idx, std::size_t tileIdx, std::size_t tileCnt) noexcept; void deleteTiles(const TileSheet::SubSheetIdx &idx, std::size_t tileIdx, std::size_t tileCnt) noexcept;
ox::Error updateSubsheet(const TileSheet::SubSheetIdx &idx, const ox::String &name, int cols, int rows) noexcept; ox::Error updateSubsheet(const TileSheet::SubSheetIdx &idx, const ox::StringView &name, int cols, int rows) noexcept;
void setActiveSubsheet(const TileSheet::SubSheetIdx&) noexcept; void setActiveSubsheet(const TileSheet::SubSheetIdx&) noexcept;

View File

@ -11,8 +11,8 @@
namespace nostalgia::core { namespace nostalgia::core {
TileSheetEditorView::TileSheetEditorView(turbine::Context *ctx, ox::CRStringView path): TileSheetEditorView::TileSheetEditorView(turbine::Context *ctx, ox::String path):
m_model(ctx, path), m_pixelsDrawer(&m_model) { m_model(ctx, std::move(path)), m_pixelsDrawer(&m_model) {
// build shaders // build shaders
oxThrowError(m_pixelsDrawer.buildShader()); oxThrowError(m_pixelsDrawer.buildShader());
oxThrowError(m_pixelGridDrawer.buildShader()); oxThrowError(m_pixelGridDrawer.buildShader());

View File

@ -50,7 +50,7 @@ class TileSheetEditorView: public ox::SignalHandler {
std::size_t m_palIdx = 0; std::size_t m_palIdx = 0;
public: public:
TileSheetEditorView(turbine::Context *ctx, ox::CRStringView path); TileSheetEditorView(turbine::Context *ctx, ox::String path);
~TileSheetEditorView() override = default; ~TileSheetEditorView() override = default;

View File

@ -15,7 +15,7 @@ class Scene {
public: public:
explicit Scene(const SceneStatic &sceneStatic) noexcept; explicit Scene(const SceneStatic &sceneStatic) noexcept;
ox::Error setupDisplay(core::Context *ctx) const noexcept; ox::Error setupDisplay(core::Context &ctx) const noexcept;
private: private:
void setupLayer(core::Context*, const ox::Vector<uint16_t> &layer, unsigned layerNo) const noexcept; void setupLayer(core::Context*, const ox::Vector<uint16_t> &layer, unsigned layerNo) const noexcept;

View File

@ -12,17 +12,17 @@ Scene::Scene(const SceneStatic &sceneStatic) noexcept:
m_sceneStatic(sceneStatic) { m_sceneStatic(sceneStatic) {
} }
ox::Error Scene::setupDisplay(core::Context *ctx) const noexcept { ox::Error Scene::setupDisplay(core::Context &ctx) const noexcept {
if (m_sceneStatic.palettes.empty()) { if (m_sceneStatic.palettes.empty()) {
return OxError(1, "Scene has no palettes"); return OxError(1, "Scene has no palettes");
} }
const auto &palette = m_sceneStatic.palettes[0]; const auto &palette = m_sceneStatic.palettes[0];
oxReturnError(core::loadBgTileSheet( oxReturnError(core::loadBgTileSheet(
ctx, 0, m_sceneStatic.tilesheet, palette)); &ctx, 0, m_sceneStatic.tilesheet, palette));
// disable all backgrounds // disable all backgrounds
core::setBgStatus(ctx, 0); core::setBgStatus(&ctx, 0);
for (auto layerNo = 0u; const auto &layer : m_sceneStatic.tileMapIdx) { for (auto layerNo = 0u; const auto &layer : m_sceneStatic.tileMapIdx) {
setupLayer(ctx, layer, layerNo); setupLayer(&ctx, layer, layerNo);
++layerNo; ++layerNo;
} }
return {}; return {};

View File

@ -10,11 +10,11 @@
namespace nostalgia::scene { namespace nostalgia::scene {
SceneEditorImGui::SceneEditorImGui(turbine::Context *ctx, ox::CRStringView path): SceneEditorImGui::SceneEditorImGui(turbine::Context &ctx, ox::String path):
m_editor(ctx, path), m_ctx(ctx),
m_view(ctx, m_editor.scene()) { m_itemPath(std::move(path)),
m_ctx = ctx; m_editor(&m_ctx, m_itemPath),
m_itemPath = path; m_view(&m_ctx, m_editor.scene()) {
const auto lastSlash = std::find(m_itemPath.rbegin(), m_itemPath.rend(), '/').offset(); const auto lastSlash = std::find(m_itemPath.rbegin(), m_itemPath.rend(), '/').offset();
m_itemName = m_itemPath.substr(lastSlash + 1); m_itemName = m_itemPath.substr(lastSlash + 1);
setRequiresConstantRefresh(false); setRequiresConstantRefresh(false);
@ -48,9 +48,9 @@ void SceneEditorImGui::onActivated() noexcept {
} }
ox::Error SceneEditorImGui::saveItem() noexcept { ox::Error SceneEditorImGui::saveItem() noexcept {
const auto sctx = applicationData<studio::StudioContext>(*m_ctx); const auto sctx = applicationData<studio::StudioContext>(m_ctx);
oxReturnError(sctx->project->writeObj(m_itemPath, &m_editor.scene())); oxReturnError(sctx->project->writeObj(m_itemPath, &m_editor.scene()));
oxReturnError(m_ctx->keelCtx.assetManager.setAsset(m_itemPath, m_editor.scene())); oxReturnError(m_ctx.keelCtx.assetManager.setAsset(m_itemPath, m_editor.scene()));
return {}; return {};
} }

View File

@ -16,14 +16,14 @@ namespace nostalgia::scene {
class SceneEditorImGui: public studio::Editor { class SceneEditorImGui: public studio::Editor {
private: private:
turbine::Context *m_ctx = nullptr; turbine::Context &m_ctx;
ox::String m_itemName; ox::String m_itemName;
ox::String m_itemPath; ox::String m_itemPath;
SceneEditor m_editor; SceneEditor m_editor;
SceneEditorView m_view; SceneEditorView m_view;
public: public:
SceneEditorImGui(turbine::Context *ctx, ox::CRStringView path); SceneEditorImGui(turbine::Context &ctx, ox::String path);
/** /**
* Returns the name of item being edited. * Returns the name of item being edited.

View File

@ -15,7 +15,7 @@ SceneEditorView::SceneEditorView(turbine::Context *tctx, const SceneStatic &scen
} }
ox::Error SceneEditorView::setupScene() noexcept { ox::Error SceneEditorView::setupScene() noexcept {
return m_scene.setupDisplay(m_cctx.get()); return m_scene.setupDisplay(*m_cctx);
} }
void SceneEditorView::draw(int width, int height) noexcept { void SceneEditorView::draw(int width, int height) noexcept {

View File

@ -19,7 +19,7 @@ ox::Vector<studio::EditorMaker> StudioModule::editors(turbine::Context *ctx) con
{ {
{"nscn"}, {"nscn"},
[ctx](ox::CRStringView path) -> ox::Result<studio::BaseEditor*> { [ctx](ox::CRStringView path) -> ox::Result<studio::BaseEditor*> {
return ox::makeCatch<SceneEditorImGui>(ctx, path); return ox::makeCatch<SceneEditorImGui>(*ctx, ox::String(path));
} }
}, },
}; };

View File

@ -33,7 +33,6 @@ static void keyEventHandler(turbine::Context &tctx, turbine::Key key, bool down)
} }
ox::Error run(ox::UniquePtr<ox::FileSystem> &&fs) noexcept { ox::Error run(ox::UniquePtr<ox::FileSystem> &&fs) noexcept {
oxTraceInitHook();
oxRequireM(tctx, turbine::init(std::move(fs), "Nostalgia")); oxRequireM(tctx, turbine::init(std::move(fs), "Nostalgia"));
oxRequireM(cctx, core::init(tctx.get())); oxRequireM(cctx, core::init(tctx.get()));
constexpr ox::FileAddress SceneAddr("/Scenes/Chester.nscn"); constexpr ox::FileAddress SceneAddr("/Scenes/Chester.nscn");
@ -41,6 +40,6 @@ ox::Error run(ox::UniquePtr<ox::FileSystem> &&fs) noexcept {
turbine::setUpdateHandler(*tctx, updateHandler); turbine::setUpdateHandler(*tctx, updateHandler);
turbine::setKeyEventHandler(*tctx, keyEventHandler); turbine::setKeyEventHandler(*tctx, keyEventHandler);
s_scene.emplace(*scn); s_scene.emplace(*scn);
oxReturnError(s_scene->setupDisplay(cctx.get())); oxReturnError(s_scene->setupDisplay(*cctx));
return turbine::run(*tctx); return turbine::run(*tctx);
} }

View File

@ -2,6 +2,7 @@
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved. * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/ */
#include <ox/logconn/def.hpp>
#include <ox/logconn/logconn.hpp> #include <ox/logconn/logconn.hpp>
#include <keel/media.hpp> #include <keel/media.hpp>
@ -11,8 +12,7 @@
#include "app.hpp" #include "app.hpp"
static ox::Error run(int argc, const char **argv) noexcept { static ox::Error run(int argc, const char **argv) noexcept {
ox::trace::init(); #ifndef OX_BARE_METAL
#ifdef OX_USE_STDLIB
// GBA doesn't need the modules and calling this doubles the size of the // GBA doesn't need the modules and calling this doubles the size of the
// binary. // binary.
nostalgia::registerKeelModules(); nostalgia::registerKeelModules();
@ -33,16 +33,19 @@ int WinMain() {
#else #else
int main(int argc, const char **argv) { int main(int argc, const char **argv) {
#endif #endif
#if defined(DEBUG) && !defined(OX_BARE_METAL) OX_INIT_DEBUG_LOGGER(loggerConn, "Nostalgia Player")
ox::LoggerConn loggerConn; ox::Error err;
const auto loggerErr = loggerConn.initConn("Nostalgia Player"); #ifdef __cpp_exceptions
if (loggerErr) { try {
oxErrf("Could not connect to logger: {} ({}:{})\n", toStr(loggerErr), loggerErr.file, loggerErr.line); err = run(argc, argv);
} else { } catch (ox::Exception const&ex) {
ox::trace::setLogger(&loggerConn); err = ex.toError();
} catch (...) {
err = OxError(1, "Non-Ox exception");
} }
#else
err = run(argc, argv);
#endif #endif
const auto err = run(argc, argv);
oxAssert(err, "Something went wrong..."); oxAssert(err, "Something went wrong...");
return static_cast<int>(err); return static_cast<int>(err);
} }

View File

@ -4,7 +4,6 @@ target_link_libraries(
nost-pack nost-pack
OxClArgs OxClArgs
OxLogConn OxLogConn
Keel
NostalgiaKeelModules NostalgiaKeelModules
) )

View File

@ -6,6 +6,7 @@
#include <ox/clargs/clargs.hpp> #include <ox/clargs/clargs.hpp>
#include <ox/fs/fs.hpp> #include <ox/fs/fs.hpp>
#include <ox/logconn/def.hpp>
#include <ox/logconn/logconn.hpp> #include <ox/logconn/logconn.hpp>
#include <keel/keel.hpp> #include <keel/keel.hpp>
@ -50,7 +51,6 @@ static ox::Error generateTypes(ox::TypeStore *ts) noexcept {
} }
static ox::Error run(const ox::ClArgs &args) noexcept { static ox::Error run(const ox::ClArgs &args) noexcept {
nostalgia::registerKeelModules();
const auto argSrc = args.getString("src", ""); const auto argSrc = args.getString("src", "");
const auto argRomBin = args.getString("rom-bin", ""); const auto argRomBin = args.getString("rom-bin", "");
if (argSrc == "") { if (argSrc == "") {
@ -63,7 +63,7 @@ static ox::Error run(const ox::ClArgs &args) noexcept {
} }
ox::Buffer dstBuff(32 * ox::units::MB); ox::Buffer dstBuff(32 * ox::units::MB);
oxReturnError(ox::FileSystem32::format(dstBuff.data(), dstBuff.size())); oxReturnError(ox::FileSystem32::format(dstBuff.data(), dstBuff.size()));
ox::FileSystem32 dst(ox::FileStore32(dstBuff.data(), dstBuff.size())); ox::FileSystem32 dst(dstBuff);
oxRequire(ctx, keel::init(ox::make_unique<ox::PassThroughFS>(argSrc), "nost-pack")); oxRequire(ctx, keel::init(ox::make_unique<ox::PassThroughFS>(argSrc), "nost-pack"));
keel::TypeStore ts(ctx->rom.get(), "/.nostalgia/type_descriptors"); keel::TypeStore ts(ctx->rom.get(), "/.nostalgia/type_descriptors");
oxReturnError(generateTypes(&ts)); oxReturnError(generateTypes(&ts));
@ -87,16 +87,8 @@ static ox::Error run(const ox::ClArgs &args) noexcept {
} }
int main(int argc, const char **args) { int main(int argc, const char **args) {
ox::trace::init(); OX_INIT_DEBUG_LOGGER(loggerConn, "nost-pack")
#ifdef DEBUG nostalgia::registerKeelModules();
ox::LoggerConn loggerConn;
const auto loggerErr = loggerConn.initConn("nost-pack");
if (loggerErr) {
oxErrf("Could not connect to logger: {} ({}:{})\n", toStr(loggerErr), loggerErr.file, loggerErr.line);
} else {
ox::trace::setLogger(&loggerConn);
}
#endif
const auto err = run(ox::ClArgs(argc, args)); const auto err = run(ox::ClArgs(argc, args));
oxAssert(err, "pack failed"); oxAssert(err, "pack failed");
return static_cast<int>(err); return static_cast<int>(err);

View File

@ -12,8 +12,15 @@ namespace studio {
void registerModule(const studio::Module*) noexcept; void registerModule(const studio::Module*) noexcept;
struct StudioOptions {
ox::String appName;
ox::String projectDataDir;
};
int main(StudioOptions&&);
int main( int main(
const char *appName, ox::CRStringView appName,
ox::String projectDataDir, ox::String projectDataDir,
int argc, int argc,
const char **argv); const char **argv);

View File

@ -5,12 +5,14 @@
#include <ctime> #include <ctime>
#include <ox/logconn/logconn.hpp> #include <ox/logconn/logconn.hpp>
#include <ox/logconn/def.hpp>
#include <ox/std/trace.hpp> #include <ox/std/trace.hpp>
#include <ox/std/uuid.hpp> #include <ox/std/uuid.hpp>
#include <keel/media.hpp> #include <keel/media.hpp>
#include <turbine/turbine.hpp> #include <turbine/turbine.hpp>
#include <studio/context.hpp> #include <studio/context.hpp>
#include <studioapp/studioapp.hpp>
#include "studioapp.hpp" #include "studioapp.hpp"
namespace studio { namespace studio {
@ -61,30 +63,26 @@ static ox::Error runApp(
} }
int main( int main(
const char *appName, ox::CRStringView appName,
ox::String projectDataDir, ox::String projectDataDir,
int, int,
const char **) { const char**) {
#ifdef DEBUG OX_INIT_DEBUG_LOGGER(loggerConn, appName)
ox::LoggerConn loggerConn; // seed UUID generator
const auto loggerErr = loggerConn.initConn(appName);
if (loggerErr) {
oxErrf("Could not connect to logger: {}\n", toStr(loggerErr));
} else {
ox::trace::setLogger(&loggerConn);
}
#endif
ox::trace::init();
// run app
const auto time = std::time(nullptr); const auto time = std::time(nullptr);
ox::UUID::seedGenerator({ ox::UUID::seedGenerator({
static_cast<uint64_t>(time), static_cast<uint64_t>(time),
static_cast<uint64_t>(time << 1) static_cast<uint64_t>(time << 1)
}); });
// run app
const auto err = runApp(appName, std::move(projectDataDir), ox::UniquePtr<ox::FileSystem>(nullptr)); const auto err = runApp(appName, std::move(projectDataDir), ox::UniquePtr<ox::FileSystem>(nullptr));
oxAssert(err, "Something went wrong..."); oxAssert(err, "Something went wrong...");
return static_cast<int>(err); return static_cast<int>(err);
} }
int main(StudioOptions &&opts, int argc = 0, const char **argv = nullptr) {
return main(opts.appName, std::move(opts.projectDataDir), argc, argv);
}
} }

View File

@ -57,7 +57,7 @@ void NewMenu::drawNewItemType(turbine::Context *ctx) noexcept {
drawWindow(ctx, &m_open, [this] { drawWindow(ctx, &m_open, [this] {
auto items = ox_malloca(m_types.size() * sizeof(const char*), const char*, nullptr); auto items = ox_malloca(m_types.size() * sizeof(const char*), const char*, nullptr);
for (auto i = 0u; const auto &im : m_types) { for (auto i = 0u; const auto &im : m_types) {
items[i] = im->name.c_str(); items.get()[i] = im->name.c_str();
++i; ++i;
} }
ImGui::ListBox("Item Type", &m_selectedType, items.get(), static_cast<int>(m_types.size())); ImGui::ListBox("Item Type", &m_selectedType, items.get(), static_cast<int>(m_types.size()));

View File

@ -11,7 +11,7 @@
namespace studio { namespace studio {
static ox::Result<ox::UniquePtr<ProjectTreeModel>> static ox::Result<ox::UniquePtr<ProjectTreeModel>>
buildProjectTreeModel(ProjectExplorer *explorer, ox::CRStringView name, ox::CRStringView path, ProjectTreeModel *parent) noexcept { buildProjectTreeModel(ProjectExplorer *explorer, ox::String name, ox::CRStringView path, ProjectTreeModel *parent) noexcept {
const auto fs = explorer->romFs(); const auto fs = explorer->romFs();
oxRequire(stat, fs->stat(path)); oxRequire(stat, fs->stat(path));
auto out = ox::make_unique<ProjectTreeModel>(explorer, name, parent); auto out = ox::make_unique<ProjectTreeModel>(explorer, name, parent);

View File

@ -305,7 +305,7 @@ ox::Error StudioUI::openProject(ox::CRStringView path) noexcept {
oxRequireM(fs, keel::loadRomFs(path)); oxRequireM(fs, keel::loadRomFs(path));
oxReturnError(keel::setRomFs(&m_ctx->keelCtx, std::move(fs))); oxReturnError(keel::setRomFs(&m_ctx->keelCtx, std::move(fs)));
turbine::setWindowTitle(*m_ctx, ox::sfmt("{} - {}", m_ctx->keelCtx.appName, path)); turbine::setWindowTitle(*m_ctx, ox::sfmt("{} - {}", m_ctx->keelCtx.appName, path));
m_project = ox::make_unique<studio::Project>(&m_ctx->keelCtx, path, m_projectDir); m_project = ox::make_unique<studio::Project>(&m_ctx->keelCtx, ox::String(path), m_projectDir);
auto sctx = applicationData<studio::StudioContext>(*m_ctx); auto sctx = applicationData<studio::StudioContext>(*m_ctx);
sctx->project = m_project.get(); sctx->project = m_project.get();
m_project->fileAdded.connect(m_projectExplorer.get(), &ProjectExplorer::refreshProjectTreeModel); m_project->fileAdded.connect(m_projectExplorer.get(), &ProjectExplorer::refreshProjectTreeModel);
@ -313,7 +313,7 @@ ox::Error StudioUI::openProject(ox::CRStringView path) noexcept {
m_openFiles.clear(); m_openFiles.clear();
m_editors.clear(); m_editors.clear();
studio::editConfig<StudioConfig>(&m_ctx->keelCtx, [&](StudioConfig *config) { studio::editConfig<StudioConfig>(&m_ctx->keelCtx, [&](StudioConfig *config) {
config->projectPath = path; config->projectPath = ox::String(path);
config->openFiles.clear(); config->openFiles.clear();
}); });
return m_projectExplorer->refreshProjectTreeModel(); return m_projectExplorer->refreshProjectTreeModel();
@ -324,7 +324,9 @@ ox::Error StudioUI::openFile(ox::CRStringView path) noexcept {
} }
ox::Error StudioUI::openFileActiveTab(ox::CRStringView path, bool makeActiveTab) noexcept { ox::Error StudioUI::openFileActiveTab(ox::CRStringView path, bool makeActiveTab) noexcept {
if (m_openFiles.contains(path)) { // Warning: StringView to String
auto const pathStr = ox::String(path);
if (m_openFiles.contains(pathStr)) {
for (auto &e : m_editors) { for (auto &e : m_editors) {
if (makeActiveTab && e->itemName() == path) { if (makeActiveTab && e->itemName() == path) {
m_activeEditor = e.get(); m_activeEditor = e.get();
@ -334,7 +336,7 @@ ox::Error StudioUI::openFileActiveTab(ox::CRStringView path, bool makeActiveTab)
} }
return OxError(0); return OxError(0);
} }
oxRequire(ext, studio::fileExt(path)); oxRequire(ext, studio::fileExt(path).to<ox::String>([](auto const&v) {return ox::String(v);}));
// create Editor // create Editor
studio::BaseEditor *editor = nullptr; studio::BaseEditor *editor = nullptr;
if (!m_editorMakers.contains(ext)) { if (!m_editorMakers.contains(ext)) {
@ -363,7 +365,7 @@ ox::Error StudioUI::openFileActiveTab(ox::CRStringView path, bool makeActiveTab)
} }
// save to config // save to config
studio::editConfig<StudioConfig>(&m_ctx->keelCtx, [&](StudioConfig *config) { studio::editConfig<StudioConfig>(&m_ctx->keelCtx, [&](StudioConfig *config) {
if (!config->openFiles.contains(path)) { if (!config->openFiles.contains(pathStr)) {
config->openFiles.emplace_back(path); config->openFiles.emplace_back(path);
} }
}); });

View File

@ -88,10 +88,4 @@ class StudioUI: public ox::SignalHandler {
ox::Error closeFile(const ox::String &path) noexcept; ox::Error closeFile(const ox::String &path) noexcept;
}; };
int main(
const char *appName,
ox::String projectDataDir,
[[maybe_unused]] int argc,
[[maybe_unused]] const char **argv);
} }

View File

@ -57,7 +57,8 @@ bool Project::exists(ox::CRStringView path) const noexcept {
} }
const ox::Vector<ox::String> &Project::fileList(ox::CRStringView ext) noexcept { const ox::Vector<ox::String> &Project::fileList(ox::CRStringView ext) noexcept {
return m_fileExtFileMap[ext]; // Warning: StringView to String
return m_fileExtFileMap[ox::String(ext)];
} }
void Project::buildFileIndex() noexcept { void Project::buildFileIndex() noexcept {
@ -80,7 +81,8 @@ void Project::indexFile(ox::CRStringView path) noexcept {
if (err) { if (err) {
return; return;
} }
m_fileExtFileMap[ext].emplace_back(path); // Warning: StringView to String
m_fileExtFileMap[ox::String(ext)].emplace_back(path);
} }
ox::Error Project::writeBuff(const ox::StringView &path, const ox::Buffer &buff) noexcept { ox::Error Project::writeBuff(const ox::StringView &path, const ox::Buffer &buff) noexcept {
@ -88,7 +90,8 @@ ox::Error Project::writeBuff(const ox::StringView &path, const ox::Buffer &buff)
ox::Buffer outBuff; ox::Buffer outBuff;
outBuff.reserve(buff.size() + HdrSz); outBuff.reserve(buff.size() + HdrSz);
ox::BufferWriter writer(&outBuff); ox::BufferWriter writer(&outBuff);
const auto [uuid, err] = m_ctx->pathToUuid.at(path); // Warning: StringView to String
const auto [uuid, err] = m_ctx->pathToUuid.at(ox::String(path));
if (!err) { if (!err) {
oxReturnError(keel::writeUuidHeader(writer, *uuid)); oxReturnError(keel::writeUuidHeader(writer, *uuid));
} }

View File

@ -21,7 +21,7 @@ void setClipboardText(Context &ctx, ox::CRStringView text) noexcept {
auto &gctx = static_cast<GlfwContext&>(ctx); auto &gctx = static_cast<GlfwContext&>(ctx);
auto cstr = ox_malloca(text.bytes() + 1, char); auto cstr = ox_malloca(text.bytes() + 1, char);
ox_strncpy(cstr.get(), text.data(), text.bytes()); ox_strncpy(cstr.get(), text.data(), text.bytes());
glfwSetClipboardString(gctx.window, cstr); glfwSetClipboardString(gctx.window, cstr.get());
} }
} }

View File

@ -220,8 +220,9 @@ ox::Error initGfx(Context &ctx) noexcept {
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
auto cstr = ox_malloca(ctx.keelCtx.appName.bytes() + 1, char); auto cstr = ox_malloca(ctx.keelCtx.appName.bytes() + 1, char);
ox_strncpy(cstr.get(), ctx.keelCtx.appName.data(), ctx.keelCtx.appName.bytes()); ox_strncpy(cstr.get(), ctx.keelCtx.appName.data(), ctx.keelCtx.appName.bytes());
constexpr auto Scale = 5; //constexpr auto Scale = 5;
gctx.window = glfwCreateWindow(240 * Scale, 160 * Scale, cstr, nullptr, nullptr); //gctx.window = glfwCreateWindow(240 * Scale, 160 * Scale, cstr, nullptr, nullptr);
gctx.window = glfwCreateWindow(868, 741, cstr.get(), nullptr, nullptr);
if (gctx.window == nullptr) { if (gctx.window == nullptr) {
return OxError(1, "Could not open GLFW window"); return OxError(1, "Could not open GLFW window");
} }
@ -250,7 +251,7 @@ void setWindowTitle(Context &ctx, ox::CRStringView title) noexcept {
auto &gctx = glctx(ctx); auto &gctx = glctx(ctx);
auto cstr = ox_malloca(title.bytes() + 1, char); auto cstr = ox_malloca(title.bytes() + 1, char);
ox_strncpy(cstr.get(), title.data(), title.bytes()); ox_strncpy(cstr.get(), title.data(), title.bytes());
glfwSetWindowTitle(gctx.window, cstr); glfwSetWindowTitle(gctx.window, cstr.get());
} }
void focusWindow(Context &ctx) noexcept { void focusWindow(Context &ctx) noexcept {