enginefs replaced with EnginePaths class + command line arguments
This commit is contained in:
@@ -2,14 +2,15 @@
|
|||||||
#include "Assets.h"
|
#include "Assets.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <filesystem>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "../constants.h"
|
#include "../constants.h"
|
||||||
|
|
||||||
|
using std::filesystem::path;
|
||||||
using std::unique_ptr;
|
using std::unique_ptr;
|
||||||
|
|
||||||
AssetsLoader::AssetsLoader(Assets* assets) : assets(assets) {
|
AssetsLoader::AssetsLoader(Assets* assets, path resdir)
|
||||||
|
: assets(assets), resdir(resdir) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetsLoader::addLoader(int tag, aloader_func func) {
|
void AssetsLoader::addLoader(int tag, aloader_func func) {
|
||||||
@@ -105,12 +106,17 @@ void AssetsLoader::createDefaults(AssetsLoader& loader) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AssetsLoader::addDefaults(AssetsLoader& loader) {
|
void AssetsLoader::addDefaults(AssetsLoader& loader) {
|
||||||
loader.add(ASSET_SHADER, SHADERS_FOLDER"/main", "main");
|
path resdir = loader.getDirectory();
|
||||||
loader.add(ASSET_SHADER, SHADERS_FOLDER"/lines", "lines");
|
loader.add(ASSET_SHADER, resdir/path(SHADERS_FOLDER"/main"), "main");
|
||||||
loader.add(ASSET_SHADER, SHADERS_FOLDER"/ui", "ui");
|
loader.add(ASSET_SHADER, resdir/path(SHADERS_FOLDER"/lines"), "lines");
|
||||||
|
loader.add(ASSET_SHADER, resdir/path(SHADERS_FOLDER"/ui"), "ui");
|
||||||
|
|
||||||
loader.add(ASSET_ATLAS, TEXTURES_FOLDER"/blocks", "blocks");
|
loader.add(ASSET_ATLAS, resdir/path(TEXTURES_FOLDER"/blocks"), "blocks");
|
||||||
loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/menubg.png", "menubg");
|
loader.add(ASSET_TEXTURE, resdir/path(TEXTURES_FOLDER"/menubg.png"), "menubg");
|
||||||
|
|
||||||
loader.add(ASSET_FONT, FONTS_FOLDER"/font", "normal");
|
loader.add(ASSET_FONT, resdir/path(FONTS_FOLDER"/font"), "normal");
|
||||||
|
}
|
||||||
|
|
||||||
|
path AssetsLoader::getDirectory() const {
|
||||||
|
return resdir;
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <filesystem>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
@@ -25,8 +26,9 @@ class AssetsLoader {
|
|||||||
Assets* assets;
|
Assets* assets;
|
||||||
std::map<int, aloader_func> loaders;
|
std::map<int, aloader_func> loaders;
|
||||||
std::queue<aloader_entry> entries;
|
std::queue<aloader_entry> entries;
|
||||||
|
std::filesystem::path resdir;
|
||||||
public:
|
public:
|
||||||
AssetsLoader(Assets* assets);
|
AssetsLoader(Assets* assets, std::filesystem::path resdir);
|
||||||
void addLoader(int tag, aloader_func func);
|
void addLoader(int tag, aloader_func func);
|
||||||
void add(int tag, const std::string filename, const std::string alias);
|
void add(int tag, const std::string filename, const std::string alias);
|
||||||
|
|
||||||
@@ -35,6 +37,8 @@ public:
|
|||||||
|
|
||||||
static void createDefaults(AssetsLoader& loader);
|
static void createDefaults(AssetsLoader& loader);
|
||||||
static void addDefaults(AssetsLoader& loader);
|
static void addDefaults(AssetsLoader& loader);
|
||||||
|
|
||||||
|
std::filesystem::path getDirectory() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ASSETS_ASSETS_LOADER_H
|
#endif // ASSETS_ASSETS_LOADER_H
|
||||||
|
|||||||
+3
-5
@@ -18,10 +18,8 @@ inline uint vox_index(int x, int y, int z, int w=CHUNK_W, int d=CHUNK_D) {
|
|||||||
return (y * d + z) * w + x;
|
return (y * d + z) * w + x;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define RES_FLODER "res/"
|
#define SHADERS_FOLDER "shaders"
|
||||||
|
#define TEXTURES_FOLDER "textures"
|
||||||
#define SHADERS_FOLDER "res/shaders"
|
#define FONTS_FOLDER "fonts"
|
||||||
#define TEXTURES_FOLDER "res/textures"
|
|
||||||
#define FONTS_FOLDER "res/fonts"
|
|
||||||
|
|
||||||
#endif // SRC_CONSTANTS_H_
|
#endif // SRC_CONSTANTS_H_
|
||||||
|
|||||||
+9
-5
@@ -23,7 +23,7 @@
|
|||||||
#include "coders/json.h"
|
#include "coders/json.h"
|
||||||
#include "coders/png.h"
|
#include "coders/png.h"
|
||||||
#include "files/files.h"
|
#include "files/files.h"
|
||||||
#include "files/engine_files.h"
|
#include "files/engine_paths.h"
|
||||||
|
|
||||||
using std::unique_ptr;
|
using std::unique_ptr;
|
||||||
using std::shared_ptr;
|
using std::shared_ptr;
|
||||||
@@ -32,13 +32,13 @@ using std::filesystem::path;
|
|||||||
using glm::vec3;
|
using glm::vec3;
|
||||||
using gui::GUI;
|
using gui::GUI;
|
||||||
|
|
||||||
Engine::Engine(EngineSettings& settings, Content* content)
|
Engine::Engine(EngineSettings& settings, EnginePaths* paths, Content* content)
|
||||||
: settings(settings), content(content) {
|
: settings(settings), content(content), paths(paths) {
|
||||||
Window::initialize(settings.display);
|
Window::initialize(settings.display);
|
||||||
|
|
||||||
assets = new Assets();
|
assets = new Assets();
|
||||||
std::cout << "-- loading assets" << std::endl;
|
std::cout << "-- loading assets" << std::endl;
|
||||||
AssetsLoader loader(assets);
|
AssetsLoader loader(assets, paths->getResources());
|
||||||
AssetsLoader::createDefaults(loader);
|
AssetsLoader::createDefaults(loader);
|
||||||
AssetsLoader::addDefaults(loader);
|
AssetsLoader::addDefaults(loader);
|
||||||
while (loader.hasNext()) {
|
while (loader.hasNext()) {
|
||||||
@@ -64,7 +64,7 @@ void Engine::updateHotkeys() {
|
|||||||
if (Events::jpressed(keycode::F2)) {
|
if (Events::jpressed(keycode::F2)) {
|
||||||
unique_ptr<ImageData> image(Window::takeScreenshot());
|
unique_ptr<ImageData> image(Window::takeScreenshot());
|
||||||
image->flipY();
|
image->flipY();
|
||||||
path filename = enginefs::get_screenshot_file("png");
|
path filename = paths->getScreenshotFile("png");
|
||||||
png::write_image(filename.string(), image.get());
|
png::write_image(filename.string(), image.get());
|
||||||
std::cout << "saved screenshot as " << filename << std::endl;
|
std::cout << "saved screenshot as " << filename << std::endl;
|
||||||
}
|
}
|
||||||
@@ -128,3 +128,7 @@ void Engine::setScreen(shared_ptr<Screen> screen) {
|
|||||||
const Content* Engine::getContent() const {
|
const Content* Engine::getContent() const {
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EnginePaths* Engine::getPaths() {
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
+4
-2
@@ -11,6 +11,7 @@ class Assets;
|
|||||||
class Level;
|
class Level;
|
||||||
class Screen;
|
class Screen;
|
||||||
class Content;
|
class Content;
|
||||||
|
class EnginePaths;
|
||||||
|
|
||||||
namespace gui {
|
namespace gui {
|
||||||
class GUI;
|
class GUI;
|
||||||
@@ -26,6 +27,7 @@ class Engine {
|
|||||||
std::shared_ptr<Screen> screen = nullptr;
|
std::shared_ptr<Screen> screen = nullptr;
|
||||||
EngineSettings& settings;
|
EngineSettings& settings;
|
||||||
Content* content;
|
Content* content;
|
||||||
|
EnginePaths* paths;
|
||||||
|
|
||||||
uint64_t frame = 0;
|
uint64_t frame = 0;
|
||||||
double lastTime = 0.0;
|
double lastTime = 0.0;
|
||||||
@@ -33,7 +35,7 @@ class Engine {
|
|||||||
|
|
||||||
gui::GUI* gui;
|
gui::GUI* gui;
|
||||||
public:
|
public:
|
||||||
Engine(EngineSettings& settings, Content* content);
|
Engine(EngineSettings& settings, EnginePaths* paths, Content* content);
|
||||||
~Engine();
|
~Engine();
|
||||||
|
|
||||||
void updateTimers();
|
void updateTimers();
|
||||||
@@ -44,7 +46,7 @@ public:
|
|||||||
gui::GUI* getGUI();
|
gui::GUI* getGUI();
|
||||||
EngineSettings& getSettings();
|
EngineSettings& getSettings();
|
||||||
void setScreen(std::shared_ptr<Screen> screen);
|
void setScreen(std::shared_ptr<Screen> screen);
|
||||||
|
EnginePaths* getPaths();
|
||||||
const Content* getContent() const;
|
const Content* getContent() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
#include "engine_files.h"
|
|
||||||
|
|
||||||
#include <filesystem>
|
|
||||||
#include <sstream>
|
|
||||||
#include "../typedefs.h"
|
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
|
||||||
using std::string;
|
|
||||||
using fs::path;
|
|
||||||
|
|
||||||
path enginefs::get_screenshot_file(string ext) {
|
|
||||||
path folder = SCREENSHOTS_FOLDER;
|
|
||||||
if (!fs::is_directory(folder)) {
|
|
||||||
fs::create_directory(folder);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto t = std::time(nullptr);
|
|
||||||
auto tm = *std::localtime(&t);
|
|
||||||
|
|
||||||
const char* format = "%Y-%m-%d_%H-%M-%S";
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << std::put_time(&tm, format);
|
|
||||||
string datetimestr = ss.str();
|
|
||||||
|
|
||||||
path filename = folder/path("screenshot-"+datetimestr+"."+ext);
|
|
||||||
uint index = 0;
|
|
||||||
while (fs::exists(filename)) {
|
|
||||||
filename = folder/path("screenshot-"+datetimestr+"-"+std::to_string(index)+"."+ext);
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
return filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
path enginefs::get_worlds_folder() {
|
|
||||||
return path("worlds");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool enginefs::is_world_name_used(std::string name) {
|
|
||||||
return fs::exists(enginefs::get_worlds_folder()/fs::u8path(name));
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#ifndef FILES_ENGINE_FILES_H_
|
|
||||||
#define FILES_ENGINE_FILES_H_
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <filesystem>
|
|
||||||
|
|
||||||
#define SCREENSHOTS_FOLDER "screenshots"
|
|
||||||
|
|
||||||
namespace enginefs {
|
|
||||||
extern std::filesystem::path get_screenshot_file(std::string ext);
|
|
||||||
extern std::filesystem::path get_worlds_folder();
|
|
||||||
extern bool is_world_name_used(std::string name);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // FILES_ENGINE_FILES_H_
|
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
#include "gui/controls.h"
|
#include "gui/controls.h"
|
||||||
#include "screens.h"
|
#include "screens.h"
|
||||||
#include "../util/stringutil.h"
|
#include "../util/stringutil.h"
|
||||||
#include "../files/engine_files.h"
|
#include "../files/engine_paths.h"
|
||||||
#include "../world/World.h"
|
#include "../world/World.h"
|
||||||
#include "../window/Events.h"
|
#include "../window/Events.h"
|
||||||
#include "../window/Window.h"
|
#include "../window/Window.h"
|
||||||
@@ -42,6 +42,8 @@ inline Button* backButton(PagesControl* menu) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Panel* create_main_menu_panel(Engine* engine, PagesControl* menu) {
|
Panel* create_main_menu_panel(Engine* engine, PagesControl* menu) {
|
||||||
|
EnginePaths* paths = engine->getPaths();
|
||||||
|
|
||||||
Panel* panel = new Panel(vec2(400, 200), vec4(5.0f), 1.0f);
|
Panel* panel = new Panel(vec2(400, 200), vec4(5.0f), 1.0f);
|
||||||
panel->color(vec4(0.0f));
|
panel->color(vec4(0.0f));
|
||||||
|
|
||||||
@@ -50,7 +52,7 @@ Panel* create_main_menu_panel(Engine* engine, PagesControl* menu) {
|
|||||||
Panel* worldsPanel = new Panel(vec2(390, 200), vec4(5.0f));
|
Panel* worldsPanel = new Panel(vec2(390, 200), vec4(5.0f));
|
||||||
worldsPanel->color(vec4(0.1f));
|
worldsPanel->color(vec4(0.1f));
|
||||||
worldsPanel->maxLength(400);
|
worldsPanel->maxLength(400);
|
||||||
path worldsFolder = enginefs::get_worlds_folder();
|
path worldsFolder = paths->getWorldsFolder();
|
||||||
if (std::filesystem::is_directory(worldsFolder)) {
|
if (std::filesystem::is_directory(worldsFolder)) {
|
||||||
for (auto const& entry : directory_iterator(worldsFolder)) {
|
for (auto const& entry : directory_iterator(worldsFolder)) {
|
||||||
if (!entry.is_directory()) {
|
if (!entry.is_directory()) {
|
||||||
@@ -60,10 +62,10 @@ Panel* create_main_menu_panel(Engine* engine, PagesControl* menu) {
|
|||||||
Button* button = new Button(util::str2wstr_utf8(name),
|
Button* button = new Button(util::str2wstr_utf8(name),
|
||||||
vec4(10.0f, 8.0f, 10.0f, 8.0f));
|
vec4(10.0f, 8.0f, 10.0f, 8.0f));
|
||||||
button->color(vec4(0.5f));
|
button->color(vec4(0.5f));
|
||||||
button->listenAction([engine, panel, name](GUI*) {
|
button->listenAction([=](GUI*) {
|
||||||
EngineSettings& settings = engine->getSettings();
|
EngineSettings& settings = engine->getSettings();
|
||||||
|
|
||||||
auto folder = enginefs::get_worlds_folder()/u8path(name);
|
auto folder = paths->getWorldsFolder()/u8path(name);
|
||||||
World* world = new World(name, folder, 42, settings);
|
World* world = new World(name, folder, 42, settings);
|
||||||
auto screen = new LevelScreen(engine,
|
auto screen = new LevelScreen(engine,
|
||||||
world->load(settings, engine->getContent()));
|
world->load(settings, engine->getContent()));
|
||||||
@@ -117,10 +119,11 @@ Panel* create_new_world_panel(Engine* engine, PagesControl* menu) {
|
|||||||
button->listenAction([=](GUI*) {
|
button->listenAction([=](GUI*) {
|
||||||
wstring name = worldNameInput->text();
|
wstring name = worldNameInput->text();
|
||||||
string nameutf8 = util::wstr2str_utf8(name);
|
string nameutf8 = util::wstr2str_utf8(name);
|
||||||
|
EnginePaths* paths = engine->getPaths();
|
||||||
|
|
||||||
// Basic validation
|
// Basic validation
|
||||||
if (!util::is_valid_filename(name) ||
|
if (!util::is_valid_filename(name) ||
|
||||||
enginefs::is_world_name_used(nameutf8)) {
|
paths->isWorldNameUsed(nameutf8)) {
|
||||||
// blink red two times
|
// blink red two times
|
||||||
panel->listenInterval(0.1f, [worldNameInput, basecolor]() {
|
panel->listenInterval(0.1f, [worldNameInput, basecolor]() {
|
||||||
static bool flag = true;
|
static bool flag = true;
|
||||||
@@ -151,7 +154,7 @@ Panel* create_new_world_panel(Engine* engine, PagesControl* menu) {
|
|||||||
|
|
||||||
EngineSettings& settings = engine->getSettings();
|
EngineSettings& settings = engine->getSettings();
|
||||||
|
|
||||||
auto folder = enginefs::get_worlds_folder()/u8path(nameutf8);
|
auto folder = paths->getWorldsFolder()/u8path(nameutf8);
|
||||||
std::filesystem::create_directories(folder);
|
std::filesystem::create_directories(folder);
|
||||||
World* world = new World(nameutf8, folder, seed, settings);
|
World* world = new World(nameutf8, folder, seed, settings);
|
||||||
auto screen = new LevelScreen(engine, world->load(settings, engine->getContent()));
|
auto screen = new LevelScreen(engine, world->load(settings, engine->getContent()));
|
||||||
|
|||||||
+10
-3
@@ -11,13 +11,20 @@
|
|||||||
#include "coders/toml.h"
|
#include "coders/toml.h"
|
||||||
#include "files/files.h"
|
#include "files/files.h"
|
||||||
#include "files/settings_io.h"
|
#include "files/settings_io.h"
|
||||||
|
#include "files/engine_paths.h"
|
||||||
#include "content/Content.h"
|
#include "content/Content.h"
|
||||||
|
|
||||||
#include "coders/png.h"
|
#include "coders/png.h"
|
||||||
#include "graphics/Atlas.h"
|
#include "graphics/Atlas.h"
|
||||||
#include "graphics/ImageData.h"
|
#include "graphics/ImageData.h"
|
||||||
|
|
||||||
int main() {
|
#include "util/command_line.h"
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
EnginePaths paths;
|
||||||
|
if (!parse_cmdline(argc, argv, paths))
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
|
||||||
platform::configure_encoding();
|
platform::configure_encoding();
|
||||||
ContentBuilder contentBuilder;
|
ContentBuilder contentBuilder;
|
||||||
setup_definitions(&contentBuilder);
|
setup_definitions(&contentBuilder);
|
||||||
@@ -35,7 +42,7 @@ int main() {
|
|||||||
toml::Reader reader(&wrapper, settings_file.string(), content);
|
toml::Reader reader(&wrapper, settings_file.string(), content);
|
||||||
reader.read();
|
reader.read();
|
||||||
}
|
}
|
||||||
Engine engine(settings, content.get());
|
Engine engine(settings, &paths, content.get());
|
||||||
setup_bindings();
|
setup_bindings();
|
||||||
if (std::filesystem::is_regular_file(controls_file)) {
|
if (std::filesystem::is_regular_file(controls_file)) {
|
||||||
std::cout << "-- loading controls" << std::endl;
|
std::cout << "-- loading controls" << std::endl;
|
||||||
@@ -52,5 +59,5 @@ int main() {
|
|||||||
std::cerr << "could not to initialize engine" << std::endl;
|
std::cerr << "could not to initialize engine" << std::endl;
|
||||||
std::cerr << err.what() << std::endl;
|
std::cerr << err.what() << std::endl;
|
||||||
}
|
}
|
||||||
return 0;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user