diff options
| author | Mel <einebeere@gmail.com> | 2024-02-06 02:09:17 +0100 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2024-02-06 02:09:17 +0100 |
| commit | c61e09ce986fa99debea040a7c0ac42749ad8052 (patch) | |
| tree | 177b39f7f692723cb4ace8392349f3f8f0d2192b /src/GFX/Util | |
| parent | 091bf9e418ffdcf36e1735ed78d544f3d1b86785 (diff) | |
| download | meowcraft-c61e09ce986fa99debea040a7c0ac42749ad8052.tar.zst meowcraft-c61e09ce986fa99debea040a7c0ac42749ad8052.zip | |
Render outlines on currently targeted blocks
Diffstat (limited to 'src/GFX/Util')
| -rw-r--r-- | src/GFX/Util/MeshBuilder.hpp | 4 | ||||
| -rw-r--r-- | src/GFX/Util/Primitives.cpp | 26 | ||||
| -rw-r--r-- | src/GFX/Util/Primitives.hpp | 14 |
3 files changed, 38 insertions, 6 deletions
diff --git a/src/GFX/Util/MeshBuilder.hpp b/src/GFX/Util/MeshBuilder.hpp index cab06e1..eec77dd 100644 --- a/src/GFX/Util/MeshBuilder.hpp +++ b/src/GFX/Util/MeshBuilder.hpp @@ -55,8 +55,8 @@ public: m_indices.insert(m_indices.end(), from.begin(), from.end()); } - template<uint PN> - void primitive(const Primitives::Primitive<PN>& primitive) { + template<uint PN, uint PI> + void primitive(const Primitives::BasePrimitive<PN, PI>& primitive) { decltype(primitive.indices) relativized_indices{}; for (Int i = 0; i < primitive.indices.size(); i++) { relativized_indices[i] = primitive.indices[i] + m_positions.size(); diff --git a/src/GFX/Util/Primitives.cpp b/src/GFX/Util/Primitives.cpp index 4b44864..daceb79 100644 --- a/src/GFX/Util/Primitives.cpp +++ b/src/GFX/Util/Primitives.cpp @@ -1,4 +1,5 @@ #include "Primitives.hpp" +#include "../../Math/Grid.hpp" namespace MC::GFX::Util::Primitives { @@ -104,4 +105,27 @@ BoxPrimitive box(AABB aabb, FaceSet faces) { return box; } -} \ No newline at end of file +LineBoxPrimitive line_box(AABB aabb) { + auto [min, max] = aabb; + + auto cube = Math::cube_cell_from_point(min, max - min); + + using P = Vector<3, F32>; + decltype(LineBoxPrimitive::positions) positions = {{ + P(cube.front_top_left()), P(cube.front_top_right()), + P(cube.front_bottom_left()), P(cube.front_bottom_right()), + P(cube.back_top_left()), P(cube.back_top_right()), + P(cube.back_bottom_left()), P(cube.back_bottom_right()), + }}; + + decltype(LineBoxPrimitive::indices) indices = {{ + 0, 1, 1, 3, 3, 2, 2, 0, // Front + 4, 5, 5, 7, 7, 6, 6, 4, // Back + 0, 4, 1, 5, 2, 6, 3, 7, // Sides + }}; + + // TODO: Allow Primitives to not have normals. + return {positions, {{}}, indices}; +} + +} diff --git a/src/GFX/Util/Primitives.hpp b/src/GFX/Util/Primitives.hpp index a267130..6654da6 100644 --- a/src/GFX/Util/Primitives.hpp +++ b/src/GFX/Util/Primitives.hpp @@ -31,17 +31,25 @@ private: Value m_set; }; -template <uint N> -struct Primitive { +// A base primitive, could represent lines, triangles, quads primitives, etc. +template <uint N, uint I> +struct BasePrimitive { std::array<Vector<3, F32>, N> positions; std::array<Vector<3, F32>, N> normals; - std::array<U32, N + N / 2> indices; + std::array<U32, I> indices; }; +// Primitive made out of triangles (GL_TRIANGLES) +template <uint N> +using Primitive = BasePrimitive<N, N + N / 2>; + using PlanePrimitive = Primitive<4>; PlanePrimitive plane(AABB aabb, FaceSet face); using BoxPrimitive = Primitive<4 * 6>; BoxPrimitive box(AABB aabb, FaceSet faces = FaceSet::all()); +using LineBoxPrimitive = BasePrimitive<4 * 2, 4 * 6>; +LineBoxPrimitive line_box(AABB aabb); + } |
