function BaseCamera.CalculateNewLookCFrame(r,c)local p=c or r:GetCameraLookVector()local n=math.asin(p.y)local x=math.clamp(r.rotateInput.y,-MAX_Y+n,-MIN_Y+n)local A=Vector2.new(r.rotateInput.x,x)local d=CFrame.new(ZERO_VECTOR3,p)local y=(CFrame.Angles(0,-A.x,0)*d)*CFrame.Angles(-A.y,0,0)return y end function BaseCamera.CalculateNewLookVector(r,c)local p=r:CalculateNewLookCFrame(c)return p.lookVector end function BaseCamera.CalculateNewLookVectorVR(c)local r=c:GetSubjectPosition()local p=r-game.Workspace.CurrentCamera.CFrame.p local n=(p*X1_Y0_Z1).unit local x=Vector2.new(c.rotateInput.x,0)local A=CFrame.new(ZERO_VECTOR3,n)local d=((CFrame.Angles(0,-x.x,0)*A)*CFrame.Angles(-x.y,0,0)).lookVector return(d*X1_Y0_Z1).unit end function BaseCamera.GetHumanoid(c)local r=player and player.Character if r then local p=c.humanoidCache[player]if p and p.Parent==r then return p else c.humanoidCache[player]=nil local p=r:FindFirstChildOfClass("\072\117\109\097\110\111\105\100")if p then c.humanoidCache[player]=p end return p end end return nil end function BaseCamera.GetHumanoidPartToFollow(p,c,r)if r==Enum.HumanoidStateType.Dead then local r=c.Parent if r then return r:FindFirstChild("\072\101\097\100")or c.Torso else return c.Torso end else return c.Torso end end function BaseCamera.UpdateGamepad(c)local r=c.gamepadPanningCamera if r and(c.hasGameLoaded or not VRService.VREnabled)then r=Util.GamepadLinearToCurve(r)local p=tick()if r.X~=0 or r.Y~=0 then c.userPanningTheCamera=true elseif r==ZERO_VECTOR2 then if FFlagUserFixGamepadCameraTracking then c.userPanningTheCamera=false c.gamepadPanningCamera=false end c.lastThumbstickRotate=nil if c.lastThumbstickPos==ZERO_VECTOR2 then c.currentSpeed=0 end end local n=0 if c.lastThumbstickRotate then if VRService.VREnabled then c.currentSpeed=c.vrMaxSpeed else local n=(p-c.lastThumbstickRotate)*10 c.currentSpeed=c.currentSpeed+c.maxSpeed*((n*n)/c.numOfSeconds)if c.currentSpeed>c.maxSpeed then c.currentSpeed=c.maxSpeed end if c.lastVelocity then local n=(r-c.lastThumbstickPos)/(p-c.lastThumbstickRotate)local x=(n-c.lastVelocity).magnitude if x>12 then c.currentSpeed=c.currentSpeed*(20/x)if c.currentSpeed>c.maxSpeed then c.currentSpeed=c.maxSpeed end end end end n=(UserGameSettings.GamepadCameraSensitivity*c.currentSpeed)*c.gamepadSensitivity c.lastVelocity=(r-c.lastThumbstickPos)/(p-c.lastThumbstickRotate)end c.lastThumbstickPos=r c.lastThumbstickRotate=p return Vector2.new(r.X*n,((r.Y*n)*c.ySensitivity)*UserGameSettings:GetCameraYInvertValue())end return ZERO_VECTOR2 end

function BaseCamera:CalculateNewLookCFrame(suppliedLookVector)
	local currLookVector = suppliedLookVector or self:GetCameraLookVector()
	local currPitchAngle = math.asin(currLookVector.y)
	local yTheta = math.clamp(self.rotateInput.y, -MAX_Y + currPitchAngle, -MIN_Y + currPitchAngle)
	local constrainedRotateInput = Vector2.new(self.rotateInput.x, yTheta)
	local startCFrame = CFrame.new(ZERO_VECTOR3, currLookVector)
	local newLookCFrame = CFrame.Angles(0, -constrainedRotateInput.x, 0) * startCFrame * CFrame.Angles(-constrainedRotateInput.y,0,0)
	return newLookCFrame
end
function BaseCamera:CalculateNewLookVector(suppliedLookVector)
	local newLookCFrame = self:CalculateNewLookCFrame(suppliedLookVector)
	return newLookCFrame.lookVector
end

function BaseCamera:CalculateNewLookVectorVR()
	local subjectPosition = self:GetSubjectPosition()
	local vecToSubject = (subjectPosition - game.Workspace.CurrentCamera.CFrame.p)
	local currLookVector = (vecToSubject * X1_Y0_Z1).unit
	local vrRotateInput = Vector2.new(self.rotateInput.x, 0)
	local startCFrame = CFrame.new(ZERO_VECTOR3, currLookVector)
	local yawRotatedVector = (CFrame.Angles(0, -vrRotateInput.x, 0) * startCFrame * CFrame.Angles(-vrRotateInput.y,0,0)).lookVector
	return (yawRotatedVector * X1_Y0_Z1).unit
end

function BaseCamera:GetHumanoid()
	local character = player and player.Character
	if character then
		local resultHumanoid = self.humanoidCache[player]
		if resultHumanoid and resultHumanoid.Parent == character then
			return resultHumanoid
		else
			self.humanoidCache[player] = nil -- Bust Old Cache
			local humanoid = character:FindFirstChildOfClass("Humanoid")
			if humanoid then
				self.humanoidCache[player] = humanoid
			end
			return humanoid
		end
	end
	return nil
end

function BaseCamera:GetHumanoidPartToFollow(humanoid, humanoidStateType)
	if humanoidStateType == Enum.HumanoidStateType.Dead then
		local character = humanoid.Parent
		if character then
			return character:FindFirstChild("Head") or humanoid.Torso
		else
			return humanoid.Torso
		end
	else
		return humanoid.Torso
	end
end

function BaseCamera:UpdateGamepad()
	local gamepadPan = self.gamepadPanningCamera
	if gamepadPan and (self.hasGameLoaded or not VRService.VREnabled) then
		gamepadPan = Util.GamepadLinearToCurve(gamepadPan)
		local currentTime = tick()
		if gamepadPan.X ~= 0 or gamepadPan.Y ~= 0 then
			self.userPanningTheCamera = true
		elseif gamepadPan == ZERO_VECTOR2 then
			if FFlagUserFixGamepadCameraTracking then
				self.userPanningTheCamera = false
				self.gamepadPanningCamera = false
			end
			self.lastThumbstickRotate = nil
			if self.lastThumbstickPos == ZERO_VECTOR2 then
				self.currentSpeed = 0
			end
		end

		local finalConstant = 0

		if self.lastThumbstickRotate then
			if VRService.VREnabled then
				self.currentSpeed = self.vrMaxSpeed
			else
				local elapsedTime = (currentTime - self.lastThumbstickRotate) * 10
				self.currentSpeed = self.currentSpeed + (self.maxSpeed * ((elapsedTime*elapsedTime)/self.numOfSeconds))

				if self.currentSpeed > self.maxSpeed then self.currentSpeed = self.maxSpeed end

				if self.lastVelocity then
					local velocity = (gamepadPan - self.lastThumbstickPos)/(currentTime - self.lastThumbstickRotate)
					local velocityDeltaMag = (velocity - self.lastVelocity).magnitude

					if velocityDeltaMag > 12 then
						self.currentSpeed = self.currentSpeed * (20/velocityDeltaMag)
						if self.currentSpeed > self.maxSpeed then self.currentSpeed = self.maxSpeed end
					end
				end
			end

			finalConstant = UserGameSettings.GamepadCameraSensitivity * self.currentSpeed * self.gamepadSensitivity
			self.lastVelocity = (gamepadPan - self.lastThumbstickPos)/(currentTime - self.lastThumbstickRotate)
		end

		self.lastThumbstickPos = gamepadPan
		self.lastThumbstickRotate = currentTime

		return Vector2.new( gamepadPan.X * finalConstant, gamepadPan.Y * finalConstant * self.ySensitivity * UserGameSettings:GetCameraYInvertValue())
	end

	return ZERO_VECTOR2
end
