diff options
| author | Omar Rizwan <omar@omar.website> | 2023-09-27 00:13:48 +0000 |
|---|---|---|
| committer | Omar Rizwan <omar@omar.website> | 2023-09-27 00:13:48 +0000 |
| commit | c1bac3003b74702eef36ecb123bb5cdd59d44657 (patch) | |
| tree | e5747384446afbe995a62ecf8a961ea0bd49044f /virtual-programs | |
| parent | display: Add circle support. (diff) | |
| download | folk-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.folk | 39 |
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 } |
