Hey I'm looking for a simple way to draw a filled shape that isn't one of the standard shapes. For example, a pizza slice or a large triangle.
Any suggestions? I can draw the outline okay but I want it filled.
You're gonna want a "trifill" function, there isn't one included with Pico8. There have been a few floating around the forums here, the first one that comes to mind is part of electric gryphon's 3D engine library.
There's a function in there called solid_trifill(). It shouldn't be too hard to extract that from the code if you just want to use that by itself...
https://www.lexaloffle.com/bbs/?tid=28077
That function in itself can only draw a triangle, to construct anything more complex you'd have to call it multiple times, piecing the shape together from triangles.
EDIT: Or there's the post below!!
Here's my polyfill code:
-- draws a filled convex polygon
-- v is an array of vertices
-- {x1, y1, x2, y2} etc
function render_poly(v,col)
col=col or 5
-- initialize scan extents
-- with ludicrous values
local x1,x2={},{}
for y=0,127 do
x1[y],x2[y]=128,-1
end
local y1,y2=128,-1
-- scan convert each pair
-- of vertices
for i=1, #v/2 do
local next=i+1
if (next>#v/2) next=1
-- alias verts from array
local vx1=flr(v[i*2-1])
local vy1=flr(v[i*2])
local vx2=flr(v[next*2-1])
local vy2=flr(v[next*2])
if vy1>vy2 then
-- swap verts
local tempx,tempy=vx1,vy1
vx1,vy1=vx2,vy2
vx2,vy2=tempx,tempy
end
-- skip horizontal edges and
-- offscreen polys
if vy1~=vy2 and vy1<128 and
vy2>=0 then
-- clip edge to screen bounds
if vy1<0 then
vx1=(0-vy1)*(vx2-vx1)/(vy2-vy1)+vx1
vy1=0
end
if vy2>127 then
vx2=(127-vy1)*(vx2-vx1)/(vy2-vy1)+vx1
vy2=127
end
-- iterate horizontal scans
for y=vy1,vy2 do
if (y<y1) y1=y
if (y>y2) y2=y
-- calculate the x coord for
-- this y coord using math!
x=(y-vy1)*(vx2-vx1)/(vy2-vy1)+vx1
if (x<x1[y]) x1[y]=x
if (x>x2[y]) x2[y]=x
end
end
end
-- render scans
for y=y1,y2 do
local sx1=flr(max(0,x1[y]))
local sx2=flr(min(127,x2[y]))
local c=col*16+col
local ofs1=flr((sx1+1)/2)
local ofs2=flr((sx2+1)/2)
memset(0x6000+(y*64)+ofs1,c,ofs2-ofs1)
pset(sx1,y,c)
pset(sx2,y,c)
end
end
|
Here's a little doodle using your triangle code. Thanks for sharing =)
[Please log in to post a comment]




