-- DRIVE LOOP
----------------------------------------

while true do

	-- Valores de entrada retirados do VehicleSeat
	local steerFloat = vehicleSeat.SteerFloat  -- Direção para frente e para trás, entre -1 e 1
	local throttle = vehicleSeat.ThrottleFloat  -- Direção esquerda e direita, entre -1 e 1

	-- Converte "steerFloat" em um ângulo para os servos HingeConstraint
	local turnAngle = steerFloat * MAX_TURN_ANGLE
	wheelHingeR.TargetAngle = turnAngle
	wheelHingeL.TargetAngle = turnAngle

	-- Aplique torque aos motores CylindricalConstraint dependendo da entrada do acelerador e da velocidade atual do carro
	local currentVel = getAverageVelocity()
	local targetVel = 0
	local motorTorque = 0

	-- Em marcha lenta
	if math.abs(throttle) < 0.1 then
		motorTorque = 100

	-- Accelerating
	elseif math.abs(throttle * currentVel) > 0 then
		-- Reduzir o torque com a velocidade (se o torque fosse constante, haveria um solavanco atingindo a velocidade alvo)
		-- Isso também produz uma redução na velocidade ao girar
		local r = math.abs(currentVel) / MAX_SPEED
		-- O torque deve ser mais sensível à entrada em baixa aceleração do que alta, portanto, esquadre o valor de "acelerador"
		motorTorque = math.exp( - 3 * r * r ) * TORQUE * throttle * throttle
		targetVel = math.sign(throttle) * 10000  -- Número grande arbitrário

		-- Frenagem
	else
		motorTorque = BRAKING_TORQUE * throttle * throttle
	end

	-- Use funções auxiliares para aplicar torque e velocidade alvo a todos os motores
	setMotorTorque(motorTorque)
	setMotorVelocity(targetVel)
	wait()
end
