try this linefill func and start optimizing it

This commit is contained in:
Kistaro Windrider 2025-06-08 14:35:49 -07:00
parent 37d9e3d30e
commit 2c37784ad7
Signed by: kistaro
SSH Key Fingerprint: SHA256:TBE2ynfmJqsAf0CP6gsflA0q5X5wD5fVKWPsZ7eVUg8

View File

@ -114,8 +114,9 @@ end
function _draw()
cls(0)
rect(bx0,by0,bx1,by1,6)
quickzot(lx1,ly1,2,lx1-lx0,ly1-ly0,10,9,8)
--line(lx0,ly0,lx1,ly1,2)
--quickzot(lx1,ly1,2,lx1-lx0,ly1-ly0,10,9,8)
linefill(lx0, ly0, lx1, ly1, 2, 9)
line(lx0,ly0,lx1,ly1,2)
local cmin, cmax = collides()
if cmin then
local dx,dy=lx1-lx0,ly1-ly0
@ -174,6 +175,51 @@ function quickzot(x,y,r,dx,dy,hot,warm,cold)
end
rectfill(x-r2,y-r2,x+r2,y+r2,hot)
end
-- linefill x0 y0 x1 y1 r [col]
-- draw a thicc line
-- https://www.lexaloffle.com/bbs/?tid=39016
function linefill(ax,ay,bx,by,r,c)
if(c) color(c)
local dx,dy=bx-ax,by-ay
-- avoid overflow
-- credits: https://www.lexaloffle.com/bbs/?tid=28999
local d,n = abs(dx),abs(dy)
if (d<n) d,n=n,d
n/=d
d*=(n*n+1)^0.5
if(d<0.001) return
local ca,sa=dx/d,-dy/d
-- polygon points
local s={
{0,-r},{d,-r},{d,r},{0,r}
}
local u,v,spans=s[4][1],s[4][2],{}
local x0,y0=ax+u*ca+v*sa,ay-u*sa+v*ca
for i=1,4 do
local u,v=s[i][1],s[i][2]
local x1,y1=ax+u*ca+v*sa,ay-u*sa+v*ca
local _x1,_y1=x1,y1
if(y0>y1) x0,y0,x1,y1=x1,y1,x0,y0
local dx=(x1-x0)/(y1-y0)
if(y0<0) x0-=y0*dx y0=-1
local cy0=y0\1+1
-- sub-pix shift
x0+=(cy0-y0)*dx
for y=y0\1+1,min(y1\1,127) do
-- open span?
local span=spans[y]
if span then
rectfill(x0,y,span,y)
else
spans[y]=x0
end
x0+=dx
end
x0,y0=_x1,_y1
end
end
__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000