Advertisement
Velinquish

Untitled

May 30th, 2020
1,073
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.46 KB | None | 0 0
  1. local RunService = game:GetService("RunService")
  2.  
  3. local CameraTrack = {}
  4. CameraTrack.__index = CameraTrack
  5.  
  6. function CameraTrack.load(folder, fps)
  7.     local fovFolder = folder:FindFirstChild("FOV")
  8.     local framesFolder = folder:FindFirstChild("Frames")
  9.     assert(fovFolder ~= nil, "CameraTrack: There's no folder named 'FOV' inside here!")
  10.     assert(framesFolder ~= nil, "CameraTrack: There's no folder named 'Frames' inside here!")
  11.    
  12.     local self = setmetatable({}, CameraTrack)
  13.     self.FOV = fovFolder:GetChildren()
  14.     self.Frames = framesFolder:GetChildren()
  15.     local function sortNumericalNames(a, b)
  16.         return tonumber(a.Name) < tonumber(b.Name)
  17.     end
  18.     table.sort(self.FOV, sortNumericalNames)
  19.     table.sort(self.Frames, sortNumericalNames)
  20.     self.IsPlaying = false
  21.     self.Speed = 1
  22.     self.TimePosition = 0
  23.     self.FPS = fps or 60
  24.     self.Length = #self.Frames / self.FPS
  25.     self.PreviousCameraType = nil
  26.     if folder:FindFirstChild("Settings") and folder.Settings:FindFirstChild("Loop") then
  27.         self.Looped = folder.Settings.Loop.Value
  28.     else
  29.         self.Looped = false
  30.     end
  31.  
  32.     return self
  33. end
  34.  
  35. function CameraTrack:Play(camera)
  36.     self.Camera =  camera or workspace.CurrentCamera
  37.     self.PreviousCameraType = self.PreviousCameraType or self.Camera.CameraType
  38.     self.IsPlaying = true
  39.     self.Camera.CameraType = Enum.CameraType.Scriptable
  40.     local interval = (1/self.FPS) * self.Speed -- Interval between frames
  41.     self.Heartbeat = RunService.RenderStepped:Connect(function(deltaTime)
  42.         local kf = self.TimePosition / interval + 1
  43.         local kfIndex = math.floor(kf)
  44.         local alpha = kf - kfIndex
  45.         local success = pcall(function()
  46.             self.Camera.CFrame = self.Frames[kfIndex].Value:Lerp(self.Frames[kfIndex + 1].Value, alpha)
  47.             local fov = self.FOV[kfIndex].Value
  48.             self.Camera.FieldOfView = fov + (self.FOV[kfIndex + 1].Value - fov) * alpha
  49.         end)
  50.         if not success then -- Reached all the keyframes
  51.             self.Heartbeat:Disconnect()
  52.             self.IsPlaying = false
  53.             self.Camera.CameraType = self.PreviousCameraType
  54.             return
  55.         end
  56.         self.TimePosition = self.TimePosition + deltaTime
  57.     end)
  58. end
  59.  
  60. function CameraTrack:Stop() -- Well, it really pauses it
  61.     self.Heartbeat:Disconnect()
  62.     self.IsPlaying = false
  63.     self.Camera.CameraType = self.PreviousCameraType
  64. end
  65.  
  66. return CameraTrack
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement