@axpecter/lync 2.3.2 → 3.0.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.
- package/LICENSE +21 -0
- package/README.md +302 -299
- package/Types.luau +215 -0
- package/api/Define.luau +154 -0
- package/api/Lifecycle.luau +119 -0
- package/api/Packet.luau +108 -0
- package/api/Query.luau +149 -0
- package/api/Set.luau +189 -0
- package/channel/Blocks.luau +124 -0
- package/channel/Group.luau +118 -0
- package/channel/Link.luau +135 -0
- package/channel/Outbox.luau +261 -0
- package/channel/Recipients.luau +129 -0
- package/channel/Transport.luau +138 -0
- package/codec/Base.luau +236 -0
- package/codec/Composites.luau +128 -0
- package/codec/Datatypes.luau +162 -0
- package/codec/Legality.luau +61 -0
- package/codec/Scalars.luau +72 -0
- package/codec/Text.luau +89 -0
- package/codec/init.luau +39 -0
- package/index.d.ts +285 -0
- package/init.luau +91 -0
- package/kernel/Bits.luau +16 -0
- package/kernel/Catalog.luau +121 -0
- package/kernel/Heap.luau +80 -0
- package/kernel/Listeners.luau +95 -0
- package/kernel/Log.luau +197 -0
- package/kernel/Tally.luau +128 -0
- package/kernel/Threads.luau +44 -0
- package/kernel/Wide.luau +267 -0
- package/package.json +15 -32
- package/runtime/Boundary.luau +180 -0
- package/runtime/Dispatch.luau +91 -0
- package/runtime/Handles.luau +114 -0
- package/runtime/Handshake.luau +90 -0
- package/runtime/Pending.luau +196 -0
- package/runtime/Router.luau +379 -0
- package/runtime/Session.luau +731 -0
- package/shape/Compile.luau +340 -0
- package/shape/Folds.luau +332 -0
- package/shape/Frames.luau +170 -0
- package/shape/Grid.luau +169 -0
- package/shape/Ir.luau +540 -0
- package/shape/Joins.luau +125 -0
- package/shape/Legality.luau +273 -0
- package/shape/Lower.luau +419 -0
- package/shape/Order.luau +64 -0
- package/shape/Regions.luau +113 -0
- package/shape/Rotation.luau +472 -0
- package/shape/Serial.luau +258 -0
- package/shape/Words.luau +89 -0
- package/shape/emit/Block.luau +453 -0
- package/shape/emit/Column.luau +338 -0
- package/shape/emit/Leaf.luau +462 -0
- package/shape/emit/Word.luau +234 -0
- package/shape/emit/init.luau +222 -0
- package/shape/init.luau +78 -0
- package/state/Apply.luau +330 -0
- package/state/Audience.luau +126 -0
- package/state/Catchup.luau +218 -0
- package/state/Coalesce.luau +43 -0
- package/state/Fieldset.luau +177 -0
- package/state/Newest.luau +339 -0
- package/state/Plan.luau +441 -0
- package/state/Sections.luau +468 -0
- package/state/Store.luau +188 -0
- package/state/Sync.luau +762 -0
- package/wire/Bytes.luau +118 -0
- package/wire/Clock.luau +37 -0
- package/wire/Protocol.luau +110 -0
- package/wire/Sequence.luau +40 -0
- package/wire/Varint.luau +124 -0
- package/src/Types.luau +0 -180
- package/src/api/Group.luau +0 -156
- package/src/api/Packet.luau +0 -319
- package/src/api/Query.luau +0 -338
- package/src/api/Scope.luau +0 -90
- package/src/api/Signal.luau +0 -188
- package/src/codec/Base.luau +0 -136
- package/src/codec/composite/Array.luau +0 -456
- package/src/codec/composite/Map.luau +0 -469
- package/src/codec/composite/Optional.luau +0 -54
- package/src/codec/composite/Shared.luau +0 -291
- package/src/codec/composite/Struct.luau +0 -494
- package/src/codec/composite/Tagged.luau +0 -103
- package/src/codec/composite/Tuple.luau +0 -143
- package/src/codec/datatype/Buffer.luau +0 -66
- package/src/codec/datatype/CFrame.luau +0 -109
- package/src/codec/datatype/Color.luau +0 -32
- package/src/codec/datatype/Instance.luau +0 -52
- package/src/codec/datatype/IntVector.luau +0 -39
- package/src/codec/datatype/NumberRange.luau +0 -39
- package/src/codec/datatype/Ray.luau +0 -36
- package/src/codec/datatype/Rect.luau +0 -31
- package/src/codec/datatype/Region.luau +0 -62
- package/src/codec/datatype/Sequence.luau +0 -184
- package/src/codec/datatype/String.luau +0 -94
- package/src/codec/datatype/UDim.luau +0 -46
- package/src/codec/datatype/Vector.luau +0 -130
- package/src/codec/meta/Auto.luau +0 -318
- package/src/codec/meta/Bitfield.luau +0 -147
- package/src/codec/meta/Custom.luau +0 -33
- package/src/codec/meta/DeltaScalar.luau +0 -390
- package/src/codec/meta/Enum.luau +0 -50
- package/src/codec/meta/Float.luau +0 -38
- package/src/codec/meta/Nothing.luau +0 -13
- package/src/codec/meta/Unknown.luau +0 -41
- package/src/codec/primitive/Bool.luau +0 -26
- package/src/codec/primitive/Float16.luau +0 -99
- package/src/codec/primitive/Int.luau +0 -59
- package/src/codec/primitive/Number.luau +0 -24
- package/src/codec/primitive/Signed.luau +0 -32
- package/src/codec/primitive/Varint.luau +0 -165
- package/src/codec/primitive/Zint.luau +0 -99
- package/src/index.d.ts +0 -423
- package/src/init.luau +0 -362
- package/src/internal/Baseline.luau +0 -57
- package/src/internal/Channel.luau +0 -390
- package/src/internal/Middleware.luau +0 -100
- package/src/internal/Pool.luau +0 -65
- package/src/internal/Registry.luau +0 -119
- package/src/internal/Transport.luau +0 -28
- package/src/transport/Bridge.luau +0 -110
- package/src/transport/Client.luau +0 -97
- package/src/transport/Gate.luau +0 -488
- package/src/transport/Reader.luau +0 -331
- package/src/transport/Server.luau +0 -211
- package/src/util/Array.luau +0 -18
- package/src/util/Buffer.luau +0 -90
- package/src/util/Constants.luau +0 -30
- package/src/util/Log.luau +0 -68
- package/src/util/Player.luau +0 -14
- package/src/util/Quantize.luau +0 -84
- package/src/util/Quat.luau +0 -124
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!native
|
|
3
|
-
-- NumberSequence (12B/keypoint) and ColorSequence (7B/keypoint) codecs.
|
|
4
|
-
|
|
5
|
-
local Base = require(script.Parent.Parent.Base)
|
|
6
|
-
local Constants = require(script.Parent.Parent.Parent.util.Constants)
|
|
7
|
-
local Log = require(script.Parent.Parent.Parent.util.Log)
|
|
8
|
-
local Types = require(script.Parent.Parent.Parent.Types)
|
|
9
|
-
local Varint = require(script.Parent.Parent.primitive.Varint)
|
|
10
|
-
|
|
11
|
-
-- Constants --------------------------------------------------------------
|
|
12
|
-
|
|
13
|
-
local NUMSEQ_KP_BYTES = 12
|
|
14
|
-
local COLSEQ_KP_BYTES = 7
|
|
15
|
-
local MAX_KEYPOINTS = 20
|
|
16
|
-
|
|
17
|
-
-- Private ----------------------------------------------------------------
|
|
18
|
-
|
|
19
|
-
local U8_MAX = Constants.U8_MAX
|
|
20
|
-
local alloc = Base.alloc
|
|
21
|
-
local writef32 = buffer.writef32
|
|
22
|
-
local readf32 = buffer.readf32
|
|
23
|
-
local writeu8 = buffer.writeu8
|
|
24
|
-
local readu8 = buffer.readu8
|
|
25
|
-
local round = math.round
|
|
26
|
-
local clamp = math.clamp
|
|
27
|
-
local varintRead = Varint.read
|
|
28
|
-
local varintWrite = Varint.write
|
|
29
|
-
|
|
30
|
-
--[[
|
|
31
|
-
Common write prelude: count cap check, varint count, payload alloc.
|
|
32
|
-
Returns (cursor, b) for the per-keypoint writer; (nil, nil) when count
|
|
33
|
-
is 0 so callers short-circuit.
|
|
34
|
-
]]
|
|
35
|
-
local function beginSeqWrite(
|
|
36
|
-
ch: Types.ChannelState,
|
|
37
|
-
label: string,
|
|
38
|
-
count: number,
|
|
39
|
-
kpBytes: number
|
|
40
|
-
): (number?, buffer?)
|
|
41
|
-
if count > MAX_KEYPOINTS then
|
|
42
|
-
Log.error(`{label}.write: keypoint count {count} exceeds Roblox limit {MAX_KEYPOINTS}`)
|
|
43
|
-
end
|
|
44
|
-
varintWrite(ch, count)
|
|
45
|
-
if count == 0 then
|
|
46
|
-
return nil, nil
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
local bytes = count * kpBytes
|
|
50
|
-
local cursor = ch.cursor
|
|
51
|
-
if cursor + bytes > ch.size then
|
|
52
|
-
alloc(ch, bytes)
|
|
53
|
-
end
|
|
54
|
-
ch.cursor = cursor + bytes
|
|
55
|
-
return cursor, ch.buff
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
--[[
|
|
59
|
-
Common read prelude: varint count, cap check, bounds check. Returns
|
|
60
|
-
(count, dataStart, lenBytes) for the per-keypoint reader; (0, _, lenBytes)
|
|
61
|
-
when payload is empty.
|
|
62
|
-
]]
|
|
63
|
-
local function beginSeqRead(
|
|
64
|
-
src: buffer,
|
|
65
|
-
pos: number,
|
|
66
|
-
label: string,
|
|
67
|
-
kpBytes: number
|
|
68
|
-
): (number, number, number)
|
|
69
|
-
local count, lenBytes = varintRead(src, pos)
|
|
70
|
-
if count == 0 then
|
|
71
|
-
return 0, pos + lenBytes, lenBytes
|
|
72
|
-
end
|
|
73
|
-
if count > MAX_KEYPOINTS then
|
|
74
|
-
Log.error(`{label}.read: keypoint count {count} exceeds Roblox limit {MAX_KEYPOINTS}`)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
local bytes = count * kpBytes
|
|
78
|
-
local dataStart = pos + lenBytes
|
|
79
|
-
if dataStart + bytes > buffer.len(src) then
|
|
80
|
-
Log.error(`{label}.read: payload {bytes}B exceeds remaining buffer`)
|
|
81
|
-
end
|
|
82
|
-
return count, dataStart, lenBytes
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
local function writeNumberSequence(ch: Types.ChannelState, value: NumberSequence): ()
|
|
86
|
-
local keypoints = value.Keypoints
|
|
87
|
-
local count = #keypoints
|
|
88
|
-
local cursor, b = beginSeqWrite(ch, "NumberSequence", count, NUMSEQ_KP_BYTES)
|
|
89
|
-
if not cursor then
|
|
90
|
-
return
|
|
91
|
-
end
|
|
92
|
-
local off = cursor :: number
|
|
93
|
-
local buf = b :: buffer
|
|
94
|
-
for i = 1, count do
|
|
95
|
-
local kp = keypoints[i]
|
|
96
|
-
writef32(buf, off, kp.Time)
|
|
97
|
-
writef32(buf, off + 4, kp.Value)
|
|
98
|
-
writef32(buf, off + 8, kp.Envelope)
|
|
99
|
-
off += NUMSEQ_KP_BYTES
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
local function readNumberSequence(
|
|
104
|
-
src: buffer,
|
|
105
|
-
pos: number,
|
|
106
|
-
_refs: { Instance }?
|
|
107
|
-
): (NumberSequence, number)
|
|
108
|
-
local count, dataStart, lenBytes = beginSeqRead(src, pos, "NumberSequence", NUMSEQ_KP_BYTES)
|
|
109
|
-
if count == 0 then
|
|
110
|
-
return NumberSequence.new(0), lenBytes
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
local keypoints = table.create(count)
|
|
114
|
-
local off = dataStart
|
|
115
|
-
for i = 1, count do
|
|
116
|
-
keypoints[i] = NumberSequenceKeypoint.new(
|
|
117
|
-
readf32(src, off),
|
|
118
|
-
readf32(src, off + 4),
|
|
119
|
-
readf32(src, off + 8)
|
|
120
|
-
)
|
|
121
|
-
off += NUMSEQ_KP_BYTES
|
|
122
|
-
end
|
|
123
|
-
return NumberSequence.new(keypoints), lenBytes + count * NUMSEQ_KP_BYTES
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
local function writeColorSequence(ch: Types.ChannelState, value: ColorSequence): ()
|
|
127
|
-
local keypoints = value.Keypoints
|
|
128
|
-
local count = #keypoints
|
|
129
|
-
local cursor, b = beginSeqWrite(ch, "ColorSequence", count, COLSEQ_KP_BYTES)
|
|
130
|
-
if not cursor then
|
|
131
|
-
return
|
|
132
|
-
end
|
|
133
|
-
local off = cursor :: number
|
|
134
|
-
local buf = b :: buffer
|
|
135
|
-
for i = 1, count do
|
|
136
|
-
local kp = keypoints[i]
|
|
137
|
-
local c = kp.Value
|
|
138
|
-
writef32(buf, off, kp.Time)
|
|
139
|
-
writeu8(buf, off + 4, round(clamp(c.R, 0, 1) * U8_MAX))
|
|
140
|
-
writeu8(buf, off + 5, round(clamp(c.G, 0, 1) * U8_MAX))
|
|
141
|
-
writeu8(buf, off + 6, round(clamp(c.B, 0, 1) * U8_MAX))
|
|
142
|
-
off += COLSEQ_KP_BYTES
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
local function readColorSequence(
|
|
147
|
-
src: buffer,
|
|
148
|
-
pos: number,
|
|
149
|
-
_refs: { Instance }?
|
|
150
|
-
): (ColorSequence, number)
|
|
151
|
-
local count, dataStart, lenBytes = beginSeqRead(src, pos, "ColorSequence", COLSEQ_KP_BYTES)
|
|
152
|
-
if count == 0 then
|
|
153
|
-
return ColorSequence.new(Color3.new()), lenBytes
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
local keypoints = table.create(count)
|
|
157
|
-
local off = dataStart
|
|
158
|
-
for i = 1, count do
|
|
159
|
-
keypoints[i] = ColorSequenceKeypoint.new(
|
|
160
|
-
readf32(src, off),
|
|
161
|
-
Color3.fromRGB(readu8(src, off + 4), readu8(src, off + 5), readu8(src, off + 6))
|
|
162
|
-
)
|
|
163
|
-
off += COLSEQ_KP_BYTES
|
|
164
|
-
end
|
|
165
|
-
return ColorSequence.new(keypoints), lenBytes + count * COLSEQ_KP_BYTES
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
-- Public -----------------------------------------------------------------
|
|
169
|
-
|
|
170
|
-
local Sequence = {}
|
|
171
|
-
|
|
172
|
-
Sequence.numberSequence = table.freeze({
|
|
173
|
-
_typeCheck = "NumberSequence",
|
|
174
|
-
write = writeNumberSequence,
|
|
175
|
-
read = readNumberSequence,
|
|
176
|
-
})
|
|
177
|
-
|
|
178
|
-
Sequence.colorSequence = table.freeze({
|
|
179
|
-
_typeCheck = "ColorSequence",
|
|
180
|
-
write = writeColorSequence,
|
|
181
|
-
read = readColorSequence,
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
return table.freeze(Sequence)
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!native
|
|
3
|
-
-- UTF-8 string codec. __call yields a length-bounded variant.
|
|
4
|
-
|
|
5
|
-
local Base = require(script.Parent.Parent.Base)
|
|
6
|
-
local Log = require(script.Parent.Parent.Parent.util.Log)
|
|
7
|
-
local Types = require(script.Parent.Parent.Parent.Types)
|
|
8
|
-
local Varint = require(script.Parent.Parent.primitive.Varint)
|
|
9
|
-
|
|
10
|
-
-- Private ----------------------------------------------------------------
|
|
11
|
-
|
|
12
|
-
local alloc = Base.alloc
|
|
13
|
-
local INLINE_MAX = Varint.INLINE_MAX
|
|
14
|
-
|
|
15
|
-
local function writeString(ch: Types.ChannelState, value: string): ()
|
|
16
|
-
local len = #value
|
|
17
|
-
local cursor = ch.cursor
|
|
18
|
-
|
|
19
|
-
-- Single-byte length fast path skips the full varint encode.
|
|
20
|
-
if len <= INLINE_MAX then
|
|
21
|
-
if cursor + 1 + len > ch.size then
|
|
22
|
-
alloc(ch, 1 + len)
|
|
23
|
-
end
|
|
24
|
-
local b = ch.buff
|
|
25
|
-
buffer.writeu8(b, cursor, len)
|
|
26
|
-
if len > 0 then
|
|
27
|
-
buffer.writestring(b, cursor + 1, value)
|
|
28
|
-
end
|
|
29
|
-
ch.cursor = cursor + 1 + len
|
|
30
|
-
return
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
Varint.write(ch, len)
|
|
34
|
-
cursor = ch.cursor
|
|
35
|
-
if cursor + len > ch.size then
|
|
36
|
-
alloc(ch, len)
|
|
37
|
-
end
|
|
38
|
-
buffer.writestring(ch.buff, cursor, value)
|
|
39
|
-
ch.cursor = cursor + len
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
local readLengthPrefix = Varint.readLengthPrefix
|
|
43
|
-
|
|
44
|
-
local function readString(src: buffer, pos: number, _refs: { Instance }?): (string, number)
|
|
45
|
-
local len, lenBytes = readLengthPrefix(src, pos)
|
|
46
|
-
if len == 0 then
|
|
47
|
-
return "", lenBytes
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
local dataStart = pos + lenBytes
|
|
51
|
-
if dataStart + len > buffer.len(src) then
|
|
52
|
-
Log.error(`length {len}B exceeds remaining buffer`)
|
|
53
|
-
end
|
|
54
|
-
return buffer.readstring(src, dataStart, len), lenBytes + len
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
-- _maxStringLength lets Gate.validate reject oversized values send-side.
|
|
58
|
-
local function boundedFactory(_self, maxLength: number): Types.InternalCodec<string>
|
|
59
|
-
Log.assert(maxLength > 0, "maxLength must be positive")
|
|
60
|
-
|
|
61
|
-
return table.freeze({
|
|
62
|
-
_typeCheck = "string",
|
|
63
|
-
_maxStringLength = maxLength,
|
|
64
|
-
write = function(ch: Types.ChannelState, value: string): ()
|
|
65
|
-
if #value > maxLength then
|
|
66
|
-
Log.error(`length {#value} exceeds max {maxLength}`)
|
|
67
|
-
end
|
|
68
|
-
writeString(ch, value)
|
|
69
|
-
end,
|
|
70
|
-
read = function(src: buffer, pos: number, _refs: { Instance }?): (string, number)
|
|
71
|
-
local len, lenBytes = readLengthPrefix(src, pos)
|
|
72
|
-
if len > maxLength then
|
|
73
|
-
Log.error(`length {len} exceeds max {maxLength}`)
|
|
74
|
-
end
|
|
75
|
-
if len == 0 then
|
|
76
|
-
return "", lenBytes
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
local dataStart = pos + lenBytes
|
|
80
|
-
if dataStart + len > buffer.len(src) then
|
|
81
|
-
Log.error(`length {len}B exceeds remaining buffer`)
|
|
82
|
-
end
|
|
83
|
-
return buffer.readstring(src, dataStart, len), lenBytes + len
|
|
84
|
-
end,
|
|
85
|
-
})
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
-- Public -----------------------------------------------------------------
|
|
89
|
-
|
|
90
|
-
return table.freeze(setmetatable({
|
|
91
|
-
_typeCheck = "string",
|
|
92
|
-
write = writeString,
|
|
93
|
-
read = readString,
|
|
94
|
-
}, table.freeze({ __call = boundedFactory })))
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!native
|
|
3
|
-
-- UDim (8B) and UDim2 (16B) codecs. Scale = f32, Offset = i32.
|
|
4
|
-
|
|
5
|
-
local Base = require(script.Parent.Parent.Base)
|
|
6
|
-
local Signed = require(script.Parent.Parent.primitive.Signed)
|
|
7
|
-
|
|
8
|
-
-- Private ----------------------------------------------------------------
|
|
9
|
-
|
|
10
|
-
local writef32 = buffer.writef32
|
|
11
|
-
local readf32 = buffer.readf32
|
|
12
|
-
local writeI32 = Signed.writeI32
|
|
13
|
-
local readi32 = buffer.readi32
|
|
14
|
-
|
|
15
|
-
local function writeUDim(b: buffer, off: number, value: UDim): ()
|
|
16
|
-
writef32(b, off, value.Scale)
|
|
17
|
-
writeI32(b, off + 4, value.Offset)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
local function readUDim(b: buffer, off: number): UDim
|
|
21
|
-
return UDim.new(readf32(b, off), readi32(b, off + 4))
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
local function writeUDim2(b: buffer, off: number, value: UDim2): ()
|
|
25
|
-
local x, y = value.X, value.Y
|
|
26
|
-
writef32(b, off, x.Scale)
|
|
27
|
-
writeI32(b, off + 4, x.Offset)
|
|
28
|
-
writef32(b, off + 8, y.Scale)
|
|
29
|
-
writeI32(b, off + 12, y.Offset)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
local function readUDim2(b: buffer, off: number): UDim2
|
|
33
|
-
return UDim2.new(
|
|
34
|
-
UDim.new(readf32(b, off), readi32(b, off + 4)),
|
|
35
|
-
UDim.new(readf32(b, off + 8), readi32(b, off + 12))
|
|
36
|
-
)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
-- Public -----------------------------------------------------------------
|
|
40
|
-
|
|
41
|
-
local UDimCodec = {}
|
|
42
|
-
|
|
43
|
-
UDimCodec.udim = Base.define(8, writeUDim, readUDim, { _typeCheck = "UDim" })
|
|
44
|
-
UDimCodec.udim2 = Base.define(16, writeUDim2, readUDim2, { _typeCheck = "UDim2" })
|
|
45
|
-
|
|
46
|
-
return table.freeze(UDimCodec)
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!native
|
|
3
|
-
-- Vector2 / Vector3 codecs. __call yields a quantized variant.
|
|
4
|
-
|
|
5
|
-
local Base = require(script.Parent.Parent.Base)
|
|
6
|
-
local Quantize = require(script.Parent.Parent.Parent.util.Quantize)
|
|
7
|
-
local Types = require(script.Parent.Parent.Parent.Types)
|
|
8
|
-
|
|
9
|
-
-- Private ----------------------------------------------------------------
|
|
10
|
-
|
|
11
|
-
local alloc = Base.alloc
|
|
12
|
-
local writef32 = buffer.writef32
|
|
13
|
-
local readf32 = buffer.readf32
|
|
14
|
-
local clamp = math.clamp
|
|
15
|
-
local round = math.round
|
|
16
|
-
|
|
17
|
-
local function writeVec2(b: buffer, off: number, value: Vector2): ()
|
|
18
|
-
writef32(b, off, value.X)
|
|
19
|
-
writef32(b, off + 4, value.Y)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
local function readVec2(b: buffer, off: number): Vector2
|
|
23
|
-
return Vector2.new(readf32(b, off), readf32(b, off + 4))
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
local function writeVec3(b: buffer, off: number, value: Vector3): ()
|
|
27
|
-
writef32(b, off, value.X)
|
|
28
|
-
writef32(b, off + 4, value.Y)
|
|
29
|
-
writef32(b, off + 8, value.Z)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
local function readVec3(b: buffer, off: number): Vector3
|
|
33
|
-
return Vector3.new(readf32(b, off), readf32(b, off + 4), readf32(b, off + 8))
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
local function quantizeVec2(
|
|
37
|
-
_self,
|
|
38
|
-
rangeMin: number,
|
|
39
|
-
rangeMax: number,
|
|
40
|
-
precision: number
|
|
41
|
-
): Types.InternalCodec<Vector2>
|
|
42
|
-
-- Degenerate range: emit nothing, decode to the constant.
|
|
43
|
-
if rangeMax - rangeMin == 0 then
|
|
44
|
-
return Base.constant(Vector2.new(rangeMin, rangeMin))
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
local compBytes, wfn, rfn, scale, invScale, delta =
|
|
48
|
-
Quantize.setup("Lync.vec2", rangeMin, rangeMax, precision)
|
|
49
|
-
local totalSize = compBytes * 2
|
|
50
|
-
|
|
51
|
-
return Base.define(totalSize, function(b: buffer, off: number, value: Vector2): ()
|
|
52
|
-
wfn(b, off, round(clamp(value.X - rangeMin, 0, delta) * scale))
|
|
53
|
-
wfn(b, off + compBytes, round(clamp(value.Y - rangeMin, 0, delta) * scale))
|
|
54
|
-
end, function(b: buffer, off: number): Vector2
|
|
55
|
-
return Vector2.new(
|
|
56
|
-
rfn(b, off) * invScale + rangeMin,
|
|
57
|
-
rfn(b, off + compBytes) * invScale + rangeMin
|
|
58
|
-
)
|
|
59
|
-
end, { _typeCheck = "Vector2", _min = rangeMin, _max = rangeMax })
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
local function quantizeVec3(
|
|
63
|
-
_self,
|
|
64
|
-
rangeMin: number,
|
|
65
|
-
rangeMax: number,
|
|
66
|
-
precision: number
|
|
67
|
-
): Types.InternalCodec<Vector3>
|
|
68
|
-
if rangeMax - rangeMin == 0 then
|
|
69
|
-
return Base.constant(Vector3.new(rangeMin, rangeMin, rangeMin))
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
local compBytes, wfn, rfn, scale, invScale, delta =
|
|
73
|
-
Quantize.setup("Lync.vec3", rangeMin, rangeMax, precision)
|
|
74
|
-
local totalSize = compBytes * 3
|
|
75
|
-
local off2 = compBytes * 2
|
|
76
|
-
|
|
77
|
-
return Base.define(totalSize, function(b: buffer, off: number, value: Vector3): ()
|
|
78
|
-
wfn(b, off, round(clamp(value.X - rangeMin, 0, delta) * scale))
|
|
79
|
-
wfn(b, off + compBytes, round(clamp(value.Y - rangeMin, 0, delta) * scale))
|
|
80
|
-
wfn(b, off + off2, round(clamp(value.Z - rangeMin, 0, delta) * scale))
|
|
81
|
-
end, function(b: buffer, off: number): Vector3
|
|
82
|
-
return Vector3.new(
|
|
83
|
-
rfn(b, off) * invScale + rangeMin,
|
|
84
|
-
rfn(b, off + compBytes) * invScale + rangeMin,
|
|
85
|
-
rfn(b, off + off2) * invScale + rangeMin
|
|
86
|
-
)
|
|
87
|
-
end, { _typeCheck = "Vector3", _min = rangeMin, _max = rangeMax })
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
-- Public -----------------------------------------------------------------
|
|
91
|
-
|
|
92
|
-
local VectorCodec = {}
|
|
93
|
-
|
|
94
|
-
VectorCodec.vec2 = table.freeze(setmetatable({
|
|
95
|
-
_size = 8,
|
|
96
|
-
_directWrite = writeVec2,
|
|
97
|
-
_directRead = readVec2,
|
|
98
|
-
_typeCheck = "Vector2",
|
|
99
|
-
write = function(ch: Types.ChannelState, value: Vector2): ()
|
|
100
|
-
local cursor = ch.cursor
|
|
101
|
-
if cursor + 8 > ch.size then
|
|
102
|
-
alloc(ch, 8)
|
|
103
|
-
end
|
|
104
|
-
writeVec2(ch.buff, cursor, value)
|
|
105
|
-
ch.cursor = cursor + 8
|
|
106
|
-
end,
|
|
107
|
-
read = function(src: buffer, pos: number, _refs: { Instance }?): (Vector2, number)
|
|
108
|
-
return readVec2(src, pos), 8
|
|
109
|
-
end,
|
|
110
|
-
}, table.freeze({ __call = quantizeVec2 })))
|
|
111
|
-
|
|
112
|
-
VectorCodec.vec3 = table.freeze(setmetatable({
|
|
113
|
-
_size = 12,
|
|
114
|
-
_directWrite = writeVec3,
|
|
115
|
-
_directRead = readVec3,
|
|
116
|
-
_typeCheck = "Vector3",
|
|
117
|
-
write = function(ch: Types.ChannelState, value: Vector3): ()
|
|
118
|
-
local cursor = ch.cursor
|
|
119
|
-
if cursor + 12 > ch.size then
|
|
120
|
-
alloc(ch, 12)
|
|
121
|
-
end
|
|
122
|
-
writeVec3(ch.buff, cursor, value)
|
|
123
|
-
ch.cursor = cursor + 12
|
|
124
|
-
end,
|
|
125
|
-
read = function(src: buffer, pos: number, _refs: { Instance }?): (Vector3, number)
|
|
126
|
-
return readVec3(src, pos), 12
|
|
127
|
-
end,
|
|
128
|
-
}, table.freeze({ __call = quantizeVec3 })))
|
|
129
|
-
|
|
130
|
-
return table.freeze(VectorCodec)
|