From 9bd42d9c8c836892d3975ab107e5f46081ed983b Mon Sep 17 00:00:00 2001 From: Orange Date: Mon, 26 Jan 2026 15:43:39 +0300 Subject: [PATCH] added files --- include/omath/3d_primitives/box.hpp | 58 +++++++++++++++++++++-- include/omath/3d_primitives/mesh.hpp | 11 +++-- source/3d_primitives/box.cpp | 45 ------------------ tests/general/unit_test_primitive_box.cpp | 11 +++++ 4 files changed, 72 insertions(+), 53 deletions(-) create mode 100644 tests/general/unit_test_primitive_box.cpp diff --git a/include/omath/3d_primitives/box.hpp b/include/omath/3d_primitives/box.hpp index b039825..d93d401 100644 --- a/include/omath/3d_primitives/box.hpp +++ b/include/omath/3d_primitives/box.hpp @@ -3,14 +3,64 @@ // #pragma once +#include "mesh.hpp" +#include "omath/engines/opengl_engine/camera.hpp" +#include "omath/engines/opengl_engine/traits/mesh_trait.hpp" #include "omath/linear_algebra/triangle.hpp" #include "omath/linear_algebra/vector3.hpp" #include namespace omath::primitives { + using BoxMesh = Mesh, + std::array, 8>, std::array, 12>>; + + template [[nodiscard]] - std::array>, 12> create_box(const Vector3& top, const Vector3& bottom, - const Vector3& dir_forward, const Vector3& dir_right, - float ratio = 4.f) noexcept; -} + BoxMeshType + create_box(const Vector3& top, const Vector3& bottom, const Vector3& dir_forward, + const Vector3& dir_right, const float ratio = 4.f) noexcept + { + const auto height = top.distance_to(bottom); + const auto side_size = height / ratio; + + // corner layout (0‑3 bottom, 4‑7 top) + std::array, 8> p; + p[0] = bottom + (dir_forward + dir_right) * side_size; // front‑right‑bottom + p[1] = bottom + (dir_forward - dir_right) * side_size; // front‑left‑bottom + p[2] = bottom + (-dir_forward + dir_right) * side_size; // back‑right‑bottom + p[3] = bottom + (-dir_forward - dir_right) * side_size; // back‑left‑bottom + p[4] = top + (dir_forward + dir_right) * side_size; // front‑right‑top + p[5] = top + (dir_forward - dir_right) * side_size; // front‑left‑top + p[6] = top + (-dir_forward + dir_right) * side_size; // back‑right‑top + p[7] = top + (-dir_forward - dir_right) * side_size; // back‑left‑top + + std::array, 12> poly; + + // bottom face (+Y up ⇒ wind CW when viewed from above) + poly[0] = {0, 2, 3}; + poly[1] = {0, 3, 1}; + + // top face + poly[2] = {4, 7, 6}; + poly[3] = {4, 5, 7}; + + // front face + poly[4] = {0, 5, 1}; + poly[5] = {0, 4, 5}; + + // right face + poly[6] = {0, 6, 2}; + poly[7] = {0, 4, 6}; + + // back face + poly[8] = {2, 7, 3}; + poly[9] = {2, 6, 7}; + + // left face + poly[10] = {1, 7, 5}; + poly[11] = {1, 3, 7}; + + return BoxMeshType{std::move(p), std::move(poly)}; + } +} // namespace omath::primitives diff --git a/include/omath/3d_primitives/mesh.hpp b/include/omath/3d_primitives/mesh.hpp index bac5513..ff20e7a 100644 --- a/include/omath/3d_primitives/mesh.hpp +++ b/include/omath/3d_primitives/mesh.hpp @@ -25,7 +25,8 @@ namespace omath::primitives template concept HasNormal = requires(T vertex) { vertex.normal; }; template concept HasUv = requires(T vertex) { vertex.uv; }; - template> + template, + class VboType = std::vector, class EboType = std::vector>> class Mesh final { public: @@ -33,8 +34,8 @@ namespace omath::primitives using VertexType = VertType; private: - using Vbo = std::vector; - using Ebo = std::vector>; + using Vbo = VboType; + using Ebo = EboType; public: Vbo m_vertex_buffer; @@ -102,7 +103,9 @@ namespace omath::primitives VectorType vertex_position_to_world_space(const Vector3& vertex_position) const requires HasPosition { - auto abs_vec = get_to_world_matrix() * mat_column_from_vector(vertex_position); + auto abs_vec = get_to_world_matrix() + * mat_column_from_vector( + vertex_position); return {abs_vec.at(0, 0), abs_vec.at(1, 0), abs_vec.at(2, 0)}; } diff --git a/source/3d_primitives/box.cpp b/source/3d_primitives/box.cpp index 9c251b9..a805a78 100644 --- a/source/3d_primitives/box.cpp +++ b/source/3d_primitives/box.cpp @@ -5,50 +5,5 @@ namespace omath::primitives { - std::array>, 12> create_box(const Vector3& top, const Vector3& bottom, - const Vector3& dir_forward, - const Vector3& dir_right, const float ratio) noexcept - { - const auto height = top.distance_to(bottom); - const auto side_size = height / ratio; - // corner layout (0‑3 bottom, 4‑7 top) - std::array, 8> p; - p[0] = bottom + (dir_forward + dir_right) * side_size; // front‑right‑bottom - p[1] = bottom + (dir_forward - dir_right) * side_size; // front‑left‑bottom - p[2] = bottom + (-dir_forward + dir_right) * side_size; // back‑right‑bottom - p[3] = bottom + (-dir_forward - dir_right) * side_size; // back‑left‑bottom - p[4] = top + (dir_forward + dir_right) * side_size; // front‑right‑top - p[5] = top + (dir_forward - dir_right) * side_size; // front‑left‑top - p[6] = top + (-dir_forward + dir_right) * side_size; // back‑right‑top - p[7] = top + (-dir_forward - dir_right) * side_size; // back‑left‑top - - std::array>, 12> poly; - - // bottom face (+Y up ⇒ wind CW when viewed from above) - poly[0] = {p[0], p[2], p[3]}; - poly[1] = {p[0], p[3], p[1]}; - - // top face - poly[2] = {p[4], p[7], p[6]}; - poly[3] = {p[4], p[5], p[7]}; - - // front face - poly[4] = {p[0], p[5], p[1]}; - poly[5] = {p[0], p[4], p[5]}; - - // right face - poly[6] = {p[0], p[6], p[2]}; - poly[7] = {p[0], p[4], p[6]}; - - // back face - poly[8] = {p[2], p[7], p[3]}; - poly[9] = {p[2], p[6], p[7]}; - - // left face - poly[10] = {p[1], p[7], p[5]}; - poly[11] = {p[1], p[3], p[7]}; - - return poly; - } } // namespace omath::primitives diff --git a/tests/general/unit_test_primitive_box.cpp b/tests/general/unit_test_primitive_box.cpp new file mode 100644 index 0000000..bac7a98 --- /dev/null +++ b/tests/general/unit_test_primitive_box.cpp @@ -0,0 +1,11 @@ +// +// Created by Vladislav on 11.01.2026. +// +#include "omath/3d_primitives/box.hpp" +#include + +TEST(test, test) +{ + auto result = omath::primitives::create_box({0.f, 30.f, 0.f}, {}, omath::opengl_engine::k_abs_forward, + omath::opengl_engine::k_abs_right); +} \ No newline at end of file