diff --git a/.clang-tidy b/.clang-tidy index bdf52e8..52d762a 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -239,7 +239,6 @@ misc-header-include-cycle, misc-definitions-in-headers, misc-coroutine-hostile-raii, misc-const-correctness, -misc-confusable-identifiers, hicpp-signed-bitwise, hicpp-no-assembler, diff --git a/.drone.yml b/.drone.yml index b488dbb..8c9ec7a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,6 +1,9 @@ kind: pipeline type: docker name: clang format +clone: + recursive: true + submodule_update_remote: true trigger: branch: @@ -24,3 +27,25 @@ steps: done echo "✅ All files are properly formatted" + +--- + +kind: pipeline +type: docker +name: static analysis +clone: + recursive: true + submodule_update_remote: true + +trigger: + branch: + - main + +steps: +- name: static_analysis + image: static_analysis:latest + pull: if-not-exists + privileged: true + commands: + - git submodule update --init --recursive + - conan build . -s build_type=Release -o enable_static_analysis=True --build=missing diff --git a/CMakeLists.txt b/CMakeLists.txt index c1eaec8..d8b8c1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 4.0) +cmake_minimum_required(VERSION 3.14) project(Light) set(CMAKE_CXX_STANDARD 23) diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index e5eadc7..ae9c888 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -1,9 +1,6 @@ # GLAD # add_subdirectory(./glad) -# IMGUI # -cmake_minimum_required(VERSION 3.14) - set(MIRROR_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../modules/mirror/) set(DEPENDENCIES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/) diff --git a/modules/app/src/application.cpp b/modules/app/src/application.cpp index ed82fbe..514da8a 100644 --- a/modules/app/src/application.cpp +++ b/modules/app/src/application.cpp @@ -52,7 +52,7 @@ Application::Application(): m_window(nullptr) m_renderer = Renderer::create( (GLFWwindow *)m_window->get_handle(), - m_graphics_context->get_shared_context(), + lt::GraphicsContext::get_shared_context(), Renderer::CreateInfo { .quad_renderer_shader = AssetManager::get_shader("LT_ENGINE_RESOURCES_QUAD_SHADER"), .texture_renderer_shader = AssetManager::get_shader( @@ -68,7 +68,7 @@ Application::Application(): m_window(nullptr) m_user_interface = UserInterface::create( (GLFWwindow *)m_window->get_handle(), - m_graphics_context->get_shared_context() + lt::GraphicsContext::get_shared_context() ); m_layer_stack = create_scope(); diff --git a/modules/asset_baker/include/asset_baker/bakers.hpp b/modules/asset_baker/include/asset_baker/bakers.hpp index 3d56d1d..efe7bd9 100644 --- a/modules/asset_baker/include/asset_baker/bakers.hpp +++ b/modules/asset_baker/include/asset_baker/bakers.hpp @@ -131,7 +131,7 @@ public: return "TextLoader"; } - [[nodiscard]] auto load(std::filesystem::path file_path) const -> Assets::TextAsset::PackageData + [[nodiscard]] auto load(const std::filesystem::path& file_path) const -> Assets::TextAsset::PackageData { auto stream = std::ifstream { file_path, std::ios::binary }; if (!stream.good()) diff --git a/modules/camera/include/camera/scene.hpp b/modules/camera/include/camera/scene.hpp index bbab610..9d02897 100644 --- a/modules/camera/include/camera/scene.hpp +++ b/modules/camera/include/camera/scene.hpp @@ -35,19 +35,19 @@ public: void set_viewport_size(unsigned int width, unsigned int height); - void set_projection_type(ProjectionType projectionType); + void set_projection_type(ProjectionType projection_type); void set_orthographic_size(float size); - void set_orthographic_far_plane(float farPlane); + void set_orthographic_far_plane(float far_plane); - void set_orthographic_near_plane(float nearPlane); + void set_orthographic_near_plane(float near_plane); - void set_perspective_vertical_fov(float verticalFov); + void set_perspective_vertical_fov(float vertical_fov); - void set_perspective_far_plane(float farPlane); + void set_perspective_far_plane(float far_plane); - void set_perspective_near_plane(float nearPlane); + void set_perspective_near_plane(float near_plane); [[nodiscard]] auto get_orthographic_size() const -> float { diff --git a/modules/input/include/input/events/char.hpp b/modules/input/include/input/events/char.hpp index 2698c70..b692105 100644 --- a/modules/input/include/input/events/char.hpp +++ b/modules/input/include/input/events/char.hpp @@ -24,9 +24,15 @@ public: return ss.str(); } - event_type(SetChar); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::SetChar; + } - event_category(InputEventCategory | KeyboardEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(InputEventCategory | KeyboardEventCategory) & category; + } private: const unsigned int m_character; diff --git a/modules/input/include/input/events/event.hpp b/modules/input/include/input/events/event.hpp index 48e1d8a..a3ca32b 100644 --- a/modules/input/include/input/events/event.hpp +++ b/modules/input/include/input/events/event.hpp @@ -2,7 +2,7 @@ namespace lt { -enum class EventType +enum class EventType : uint8_t { None = 0, @@ -24,7 +24,7 @@ enum class EventType WindowGainFocus, }; -enum EventCategory +enum EventCategory : uint8_t { None = 0, @@ -34,18 +34,6 @@ enum EventCategory MouseEventCategory = bit(3), }; -#define event_type(type) \ - EventType get_event_type() const override \ - { \ - return ::lt::EventType::type; \ - } - -#define event_category(eCategory) \ - inline bool has_category(EventCategory category) const override \ - { \ - return (eCategory) & category; \ - } - class Event { public: diff --git a/modules/input/include/input/events/keyboard.hpp b/modules/input/include/input/events/keyboard.hpp index a509476..ba0be2e 100644 --- a/modules/input/include/input/events/keyboard.hpp +++ b/modules/input/include/input/events/keyboard.hpp @@ -24,9 +24,15 @@ public: return ss.str(); } - event_type(KeyPressed); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::KeyPressed; + } - event_category(InputEventCategory | KeyboardEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(InputEventCategory | KeyboardEventCategory) & category; + } private: const int m_key; @@ -51,9 +57,15 @@ public: return ss.str(); } - event_type(KeyRepeated); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::KeyRepeated; + } - event_category(InputEventCategory | KeyboardEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(InputEventCategory | KeyboardEventCategory) & category; + } private: const int m_key; @@ -78,9 +90,15 @@ public: return ss.str(); } - event_type(KeyReleased); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::KeyReleased; + } - event_category(InputEventCategory | KeyboardEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(InputEventCategory | KeyboardEventCategory) & category; + } private: const int m_key; diff --git a/modules/input/include/input/events/mouse.hpp b/modules/input/include/input/events/mouse.hpp index 31cce09..77b4d8e 100644 --- a/modules/input/include/input/events/mouse.hpp +++ b/modules/input/include/input/events/mouse.hpp @@ -35,9 +35,15 @@ public: return ss.str(); } - event_type(MouseMoved); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::MouseMoved; + } - event_category(InputEventCategory | MouseEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(InputEventCategory | MouseEventCategory) & category; + } private: const glm::vec2 m_position; @@ -62,9 +68,15 @@ public: return ss.str(); } - event_type(WheelScrolled); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::WheelScrolled; + } - event_category(InputEventCategory | MouseEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(InputEventCategory | MouseEventCategory) & category; + } private: const float m_offset; @@ -89,9 +101,15 @@ public: return ss.str(); } - event_type(ButtonPressed); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::ButtonPressed; + } - event_category(InputEventCategory | MouseEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(InputEventCategory | MouseEventCategory) & category; + } private: const int m_button; @@ -116,9 +134,15 @@ public: return ss.str(); } - event_type(ButtonReleased); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::ButtonReleased; + } - event_category(InputEventCategory | MouseEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(InputEventCategory | MouseEventCategory) & category; + } private: const int m_button; diff --git a/modules/input/include/input/events/window.hpp b/modules/input/include/input/events/window.hpp index 7a8a8ab..40b65ee 100644 --- a/modules/input/include/input/events/window.hpp +++ b/modules/input/include/input/events/window.hpp @@ -14,9 +14,15 @@ public: return "WindowClosedEvent"; } - event_type(WindowClosed); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::WindowClosed; + } - event_category(WindowEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(WindowEventCategory) & category; + } }; class WindowMovedEvent: public Event @@ -39,9 +45,15 @@ public: ; } - event_type(WindowMoved); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::WindowMoved; + } - event_category(WindowEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(WindowEventCategory) & category; + } private: const glm::ivec2 m_position; @@ -66,9 +78,15 @@ public: return ss.str(); } - event_type(WindowResized); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::WindowResized; + } - event_category(WindowEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(WindowEventCategory) & category; + } private: const glm::uvec2 m_size; @@ -82,9 +100,15 @@ public: return "WindowLostFocus"; } - event_type(WindowLostFocus); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::WindowLostFocus; + } - event_category(WindowEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(WindowEventCategory) & category; + } }; class WindowGainFocusEvent: public Event @@ -95,9 +119,15 @@ public: return "WindowGainFocus"; } - event_type(WindowGainFocus); + [[nodiscard]] auto get_event_type() const -> EventType override + { + return ::lt::EventType::WindowGainFocus; + } - event_category(WindowEventCategory); + [[nodiscard]] auto has_category(EventCategory category) const -> bool override + { + return static_cast(WindowEventCategory) & category; + } }; } // namespace lt diff --git a/modules/renderer/include/renderer/gl/blender.hpp b/modules/renderer/include/renderer/gl/blender.hpp index b7d2992..b333866 100644 --- a/modules/renderer/include/renderer/gl/blender.hpp +++ b/modules/renderer/include/renderer/gl/blender.hpp @@ -8,7 +8,7 @@ namespace lt { class glBlender: public Blender { public: - virtual ~glBlender() = default; + ~glBlender() override = default; glBlender(); void enable(BlendFactor srcFactor, BlendFactor dstFactor) override; diff --git a/modules/renderer/include/renderer/gl/buffers.hpp b/modules/renderer/include/renderer/gl/buffers.hpp index df2d4ce..a63f894 100644 --- a/modules/renderer/include/renderer/gl/buffers.hpp +++ b/modules/renderer/include/renderer/gl/buffers.hpp @@ -10,7 +10,7 @@ class glConstantBuffer: public ConstantBuffer public: glConstantBuffer(ConstantBufferIndex index, unsigned int size); - virtual ~glConstantBuffer(); + ~glConstantBuffer() override; void bind() override; diff --git a/modules/renderer/include/renderer/gl/framebuffers.hpp b/modules/renderer/include/renderer/gl/framebuffers.hpp index 135be22..fd18364 100644 --- a/modules/renderer/include/renderer/gl/framebuffers.hpp +++ b/modules/renderer/include/renderer/gl/framebuffers.hpp @@ -10,7 +10,7 @@ class glFramebuffer: public Framebuffer public: glFramebuffer(const FramebufferSpecification &specification); - virtual ~glFramebuffer(); + ~glFramebuffer() override; void bind_as_target(const glm::vec4 &clearColor) override; diff --git a/modules/renderer/include/renderer/programs/quad.hpp b/modules/renderer/include/renderer/programs/quad.hpp index 1db6852..053282b 100644 --- a/modules/renderer/include/renderer/programs/quad.hpp +++ b/modules/renderer/include/renderer/programs/quad.hpp @@ -16,7 +16,7 @@ class Shader; class QuadRendererProgram: RendererProgram { public: - virtual ~QuadRendererProgram() = default; + ~QuadRendererProgram() override = default; struct QuadVertexData { glm::vec4 position; @@ -25,7 +25,7 @@ public: }; QuadRendererProgram( - unsigned int maxVertices, + unsigned int max_vertices, const Ref &shared_context, Ref shader ); diff --git a/modules/renderer/include/renderer/programs/texture.hpp b/modules/renderer/include/renderer/programs/texture.hpp index c50a070..e14573f 100644 --- a/modules/renderer/include/renderer/programs/texture.hpp +++ b/modules/renderer/include/renderer/programs/texture.hpp @@ -25,7 +25,7 @@ public: }; TextureRendererProgram( - unsigned int maxVertices, + unsigned int max_vertices, const Ref &shared_context, Ref shader ); diff --git a/modules/renderer/include/renderer/programs/tinted_texture.hpp b/modules/renderer/include/renderer/programs/tinted_texture.hpp index 734bd8a..9b7682d 100644 --- a/modules/renderer/include/renderer/programs/tinted_texture.hpp +++ b/modules/renderer/include/renderer/programs/tinted_texture.hpp @@ -16,7 +16,7 @@ class SharedContext; class TintedTextureRendererProgram: RendererProgram { public: - virtual ~TintedTextureRendererProgram() = default; + ~TintedTextureRendererProgram() override = default; struct TintedTextureVertexData { glm::vec4 position; @@ -27,8 +27,8 @@ public: }; TintedTextureRendererProgram( - unsigned int maxVertices, - const Ref &sharedContext, + unsigned int max_vertices, + const Ref &shared_context, Ref shader ); diff --git a/modules/renderer/include/renderer/renderer.hpp b/modules/renderer/include/renderer/renderer.hpp index f449c6a..ad694b9 100644 --- a/modules/renderer/include/renderer/renderer.hpp +++ b/modules/renderer/include/renderer/renderer.hpp @@ -42,8 +42,8 @@ public: }; static auto create( - GLFWwindow *window_handle, - Ref shared_context, + GLFWwindow *windowHandle, + Ref sharedContext, CreateInfo create_info ) -> Scope; @@ -67,9 +67,13 @@ public: s_context->draw_quad_impl(position, size, std::move(texture)); } - static void draw_quad(const glm::mat4 &transform, const glm::vec4 &tint, Ref texture) + static void draw_quad( + const glm::mat4 &transform, + const glm::vec4 &tint, + const Ref &texture + ) { - s_context->draw_quad_impl(transform, tint, std::move(texture)); + s_context->draw_quad_impl(transform, tint, texture); } static void draw_quad(const glm::mat4 &transform, const glm::vec4 &tint) @@ -77,9 +81,9 @@ public: s_context->draw_quad_impl(transform, tint); } - static void draw_quad(const glm::mat4 &transform, Ref texture) + static void draw_quad(const glm::mat4 &transform, const Ref &texture) { - s_context->draw_quad_impl(transform, std::move(texture)); + s_context->draw_quad_impl(transform, texture); } static void begin_scene( @@ -123,7 +127,11 @@ private: bool m_should_clear_backbuffer { false }; - Renderer(GLFWwindow *windowHandle, Ref sharedContext, CreateInfo create_info); + Renderer( + GLFWwindow *window_handle, + const Ref &shared_context, + CreateInfo create_info + ); void draw_quad_impl( const glm::vec3 &position, diff --git a/modules/renderer/include/renderer/shader.hpp b/modules/renderer/include/renderer/shader.hpp index be1e423..e5435c7 100644 --- a/modules/renderer/include/renderer/shader.hpp +++ b/modules/renderer/include/renderer/shader.hpp @@ -25,8 +25,8 @@ public: }; static auto create( - Ref vertex_asset, - Ref pixel_asset, + const Ref& vertex_asset, + const Ref& pixel_asset, const Ref &shared_context ) -> Ref; diff --git a/modules/renderer/include/renderer/texture.hpp b/modules/renderer/include/renderer/texture.hpp index 52c2300..1d8b173 100644 --- a/modules/renderer/include/renderer/texture.hpp +++ b/modules/renderer/include/renderer/texture.hpp @@ -14,7 +14,7 @@ class Texture { public: static Ref create( - Ref asset, + const Ref& asset, const Ref &shared_context ); diff --git a/modules/renderer/src/renderer.cpp b/modules/renderer/src/renderer.cpp index bbe6fad..37cd9ed 100644 --- a/modules/renderer/src/renderer.cpp +++ b/modules/renderer/src/renderer.cpp @@ -20,7 +20,7 @@ Renderer *Renderer::s_context = nullptr; Renderer::Renderer( GLFWwindow *window_handle, - Ref shared_context, + const Ref& shared_context, CreateInfo create_info ) : m_quad_renderer( diff --git a/modules/renderer/src/shader.cpp b/modules/renderer/src/shader.cpp index 6c2c9d2..4d222fa 100644 --- a/modules/renderer/src/shader.cpp +++ b/modules/renderer/src/shader.cpp @@ -12,8 +12,8 @@ namespace lt { /* static */ auto Shader::create( - Ref vertex_asset, - Ref pixel_asset, + const Ref& vertex_asset, + const Ref& pixel_asset, const Ref &shared_context ) -> Ref { diff --git a/modules/renderer/src/texture.cpp b/modules/renderer/src/texture.cpp index 03a4ae6..9472a45 100644 --- a/modules/renderer/src/texture.cpp +++ b/modules/renderer/src/texture.cpp @@ -12,8 +12,8 @@ namespace lt { /* static */ auto Texture::create( - Ref asset, - const Ref &shared_context + const Ref& asset, + const Ref & /*shared_context*/ ) -> Ref { switch (GraphicsContext::get_graphics_api()) diff --git a/modules/ui/include/ui/ui.hpp b/modules/ui/include/ui/ui.hpp index 3133eb6..578d0a3 100644 --- a/modules/ui/include/ui/ui.hpp +++ b/modules/ui/include/ui/ui.hpp @@ -12,7 +12,7 @@ class SharedContext; class UserInterface { public: - static auto create(GLFWwindow *window_handle, Ref shared_context) + static auto create(GLFWwindow *windowHandle, Ref sharedContext) -> Scope; static void dockspace_begin(); @@ -25,7 +25,7 @@ public: virtual ~UserInterface() = default; - void init(GLFWwindow *window_handle, Ref sharedContext); + void init(GLFWwindow *windowHandle, Ref sharedContext); virtual void platform_implementation( GLFWwindow *window_handle, diff --git a/modules/window/src/linux/window.cpp b/modules/window/src/linux/window.cpp index a26924c..aa7cae2 100644 --- a/modules/window/src/linux/window.cpp +++ b/modules/window/src/linux/window.cpp @@ -9,8 +9,7 @@ namespace lt { Window::~Window() -{ -} += default; auto Window::create(const std::function &callback) -> Scope { @@ -18,7 +17,7 @@ auto Window::create(const std::function &callback) -> Scope callback) - : m_event_callback(std::move(std::move(callback))) + : m_handle(glfwCreateWindow(1u, 1u, "", nullptr, nullptr)), m_event_callback(std::move(std::move(callback))) { // init glfw ensure(glfwInit(), "lWindow::lWindow: failed to initialize 'glfw'"); @@ -29,7 +28,7 @@ lWindow::lWindow(std::function callback) glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); - m_handle = glfwCreateWindow(1u, 1u, "", nullptr, nullptr); + ensure(m_handle, "lWindow::lWindow: failed to create 'GLFWwindow'"); glfwSetWindowUserPointer(m_handle, &m_event_callback); diff --git a/tools/ci/images/clang_format/Dockerfile b/tools/ci/images/clang_format/Dockerfile index 233048c..91c8cb7 100644 --- a/tools/ci/images/clang_format/Dockerfile +++ b/tools/ci/images/clang_format/Dockerfile @@ -6,5 +6,4 @@ RUN apk add --no-cache \ findutils \ git \ libc6-compat \ - tar \ clang-extra-tools diff --git a/tools/ci/images/static_analysis/Dockerfile b/tools/ci/images/static_analysis/Dockerfile new file mode 100644 index 0000000..a8a7afd --- /dev/null +++ b/tools/ci/images/static_analysis/Dockerfile @@ -0,0 +1,35 @@ +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 + + +RUN pip install --no-cache-dir --break-system-packages conan gitpython \ + && conan profile detect + +RUN clang --version \ + && conan --version \ + && pip --version \ + && cmake --version \ + && clang --version \ + && clang-tidy --version + + +RUN git clone 'https://git.light7734.com/light7734/light.git' --recursive \ + && cd light \ + && conan install . \ + -c tools.system.package_manager:mode=install \ + -o enable_static_analysis=True \ + --build=missing