Skip to content

Commit e0e4300

Browse files
committed
typing: Update typing
1 parent 250f473 commit e0e4300

File tree

4 files changed

+65
-29
lines changed

4 files changed

+65
-29
lines changed

src/adorneeboundingbox/src/Shared/AdorneeBoundingBox.lua

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
--!strict
22
--[=[
3+
This utility class can observe the bounding box (size + position) of any Roblox instance effectively.
4+
It handles anchored + unanchored instances, and tries to do it in a performance friendly way.
5+
36
@class AdorneeBoundingBox
47
]=]
58

@@ -31,6 +34,9 @@ export type AdorneeBoundingBox =
3134
))
3235
& BaseObject.BaseObject
3336

37+
--[=[
38+
Constructs a new AdorneeBoundingBox
39+
--]=]
3440
function AdorneeBoundingBox.new(initialAdornee: Instance?): AdorneeBoundingBox
3541
local self = setmetatable(BaseObject.new() :: any, AdorneeBoundingBox)
3642

@@ -54,6 +60,9 @@ function AdorneeBoundingBox.new(initialAdornee: Instance?): AdorneeBoundingBox
5460
return self
5561
end
5662

63+
--[=[
64+
Sets the Roblox instance that we're going to observe the bounding box of
65+
]=]
5766
function AdorneeBoundingBox.SetAdornee(self: AdorneeBoundingBox, adornee: Instance?): () -> ()
5867
assert(typeof(adornee) == "Instance" or adornee == nil, "Bad adornee")
5968

src/adorneeboundingbox/src/Shared/AdorneeModelBoundingBox.lua

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
--!nonstrict
1+
--!strict
22
--[=[
33
@class AdorneeModelBoundingBox
44
]=]
@@ -19,13 +19,26 @@ local AdorneeModelBoundingBox = setmetatable({}, BaseObject)
1919
AdorneeModelBoundingBox.ClassName = "AdorneeModelBoundingBox"
2020
AdorneeModelBoundingBox.__index = AdorneeModelBoundingBox
2121

22-
function AdorneeModelBoundingBox.new(model: Model)
23-
local self = setmetatable(BaseObject.new(model), AdorneeModelBoundingBox)
22+
export type AdorneeModelBoundingBox =
23+
typeof(setmetatable(
24+
{} :: {
25+
_obj: Model,
26+
_bbCFrame: ValueObject.ValueObject<CFrame?>,
27+
_bbSize: ValueObject.ValueObject<Vector3?>,
28+
_isDirty: ValueObject.ValueObject<boolean>,
29+
_unanchoredPartsSet: ObservableSet.ObservableSet<BasePart>,
30+
},
31+
{} :: typeof({ __index = AdorneeModelBoundingBox })
32+
))
33+
& BaseObject.BaseObject
34+
35+
function AdorneeModelBoundingBox.new(model: Model): AdorneeModelBoundingBox
36+
local self: AdorneeModelBoundingBox = setmetatable(BaseObject.new(model) :: any, AdorneeModelBoundingBox)
2437

2538
self._bbCFrame = self._maid:Add(ValueObject.new(nil))
26-
self._bbSize = self._maid:Add(ValueObject.new(Vector3.zero, "Vector3"))
39+
self._bbSize = self._maid:Add(ValueObject.new(nil))
2740
self._isDirty = self._maid:Add(ValueObject.new(false, "boolean"))
28-
self._unanchoredPartsSet = self._maid:Add(ObservableSet.new(false))
41+
self._unanchoredPartsSet = self._maid:Add(ObservableSet.new())
2942

3043
self._maid:GiveTask(RxInstanceUtils.observeDescendantsBrio(self._obj, function(part)
3144
return part:IsA("BasePart")
@@ -36,7 +49,7 @@ function AdorneeModelBoundingBox.new(model: Model)
3649

3750
local maid, part = brio:ToMaidAndValue()
3851

39-
self:_handlePart(maid, part)
52+
self:_handlePart(maid, part :: BasePart)
4053
end))
4154

4255
self._maid:GiveTask(self:_observeBasisChanged():Subscribe(function()
@@ -48,8 +61,8 @@ function AdorneeModelBoundingBox.new(model: Model)
4861
:Pipe({
4962
Rx.where(function(value)
5063
return value
51-
end),
52-
Rx.throttleDefer(),
64+
end) :: any,
65+
Rx.throttleDefer() :: any,
5366
})
5467
:Subscribe(function()
5568
debug.profilebegin("modelboundingbox")
@@ -66,8 +79,8 @@ function AdorneeModelBoundingBox.new(model: Model)
6679
:Pipe({
6780
Rx.map(function(value)
6881
return value > 0
69-
end),
70-
Rx.distinct(),
82+
end) :: any,
83+
Rx.distinct() :: any,
7184
})
7285
:Subscribe(function(hasUnanchoredParts)
7386
if hasUnanchoredParts then
@@ -80,7 +93,7 @@ function AdorneeModelBoundingBox.new(model: Model)
8093
return self
8194
end
8295

83-
function AdorneeModelBoundingBox:_setupUnanchoredLoop()
96+
function AdorneeModelBoundingBox._setupUnanchoredLoop(self: AdorneeModelBoundingBox): Maid.Maid
8497
local maid = Maid.new()
8598

8699
-- Paranoid
@@ -91,7 +104,7 @@ function AdorneeModelBoundingBox:_setupUnanchoredLoop()
91104
return maid
92105
end
93106

94-
function AdorneeModelBoundingBox:_handlePart(topMaid, part: BasePart)
107+
function AdorneeModelBoundingBox._handlePart(self: AdorneeModelBoundingBox, topMaid, part: BasePart)
95108
topMaid:GiveTask(RxInstanceUtils.observePropertyBrio(part, "Anchored", function(isAnchored)
96109
return not isAnchored
97110
end):Subscribe(function(brio)
@@ -112,23 +125,23 @@ function AdorneeModelBoundingBox:_handlePart(topMaid, part: BasePart)
112125
self._isDirty.Value = true
113126
end
114127

115-
function AdorneeModelBoundingBox:_observeBasisChanged()
128+
function AdorneeModelBoundingBox._observeBasisChanged(self: AdorneeModelBoundingBox): Observable.Observable<()>
116129
return RxInstanceUtils.observeProperty(self._obj, "PrimaryPart"):Pipe({
117130
Rx.switchMap(function(primaryPart)
118131
if primaryPart then
119132
return RxInstanceUtils.observeProperty(primaryPart, "PivotOffset")
120133
else
121134
return RxInstanceUtils.observeProperty(self._obj, "WorldPivot")
122135
end
123-
end),
124-
})
136+
end) :: any,
137+
}) :: any
125138
end
126139

127-
function AdorneeModelBoundingBox:ObserveCFrame(): Observable.Observable<CFrame>
140+
function AdorneeModelBoundingBox.ObserveCFrame(self: AdorneeModelBoundingBox): Observable.Observable<CFrame?>
128141
return self._bbCFrame:Observe()
129142
end
130143

131-
function AdorneeModelBoundingBox:ObserveSize(): Observable.Observable<Vector3>
144+
function AdorneeModelBoundingBox.ObserveSize(self: AdorneeModelBoundingBox): Observable.Observable<Vector3?>
132145
return self._bbSize:Observe()
133146
end
134147

src/adorneeboundingbox/src/Shared/AdorneePartBoundingBox.lua

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
--!nonstrict
1+
--!strict
22
--[=[
33
@class AdorneePartBoundingBox
44
]=]
@@ -8,21 +8,32 @@ local require = require(script.Parent.loader).load(script)
88
local RunService = game:GetService("RunService")
99

1010
local BaseObject = require("BaseObject")
11+
local Maid = require("Maid")
1112
local Observable = require("Observable")
1213
local RxInstanceUtils = require("RxInstanceUtils")
1314
local ValueObject = require("ValueObject")
14-
1515
local AdorneePartBoundingBox = setmetatable({}, BaseObject)
1616
AdorneePartBoundingBox.ClassName = "AdorneePartBoundingBox"
1717
AdorneePartBoundingBox.__index = AdorneePartBoundingBox
1818

19-
function AdorneePartBoundingBox.new(part: BasePart)
19+
export type AdorneePartBoundingBox =
20+
typeof(setmetatable(
21+
{} :: {
22+
_obj: BasePart,
23+
_bbCFrame: ValueObject.ValueObject<CFrame?>,
24+
_bbSize: ValueObject.ValueObject<Vector3?>,
25+
},
26+
{} :: typeof({ __index = AdorneePartBoundingBox })
27+
))
28+
& BaseObject.BaseObject
29+
30+
function AdorneePartBoundingBox.new(part: BasePart): AdorneePartBoundingBox
2031
assert(typeof(part) == "Instance" and part:IsA("BasePart"), "Bad part")
2132

22-
local self = setmetatable(BaseObject.new(part), AdorneePartBoundingBox)
33+
local self: AdorneePartBoundingBox = setmetatable(BaseObject.new(part) :: any, AdorneePartBoundingBox)
2334

24-
self._bbCFrame = self._maid:Add(ValueObject.new(nil))
25-
self._bbSize = self._maid:Add(ValueObject.new(Vector3.zero, "Vector3"))
35+
self._bbCFrame = self._maid:Add(ValueObject.new(self._obj.CFrame, "CFrame") :: any)
36+
self._bbSize = self._maid:Add(ValueObject.new(self._obj.Size, "Vector3") :: any)
2637

2738
self._maid:GiveTask(RxInstanceUtils.observePropertyBrio(self._obj, "Anchored", function(anchored)
2839
return not anchored
@@ -35,9 +46,6 @@ function AdorneePartBoundingBox.new(part: BasePart)
3546
self:_setupUnanchoredLoop(maid)
3647
end))
3748

38-
self._bbSize.Value = self._obj.Size
39-
self._bbCFrame.Value = self._obj.CFrame
40-
4149
self._maid:GiveTask(self._obj:GetPropertyChangedSignal("Size"):Connect(function()
4250
self._bbSize.Value = self._obj.Size
4351
end))
@@ -48,7 +56,7 @@ function AdorneePartBoundingBox.new(part: BasePart)
4856
return self
4957
end
5058

51-
function AdorneePartBoundingBox:_setupUnanchoredLoop(maid)
59+
function AdorneePartBoundingBox._setupUnanchoredLoop(self: AdorneePartBoundingBox, maid: Maid.Maid): ()
5260
-- Paranoid
5361
maid:GiveTask(RunService.Heartbeat:Connect(function()
5462
debug.profilebegin("adorneeboundingbox")
@@ -57,11 +65,11 @@ function AdorneePartBoundingBox:_setupUnanchoredLoop(maid)
5765
end))
5866
end
5967

60-
function AdorneePartBoundingBox:ObserveCFrame(): Observable.Observable<CFrame>
68+
function AdorneePartBoundingBox.ObserveCFrame(self: AdorneePartBoundingBox): Observable.Observable<CFrame?>
6169
return self._bbCFrame:Observe()
6270
end
6371

64-
function AdorneePartBoundingBox:ObserveSize(): Observable.Observable<Vector3>
72+
function AdorneePartBoundingBox.ObserveSize(self: AdorneePartBoundingBox): Observable.Observable<Vector3?>
6573
return self._bbSize:Observe()
6674
end
6775

src/adorneeboundingbox/src/Shared/RxPartBoundingBoxUtils.lua

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ local RxInstanceUtils = require("RxInstanceUtils")
1010

1111
local RxPartBoundingBoxUtils = {}
1212

13+
--[=[
14+
Observes the CFrame of a part
15+
16+
@param part BasePart
17+
@return Observable<CFrame>
18+
]=]
1319
function RxPartBoundingBoxUtils.observePartCFrame(part: BasePart): Observable.Observable<CFrame>
1420
assert(typeof(part) == "Instance" and part:IsA("BasePart"), "Bad part")
1521

0 commit comments

Comments
 (0)