--Random number between two values
function rnd(mi, ma)
	return math.random()*(ma-mi) + mi
end 


--Emit random spark particles
function emitSparks(pos)
	ParticleReset()
	ParticleTile(4)
	ParticleStretch(3)
	ParticleEmissive(10, 0)
	ParticleRadius(0.01)
	ParticleGravity(-10)
	ParticleColor(1, 0.7, 0.3)
	ParticleSticky(0.05)
	for i=1, 8 do
		SpawnParticle(pos, Vec(rnd(-2, 2), rnd(-2,2), rnd(-2,2)), rnd(1, 4))
	end
end

emitDir = nil
emitPos = nil

function init()	
	--Find out the origin and direction of the laser beam
	local emitter = FindLocation("emitter")
	local emitTransform = GetLocationTransform(emitter)
	emitDir = TransformToParentVec(emitTransform, Vec(0,0,-1))
	emitPos = emitTransform.pos
	
	--The receiver shape (no sparks or hole if raycast hits this shape)
	receiver = FindShape("receiver")

	laserLoop = LoadLoop("MOD/snd/laser-loop.ogg")
	laserHitLoop = LoadLoop("MOD/snd/laser-hit-loop.ogg")
	
	melt = 0
end


function tick(dt)
	PlayLoop(laserLoop, emitPos, 0.3)

	--Shoot a ray and see where it hits
	local _, dist, _, shape = QueryRaycast(emitPos, emitDir, 1000)	
	local hitPos = VecAdd(emitPos, VecScale(emitDir, dist))
	
	--Draw line and light up the end point
	DrawLine(emitPos, hitPos, 1, 0.4, 0.4)
	PointLight(hitPos, 1, 0.2, 0.2, rnd(0.5, 1.0))

	--If we hit something, play a sound, emit sparks and increase melt timer
	if shape ~= receiver then
		melt = melt + dt
		emitSparks(hitPos)
		PlayLoop(laserHitLoop, hitPos)
	else
		melt = 0
	end
	
	--If melt timer goes above 0.25 seconds, make a hole and reset melt timer
	if melt > 0.25 then
		PointLight(hitPos, 1, 0.2, 0.2, rnd(2.0, 4.0))
		MakeHole(hitPos, 0.5, 0.3, 0, true)
		melt = 0
	end
end


