diff --git a/headers/enduro2d/core/engine.hpp b/headers/enduro2d/core/engine.hpp index 39edfb25..b75f3af1 100644 --- a/headers/enduro2d/core/engine.hpp +++ b/headers/enduro2d/core/engine.hpp @@ -112,7 +112,7 @@ namespace e2d timer_parameters timer_params_; }; public: - engine(const parameters& params); + engine(int argc, char *argv[], const parameters& params); ~engine() noexcept final; template < typename Application, typename... Args > diff --git a/headers/enduro2d/core/platform.hpp b/headers/enduro2d/core/platform.hpp index 4d09533d..6047db8b 100644 --- a/headers/enduro2d/core/platform.hpp +++ b/headers/enduro2d/core/platform.hpp @@ -12,8 +12,11 @@ namespace e2d { class platform final : public module { public: - platform(); + platform(int argc, char *argv[]); ~platform() noexcept final; + + std::size_t command_line_argument_count() const noexcept; + const str& command_line_argument(std::size_t index) const noexcept; private: class internal_state; std::unique_ptr state_; diff --git a/headers/enduro2d/enduro2d.hpp b/headers/enduro2d/enduro2d.hpp index 73e3ed6b..480089ce 100644 --- a/headers/enduro2d/enduro2d.hpp +++ b/headers/enduro2d/enduro2d.hpp @@ -9,4 +9,4 @@ #include "math/_all.hpp" #include "utils/_all.hpp" -e2d::i32 e2d_main(); +e2d::i32 e2d_main(int argc, char *argv[]); diff --git a/samples/sources/sample_00/sample_00.cpp b/samples/sources/sample_00/sample_00.cpp index 65b414dc..fd04f102 100644 --- a/samples/sources/sample_00/sample_00.cpp +++ b/samples/sources/sample_00/sample_00.cpp @@ -196,10 +196,10 @@ namespace }; } -int e2d_main() { +int e2d_main(int argc, char *argv[]) { auto params = engine::parameters("sample_00", "enduro2d") .timer_params(engine::timer_parameters() .maximal_framerate(100)); - modules::initialize(params).start(); + modules::initialize(argc, argv, params).start(); return 0; } diff --git a/samples/sources/sample_01/sample_01.cpp b/samples/sources/sample_01/sample_01.cpp index 47b307f9..6e184619 100644 --- a/samples/sources/sample_01/sample_01.cpp +++ b/samples/sources/sample_01/sample_01.cpp @@ -260,10 +260,10 @@ namespace }; } -int e2d_main() { +int e2d_main(int argc, char *argv[]) { auto params = engine::parameters("sample_01", "enduro2d") .timer_params(engine::timer_parameters() .maximal_framerate(100)); - modules::initialize(params).start(); + modules::initialize(argc, argv, params).start(); return 0; } diff --git a/samples/sources/sample_02/sample_02.cpp b/samples/sources/sample_02/sample_02.cpp index e17e9de2..1bd3f50f 100644 --- a/samples/sources/sample_02/sample_02.cpp +++ b/samples/sources/sample_02/sample_02.cpp @@ -241,10 +241,10 @@ namespace }; } -int e2d_main() { +int e2d_main(int argc, char *argv[]) { auto params = engine::parameters("sample_02", "enduro2d") .timer_params(engine::timer_parameters() .maximal_framerate(100)); - modules::initialize(params).start(); + modules::initialize(argc, argv, params).start(); return 0; } diff --git a/sources/enduro2d/core/engine.cpp b/sources/enduro2d/core/engine.cpp index d2ff4efd..b45fc8f8 100644 --- a/sources/enduro2d/core/engine.cpp +++ b/sources/enduro2d/core/engine.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -304,9 +305,13 @@ namespace e2d // engine // - engine::engine(const parameters& params) + engine::engine(int argc, char *argv[], const parameters& params) : state_(new internal_state(params)) { + // setup platform + + safe_module_initialize(argc, argv); + // setup debug safe_module_initialize(); diff --git a/sources/enduro2d/core/platform.cpp b/sources/enduro2d/core/platform.cpp index a692ecdd..d4c442a0 100644 --- a/sources/enduro2d/core/platform.cpp +++ b/sources/enduro2d/core/platform.cpp @@ -4,7 +4,7 @@ * Copyright (C) 2018 Matvey Cherevko ******************************************************************************/ -#include +#include "platform_impl/platform.hpp" namespace e2d { @@ -14,15 +14,41 @@ namespace e2d class platform::internal_state final : private e2d::noncopyable { public: - internal_state() = default; + internal_state(int argc, char *argv[]) + : impl_(platform_internal_state_impl::create()) + { + if ( argc > 0 ) { + command_line_arguments_.reserve( + math::numeric_cast(argc)); + for ( int i = 0; i < argc; ++i ) { + command_line_arguments_.emplace_back(argv[i]); + } + } + } ~internal_state() noexcept = default; + public: + const vector& command_line_arguments() const noexcept { + return command_line_arguments_; + } + private: + vector command_line_arguments_; + platform_internal_state_impl_uptr impl_; }; // // platform // - platform::platform() - : state_(new internal_state()) {} + platform::platform(int argc, char *argv[]) + : state_(new internal_state(argc, argv)) {} platform::~platform() noexcept = default; + + std::size_t platform::command_line_argument_count() const noexcept { + return state_->command_line_arguments().size(); + } + + const str& platform::command_line_argument(std::size_t index) const noexcept { + E2D_ASSERT(index < state_->command_line_arguments().size()); + return state_->command_line_arguments()[index]; + } } diff --git a/sources/enduro2d/core/platform_impl/platform.hpp b/sources/enduro2d/core/platform_impl/platform.hpp new file mode 100644 index 00000000..2670f4c2 --- /dev/null +++ b/sources/enduro2d/core/platform_impl/platform.hpp @@ -0,0 +1,44 @@ +/******************************************************************************* + * This file is part of the "Enduro2D" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2018 Matvey Cherevko + ******************************************************************************/ + +#pragma once + +#include + +#define E2D_PLATFORM_MODE_NONE 1 +#define E2D_PLATFORM_MODE_IOS 2 +#define E2D_PLATFORM_MODE_LINUX 3 +#define E2D_PLATFORM_MODE_MACOSX 4 +#define E2D_PLATFORM_MODE_WINDOWS 5 + +#ifndef E2D_PLATFORM_MODE +# if defined(E2D_PLATFORM) && E2D_PLATFORM == E2D_PLATFORM_IOS +# define E2D_PLATFORM_MODE E2D_PLATFORM_MODE_IOS +# elif defined(E2D_PLATFORM) && E2D_PLATFORM == E2D_PLATFORM_LINUX +# define E2D_PLATFORM_MODE E2D_PLATFORM_MODE_LINUX +# elif defined(E2D_PLATFORM) && E2D_PLATFORM == E2D_PLATFORM_MACOSX +# define E2D_PLATFORM_MODE E2D_PLATFORM_MODE_MACOSX +# elif defined(E2D_PLATFORM) && E2D_PLATFORM == E2D_PLATFORM_WINDOWS +# define E2D_PLATFORM_MODE E2D_PLATFORM_MODE_WINDOWS +# endif +#endif + +#ifndef E2D_PLATFORM_MODE +# error E2D_PLATFORM_MODE not detected +#endif + +namespace e2d +{ + class platform_internal_state_impl; + using platform_internal_state_impl_uptr = std::unique_ptr; + + class platform_internal_state_impl : private e2d::noncopyable { + public: + platform_internal_state_impl() = default; + ~platform_internal_state_impl() noexcept = default; + static platform_internal_state_impl_uptr create(); + }; +} diff --git a/sources/enduro2d/core/platform_impl/platform_ios.cpp b/sources/enduro2d/core/platform_impl/platform_ios.cpp new file mode 100644 index 00000000..385909de --- /dev/null +++ b/sources/enduro2d/core/platform_impl/platform_ios.cpp @@ -0,0 +1,29 @@ +/******************************************************************************* + * This file is part of the "Enduro2D" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2018 Matvey Cherevko + ******************************************************************************/ + +#include "platform.hpp" + +#if defined(E2D_PLATFORM_MODE) && E2D_PLATFORM_MODE == E2D_PLATFORM_MODE_IOS + +namespace +{ + using namespace e2d; + + class platform_internal_state_impl_ios final : public platform_internal_state_impl { + public: + platform_internal_state_impl_ios() = default; + ~platform_internal_state_impl_ios() noexcept = default; + }; +} + +namespace e2d +{ + platform_internal_state_impl_uptr platform_internal_state_impl::create() { + return std::make_unique(); + } +} + +#endif diff --git a/sources/enduro2d/core/platform_impl/platform_linux.cpp b/sources/enduro2d/core/platform_impl/platform_linux.cpp new file mode 100644 index 00000000..c464f20d --- /dev/null +++ b/sources/enduro2d/core/platform_impl/platform_linux.cpp @@ -0,0 +1,29 @@ +/******************************************************************************* + * This file is part of the "Enduro2D" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2018 Matvey Cherevko + ******************************************************************************/ + +#include "platform.hpp" + +#if defined(E2D_PLATFORM_MODE) && E2D_PLATFORM_MODE == E2D_PLATFORM_MODE_LINUX + +namespace +{ + using namespace e2d; + + class platform_internal_state_impl_linux final : public platform_internal_state_impl { + public: + platform_internal_state_impl_linux() = default; + ~platform_internal_state_impl_linux() noexcept = default; + }; +} + +namespace e2d +{ + platform_internal_state_impl_uptr platform_internal_state_impl::create() { + return std::make_unique(); + } +} + +#endif diff --git a/sources/enduro2d/core/platform_impl/platform_macosx.cpp b/sources/enduro2d/core/platform_impl/platform_macosx.cpp new file mode 100644 index 00000000..5c40f38a --- /dev/null +++ b/sources/enduro2d/core/platform_impl/platform_macosx.cpp @@ -0,0 +1,29 @@ +/******************************************************************************* + * This file is part of the "Enduro2D" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2018 Matvey Cherevko + ******************************************************************************/ + +#include "platform.hpp" + +#if defined(E2D_PLATFORM_MODE) && E2D_PLATFORM_MODE == E2D_PLATFORM_MODE_MACOSX + +namespace +{ + using namespace e2d; + + class platform_internal_state_impl_macosx final : public platform_internal_state_impl { + public: + platform_internal_state_impl_macosx() = default; + ~platform_internal_state_impl_macosx() noexcept = default; + }; +} + +namespace e2d +{ + platform_internal_state_impl_uptr platform_internal_state_impl::create() { + return std::make_unique(); + } +} + +#endif diff --git a/sources/enduro2d/core/platform_impl/platform_none.cpp b/sources/enduro2d/core/platform_impl/platform_none.cpp new file mode 100644 index 00000000..365813a6 --- /dev/null +++ b/sources/enduro2d/core/platform_impl/platform_none.cpp @@ -0,0 +1,29 @@ +/******************************************************************************* + * This file is part of the "Enduro2D" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2018 Matvey Cherevko + ******************************************************************************/ + +#include "platform.hpp" + +#if defined(E2D_PLATFORM_MODE) && E2D_PLATFORM_MODE == E2D_PLATFORM_MODE_NONE + +namespace +{ + using namespace e2d; + + class platform_internal_state_impl_none final : public platform_internal_state_impl { + public: + platform_internal_state_impl_none() = default; + ~platform_internal_state_impl_none() noexcept = default; + }; +} + +namespace e2d +{ + platform_internal_state_impl_uptr platform_internal_state_impl::create() { + return std::make_unique(); + } +} + +#endif diff --git a/sources/enduro2d/core/platform_impl/platform_windows.cpp b/sources/enduro2d/core/platform_impl/platform_windows.cpp new file mode 100644 index 00000000..8f8fce65 --- /dev/null +++ b/sources/enduro2d/core/platform_impl/platform_windows.cpp @@ -0,0 +1,29 @@ +/******************************************************************************* + * This file is part of the "Enduro2D" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2018 Matvey Cherevko + ******************************************************************************/ + +#include "platform.hpp" + +#if defined(E2D_PLATFORM_MODE) && E2D_PLATFORM_MODE == E2D_PLATFORM_MODE_WINDOWS + +namespace +{ + using namespace e2d; + + class platform_internal_state_impl_windows final : public platform_internal_state_impl { + public: + platform_internal_state_impl_windows() = default; + ~platform_internal_state_impl_windows() noexcept = default; + }; +} + +namespace e2d +{ + platform_internal_state_impl_uptr platform_internal_state_impl::create() { + return std::make_unique(); + } +} + +#endif diff --git a/sources/enduro2d/enduro2d.cpp b/sources/enduro2d/enduro2d.cpp index 79a442fc..d26f3f0b 100644 --- a/sources/enduro2d/enduro2d.cpp +++ b/sources/enduro2d/enduro2d.cpp @@ -7,6 +7,5 @@ #include int main(int argc, char *argv[]) { - E2D_UNUSED(argc, argv); - return e2d_main(); + return e2d_main(argc, argv); }