From c1bac3003b74702eef36ecb123bb5cdd59d44657 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Tue, 26 Sep 2023 20:13:48 -0400 Subject: display: Implement fillTriangle; fillPolygon also seems to work. --- virtual-programs/display.folk | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) (limited to 'virtual-programs') diff --git a/virtual-programs/display.folk b/virtual-programs/display.folk index fd30779b..fe0d883f 100644 --- a/virtual-programs/display.folk +++ b/virtual-programs/display.folk @@ -265,9 +265,42 @@ On process { } } - proc fillTriangle {args} {} - proc fillQuad {args} {} - proc fillPolygon {args} {} + variable fillTriangle [Gpu::pipeline {vec2 p0 vec2 p1 vec2 p2 vec4 color} { + vec2 vertices[4] = vec2[4](p0, p1, p2, p2); + return vertices[gl_VertexIndex]; + } { + return color; + }] + proc fillTriangle {p0 p1 p2 color} { + variable fillTriangle + Gpu::draw $fillTriangle $p0 $p1 $p2 [getColor $color] + } + + proc fillQuad {p0 p1 p2 p3 color} { + fillTriangle $p1 $p2 $p3 $color + fillTriangle $p0 $p1 $p3 $color + } + + proc fillPolygon {points color} { + set num_points [llength $points] + if {$num_points < 3} { + error "At least 3 points are required to form a polygon." + } elseif {$num_points == 3} { + eval fillTriangle $points $color + } elseif {$num_points == 4} { + eval fillQuad $points $color + } else { + # Get the first point in the list as the "base" point of the triangles + set p0 [lindex $points 0] + + for {set i 1} {$i < $num_points - 1} {incr i} { + set p1 [lindex $points $i] + set p2 [lindex $points [expr {$i+1}]] + fillTriangle $p0 $p1 $p2 $color + } + } + } + proc image {x y im radians {scale 1.0}} {} proc end {} { Gpu::drawEnd; Gpu::poll } -- cgit v1.2.3