[nostalgia,studio] Make module handling consistent

This commit is contained in:
Gary Talent 2023-06-03 14:44:33 -05:00
parent 2874620bc6
commit ed169eb9b8
34 changed files with 257 additions and 209 deletions

View File

@ -1,22 +1,35 @@
add_library( add_library(
NostalgiaAppModules OBJECT NostalgiaKeelModules OBJECT
appmodules.cpp keelmodules.cpp
) )
if(NOT MSVC)
target_compile_options(NostalgiaAppModules PRIVATE -Wsign-conversion)
endif()
target_link_libraries( target_link_libraries(
NostalgiaAppModules PUBLIC NostalgiaKeelModules PUBLIC
Keel Keel
NostalgiaCore NostalgiaCore
NostalgiaScene NostalgiaScene
) )
if(NOT MSVC)
target_compile_options(NostalgiaKeelModules PRIVATE -Wsign-conversion)
endif()
install( install(
FILES FILES
appmodules.hpp keelmodules.hpp
DESTINATION DESTINATION
include/nostalgia/appmodules include/nostalgia/appmodules
) )
if(NOSTALGIA_BUILD_TYPE STREQUAL "Native")
add_library(
NostalgiaStudioModules
studiomodules.cpp
)
target_link_libraries(
NostalgiaStudioModules PUBLIC
StudioAppLib
NostalgiaCore-Studio
NostalgiaScene-Studio
)
if(NOT MSVC)
target_compile_options(NostalgiaStudioModules PRIVATE -Wsign-conversion)
endif()
endif()

View File

@ -1,22 +0,0 @@
/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include <keel/module.hpp>
#include <nostalgia/core/module.hpp>
#include <nostalgia/scene/scenemodule.hpp>
namespace nostalgia {
static bool modulesLoaded = false;
void loadModules() noexcept {
if (modulesLoaded) {
return;
}
keel::registerModule(core::module());
keel::registerModule(scene::module());
modulesLoaded = true;
}
}

View File

@ -0,0 +1,22 @@
/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include <keel/module.hpp>
#include <nostalgia/core/keelmodule.hpp>
#include <nostalgia/scene/keelmodule.hpp>
namespace nostalgia {
static bool modulesRegistered = false;
void registerKeelModules() noexcept {
if (modulesRegistered) {
return;
}
keel::registerModule(core::keelModule());
keel::registerModule(scene::keelModule());
modulesRegistered = true;
}
}

View File

@ -6,6 +6,6 @@
namespace nostalgia { namespace nostalgia {
void loadModules() noexcept; void registerKeelModules() noexcept;
} }

View File

@ -0,0 +1,24 @@
/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include <keel/module.hpp>
#include <studioapp/studioapp.hpp>
#include <nostalgia/core/studio/studiomodule.hpp>
#include <nostalgia/scene/studio/studiomodule.hpp>
namespace nostalgia {
static bool modulesRegistered = false;
void registerStudioModules() noexcept {
if (modulesRegistered) {
return;
}
studio::registerModule(core::studioModule());
studio::registerModule(scene::studioModule());
modulesRegistered = true;
}
}

View File

@ -0,0 +1,11 @@
/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#pragma once
namespace nostalgia {
void registerStudioModules() noexcept;
}

View File

@ -2,7 +2,7 @@ add_library(
NostalgiaCore NostalgiaCore
context.cpp context.cpp
gfx.cpp gfx.cpp
module.cpp keelmodule.cpp
tilesheet.cpp tilesheet.cpp
typeconv.cpp typeconv.cpp
) )

View File

@ -0,0 +1,71 @@
/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include <ox/model/model.hpp>
#include <keel/asset.hpp>
#include <keel/module.hpp>
#include "gfx.hpp"
#include "typeconv.hpp"
#include "keelmodule.hpp"
namespace nostalgia::core {
class CoreModule: public keel::Module {
private:
NostalgiaPaletteToPaletteConverter nostalgiaPaletteToPaletteConverter;
TileSheetV1ToTileSheetConverter nostalgiaGraphicToTileSheetConverter;
TileSheetToCompactTileSheetConverter tileSheetToCompactTileSheetConverter;
TileSheetV2ToTileSheetConverter tileSheetV2ToTileSheetConverter;
public:
[[nodiscard]]
ox::Vector<keel::TypeDescGenerator> types() const noexcept final {
return {
keel::generateTypeDesc<TileSheetV1>,
keel::generateTypeDesc<TileSheetV2>,
keel::generateTypeDesc<TileSheet>,
keel::generateTypeDesc<CompactTileSheet>,
keel::generateTypeDesc<NostalgiaPalette>,
keel::generateTypeDesc<Palette>,
};
}
[[nodiscard]]
ox::Vector<const keel::BaseConverter*> converters() const noexcept final {
return {
&nostalgiaPaletteToPaletteConverter,
&nostalgiaGraphicToTileSheetConverter,
&tileSheetToCompactTileSheetConverter,
&tileSheetV2ToTileSheetConverter,
};
}
[[nodiscard]]
ox::Vector<keel::PackTransform> packTransforms() const noexcept final {
return {
// convert tilesheets to CompactTileSheets
[](keel::Context *ctx, ox::Buffer *buff) -> ox::Error {
oxRequire(hdr, keel::readAssetHeader(*buff));
const auto typeId = ox::buildTypeId(hdr.clawHdr.typeName, hdr.clawHdr.typeVersion, hdr.clawHdr.typeParams);
if (typeId == ox::buildTypeId<TileSheetV1>() ||
typeId == ox::buildTypeId<TileSheetV2>() ||
typeId == ox::buildTypeId<TileSheet>()) {
oxReturnError(keel::convertBuffToBuff<core::CompactTileSheet>(
ctx, *buff, ox::ClawFormat::Metal).moveTo(buff));
}
return {};
},
};
}
};
static CoreModule mod;
const keel::Module *keelModule() noexcept {
return &mod;
}
}

View File

@ -8,6 +8,6 @@
namespace nostalgia::core { namespace nostalgia::core {
const keel::Module *module() noexcept; const keel::Module *keelModule() noexcept;
} }

View File

@ -1,77 +0,0 @@
/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include <ox/model/model.hpp>
#include <keel/asset.hpp>
#include <keel/module.hpp>
#include "gfx.hpp"
#include "typeconv.hpp"
#include "module.hpp"
namespace nostalgia::core {
class CoreModule: public keel::Module {
private:
NostalgiaPaletteToPaletteConverter nostalgiaPaletteToPaletteConverter;
TileSheetV1ToTileSheetConverter nostalgiaGraphicToTileSheetConverter;
TileSheetToCompactTileSheetConverter tileSheetToCompactTileSheetConverter;
TileSheetV2ToTileSheetConverter tileSheetV2ToTileSheetConverter;
public:
static CoreModule mod;
[[nodiscard]]
ox::Vector<keel::TypeDescGenerator> types() const noexcept override;
[[nodiscard]]
ox::Vector<const keel::BaseConverter*> converters() const noexcept override;
[[nodiscard]]
ox::Vector<keel::PackTransform> packTransforms() const noexcept override;
};
CoreModule CoreModule::mod;
const keel::Module *module() noexcept {
return &CoreModule::mod;
}
ox::Vector<keel::TypeDescGenerator> CoreModule::types() const noexcept {
return {
keel::generateTypeDesc<TileSheetV1>,
keel::generateTypeDesc<TileSheetV2>,
keel::generateTypeDesc<TileSheet>,
keel::generateTypeDesc<CompactTileSheet>,
keel::generateTypeDesc<NostalgiaPalette>,
keel::generateTypeDesc<Palette>,
};
}
ox::Vector<const keel::BaseConverter*> CoreModule::converters() const noexcept {
return {
&nostalgiaPaletteToPaletteConverter,
&nostalgiaGraphicToTileSheetConverter,
&tileSheetToCompactTileSheetConverter,
&tileSheetV2ToTileSheetConverter,
};
}
ox::Vector<keel::PackTransform> CoreModule::packTransforms() const noexcept {
return {
// convert tilesheets to CompactTileSheets
[](keel::Context *ctx, ox::Buffer *buff) -> ox::Error {
oxRequire(hdr, keel::readAssetHeader(*buff));
const auto typeId = ox::buildTypeId(hdr.clawHdr.typeName, hdr.clawHdr.typeVersion, hdr.clawHdr.typeParams);
if (typeId == ox::buildTypeId<TileSheetV1>() ||
typeId == ox::buildTypeId<TileSheetV2>() ||
typeId == ox::buildTypeId<TileSheet>()) {
oxReturnError(keel::convertBuffToBuff<core::CompactTileSheet>(
ctx, *buff, ox::ClawFormat::Metal).moveTo(buff));
}
return {};
},
};
}
}

View File

@ -1,6 +1,6 @@
add_library( add_library(
NostalgiaCore-Studio OBJECT NostalgiaCore-Studio OBJECT
module.cpp studiomodule.cpp
paletteeditor.cpp paletteeditor.cpp
paletteeditor-imgui.cpp paletteeditor-imgui.cpp
tilesheeteditor-imgui.cpp tilesheeteditor-imgui.cpp

View File

@ -1,17 +0,0 @@
/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#pragma once
#include <studio/studio.hpp>
namespace nostalgia::core {
class StudioModule: public studio::Module {
public:
ox::Vector<studio::EditorMaker> editors(turbine::Context *ctx) noexcept override;
ox::Vector<ox::UniquePtr<studio::ItemMaker>> itemMakers(turbine::Context*) noexcept override;
};
}

View File

@ -7,11 +7,17 @@
#include "paletteeditor-imgui.hpp" #include "paletteeditor-imgui.hpp"
#include "tilesheeteditor-imgui.hpp" #include "tilesheeteditor-imgui.hpp"
#include "module.hpp" #include "studiomodule.hpp"
namespace nostalgia::core { namespace nostalgia::core {
ox::Vector<studio::EditorMaker> StudioModule::editors(turbine::Context *ctx) noexcept { class StudioModule: public studio::Module {
public:
ox::Vector<studio::EditorMaker> editors(turbine::Context *ctx) const noexcept override;
ox::Vector<ox::UniquePtr<studio::ItemMaker>> itemMakers(turbine::Context*) const noexcept override;
};
ox::Vector<studio::EditorMaker> StudioModule::editors(turbine::Context *ctx) const noexcept {
return { return {
{ {
{FileExt_ng}, {FileExt_ng},
@ -32,11 +38,16 @@ ox::Vector<studio::EditorMaker> StudioModule::editors(turbine::Context *ctx) noe
}; };
} }
ox::Vector<ox::UniquePtr<studio::ItemMaker>> StudioModule::itemMakers(turbine::Context*) noexcept { ox::Vector<ox::UniquePtr<studio::ItemMaker>> StudioModule::itemMakers(turbine::Context*) const noexcept {
ox::Vector<ox::UniquePtr<studio::ItemMaker>> out; ox::Vector<ox::UniquePtr<studio::ItemMaker>> out;
out.emplace_back(ox::make<studio::ItemMakerT<core::TileSheet>>("Tile Sheet", "TileSheets", "ng")); out.emplace_back(ox::make<studio::ItemMakerT<core::TileSheet>>("Tile Sheet", "TileSheets", "ng"));
out.emplace_back(ox::make<studio::ItemMakerT<core::Palette>>("Palette", "Palettes", "npal")); out.emplace_back(ox::make<studio::ItemMakerT<core::Palette>>("Palette", "Palettes", "npal"));
return out; return out;
} }
static StudioModule mod;
const studio::Module *studioModule() noexcept {
return &mod;
}
} }

View File

@ -0,0 +1,13 @@
/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#pragma once
#include <studio/studio.hpp>
namespace nostalgia::core {
const studio::Module *studioModule() noexcept;
}

View File

@ -22,7 +22,7 @@ endif()
target_link_libraries( target_link_libraries(
nostalgia nostalgia
NostalgiaAppModules NostalgiaKeelModules
OxLogConn OxLogConn
) )

View File

@ -8,7 +8,7 @@
#include <nostalgia/core/core.hpp> #include <nostalgia/core/core.hpp>
#include <nostalgia/appmodules/appmodules.hpp> #include <nostalgia/appmodules/keelmodules.hpp>
#include "app.hpp" #include "app.hpp"
@ -17,7 +17,7 @@ static ox::Error run(int argc, const char **argv) noexcept {
#ifdef OX_USE_STDLIB #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::loadModules(); nostalgia::registerKeelModules();
#endif #endif
if (argc < 2) { if (argc < 2) {
oxErr("Please provide path to project directory or OxFS file.\n"); oxErr("Please provide path to project directory or OxFS file.\n");

View File

@ -3,7 +3,7 @@ add_library(
NostalgiaScene NostalgiaScene
scene.cpp scene.cpp
scenestatic.cpp scenestatic.cpp
scenemodule.cpp keelmodule.cpp
typeconv.cpp typeconv.cpp
) )
@ -15,7 +15,7 @@ target_link_libraries(
install( install(
FILES FILES
scenestatic.hpp scenestatic.hpp
scenemodule.hpp keelmodule.hpp
typeconv.hpp typeconv.hpp
DESTINATION DESTINATION
include/nostalgia/scene include/nostalgia/scene

View File

@ -2,12 +2,10 @@
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved. * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/ */
#include <ox/model/model.hpp>
#include "scenestatic.hpp" #include "scenestatic.hpp"
#include "typeconv.hpp" #include "typeconv.hpp"
#include "scenemodule.hpp" #include "keelmodule.hpp"
namespace nostalgia::scene { namespace nostalgia::scene {
@ -41,7 +39,7 @@ class SceneModule: public keel::Module {
}; };
static SceneModule mod; static SceneModule mod;
const keel::Module *module() noexcept { const keel::Module *keelModule() noexcept {
return &mod; return &mod;
} }

View File

@ -8,6 +8,6 @@
namespace nostalgia::scene { namespace nostalgia::scene {
const keel::Module *module() noexcept; const keel::Module *keelModule() noexcept;
} }

View File

@ -1,6 +1,6 @@
add_library( add_library(
NostalgiaScene-Studio OBJECT NostalgiaScene-Studio OBJECT
module.cpp studiomodule.cpp
sceneeditor-imgui.cpp sceneeditor-imgui.cpp
sceneeditor.cpp sceneeditor.cpp
sceneeditorview.cpp sceneeditorview.cpp

View File

@ -1,18 +0,0 @@
/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#pragma once
#include <turbine/turbine.hpp>
#include <studio/studio.hpp>
namespace nostalgia::scene {
class StudioModule: public studio::Module {
public:
ox::Vector<studio::EditorMaker> editors(turbine::Context *ctx) noexcept override;
ox::Vector<ox::UPtr<studio::ItemMaker>> itemMakers(turbine::Context*) noexcept override;
};
}

View File

@ -3,11 +3,17 @@
*/ */
#include "sceneeditor-imgui.hpp" #include "sceneeditor-imgui.hpp"
#include "module.hpp" #include "studiomodule.hpp"
namespace nostalgia::scene { namespace nostalgia::scene {
ox::Vector<studio::EditorMaker> StudioModule::editors(turbine::Context *ctx) noexcept { class StudioModule: public studio::Module {
public:
ox::Vector<studio::EditorMaker> editors(turbine::Context *ctx) const noexcept override;
ox::Vector<ox::UPtr<studio::ItemMaker>> itemMakers(turbine::Context*) const noexcept override;
};
ox::Vector<studio::EditorMaker> StudioModule::editors(turbine::Context *ctx) const noexcept {
return { return {
{ {
{"nscn"}, {"nscn"},
@ -18,9 +24,14 @@ ox::Vector<studio::EditorMaker> StudioModule::editors(turbine::Context *ctx) noe
}; };
} }
ox::Vector<ox::UPtr<studio::ItemMaker>> StudioModule::itemMakers(turbine::Context*) noexcept { ox::Vector<ox::UPtr<studio::ItemMaker>> StudioModule::itemMakers(turbine::Context*) const noexcept {
ox::Vector<ox::UPtr<studio::ItemMaker>> out; ox::Vector<ox::UPtr<studio::ItemMaker>> out;
return out; return out;
} }
static StudioModule mod;
const studio::Module *studioModule() noexcept {
return &mod;
}
} }

View File

@ -0,0 +1,14 @@
/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#pragma once
#include <turbine/turbine.hpp>
#include <studio/studio.hpp>
namespace nostalgia::scene {
const studio::Module *studioModule() noexcept;
}

View File

@ -7,9 +7,8 @@ add_executable(
target_link_libraries( target_link_libraries(
nostalgia-studio nostalgia-studio
NostalgiaAppModules NostalgiaStudioModules
NostalgiaCore-Studio NostalgiaKeelModules
NostalgiaScene-Studio
StudioAppLib StudioAppLib
) )

View File

@ -2,27 +2,13 @@
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved. * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/ */
#include <ox/std/memory.hpp> #include <nostalgia/appmodules/keelmodules.hpp>
#include <nostalgia/appmodules/studiomodules.hpp>
#include <nostalgia/appmodules/appmodules.hpp>
#include <nostalgia/core/studio/module.hpp>
#include <nostalgia/scene/studio/module.hpp>
#include <studioapp/studioapp.hpp> #include <studioapp/studioapp.hpp>
using namespace nostalgia;
[[maybe_unused]] // GCC warns about the existence of this "unused" inline list in a header file...
ox::Vector<std::function<ox::UPtr<studio::Module>()>> BuiltinModules = {
[]() -> ox::UPtr<studio::Module> {
return ox::UPtr<studio::Module>(new core::StudioModule());
},
[]() -> ox::UPtr<studio::Module> {
return ox::UPtr<studio::Module>(new scene::StudioModule());
},
};
int main(int argc, const char **argv) { int main(int argc, const char **argv) {
nostalgia::loadModules(); nostalgia::registerKeelModules();
nostalgia::registerStudioModules();
return studio::main("Nostalgia Studio", ".nostalgia", argc, argv); return studio::main("Nostalgia Studio", ".nostalgia", argc, argv);
} }

View File

@ -5,7 +5,7 @@ target_link_libraries(
OxClArgs OxClArgs
OxLogConn OxLogConn
Keel Keel
NostalgiaAppModules NostalgiaKeelModules
) )
if(CMAKE_BUILD_TYPE STREQUAL "Release" AND NOT WIN32) if(CMAKE_BUILD_TYPE STREQUAL "Release" AND NOT WIN32)

View File

@ -10,7 +10,7 @@
#include <keel/keel.hpp> #include <keel/keel.hpp>
#include <nostalgia/appmodules/appmodules.hpp> #include <nostalgia/appmodules/keelmodules.hpp>
using namespace nostalgia; using namespace nostalgia;
@ -52,7 +52,7 @@ 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 {
loadModules(); 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 == "") {

View File

@ -6,12 +6,16 @@
#include <ox/std/string.hpp> #include <ox/std/string.hpp>
#include <studio/module.hpp>
namespace studio { namespace studio {
void registerModule(const studio::Module*) noexcept;
int main( int main(
const char *appName, const char *appName,
ox::String projectDataDir, ox::String projectDataDir,
[[maybe_unused]] int argc, int argc,
[[maybe_unused]] const char **argv); const char **argv);
} }

View File

@ -1,5 +1,3 @@
set(CMAKE_INCLUDE_CURRENT_DIR ON)
add_library( add_library(
StudioAppLib StudioAppLib
aboutpopup.cpp aboutpopup.cpp

View File

@ -10,8 +10,6 @@
#include <keel/media.hpp> #include <keel/media.hpp>
#include <turbine/turbine.hpp> #include <turbine/turbine.hpp>
#include <nostalgia/appmodules/appmodules.hpp>
#include <studio/context.hpp> #include <studio/context.hpp>
#include "studioapp.hpp" #include "studioapp.hpp"
@ -65,8 +63,8 @@ namespace studio {
int main( int main(
const char *appName, const char *appName,
ox::String projectDataDir, ox::String projectDataDir,
[[maybe_unused]] int argc, int,
[[maybe_unused]] const char **argv) { const char **) {
#ifdef DEBUG #ifdef DEBUG
ox::LoggerConn loggerConn; ox::LoggerConn loggerConn;
const auto loggerErr = loggerConn.initConn(appName); const auto loggerErr = loggerConn.initConn(appName);

View File

@ -13,6 +13,8 @@
#include "filedialogmanager.hpp" #include "filedialogmanager.hpp"
#include "studioapp.hpp" #include "studioapp.hpp"
ox::Vector<const studio::Module*> modules;
struct StudioConfig { struct StudioConfig {
static constexpr auto TypeName = "net.drinkingtea.studio.StudioConfig"; static constexpr auto TypeName = "net.drinkingtea.studio.StudioConfig";
static constexpr auto TypeVersion = 1; static constexpr auto TypeVersion = 1;
@ -246,7 +248,7 @@ void StudioUI::loadEditorMaker(const studio::EditorMaker &editorMaker) noexcept
} }
} }
void StudioUI::loadModule(studio::Module *mod) noexcept { void StudioUI::loadModule(const studio::Module *mod) noexcept {
for (const auto &editorMaker : mod->editors(m_ctx)) { for (const auto &editorMaker : mod->editors(m_ctx)) {
loadEditorMaker(editorMaker); loadEditorMaker(editorMaker);
} }
@ -256,9 +258,8 @@ void StudioUI::loadModule(studio::Module *mod) noexcept {
} }
void StudioUI::loadModules() noexcept { void StudioUI::loadModules() noexcept {
for (auto &moduleMaker : BuiltinModules) { for (auto &mod : modules) {
const auto mod = moduleMaker(); loadModule(mod);
loadModule(mod.get());
} }
} }
@ -369,3 +370,11 @@ ox::Error StudioUI::closeFile(const ox::String &path) noexcept {
}); });
return OxError(0); return OxError(0);
} }
namespace studio {
void registerModule(const studio::Module *mod) noexcept {
modules.emplace_back(mod);
}
}

View File

@ -65,7 +65,7 @@ class StudioUI: public ox::SignalHandler {
void loadEditorMaker(const studio::EditorMaker &editorMaker) noexcept; void loadEditorMaker(const studio::EditorMaker &editorMaker) noexcept;
void loadModule(studio::Module *mod) noexcept; void loadModule(const studio::Module *mod) noexcept;
void loadModules() noexcept; void loadModules() noexcept;

View File

@ -25,9 +25,9 @@ class Module {
public: public:
virtual ~Module() noexcept = default; virtual ~Module() noexcept = default;
virtual ox::Vector<EditorMaker> editors(turbine::Context *ctx); virtual ox::Vector<EditorMaker> editors(turbine::Context *ctx) const;
virtual ox::Vector<ox::UniquePtr<ItemMaker>> itemMakers(turbine::Context*); virtual ox::Vector<ox::UniquePtr<ItemMaker>> itemMakers(turbine::Context*) const;
}; };

View File

@ -6,11 +6,11 @@
namespace studio { namespace studio {
ox::Vector<EditorMaker> Module::editors(turbine::Context*) { ox::Vector<EditorMaker> Module::editors(turbine::Context*) const {
return {}; return {};
} }
ox::Vector<ox::UniquePtr<ItemMaker>> Module::itemMakers(turbine::Context*) { ox::Vector<ox::UniquePtr<ItemMaker>> Module::itemMakers(turbine::Context*) const {
return {}; return {};
} }