From a2efc487c47d19f617585fefad01bd1b128af13d Mon Sep 17 00:00:00 2001 From: light7734 Date: Fri, 14 Nov 2025 16:04:37 +0330 Subject: [PATCH] wip: convert from include style to module import style :D --- .clang-tidy | 248 -------------- .clangd | 5 - .cmake-format | 17 + CMakeLists.txt | 8 +- CONTRIBUTING.md | 14 - data/test_assets/sprite.vert | 36 ++ data/test_assets/sprite.vert.asset | Bin 0 -> 2128 bytes data/test_assets/triangle.vert | 3 +- docs/.gitignore | 1 - modules/CMakeLists.txt | 24 +- modules/asset_parser/text.cppm | 162 --------- modules/input/system.cppm | 2 +- modules/math/algebra.cppm | 2 +- modules/math/trig.cppm | 2 +- modules/memory/null_on_move.cppm | 2 +- .../mirror/{entrypoint.cpp => system.cppm} | 83 ++--- modules/renderer/factory.cppm | 43 +-- modules/renderer/frontends.cppm | 181 +++------- modules/renderer/system.cppm | 94 +++--- modules/renderer/vk/api_wrapper.cppm | 76 ++++- modules/renderer/vk/buffer.cppm | 8 +- modules/renderer/vk/debugger.cppm | 316 ++++++++---------- modules/renderer/vk/device.cppm | 10 +- modules/renderer/vk/gpu.cppm | 6 +- modules/renderer/vk/instance.cppm | 5 +- modules/renderer/vk/pass.cppm | 6 +- modules/renderer/vk/renderer.cppm | 10 +- modules/renderer/vk/surface.cppm | 6 +- modules/renderer/vk/swapchain.cppm | 12 +- modules/time/timer.cppm | 2 +- tools/ci/amd64/Dockerfile | 100 +++--- tools/cmake/functions.cmake | 134 +++++--- tools/cmake/options.cmake | 20 +- 33 files changed, 654 insertions(+), 984 deletions(-) delete mode 100644 .clangd create mode 100644 .cmake-format delete mode 100644 CONTRIBUTING.md create mode 100644 data/test_assets/sprite.vert create mode 100644 data/test_assets/sprite.vert.asset delete mode 100644 modules/asset_parser/text.cppm rename modules/mirror/{entrypoint.cpp => system.cppm} (78%) diff --git a/.clang-tidy b/.clang-tidy index 52d762a..e69de29 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,248 +0,0 @@ ---- -Checks: "-*, - -performance-unnecessary-value-param, -performance-unnecessary-copy-initialization, -performance-type-promotion-in-math-fn, -performance-trivially-destructible, -performance-noexcept-swap, -performance-noexcept-move-constructor, -performance-noexcept-destructor, -performance-no-int-to-ptr, -performance-no-automatic-move, -performance-move-constructor-init, -performance-move-const-arg, -performance-inefficient-vector-operation, -performance-inefficient-string-concatenation, -performance-inefficient-algorithm, -performance-implicit-conversion-in-loop, -performance-for-range-copy, -performance-faster-string-find, -performance-enum-size, -performance-avoid-endl, - -readability-avoid-const-params-in-decls, -readability-avoid-nested-conditional-operator, -readability-avoid-return-with-void-value, -readability-avoid-unconditional-preprocessor-if, -readability-braces-around-statements, -readability-const-return-type, -readability-container-contains, -readability-container-data-pointdr, -readability-container-size-empty, -readability-delete-null-pointer, -readability-duplicate-include, -readability-else-after-return, -readability-inconsistent-declaration-parameter-name, -readability-isolate-declaration, -readability-make-member-function-const, -readability-misleading-indentation, -readability-misplaced-array-index, -readability-named-parameter, -readability-non-const-parameter, -readability-qualified-auto, -readability-redundant-access-specifiers, -readability-redundant-casting, -readability-redundant-control-flow, -readability-redundant-declaration, -readability-redundant-function-ptr-dereference, -readability-redundant-inline-specifier, -readability-redundant-member-init, -readability-redundant-preprocessor, -readability-redundant-smartptr-get, -readability-redundant-string-cstr, -readability-reference-to-constructed-temporary, -readability-simplify-boolean-expr, -readability-simplify-subscript-expr, -readability-static-accessed-through-instance, -readability-static-definition-in-anonymous-namespace, -readability-string-compare, -readability-suspicious-call-argument, -readability-uniqueptr-delete-release, -readability-use-anyofallof -readability-use-std-min-max, -readability-function-cognitive-complexity -readability-function-size -readability-identifier-naming -readability-identifier-length -readability-magic-numbers - -modernize-avoid-bind, -modernize-avoid-c-arrays, -modernize-concat-nested-namespaces, -modernize-deprecated-headers, -modernize-deprecated-ios-base-aliases, -modernize-loop-convert, -modernize-macro-to-enum, -modernize-make-shared, -modernize-make-unique, -modernize-pass-by-value, -modernize-raw-string-literal, -modernize-redundant-void-arg, -modernize-replace-auto-ptr, -modernize-replace-disallow-copy-and-assign-macro, -modernize-replace-random-shuffle, -modernize-return-braced-init-list, -modernize-shrink-to-fit, -modernize-type-traits, -modernize-unary-static-assert, -modernize-use-auto, -modernize-use-bool-literals, -modernize-use-constraints, -modernize-use-default-member-init, -modernize-use-designated-initializers, -modernize-use-emplace, -modernize-use-equals-default, -modernize-use-equals-delete, -modernize-use-nodiscard, -modernize-use-noexcept, -modernize-use-nullptr, -modernize-use-override, -modernize-use-starts-ends-with, -modernize-use-std-numbers, -modernize-use-std-print, -modernize-use-transparent-functors, -modernize-use-uncaught-exceptions, -modernize-use-using -modernize-min-max-use-initializer-list, - -cppcoreguidelines-avoid-capturing-lambda-coroutines, -cppcoreguidelines-avoid-const-or-ref-data-members, -cppcoreguidelines-avoid-do-while, -cppcoreguidelines-avoid-goto, -cppcoreguidelines-avoid-non-const-global-variables, -cppcoreguidelines-avoid-reference-coroutine-parameters, -cppcoreguidelines-init-variables, -cppcoreguidelines-interfaces-global-init, -cppcoreguidelines-macro-usage, -cppcoreguidelines-misleading-capture-default-by-value, -cppcoreguidelines-missing-std-forward, -cppcoreguidelines-narrowing-conversions, -cppcoreguidelines-no-malloc, -cppcoreguidelines-no-suspend-with-lock, -cppcoreguidelines-owning-memory, -cppcoreguidelines-prefer-member-initializer, -cppcoreguidelines-pro-bounds-array-to-pointer-decay, -cppcoreguidelines-pro-bounds-pointer-arithmetic, -cppcoreguidelines-pro-type-const-cast, -cppcoreguidelines-pro-type-cstyle-cast, -cppcoreguidelines-pro-type-member-init, -cppcoreguidelines-pro-type-reinterpret-cast, -cppcoreguidelines-pro-type-static-cast-downcast, -cppcoreguidelines-pro-type-vararg, -cppcoreguidelines-rvalue-reference-param-not-moved, -cppcoreguidelines-slicing, -cppcoreguidelines-special-member-functions, -cppcoreguidelines-virtual-class-destructor, - -bugprone-argument-comment, -bugprone-assert-side-effect, -bugprone-assignment-in-if-condition, -bugprone-bad-signal-to-kill-thread, -bugprone-bool-pointer-implicit-conversion, -bugprone-branch-clone, -bugprone-casting-through-void, -bugprone-chained-comparison, -bugprone-compare-pointer-to-member-virtual-function, -bugprone-copy-constructor-init, -bugprone-crtp-constructor-accessibility, -bugprone-dangling-handle, -bugprone-empty-catch, -bugprone-exception-escape, -bugprone-fold-init-type, -bugprone-forward-declaration-namespace, -bugprone-forwarding-reference-overload, -bugprone-implicit-widening-of-multiplication-result, -bugprone-inaccurate-erase, -bugprone-inc-dec-in-conditions, -bugprone-incorrect-enable-if, -bugprone-incorrect-roundings, -bugprone-infinite-loop, -bugprone-integer-division, -bugprone-lambda-function-name, -bugprone-macro-parentheses, -bugprone-macro-repeated-side-effects, -bugprone-misplaced-operator-in-strlen-in-alloc, -bugprone-misplaced-pointer-arithmetic-in-alloc, -bugprone-misplaced-widening-cast, -bugprone-move-forwarding-reference, -bugprone-multi-level-implicit-pointer-conversion, -bugprone-multiple-new-in-one-expression, -bugprone-multiple-statement-macro, -bugprone-no-escape, -bugprone-non-zero-enum-to-bool-conversion, -bugprone-not-null-terminated-result, -bugprone-optional-value-conversion, -bugprone-parent-virtual-call, -bugprone-posix-return, -bugprone-redundant-branch-condition, -bugprone-reserved-identifier, -bugprone-return-const-ref-from-parameter, -bugprone-shared-ptr-array-mismatch, -bugprone-signal-handler, -bugprone-signed-char-misuse, -bugprone-sizeof-container, -bugprone-sizeof-expression, -bugprone-spuriously-wake-up-functions, -bugprone-standalone-empty, -bugprone-string-constructor, -bugprone-string-integer-assignment, -bugprone-string-literal-with-embedded-nul, -bugprone-stringview-nullptr, -bugprone-suspicious-enum-usage, -bugprone-suspicious-include, -bugprone-suspicious-memory-comparison, -bugprone-suspicious-memset-usage, -bugprone-suspicious-missing-comma, -bugprone-suspicious-realloc-usage, -bugprone-suspicious-semicolon, -bugprone-suspicious-string-compare, -bugprone-suspicious-stringview-data-usage, -bugprone-swapped-arguments, -bugprone-switch-missing-default-case, -bugprone-terminating-continue, -bugprone-throw-keyword-missing, -bugprone-too-small-loop-variable, -bugprone-unchecked-optional-access, -bugprone-undefined-memory-manipulation, -bugprone-undelegated-constructor, -bugprone-unhandled-exception-at-new, -bugprone-unhandled-self-assignment, -bugprone-unique-ptr-array-mismatch, -bugprone-unsafe-functions, -bugprone-unused-local-non-trivial-variable, -bugprone-unused-raii, -bugprone-unused-return-value, -bugprone-use-after-move, -bugprone-virtual-near-miss, - -concurrency-mt-unsafe, -concurrency-thread-canceltype-asynchronous, - -misc-use-anonymous-namespace, -misc-unused-using-decls, -misc-unused-parameters, -misc-unused-alias-decls, -misc-uniqueptr-reset-release, -misc-unconventional-assign-operator, -misc-throw-by-value-catch-by-reference, -misc-static-assert, -misc-redundant-expression, -misc-non-private-member-variables-in-classes, -misc-non-copyable-objects, -misc-no-recursion, -misc-new-delete-overloads, -misc-misplaced-const, -misc-misleading-identifier, -misc-misleading-bidirectional, -misc-header-include-cycle, -misc-definitions-in-headers, -misc-coroutine-hostile-raii, -misc-const-correctness, - -hicpp-signed-bitwise, -hicpp-no-assembler, -hicpp-multiway-paths-covered, -hicpp-ignored-remove-result, -hicpp-exception-baseclass, -" diff --git a/.clangd b/.clangd deleted file mode 100644 index 6670621..0000000 --- a/.clangd +++ /dev/null @@ -1,5 +0,0 @@ -CompileFlags: - DriverMode: cl - Add: - - /EHsc - - /std:c++latest diff --git a/.cmake-format b/.cmake-format new file mode 100644 index 0000000..ab6a3f5 --- /dev/null +++ b/.cmake-format @@ -0,0 +1,17 @@ +# How wide to allow formatted cmake files +line_width: 80 + +# How many spaces to tab for indent +tab_size: 4 + +dangle_parens: true + +# Additional FLAGS and KWARGS for custom commands +additional_commands: + foo: + flags: [BAR, BAZ] + kwargs: + HEADERS : '*' + SOURCES : '*' + DEPENDS : '*' + diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f5e47b..2c6d5b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,10 @@ -cmake_minimum_required(VERSION 3.14) +set(CMAKE_CXX_STANDARD 23) +set(CMAKE_EPXORT_COMPILE_COMMANDS TRUE) +set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "d0edc3af-4c50-42ea-a356-e2862fe7a444") +set(CMAKE_CXX_STANDARD_REQUIRED TRUE) +set(CMAKE_CXX_MODULE_STD 1) + +cmake_minimum_required(VERSION 4.1) project(Light) include(${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/functions.cmake) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 92c68e3..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,14 +0,0 @@ -# How to contribute to Light Engine - -Thanks for putting in the time to contribute to this project <3 - -## Coding conventions - -For the time being, don't worry too much about the conventions... - -Try to read other parts of the code and you'll get the hang of it - -I have to learn clang-format, then everyone contributing can use it to format their code - - -###### happy coding- diff --git a/data/test_assets/sprite.vert b/data/test_assets/sprite.vert new file mode 100644 index 0000000..438ae78 --- /dev/null +++ b/data/test_assets/sprite.vert @@ -0,0 +1,36 @@ +#version 450 core + +layout(push_constant) uniform pc +{ + mat4 view_projection; +}; + + +struct VertexData +{ + vec3 position; + vec3 color; +}; + +// readonly SSBO containing the vertex data +layout(set = 0, binding = 0, std430) readonly buffer vertex_data { + VertexData data[]; +}; + +vec3 position(int idx) +{ + return data[idx].position; +} + +vec3 color(int idx) +{ + return data[idx].color; +} + +layout(location = 0) out vec3 out_frag_color; + +void main() +{ + gl_Position = view_projection * vec4(position(gl_VertexIndex), 1.0); + out_frag_color = color(gl_VertexIndex); +} diff --git a/data/test_assets/sprite.vert.asset b/data/test_assets/sprite.vert.asset new file mode 100644 index 0000000000000000000000000000000000000000..7514cd62137d4e341757e77440832840ce9cb4e5 GIT binary patch literal 2128 zcmYk7Yfscr5QY!z1q4A6xoBiv1O)_96a++IS0IbYCZHsKZPwjNYD&A=Er@>dFZh@I zResUuUGQ74&`;G zR(EPgN45Ha(`>h$ZuH%E9p4LFr{#6rX5?MC#Pw(5yrAiyx3U2RMP%z1)bCBzXop=d z^1@)=TiKFn3aULQ>9sDU7u2&c&Cm}!X#oD=jDJM>C$|&1m-~&VVU)FKz#y9&y{KH^ z>>9JqjwG}%#;FbGs%YzU3l&{r`-v^ayelT z$8o<9GjPw!n+)(iXt|f*dGktmyU}T!rExq9;d$hI=`>EAbZNv@GI57GY4<%N9I_a5 zgWVR_bncF1QCyDgT)b=MKTPjIs+o-K>wB;{YnqjNz)vppX)$E&M~Nvr7w7Mb3gdVYyHgCBc?BQKws>VnPw%+Vu*O`$713i$bKS8 zJXlH9<|J(nd@yzAC7BgJePS=9*raUs%sJ{ZBliTx*(J%O-{dSd?+Y0Imf;7Ya+#~is0G4C+7L5H+*)-9!s|-X&tGR~F-^9y;~@13jCi9RL6T literal 0 HcmV?d00001 diff --git a/data/test_assets/triangle.vert b/data/test_assets/triangle.vert index fb16d7c..0496de0 100644 --- a/data/test_assets/triangle.vert +++ b/data/test_assets/triangle.vert @@ -1,7 +1,7 @@ #version 450 core layout(push_constant ) uniform pc { - mat4 view_projection; +mat4 view_projection; }; vec3 positions[3] = vec3[]( @@ -23,4 +23,3 @@ void main() gl_Position = view_projection * vec4(positions[gl_VertexIndex], 1.0); out_frag_color = colors[gl_VertexIndex]; } - diff --git a/docs/.gitignore b/docs/.gitignore index a7d37a8..abd6c59 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -2,4 +2,3 @@ _build/ generated/ html/ xml/ - diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 22aa8d0..2f7306c 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -4,7 +4,6 @@ add_library_module( INTERFACES test.cppm expects.cppm - PRIVATE_INTERFACES registry.cppm SOURCES entrypoint.cpp @@ -151,7 +150,9 @@ add_library_module( renderer INTERFACES data.cppm + system.cppm frontends.cppm + components.cppm factory.cppm vk/api_wrapper.cppm vk/device.cppm @@ -161,6 +162,8 @@ add_library_module( vk/swapchain.cppm vk/buffer.cppm vk/pass.cppm + vk/renderer.cppm + vk/debugger.cppm DEPENDENCIES app ecs @@ -173,4 +176,21 @@ add_library_module( surface ) -# add_subdirectory(./mirror) +add_library_module( + NAME + libmirror + ROOT_DIR + ${CMAKE_CURRENT_SOURCE_DIR}/mirror + INTERFACES + system.cppm + DEPENDENCIES + app + time + input + surface + renderer + camera +) + +# add_executable_module(mirror entrypoint/mirror.cpp) +# target_link_libraries(mirror PRIVATE libmirror input) diff --git a/modules/asset_parser/text.cppm b/modules/asset_parser/text.cppm deleted file mode 100644 index cb990a6..0000000 --- a/modules/asset_parser/text.cppm +++ /dev/null @@ -1,162 +0,0 @@ -#include - -namespace Assets { - -/* static */ void TextAsset::pack(const PackageData &data, const std::filesystem::path &out_path) -{ - const auto &[metadata, text_metadata, text] = data; - - auto stream = std::ofstream { out_path, std::ios::binary | std::ios::trunc }; - if (!stream.is_open()) - { - throw std::runtime_error { - std::format("Failed to open ofstream for packing Text at: {}", out_path.string()) - }; - } - stream.seekp(0); - - // NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast) - stream.write((char *)¤t_version, sizeof(current_version)); - stream.write((char *)&metadata, sizeof(metadata)); - stream.write((char *)&text_metadata, sizeof(text_metadata)); - - constexpr auto number_of_blobs = uint32_t { 1 }; - stream.write((char *)&number_of_blobs, sizeof(number_of_blobs)); - - auto textblob_metadata = BlobMetadata { - .tag = BlobMetadata::Tag::text, - .offset = static_cast(stream.tellp()) + sizeof(BlobMetadata), - .compression_type = CompressionType::None, - .compressed_size = text.size(), - .uncompressed_size = text.size(), - }; - - stream.write((char *)&textblob_metadata, sizeof(textblob_metadata)); - stream.write((char *)text.data(), static_cast(text.size())); - // NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast) -} - -TextAsset::TextAsset(const std::filesystem::path &path) -{ - m_stream = std::ifstream { path, std::ios::binary }; - if (!m_stream.is_open()) - { - throw std::runtime_error { - std::format("Failed to open ifstream for loading Text asset at: {}", path.string()) - }; - } - - // NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast) - m_stream.read((char *)&version, sizeof(version)); - m_stream.read((char *)&m_asset_metadata, sizeof(m_asset_metadata)); - m_stream.read((char *)&m_metadata, sizeof(m_metadata)); - - auto num_blobs = uint32_t {}; - m_stream.read((char *)&num_blobs, sizeof(num_blobs)); - if (num_blobs != 1) - { - throw std::runtime_error { - std::format("Failed to load Text asset: invalid number of blobs: {}", num_blobs) - }; - } - - m_stream.read((char *)&m_text_blob_metadata, sizeof(m_text_blob_metadata)); - if (m_text_blob_metadata.tag != BlobMetadata::Tag::text) - { - throw std::runtime_error { - std::format( - "Failed to load Text asset: invalid blob tag, expected {}, got {}", - std::to_underlying(BlobMetadata::Tag::text), - std::to_underlying(m_text_blob_metadata.tag) - ), - }; - } - // NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast) -} - -void TextAsset::unpack_blob( - BlobMetadata::Tag tag, - std::byte *destination, - size_t destination_capacity -) const -{ - if (tag != BlobMetadata::Tag::text) - { - throw std::runtime_error { - std::format("Invalid tag for unpack_blob of TextAsset: {}", std::to_underlying(tag)) - }; - } - - m_stream.seekg(static_cast(m_text_blob_metadata.offset)); - switch (m_text_blob_metadata.compression_type) - { - case Assets::CompressionType::None: - if (m_text_blob_metadata.uncompressed_size != m_text_blob_metadata.compressed_size) - { - throw std::runtime_error( - "Failed to unpack blob from TextAsset: " - "compressed/uncompressed size mismatch for no compression " - "type" - ); - } - - if (m_text_blob_metadata.uncompressed_size > destination_capacity) - { - throw std::runtime_error( - "Failed to unpack blob from TextAsset: " - "uncompressed_size > destination_capacity, unpacking " - "would result in segfault" - ); - } - - if (!m_stream.is_open()) - { - throw std::runtime_error( - "Failed to unpack blob from TextAsset: ifstream is " - "closed" - ); - } - - m_stream.read( - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-cstyle-cast) - (char *)destination, - static_cast(m_text_blob_metadata.uncompressed_size) - ); - - return; - - default: - throw std::runtime_error( - std::format( - "Failed to unpack blob from TextAsset: unsupported " - "compression type: {}", - std::to_underlying(m_text_blob_metadata.compression_type) - ) - ); - } -} - -[[nodiscard]] auto TextAsset::get_asset_metadata() const -> const Asset::Metadata & -{ - return m_asset_metadata; -} - -[[nodiscard]] auto TextAsset::get_metadata() const -> const Metadata & -{ - return m_metadata; -} - -[[nodiscard]] auto TextAsset::get_blob_metadata(BlobMetadata::Tag tag) const -> const BlobMetadata & -{ - if (tag != BlobMetadata::Tag::text) - { - throw std::runtime_error { std::format( - "Invalid tag for get_blob_metadata of TextAsset: {}", - std::to_underlying(tag) - ) }; - } - - return m_text_blob_metadata; -} - -} // namespace Assets diff --git a/modules/input/system.cppm b/modules/input/system.cppm index 7d4aa76..19baca6 100644 --- a/modules/input/system.cppm +++ b/modules/input/system.cppm @@ -12,7 +12,7 @@ import std; namespace lt::input { -class System: public app::ISystem +export class System: public app::ISystem { public: System(memory::Ref registry); diff --git a/modules/math/algebra.cppm b/modules/math/algebra.cppm index a44c9e3..5513e8e 100644 --- a/modules/math/algebra.cppm +++ b/modules/math/algebra.cppm @@ -2,7 +2,7 @@ export module math.algebra; import math.mat4; import std; -namespace lt::math { +export namespace lt::math { /** * let... diff --git a/modules/math/trig.cppm b/modules/math/trig.cppm index 88b623c..acea076 100644 --- a/modules/math/trig.cppm +++ b/modules/math/trig.cppm @@ -1,6 +1,6 @@ export module math.trig; -namespace lt::math { +export namespace lt::math { [[nodiscard]] constexpr auto radians(float degrees) -> float { diff --git a/modules/memory/null_on_move.cppm b/modules/memory/null_on_move.cppm index 875e81a..4ba612f 100644 --- a/modules/memory/null_on_move.cppm +++ b/modules/memory/null_on_move.cppm @@ -7,7 +7,7 @@ namespace lt::memory { /** Holds an `Underlying_T`, assigns it to `null_value` when this object is moved. * * @note For avoiding the need to explicitly implement the move constructor for objects that hold - * Vulkan objects. But may serve other purposes, hence why I kept the implementation generic. + * Vulkan handles. But may serve other purposes, hence why I kept the implementation generic. */ export template class NullOnMove diff --git a/modules/mirror/entrypoint.cpp b/modules/mirror/system.cppm similarity index 78% rename from modules/mirror/entrypoint.cpp rename to modules/mirror/system.cppm index 8bb1fff..bb89130 100644 --- a/modules/mirror/entrypoint.cpp +++ b/modules/mirror/system.cppm @@ -1,30 +1,35 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include