Genuary 2024 Day 12 - Lava Lamp

January 12, 2024
pico-8 open-source
Genuary 2024 Day 12 - Lava Lamp
-- genuary #12 2024
-- lava lamp
-- by carson kompon

?"\^!5f100😐1▒🐱☉8"
_set_fps(60)
o={}
z=0

function dist(x,y)
	return sqrt((x*x+y*y))
end

function sdf_circle(x,y,cx,cy,r)
	x-=cx
	y-=cy
	return dist(x,y)-r
end

function sdf_elipse(x,y,cx,cy,rx,ry)
	x-=cx
	y-=cy
	return dist(x/rx,y/ry)-1
end

function sdf(x,y)
	local topcircle=sdf_elipse(x,y,0,-1,0.8+cos(t()/8)/16,.5+sin(t()/16)/32)
	local bottomcircle=sdf_elipse(x,y,0,1,0.8+sin(t()/8)/16,.5+cos(t()/16)/32)
	local cores = min(topcircle,bottomcircle)
	
	for s in all(o)do
		local d=sdf_circle(x,y,s.x,s.y,s.r)
		cores=min(cores,d)
		if(s.y<-1 or s.y>=1)del(o,s)
	end
	
	return cores
end

function lerp(a,b,y)
	return a+(b-a)*y
end

::_::
	for s in all(o)do
		s.x+=s.vx
		s.y+=s.vy
		s.r=lerp(s.r,s.tr,.02)
	end
	
	for i=0,200 do
		x=rnd(2)-1
		y=rnd(2)-1
		d=sdf(x,y)
		c=0
		if(d<=.02)c=1+((y+1)/2)*6
		if(d>.02)c=0
		circfill((x+1)*64,(y+1)*64,1,c)
		
		if(t()-z>1)then
			add(o,{
				x=rnd(2)-1,
				y=rnd({-.99,.99}),
				vx=0.002*rnd({1,-1})*rnd(),
				vy=0.0065*rnd({1,-1})*(rnd()+.05),
				tr=rnd(.3)+.01,
				r=0
			})
			z=t()
		end
	end
	flip()
goto _