From c61e09ce986fa99debea040a7c0ac42749ad8052 Mon Sep 17 00:00:00 2001 From: Mel Date: Tue, 6 Feb 2024 02:09:17 +0100 Subject: Render outlines on currently targeted blocks --- src/GFX/Util/MeshBuilder.hpp | 4 ++-- src/GFX/Util/Primitives.cpp | 26 +++++++++++++++++++++++++- src/GFX/Util/Primitives.hpp | 14 +++++++++++--- 3 files changed, 38 insertions(+), 6 deletions(-) (limited to 'src/GFX') 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 - void primitive(const Primitives::Primitive& primitive) { + template + void primitive(const Primitives::BasePrimitive& 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 -struct Primitive { +// A base primitive, could represent lines, triangles, quads primitives, etc. +template +struct BasePrimitive { std::array, N> positions; std::array, N> normals; - std::array indices; + std::array indices; }; +// Primitive made out of triangles (GL_TRIANGLES) +template +using Primitive = BasePrimitive; + 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); + } -- cgit 1.4.1