raster.art
SEARCH
Create Account
No wallets connected. Please connect a wallet first.
lofi 3d
alexthescott, 2021on hic et nunc
Platforms
hic et nunc
Description

-- lofi 3d 3 -- alexthescott -- 10/25/21 9:01pm

-- based on 3d demo -- by @noahrosamilia

-- circle maths -- https://www.cmu.edu/biolphys/deserno/pdf/sphere_equi.pdf

-- new seed every day of the year srand(31*stat(81)+stat(82))

p1={7,6,135,10,138,11,139,3,131,12,140,1,129,130,128,0} p2={7,135,10,9,15,143,142,137,14,136,8,2,130,133,128,0} p3={7,15,143,142,14,8,136,137,9,10,135,138,11,139,12,140}

p={p1,p2,p3} c=rnd(p)

pal(c,1)

function draw_shape(s) for i,l in ipairs(s[2]) do draw_line(s[1][l[1]],s[1][l[2]],i) end end

function draw_line(p1,p2,c) x0,y0=project(p1) x1,y1=project(p2) line(x0,y0,x1,y1,c) end

function draw_point(p,c) x,y=project(p) pset(x,y,c) end

function project(p) -- calculate x,y and center it x=(p[1]-cam[1])*mult/(p[3]-cam[3])+127/2 y=-(p[2]-cam[2])*mult/(p[3]-cam[3])+127/2 return x,y end

function translate_shape(s,t) -- copy shape, 0 out points, -- keep og lines ns={{},s[2]} -- add displacement to point for p in all(s[1])do add(ns[1],{p[1]+t[1],p[2]+t[2],p[3]+t[3]}) end return ns end

function rotate_shape(s,a,r) -- copy shape, 0 out points -- keep og lines ns={{},s[2]} for p in all(s[1])do add(ns[1],rotate_point(p,a,r)) end return ns end

function rotate_point(p,a,r) -- figure axis we're rotating if a==1 then x,y,z=3,2,1 elseif a==2 then x,y,z=1,3,2 elseif a==3 then x,y,z=1,2,3 end

_x=cos(r)*p[x]-sin(r)*p[y]
_y=sin(r)*p[x]+cos(r)*p[y]
np={}
np[x]=_x
np[y]=_y
np[z]=p[z]
return np

end

function limit_int(v,l) if v>0 then return min(v,l) else return max(v,-l) end end

function burn() for p=0,384 do x=rnd(128)\1 y=rnd(128)\1 pc=pget(x,y) if pc!=0 then pset(x,y,pc-1) else pset(x,y,0) end end end

function fuzz(big) if big then sz=10 cnt=512 else sz=3 cnt=384 end

for p=0,cnt do
	x=rnd(128)\1
	y=rnd(128)\1
	pc=pget(x,y)
	if pc!=0 then
		for l=1,rnd(sz)\1 do
		pset(x-l,y,pc)
		pset(x+l,y,pc)
		end
	end		
end

end

function forward() v=c[1] del(c,v) c[#c+1]=v pal(c,1) end

function backward() v=c[#c] del(c,v) for i=#c+1,1,-1 do if i!=1 then c[i]=c[i-1] else c[i]=v end end pal(c,1) end

function build_circ(shape,n,s) phi=2*(3-sqrt(5)) for i=0,n do y=1-(i/(n-1))2 r=sqrt(1-yy) theta=phii x=cos(theta)r z=sin(theta)r add(shape[1],{xs,ys,zs}) end

for i=1,#shape[1]-2 do
	add(shape[2],{i,i+2})
end

end

function centr_circ(r,c) for x=0,128 do y=sqrt(r^2-(x-64)^2)+64 line(x,128,x,y,c) line(x,0,x,128-y,c) end end

for i=1,rnd()*16 do forward() end

for p=1,24 do po={p,p+1} end

cam={0,0,-1.5} mult=64

cir1={{},{}} cir2={{},{}} build_circ(cir1,256,1) build_circ(cir2,128,2/3) cir2=rotate_shape(cir2,1,0.25)

burn_count=10+(50rnd())\1 burn_var=3+(10rnd())\1

cntr_dthr=rnd()<=0.25

a=1+rnd(2)\1 ac=(1+rnd(10)\1)*60

month=stat(81) day=stat(82) cls() _set_fps(60) ::♥:: if t()<2 then print("lofi 3d 3",46,59,1) print(month.."/"..day,55,65) else if btn(❎) and btn(🅾️) or time()%burn_var==0 then burn_count=10+(50rnd())\1 burn_var=3+(10rnd())\1 centr_circ(64,0) elseif burn_count>0 then centr_circ(64,0) burn_count-=1 else centr_circ(32,0) if cntr_dthr then fillp(0b0111010101111111) circfill(63,63,32,1) fillp() end end

if btn(⬅️) then cam[1] -= 0.01 end
if btn(➡️) then cam[1] += 0.01 end
if btn(⬆️) then cam[2] += 0.01 end
if btn(⬇️) then cam[2] -= 0.01 end
if btn(❎) then cam[3] -= 0.01 end
if btn(🅾️) then cam[3] += 0.01 end

if btn(⬆️) and btn(⬇️) or
	btn(➡️) and btn(⬅️) then
		print("cam.x="..cam[1],0,0,2)
		print("cam.y="..cam[2],0,6,2)
		print("cam.z="..cam[3],0,12,2)
end

if ac<=0 then
	if a==1 then
		a=2
	else
		a=1
	end
	ac=(1+rnd(10)\1)*60
else
	ac-=1
end

cir2=rotate_shape(cir2,a,0.004)
cir1=rotate_shape(cir1,a,0.004)
draw_shape(cir2)
draw_shape(cir1)

end flip() goto ♥