@quenty/numbersequenceutils 8.9.0 → 8.9.1
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/CHANGELOG.md +8 -0
- package/package.json +3 -3
- package/src/Shared/NumberSequenceUtils.lua +40 -28
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [8.9.1](https://github.com/Quenty/NevermoreEngine/compare/@quenty/numbersequenceutils@8.9.0...@quenty/numbersequenceutils@8.9.1) (2025-03-21)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @quenty/numbersequenceutils
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
# [8.9.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/numbersequenceutils@8.8.0...@quenty/numbersequenceutils@8.9.0) (2025-02-18)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @quenty/numbersequenceutils
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/numbersequenceutils",
|
|
3
|
-
"version": "8.9.
|
|
3
|
+
"version": "8.9.1",
|
|
4
4
|
"description": "Utility functions involving NumberSequences on Roblox",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Roblox",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@quenty/loader": "^10.8.0",
|
|
32
|
-
"@quenty/math": "^2.7.
|
|
32
|
+
"@quenty/math": "^2.7.1"
|
|
33
33
|
},
|
|
34
|
-
"gitHead": "
|
|
34
|
+
"gitHead": "6b7c3e15e60cdb185986207b574e2b5591261e7a"
|
|
35
35
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--!strict
|
|
1
2
|
--[=[
|
|
2
3
|
Utility functions involving NumberSequences on Roblox
|
|
3
4
|
@class NumberSequenceUtils
|
|
@@ -17,7 +18,7 @@ local EPSILON = 1e-3
|
|
|
17
18
|
@param numberSequence NumberSequence
|
|
18
19
|
@return (number) -> number
|
|
19
20
|
]=]
|
|
20
|
-
function NumberSequenceUtils.getValueGenerator(numberSequence: NumberSequence): number
|
|
21
|
+
function NumberSequenceUtils.getValueGenerator(numberSequence: NumberSequence): (number) -> number
|
|
21
22
|
assert(typeof(numberSequence) == "NumberSequence", "Bad numberSequence")
|
|
22
23
|
|
|
23
24
|
-- TODO: Binary search
|
|
@@ -34,7 +35,7 @@ function NumberSequenceUtils.getValueGenerator(numberSequence: NumberSequence):
|
|
|
34
35
|
return function(t)
|
|
35
36
|
assert(type(t) == "number", "Bad t")
|
|
36
37
|
|
|
37
|
-
return keypoint.Value + (math.random()-0.5)*keypoint.Envelope
|
|
38
|
+
return keypoint.Value + (math.random() - 0.5) * keypoint.Envelope
|
|
38
39
|
end
|
|
39
40
|
end
|
|
40
41
|
elseif #keypoints == 2 then
|
|
@@ -48,8 +49,8 @@ function NumberSequenceUtils.getValueGenerator(numberSequence: NumberSequence):
|
|
|
48
49
|
return first.Value
|
|
49
50
|
end
|
|
50
51
|
else
|
|
51
|
-
local firstValue = first.Value + (math.random() - 0.5)*first.Envelope
|
|
52
|
-
local secondValue = second.Value + (math.random() - 0.5)*second.Envelope
|
|
52
|
+
local firstValue = first.Value + (math.random() - 0.5) * first.Envelope
|
|
53
|
+
local secondValue = second.Value + (math.random() - 0.5) * second.Envelope
|
|
53
54
|
return function(t)
|
|
54
55
|
assert(type(t) == "number", "Bad t")
|
|
55
56
|
local scale = math.clamp(Math.map(t, first.Time, second.Time, 0, 1), 0, 1)
|
|
@@ -59,9 +60,9 @@ function NumberSequenceUtils.getValueGenerator(numberSequence: NumberSequence):
|
|
|
59
60
|
else
|
|
60
61
|
-- pregenerate
|
|
61
62
|
local values = {}
|
|
62
|
-
for i=1, #keypoints do
|
|
63
|
+
for i = 1, #keypoints do
|
|
63
64
|
local point = keypoints[i]
|
|
64
|
-
values[i] = point.Value + (math.random()-0.5)*point.Envelope
|
|
65
|
+
values[i] = point.Value + (math.random() - 0.5) * point.Envelope
|
|
65
66
|
end
|
|
66
67
|
|
|
67
68
|
return function(t)
|
|
@@ -72,15 +73,15 @@ function NumberSequenceUtils.getValueGenerator(numberSequence: NumberSequence):
|
|
|
72
73
|
end
|
|
73
74
|
|
|
74
75
|
-- TODO: Binary search
|
|
75
|
-
for i=2, #keypoints do
|
|
76
|
+
for i = 2, #keypoints do
|
|
76
77
|
local point = keypoints[i]
|
|
77
78
|
if point.Time < t then
|
|
78
79
|
continue
|
|
79
80
|
end
|
|
80
81
|
|
|
81
|
-
local prevPoint = keypoints[i-1]
|
|
82
|
+
local prevPoint = keypoints[i - 1]
|
|
82
83
|
local scale = math.clamp(Math.map(t, prevPoint.Time, point.Time, 0, 1), 0, 1)
|
|
83
|
-
return Math.lerp(values[i-1], values[i], scale)
|
|
84
|
+
return Math.lerp(values[i - 1], values[i], scale)
|
|
84
85
|
end
|
|
85
86
|
|
|
86
87
|
return values[#keypoints]
|
|
@@ -94,7 +95,7 @@ end
|
|
|
94
95
|
@param callback function
|
|
95
96
|
@return NumberSequence
|
|
96
97
|
]=]
|
|
97
|
-
function NumberSequenceUtils.forEachValue(sequence, callback)
|
|
98
|
+
function NumberSequenceUtils.forEachValue(sequence: NumberSequence, callback: (number) -> number): NumberSequence
|
|
98
99
|
assert(type(callback) == "function", "Bad callback")
|
|
99
100
|
|
|
100
101
|
local waypoints = {}
|
|
@@ -113,12 +114,15 @@ end
|
|
|
113
114
|
@param scale number
|
|
114
115
|
@return NumberSequence
|
|
115
116
|
]=]
|
|
116
|
-
function NumberSequenceUtils.scale(sequence, scale)
|
|
117
|
+
function NumberSequenceUtils.scale(sequence: NumberSequence, scale: number): NumberSequence
|
|
117
118
|
local waypoints = {}
|
|
118
119
|
|
|
119
120
|
local keypoints = sequence.Keypoints
|
|
120
121
|
for _, keypoint in pairs(keypoints) do
|
|
121
|
-
table.insert(
|
|
122
|
+
table.insert(
|
|
123
|
+
waypoints,
|
|
124
|
+
NumberSequenceKeypoint.new(keypoint.Time, keypoint.Value * scale, keypoint.Envelope * scale)
|
|
125
|
+
)
|
|
122
126
|
end
|
|
123
127
|
|
|
124
128
|
return NumberSequence.new(waypoints)
|
|
@@ -131,15 +135,19 @@ end
|
|
|
131
135
|
@param scale number
|
|
132
136
|
@return NumberSequence
|
|
133
137
|
]=]
|
|
134
|
-
function NumberSequenceUtils.scaleTransparency(sequence, scale)
|
|
138
|
+
function NumberSequenceUtils.scaleTransparency(sequence: NumberSequence, scale: number): NumberSequence
|
|
135
139
|
local waypoints = {}
|
|
136
140
|
|
|
137
141
|
local keypoints = sequence.Keypoints
|
|
138
142
|
for _, keypoint in pairs(keypoints) do
|
|
139
|
-
table.insert(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
+
table.insert(
|
|
144
|
+
waypoints,
|
|
145
|
+
NumberSequenceKeypoint.new(
|
|
146
|
+
keypoint.Time,
|
|
147
|
+
Math.map(keypoint.Value, 0, 1, scale, 1),
|
|
148
|
+
keypoint.Envelope * scale
|
|
149
|
+
)
|
|
150
|
+
)
|
|
143
151
|
end
|
|
144
152
|
|
|
145
153
|
return NumberSequence.new(waypoints)
|
|
@@ -156,8 +164,12 @@ end
|
|
|
156
164
|
@return NumberSequence
|
|
157
165
|
]=]
|
|
158
166
|
function NumberSequenceUtils.stripe(
|
|
159
|
-
stripes
|
|
160
|
-
|
|
167
|
+
stripes: number,
|
|
168
|
+
backgroundTransparency: number,
|
|
169
|
+
stripeTransparency: number,
|
|
170
|
+
percentStripeThickness: number,
|
|
171
|
+
percentOffset: number
|
|
172
|
+
): NumberSequence
|
|
161
173
|
percentOffset = percentOffset or 0
|
|
162
174
|
percentStripeThickness = math.clamp(percentStripeThickness or 0.5, 0, 1)
|
|
163
175
|
|
|
@@ -167,16 +179,16 @@ function NumberSequenceUtils.stripe(
|
|
|
167
179
|
return NumberSequence.new(stripeTransparency)
|
|
168
180
|
end
|
|
169
181
|
|
|
170
|
-
local timeWidth = 1/stripes
|
|
171
|
-
local timeOffset = percentOffset*timeWidth
|
|
172
|
-
timeOffset = timeOffset + percentStripeThickness*timeWidth*0.5 -- We add thickness to center
|
|
182
|
+
local timeWidth = 1 / stripes
|
|
183
|
+
local timeOffset = percentOffset * timeWidth
|
|
184
|
+
timeOffset = timeOffset + percentStripeThickness * timeWidth * 0.5 -- We add thickness to center
|
|
173
185
|
timeOffset = timeOffset % timeWidth
|
|
174
186
|
|
|
175
187
|
-- Generate initialial points
|
|
176
188
|
local waypoints = {}
|
|
177
|
-
for i=0, stripes-1 do
|
|
178
|
-
local timestampStart = (i/stripes + timeOffset) % 1
|
|
179
|
-
local timeStampMiddle = (timestampStart + timeWidth*(1 - percentStripeThickness)) % 1
|
|
189
|
+
for i = 0, stripes - 1 do
|
|
190
|
+
local timestampStart = (i / stripes + timeOffset) % 1
|
|
191
|
+
local timeStampMiddle = (timestampStart + timeWidth * (1 - percentStripeThickness)) % 1
|
|
180
192
|
|
|
181
193
|
table.insert(waypoints, NumberSequenceKeypoint.new(timestampStart, backgroundTransparency))
|
|
182
194
|
table.insert(waypoints, NumberSequenceKeypoint.new(timeStampMiddle, stripeTransparency))
|
|
@@ -191,8 +203,8 @@ function NumberSequenceUtils.stripe(
|
|
|
191
203
|
-- Handle first!
|
|
192
204
|
table.insert(fullWaypoints, waypoints[1])
|
|
193
205
|
|
|
194
|
-
for i=2, #waypoints do
|
|
195
|
-
local previous = waypoints[i-1]
|
|
206
|
+
for i = 2, #waypoints do
|
|
207
|
+
local previous = waypoints[i - 1]
|
|
196
208
|
local current = waypoints[i]
|
|
197
209
|
|
|
198
210
|
if current.Time - EPSILON > previous.Time then
|
|
@@ -234,4 +246,4 @@ function NumberSequenceUtils.stripe(
|
|
|
234
246
|
return NumberSequence.new(fullWaypoints)
|
|
235
247
|
end
|
|
236
248
|
|
|
237
|
-
return NumberSequenceUtils
|
|
249
|
+
return NumberSequenceUtils
|