Skip to content

Commit 284efed

Browse files
authored
Merge pull request #645 from Quenty/users/quenty/tracking
Users/quenty/tracking
2 parents 8d2e792 + 45a29f2 commit 284efed

36 files changed

+1488
-152
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"luau-lsp.ignoreGlobs": ["**/node_modules/**"],
99

1010
// This prevents Rojo from memory leaking
11-
"luau-lsp.sourcemap.generatorCommand": "rojo sourcemap",
11+
"luau-lsp.sourcemap.generatorCommand": "npm run build:sourcemap",
1212
"luau-lsp.sourcemap.useVSCodeWatcher": true,
1313

1414
"[lua]": {

Nevermore.code-workspace

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,30 @@
88
"files.exclude": {
99
"*.sublime-workspace": true,
1010
"**/node_modules/**": true,
11-
"roblox.toml": true
11+
"roblox.toml": true,
1212
},
1313
"luau-lsp.sourcemap.rojoProjectFile": "default.project.json",
1414
"luau-lsp.ignoreGlobs": ["**/node_modules/**"],
1515

1616
// This prevents Rojo from memory leaking
17-
"luau-lsp.sourcemap.generatorCommand": "rojo sourcemap",
17+
"luau-lsp.sourcemap.generatorCommand": "npm run build:sourcemap",
1818
"luau-lsp.sourcemap.useVSCodeWatcher": true,
1919

2020
"[lua]": {
2121
"editor.defaultFormatter": "JohnnyMorganz.stylua",
2222
"editor.formatOnSave": true,
23-
"editor.formatOnSaveMode": "file"
23+
"editor.formatOnSaveMode": "file",
2424
},
2525
"[luau]": {
2626
"editor.defaultFormatter": "JohnnyMorganz.stylua",
2727
"editor.formatOnSave": true,
28-
"editor.formatOnSaveMode": "file"
28+
"editor.formatOnSaveMode": "file",
2929
},
3030
"[typescript]": {
3131
"editor.defaultFormatter": "esbenp.prettier-vscode",
3232
"editor.formatOnSave": true,
33-
"editor.formatOnSaveMode": "file"
34-
}
33+
"editor.formatOnSaveMode": "file",
34+
},
3535
},
3636
"extensions": {
3737
"recommendations": [

pnpm-lock.yaml

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/binarysearch/src/Shared/BinarySearchUtils.lua

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ end
4949
--[=[
5050
Same as searching a span, but uses a list of nodes
5151
52+
```
53+
if t lands within the domain of two spans of time
54+
t = 5
55+
[3 5][5 7]
56+
^ picks this one
57+
```
58+
5259
@param list { TNode }
5360
@param index string
5461
@param t number

src/binder/src/Shared/Binder.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ end
249249
@param instance Instance
250250
@return Observable<T?>
251251
]=]
252-
function Binder:Observe(instance: Instance)
252+
function Binder.Observe<T>(self: Binder<T>, instance: Instance): Observable.Observable<T?>
253253
assert(typeof(instance) == "Instance", "Bad instance")
254254

255255
return Observable.new(function(sub)

src/hide/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,12 @@
3030
],
3131
"dependencies": {
3232
"@quenty/binder": "workspace:*",
33+
"@quenty/brio": "workspace:*",
34+
"@quenty/instanceutils": "workspace:*",
3335
"@quenty/loader": "workspace:*",
34-
"@quenty/servicebag": "workspace:*"
36+
"@quenty/rx": "workspace:*",
37+
"@quenty/servicebag": "workspace:*",
38+
"@quenty/transparencyservice": "workspace:*"
3539
},
3640
"publishConfig": {
3741
"access": "public"
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
--!strict
2+
--[=[
3+
@class DynamicHideClient
4+
]=]
5+
6+
local require = require(script.Parent.loader).load(script)
7+
8+
local Binder = require("Binder")
9+
local DynamicHideBase = require("DynamicHideBase")
10+
local HideUtils = require("HideUtils")
11+
local Maid = require("Maid")
12+
local ServiceBag = require("ServiceBag")
13+
local TransparencyService = require("TransparencyService")
14+
15+
local DynamicHideClient = setmetatable({}, DynamicHideBase)
16+
DynamicHideClient.ClassName = "DynamicHideClient"
17+
DynamicHideClient.__index = DynamicHideClient
18+
19+
export type DynamicHideClient =
20+
typeof(setmetatable(
21+
{} :: {
22+
_obj: Instance,
23+
_serviceBag: ServiceBag.ServiceBag,
24+
_transparencyService: any,
25+
_hideBinder: any,
26+
},
27+
{} :: typeof({ __index = DynamicHideClient })
28+
))
29+
& DynamicHideBase.DynamicHideBase
30+
31+
function DynamicHideClient.new(instance: Instance, serviceBag: ServiceBag.ServiceBag): DynamicHideClient
32+
local self: DynamicHideClient = setmetatable(DynamicHideBase.new(instance) :: any, DynamicHideClient)
33+
34+
self._serviceBag = assert(serviceBag, "No serviceBag")
35+
self._transparencyService = self._serviceBag:GetService(TransparencyService)
36+
self._hideBinder = self._serviceBag:GetService(require("HideClient"))
37+
38+
self._maid:GiveTask(self:_observeHideChildrenBrio(self._hideBinder):Subscribe(function(childBrio)
39+
if childBrio:IsDead() then
40+
return
41+
end
42+
43+
local childMaid, childInstance = childBrio:ToMaidAndValue()
44+
self:_hideChild(childMaid, childInstance)
45+
end))
46+
47+
return self
48+
end
49+
50+
function DynamicHideClient._hideChild(self: DynamicHideClient, maid: Maid.Maid, instance: Instance)
51+
if HideUtils.hasLocalTransparencyModifier(instance) then
52+
self._transparencyService:SetLocalTransparencyModifier(self, instance, 1)
53+
54+
maid:GiveTask(function()
55+
self._transparencyService:ResetLocalTransparencyModifier(self, instance)
56+
end)
57+
elseif HideUtils.hasTransparency(instance) then
58+
self._transparencyService:SetTransparency(self, instance, 1)
59+
60+
maid:GiveTask(function()
61+
self._transparencyService:ResetTransparency(self, instance)
62+
end)
63+
else
64+
error("[DynamicHideClient] - Bad instance for hiding")
65+
end
66+
end
67+
68+
return Binder.new("DynamicHide", DynamicHideClient :: any) :: Binder.Binder<DynamicHideClient>

src/hide/src/Client/HideServiceClient.lua

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@ function HideServiceClient:Init(serviceBag: ServiceBag.ServiceBag)
1414
assert(not self._serviceBag, "Already initialized")
1515
self._serviceBag = assert(serviceBag, "No serviceBag")
1616

17-
-- Internal
17+
-- External
18+
self._serviceBag:GetService(require("TransparencyService"))
19+
20+
-- Binders
1821
self._serviceBag:GetService(require("HideClient"))
22+
self._serviceBag:GetService(require("DynamicHideClient"))
1923
end
2024

2125
return HideServiceClient
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
--!strict
2+
--[=[
3+
@class DynamicHide
4+
]=]
5+
6+
local require = require(script.Parent.loader).load(script)
7+
8+
local Binder = require("Binder")
9+
local DynamicHideBase = require("DynamicHideBase")
10+
local HideUtils = require("HideUtils")
11+
local Maid = require("Maid")
12+
local ServiceBag = require("ServiceBag")
13+
14+
local DynamicHide = setmetatable({}, DynamicHideBase)
15+
DynamicHide.ClassName = "DynamicHide"
16+
DynamicHide.__index = DynamicHide
17+
18+
export type DynamicHide =
19+
typeof(setmetatable(
20+
{} :: {
21+
_obj: Instance,
22+
_serviceBag: ServiceBag.ServiceBag,
23+
_hideBinder: any,
24+
},
25+
{} :: typeof({ __index = DynamicHide })
26+
))
27+
& DynamicHideBase.DynamicHideBase
28+
29+
function DynamicHide.new(instance: Instance, serviceBag: ServiceBag.ServiceBag): DynamicHide
30+
local self: DynamicHide = setmetatable(DynamicHideBase.new(instance) :: any, DynamicHide)
31+
32+
self._serviceBag = assert(serviceBag, "No serviceBag")
33+
self._hideBinder = self._serviceBag:GetService(require("Hide"))
34+
35+
self._maid:GiveTask(self:_observeHideChildrenBrio(self._hideBinder):Subscribe(function(childBrio)
36+
if childBrio:IsDead() then
37+
return
38+
end
39+
40+
local childMaid, childInstance = childBrio:ToMaidAndValue()
41+
self:_hideChild(childMaid, childInstance)
42+
end))
43+
44+
return self
45+
end
46+
47+
function DynamicHide._hideChild(_self: DynamicHide, maid: Maid.Maid, instance: Instance)
48+
if HideUtils.hasLocalTransparencyModifier(instance) then
49+
(instance :: any).LocalTransparencyModifier = 1
50+
51+
maid:GiveTask(function()
52+
(instance :: any).LocalTransparencyModifier = 0
53+
end)
54+
-- selene: allow(empty_if)
55+
elseif HideUtils.hasTransparency(instance) then
56+
-- Note we don't want to replicate this necessarily
57+
else
58+
error("[DynamicHide] - Bad instance for hiding")
59+
end
60+
end
61+
62+
return Binder.new("DynamicHide", DynamicHide :: any) :: Binder.Binder<DynamicHide>

src/hide/src/Server/Hide.lua

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
--!strict
2+
local HideUtils = require(script.Parent.Parent.Shared.HideUtils)
23
--[=[
34
Primarily used for authoring, this hides the tagged instance from render. Great for
45
making bounding boxes in studio that are then hidden upon runtime.
@@ -25,28 +26,27 @@ Hide.__index = Hide
2526
function Hide.new(adornee: Instance)
2627
local self = setmetatable({}, Hide)
2728

28-
self._obj = assert(adornee, "No adornee")
29+
self._instance = assert(adornee, "No adornee")
2930

30-
if self._obj:IsA("BasePart") then
31-
self:_setupPart(self._obj)
32-
elseif self._obj:IsA("Model") then
33-
for _, item in self._obj:GetChildren() do
34-
if item:IsA("BasePart") then
35-
self:_setupPart(item)
36-
end
37-
end
38-
elseif self._obj:IsA("GuiObject") then
39-
self._obj.BackgroundTransparency = 1
40-
else
41-
error("[Hide] - Bad object type for hide")
31+
if not self._instance:HasTag("DynamicHide") then
32+
self:_hideInstance(self._instance)
4233
end
4334

4435
return self
4536
end
4637

47-
function Hide:_setupPart(part: BasePart)
48-
part.Locked = true
49-
part.Transparency = 1
38+
function Hide:_hideInstance(instance: Instance)
39+
if instance:IsA("BasePart") then
40+
instance.Locked = true
41+
instance.Transparency = 1
42+
elseif instance:IsA("Model") or instance:IsA("Folder") then
43+
-- Be limited in what we recurse down
44+
for _, child in self._instance:GetChildren() do
45+
self:_hideInstance(child)
46+
end
47+
elseif HideUtils.hasTransparency(instance) then
48+
(instance :: any).Transparency = 1
49+
end
5050
end
5151

5252
--[=[

0 commit comments

Comments
 (0)