clean up engine parameters and application classes

This commit is contained in:
2019-05-18 14:44:01 +07:00
parent 0ebb9bcfaf
commit c3f6f93d7e
10 changed files with 177 additions and 158 deletions

View File

@@ -28,7 +28,6 @@ namespace e2d
class dbgui; class dbgui;
class debug; class debug;
class deferrer; class deferrer;
class application;
class engine; class engine;
class mouse; class mouse;
class keyboard; class keyboard;

View File

@@ -10,115 +10,19 @@
namespace e2d namespace e2d
{ {
//
// application
//
class application : private noncopyable {
public:
virtual ~application() noexcept = default;
virtual bool initialize();
virtual void shutdown() noexcept;
virtual bool frame_tick();
virtual void frame_render();
};
using application_uptr = std::unique_ptr<application>;
//
// bad_engine_operation
//
class bad_engine_operation final : public exception {
public:
const char* what() const noexcept final {
return "bad engine operation";
}
};
// //
// engine // engine
// //
class engine final : public module<engine> { class engine final : public module<engine> {
public: public:
class debug_parameters { class application;
public: using application_uptr = std::unique_ptr<application>;
debug_parameters& log_filename(str_view value); public:
debug_parameters& file_logging(bool value) noexcept; class debug_parameters;
debug_parameters& console_logging(bool value) noexcept; class window_parameters;
class timer_parameters;
const str& log_filename() const noexcept; class parameters;
bool file_logging() const noexcept;
bool console_logging() const noexcept;
private:
str log_filename_{"log.txt"};
bool file_logging_{true};
bool console_logging_{true};
};
class window_parameters {
public:
window_parameters& caption(str_view value);
window_parameters& size(const v2u& value) noexcept;
window_parameters& vsync(bool value) noexcept;
window_parameters& fullscreen(bool value) noexcept;
const str& caption() const noexcept;
const v2u& size() const noexcept;
bool vsync() const noexcept;
bool fullscreen() const noexcept;
private:
str caption_{"Enduro2D"};
v2u size_{640, 480};
bool vsync_{false};
bool fullscreen_{false};
};
class timer_parameters {
public:
timer_parameters& minimal_framerate(u32 value) noexcept;
timer_parameters& maximal_framerate(u32 value) noexcept;
u32 minimal_framerate() const noexcept;
u32 maximal_framerate() const noexcept;
private:
u32 minimal_framerate_{30u};
u32 maximal_framerate_{1000u};
};
class parameters {
public:
parameters() = delete;
parameters(str_view game_name, str_view company_name);
parameters& game_name(str_view value);
parameters& company_name(str_view value);
parameters& without_graphics(bool value);
parameters& debug_params(const debug_parameters& value);
parameters& window_params(const window_parameters& value);
parameters& timer_params(const timer_parameters& value);
str& game_name() noexcept;
str& company_name() noexcept;
bool& without_graphics() noexcept;
debug_parameters& debug_params() noexcept;
window_parameters& window_params() noexcept;
timer_parameters& timer_params() noexcept;
const str& game_name() const noexcept;
const str& company_name() const noexcept;
const bool& without_graphics() const noexcept;
const debug_parameters& debug_params() const noexcept;
const window_parameters& window_params() const noexcept;
const timer_parameters& timer_params() const noexcept;
private:
str game_name_{"noname"};
str company_name_{"noname"};
bool without_graphics_{false};
debug_parameters debug_params_;
window_parameters window_params_;
timer_parameters timer_params_;
};
public: public:
engine(int argc, char *argv[], const parameters& params); engine(int argc, char *argv[], const parameters& params);
~engine() noexcept final; ~engine() noexcept final;
@@ -137,6 +41,114 @@ namespace e2d
class internal_state; class internal_state;
std::unique_ptr<internal_state> state_; std::unique_ptr<internal_state> state_;
}; };
//
// engine::application
//
class engine::application : private e2d::noncopyable {
public:
virtual ~application() noexcept = default;
virtual bool initialize();
virtual void shutdown() noexcept;
virtual bool frame_tick();
virtual void frame_render();
};
//
// engine::debug_parameters
//
class engine::debug_parameters {
public:
debug_parameters& log_filename(str_view value);
debug_parameters& file_logging(bool value) noexcept;
debug_parameters& console_logging(bool value) noexcept;
const str& log_filename() const noexcept;
bool file_logging() const noexcept;
bool console_logging() const noexcept;
private:
str log_filename_{"log.txt"};
bool file_logging_{true};
bool console_logging_{true};
};
//
// engine::window_parameters
//
class engine::window_parameters {
public:
window_parameters& caption(str_view value);
window_parameters& size(const v2u& value) noexcept;
window_parameters& vsync(bool value) noexcept;
window_parameters& fullscreen(bool value) noexcept;
const str& caption() const noexcept;
const v2u& size() const noexcept;
bool vsync() const noexcept;
bool fullscreen() const noexcept;
private:
str caption_{"Enduro2D"};
v2u size_{640, 480};
bool vsync_{false};
bool fullscreen_{false};
};
//
// engine::timer_parameters
//
class engine::timer_parameters {
public:
timer_parameters& minimal_framerate(u32 value) noexcept;
timer_parameters& maximal_framerate(u32 value) noexcept;
u32 minimal_framerate() const noexcept;
u32 maximal_framerate() const noexcept;
private:
u32 minimal_framerate_{30u};
u32 maximal_framerate_{1000u};
};
//
// engine::parameters
//
class engine::parameters {
public:
parameters() = delete;
parameters(str_view game_name, str_view company_name);
parameters& game_name(str_view value);
parameters& company_name(str_view value);
parameters& without_graphics(bool value);
parameters& debug_params(const debug_parameters& value);
parameters& window_params(const window_parameters& value);
parameters& timer_params(const timer_parameters& value);
str& game_name() noexcept;
str& company_name() noexcept;
bool& without_graphics() noexcept;
debug_parameters& debug_params() noexcept;
window_parameters& window_params() noexcept;
timer_parameters& timer_params() noexcept;
const str& game_name() const noexcept;
const str& company_name() const noexcept;
const bool& without_graphics() const noexcept;
const debug_parameters& debug_params() const noexcept;
const window_parameters& window_params() const noexcept;
const timer_parameters& timer_params() const noexcept;
private:
str game_name_{"noname"};
str company_name_{"noname"};
bool without_graphics_{false};
debug_parameters debug_params_;
window_parameters window_params_;
timer_parameters timer_params_;
};
} }
namespace e2d namespace e2d

View File

@@ -10,49 +10,57 @@
namespace e2d namespace e2d
{ {
//
// high_application
//
class high_application : private noncopyable {
public:
virtual ~high_application() noexcept = default;
virtual bool initialize();
virtual void shutdown() noexcept;
virtual bool on_should_close();
};
using high_application_uptr = std::unique_ptr<high_application>;
// //
// starter // starter
// //
class starter final : public module<starter> { class starter final : public module<starter> {
public: public:
class parameters { class application;
public: using application_uptr = std::unique_ptr<application>;
parameters() = delete; public:
parameters(const engine::parameters& engine_params); class parameters;
parameters& library_root(const url& value);
parameters& engine_params(const engine::parameters& value);
url& library_root() noexcept;
engine::parameters& engine_params() noexcept;
const url& library_root() const noexcept;
const engine::parameters& engine_params() const noexcept;
private:
url library_root_{"resources://bin/library"};
engine::parameters engine_params_;
};
public: public:
starter(int argc, char *argv[], const parameters& params); starter(int argc, char *argv[], const parameters& params);
~starter() noexcept final; ~starter() noexcept final;
template < typename HighApplication, typename... Args > template < typename HighApplication, typename... Args >
bool start(Args&&... args); bool start(Args&&... args);
bool start(high_application_uptr app); bool start(application_uptr app);
};
//
// starter::application
//
class starter::application : private e2d::noncopyable {
public:
virtual ~application() noexcept = default;
virtual bool initialize();
virtual void shutdown() noexcept;
virtual bool on_should_close();
};
//
// starter::parameters
//
class starter::parameters {
public:
parameters() = delete;
parameters(const engine::parameters& engine_params);
parameters& library_root(const url& value);
parameters& engine_params(const engine::parameters& value);
url& library_root() noexcept;
engine::parameters& engine_params() noexcept;
const url& library_root() const noexcept;
const engine::parameters& engine_params() const noexcept;
private:
url library_root_{"resources://bin/library"};
engine::parameters engine_params_;
}; };
} }

View File

@@ -90,7 +90,7 @@ namespace
vertex2{color32::yellow()}}; vertex2{color32::yellow()}};
} }
class game final : public application { class game final : public engine::application {
public: public:
bool initialize() final { bool initialize() final {
the<vfs>().register_scheme<archive_file_source>( the<vfs>().register_scheme<archive_file_source>(

View File

@@ -150,7 +150,7 @@ namespace
vertex2{color32::yellow()}}; vertex2{color32::yellow()}};
} }
class game final : public application { class game final : public engine::application {
public: public:
bool initialize() final { bool initialize() final {
the<vfs>().register_scheme<archive_file_source>( the<vfs>().register_scheme<archive_file_source>(

View File

@@ -105,7 +105,7 @@ namespace
vertex{{-x, y, z}, {0, 0}}}; vertex{{-x, y, z}, {0, 0}}};
} }
class game final : public application { class game final : public engine::application {
public: public:
bool initialize() final { bool initialize() final {
the<vfs>().register_scheme<archive_file_source>( the<vfs>().register_scheme<archive_file_source>(

View File

@@ -63,7 +63,7 @@ namespace
} }
}; };
class game final : public high_application { class game final : public starter::application {
public: public:
bool initialize() final { bool initialize() final {
return create_scene() return create_scene()

View File

@@ -44,7 +44,7 @@ namespace
} }
}; };
class game final : public high_application { class game final : public starter::application {
public: public:
bool initialize() final { bool initialize() final {
return create_scene() return create_scene()

View File

@@ -44,18 +44,18 @@ namespace e2d
// application // application
// //
bool application::initialize() { bool engine::application::initialize() {
return true; return true;
} }
void application::shutdown() noexcept { void engine::application::shutdown() noexcept {
} }
bool application::frame_tick() { bool engine::application::frame_tick() {
return true; return true;
} }
void application::frame_render() { void engine::application::frame_render() {
} }
// //

View File

@@ -33,21 +33,21 @@ namespace
: modules::initialize<Module>(std::forward<Args>(args)...); : modules::initialize<Module>(std::forward<Args>(args)...);
} }
class starter_application final : public application { class engine_application final : public engine::application {
public: public:
starter_application(high_application_uptr application) engine_application(starter::application_uptr application)
: high_application_(std::move(application)) {} : application_(std::move(application)) {}
bool initialize() final { bool initialize() final {
ecs::registry_filler(the<world>().registry()) ecs::registry_filler(the<world>().registry())
.system<flipbook_system>(world::priority_update) .system<flipbook_system>(world::priority_update)
.system<render_system>(world::priority_render); .system<render_system>(world::priority_render);
return !high_application_ || high_application_->initialize(); return !application_ || application_->initialize();
} }
void shutdown() noexcept final { void shutdown() noexcept final {
if ( high_application_ ) { if ( application_ ) {
high_application_->shutdown(); application_->shutdown();
} }
} }
@@ -56,7 +56,7 @@ namespace
world::priority_update_section_begin, world::priority_update_section_begin,
world::priority_update_section_end); world::priority_update_section_end);
return !the<window>().should_close() return !the<window>().should_close()
|| (high_application_ && !high_application_->on_should_close()); || (application_ && !application_->on_should_close());
} }
void frame_render() final { void frame_render() final {
@@ -65,24 +65,24 @@ namespace
world::priority_render_section_end); world::priority_render_section_end);
} }
private: private:
high_application_uptr high_application_; starter::application_uptr application_;
}; };
} }
namespace e2d namespace e2d
{ {
// //
// high_application // starter::application
// //
bool high_application::initialize() { bool starter::application::initialize() {
return true; return true;
} }
void high_application::shutdown() noexcept { void starter::application::shutdown() noexcept {
} }
bool high_application::on_should_close() { bool starter::application::on_should_close() {
return true; return true;
} }
@@ -145,9 +145,9 @@ namespace e2d
modules::shutdown<engine>(); modules::shutdown<engine>();
} }
bool starter::start(high_application_uptr app) { bool starter::start(application_uptr app) {
return the<engine>().start( return the<engine>().start(
std::make_unique<starter_application>( std::make_unique<engine_application>(
std::move(app))); std::move(app)));
} }
} }