Advertisement
Velinquish

CameraTrack API

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