151 lines
3.8 KiB
C++
151 lines
3.8 KiB
C++
#include <memory/reference.hpp>
|
|
#include <surface/system.hpp>
|
|
#include <utility>
|
|
|
|
namespace lt::surface {
|
|
|
|
System::System(
|
|
memory::Ref<ecs::Registry> registry,
|
|
memory::Ref<app::EventMediator> event_mediator
|
|
)
|
|
: m_registry(std::move(registry))
|
|
, m_event_mediator(std::move(event_mediator))
|
|
{
|
|
ensure(m_registry, "Failed to initialize surface system: null registry");
|
|
|
|
ensure(
|
|
m_registry->view<SurfaceComponent>().size() == 0,
|
|
"Failed to initialize surface system: registry has surface component(s)"
|
|
);
|
|
|
|
m_registry->get_entt_registry()
|
|
.on_construct<SurfaceComponent>()
|
|
.connect<&System::on_surface_construct>(this);
|
|
|
|
m_registry->get_entt_registry()
|
|
.on_update<SurfaceComponent>()
|
|
.connect<&System::on_surface_update>(this);
|
|
|
|
m_registry->get_entt_registry()
|
|
.on_destroy<SurfaceComponent>()
|
|
.connect<&System::on_surface_destroy>(this);
|
|
}
|
|
|
|
System::~System()
|
|
{
|
|
m_registry->get_entt_registry()
|
|
.on_construct<SurfaceComponent>()
|
|
.disconnect<&System::on_surface_construct>(this);
|
|
|
|
m_registry->get_entt_registry()
|
|
.on_update<SurfaceComponent>()
|
|
.connect<&System::on_surface_update>(this);
|
|
|
|
m_registry->get_entt_registry()
|
|
.on_destroy<SurfaceComponent>()
|
|
.disconnect<&System::on_surface_destroy>(this);
|
|
|
|
|
|
m_registry->view<SurfaceComponent>().each([&](const entt::entity entity, SurfaceComponent &) {
|
|
m_registry->get_entt_registry().remove<SurfaceComponent>(entity);
|
|
});
|
|
}
|
|
|
|
void System::on_surface_construct(entt::registry ®istry, entt::entity entity)
|
|
{
|
|
try
|
|
{
|
|
auto &surface = registry.get<SurfaceComponent>(entity);
|
|
const auto &resolution = surface.get_resolution();
|
|
const auto &position = surface.get_position();
|
|
ensure_component_sanity(surface);
|
|
}
|
|
catch (...)
|
|
{
|
|
registry.remove<SurfaceComponent>(entity);
|
|
throw;
|
|
}
|
|
}
|
|
|
|
void System::on_surface_update(entt::registry ®istry, entt::entity entity)
|
|
{
|
|
auto &surface = registry.get<SurfaceComponent>(entity);
|
|
}
|
|
|
|
void System::on_surface_destroy(entt::registry ®istry, entt::entity entity)
|
|
{
|
|
auto &surface = registry.get<SurfaceComponent>(entity);
|
|
}
|
|
|
|
void System::set_title(ecs::Entity entity, std::string_view new_title)
|
|
{
|
|
auto &surface = entity.get_component<SurfaceComponent>();
|
|
|
|
surface.m_title = new_title;
|
|
}
|
|
|
|
auto System::tick() -> bool
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void System::set_size(ecs::Entity surface_entity, const math::uvec2 &new_size)
|
|
{
|
|
auto &surface = surface_entity.get_component<SurfaceComponent>();
|
|
surface.m_resolution = new_size;
|
|
}
|
|
|
|
void System::set_v_sync(ecs::Entity surface_entity, bool vsync)
|
|
{
|
|
auto &surface = surface_entity.get_component<SurfaceComponent>();
|
|
surface.m_vsync = vsync;
|
|
}
|
|
|
|
void System::set_visibility(ecs::Entity surface_entity, bool visible)
|
|
{
|
|
auto &surface = surface_entity.get_component<SurfaceComponent>();
|
|
surface.m_visible = visible;
|
|
|
|
if (visible)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
|
|
void System::ensure_component_sanity(const SurfaceComponent &component)
|
|
{
|
|
auto [width, height] = component.get_resolution();
|
|
|
|
ensure(width != 0u, "Received bad values for surface component: width({}) == 0", width);
|
|
|
|
ensure(height != 0u, "Received bad values for surface component: height({}) == 0", height);
|
|
|
|
ensure(
|
|
width < SurfaceComponent::max_dimension,
|
|
"Received bad values for surface component: width({}) > max_dimension({})",
|
|
width,
|
|
SurfaceComponent::max_dimension
|
|
);
|
|
|
|
ensure(
|
|
height < SurfaceComponent::max_dimension,
|
|
"Received bad values for surface component: height({}) > max_dimension({})",
|
|
height,
|
|
SurfaceComponent::max_dimension
|
|
);
|
|
|
|
ensure(
|
|
component.get_title().size() < SurfaceComponent::max_title_length,
|
|
"Received bad values for surface component: title.size({}) > max_title_length({})",
|
|
component.get_title().size(),
|
|
SurfaceComponent::max_title_length
|
|
);
|
|
}
|
|
|
|
} // namespace lt::surface
|
|
|
|
namespace lt {
|
|
|
|
} // namespace lt
|