Skip to content

Commit 7daa2a0

Browse files
authored
Add implicit coercion to arithmetic operations (#2125)
* Fix Number type for operators * Fix * Update add/sub/mul/div to handle vecs of other types * Add examples * Update patch and delete examples * Format
1 parent e22913d commit 7daa2a0

2 files changed

Lines changed: 110 additions & 32 deletions

File tree

examples-testing/changes.patch

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15068,7 +15068,7 @@ index 71fbd6622..c2fc51fe1 100644
1506815068
gui.add(gravity, 'value', -0.0098, 0, 0.0001).name('gravity');
1506915069
gui.add(bounce, 'value', 0.1, 1, 0.01).name('bounce');
1507015070
diff --git a/examples-testing/examples/webgpu_compute_particles_rain.ts b/examples-testing/examples/webgpu_compute_particles_rain.ts
15071-
index eaa4e957e..43cca9ddd 100644
15071+
index eaa4e957e..7482f06dc 100644
1507215072
--- a/examples-testing/examples/webgpu_compute_particles_rain.ts
1507315073
+++ b/examples-testing/examples/webgpu_compute_particles_rain.ts
1507415074
@@ -25,14 +25,17 @@ import * as BufferGeometryUtils from 'three/addons/utils/BufferGeometryUtils.js'
@@ -15106,6 +15106,17 @@ index eaa4e957e..43cca9ddd 100644
1510615106

1510715107
const position = positionBuffer.element(instanceIndex);
1510815108
const velocity = velocityBuffer.element(instanceIndex);
15109+
@@ -135,8 +138,8 @@ async function init() {
15110+
15111+
// next drops will not fall in the same place
15112+
15113+
- position.x = hash(instanceIndex.add(time)).mul(100).add(-50);
15114+
- position.z = hash(instanceIndex.add(time.add(randUint())))
15115+
+ position.x = hash(instanceIndex.toFloat().add(time)).mul(100).add(-50);
15116+
+ position.z = hash(instanceIndex.toFloat().add(time.add(randUint())))
15117+
.mul(100)
15118+
.add(-50);
15119+
});
1510915120
@@ -274,7 +277,7 @@ async function init() {
1511015121

1511115122
// gui
@@ -21825,7 +21836,7 @@ index f1e423444..34df22c9f 100644
2182521836
gradient.colors = ['#090033', '#5f1f93', '#e02e96', '#ffbd80', '#fff0db'];
2182621837

2182721838
diff --git a/examples-testing/examples/webgpu_tsl_vfx_linkedparticles.ts b/examples-testing/examples/webgpu_tsl_vfx_linkedparticles.ts
21828-
index e220c164b..f9b0a23f4 100644
21839+
index e220c164b..0fe2693b1 100644
2182921840
--- a/examples-testing/examples/webgpu_tsl_vfx_linkedparticles.ts
2183021841
+++ b/examples-testing/examples/webgpu_tsl_vfx_linkedparticles.ts
2183121842
@@ -37,10 +37,16 @@ import { Inspector } from 'three/addons/inspector/Inspector.js';
@@ -21857,6 +21868,15 @@ index e220c164b..f9b0a23f4 100644
2185721868
return hue(
2185821869
color(0x0000ff),
2185921870
colorOffset.add(mx_fractal_noise_float(i.toFloat().mul(0.1), 2, 2.0, 0.5, colorVariance)),
21871+
@@ -284,7 +290,7 @@ async function init() {
21872+
const l1 = max(0.0, min(closestLife1, life)).pow(0.8); // pow is here to apply a slight curve to the opacity
21873+
const l2 = max(0.0, min(closestLife2, life)).pow(0.8);
21874+
21875+
- Loop(4, ({ i }) => {
21876+
+ Loop({ start: 0, end: 4, type: 'uint' }, ({ i }) => {
21877+
linksColors.element(firstLinkIndex.add(i)).xyz.assign(linkColor);
21878+
linksColors.element(firstLinkIndex.add(i)).w.assign(l1);
21879+
linksColors.element(secondLinkIndex.add(i)).xyz.assign(linkColor);
2186021880
@@ -366,7 +372,7 @@ async function init() {
2186121881

2186221882
// GUI

types/three/src/nodes/math/OperatorNode.d.ts

Lines changed: 88 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -46,78 +46,136 @@ type NumberToVec2<TNum extends NumType> = `${NumberToVec[TNum]}2`;
4646
type NumberToVec3<TNum extends NumType> = `${NumberToVec[TNum]}3`;
4747
type NumberToVec4<TNum extends NumType> = `${NumberToVec[TNum]}4`;
4848

49-
type Number<TNum extends NumType> = AnyNumber; // FIXME Number<TNum> | number
49+
type Number<TNum extends NumType> = Node<TNum> | number;
5050
type Vec2OrLessOrNumber<TNum extends NumType> = Number<TNum> | Node<NumberToVec2<TNum>>;
5151
type Vec3OrLessOrNumber<TNum extends NumType> = Vec2OrLessOrNumber<TNum> | Node<NumberToVec3<TNum>>;
5252
type Vec4OrLessOrNumber<TNum extends NumType> = Vec3OrLessOrNumber<TNum> | Node<NumberToVec4<TNum>>;
5353

54-
type AnyNumber = Node<"float"> | Node<"int"> | Node<"uint"> | number;
54+
interface NodeParameterForNumType {
55+
float: Node<"float"> | Node<"int"> | Node<"uint">;
56+
int: Node<"int">;
57+
uint: Node<"uint">;
58+
}
59+
type NumberParameterForNumType<TNum extends NumType> = NodeParameterForNumType[TNum] | number;
60+
61+
interface Vec2NodeParameterForNumType {
62+
float: Node<"vec2"> | Node<"ivec2"> | Node<"uvec2">;
63+
int: Node<"ivec2">;
64+
uint: Node<"uvec2">;
65+
}
66+
type Vec2OrLessOrNumberParameterForNumType<TNum extends NumType> =
67+
| Vec2NodeParameterForNumType[TNum]
68+
| NumberParameterForNumType<TNum>;
69+
70+
interface Vec3NodeParameterForNumType {
71+
float: Node<"vec3"> | Node<"ivec3"> | Node<"uvec3">;
72+
int: Node<"ivec3">;
73+
uint: Node<"uvec3">;
74+
}
75+
type Vec3OrLessOrNumberParameterForNumType<TNum extends NumType> =
76+
| Vec3NodeParameterForNumType[TNum]
77+
| Vec2OrLessOrNumberParameterForNumType<TNum>;
78+
79+
interface Vec4NodeParameterForNumType {
80+
float: Node<"vec4"> | Node<"ivec4"> | Node<"uvec4">;
81+
int: Node<"ivec4">;
82+
uint: Node<"uvec4">;
83+
}
84+
type Vec4OrLessOrNumberParameterForNumType<TNum extends NumType> =
85+
| Vec4NodeParameterForNumType[TNum]
86+
| Vec3OrLessOrNumberParameterForNumType<TNum>;
5587

5688
// add/sub/mul/div
5789

5890
// add/sub/mul/div numbers and/or vecs
5991
// Every parameter gets converted to the longest type
6092
// If the parameters are the same length, it gets converted to the first type
61-
// FIXME We handle the case of converting number types, but not converting between vectors of different number types
6293

6394
interface AddSubMulDivNumberVec<TNum extends NumType> {
64-
(a: Number<TNum>, b: AnyNumber, ...params: AnyNumber[]): Node<TNum>;
95+
(a: Number<TNum>, b: NumberParameterForNumType<TNum>, ...params: NumberParameterForNumType<TNum>[]): Node<TNum>;
6596
(
6697
a: Vec2OrLessOrNumber<TNum>,
67-
b: Vec2OrLessOrNumber<TNum>,
68-
...params: Vec2OrLessOrNumber<TNum>[]
98+
b: Vec2OrLessOrNumberParameterForNumType<TNum>,
99+
...params: Vec2OrLessOrNumberParameterForNumType<TNum>[]
69100
): Node<NumberToVec2<TNum>>;
70101
(
71102
a: Vec3OrLessOrNumber<TNum>,
72-
b: Vec3OrLessOrNumber<TNum>,
73-
...params: Vec3OrLessOrNumber<TNum>[]
103+
b: Vec3OrLessOrNumberParameterForNumType<TNum>,
104+
...params: Vec3OrLessOrNumberParameterForNumType<TNum>[]
74105
): Node<NumberToVec3<TNum>>;
75106
(
76107
a: Vec4OrLessOrNumber<TNum>,
77-
b: Vec4OrLessOrNumber<TNum>,
78-
...params: Vec4OrLessOrNumber<TNum>[]
108+
b: Vec4OrLessOrNumberParameterForNumType<TNum>,
109+
...params: Vec4OrLessOrNumberParameterForNumType<TNum>[]
79110
): Node<NumberToVec4<TNum>>;
80111
}
81112

82113
interface AddSubMulDivNumberVecNumExtensions<TNum extends NumType> {
83-
(b: AnyNumber, ...params: AnyNumber[]): Node<TNum>;
84-
(b: Vec2OrLessOrNumber<TNum>, ...params: Vec2OrLessOrNumber<TNum>[]): Node<NumberToVec2<TNum>>;
85-
(b: Vec3OrLessOrNumber<TNum>, ...params: Vec3OrLessOrNumber<TNum>[]): Node<NumberToVec3<TNum>>;
86-
(b: Vec4OrLessOrNumber<TNum>, ...params: Vec4OrLessOrNumber<TNum>[]): Node<NumberToVec4<TNum>>;
114+
(b: NumberParameterForNumType<TNum>, ...params: NumberParameterForNumType<TNum>[]): Node<TNum>;
115+
(
116+
b: Vec2OrLessOrNumberParameterForNumType<TNum>,
117+
...params: Vec2OrLessOrNumberParameterForNumType<TNum>[]
118+
): Node<NumberToVec2<TNum>>;
119+
(
120+
b: Vec3OrLessOrNumberParameterForNumType<TNum>,
121+
...params: Vec3OrLessOrNumberParameterForNumType<TNum>[]
122+
): Node<NumberToVec3<TNum>>;
123+
(
124+
b: Vec4OrLessOrNumberParameterForNumType<TNum>,
125+
...params: Vec4OrLessOrNumberParameterForNumType<TNum>[]
126+
): Node<NumberToVec4<TNum>>;
87127
}
88128

89-
interface AddSubMulDivNumberVecNumberAssignExtensions {
129+
interface AddSubMulDivNumberVecNumberAssignExtensions<TNum extends NumType> {
90130
(
91-
b: Vec4OrLessOrNumber<"float"> | Vec4OrLessOrNumber<"int"> | Vec4OrLessOrNumber<"uint">,
92-
...params: (Vec4OrLessOrNumber<"float"> | Vec4OrLessOrNumber<"int"> | Vec4OrLessOrNumber<"uint">)[]
131+
b: Vec4OrLessOrNumberParameterForNumType<TNum>,
132+
...params: Vec4OrLessOrNumberParameterForNumType<TNum>[]
93133
): this;
94134
}
95135

96136
interface AddSubMulDivNumberVecVec2Extensions<TNum extends NumType> {
97-
(b: Vec2OrLessOrNumber<TNum>, ...params: Vec2OrLessOrNumber<TNum>[]): Node<NumberToVec2<TNum>>;
98-
(b: Vec3OrLessOrNumber<TNum>, ...params: Vec3OrLessOrNumber<TNum>[]): Node<NumberToVec3<TNum>>;
99-
(b: Vec4OrLessOrNumber<TNum>, ...params: Vec4OrLessOrNumber<TNum>[]): Node<NumberToVec4<TNum>>;
137+
(
138+
b: Vec2OrLessOrNumberParameterForNumType<TNum>,
139+
...params: Vec2OrLessOrNumberParameterForNumType<TNum>[]
140+
): Node<NumberToVec2<TNum>>;
141+
(
142+
b: Vec3OrLessOrNumberParameterForNumType<TNum>,
143+
...params: Vec3OrLessOrNumberParameterForNumType<TNum>[]
144+
): Node<NumberToVec3<TNum>>;
145+
(
146+
b: Vec4OrLessOrNumberParameterForNumType<TNum>,
147+
...params: Vec4OrLessOrNumberParameterForNumType<TNum>[]
148+
): Node<NumberToVec4<TNum>>;
100149
}
101150

102151
interface AddSubMulDivNumberVecVec2AssignExtensions<TNum extends NumType> {
103-
(b: Vec4OrLessOrNumber<TNum>, ...params: Vec4OrLessOrNumber<TNum>[]): this;
152+
(b: Vec4OrLessOrNumberParameterForNumType<TNum>, ...params: Vec4OrLessOrNumberParameterForNumType<TNum>[]): this;
104153
}
105154

106155
interface AddSubMulDivNumberVecVec3Extensions<TNum extends NumType> {
107-
(b: Vec3OrLessOrNumber<TNum>, ...params: Vec3OrLessOrNumber<TNum>[]): Node<NumberToVec3<TNum>>;
108-
(b: Vec4OrLessOrNumber<TNum>, ...params: Vec4OrLessOrNumber<TNum>[]): Node<NumberToVec4<TNum>>;
156+
(
157+
b: Vec3OrLessOrNumberParameterForNumType<TNum>,
158+
...params: Vec3OrLessOrNumberParameterForNumType<TNum>[]
159+
): Node<NumberToVec3<TNum>>;
160+
(
161+
b: Vec4OrLessOrNumberParameterForNumType<TNum>,
162+
...params: Vec4OrLessOrNumberParameterForNumType<TNum>[]
163+
): Node<NumberToVec4<TNum>>;
109164
}
110165

111166
interface AddSubMulDivNumberVecVec3AssignExtensions<TNum extends NumType> {
112-
(b: Vec4OrLessOrNumber<TNum>, ...params: Vec4OrLessOrNumber<TNum>[]): this;
167+
(b: Vec4OrLessOrNumberParameterForNumType<TNum>, ...params: Vec4OrLessOrNumberParameterForNumType<TNum>[]): this;
113168
}
114169

115170
interface AddSubMulDivNumberVecVec4Extensions<TNum extends NumType> {
116-
(b: Vec4OrLessOrNumber<TNum>, ...params: Vec4OrLessOrNumber<TNum>[]): Node<NumberToVec4<TNum>>;
171+
(
172+
b: Vec4OrLessOrNumberParameterForNumType<TNum>,
173+
...params: Vec4OrLessOrNumberParameterForNumType<TNum>[]
174+
): Node<NumberToVec4<TNum>>;
117175
}
118176

119177
interface AddSubMulDivNumberVecVec4AssignExtensions<TNum extends NumType> {
120-
(b: Vec4OrLessOrNumber<TNum>, ...params: Vec4OrLessOrNumber<TNum>[]): this;
178+
(b: Vec4OrLessOrNumberParameterForNumType<TNum>, ...params: Vec4OrLessOrNumberParameterForNumType<TNum>[]): this;
121179
}
122180

123181
// add/sub/mul mats
@@ -242,10 +300,10 @@ declare module "../core/Node.js" {
242300
mul: AddSubMulDivNumberVecNumExtensions<TNum>;
243301
div: AddSubMulDivNumberVecNumExtensions<TNum>;
244302

245-
addAssign: AddSubMulDivNumberVecNumberAssignExtensions;
246-
subAssign: AddSubMulDivNumberVecNumberAssignExtensions;
247-
mulAssign: AddSubMulDivNumberVecNumberAssignExtensions;
248-
divAssign: AddSubMulDivNumberVecNumberAssignExtensions;
303+
addAssign: AddSubMulDivNumberVecNumberAssignExtensions<TNum>;
304+
subAssign: AddSubMulDivNumberVecNumberAssignExtensions<TNum>;
305+
mulAssign: AddSubMulDivNumberVecNumberAssignExtensions<TNum>;
306+
divAssign: AddSubMulDivNumberVecNumberAssignExtensions<TNum>;
249307
}
250308

251309
interface Vec2Extensions {

0 commit comments

Comments
 (0)