Compare commits
3 commits
154d6eacf4
...
ca91c5c1d1
| Author | SHA1 | Date | |
|---|---|---|---|
| ca91c5c1d1 | |||
| 85a1bbfcab | |||
| 5cb331def9 |
12 changed files with 62 additions and 123 deletions
|
|
@ -5,8 +5,8 @@ add_subdirectory(./logger)
|
||||||
add_subdirectory(./debug)
|
add_subdirectory(./debug)
|
||||||
add_subdirectory(./math)
|
add_subdirectory(./math)
|
||||||
#
|
#
|
||||||
add_subdirectory(./asset_baker)
|
# add_subdirectory(./asset_baker)
|
||||||
add_subdirectory(./asset_parser)
|
# add_subdirectory(./asset_parser)
|
||||||
# add_subdirectory(./asset_manager)
|
# add_subdirectory(./asset_manager)
|
||||||
#
|
#
|
||||||
add_subdirectory(./camera)
|
add_subdirectory(./camera)
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,6 @@ using lt::test::expect_unreachable;
|
||||||
using lt::test::Suite;
|
using lt::test::Suite;
|
||||||
|
|
||||||
using lt::test::expect_eq;
|
using lt::test::expect_eq;
|
||||||
using lt::test::expect_ne;
|
|
||||||
using lt::test::expect_throw;
|
|
||||||
|
|
||||||
using lt::test::expect_false;
|
using lt::test::expect_false;
|
||||||
using lt::test::expect_true;
|
using lt::test::expect_true;
|
||||||
|
|
@ -19,7 +17,7 @@ using lt::ecs::Registry;
|
||||||
|
|
||||||
struct Component
|
struct Component
|
||||||
{
|
{
|
||||||
int m_int;
|
int m_int {};
|
||||||
std::string m_string;
|
std::string m_string;
|
||||||
|
|
||||||
[[nodiscard]] friend auto operator==(const Component &lhs, const Component &rhs) -> bool
|
[[nodiscard]] friend auto operator==(const Component &lhs, const Component &rhs) -> bool
|
||||||
|
|
@ -43,7 +41,7 @@ struct std::formatter<Component>
|
||||||
|
|
||||||
struct Component_B
|
struct Component_B
|
||||||
{
|
{
|
||||||
float m_float;
|
float m_float {};
|
||||||
|
|
||||||
[[nodiscard]] friend auto operator==(const Component_B lhs, const Component_B &rhs) -> bool
|
[[nodiscard]] friend auto operator==(const Component_B lhs, const Component_B &rhs) -> bool
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@ namespace lt::ecs {
|
||||||
|
|
||||||
using Entity = uint32_t;
|
using Entity = uint32_t;
|
||||||
|
|
||||||
|
constexpr auto null_entity = std::numeric_limits<Entity>::max();
|
||||||
|
|
||||||
/** A registry of components, the heart of an ECS architecture.
|
/** A registry of components, the heart of an ECS architecture.
|
||||||
*
|
*
|
||||||
* @todo(Light): Implement grouping
|
* @todo(Light): Implement grouping
|
||||||
|
|
|
||||||
|
|
@ -150,6 +150,11 @@ public:
|
||||||
return m_sparse.capacity();
|
return m_sparse.capacity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] auto is_empty() const noexcept -> bool
|
||||||
|
{
|
||||||
|
return m_dense.empty();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<Dense_T> m_dense;
|
std::vector<Dense_T> m_dense;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,13 +35,13 @@ public:
|
||||||
void static show_imgui_window();
|
void static show_imgui_window();
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
void static log(LogLvl lvl, std::format_string<Args...> fmt, Args &&...args)
|
void static log(LogLvl lvl, std::format_string<Args...> fmt, Args &&...args) noexcept
|
||||||
{
|
{
|
||||||
std::ignore = lvl;
|
std::ignore = lvl;
|
||||||
std::println(fmt, std::forward<Args>(args)...);
|
std::println(fmt, std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
void static log(LogLvl lvl, const char *message)
|
void static log(LogLvl lvl, const char *message) noexcept
|
||||||
{
|
{
|
||||||
std::ignore = lvl;
|
std::ignore = lvl;
|
||||||
std::println("{}", message);
|
std::println("{}", message);
|
||||||
|
|
@ -53,37 +53,37 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
void log_trc(std::format_string<Args...> fmt, Args &&...args)
|
void log_trc(std::format_string<Args...> fmt, Args &&...args) noexcept
|
||||||
{
|
{
|
||||||
Logger::log(LogLvl::trace, fmt, std::forward<Args>(args)...);
|
Logger::log(LogLvl::trace, fmt, std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
void log_dbg(std::format_string<Args...> fmt, Args &&...args)
|
void log_dbg(std::format_string<Args...> fmt, Args &&...args) noexcept
|
||||||
{
|
{
|
||||||
Logger::log(LogLvl::debug, fmt, std::forward<Args>(args)...);
|
Logger::log(LogLvl::debug, fmt, std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
void log_inf(std::format_string<Args...> fmt, Args &&...args)
|
void log_inf(std::format_string<Args...> fmt, Args &&...args) noexcept
|
||||||
{
|
{
|
||||||
Logger::log(LogLvl::info, fmt, std::forward<Args>(args)...);
|
Logger::log(LogLvl::info, fmt, std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
void log_wrn(std::format_string<Args...> fmt, Args &&...args)
|
void log_wrn(std::format_string<Args...> fmt, Args &&...args) noexcept
|
||||||
{
|
{
|
||||||
Logger::log(LogLvl::warn, fmt, std::forward<Args>(args)...);
|
Logger::log(LogLvl::warn, fmt, std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
void log_err(std::format_string<Args...> fmt, Args &&...args)
|
void log_err(std::format_string<Args...> fmt, Args &&...args) noexcept
|
||||||
{
|
{
|
||||||
Logger::log(LogLvl::error, fmt, std::forward<Args>(args)...);
|
Logger::log(LogLvl::error, fmt, std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
void log_crt(std::format_string<Args...> fmt, Args &&...args)
|
void log_crt(std::format_string<Args...> fmt, Args &&...args) noexcept
|
||||||
{
|
{
|
||||||
Logger::log(LogLvl::critical, fmt, std::forward<Args>(args)...);
|
Logger::log(LogLvl::critical, fmt, std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -201,7 +201,7 @@ private:
|
||||||
|
|
||||||
Ref<MirrorSystem> m_mirror_system;
|
Ref<MirrorSystem> m_mirror_system;
|
||||||
|
|
||||||
lt::ecs::Entity m_window;
|
lt::ecs::Entity m_window = lt::ecs::null_entity;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto app::create_application() -> Scope<app::Application>
|
auto app::create_application() -> Scope<app::Application>
|
||||||
|
|
|
||||||
|
|
@ -58,20 +58,28 @@ System::System(Ref<ecs::Registry> registry): m_registry(std::move(registry))
|
||||||
|
|
||||||
System::~System()
|
System::~System()
|
||||||
{
|
{
|
||||||
// TODO(Light): make registry.remove not validate iterators
|
try
|
||||||
auto entities_to_remove = std::vector<ecs::Entity> {};
|
|
||||||
for (auto &[entity, surface] : m_registry->view<SurfaceComponent>())
|
|
||||||
{
|
{
|
||||||
entities_to_remove.emplace_back(entity);
|
// TODO(Light): make registry.remove not validate iterators
|
||||||
}
|
auto entities_to_remove = std::vector<ecs::Entity> {};
|
||||||
|
for (auto &[entity, surface] : m_registry->view<SurfaceComponent>())
|
||||||
|
{
|
||||||
|
entities_to_remove.emplace_back(entity);
|
||||||
|
}
|
||||||
|
|
||||||
for (auto entity : entities_to_remove)
|
for (auto entity : entities_to_remove)
|
||||||
|
{
|
||||||
|
m_registry->remove<SurfaceComponent>(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_registry->disconnect_on_construct<SurfaceComponent>();
|
||||||
|
m_registry->disconnect_on_destruct<SurfaceComponent>();
|
||||||
|
}
|
||||||
|
catch (const std::exception &exp)
|
||||||
{
|
{
|
||||||
m_registry->remove<SurfaceComponent>(entity);
|
log_err("Uncaught exception in surface::~System:");
|
||||||
|
log_err("\twhat: {}", exp.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
m_registry->disconnect_on_construct<SurfaceComponent>();
|
|
||||||
m_registry->disconnect_on_destruct<SurfaceComponent>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void System::on_register()
|
void System::on_register()
|
||||||
|
|
@ -141,8 +149,8 @@ void System::on_surface_construct(ecs::Registry ®istry, ecs::Entity entity)
|
||||||
XSetWMProtocols(display, main_window, &surface.m_native_data.wm_delete_message, 1);
|
XSetWMProtocols(display, main_window, &surface.m_native_data.wm_delete_message, 1);
|
||||||
|
|
||||||
// code to remove decoration
|
// code to remove decoration
|
||||||
long hints[5] = { 2, 0, 0, 0, 0 };
|
auto hints = std::array<unsigned char, 5> { 2, 0, 0, 0, 0 };
|
||||||
Atom motif_hints = XInternAtom(display, "_MOTIF_WM_HINTS", False);
|
const auto motif_hints = XInternAtom(display, "_MOTIF_WM_HINTS", False);
|
||||||
|
|
||||||
XChangeProperty(
|
XChangeProperty(
|
||||||
display,
|
display,
|
||||||
|
|
@ -151,7 +159,7 @@ void System::on_surface_construct(ecs::Registry ®istry, ecs::Entity entity)
|
||||||
motif_hints,
|
motif_hints,
|
||||||
32,
|
32,
|
||||||
PropModeReplace,
|
PropModeReplace,
|
||||||
(unsigned char *)&hints,
|
hints.data(),
|
||||||
5
|
5
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -283,28 +291,7 @@ void System::handle_events(SurfaceComponent &surface)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Expose: break;
|
default: break; /* pass */
|
||||||
case GraphicsExpose: break;
|
|
||||||
case NoExpose: break;
|
|
||||||
case CirculateRequest: break;
|
|
||||||
case ConfigureRequest: break;
|
|
||||||
case MapRequest: break;
|
|
||||||
case ResizeRequest: break;
|
|
||||||
case CirculateNotify: break;
|
|
||||||
case CreateNotify: break;
|
|
||||||
case DestroyNotify: break;
|
|
||||||
case GravityNotify: break;
|
|
||||||
case MapNotify: break;
|
|
||||||
case MappingNotify: break;
|
|
||||||
case ReparentNotify: break;
|
|
||||||
case UnmapNotify: break;
|
|
||||||
case VisibilityNotify: break;
|
|
||||||
case ColormapNotify: break;
|
|
||||||
case PropertyNotify: break;
|
|
||||||
case SelectionClear: break;
|
|
||||||
case SelectionNotify: break;
|
|
||||||
case SelectionRequest: break;
|
|
||||||
default: log_inf("Unknown X Event");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,9 @@ void create_surface_component(test::FuzzDataProvider &provider, ecs::Registry &r
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
registry.create_entity("").add_component<surface::SurfaceComponent>(
|
auto entity = registry.create_entity();
|
||||||
|
registry.add<surface::SurfaceComponent>(
|
||||||
|
entity,
|
||||||
surface::SurfaceComponent::CreateInfo {
|
surface::SurfaceComponent::CreateInfo {
|
||||||
.title = std::move(title),
|
.title = std::move(title),
|
||||||
.resolution = resolution,
|
.resolution = resolution,
|
||||||
|
|
@ -64,11 +66,11 @@ void create_surface_component(test::FuzzDataProvider &provider, ecs::Registry &r
|
||||||
|
|
||||||
void remove_surface_component(ecs::Registry ®istry)
|
void remove_surface_component(ecs::Registry ®istry)
|
||||||
{
|
{
|
||||||
const auto view = registry.get_entt_registry().view<SurfaceComponent>();
|
const auto view = registry.view<SurfaceComponent>();
|
||||||
|
|
||||||
if (!view->empty())
|
if (!view.is_empty())
|
||||||
{
|
{
|
||||||
registry.get_entt_registry().remove<SurfaceComponent>(*view.begin());
|
registry.remove<SurfaceComponent>(view[0].first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -102,8 +104,7 @@ test::FuzzHarness harness = [](const uint8_t *data, size_t size) {
|
||||||
case FuzzAction::create_entity:
|
case FuzzAction::create_entity:
|
||||||
{
|
{
|
||||||
const auto length = std::min(provider.consume<uint32_t>().value_or(16), 255u);
|
const auto length = std::min(provider.consume<uint32_t>().value_or(16), 255u);
|
||||||
const auto tag = provider.consume_string(length).value_or("");
|
registry->create_entity();
|
||||||
registry->create_entity(tag);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -119,15 +120,15 @@ test::FuzzHarness harness = [](const uint8_t *data, size_t size) {
|
||||||
}
|
}
|
||||||
case FuzzAction::push_event:
|
case FuzzAction::push_event:
|
||||||
{
|
{
|
||||||
const auto view = registry->get_entt_registry().view<SurfaceComponent>();
|
auto view = registry->view<SurfaceComponent>();
|
||||||
|
|
||||||
if (!view->empty())
|
if (!view.is_empty())
|
||||||
{
|
{
|
||||||
view.each([&](auto entity, SurfaceComponent &surface) {
|
for (auto &[entity, component] : view)
|
||||||
|
{
|
||||||
provider.consume<uint8_t>().value_or(0);
|
provider.consume<uint8_t>().value_or(0);
|
||||||
});
|
// @TODO(Light): push some event
|
||||||
|
}
|
||||||
registry->get_entt_registry().remove<SurfaceComponent>(*view.begin());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
@ -136,6 +137,7 @@ test::FuzzHarness harness = [](const uint8_t *data, size_t size) {
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case FuzzAction::count:
|
||||||
case FuzzAction::tick_system:
|
case FuzzAction::tick_system:
|
||||||
{
|
{
|
||||||
system.tick();
|
system.tick();
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,7 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
cd $(git rev-parse --show-toplevel)/
|
cd $(git rev-parse --show-toplevel)/
|
||||||
rm -rf ./build
|
rm -rf ./build && mkdir build/ && cd build
|
||||||
mkdir build/ && cd build
|
|
||||||
|
|
||||||
Xvfb :99 -screen 0 1024x768x16 &
|
Xvfb :99 -screen 0 1024x768x16 &
|
||||||
export CXX=$(which g++)
|
export CXX=$(which g++)
|
||||||
|
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
FROM alpine:latest
|
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
bash \
|
|
||||||
curl \
|
|
||||||
findutils \
|
|
||||||
git \
|
|
||||||
libc6-compat \
|
|
||||||
clang-extra-tools
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
FROM alpine:latest
|
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
bash \
|
|
||||||
clang \
|
|
||||||
llvm \
|
|
||||||
cmake \
|
|
||||||
git \
|
|
||||||
make \
|
|
||||||
g++ \
|
|
||||||
python3 \
|
|
||||||
py3-pip \
|
|
||||||
mesa-dev \
|
|
||||||
mesa-gl \
|
|
||||||
pkgconf \
|
|
||||||
clang-extra-tools \
|
|
||||||
mold \
|
|
||||||
ninja
|
|
||||||
|
|
||||||
RUN pip install --no-cache-dir --break-system-packages conan gitpython \
|
|
||||||
&& conan profile detect
|
|
||||||
|
|
||||||
RUN clang --version \
|
|
||||||
&& conan --version \
|
|
||||||
&& pip --version \
|
|
||||||
&& cmake --version \
|
|
||||||
&& g++ --version \
|
|
||||||
&& clang --version \
|
|
||||||
&& clang-tidy --version \
|
|
||||||
&& ninja --version \
|
|
||||||
&& mold --version
|
|
||||||
|
|
||||||
|
|
||||||
RUN git clone 'https://git.light7734.com/light7734/light.git' \
|
|
||||||
&& cd light \
|
|
||||||
&& conan install . \
|
|
||||||
-c tools.system.package_manager:mode=install \
|
|
||||||
-c tools.cmake.cmaketoolchain:generator=Ninja \
|
|
||||||
-s build_type=Release \
|
|
||||||
-o enable_static_analysis=True \
|
|
||||||
-o use_mold=True \
|
|
||||||
--build=missing
|
|
||||||
|
|
@ -2,19 +2,16 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
cd $(git rev-parse --show-toplevel)/
|
cd $(git rev-parse --show-toplevel)/
|
||||||
rm -rf ./build
|
rm -rf ./build && mkdir build/ && cd build
|
||||||
|
|
||||||
echo 'Static analysis is currently disabled as code is filled with failing clang-tidy checks'
|
export CC=$(which clang)
|
||||||
echo 'Runng this would be a waste of CPU cycles and electricty'
|
export CXX=$(which clang++)
|
||||||
echo 'Fix the checks before removing these lines'
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
cmake .. \
|
cmake .. \
|
||||||
-G Ninja \
|
-G Ninja \
|
||||||
-DCMAKE_LINKER_TYPE=MOLD \
|
-DCMAKE_LINKER_TYPE=MOLD \
|
||||||
-DENABLE_UNIT_TESTS=ON \
|
-DENABLE_UNIT_TESTS=ON \
|
||||||
-DENABLE_FUZZ_TESTS=ON \
|
-DENABLE_STATIC_ANALYSIS=ON \
|
||||||
-CMAKE_CXX_CLANG_TIDY=ON \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DCMAKE_CXX_FLAGS="-std=c++23 -stdlib=libc++ -g -fno-omit-frame-pointer" \
|
-DCMAKE_CXX_FLAGS="-std=c++23 -stdlib=libc++" \
|
||||||
&& cmake --build . -j `nproc`
|
&& cmake --build . -j `nproc`
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue