feat: revamp 2D pipeline to use SDF's for rendering

This commit is contained in:
2026-10-16 23:23:26 +02:00
parent 469bb287b7
commit faba4171ec
19 changed files with 676 additions and 502 deletions
+49 -1
View File
@@ -7,6 +7,7 @@
#include <memory>
#include <string>
#include <glm/gtc/constants.hpp>
#include <glm/gtc/packing.hpp>
#include <destrum/Event.h>
@@ -31,7 +32,7 @@
#include <destrum/Components/Animator.h>
#include <destrum/Components/CameraComponent.h>
#include <destrum/Graphics/Resources/PrimitiveMeshes.h>
#include <destrum/Graphics/Managers/LineRenderingManager.h>
#include <destrum/Graphics/Managers/Renderer2D.h>
#include <destrum/Components/LightComponent.h>
#include <destrum/Components/Physics/Rigidbody.h>
#include <destrum/Graphics/Material.h>
@@ -431,6 +432,52 @@ namespace {
SceneManager::GetInstance().Destroy();
}
void testRenderer2DShapes()
{
auto& r2d = Renderer2D::GetInstance();
r2d.Clear();
r2d.DrawRect({10.0f, 20.0f}, {30.0f, 40.0f}, glm::vec4{0.5f});
const Shape2D& rect = r2d.GetShapes().back();
check(rect.type == Shape2DType::Rect &&
rect.center == glm::vec2{25.0f, 40.0f} &&
rect.halfSize == glm::vec2{15.0f, 20.0f} &&
rect.textureId == NULL_IMAGE_ID &&
rect.outline == 0.0f,
"rects must be anchored at their top left corner and filled by default");
r2d.DrawEllipseOutline({50.0f, 50.0f}, {20.0f, 10.0f}, 2.0f, glm::vec4{1.0f});
const Shape2D& ellipse = r2d.GetShapes().back();
check(ellipse.type == Shape2DType::Ellipse &&
ellipse.center == glm::vec2{50.0f} &&
ellipse.halfSize == glm::vec2{20.0f, 10.0f} &&
ellipse.outline == 2.0f,
"ellipses must be centered with their radii as half size");
r2d.DrawTriangle({0.0f, 10.0f}, {5.0f, 0.0f}, {10.0f, 10.0f}, glm::vec4{1.0f});
const Shape2D& triangle = r2d.GetShapes().back();
check(triangle.type == Shape2DType::Triangle &&
triangle.center == glm::vec2{5.0f} &&
triangle.halfSize == glm::vec2{5.0f} &&
triangle.p0 == glm::vec2{-5.0f, 5.0f} &&
triangle.p1 == glm::vec2{0.0f, -5.0f} &&
triangle.p2 == glm::vec2{5.0f, 5.0f},
"triangle points must be stored relative to their bounding box center");
r2d.DrawLine({0.0f, 0.0f}, {0.0f, 10.0f}, 4.0f, glm::vec4{1.0f}, LineCap::Round);
const Shape2D& line = r2d.GetShapes().back();
check(line.type == Shape2DType::Rect &&
line.center == glm::vec2{0.0f, 5.0f} &&
close(line.halfSize.x, 7.0f) && close(line.halfSize.y, 2.0f) &&
close(line.rotation, glm::half_pi<float>()) &&
close(line.cornerRadius, 2.0f),
"round capped lines must be rotated rects extended by half their thickness");
check(r2d.GetShapes().size() == 4, "every draw call must submit exactly one shape");
r2d.Clear();
check(r2d.GetShapes().empty(), "clear must drop all submitted shapes");
}
void testCapsuleColliderDebugLines()
{
GameObject object{"capsule"};
@@ -1131,6 +1178,7 @@ int main()
testPrimitiveBoxMesh();
testColliderCenterOffset();
testCapsuleColliderDebugLines();
testRenderer2DShapes();
std::cout << "destrum tests passed\n";
return EXIT_SUCCESS;
}