summaryrefslogtreecommitdiffstats
path: root/virtual-programs
diff options
context:
space:
mode:
authorOmar Rizwan <omar@omar.website>2023-09-27 00:13:48 +0000
committerOmar Rizwan <omar@omar.website>2023-09-27 00:13:48 +0000
commitc1bac3003b74702eef36ecb123bb5cdd59d44657 (patch)
treee5747384446afbe995a62ecf8a961ea0bd49044f /virtual-programs
parentdisplay: Add circle support. (diff)
downloadfolk-c1bac3003b74702eef36ecb123bb5cdd59d44657.tar.gz
folk-c1bac3003b74702eef36ecb123bb5cdd59d44657.zip
display: Implement fillTriangle; fillPolygon also seems to work.
Diffstat (limited to 'virtual-programs')
-rw-r--r--virtual-programs/display.folk39
1 files changed, 36 insertions, 3 deletions
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 }