Added triangle drawing functions to BasicRenderer2D

This commit is contained in:
OmniaX-Dev 2026-04-15 17:15:34 +02:00
parent 10ecd04747
commit e8d13b931e
4 changed files with 94 additions and 21 deletions

View file

@ -15,6 +15,7 @@
***FIX: WindowOutputHandler text rendering ***FIX: WindowOutputHandler text rendering
***Implement wrappers in Renderer2D to take a center and size for rects ***Implement wrappers in Renderer2D to take a center and size for rects
***find a way to add fixed update to gui::Window ***find a way to add fixed update to gui::Window
***Add triangle drawing functions to BasicRenderer2D
Add theme caching Add theme caching
Implement global scale (probably query desktop scale and adjust accordingly) Implement global scale (probably query desktop scale and adjust accordingly)
Implement show/hide functionality for widgets Implement show/hide functionality for widgets

View file

@ -511,6 +511,25 @@ namespace ogfx
generate_ellipse_stroke(center, rx, ry, thickness, 0.0f, 2.0f * M_PI, color, segments); generate_ellipse_stroke(center, rx, ry, thickness, 0.0f, 2.0f * M_PI, color, segments);
} }
void BasicRenderer2D::drawTriangle(const Triangle& tri, const Color& color, i32 thickness)
{
if (!m_initialized)
return;
drawTriangle(tri.vA, tri.vB, tri.vC, color, thickness);
}
void BasicRenderer2D::drawTriangle(const Vec2& A, const Vec2& B, const Vec2& C, const Color& color, i32 thickness)
{
if (!m_initialized)
return;
drawLine({ A, B }, color, thickness, false);
drawLine({ B, C }, color, thickness, false);
drawLine({ C, A }, color, thickness, false);
}
void BasicRenderer2D::fillRect(const Rectangle& rect, const Color& color) void BasicRenderer2D::fillRect(const Rectangle& rect, const Color& color)
{ {
if (!m_initialized) if (!m_initialized)
@ -679,6 +698,26 @@ namespace ogfx
generate_filled_ellipse(center, radiusX, radiusY, color, segments); generate_filled_ellipse(center, radiusX, radiusY, color, segments);
} }
void BasicRenderer2D::fillTriangle(const Triangle& tri, const Color& color)
{
if (!m_initialized)
return;
fillTriangle(tri.vA, tri.vB, tri.vC, color);
}
void BasicRenderer2D::fillTriangle(const Vec2& A, const Vec2& B, const Vec2& C, const Color& color)
{
if (!m_initialized)
return;
Vec2 verts[3] = { A, B, C };
Vec2 texCoords[3] = { {0, 0}, {0, 0}, {0, 0} };
u32 inds[3] = { 0, 1, 2 };
push_polygon(verts, texCoords, 3, inds, 3, color, nullptr);
}
void BasicRenderer2D::outlinedRect(const Rectangle& rect, const Color& fillColor, const Color& outlineColor, i32 outlineThickness) void BasicRenderer2D::outlinedRect(const Rectangle& rect, const Color& fillColor, const Color& outlineColor, i32 outlineThickness)
{ {
if (!m_initialized) return; if (!m_initialized) return;
@ -733,6 +772,32 @@ namespace ogfx
fillEllipse(rect + offset, fillColor); fillEllipse(rect + offset, fillColor);
drawEllipse(rect, outlineColor, outlineThickness); drawEllipse(rect, outlineColor, outlineThickness);
} }
void BasicRenderer2D::outlinedTriangle(const Triangle& tri, const Color& fillColor, const Color& outlineColor, i32 outlineThickness)
{
if (!m_initialized) return;
outlinedTriangle(tri.vA, tri.vB, tri.vC, fillColor, outlineColor, outlineThickness);
}
void BasicRenderer2D::outlinedTriangle(const Vec2& A, const Vec2& B, const Vec2& C, const Color& fillColor, const Color& outlineColor, i32 outlineThickness)
{
if (!m_initialized) return;
drawTriangle(A, B, C, outlineColor, outlineThickness);
// Inset the fill triangle so it doesn't bleed past the outline
f32 inset = cast<f32>(outlineThickness);
Vec2 centroid = { (A.x + B.x + C.x) / 3.0f, (A.y + B.y + C.y) / 3.0f };
auto shrink = [&](const Vec2& v) -> Vec2 {
Vec2 dir = { centroid.x - v.x, centroid.y - v.y };
f32 len = std::sqrt(dir.x * dir.x + dir.y * dir.y);
if (len < 0.001f) return v;
dir.x /= len;
dir.y /= len;
return { v.x + dir.x * inset, v.y + dir.y * inset };
};
fillTriangle(shrink(A), shrink(B), shrink(C), fillColor);
}
// ===================================================== PRIMITIVES ===================================================== // ===================================================== PRIMITIVES =====================================================

View file

@ -96,6 +96,8 @@ namespace ogfx
void drawCircle(const Vec2& center, f32 radius, const Color& color, i32 thickness = 1); void drawCircle(const Vec2& center, f32 radius, const Color& color, i32 thickness = 1);
void drawCircle(const Rectangle& rect, const Color& color, i32 thickness = 1); void drawCircle(const Rectangle& rect, const Color& color, i32 thickness = 1);
void drawEllipse(const Rectangle& rect, const Color& color, i32 thickness = 1); void drawEllipse(const Rectangle& rect, const Color& color, i32 thickness = 1);
void drawTriangle(const Triangle& tri, const Color& color, i32 thickness = 1);
void drawTriangle(const Vec2& A, const Vec2& B, const Vec2& C, const Color& color, i32 thickness = 1);
void fillRect(const Rectangle& rect, const Color& color); void fillRect(const Rectangle& rect, const Color& color);
void fillRect(const Vec2& center, const Vec2& size, const Color& color); void fillRect(const Vec2& center, const Vec2& size, const Color& color);
@ -104,6 +106,8 @@ namespace ogfx
void fillCircle(const Vec2& center, f32 radius, const Color& color); void fillCircle(const Vec2& center, f32 radius, const Color& color);
void fillCircle(const Rectangle& rect, const Color& color); void fillCircle(const Rectangle& rect, const Color& color);
void fillEllipse(const Rectangle& rect, const Color& color); void fillEllipse(const Rectangle& rect, const Color& color);
void fillTriangle(const Triangle& tri, const Color& color);
void fillTriangle(const Vec2& A, const Vec2& B, const Vec2& C, const Color& color);
void outlinedRect(const Vec2& center, const Vec2& size, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1); void outlinedRect(const Vec2& center, const Vec2& size, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1);
void outlinedRect(const Rectangle& rect, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1); void outlinedRect(const Rectangle& rect, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1);
@ -112,6 +116,8 @@ namespace ogfx
void outlinedCircle(const Vec2& center, f32 radius, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1); void outlinedCircle(const Vec2& center, f32 radius, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1);
void outlinedCircle(const Rectangle& rect, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1); void outlinedCircle(const Rectangle& rect, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1);
void outlinedEllipse(const Rectangle& rect, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1); void outlinedEllipse(const Rectangle& rect, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1);
void outlinedTriangle(const Triangle& tri, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1);
void outlinedTriangle(const Vec2& A, const Vec2& B, const Vec2& C, const Color& fillColor, const Color& outlineColor, i32 outlineThickness = 1);
private: private:
void init_arrays(void); void init_arrays(void);

View file

@ -153,7 +153,8 @@ class Window : public ogfx::gui::Window
void onRedraw(ogfx::BasicRenderer2D& gfx) override void onRedraw(ogfx::BasicRenderer2D& gfx) override
{ {
gfx.drawAnimation(m_anim, { 200, 200 }); gfx.drawAnimation(m_anim, { 200, 200 });
wout().xy(100, 100).fg(Colors::Crimson).p("CIAO BELLA").resetColors(); gfx.outlinedTriangle({ 30, 30 }, { 100, 50 }, { 60, 90 }, Colors::Crimson, Colors::DarkBlue, 5);
gfx.endFrame();
} }
void onFixedUpdate(void) override void onFixedUpdate(void) override