refactor: split base module into std, bitwise, memory & env
This commit is contained in:
parent
16f3a80fd3
commit
d506d6a6a7
62 changed files with 544 additions and 275 deletions
|
@ -1,5 +1,7 @@
|
||||||
# engine
|
# engine
|
||||||
add_subdirectory(./base)
|
add_subdirectory(./std)
|
||||||
|
add_subdirectory(./bitwise)
|
||||||
|
add_subdirectory(./env)
|
||||||
add_subdirectory(./memory)
|
add_subdirectory(./memory)
|
||||||
add_subdirectory(./time)
|
add_subdirectory(./time)
|
||||||
add_subdirectory(./logger)
|
add_subdirectory(./logger)
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
add_library_module(app application.cpp)
|
add_library_module(app application.cpp)
|
||||||
target_link_libraries(app PRIVATE lt_debug)
|
target_link_libraries(app PUBLIC memory PRIVATE lt_debug)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <app/application.hpp>
|
#include <app/application.hpp>
|
||||||
#include <app/system.hpp>
|
#include <app/system.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
|
||||||
namespace lt::app {
|
namespace lt::app {
|
||||||
|
|
||||||
|
@ -41,12 +42,12 @@ void Application::game_loop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::register_system(Ref<app::ISystem> system)
|
void Application::register_system(memory::Ref<app::ISystem> system)
|
||||||
{
|
{
|
||||||
m_systems.emplace_back(std::move(system));
|
m_systems.emplace_back(std::move(system));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::unregister_system(Ref<app::ISystem> system)
|
void Application::unregister_system(memory::Ref<app::ISystem> system)
|
||||||
{
|
{
|
||||||
m_systems_to_be_unregistered.emplace_back(std::move(system));
|
m_systems_to_be_unregistered.emplace_back(std::move(system));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
|
|
||||||
namespace lt::app {
|
namespace lt::app {
|
||||||
|
|
||||||
class ISystem;
|
class ISystem;
|
||||||
|
|
||||||
extern Scope<class Application> create_application();
|
extern memory::Scope<class Application> create_application();
|
||||||
|
|
||||||
/** The main application class.
|
/** The main application class.
|
||||||
* Think of this like an aggregate of systems, you register systems through this interface.
|
* Think of this like an aggregate of systems, you register systems through this interface.
|
||||||
|
@ -25,19 +28,19 @@ public:
|
||||||
|
|
||||||
void game_loop();
|
void game_loop();
|
||||||
|
|
||||||
void register_system(Ref<app::ISystem> system);
|
void register_system(memory::Ref<app::ISystem> system);
|
||||||
|
|
||||||
void unregister_system(Ref<app::ISystem> system);
|
void unregister_system(memory::Ref<app::ISystem> system);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Application() = default;
|
Application() = default;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<Ref<app::ISystem>> m_systems;
|
std::vector<memory::Ref<app::ISystem>> m_systems;
|
||||||
|
|
||||||
std::vector<Ref<app::ISystem>> m_systems_to_be_unregistered;
|
std::vector<memory::Ref<app::ISystem>> m_systems_to_be_unregistered;
|
||||||
|
|
||||||
std::vector<Ref<app::ISystem>> m_systems_to_be_registered;
|
std::vector<memory::Ref<app::ISystem>> m_systems_to_be_registered;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <app/application.hpp>
|
#include <app/application.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
|
|
||||||
auto main(int argc, char *argv[]) -> int32_t
|
auto main(int argc, char *argv[]) -> int32_t
|
||||||
try
|
try
|
||||||
|
@ -8,8 +9,7 @@ try
|
||||||
std::ignore = argc;
|
std::ignore = argc;
|
||||||
std::ignore = argv;
|
std::ignore = argv;
|
||||||
|
|
||||||
auto application = lt::Scope<lt::app::Application> {};
|
auto application = lt::memory::Scope<lt::app::Application> {};
|
||||||
|
|
||||||
application = lt::app::create_application();
|
application = lt::app::create_application();
|
||||||
if (!application)
|
if (!application)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,8 +2,7 @@
|
||||||
|
|
||||||
namespace lt::assets {
|
namespace lt::assets {
|
||||||
|
|
||||||
ShaderAsset::ShaderAsset(const std::filesystem::path &path)
|
ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path)
|
||||||
: m_stream(path, std::ios::binary | std::ios::beg)
|
|
||||||
{
|
{
|
||||||
constexpr auto total_metadata_size = //
|
constexpr auto total_metadata_size = //
|
||||||
sizeof(AssetMetadata) //
|
sizeof(AssetMetadata) //
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
add_library_module(base)
|
|
||||||
target_precompile_headers(base INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/private/pch.hpp)
|
|
|
@ -1,37 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <base/base.hpp>
|
|
||||||
|
|
||||||
/* windows */
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define NOMINMAX
|
|
||||||
#include <Windows.h>
|
|
||||||
#undef NOMINMAX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Stdlib */
|
|
||||||
#include <algorithm>
|
|
||||||
#include <array>
|
|
||||||
#include <atomic>
|
|
||||||
#include <bitset>
|
|
||||||
#include <filesystem>
|
|
||||||
#include <flat_map>
|
|
||||||
#include <fstream>
|
|
||||||
#include <functional>
|
|
||||||
#include <iostream>
|
|
||||||
#include <list>
|
|
||||||
#include <map>
|
|
||||||
#include <math.h>
|
|
||||||
#include <memory>
|
|
||||||
#include <set>
|
|
||||||
#include <span>
|
|
||||||
#include <sstream>
|
|
||||||
#include <string>
|
|
||||||
#include <string_view>
|
|
||||||
#include <thread>
|
|
||||||
#include <time.h>
|
|
||||||
#include <tuple>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <unordered_set>
|
|
||||||
#include <utility>
|
|
||||||
#include <vector>
|
|
|
@ -1,91 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
namespace lt {
|
|
||||||
|
|
||||||
// Ref (Ref)
|
|
||||||
template<typename t>
|
|
||||||
using Ref = std::shared_ptr<t>;
|
|
||||||
|
|
||||||
template<typename t, typename... Args>
|
|
||||||
constexpr Ref<t> create_ref(Args &&...args)
|
|
||||||
{
|
|
||||||
return std::make_shared<t>(std::forward<Args>(args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename t>
|
|
||||||
constexpr Ref<t> make_ref(t *rawPointer)
|
|
||||||
{
|
|
||||||
return std::shared_ptr<t>(rawPointer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scope (std::unique_ptr)
|
|
||||||
template<typename t>
|
|
||||||
using Scope = std::unique_ptr<t>;
|
|
||||||
|
|
||||||
template<typename t, typename... Args>
|
|
||||||
constexpr std::unique_ptr<t> create_scope(Args &&...args)
|
|
||||||
{
|
|
||||||
return std::make_unique<t>(std::forward<Args>(args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename t>
|
|
||||||
constexpr std::unique_ptr<t> make_scope(t *rawPointer)
|
|
||||||
{
|
|
||||||
return std::unique_ptr<t>(rawPointer);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace lt
|
|
||||||
|
|
||||||
#define lt_win(x) // windows
|
|
||||||
#define lt_lin(x) // linux
|
|
||||||
#define lt_mac(x) // mac
|
|
||||||
|
|
||||||
enum class Platform : uint8_t
|
|
||||||
{
|
|
||||||
windows,
|
|
||||||
|
|
||||||
/** Named like so because "linux" is a built-in identifier. */
|
|
||||||
gnu,
|
|
||||||
|
|
||||||
mac,
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace constants {
|
|
||||||
|
|
||||||
#if defined(LIGHT_PLATFORM_WINDOWS)
|
|
||||||
#define lt_win(x)
|
|
||||||
constexpr auto platform = Platform::windows;
|
|
||||||
constexpr auto platform_name = "windows";
|
|
||||||
|
|
||||||
#undef LIGHT_PLATFORM_WINDOWS
|
|
||||||
|
|
||||||
#elif defined(LIGHT_PLATFORM_LINUX)
|
|
||||||
#define lt_lin(x) x
|
|
||||||
constexpr auto platform = Platform::gnu;
|
|
||||||
constexpr auto platform_name = "linux";
|
|
||||||
|
|
||||||
#elif defined(LIGHT_PLATFORM_MAC)
|
|
||||||
#define lt_mac(x) x
|
|
||||||
constexpr auto platform = Platform::mac;
|
|
||||||
constexpr auto platform_name = "mac";
|
|
||||||
|
|
||||||
#else
|
|
||||||
#error "Unsupported platform: Unknown"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace constants
|
|
||||||
|
|
||||||
/* bit-wise */
|
|
||||||
constexpr auto bit(auto x)
|
|
||||||
{
|
|
||||||
return 1 << x;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* token */
|
|
||||||
#define lt_pair_token_value_to_name(token) { token, #token }
|
|
||||||
#define lt_pair_token_name_to_value(token) { #token, token }
|
|
||||||
#define lt_token_name(token) #token
|
|
1
modules/bitwise/CMakeLists.txt
Normal file
1
modules/bitwise/CMakeLists.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
add_library_module(bitwise)
|
13
modules/bitwise/public/operations.hpp
Normal file
13
modules/bitwise/public/operations.hpp
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace lt::bitwise {
|
||||||
|
|
||||||
|
/* bit-wise */
|
||||||
|
constexpr auto bit(uint32_t x) -> uint32_t
|
||||||
|
{
|
||||||
|
return 1u << x;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace lt::bitwise
|
|
@ -1,4 +1,4 @@
|
||||||
add_library_module(ecs sparse_set.cpp)
|
add_library_module(ecs sparse_set.cpp)
|
||||||
target_link_libraries(ecs PUBLIC logger lt_debug)
|
target_link_libraries(ecs PUBLIC logger lt_debug memory)
|
||||||
|
|
||||||
add_test_module(ecs sparse_set.test.cpp registry.test.cpp)
|
add_test_module(ecs sparse_set.test.cpp registry.test.cpp)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <ecs/registry.hpp>
|
#include <ecs/registry.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
|
||||||
namespace lt::ecs {
|
namespace lt::ecs {
|
||||||
|
|
||||||
|
@ -8,7 +9,7 @@ namespace lt::ecs {
|
||||||
class Entity
|
class Entity
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Entity(Ref<Registry> registry, EntityId identifier)
|
Entity(memory::Ref<Registry> registry, EntityId identifier)
|
||||||
: m_registry(std::move(registry))
|
: m_registry(std::move(registry))
|
||||||
, m_identifier(identifier)
|
, m_identifier(identifier)
|
||||||
{
|
{
|
||||||
|
@ -18,7 +19,7 @@ public:
|
||||||
template<typename Component_T>
|
template<typename Component_T>
|
||||||
auto add(Component_T component) -> Component_T &
|
auto add(Component_T component) -> Component_T &
|
||||||
{
|
{
|
||||||
return m_registry->add(m_identifier, component);
|
m_registry->add(m_identifier, component);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Component_T>
|
template<typename Component_T>
|
||||||
|
@ -33,13 +34,14 @@ public:
|
||||||
return m_registry->get<Component_T>(m_identifier);
|
return m_registry->get<Component_T>(m_identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto get_registry() -> Ref<Registry>
|
auto get_registry() -> memory::Ref<Registry>
|
||||||
{
|
{
|
||||||
return m_registry;
|
return m_registry;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ref<Registry> m_registry;
|
memory::Ref<Registry> m_registry;
|
||||||
|
|
||||||
|
|
||||||
EntityId m_identifier;
|
EntityId m_identifier;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <ecs/sparse_set.hpp>
|
#include <ecs/sparse_set.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
|
|
||||||
namespace lt::ecs {
|
namespace lt::ecs {
|
||||||
|
|
||||||
|
@ -235,7 +236,7 @@ private:
|
||||||
constexpr auto type_id = get_type_id<T>();
|
constexpr auto type_id = get_type_id<T>();
|
||||||
if (!m_sparsed_sets.contains(type_id))
|
if (!m_sparsed_sets.contains(type_id))
|
||||||
{
|
{
|
||||||
m_sparsed_sets[type_id] = create_scope<SparseSet<T, EntityId>>();
|
m_sparsed_sets[type_id] = memory::create_scope<SparseSet<T, EntityId>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto *base_set = m_sparsed_sets[type_id].get();
|
auto *base_set = m_sparsed_sets[type_id].get();
|
||||||
|
@ -249,7 +250,7 @@ private:
|
||||||
|
|
||||||
TypeId m_entity_count;
|
TypeId m_entity_count;
|
||||||
|
|
||||||
std::flat_map<TypeId, Scope<UnderlyingSparseSet_T>> m_sparsed_sets;
|
std::flat_map<TypeId, memory::Scope<UnderlyingSparseSet_T>> m_sparsed_sets;
|
||||||
|
|
||||||
std::flat_map<TypeId, Callback_T> m_on_construct_hooks;
|
std::flat_map<TypeId, Callback_T> m_on_construct_hooks;
|
||||||
|
|
||||||
|
|
1
modules/env/CMakeLists.txt
vendored
Normal file
1
modules/env/CMakeLists.txt
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
add_library_module(env)
|
68
modules/env/public/constants.hpp
vendored
Normal file
68
modules/env/public/constants.hpp
vendored
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace lt {
|
||||||
|
|
||||||
|
enum class Platform : uint8_t
|
||||||
|
{
|
||||||
|
/** The GNU/Linux platform.
|
||||||
|
* Tested on the following distros: arch-x86_64
|
||||||
|
* @note: Named like so because `linux` is a built-in identifier.
|
||||||
|
* */
|
||||||
|
gnu_linux,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Microsoft Windows(tm) platform.
|
||||||
|
* Tested on the following architectures: x86_64
|
||||||
|
*/
|
||||||
|
windows,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The apple's macOS platform.
|
||||||
|
* Currently not supported.
|
||||||
|
*/
|
||||||
|
mac,
|
||||||
|
};
|
||||||
|
|
||||||
|
/** The compiler that was used for compiling the project. */
|
||||||
|
enum class Compiler : uint8_t
|
||||||
|
{
|
||||||
|
clang,
|
||||||
|
gcc,
|
||||||
|
msvc,
|
||||||
|
apple_clang,
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace constants {
|
||||||
|
|
||||||
|
#if defined(LIGHT_PLATFORM_WINDOWS)
|
||||||
|
#define lt_win(x)
|
||||||
|
constexpr auto platform = Platform::windows;
|
||||||
|
constexpr auto platform_name = "windows";
|
||||||
|
|
||||||
|
#undef LIGHT_PLATFORM_WINDOWS
|
||||||
|
|
||||||
|
#elif defined(LIGHT_PLATFORM_LINUX)
|
||||||
|
constexpr auto platform = Platform::gnu_linux;
|
||||||
|
constexpr auto platform_name = "gnu_linux";
|
||||||
|
|
||||||
|
#elif defined(LIGHT_PLATFORM_MAC)
|
||||||
|
#define lt_mac(x) x
|
||||||
|
constexpr auto platform = Platform::mac;
|
||||||
|
constexpr auto platform_name = "mac";
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error "Unsupported platform: Unknown"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __clang__
|
||||||
|
constexpr auto compiler = Compiler::clang;
|
||||||
|
constexpr auto compiler_name = "clang";
|
||||||
|
|
||||||
|
/** @todo(Light): insert the full identifier, including version information and such */
|
||||||
|
constexpr auto full_compiler_identifier = "clang";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace constants
|
||||||
|
|
||||||
|
} // namespace lt
|
|
@ -1,5 +1,6 @@
|
||||||
#include <input/components.hpp>
|
#include <input/components.hpp>
|
||||||
#include <input/system.hpp>
|
#include <input/system.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
|
||||||
namespace lt::input {
|
namespace lt::input {
|
||||||
|
|
||||||
|
@ -9,7 +10,7 @@ struct overloads: Ts...
|
||||||
using Ts::operator()...;
|
using Ts::operator()...;
|
||||||
};
|
};
|
||||||
|
|
||||||
System::System(Ref<ecs::Registry> registry): m_registry(std::move(registry))
|
System::System(memory::Ref<ecs::Registry> registry): m_registry(std::move(registry))
|
||||||
{
|
{
|
||||||
ensure(m_registry, "Failed to initialize input system: null registry");
|
ensure(m_registry, "Failed to initialize input system: null registry");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#include <ecs/entity.hpp>
|
#include <ecs/entity.hpp>
|
||||||
#include <input/components.hpp>
|
#include <input/components.hpp>
|
||||||
#include <input/system.hpp>
|
#include <input/system.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
#include <test/test.hpp>
|
#include <test/test.hpp>
|
||||||
|
|
||||||
|
@ -30,7 +32,7 @@ using test::Suite;
|
||||||
class Fixture
|
class Fixture
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] auto registry() -> Ref<ecs::Registry>
|
[[nodiscard]] auto registry() -> memory::Ref<ecs::Registry>
|
||||||
{
|
{
|
||||||
return m_registry;
|
return m_registry;
|
||||||
}
|
}
|
||||||
|
@ -55,7 +57,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ref<ecs::Registry> m_registry = create_ref<ecs::Registry>();
|
memory::Ref<ecs::Registry> m_registry = memory::create_ref<ecs::Registry>();
|
||||||
};
|
};
|
||||||
|
|
||||||
Suite raii = "raii"_suite = "raii"_suite = [] {
|
Suite raii = "raii"_suite = "raii"_suite = [] {
|
||||||
|
@ -110,7 +112,7 @@ Suite registry_events = "registry_events"_suite = [] {
|
||||||
Case { "on_destrroy<InputComponent>" } = [] {
|
Case { "on_destrroy<InputComponent>" } = [] {
|
||||||
auto fixture = Fixture {};
|
auto fixture = Fixture {};
|
||||||
auto registry = fixture.registry();
|
auto registry = fixture.registry();
|
||||||
auto system = create_scope<System>(registry);
|
auto system = memory::create_scope<System>(registry);
|
||||||
|
|
||||||
auto entity_a = fixture.add_input_component();
|
auto entity_a = fixture.add_input_component();
|
||||||
auto entity_b = fixture.add_input_component();
|
auto entity_b = fixture.add_input_component();
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <app/system.hpp>
|
#include <app/system.hpp>
|
||||||
#include <ecs/registry.hpp>
|
#include <ecs/registry.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <surface/components.hpp>
|
#include <surface/components.hpp>
|
||||||
#include <surface/events/keyboard.hpp>
|
#include <surface/events/keyboard.hpp>
|
||||||
#include <surface/events/mouse.hpp>
|
#include <surface/events/mouse.hpp>
|
||||||
|
@ -11,7 +12,7 @@ namespace lt::input {
|
||||||
class System: public app::ISystem
|
class System: public app::ISystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
System(Ref<ecs::Registry> registry);
|
System(memory::Ref<ecs::Registry> registry);
|
||||||
|
|
||||||
void tick(app::TickInfo tick) override;
|
void tick(app::TickInfo tick) override;
|
||||||
|
|
||||||
|
@ -39,7 +40,7 @@ private:
|
||||||
|
|
||||||
void on_button_release(const lt::surface::ButtonReleasedEvent &event);
|
void on_button_release(const lt::surface::ButtonReleasedEvent &event);
|
||||||
|
|
||||||
Ref<ecs::Registry> m_registry;
|
memory::Ref<ecs::Registry> m_registry;
|
||||||
|
|
||||||
std::array<bool, 512> m_keys {};
|
std::array<bool, 512> m_keys {};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
#include <math/vec2.hpp>
|
#include <math/vec2.hpp>
|
||||||
|
|
||||||
namespace lt::math {
|
namespace lt::math {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
namespace lt::math {
|
namespace lt::math {
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,17 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto operator->() -> Underlying_T
|
||||||
|
{
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOLINTNEXTLINE
|
||||||
|
auto operator->() const -> const Underlying_T
|
||||||
|
{
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
|
||||||
auto operator&() const -> const Underlying_T *
|
auto operator&() const -> const Underlying_T *
|
||||||
{
|
{
|
||||||
return &m_value;
|
return &m_value;
|
||||||
|
@ -66,6 +77,11 @@ public:
|
||||||
return m_value;
|
return m_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
operator uint64_t() const
|
||||||
|
{
|
||||||
|
return (uint64_t)m_value;
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]] auto get() -> Underlying_T
|
[[nodiscard]] auto get() -> Underlying_T
|
||||||
{
|
{
|
||||||
return m_value;
|
return m_value;
|
||||||
|
|
|
@ -1,10 +1,15 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace lt::memory {
|
namespace lt::memory {
|
||||||
|
|
||||||
/** Wrapper around std::shared_ptr. */
|
/** Wrapper around std::shared_ptr.
|
||||||
|
*
|
||||||
|
* @note Currently just an alias, might turn into an implementation later.
|
||||||
|
* @ref https://en.cppreference.com/w/cpp/memory/shared_ptr.html
|
||||||
|
*/
|
||||||
template<typename t>
|
template<typename t>
|
||||||
using Ref = std::shared_ptr<t>;
|
using Ref = std::shared_ptr<t>;
|
||||||
|
|
|
@ -1,10 +1,15 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace lt::memory {
|
namespace lt::memory {
|
||||||
|
|
||||||
/** Wrapper around std::unique_ptr. */
|
/** Wrapper around std::unique_ptr.
|
||||||
|
*
|
||||||
|
* @note Currently just an alias, might turn into an implementation later.
|
||||||
|
* @ref https://en.cppreference.com/w/cpp/memory/unique_ptr.html
|
||||||
|
*/
|
||||||
template<typename t>
|
template<typename t>
|
||||||
using Scope = std::unique_ptr<t>;
|
using Scope = std::unique_ptr<t>;
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
#include <input/components.hpp>
|
#include <input/components.hpp>
|
||||||
#include <input/system.hpp>
|
#include <input/system.hpp>
|
||||||
#include <math/vec2.hpp>
|
#include <math/vec2.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
|
#include <renderer/components/messenger.hpp>
|
||||||
#include <renderer/system.hpp>
|
#include <renderer/system.hpp>
|
||||||
#include <surface/events/keyboard.hpp>
|
#include <surface/events/keyboard.hpp>
|
||||||
#include <surface/events/surface.hpp>
|
#include <surface/events/surface.hpp>
|
||||||
|
@ -14,11 +17,21 @@
|
||||||
|
|
||||||
namespace lt {
|
namespace lt {
|
||||||
|
|
||||||
|
void renderer_callback(
|
||||||
|
renderer::MessageSeverity message_severity,
|
||||||
|
renderer::MessageType message_type,
|
||||||
|
renderer::MessengerCallbackData data,
|
||||||
|
std::any user_data
|
||||||
|
)
|
||||||
|
{
|
||||||
|
log_dbg("RENDERER CALLBACK: {}", data.message);
|
||||||
|
}
|
||||||
|
|
||||||
class MirrorSystem: public lt::app::ISystem
|
class MirrorSystem: public lt::app::ISystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MirrorSystem(
|
MirrorSystem(
|
||||||
Ref<ecs::Registry> registry,
|
memory::Ref<ecs::Registry> registry,
|
||||||
lt::input::InputAction::Key quit_action_key,
|
lt::input::InputAction::Key quit_action_key,
|
||||||
std::array<lt::input::InputAction::Key, 4> debug_action_keys
|
std::array<lt::input::InputAction::Key, 4> debug_action_keys
|
||||||
)
|
)
|
||||||
|
@ -27,6 +40,8 @@ public:
|
||||||
, m_debug_action_keys(debug_action_keys)
|
, m_debug_action_keys(debug_action_keys)
|
||||||
{
|
{
|
||||||
using Surface = lt::surface::SurfaceComponent;
|
using Surface = lt::surface::SurfaceComponent;
|
||||||
|
|
||||||
|
|
||||||
using Input = lt::input::InputComponent;
|
using Input = lt::input::InputComponent;
|
||||||
|
|
||||||
for (auto &[entity, surface, input] : m_registry->view<Surface, Input>())
|
for (auto &[entity, surface, input] : m_registry->view<Surface, Input>())
|
||||||
|
@ -99,7 +114,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ref<ecs::Registry> m_registry;
|
memory::Ref<ecs::Registry> m_registry;
|
||||||
|
|
||||||
|
|
||||||
lt::input::InputAction::Key m_quit_action_key;
|
lt::input::InputAction::Key m_quit_action_key;
|
||||||
|
|
||||||
|
@ -113,7 +129,7 @@ class Mirror: public app::Application
|
||||||
public:
|
public:
|
||||||
Mirror()
|
Mirror()
|
||||||
{
|
{
|
||||||
m_editor_registry = create_ref<ecs::Registry>();
|
m_editor_registry = memory::create_ref<ecs::Registry>();
|
||||||
|
|
||||||
setup_window_system();
|
setup_window_system();
|
||||||
setup_input_system();
|
setup_input_system();
|
||||||
|
@ -135,7 +151,7 @@ public:
|
||||||
{
|
{
|
||||||
using lt::input::InputComponent;
|
using lt::input::InputComponent;
|
||||||
using lt::surface::SurfaceComponent;
|
using lt::surface::SurfaceComponent;
|
||||||
m_surface_system = create_ref<lt::surface::System>(m_editor_registry);
|
m_surface_system = memory::create_ref<lt::surface::System>(m_editor_registry);
|
||||||
|
|
||||||
m_window = m_editor_registry->create_entity();
|
m_window = m_editor_registry->create_entity();
|
||||||
m_editor_registry->add<SurfaceComponent>(
|
m_editor_registry->add<SurfaceComponent>(
|
||||||
|
@ -185,21 +201,28 @@ public:
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
m_input_system = create_ref<input::System>(m_editor_registry);
|
m_input_system = memory::create_ref<input::System>(m_editor_registry);
|
||||||
m_mirror_system = create_ref<MirrorSystem>(
|
m_mirror_system = memory::create_ref<MirrorSystem>(
|
||||||
m_editor_registry,
|
m_editor_registry,
|
||||||
quit_action_key,
|
quit_action_key,
|
||||||
debug_action_keys
|
debug_action_keys
|
||||||
);
|
);
|
||||||
|
|
||||||
auto entity = ecs::Entity { m_editor_registry, m_window };
|
auto entity = ecs::Entity { m_editor_registry, m_window };
|
||||||
Ref<app::SystemStats> system_stats = nullptr;
|
memory::Ref<app::SystemStats> system_stats = nullptr;
|
||||||
|
|
||||||
m_renderer_system = std::make_shared<renderer::System>(renderer::System::CreateInfo {
|
m_renderer_system = std::make_shared<renderer::System>(renderer::System::CreateInfo {
|
||||||
|
.config = { .target_api = renderer::API::Vulkan, .max_frames_in_flight = 3u },
|
||||||
.registry = m_editor_registry,
|
.registry = m_editor_registry,
|
||||||
.surface_entity = entity,
|
.surface_entity = entity,
|
||||||
.system_stats = system_stats,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// entity.add<renderer::MessengerComponent>({
|
||||||
|
// .severities = renderer::MessageSeverity::all,
|
||||||
|
// .types = renderer::MessageType::all,
|
||||||
|
// .callback = &renderer_callback,
|
||||||
|
// .user_data = this,
|
||||||
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_input_system()
|
void setup_input_system()
|
||||||
|
@ -215,22 +238,22 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ref<ecs::Registry> m_editor_registry;
|
memory::Ref<ecs::Registry> m_editor_registry;
|
||||||
|
|
||||||
Ref<lt::surface::System> m_surface_system;
|
memory::Ref<lt::surface::System> m_surface_system;
|
||||||
|
|
||||||
Ref<lt::input::System> m_input_system;
|
memory::Ref<lt::input::System> m_input_system;
|
||||||
|
|
||||||
Ref<lt::renderer::System> m_renderer_system;
|
memory::Ref<lt::renderer::System> m_renderer_system;
|
||||||
|
|
||||||
Ref<MirrorSystem> m_mirror_system;
|
memory::Ref<MirrorSystem> m_mirror_system;
|
||||||
|
|
||||||
lt::ecs::EntityId m_window = lt::ecs::null_entity;
|
lt::ecs::EntityId m_window = lt::ecs::null_entity;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto app::create_application() -> Scope<app::Application>
|
auto app::create_application() -> memory::Scope<app::Application>
|
||||||
{
|
{
|
||||||
return create_scope<Mirror>();
|
return memory::create_scope<Mirror>();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace lt
|
} // namespace lt
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <input/input.hpp>
|
#include <input/input.hpp>
|
||||||
#include <input/key_codes.hpp>
|
#include <input/key_codes.hpp>
|
||||||
#include <math/vec4.hpp>
|
#include <math/vec4.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <mirror/layers/editor_layer.hpp>
|
#include <mirror/layers/editor_layer.hpp>
|
||||||
#include <renderer/framebuffer.hpp>
|
#include <renderer/framebuffer.hpp>
|
||||||
#include <renderer/graphics_context.hpp>
|
#include <renderer/graphics_context.hpp>
|
||||||
|
@ -20,11 +21,11 @@ EditorLayer::EditorLayer(const std::string &name)
|
||||||
, m_scene_dir("")
|
, m_scene_dir("")
|
||||||
, m_direction { 0.0, 0.0 }
|
, m_direction { 0.0, 0.0 }
|
||||||
{
|
{
|
||||||
m_scene = create_ref<Scene>();
|
m_scene = memory::create_ref<Scene>();
|
||||||
|
|
||||||
m_properties_panel = create_ref<PropertiesPanel>();
|
m_properties_panel = memory::create_ref<PropertiesPanel>();
|
||||||
m_sceneHierarchyPanel = create_ref<SceneHierarchyPanel>(m_scene, m_properties_panel);
|
m_sceneHierarchyPanel = memory::create_ref<SceneHierarchyPanel>(m_scene, m_properties_panel);
|
||||||
m_content_browser_panel = create_ref<AssetBrowserPanel>(m_scene);
|
m_content_browser_panel = memory::create_ref<AssetBrowserPanel>(m_scene);
|
||||||
|
|
||||||
m_framebuffer = Framebuffer::create(
|
m_framebuffer = Framebuffer::create(
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,12 +2,13 @@
|
||||||
#include <ecs/registry.hpp>
|
#include <ecs/registry.hpp>
|
||||||
#include <ecs/serializer.hpp>
|
#include <ecs/serializer.hpp>
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <mirror/panels/asset_browser.hpp>
|
#include <mirror/panels/asset_browser.hpp>
|
||||||
#include <renderer/texture.hpp>
|
#include <renderer/texture.hpp>
|
||||||
|
|
||||||
namespace lt {
|
namespace lt {
|
||||||
|
|
||||||
AssetBrowserPanel::AssetBrowserPanel(Ref<Scene> active_scene)
|
AssetBrowserPanel::AssetBrowserPanel(memory::Ref<Scene> active_scene)
|
||||||
: m_current_directory("./data/assets")
|
: m_current_directory("./data/assets")
|
||||||
, m_assets_path("./data/assets")
|
, m_assets_path("./data/assets")
|
||||||
, m_active_scene(std::move(active_scene))
|
, m_active_scene(std::move(active_scene))
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <ecs/components.hpp>
|
#include <ecs/components.hpp>
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <mirror/panels/properties.hpp>
|
#include <mirror/panels/properties.hpp>
|
||||||
#include <mirror/panels/scene_hierarchy.hpp>
|
#include <mirror/panels/scene_hierarchy.hpp>
|
||||||
|
|
||||||
|
@ -9,7 +10,10 @@ SceneHierarchyPanel::SceneHierarchyPanel(): m_context(nullptr), m_properties_pan
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
SceneHierarchyPanel::SceneHierarchyPanel(Ref<Scene> context, Ref<PropertiesPanel> properties_panel)
|
SceneHierarchyPanel::SceneHierarchyPanel(
|
||||||
|
memory::Ref<Scene> context,
|
||||||
|
memory::Ref<PropertiesPanel> properties_panel
|
||||||
|
)
|
||||||
: m_context(std::move(context))
|
: m_context(std::move(context))
|
||||||
, m_properties_panel_context(std::move(properties_panel))
|
, m_properties_panel_context(std::move(properties_panel))
|
||||||
{
|
{
|
||||||
|
@ -36,7 +40,10 @@ void SceneHierarchyPanel::on_user_interface_update()
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneHierarchyPanel::set_context(Ref<Scene> context, Ref<PropertiesPanel> properties_panel)
|
void SceneHierarchyPanel::set_context(
|
||||||
|
memory::Ref<Scene> context,
|
||||||
|
memory::Ref<PropertiesPanel> properties_panel
|
||||||
|
)
|
||||||
{
|
{
|
||||||
if (properties_panel)
|
if (properties_panel)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <app/layer.hpp>
|
#include <app/layer.hpp>
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
#include <math/vec2.hpp>
|
#include <math/vec2.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <mirror/panels/asset_browser.hpp>
|
#include <mirror/panels/asset_browser.hpp>
|
||||||
#include <mirror/panels/properties.hpp>
|
#include <mirror/panels/properties.hpp>
|
||||||
#include <mirror/panels/scene_hierarchy.hpp>
|
#include <mirror/panels/scene_hierarchy.hpp>
|
||||||
|
@ -40,15 +41,15 @@ private:
|
||||||
|
|
||||||
float m_speed = 1000.0f;
|
float m_speed = 1000.0f;
|
||||||
|
|
||||||
Ref<Scene> m_scene;
|
memory::Ref<Scene> m_scene;
|
||||||
|
|
||||||
Ref<SceneHierarchyPanel> m_sceneHierarchyPanel;
|
memory::Ref<SceneHierarchyPanel> m_sceneHierarchyPanel;
|
||||||
|
|
||||||
Ref<PropertiesPanel> m_properties_panel;
|
memory::Ref<PropertiesPanel> m_properties_panel;
|
||||||
|
|
||||||
Ref<AssetBrowserPanel> m_content_browser_panel;
|
memory::Ref<AssetBrowserPanel> m_content_browser_panel;
|
||||||
|
|
||||||
Ref<Framebuffer> m_framebuffer;
|
memory::Ref<Framebuffer> m_framebuffer;
|
||||||
|
|
||||||
Entity m_camera_entity;
|
Entity m_camera_entity;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <mirror/panels/panel.hpp>
|
#include <mirror/panels/panel.hpp>
|
||||||
#include <renderer/texture.hpp>
|
#include <renderer/texture.hpp>
|
||||||
|
|
||||||
|
@ -11,7 +12,7 @@ class Scene;
|
||||||
class AssetBrowserPanel: public Panel
|
class AssetBrowserPanel: public Panel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AssetBrowserPanel(Ref<Scene> active_scene);
|
AssetBrowserPanel(memory::Ref<Scene> active_scene);
|
||||||
|
|
||||||
void on_user_interface_update();
|
void on_user_interface_update();
|
||||||
|
|
||||||
|
@ -33,15 +34,15 @@ private:
|
||||||
|
|
||||||
float m_file_padding = 8.0f;
|
float m_file_padding = 8.0f;
|
||||||
|
|
||||||
Ref<Scene> m_active_scene;
|
memory::Ref<Scene> m_active_scene;
|
||||||
|
|
||||||
Ref<Texture> m_directory_texture;
|
memory::Ref<Texture> m_directory_texture;
|
||||||
|
|
||||||
Ref<Texture> m_scene_texture;
|
memory::Ref<Texture> m_scene_texture;
|
||||||
|
|
||||||
Ref<Texture> m_image_texture;
|
memory::Ref<Texture> m_image_texture;
|
||||||
|
|
||||||
Ref<Texture> m_text_texture;
|
memory::Ref<Texture> m_text_texture;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace lt
|
} // namespace lt
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <ecs/entity.hpp>
|
#include <ecs/entity.hpp>
|
||||||
#include <ecs/registry.hpp>
|
#include <ecs/registry.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <mirror/panels/panel.hpp>
|
#include <mirror/panels/panel.hpp>
|
||||||
|
|
||||||
namespace lt {
|
namespace lt {
|
||||||
|
@ -13,18 +14,24 @@ class SceneHierarchyPanel: public Panel
|
||||||
public:
|
public:
|
||||||
SceneHierarchyPanel();
|
SceneHierarchyPanel();
|
||||||
|
|
||||||
SceneHierarchyPanel(Ref<Scene> context, Ref<PropertiesPanel> properties_panel = nullptr);
|
SceneHierarchyPanel(
|
||||||
|
memory::Ref<Scene> context,
|
||||||
|
memory::Ref<PropertiesPanel> properties_panel = nullptr
|
||||||
|
);
|
||||||
|
|
||||||
void on_user_interface_update();
|
void on_user_interface_update();
|
||||||
|
|
||||||
void set_context(Ref<Scene> context, Ref<PropertiesPanel> properties_panel = nullptr);
|
void set_context(
|
||||||
|
memory::Ref<Scene> context,
|
||||||
|
memory::Ref<PropertiesPanel> properties_panel = nullptr
|
||||||
|
);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void draw_node(Entity entity, const std::string &label);
|
void draw_node(Entity entity, const std::string &label);
|
||||||
|
|
||||||
Ref<Scene> m_context;
|
memory::Ref<Scene> m_context;
|
||||||
|
|
||||||
Ref<PropertiesPanel> m_properties_panel_context;
|
memory::Ref<PropertiesPanel> m_properties_panel_context;
|
||||||
|
|
||||||
Entity m_selection_context;
|
Entity m_selection_context;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
Diagnostics:
|
|
||||||
UnusedIncludes: None
|
|
||||||
MissingIncludes: None
|
|
|
@ -25,6 +25,7 @@ PUBLIC
|
||||||
memory
|
memory
|
||||||
assets
|
assets
|
||||||
time
|
time
|
||||||
|
bitwise
|
||||||
PRIVATE
|
PRIVATE
|
||||||
surface
|
surface
|
||||||
pthread
|
pthread
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <renderer/backend/vk/context/context.hpp>
|
#include <renderer/backend/vk/context/context.hpp>
|
||||||
#include <renderer/backend/vk/context/device.hpp>
|
#include <renderer/backend/vk/context/device.hpp>
|
||||||
#include <renderer/backend/vk/context/gpu.hpp>
|
#include <renderer/backend/vk/context/gpu.hpp>
|
||||||
|
@ -9,10 +10,10 @@ namespace lt::renderer::vk {
|
||||||
|
|
||||||
Context::Context(const ecs::Entity &surface_entity)
|
Context::Context(const ecs::Entity &surface_entity)
|
||||||
: m_instance(Instance::get())
|
: m_instance(Instance::get())
|
||||||
, m_surface(create_scope<Surface>(m_instance, surface_entity))
|
, m_surface(memory::create_scope<Surface>(m_instance, surface_entity))
|
||||||
, m_gpu(create_scope<Gpu>(m_instance))
|
, m_gpu(memory::create_scope<Gpu>(m_instance))
|
||||||
, m_device(create_scope<Device>(m_gpu.get(), m_surface.get()))
|
, m_device(memory::create_scope<Device>(m_gpu.get(), m_surface.get()))
|
||||||
, m_swapchain(create_scope<Swapchain>(m_surface.get(), m_gpu.get(), m_device.get()))
|
, m_swapchain(memory::create_scope<Swapchain>(m_surface.get(), m_gpu.get(), m_device.get()))
|
||||||
{
|
{
|
||||||
ensure(
|
ensure(
|
||||||
static_cast<Instance *>(m_instance)->vk(),
|
static_cast<Instance *>(m_instance)->vk(),
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <ecs/entity.hpp>
|
#include <ecs/entity.hpp>
|
||||||
#include <memory/pointer_types/null_on_move.hpp>
|
#include <memory/pointer_types/null_on_move.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <renderer/frontend/context/context.hpp>
|
#include <renderer/frontend/context/context.hpp>
|
||||||
|
|
||||||
namespace lt::renderer::vk {
|
namespace lt::renderer::vk {
|
||||||
|
@ -42,19 +43,19 @@ public:
|
||||||
void recreate_swapchain() override
|
void recreate_swapchain() override
|
||||||
{
|
{
|
||||||
m_swapchain.reset();
|
m_swapchain.reset();
|
||||||
// m_swapchain = create_scope<vk::Swapchain>(m_device, m_surface);
|
// m_swapchain = memory::create_scope<vk::Swapchain>(m_device, m_surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IInstance *m_instance;
|
IInstance *m_instance;
|
||||||
|
|
||||||
Scope<ISurface> m_surface;
|
memory::Scope<ISurface> m_surface;
|
||||||
|
|
||||||
Scope<IGpu> m_gpu;
|
memory::Scope<IGpu> m_gpu;
|
||||||
|
|
||||||
Scope<IDevice> m_device;
|
memory::Scope<IDevice> m_device;
|
||||||
|
|
||||||
Scope<ISwapchain> m_swapchain;
|
memory::Scope<ISwapchain> m_swapchain;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace lt::renderer::vk
|
} // namespace lt::renderer::vk
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <renderer/backend/vk/context/swapchain.hpp>
|
#include <renderer/backend/vk/context/swapchain.hpp>
|
||||||
#include <renderer/backend/vk/renderer/renderer.hpp>
|
#include <renderer/backend/vk/renderer/renderer.hpp>
|
||||||
|
|
||||||
|
@ -13,7 +14,7 @@ Renderer::Renderer(IContext &context, uint32_t max_frames_in_flight)
|
||||||
ensure(m_swapchain, "Failed to initialize renderer: null swapchain");
|
ensure(m_swapchain, "Failed to initialize renderer: null swapchain");
|
||||||
|
|
||||||
// TODO(Light): HARDCODED PASS!!!
|
// TODO(Light): HARDCODED PASS!!!
|
||||||
m_pass = create_ref<vk::Pass>(
|
m_pass = memory::create_ref<vk::Pass>(
|
||||||
context,
|
context,
|
||||||
assets::ShaderAsset { "./data/test_assets/triangle.vert.asset" },
|
assets::ShaderAsset { "./data/test_assets/triangle.vert.asset" },
|
||||||
assets::ShaderAsset { "./data/test_assets/triangle.frag.asset" }
|
assets::ShaderAsset { "./data/test_assets/triangle.frag.asset" }
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
#include <renderer/backend/vk/context/context.hpp>
|
#include <renderer/backend/vk/context/context.hpp>
|
||||||
#include <renderer/backend/vk/context/device.hpp>
|
#include <renderer/backend/vk/context/device.hpp>
|
||||||
|
@ -37,7 +38,7 @@ private:
|
||||||
|
|
||||||
class Swapchain *m_swapchain {};
|
class Swapchain *m_swapchain {};
|
||||||
|
|
||||||
Ref<class Pass> m_pass;
|
memory::Ref<class Pass> m_pass;
|
||||||
|
|
||||||
VkCommandPool m_pool = VK_NULL_HANDLE;
|
VkCommandPool m_pool = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
#include <renderer/backend/vk/context/context.hpp>
|
#include <renderer/backend/vk/context/context.hpp>
|
||||||
#include <renderer/backend/vk/context/surface.hpp>
|
#include <renderer/backend/vk/context/surface.hpp>
|
||||||
|
@ -83,7 +84,7 @@ private:
|
||||||
{
|
{
|
||||||
using lt::surface::SurfaceComponent;
|
using lt::surface::SurfaceComponent;
|
||||||
|
|
||||||
auto registry = lt::create_ref<lt::ecs::Registry>();
|
auto registry = lt::memory::create_ref<lt::ecs::Registry>();
|
||||||
auto entity = lt::ecs::Entity { registry, registry->create_entity() };
|
auto entity = lt::ecs::Entity { registry, registry->create_entity() };
|
||||||
auto surface_system = lt::surface::System(registry);
|
auto surface_system = lt::surface::System(registry);
|
||||||
entity.add<SurfaceComponent>(SurfaceComponent::CreateInfo {
|
entity.add<SurfaceComponent>(SurfaceComponent::CreateInfo {
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <renderer/api.hpp>
|
#include <renderer/api.hpp>
|
||||||
#include <renderer/backend/vk/context/context.hpp>
|
#include <renderer/backend/vk/context/context.hpp>
|
||||||
#include <renderer/frontend/context/context.hpp>
|
#include <renderer/frontend/context/context.hpp>
|
||||||
|
|
||||||
namespace lt::renderer {
|
namespace lt::renderer {
|
||||||
|
|
||||||
auto IContext::create(API target_api, const ecs::Entity &surface_entity) -> Scope<IContext>
|
auto IContext::create(API target_api, const ecs::Entity &surface_entity)
|
||||||
|
-> memory::Scope<IContext>
|
||||||
{
|
{
|
||||||
switch (target_api)
|
switch (target_api)
|
||||||
{
|
{
|
||||||
case API::Vulkan: return create_scope<vk::Context>(surface_entity);
|
case API::Vulkan: return memory::create_scope<vk::Context>(surface_entity);
|
||||||
default: throw std::runtime_error { "Invalid API" };
|
default: throw std::runtime_error { "Invalid API" };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <ecs/entity.hpp>
|
#include <ecs/entity.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <renderer/api.hpp>
|
#include <renderer/api.hpp>
|
||||||
#include <renderer/frontend/context/device.hpp>
|
#include <renderer/frontend/context/device.hpp>
|
||||||
#include <renderer/frontend/context/gpu.hpp>
|
#include <renderer/frontend/context/gpu.hpp>
|
||||||
|
@ -14,7 +15,8 @@ namespace lt::renderer {
|
||||||
class IContext
|
class IContext
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static auto create(API target_api, const ecs::Entity &surface_entity) -> Scope<IContext>;
|
static auto create(API target_api, const ecs::Entity &surface_entity)
|
||||||
|
-> memory::Scope<IContext>;
|
||||||
IContext() = default;
|
IContext() = default;
|
||||||
|
|
||||||
virtual ~IContext() = default;
|
virtual ~IContext() = default;
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
#include <renderer/interface/context.hpp>
|
#include <renderer/interface/context.hpp>
|
||||||
#include <renderer/vk/context/context.hpp>
|
#include <renderer/vk/context/context.hpp>
|
||||||
|
@ -29,8 +31,8 @@ class Fixture
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Fixture()
|
Fixture()
|
||||||
: m_registry(lt::create_ref<lt::ecs::Registry>())
|
: m_registry(lt::memory::create_ref<lt::ecs::Registry>())
|
||||||
, m_surface_system(lt::create_scope<lt::surface::System>(m_registry))
|
, m_surface_system(lt::memory::create_scope<lt::surface::System>(m_registry))
|
||||||
, m_surface_entity(m_registry, m_registry->create_entity())
|
, m_surface_entity(m_registry, m_registry->create_entity())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -41,8 +43,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
lt::Ref<lt::ecs::Registry> m_registry;
|
lt::memory::Ref<lt::ecs::Registry> m_registry;
|
||||||
lt::Scope<lt::surface::System> m_surface_system;
|
lt::memory::Scope<lt::surface::System> m_surface_system;
|
||||||
lt::ecs::Entity m_surface_entity;
|
lt::ecs::Entity m_surface_entity;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
#include <renderer/vk/context/device.hpp>
|
#include <renderer/vk/context/device.hpp>
|
||||||
#include <renderer/vk/context/surface.hpp>
|
#include <renderer/vk/context/surface.hpp>
|
||||||
|
@ -17,7 +18,7 @@ constexpr auto resolution = math::uvec2 { 800u, 600u };
|
||||||
|
|
||||||
Suite raii = "device_raii"_suite = [] {
|
Suite raii = "device_raii"_suite = [] {
|
||||||
Case { "happy path won't throw" } = [] {
|
Case { "happy path won't throw" } = [] {
|
||||||
auto registry = create_ref<ecs::Registry>();
|
auto registry = memory::create_ref<ecs::Registry>();
|
||||||
auto surface_system = surface::System { registry };
|
auto surface_system = surface::System { registry };
|
||||||
auto entity = ecs::Entity { registry, registry->create_entity() };
|
auto entity = ecs::Entity { registry, registry->create_entity() };
|
||||||
entity.add<surface::SurfaceComponent>(surface::SurfaceComponent::CreateInfo {
|
entity.add<surface::SurfaceComponent>(surface::SurfaceComponent::CreateInfo {
|
||||||
|
@ -30,7 +31,7 @@ Suite raii = "device_raii"_suite = [] {
|
||||||
};
|
};
|
||||||
|
|
||||||
Case { "many won't freeze/throw" } = [] {
|
Case { "many won't freeze/throw" } = [] {
|
||||||
auto registry = create_ref<ecs::Registry>();
|
auto registry = memory::create_ref<ecs::Registry>();
|
||||||
auto surface_system = surface::System { registry };
|
auto surface_system = surface::System { registry };
|
||||||
auto entity = ecs::Entity { registry, registry->create_entity() };
|
auto entity = ecs::Entity { registry, registry->create_entity() };
|
||||||
entity.add<surface::SurfaceComponent>(surface::SurfaceComponent::CreateInfo {
|
entity.add<surface::SurfaceComponent>(surface::SurfaceComponent::CreateInfo {
|
||||||
|
@ -47,7 +48,7 @@ Suite raii = "device_raii"_suite = [] {
|
||||||
};
|
};
|
||||||
|
|
||||||
Case { "unhappy path throws" } = [] {
|
Case { "unhappy path throws" } = [] {
|
||||||
auto registry = create_ref<ecs::Registry>();
|
auto registry = memory::create_ref<ecs::Registry>();
|
||||||
auto surface_system = surface::System { registry };
|
auto surface_system = surface::System { registry };
|
||||||
auto entity = ecs::Entity { registry, registry->create_entity() };
|
auto entity = ecs::Entity { registry, registry->create_entity() };
|
||||||
entity.add<surface::SurfaceComponent>(surface::SurfaceComponent::CreateInfo {
|
entity.add<surface::SurfaceComponent>(surface::SurfaceComponent::CreateInfo {
|
||||||
|
@ -62,7 +63,7 @@ Suite raii = "device_raii"_suite = [] {
|
||||||
};
|
};
|
||||||
|
|
||||||
Case { "post construct has correct state" } = [] {
|
Case { "post construct has correct state" } = [] {
|
||||||
auto registry = create_ref<ecs::Registry>();
|
auto registry = memory::create_ref<ecs::Registry>();
|
||||||
auto surface_system = surface::System { registry };
|
auto surface_system = surface::System { registry };
|
||||||
auto entity = ecs::Entity { registry, registry->create_entity() };
|
auto entity = ecs::Entity { registry, registry->create_entity() };
|
||||||
entity.add<surface::SurfaceComponent>(surface::SurfaceComponent::CreateInfo {
|
entity.add<surface::SurfaceComponent>(surface::SurfaceComponent::CreateInfo {
|
||||||
|
@ -82,7 +83,7 @@ Suite raii = "device_raii"_suite = [] {
|
||||||
};
|
};
|
||||||
|
|
||||||
Case { "post destruct has correct state" } = [] {
|
Case { "post destruct has correct state" } = [] {
|
||||||
auto registry = create_ref<ecs::Registry>();
|
auto registry = memory::create_ref<ecs::Registry>();
|
||||||
auto surface_system = surface::System { registry };
|
auto surface_system = surface::System { registry };
|
||||||
auto entity = ecs::Entity { registry, registry->create_entity() };
|
auto entity = ecs::Entity { registry, registry->create_entity() };
|
||||||
entity.add<surface::SurfaceComponent>(surface::SurfaceComponent::CreateInfo {
|
entity.add<surface::SurfaceComponent>(surface::SurfaceComponent::CreateInfo {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <renderer/vk/context/surface.hpp>
|
#include <renderer/vk/context/surface.hpp>
|
||||||
#include <renderer/vk/debug/messenger.hpp>
|
#include <renderer/vk/debug/messenger.hpp>
|
||||||
#include <renderer/vk/test_utils.hpp>
|
#include <renderer/vk/test_utils.hpp>
|
||||||
|
@ -15,7 +16,7 @@ Suite raii = "surface"_suite = [] {
|
||||||
Case { "happy path won't throw" } = [&] {
|
Case { "happy path won't throw" } = [&] {
|
||||||
auto observer = ValidationObserver {};
|
auto observer = ValidationObserver {};
|
||||||
|
|
||||||
auto registry = lt::create_ref<Registry>();
|
auto registry = lt::memory::create_ref<Registry>();
|
||||||
auto entity = Entity { registry, registry->create_entity() };
|
auto entity = Entity { registry, registry->create_entity() };
|
||||||
auto surface_system = System(registry);
|
auto surface_system = System(registry);
|
||||||
|
|
||||||
|
@ -36,7 +37,7 @@ Suite raii = "surface"_suite = [] {
|
||||||
|
|
||||||
Case { "unhappy path throws" } = [&] {
|
Case { "unhappy path throws" } = [&] {
|
||||||
auto observer = ValidationObserver {};
|
auto observer = ValidationObserver {};
|
||||||
auto registry = lt::create_ref<Registry>();
|
auto registry = lt::memory::create_ref<Registry>();
|
||||||
auto entity = Entity { registry, registry->create_entity() };
|
auto entity = Entity { registry, registry->create_entity() };
|
||||||
|
|
||||||
entity.add<SurfaceComponent>(SurfaceComponent::CreateInfo {
|
entity.add<SurfaceComponent>(SurfaceComponent::CreateInfo {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <renderer/backend/vk/messenger.hpp>
|
#include <renderer/backend/vk/messenger.hpp>
|
||||||
#include <renderer/frontend/messenger.hpp>
|
#include <renderer/frontend/messenger.hpp>
|
||||||
|
|
||||||
|
@ -7,11 +8,11 @@ namespace lt::renderer {
|
||||||
API target_api,
|
API target_api,
|
||||||
IInstance *instance,
|
IInstance *instance,
|
||||||
ecs::Entity entity
|
ecs::Entity entity
|
||||||
) -> Scope<IMessenger>
|
) -> memory::Scope<IMessenger>
|
||||||
{
|
{
|
||||||
switch (target_api)
|
switch (target_api)
|
||||||
{
|
{
|
||||||
case API::Vulkan: return create_scope<vk::Messenger>(instance, std::move(entity));
|
case API::Vulkan: return memory::create_scope<vk::Messenger>(instance, std::move(entity));
|
||||||
|
|
||||||
case API::Metal:
|
case API::Metal:
|
||||||
case API::DirectX: throw std::runtime_error { "Invalid API" };
|
case API::DirectX: throw std::runtime_error { "Invalid API" };
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <ecs/entity.hpp>
|
#include <ecs/entity.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <renderer/api.hpp>
|
#include <renderer/api.hpp>
|
||||||
|
|
||||||
namespace lt::renderer {
|
namespace lt::renderer {
|
||||||
|
@ -9,7 +10,7 @@ class IMessenger
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] static auto create(API target_api, class IInstance *instance, ecs::Entity entity)
|
[[nodiscard]] static auto create(API target_api, class IInstance *instance, ecs::Entity entity)
|
||||||
-> Scope<IMessenger>;
|
-> memory::Scope<IMessenger>;
|
||||||
|
|
||||||
IMessenger() = default;
|
IMessenger() = default;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <renderer/api.hpp>
|
#include <renderer/api.hpp>
|
||||||
#include <renderer/backend/vk/renderer/renderer.hpp>
|
#include <renderer/backend/vk/renderer/renderer.hpp>
|
||||||
#include <renderer/frontend/renderer/renderer.hpp>
|
#include <renderer/frontend/renderer/renderer.hpp>
|
||||||
|
@ -5,11 +6,11 @@
|
||||||
namespace lt::renderer {
|
namespace lt::renderer {
|
||||||
|
|
||||||
auto IRenderer::create(API target_api, IContext &context, uint32_t max_frames_in_flight)
|
auto IRenderer::create(API target_api, IContext &context, uint32_t max_frames_in_flight)
|
||||||
-> Scope<IRenderer>
|
-> memory::Scope<IRenderer>
|
||||||
{
|
{
|
||||||
switch (target_api)
|
switch (target_api)
|
||||||
{
|
{
|
||||||
case API::Vulkan: return create_scope<vk::Renderer>(context, max_frames_in_flight);
|
case API::Vulkan: return memory::create_scope<vk::Renderer>(context, max_frames_in_flight);
|
||||||
default: throw std::runtime_error { "Invalid API" };
|
default: throw std::runtime_error { "Invalid API" };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <renderer/api.hpp>
|
#include <renderer/api.hpp>
|
||||||
|
|
||||||
namespace lt::renderer {
|
namespace lt::renderer {
|
||||||
|
@ -15,7 +16,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
static auto create(API target_api, class IContext &context, uint32_t max_frames_in_flight)
|
static auto create(API target_api, class IContext &context, uint32_t max_frames_in_flight)
|
||||||
-> Scope<IRenderer>;
|
-> memory::Scope<IRenderer>;
|
||||||
|
|
||||||
IRenderer() = default;
|
IRenderer() = default;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <renderer/vk/renderer/renderer.hpp>
|
#include <renderer/vk/renderer/renderer.hpp>
|
||||||
#include <renderer/vk/test_utils.hpp>
|
#include <renderer/vk/test_utils.hpp>
|
||||||
|
|
||||||
|
@ -12,7 +13,7 @@ Suite raii = "renderer_raii"_suite = [] {
|
||||||
|
|
||||||
std::ignore = Renderer(
|
std::ignore = Renderer(
|
||||||
context,
|
context,
|
||||||
lt::create_ref<Pass>(
|
lt::memory::create_ref<Pass>(
|
||||||
context,
|
context,
|
||||||
ShaderAsset { "./data/test_assets/triangle.vert.asset" },
|
ShaderAsset { "./data/test_assets/triangle.vert.asset" },
|
||||||
ShaderAsset { "./data/test_assets/triangle.frag.asset" }
|
ShaderAsset { "./data/test_assets/triangle.frag.asset" }
|
||||||
|
@ -30,7 +31,7 @@ Suite draw = "renderer_draw"_suite = [] {
|
||||||
|
|
||||||
auto renderer = Renderer(
|
auto renderer = Renderer(
|
||||||
context,
|
context,
|
||||||
lt::create_ref<Pass>(
|
lt::memory::create_ref<Pass>(
|
||||||
context,
|
context,
|
||||||
ShaderAsset { "./data/test_assets/triangle.vert.asset" },
|
ShaderAsset { "./data/test_assets/triangle.vert.asset" },
|
||||||
ShaderAsset { "./data/test_assets/triangle.frag.asset" }
|
ShaderAsset { "./data/test_assets/triangle.frag.asset" }
|
||||||
|
@ -47,7 +48,7 @@ Suite draw = "renderer_draw"_suite = [] {
|
||||||
Case { "post swapchain replacement renderer draw" } = [] {
|
Case { "post swapchain replacement renderer draw" } = [] {
|
||||||
auto observer = ValidationObserver {};
|
auto observer = ValidationObserver {};
|
||||||
auto [context, _] = create_context();
|
auto [context, _] = create_context();
|
||||||
auto pass = lt::create_ref<Pass>(
|
auto pass = lt::memory::create_ref<Pass>(
|
||||||
context,
|
context,
|
||||||
ShaderAsset { "./data/test_assets/triangle.vert.asset" },
|
ShaderAsset { "./data/test_assets/triangle.vert.asset" },
|
||||||
ShaderAsset { "./data/test_assets/triangle.frag.asset" }
|
ShaderAsset { "./data/test_assets/triangle.frag.asset" }
|
||||||
|
|
|
@ -21,8 +21,8 @@ System::System(CreateInfo info)
|
||||||
m_renderer = IRenderer::create(m_api, *m_context, info.config.max_frames_in_flight);
|
m_renderer = IRenderer::create(m_api, *m_context, info.config.max_frames_in_flight);
|
||||||
|
|
||||||
// WIP(Light): attach debug messenger on messenger component construction
|
// WIP(Light): attach debug messenger on messenger component construction
|
||||||
m_registry->connect_on_construct<renderer::MessengerComponent>([](ecs::Registry ®istry,
|
// m_registry->connect_on_construct<renderer::MessengerComponent>([](ecs::Registry ®istry,
|
||||||
ecs::EntityId entity) {});
|
// ecs::EntityId entity) {});
|
||||||
}
|
}
|
||||||
|
|
||||||
System::~System()
|
System::~System()
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
#include <renderer/system.hpp>
|
#include <renderer/system.hpp>
|
||||||
#include <renderer/vk/context/context.hpp>
|
#include <renderer/vk/context/context.hpp>
|
||||||
|
@ -25,7 +27,7 @@ struct SurfaceContext
|
||||||
|
|
||||||
struct RendererContext
|
struct RendererContext
|
||||||
{
|
{
|
||||||
Ref<ecs::Registry> registry;
|
memory::Ref<ecs::Registry> registry;
|
||||||
System system;
|
System system;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,7 +35,7 @@ struct RendererContext
|
||||||
{
|
{
|
||||||
using surface::SurfaceComponent;
|
using surface::SurfaceComponent;
|
||||||
|
|
||||||
auto surface_registry = create_ref<ecs::Registry>();
|
auto surface_registry = memory::create_ref<ecs::Registry>();
|
||||||
auto surface_entity = surface_registry->create_entity();
|
auto surface_entity = surface_registry->create_entity();
|
||||||
auto surface_system = surface::System(surface_registry);
|
auto surface_system = surface::System(surface_registry);
|
||||||
surface_registry->add<SurfaceComponent>(
|
surface_registry->add<SurfaceComponent>(
|
||||||
|
@ -54,8 +56,8 @@ struct RendererContext
|
||||||
{
|
{
|
||||||
auto surface_context = create_surface();
|
auto surface_context = create_surface();
|
||||||
auto &[surface_system, surface_entity] = surface_context;
|
auto &[surface_system, surface_entity] = surface_context;
|
||||||
auto registry = create_ref<ecs::Registry>();
|
auto registry = memory::create_ref<ecs::Registry>();
|
||||||
auto stats = create_ref<app::SystemStats>();
|
auto stats = memory::create_ref<app::SystemStats>();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
std::move(surface_context),
|
std::move(surface_context),
|
||||||
|
@ -83,7 +85,7 @@ public:
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] auto registry() const -> Ref<ecs::Registry>
|
[[nodiscard]] auto registry() const -> memory::Ref<ecs::Registry>
|
||||||
{
|
{
|
||||||
return m_registry;
|
return m_registry;
|
||||||
}
|
}
|
||||||
|
@ -93,19 +95,21 @@ public:
|
||||||
return *m_surface_entity;
|
return *m_surface_entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] auto stats() const -> Ref<app::SystemStats>
|
[[nodiscard]] auto stats() const -> memory::Ref<app::SystemStats>
|
||||||
{
|
{
|
||||||
return m_stats;
|
return m_stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ref<app::SystemStats> m_stats = create_ref<app::SystemStats>();
|
memory::Ref<app::SystemStats> m_stats = memory::create_ref<app::SystemStats>();
|
||||||
|
|
||||||
Ref<ecs::Registry> m_registry = create_ref<ecs::Registry>();
|
memory::Ref<ecs::Registry> m_registry = memory::create_ref<ecs::Registry>();
|
||||||
|
|
||||||
Ref<surface::System> m_surface_system = create_ref<surface::System>(m_registry);
|
memory::Ref<surface::System> m_surface_system = memory::create_ref<surface::System>(
|
||||||
|
m_registry
|
||||||
|
);
|
||||||
|
|
||||||
Scope<ecs::Entity> m_surface_entity = create_scope<ecs::Entity>(
|
memory::Scope<ecs::Entity> m_surface_entity = memory::create_scope<ecs::Entity>(
|
||||||
m_registry,
|
m_registry,
|
||||||
m_registry->create_entity()
|
m_registry->create_entity()
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <bitwise/operations.hpp>
|
||||||
#include <any>
|
#include <any>
|
||||||
|
|
||||||
namespace lt::renderer {
|
namespace lt::renderer {
|
||||||
|
@ -8,10 +9,10 @@ enum class MessageSeverity : uint8_t
|
||||||
{
|
{
|
||||||
none = 0u,
|
none = 0u,
|
||||||
|
|
||||||
verbose = bit(0u),
|
verbose = bitwise::bit(0u),
|
||||||
info = bit(1u),
|
info = bitwise::bit(1u),
|
||||||
warning = bit(2u),
|
warning = bitwise::bit(2u),
|
||||||
error = bit(3u),
|
error = bitwise::bit(3u),
|
||||||
|
|
||||||
all = verbose | info | warning | error,
|
all = verbose | info | warning | error,
|
||||||
};
|
};
|
||||||
|
@ -19,9 +20,9 @@ enum class MessageSeverity : uint8_t
|
||||||
enum class MessageType : uint8_t
|
enum class MessageType : uint8_t
|
||||||
{
|
{
|
||||||
none = 0u,
|
none = 0u,
|
||||||
general = bit(0u),
|
general = bitwise::bit(0u),
|
||||||
validation = bit(1u),
|
validation = bitwise::bit(1u),
|
||||||
performance = bit(2u),
|
performance = bitwise::bit(2u),
|
||||||
|
|
||||||
all = general | validation | performance,
|
all = general | validation | performance,
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
#include <app/system.hpp>
|
#include <app/system.hpp>
|
||||||
#include <ecs/entity.hpp>
|
#include <ecs/entity.hpp>
|
||||||
#include <ecs/registry.hpp>
|
#include <ecs/registry.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <renderer/api.hpp>
|
#include <renderer/api.hpp>
|
||||||
|
|
||||||
namespace lt::renderer {
|
namespace lt::renderer {
|
||||||
|
@ -21,7 +23,7 @@ public:
|
||||||
{
|
{
|
||||||
Configuration config;
|
Configuration config;
|
||||||
|
|
||||||
Ref<ecs::Registry> registry;
|
memory::Ref<ecs::Registry> registry;
|
||||||
|
|
||||||
ecs::Entity surface_entity;
|
ecs::Entity surface_entity;
|
||||||
};
|
};
|
||||||
|
@ -52,15 +54,15 @@ public:
|
||||||
private:
|
private:
|
||||||
API m_api;
|
API m_api;
|
||||||
|
|
||||||
Ref<ecs::Registry> m_registry;
|
memory::Ref<ecs::Registry> m_registry;
|
||||||
|
|
||||||
ecs::Entity m_surface_entity;
|
ecs::Entity m_surface_entity;
|
||||||
|
|
||||||
Scope<class IContext> m_context;
|
memory::Scope<class IContext> m_context;
|
||||||
|
|
||||||
Scope<class IRenderer> m_renderer;
|
memory::Scope<class IRenderer> m_renderer;
|
||||||
|
|
||||||
std::vector<Scope<class IMessenger>> m_messengers;
|
std::vector<memory::Scope<class IMessenger>> m_messengers;
|
||||||
|
|
||||||
app::TickResult m_last_tick_result {};
|
app::TickResult m_last_tick_result {};
|
||||||
|
|
||||||
|
|
2
modules/std/CMakeLists.txt
Normal file
2
modules/std/CMakeLists.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
add_library(std INTERFACE)
|
||||||
|
target_precompile_headers(std INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/public/pch.hpp)
|
155
modules/std/public/pch.hpp
Normal file
155
modules/std/public/pch.hpp
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
/** @file pch.hpp
|
||||||
|
*
|
||||||
|
* @brief Provides the entire standard library as a precompiled header
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once // NOLINTBEGIN
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// C Standard Library Headers (from <c...> family)
|
||||||
|
//============================================================
|
||||||
|
#include <cassert>
|
||||||
|
#include <cctype>
|
||||||
|
#include <cerrno>
|
||||||
|
#include <cfenv>
|
||||||
|
#include <cfloat>
|
||||||
|
#include <cinttypes>
|
||||||
|
#include <ciso646>
|
||||||
|
#include <climits>
|
||||||
|
#include <clocale>
|
||||||
|
#include <cmath>
|
||||||
|
#include <csetjmp>
|
||||||
|
#include <csignal>
|
||||||
|
#include <cstdarg>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <ctime>
|
||||||
|
#include <cwchar>
|
||||||
|
#include <cwctype>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// Input/Output and Formatting
|
||||||
|
//============================================================
|
||||||
|
#include <cstdio>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
#include <istream>
|
||||||
|
#include <ostream>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// Containers
|
||||||
|
//============================================================
|
||||||
|
#include <array>
|
||||||
|
#include <deque>
|
||||||
|
#include <flat_map>
|
||||||
|
#include <forward_list>
|
||||||
|
#include <list>
|
||||||
|
#include <map>
|
||||||
|
#include <queue>
|
||||||
|
#include <set>
|
||||||
|
#include <span>
|
||||||
|
#include <stack>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// Algorithms and Iterators
|
||||||
|
//============================================================
|
||||||
|
#include <algorithm>
|
||||||
|
#include <execution>
|
||||||
|
#include <iterator>
|
||||||
|
#include <numeric>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// Strings and Localization
|
||||||
|
//============================================================
|
||||||
|
#include <charconv>
|
||||||
|
#include <codecvt>
|
||||||
|
#include <locale>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// Memory Management and Smart Pointers
|
||||||
|
//============================================================
|
||||||
|
#include <memory>
|
||||||
|
#include <memory_resource>
|
||||||
|
#include <new>
|
||||||
|
#include <scoped_allocator>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// Utility and Miscellaneous
|
||||||
|
//============================================================
|
||||||
|
#include <any>
|
||||||
|
#include <bitset>
|
||||||
|
#include <chrono>
|
||||||
|
#include <functional>
|
||||||
|
#include <optional>
|
||||||
|
#include <ratio>
|
||||||
|
#include <source_location>
|
||||||
|
#include <tuple>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <typeindex>
|
||||||
|
#include <typeinfo>
|
||||||
|
#include <utility>
|
||||||
|
#include <variant>
|
||||||
|
#include <version>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// Concurrency and Multithreading
|
||||||
|
//============================================================
|
||||||
|
#include <atomic>
|
||||||
|
#include <barrier>
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <future>
|
||||||
|
#include <latch>
|
||||||
|
#include <mutex>
|
||||||
|
#include <semaphore>
|
||||||
|
#include <shared_mutex>
|
||||||
|
#include <stop_token>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// Random Numbers and Numeric Limits
|
||||||
|
//============================================================
|
||||||
|
#include <complex>
|
||||||
|
#include <limits>
|
||||||
|
#include <numbers>
|
||||||
|
#include <random>
|
||||||
|
#include <valarray>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// Regular Expressions
|
||||||
|
//============================================================
|
||||||
|
#include <regex>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// Error Handling and Diagnostics
|
||||||
|
//============================================================
|
||||||
|
#include <cassert>
|
||||||
|
#include <cerrno>
|
||||||
|
#include <exception>
|
||||||
|
#include <source_location>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <system_error>
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// C++20/23 Additions
|
||||||
|
//============================================================
|
||||||
|
#include <bit> // C++20 bit operations
|
||||||
|
#include <compare> // C++20 three-way comparison
|
||||||
|
#include <expected> // C++23 std::expected (if supported)
|
||||||
|
#include <format> // C++20 formatting
|
||||||
|
#include <print> // C++23 print functions
|
||||||
|
#include <ranges> // C++20 ranges library
|
||||||
|
#include <span> // C++20 span (repeated intentionally for clarity)
|
||||||
|
// #include <stacktrace> // C++23 stack tracing utilities // Not supported yet
|
||||||
|
#include <syncstream> // C++20 synchronized output streams
|
||||||
|
// NOLINTEND
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <surface/components.hpp>
|
#include <surface/components.hpp>
|
||||||
#include <surface/events/mouse.hpp>
|
#include <surface/events/mouse.hpp>
|
||||||
#include <surface/requests/surface.hpp>
|
#include <surface/requests/surface.hpp>
|
||||||
|
@ -44,7 +45,7 @@ constexpr auto all_events_mask = KeyPressMask | //
|
||||||
ColormapChangeMask | //
|
ColormapChangeMask | //
|
||||||
OwnerGrabButtonMask;
|
OwnerGrabButtonMask;
|
||||||
|
|
||||||
System::System(Ref<ecs::Registry> registry): m_registry(std::move(registry))
|
System::System(memory::Ref<ecs::Registry> registry): m_registry(std::move(registry))
|
||||||
{
|
{
|
||||||
ensure(m_registry, "Failed to initialize surface system: null registry");
|
ensure(m_registry, "Failed to initialize surface system: null registry");
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <ecs/entity.hpp>
|
#include <ecs/entity.hpp>
|
||||||
#include <ecs/registry.hpp>
|
#include <ecs/registry.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <surface/components.hpp>
|
#include <surface/components.hpp>
|
||||||
#include <surface/system.hpp>
|
#include <surface/system.hpp>
|
||||||
#include <test/fuzz.hpp>
|
#include <test/fuzz.hpp>
|
||||||
|
@ -89,7 +90,7 @@ void check_invariants()
|
||||||
test::FuzzHarness harness = [](const uint8_t *data, size_t size) {
|
test::FuzzHarness harness = [](const uint8_t *data, size_t size) {
|
||||||
auto provider = test::FuzzDataProvider { data, size };
|
auto provider = test::FuzzDataProvider { data, size };
|
||||||
|
|
||||||
auto registry = create_ref<ecs::Registry>();
|
auto registry = memory::create_ref<ecs::Registry>();
|
||||||
auto system = surface::System { registry };
|
auto system = surface::System { registry };
|
||||||
|
|
||||||
while (auto action = provider.consume<uint8_t>())
|
while (auto action = provider.consume<uint8_t>())
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
#include <ecs/entity.hpp>
|
#include <ecs/entity.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
#include <surface/components.hpp>
|
#include <surface/components.hpp>
|
||||||
#include <surface/requests/surface.hpp>
|
#include <surface/requests/surface.hpp>
|
||||||
|
@ -41,7 +43,7 @@ struct overloads: Ts...
|
||||||
class Fixture
|
class Fixture
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] auto registry() -> Ref<ecs::Registry>
|
[[nodiscard]] auto registry() -> memory::Ref<ecs::Registry>
|
||||||
{
|
{
|
||||||
return m_registry;
|
return m_registry;
|
||||||
}
|
}
|
||||||
|
@ -74,7 +76,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ref<ecs::Registry> m_registry = create_ref<ecs::Registry>();
|
memory::Ref<ecs::Registry> m_registry = memory::create_ref<ecs::Registry>();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -108,7 +110,7 @@ Suite raii = "raii"_suite = [] {
|
||||||
|
|
||||||
Case { "post destruct has correct state" } = [] {
|
Case { "post destruct has correct state" } = [] {
|
||||||
auto fixture = Fixture {};
|
auto fixture = Fixture {};
|
||||||
auto system = create_scope<System>(fixture.registry());
|
auto system = memory::create_scope<System>(fixture.registry());
|
||||||
|
|
||||||
fixture.add_surface_component();
|
fixture.add_surface_component();
|
||||||
expect_eq(fixture.registry()->view<SurfaceComponent>().get_size(), 1);
|
expect_eq(fixture.registry()->view<SurfaceComponent>().get_size(), 1);
|
||||||
|
@ -184,7 +186,7 @@ Suite registry_events = "registry_events"_suite = [] {
|
||||||
|
|
||||||
Case { "on_destrroy<SurfaceComponent> cleans up component" } = [] {
|
Case { "on_destrroy<SurfaceComponent> cleans up component" } = [] {
|
||||||
auto fixture = Fixture {};
|
auto fixture = Fixture {};
|
||||||
auto system = create_scope<System>(fixture.registry());
|
auto system = memory::create_scope<System>(fixture.registry());
|
||||||
|
|
||||||
const auto &component = fixture.add_surface_component();
|
const auto &component = fixture.add_surface_component();
|
||||||
expect_eq(fixture.registry()->view<SurfaceComponent>().get_size(), 1);
|
expect_eq(fixture.registry()->view<SurfaceComponent>().get_size(), 1);
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
|
#include <memory/reference.hpp>
|
||||||
#include <surface/system.hpp>
|
#include <surface/system.hpp>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
namespace lt::surface {
|
namespace lt::surface {
|
||||||
|
|
||||||
System::System(Ref<ecs::Registry> registry, Ref<app::EventMediator> event_mediator)
|
System::System(
|
||||||
|
memory::Ref<ecs::Registry> registry,
|
||||||
|
memory::Ref<app::EventMediator> event_mediator
|
||||||
|
)
|
||||||
: m_registry(std::move(registry))
|
: m_registry(std::move(registry))
|
||||||
, m_event_mediator(std::move(event_mediator))
|
, m_event_mediator(std::move(event_mediator))
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,13 +3,14 @@
|
||||||
#include <app/system.hpp>
|
#include <app/system.hpp>
|
||||||
#include <ecs/registry.hpp>
|
#include <ecs/registry.hpp>
|
||||||
#include <math/vec2.hpp>
|
#include <math/vec2.hpp>
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
|
||||||
namespace lt::surface {
|
namespace lt::surface {
|
||||||
|
|
||||||
class System: public app::ISystem
|
class System: public app::ISystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] System(Ref<ecs::Registry> registry);
|
[[nodiscard]] System(memory::Ref<ecs::Registry> registry);
|
||||||
|
|
||||||
~System() override;
|
~System() override;
|
||||||
|
|
||||||
|
@ -64,7 +65,7 @@ private:
|
||||||
|
|
||||||
void set_visibility(ecs::EntityId surface_entity, bool visible);
|
void set_visibility(ecs::EntityId surface_entity, bool visible);
|
||||||
|
|
||||||
Ref<ecs::Registry> m_registry;
|
memory::Ref<ecs::Registry> m_registry;
|
||||||
|
|
||||||
app::TickResult m_last_tick_result;
|
app::TickResult m_last_tick_result;
|
||||||
};
|
};
|
||||||
|
|
38
modules/test.sh
Executable file
38
modules/test.sh
Executable file
|
@ -0,0 +1,38 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
find . -type f \( -name "*.cpp" -o -name "*.hpp" \) -print0 | while IFS= read -r -d '' file; do
|
||||||
|
scope=false
|
||||||
|
ref=false
|
||||||
|
if grep -Eq "Scope\s*<" "$file"; then
|
||||||
|
scope=true
|
||||||
|
sed -i -E 's/(Scope)(\s*<)/memory::\1\2/g' "$file"
|
||||||
|
fi
|
||||||
|
if grep -Eq "Ref\s*<" "$file"; then
|
||||||
|
ref=true
|
||||||
|
sed -i -E 's/(Ref)(\s*<)/memory::\1\2/g' "$file"
|
||||||
|
fi
|
||||||
|
if grep -Eq "\bcreate_scope\b" "$file"; then
|
||||||
|
scope=true
|
||||||
|
sed -i -E 's/\b(create_scope)\b/memory::\1/g' "$file"
|
||||||
|
fi
|
||||||
|
if grep -Eq "\bcreate_ref\b" "$file"; then
|
||||||
|
ref=true
|
||||||
|
sed -i -E 's/\b(create_ref)\b/memory::\1/g' "$file"
|
||||||
|
fi
|
||||||
|
if $scope || $ref; then
|
||||||
|
includes=""
|
||||||
|
$scope && includes+="#include <memory/scope.hpp>\n"
|
||||||
|
$ref && includes+="#include <memory/reference.hpp>\n"
|
||||||
|
tmp=$(mktemp)
|
||||||
|
if [[ "$file" =~ \.hpp$ ]] && pragma_line=$(grep -En -m1 '^#pragma once' "$file" | cut -d: -f1); then
|
||||||
|
insert_line=$((pragma_line + 2))
|
||||||
|
else
|
||||||
|
insert_line=1
|
||||||
|
fi
|
||||||
|
head -n $((insert_line - 1)) "$file" > "$tmp"
|
||||||
|
echo -e "$includes" >> "$tmp"
|
||||||
|
tail -n +$insert_line "$file" >> "$tmp"
|
||||||
|
mv "$tmp" "$file"
|
||||||
|
clang-format -i "$file"
|
||||||
|
fi
|
||||||
|
done
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
#include <ui/gl/ui.hpp>
|
#include <ui/gl/ui.hpp>
|
||||||
#include <ui/ui.hpp>
|
#include <ui/ui.hpp>
|
||||||
|
|
||||||
|
@ -25,15 +27,17 @@ namespace lt {
|
||||||
|
|
||||||
UserInterface *UserInterface::s_context = nullptr;
|
UserInterface *UserInterface::s_context = nullptr;
|
||||||
|
|
||||||
auto UserInterface::create(Ref<SharedContext> sharedContext) -> Scope<UserInterface>
|
auto UserInterface::create(memory::Ref<SharedContext> sharedContext)
|
||||||
|
-> memory::Scope<UserInterface>
|
||||||
{
|
{
|
||||||
auto scopeUserInterface = Scope<UserInterface> { nullptr };
|
auto scopeUserInterface = memory::Scope<UserInterface> { nullptr };
|
||||||
|
|
||||||
switch (GraphicsContext::get_graphics_api())
|
switch (GraphicsContext::get_graphics_api())
|
||||||
{
|
{
|
||||||
case GraphicsAPI::OpenGL: scopeUserInterface = create_scope<glUserInterface>(); break;
|
case GraphicsAPI::OpenGL: scopeUserInterface = memory::create_scope<glUserInterface>(); break;
|
||||||
|
|
||||||
case GraphicsAPI::DirectX: lt_win(scopeUserInterface = create_scope<dxUserInterface>();) break;
|
case GraphicsAPI::DirectX:
|
||||||
|
lt_win(scopeUserInterface = memory::create_scope<dxUserInterface>();) break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ensure(
|
ensure(
|
||||||
|
@ -65,7 +69,7 @@ UserInterface::UserInterface()
|
||||||
s_context = this;
|
s_context = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserInterface::init(Ref<SharedContext> sharedContext)
|
void UserInterface::init(memory::Ref<SharedContext> sharedContext)
|
||||||
{
|
{
|
||||||
// create context
|
// create context
|
||||||
IMGUI_CHECKVERSION();
|
IMGUI_CHECKVERSION();
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory/reference.hpp>
|
||||||
|
#include <memory/scope.hpp>
|
||||||
|
|
||||||
namespace lt {
|
namespace lt {
|
||||||
|
|
||||||
class Event;
|
class Event;
|
||||||
|
@ -8,7 +11,8 @@ class SharedContext;
|
||||||
class UserInterface
|
class UserInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static auto create(Ref<SharedContext> sharedContext) -> Scope<UserInterface>;
|
static auto create(memory::Ref<SharedContext> sharedContext)
|
||||||
|
-> memory::Scope<UserInterface>;
|
||||||
|
|
||||||
static void dockspace_begin();
|
static void dockspace_begin();
|
||||||
|
|
||||||
|
@ -20,9 +24,9 @@ public:
|
||||||
|
|
||||||
virtual ~UserInterface() = default;
|
virtual ~UserInterface() = default;
|
||||||
|
|
||||||
void init(Ref<SharedContext> sharedContext);
|
void init(memory::Ref<SharedContext> sharedContext);
|
||||||
|
|
||||||
virtual void platform_implementation(Ref<SharedContext> sharedContext) = 0;
|
virtual void platform_implementation(memory::Ref<SharedContext> sharedContext) = 0;
|
||||||
|
|
||||||
virtual void begin() = 0;
|
virtual void begin() = 0;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue