@quenty/camera 14.20.3 → 14.20.4-canary.11a5dcf.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/package.json +17 -17
  3. package/src/Client/CameraStack.lua +27 -20
  4. package/src/Client/CameraStackService.lua +53 -35
  5. package/src/Client/CameraState.lua +8 -8
  6. package/src/Client/CameraUtils.lua +1 -1
  7. package/src/Client/CameraUtils.story.lua +5 -4
  8. package/src/Client/Controls/CameraControls.lua +107 -60
  9. package/src/Client/Controls/CameraGamepadInputUtils.lua +36 -21
  10. package/src/Client/Controls/GamepadRotateModel.lua +22 -12
  11. package/src/Client/Effects/CameraEffectUtils.lua +10 -1
  12. package/src/Client/Effects/CustomCameraEffect.lua +21 -5
  13. package/src/Client/Effects/DefaultCamera.lua +50 -32
  14. package/src/Client/Effects/FadeBetween/FadeBetweenCamera.lua +7 -7
  15. package/src/Client/Effects/FadeBetween/FadeBetweenCamera2.lua +11 -11
  16. package/src/Client/Effects/FadeBetween/FadeBetweenCamera3.lua +57 -21
  17. package/src/Client/Effects/FadeBetween/FadeBetweenCamera4.lua +17 -9
  18. package/src/Client/Effects/FadingCamera.lua +21 -5
  19. package/src/Client/Effects/HeartbeatCamera.lua +22 -9
  20. package/src/Client/Effects/ImpulseCamera.lua +44 -28
  21. package/src/Client/Effects/ImpulseCamera.story.lua +6 -6
  22. package/src/Client/Effects/InverseFader.lua +22 -6
  23. package/src/Client/Effects/LagPointCamera.lua +27 -8
  24. package/src/Client/Effects/OverrideDefaultCameraToo.lua +26 -4
  25. package/src/Client/Effects/PointCamera.lua +22 -6
  26. package/src/Client/Effects/PushCamera.lua +35 -14
  27. package/src/Client/Effects/RotatedCamera.lua +23 -9
  28. package/src/Client/Effects/SmoothPositionCamera.lua +22 -10
  29. package/src/Client/Effects/SmoothRotatedCamera.lua +52 -24
  30. package/src/Client/Effects/SmoothZoomedCamera.lua +31 -12
  31. package/src/Client/Effects/SummedCamera.lua +38 -16
  32. package/src/Client/Effects/TrackCamera.lua +24 -11
  33. package/src/Client/Effects/XZPlaneLockCamera.lua +21 -8
  34. package/src/Client/Effects/ZoomedCamera.lua +24 -7
  35. package/src/Client/Input/CameraInputUtils.lua +49 -13
  36. package/src/Client/Input/CameraTouchInputUtils.lua +17 -16
  37. package/src/Client/Utility/CameraFrame.lua +2 -2
  38. package/src/Client/Utility/CameraFrame.story.lua +21 -12
  39. package/src/Client/Utility/CameraStateTweener.lua +39 -19
  40. package/src/Client/Utility/FieldOfViewUtils.lua +1 -1
  41. package/test/scripts/Client/ClientMain.client.lua +1 -1
  42. package/test/scripts/Server/ServerMain.server.lua +1 -1
@@ -1,3 +1,4 @@
1
+ --!strict
1
2
  --[=[
2
3
  @class CameraInputUtils
3
4
  ]=]
@@ -7,7 +8,14 @@ local Workspace = game:GetService("Workspace")
7
8
 
8
9
  local CameraInputUtils = {}
9
10
 
10
- function CameraInputUtils.getPanBy(panDelta, sensivity)
11
+ --[=[
12
+ Computes the pan delta based on the given pan delta and sensitivity.
13
+
14
+ @param panDelta Vector2
15
+ @param sensivity Vector2
16
+ @return Vector2
17
+ ]=]
18
+ function CameraInputUtils.getPanBy(panDelta: Vector2, sensivity: Vector2): Vector2
11
19
  local viewportSize = Workspace.CurrentCamera.ViewportSize
12
20
  local aspectRatio = CameraInputUtils.getCappedAspectRatio(viewportSize)
13
21
  local inversionVector = CameraInputUtils.getInversionVector(UserGameSettings)
@@ -16,22 +24,45 @@ function CameraInputUtils.getPanBy(panDelta, sensivity)
16
24
  sensivity = CameraInputUtils.invertSensitivity(sensivity)
17
25
  end
18
26
 
19
- return inversionVector*sensivity*panDelta
27
+ return inversionVector * sensivity * panDelta
20
28
  end
21
29
 
22
- function CameraInputUtils.convertToPanDelta(vector3)
23
- return Vector2.new(vector3.x, vector3.y)
30
+ --[=[
31
+ Converts a Vector3 to a Vector2 for camera panning
32
+
33
+ @param vector3 Vector3
34
+ @return Vector2
35
+ ]=]
36
+ function CameraInputUtils.convertToPanDelta(vector3: Vector3): Vector2
37
+ return Vector2.new(vector3.X, vector3.Y)
24
38
  end
25
39
 
26
- function CameraInputUtils.getInversionVector(userGameSettings)
40
+ --[=[
41
+ Returns the inversion vector based on the user game settings.
42
+
43
+ @param userGameSettings UserGameSettings
44
+ @return Vector2
45
+ ]=]
46
+ function CameraInputUtils.getInversionVector(userGameSettings: UserGameSettings): Vector2
27
47
  return Vector2.new(1, userGameSettings:GetCameraYInvertValue())
28
48
  end
29
49
 
30
- function CameraInputUtils.invertSensitivity(sensivity)
31
- return Vector2.new(sensivity.y, sensivity.x)
50
+ --[=[
51
+ Inverts the sensitivity vector.
52
+
53
+ @param sensivity Vector2
54
+ @return Vector2
55
+ ]=]
56
+ function CameraInputUtils.invertSensitivity(sensivity: Vector2): Vector2
57
+ return Vector2.new(sensivity.Y, sensivity.X)
32
58
  end
33
59
 
34
- function CameraInputUtils.isPortraitMode(aspectRatio)
60
+ --[=[
61
+ Returns true if in portrait mode, false otherwise.
62
+ @param aspectRatio number
63
+ @return boolean
64
+ ]=]
65
+ function CameraInputUtils.isPortraitMode(aspectRatio: number): boolean
35
66
  if aspectRatio < 1 then
36
67
  return true
37
68
  end
@@ -39,10 +70,15 @@ function CameraInputUtils.isPortraitMode(aspectRatio)
39
70
  return false
40
71
  end
41
72
 
42
- function CameraInputUtils.getCappedAspectRatio(viewportSize)
43
- local x = math.clamp(viewportSize.x, 0, 1920)
44
- local y = math.clamp(viewportSize.y, 0, 1080)
45
- return x/y
73
+ --[=[
74
+ Computes a capped aspect ratio based on the viewport size.
75
+ @param viewportSize Vector2
76
+ @return number
77
+ ]=]
78
+ function CameraInputUtils.getCappedAspectRatio(viewportSize: Vector2): number
79
+ local x = math.clamp(viewportSize.X, 0, 1920)
80
+ local y = math.clamp(viewportSize.Y, 0, 1080)
81
+ return x / y
46
82
  end
47
83
 
48
- return CameraInputUtils
84
+ return CameraInputUtils
@@ -1,3 +1,4 @@
1
+ --!strict
1
2
  --[=[
2
3
  Utility methods involving touch input and cameras.
3
4
  @class CameraTouchInputUtils
@@ -23,27 +24,27 @@ local TOUCH_SENSITIVTY_ADJUST_MIN_Y = 0.5
23
24
  @param currPitchAngle number
24
25
  @param sensitivity Vector2
25
26
  @param delta Vector2
26
- Return Vector2
27
+ @return Vector2
27
28
  ]=]
28
- function CameraTouchInputUtils.adjustTouchSensitivity(currPitchAngle, sensitivity, delta)
29
+ function CameraTouchInputUtils.adjustTouchSensitivity(
30
+ currPitchAngle: number,
31
+ sensitivity: Vector2,
32
+ delta: Vector2
33
+ ): Vector2
29
34
  local multiplierY = TOUCH_SENSITIVTY_ADJUST_MAX_Y
30
35
  if currPitchAngle > TOUCH_ADJUST_AREA_UP and delta.Y < 0 then
31
- local fractionAdjust = (currPitchAngle - TOUCH_ADJUST_AREA_UP)/(MAX_Y - TOUCH_ADJUST_AREA_UP)
32
- fractionAdjust = 1 - (1 - fractionAdjust)^3
33
- multiplierY = TOUCH_SENSITIVTY_ADJUST_MAX_Y - fractionAdjust * (
34
- TOUCH_SENSITIVTY_ADJUST_MAX_Y - TOUCH_SENSITIVTY_ADJUST_MIN_Y)
36
+ local fractionAdjust = (currPitchAngle - TOUCH_ADJUST_AREA_UP) / (MAX_Y - TOUCH_ADJUST_AREA_UP)
37
+ fractionAdjust = 1 - (1 - fractionAdjust) ^ 3
38
+ multiplierY = TOUCH_SENSITIVTY_ADJUST_MAX_Y
39
+ - fractionAdjust * (TOUCH_SENSITIVTY_ADJUST_MAX_Y - TOUCH_SENSITIVTY_ADJUST_MIN_Y)
35
40
  elseif currPitchAngle < TOUCH_ADJUST_AREA_DOWN and delta.Y > 0 then
36
- local fractionAdjust = (currPitchAngle - TOUCH_ADJUST_AREA_DOWN)/(MIN_Y - TOUCH_ADJUST_AREA_DOWN)
37
- fractionAdjust = 1 - (1 - fractionAdjust)^3
38
- multiplierY = TOUCH_SENSITIVTY_ADJUST_MAX_Y - fractionAdjust * (
39
- TOUCH_SENSITIVTY_ADJUST_MAX_Y - TOUCH_SENSITIVTY_ADJUST_MIN_Y)
41
+ local fractionAdjust = (currPitchAngle - TOUCH_ADJUST_AREA_DOWN) / (MIN_Y - TOUCH_ADJUST_AREA_DOWN)
42
+ fractionAdjust = 1 - (1 - fractionAdjust) ^ 3
43
+ multiplierY = TOUCH_SENSITIVTY_ADJUST_MAX_Y
44
+ - fractionAdjust * (TOUCH_SENSITIVTY_ADJUST_MAX_Y - TOUCH_SENSITIVTY_ADJUST_MIN_Y)
40
45
  end
41
46
 
42
- return Vector2.new(
43
- sensitivity.X,
44
- sensitivity.Y * multiplierY
45
- )
47
+ return Vector2.new(sensitivity.X, sensitivity.Y * multiplierY)
46
48
  end
47
49
 
48
-
49
- return CameraTouchInputUtils
50
+ return CameraTouchInputUtils
@@ -6,8 +6,8 @@
6
6
 
7
7
  local require = require(script.Parent.loader).load(script)
8
8
 
9
- local QFrame = require("QFrame")
10
9
  local DuckTypeUtils = require("DuckTypeUtils")
10
+ local QFrame = require("QFrame")
11
11
 
12
12
  local CameraFrame = {}
13
13
  CameraFrame.ClassName = "CameraFrame"
@@ -197,4 +197,4 @@ function CameraFrame.__eq(a: CameraFrame, b: CameraFrame): boolean
197
197
  return a.QFrame == b.QFrame and a.FieldOfView == b.FieldOfView
198
198
  end
199
199
 
200
- return CameraFrame
200
+ return CameraFrame
@@ -2,7 +2,8 @@
2
2
  @class CameraFrame.story
3
3
  ]]
4
4
 
5
- local require = require(game:GetService("ServerScriptService"):FindFirstChild("LoaderUtils", true).Parent).bootstrapStory(script)
5
+ local require =
6
+ require(game:GetService("ServerScriptService"):FindFirstChild("LoaderUtils", true).Parent).bootstrapStory(script)
6
7
 
7
8
  local CameraFrame = require("CameraFrame")
8
9
  local CameraStoryUtils = require("CameraStoryUtils")
@@ -16,13 +17,21 @@ return function(target)
16
17
  local viewportFrame = CameraStoryUtils.setupViewportFrame(maid, target)
17
18
 
18
19
  local cameraCFrame = workspace.CurrentCamera.CFrame
19
- local a = CameraFrame.new(QFrame.fromCFrameClosestTo(
20
- CFrame.new(cameraCFrame.Position + cameraCFrame.lookVector*25 - 20*cameraCFrame.RightVector),
21
- QFrame.new()), 70)
22
- local b = CameraFrame.new(QFrame.fromCFrameClosestTo(
23
- CFrame.new(cameraCFrame.Position + cameraCFrame.lookVector*30 + 20*cameraCFrame.RightVector)
24
- * CFrame.Angles(math.pi/3, 2*math.pi/3, 0),
25
- QFrame.new()), 70)
20
+ local a = CameraFrame.new(
21
+ QFrame.fromCFrameClosestTo(
22
+ CFrame.new(cameraCFrame.Position + cameraCFrame.lookVector * 25 - 20 * cameraCFrame.RightVector),
23
+ QFrame.new()
24
+ ),
25
+ 70
26
+ )
27
+ local b = CameraFrame.new(
28
+ QFrame.fromCFrameClosestTo(
29
+ CFrame.new(cameraCFrame.Position + cameraCFrame.lookVector * 30 + 20 * cameraCFrame.RightVector)
30
+ * CFrame.Angles(math.pi / 3, 2 * math.pi / 3, 0),
31
+ QFrame.new()
32
+ ),
33
+ 70
34
+ )
26
35
 
27
36
  local setup = CameraStoryUtils.getInterpolationFactory(maid, viewportFrame, -0.1, 1.1, 4, function(cameraFrame)
28
37
  return cameraFrame.CFrame
@@ -37,12 +46,12 @@ return function(target)
37
46
  end, Color3.new(0.5, 1, 0.5))
38
47
 
39
48
  setup(function(t)
40
- return CameraFrame.new((1 - t)*a.QFrame + t*b.QFrame, a.FieldOfView + (b.FieldOfView - a.FieldOfView)*t)
49
+ return CameraFrame.new((1 - t) * a.QFrame + t * b.QFrame, a.FieldOfView + (b.FieldOfView - a.FieldOfView) * t)
41
50
  end, Color3.new(0.25, 0.25, 0.25), "Linear", Vector2.new(80, 0))
42
51
 
43
52
  setup(function(t)
44
- local result = ((b.QFrame*(a.QFrame^-1))^t)*a.QFrame
45
- return CameraFrame.new(result, a.FieldOfView + (b.FieldOfView - a.FieldOfView)*t)
53
+ local result = ((b.QFrame * (a.QFrame ^ -1)) ^ t) * a.QFrame
54
+ return CameraFrame.new(result, a.FieldOfView + (b.FieldOfView - a.FieldOfView) * t)
46
55
  end, Color3.new(0.5, 0.5, 1), "Quaternion", Vector2.new(0, -80))
47
56
 
48
57
  setup(function(t)
@@ -61,4 +70,4 @@ return function(target)
61
70
  return function()
62
71
  maid:DoCleaning()
63
72
  end
64
- end
73
+ end
@@ -1,3 +1,4 @@
1
+ --!strict
1
2
  --[=[
2
3
  Makes transitions between states easier. Uses the `CameraStackService` to tween in and
3
4
  out a new camera state Call `:Show()` and `:Hide()` to do so, and make sure to
@@ -8,16 +9,27 @@
8
9
 
9
10
  local require = require(script.Parent.loader).load(script)
10
11
 
12
+ local BaseObject = require("BaseObject")
13
+ local CameraEffectUtils = require("CameraEffectUtils")
14
+ local CameraStack = require("CameraStack")
11
15
  local CameraStackService = require("CameraStackService")
12
16
  local FadeBetweenCamera3 = require("FadeBetweenCamera3")
13
17
  local ServiceBag = require("ServiceBag")
14
- local BaseObject = require("BaseObject")
15
- local CameraStack = require("CameraStack")
16
18
 
17
19
  local CameraStateTweener = setmetatable({}, BaseObject)
18
20
  CameraStateTweener.ClassName = "CameraStateTweener"
19
21
  CameraStateTweener.__index = CameraStateTweener
20
22
 
23
+ export type CameraStateTweener = typeof(setmetatable(
24
+ {} :: {
25
+ _cameraStack: CameraStack.CameraStack,
26
+ _cameraEffect: any,
27
+ _cameraBelow: any,
28
+ _fadeBetween: FadeBetweenCamera3.FadeBetweenCamera3,
29
+ },
30
+ {} :: typeof({ __index = CameraStateTweener })
31
+ )) & BaseObject.BaseObject
32
+
21
33
  --[=[
22
34
  Constructs a new camera state tweener
23
35
 
@@ -26,15 +38,19 @@ CameraStateTweener.__index = CameraStateTweener
26
38
  @param speed number? -- Speed that the camera tweener tweens at. Defaults to 20
27
39
  @return CameraStateTweener
28
40
  ]=]
29
- function CameraStateTweener.new(serviceBagOrCameraStack, cameraEffect, speed: number?)
30
- local self = setmetatable(BaseObject.new(), CameraStateTweener)
41
+ function CameraStateTweener.new(
42
+ serviceBagOrCameraStack: ServiceBag.ServiceBag | CameraStack.CameraStack,
43
+ cameraEffect,
44
+ speed: number?
45
+ ): CameraStateTweener
46
+ local self: CameraStateTweener = setmetatable(BaseObject.new() :: any, CameraStateTweener)
31
47
 
32
48
  assert(cameraEffect, "No cameraEffect")
33
49
 
34
50
  if ServiceBag.isServiceBag(serviceBagOrCameraStack) then
35
- self._cameraStack = serviceBagOrCameraStack:GetService(CameraStackService):GetCameraStack()
51
+ self._cameraStack = (serviceBagOrCameraStack :: any):GetService(CameraStackService):GetCameraStack()
36
52
  elseif CameraStack.isCameraStack(serviceBagOrCameraStack) then
37
- self._cameraStack = serviceBagOrCameraStack
53
+ self._cameraStack = serviceBagOrCameraStack :: any
38
54
  else
39
55
  error("Bad serviceBagOrCameraStack")
40
56
  end
@@ -65,7 +81,7 @@ end
65
81
  Returns percent visible, from 0 to 1.
66
82
  @return number
67
83
  ]=]
68
- function CameraStateTweener:GetPercentVisible(): number
84
+ function CameraStateTweener.GetPercentVisible(self: CameraStateTweener): number
69
85
  return self._fadeBetween.Value
70
86
  end
71
87
 
@@ -73,7 +89,7 @@ end
73
89
  Shows the camera to fade in.
74
90
  @param doNotAnimate? boolean -- Optional, defaults to animating
75
91
  ]=]
76
- function CameraStateTweener:Show(doNotAnimate: boolean?)
92
+ function CameraStateTweener.Show(self: CameraStateTweener, doNotAnimate: boolean?)
77
93
  self:SetTarget(1, doNotAnimate)
78
94
  end
79
95
 
@@ -81,7 +97,7 @@ end
81
97
  Hides the camera to fade in.
82
98
  @param doNotAnimate? boolean -- Optional, defaults to animating
83
99
  ]=]
84
- function CameraStateTweener:Hide(doNotAnimate: boolean?)
100
+ function CameraStateTweener.Hide(self: CameraStateTweener, doNotAnimate: boolean?)
85
101
  self:SetTarget(0, doNotAnimate)
86
102
  end
87
103
 
@@ -89,7 +105,7 @@ end
89
105
  Returns true if we're done hiding
90
106
  @return boolean
91
107
  ]=]
92
- function CameraStateTweener:IsFinishedHiding(): boolean
108
+ function CameraStateTweener.IsFinishedHiding(self: CameraStateTweener): boolean
93
109
  return self._fadeBetween.HasReachedTarget and self._fadeBetween.Target == 0
94
110
  end
95
111
 
@@ -97,7 +113,7 @@ end
97
113
  Returns true if we're done showing
98
114
  @return boolean
99
115
  ]=]
100
- function CameraStateTweener:IsFinishedShowing(): boolean
116
+ function CameraStateTweener.IsFinishedShowing(self: CameraStateTweener): boolean
101
117
  return self._fadeBetween.HasReachedTarget and self._fadeBetween.Target == 1
102
118
  end
103
119
 
@@ -107,7 +123,7 @@ end
107
123
  @param doNotAnimate boolean? -- Optional, defaults to animating
108
124
  @param callback function
109
125
  ]=]
110
- function CameraStateTweener:Finish(doNotAnimate: boolean?, callback: () -> ())
126
+ function CameraStateTweener.Finish(self: CameraStateTweener, doNotAnimate: boolean?, callback: () -> ())
111
127
  assert(type(callback) == "function", "Bad callback")
112
128
 
113
129
  self:Hide(doNotAnimate)
@@ -128,7 +144,7 @@ end
128
144
  Gets the current effect we're tweening
129
145
  @return CameraEffect
130
146
  ]=]
131
- function CameraStateTweener:GetCameraEffect()
147
+ function CameraStateTweener.GetCameraEffect(self: CameraStateTweener): CameraEffectUtils.CameraEffect
132
148
  return self._cameraEffect
133
149
  end
134
150
 
@@ -136,7 +152,7 @@ end
136
152
  Gets the camera below this camera on the camera stack
137
153
  @return CameraEffect
138
154
  ]=]
139
- function CameraStateTweener:GetCameraBelow()
155
+ function CameraStateTweener.GetCameraBelow(self: CameraStateTweener): CameraEffectUtils.CameraEffect
140
156
  return self._cameraBelow
141
157
  end
142
158
 
@@ -146,7 +162,11 @@ end
146
162
  @param doNotAnimate boolean? -- Optional, defaults to animating
147
163
  @return CameraStateTweener -- self
148
164
  ]=]
149
- function CameraStateTweener:SetTarget(target: number, doNotAnimate: boolean?)
165
+ function CameraStateTweener.SetTarget(
166
+ self: CameraStateTweener,
167
+ target: number,
168
+ doNotAnimate: boolean?
169
+ ): CameraStateTweener
150
170
  self._fadeBetween.Target = target or error("No target")
151
171
  if doNotAnimate then
152
172
  self._fadeBetween.Value = self._fadeBetween.Target
@@ -160,7 +180,7 @@ end
160
180
  @param speed number
161
181
  @return CameraStateTweener -- self
162
182
  ]=]
163
- function CameraStateTweener:SetSpeed(speed: number)
183
+ function CameraStateTweener.SetSpeed(self: CameraStateTweener, speed: number): CameraStateTweener
164
184
  assert(type(speed) == "number", "Bad speed")
165
185
 
166
186
  self._fadeBetween.Speed = speed
@@ -173,7 +193,7 @@ end
173
193
  @param isVisible boolean
174
194
  @param doNotAnimate boolean? -- Optional, defaults to animating
175
195
  ]=]
176
- function CameraStateTweener:SetVisible(isVisible: number, doNotAnimate: boolean?)
196
+ function CameraStateTweener.SetVisible(self: CameraStateTweener, isVisible: number, doNotAnimate: boolean?): ()
177
197
  if isVisible then
178
198
  self:Show(doNotAnimate)
179
199
  else
@@ -185,8 +205,8 @@ end
185
205
  Retrieves the fading camera being used to interpolate.
186
206
  @return CameraEffect
187
207
  ]=]
188
- function CameraStateTweener:GetFader()
208
+ function CameraStateTweener.GetFader(self: CameraStateTweener): CameraEffectUtils.CameraEffect
189
209
  return self._fadeBetween
190
210
  end
191
211
 
192
- return CameraStateTweener
212
+ return CameraStateTweener
@@ -81,4 +81,4 @@ function FieldOfViewUtils.lerpInHeightSpace(fov0: number, fov1: number, percent:
81
81
  return FieldOfViewUtils.heightToFov(FieldOfViewUtils.safeExp(newLogHeight, linearAt))
82
82
  end
83
83
 
84
- return FieldOfViewUtils
84
+ return FieldOfViewUtils
@@ -8,4 +8,4 @@ local serviceBag = require("ServiceBag").new()
8
8
  serviceBag:GetService(require("CameraStackService"))
9
9
 
10
10
  serviceBag:Init()
11
- serviceBag:Start()
11
+ serviceBag:Start()
@@ -5,4 +5,4 @@
5
5
  local ServerScriptService = game:GetService("ServerScriptService")
6
6
 
7
7
  local loader = ServerScriptService:FindFirstChild("LoaderUtils", true).Parent
8
- require(loader).bootstrapGame(ServerScriptService.camera)
8
+ require(loader).bootstrapGame(ServerScriptService.camera)