function SpringObject.ObserveRenderStepped(k)return k:ObserveOnSignal(RunService.RenderStepped)end function SpringObject.ObserveVelocityOnRenderStepped(k)return k:ObserveVelocityOnSignal(RunService.RenderStepped)end function SpringObject.ObserveVelocityOnSignal(f,k)return Observable.new(function(v)local w=Maid.new()local b,N=StepUtils.bindToSignal(k,function()local k=SpringUtils.animating(f._currentSpring)if k then v:Fire(SpringUtils.fromLinearIfNeeded(f._currentSpring.Velocity))else v:Fire(SpringUtils.fromLinearIfNeeded(0*f._currentSpring.Velocity))end return k end)w:GiveTask(N)w:GiveTask(f.Changed:Connect(b))b()return w end)end

function SpringObject:ObserveRenderStepped()
	return self:ObserveOnSignal(RunService.RenderStepped)
end

function SpringObject:ObserveVelocityOnRenderStepped()
	return self:ObserveVelocityOnSignal(RunService.RenderStepped)
end

function SpringObject:ObserveVelocityOnSignal(signal)
	return Observable.new(function(sub)
		local maid = Maid.new()

		local startAnimate, stopAnimate = StepUtils.bindToSignal(signal, function()
			local animating = SpringUtils.animating(self._currentSpring)
			if animating then
				sub:Fire(SpringUtils.fromLinearIfNeeded(self._currentSpring.Velocity))
			else
				sub:Fire(SpringUtils.fromLinearIfNeeded(0*self._currentSpring.Velocity))
			end
			return animating
		end)

		maid:GiveTask(stopAnimate)
		maid:GiveTask(self.Changed:Connect(startAnimate))
		startAnimate()

		return maid
	end)
end
