@react-three/tsl 10.0.0-canary.b86abaa → 10.0.0-canary.b9d5979

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/dist/index.cjs CHANGED
@@ -177,6 +177,10 @@ function extractTSLValue(value) {
177
177
  if (node.isConstNode) {
178
178
  return node.value;
179
179
  }
180
+ if (node.isVarNode && node.node) {
181
+ const inner = extractTSLValue(node.node);
182
+ return inner === node.node ? value : inner;
183
+ }
180
184
  if ("value" in node) {
181
185
  let extractedValue = node.value;
182
186
  if (typeof node.traverse === "function") {
@@ -759,18 +763,20 @@ function isSameThreeType(a, b) {
759
763
  const uniformOf = tsl.uniform;
760
764
  function useUniform(name, value) {
761
765
  const store = usePrimaryStore();
766
+ const memoizedInput = useCompareMemoize(value === void 0 ? name : { [name]: normalizeValue(value) });
762
767
  const registered = useScopedResource({
763
768
  store,
764
769
  kind: "uniforms",
765
770
  scope: void 0,
766
771
  isLeaf: isUniformNode,
767
- input: name,
772
+ input: memoizedInput,
768
773
  create: () => value === void 0 ? {} : { [name]: value },
769
774
  prepare: createNamedUniform,
770
775
  reconcile: (existing2) => {
771
- if (value !== void 0 && !isTSLNode(value) && !isUniformNode(value)) {
772
- existing2.value = typeof value === "string" ? new THREE.Color(value) : value;
773
- }
776
+ if (value === void 0 || isUniformNode(value)) return;
777
+ const next = normalizeValue(value);
778
+ if (isTSLNode(next)) return;
779
+ existing2.value = next;
774
780
  }
775
781
  });
776
782
  if (registered[name]) return registered[name];
@@ -780,6 +786,9 @@ function useUniform(name, value) {
780
786
  `[useUniform] Uniform "${name}" not found. Create it first with: useUniform('${name}', initialValue)`
781
787
  );
782
788
  }
789
+ function normalizeValue(value) {
790
+ return typeof value === "string" ? new THREE.Color(value) : vectorize(value);
791
+ }
783
792
  function createNamedUniform(name, value) {
784
793
  let node;
785
794
  if (isUniformNode(value)) {
package/dist/index.d.cts CHANGED
@@ -149,6 +149,16 @@ declare global {
149
149
  /** Node type accepted by broad dynamic node-store readers. */
150
150
  type TSLNodeType = three_webgpu.Node | CallableTSLNode
151
151
 
152
+ /**
153
+ * What TSL's constant constructors return: `int(1)`, `vec2(0, 1)`, `color('red')` and friends
154
+ * wrap a ConstNode in a VarNode. three's `uniform()` unwraps exactly this shape to
155
+ * `UniformNode<TNodeType, TValue>`, and so do the mappings below.
156
+ */
157
+ type TSLConstNode<TNodeType, TValue> = three_webgpu.VarNode<
158
+ TNodeType,
159
+ three_webgpu.ConstNode<TNodeType, TValue>
160
+ >
161
+
152
162
  /**
153
163
  * Derive Three's shader node type from an existing node or a supported raw input.
154
164
  * Existing InputNode generics take precedence over structural value normalization.
@@ -159,44 +169,48 @@ declare global {
159
169
  ? TNodeType
160
170
  : T extends three_webgpu.InputNode<infer TNodeType, infer _TValue>
161
171
  ? TNodeType
162
- : T extends number
163
- ? 'float'
164
- : T extends boolean
165
- ? 'bool'
166
- : T extends string | three_webgpu.Color | { r: number; g: number; b: number }
167
- ? 'color'
168
- : T extends three_webgpu.Vector4 | { x: number; y: number; z: number; w: number }
169
- ? 'vec4'
170
- : T extends three_webgpu.Vector3 | { x: number; y: number; z: number }
171
- ? 'vec3'
172
- : T extends three_webgpu.Vector2 | { x: number; y: number }
173
- ? 'vec2'
174
- : T extends three_webgpu.Matrix4
175
- ? 'mat4'
176
- : T extends three_webgpu.Matrix3
177
- ? 'mat3'
178
- : T extends three_webgpu.Matrix2
179
- ? 'mat2'
180
- : unknown
172
+ : T extends TSLConstNode<infer TNodeType, infer _TValue>
173
+ ? TNodeType
174
+ : T extends number
175
+ ? 'float'
176
+ : T extends boolean
177
+ ? 'bool'
178
+ : T extends string | three_webgpu.Color | { r: number; g: number; b: number }
179
+ ? 'color'
180
+ : T extends three_webgpu.Vector4 | { x: number; y: number; z: number; w: number }
181
+ ? 'vec4'
182
+ : T extends three_webgpu.Vector3 | { x: number; y: number; z: number }
183
+ ? 'vec3'
184
+ : T extends three_webgpu.Vector2 | { x: number; y: number }
185
+ ? 'vec2'
186
+ : T extends three_webgpu.Matrix4
187
+ ? 'mat4'
188
+ : T extends three_webgpu.Matrix3
189
+ ? 'mat3'
190
+ : T extends three_webgpu.Matrix2
191
+ ? 'mat2'
192
+ : unknown
181
193
 
182
194
  /** Derive the normalized JavaScript value stored by a uniform node. */
183
195
  type UniformNodeValue<T> = T extends three_webgpu.UniformNode<infer _TNodeType, infer TValue>
184
196
  ? TValue
185
197
  : T extends three_webgpu.InputNode<infer _TNodeType, infer TValue>
186
198
  ? TValue
187
- : T extends string | { r: number; g: number; b: number }
188
- ? three_webgpu.Color
189
- : T extends { x: number; y: number; z: number; w: number }
190
- ? three_webgpu.Vector4
191
- : T extends { x: number; y: number; z: number }
192
- ? three_webgpu.Vector3
193
- : T extends { x: number; y: number }
194
- ? three_webgpu.Vector2
195
- : T extends number
196
- ? number
197
- : T extends boolean
198
- ? boolean
199
- : T
199
+ : T extends TSLConstNode<infer _TNodeType, infer TValue>
200
+ ? TValue
201
+ : T extends string | { r: number; g: number; b: number }
202
+ ? three_webgpu.Color
203
+ : T extends { x: number; y: number; z: number; w: number }
204
+ ? three_webgpu.Vector4
205
+ : T extends { x: number; y: number; z: number }
206
+ ? three_webgpu.Vector3
207
+ : T extends { x: number; y: number }
208
+ ? three_webgpu.Vector2
209
+ : T extends number
210
+ ? number
211
+ : T extends boolean
212
+ ? boolean
213
+ : T
200
214
 
201
215
  /** Three's exact UniformNode with shader and value generics derived from an input. */
202
216
  type UniformNodeFor<T> = three_webgpu.UniformNode<UniformNodeType<T>, UniformNodeValue<T>>
package/dist/index.d.mts CHANGED
@@ -149,6 +149,16 @@ declare global {
149
149
  /** Node type accepted by broad dynamic node-store readers. */
150
150
  type TSLNodeType = three_webgpu.Node | CallableTSLNode
151
151
 
152
+ /**
153
+ * What TSL's constant constructors return: `int(1)`, `vec2(0, 1)`, `color('red')` and friends
154
+ * wrap a ConstNode in a VarNode. three's `uniform()` unwraps exactly this shape to
155
+ * `UniformNode<TNodeType, TValue>`, and so do the mappings below.
156
+ */
157
+ type TSLConstNode<TNodeType, TValue> = three_webgpu.VarNode<
158
+ TNodeType,
159
+ three_webgpu.ConstNode<TNodeType, TValue>
160
+ >
161
+
152
162
  /**
153
163
  * Derive Three's shader node type from an existing node or a supported raw input.
154
164
  * Existing InputNode generics take precedence over structural value normalization.
@@ -159,44 +169,48 @@ declare global {
159
169
  ? TNodeType
160
170
  : T extends three_webgpu.InputNode<infer TNodeType, infer _TValue>
161
171
  ? TNodeType
162
- : T extends number
163
- ? 'float'
164
- : T extends boolean
165
- ? 'bool'
166
- : T extends string | three_webgpu.Color | { r: number; g: number; b: number }
167
- ? 'color'
168
- : T extends three_webgpu.Vector4 | { x: number; y: number; z: number; w: number }
169
- ? 'vec4'
170
- : T extends three_webgpu.Vector3 | { x: number; y: number; z: number }
171
- ? 'vec3'
172
- : T extends three_webgpu.Vector2 | { x: number; y: number }
173
- ? 'vec2'
174
- : T extends three_webgpu.Matrix4
175
- ? 'mat4'
176
- : T extends three_webgpu.Matrix3
177
- ? 'mat3'
178
- : T extends three_webgpu.Matrix2
179
- ? 'mat2'
180
- : unknown
172
+ : T extends TSLConstNode<infer TNodeType, infer _TValue>
173
+ ? TNodeType
174
+ : T extends number
175
+ ? 'float'
176
+ : T extends boolean
177
+ ? 'bool'
178
+ : T extends string | three_webgpu.Color | { r: number; g: number; b: number }
179
+ ? 'color'
180
+ : T extends three_webgpu.Vector4 | { x: number; y: number; z: number; w: number }
181
+ ? 'vec4'
182
+ : T extends three_webgpu.Vector3 | { x: number; y: number; z: number }
183
+ ? 'vec3'
184
+ : T extends three_webgpu.Vector2 | { x: number; y: number }
185
+ ? 'vec2'
186
+ : T extends three_webgpu.Matrix4
187
+ ? 'mat4'
188
+ : T extends three_webgpu.Matrix3
189
+ ? 'mat3'
190
+ : T extends three_webgpu.Matrix2
191
+ ? 'mat2'
192
+ : unknown
181
193
 
182
194
  /** Derive the normalized JavaScript value stored by a uniform node. */
183
195
  type UniformNodeValue<T> = T extends three_webgpu.UniformNode<infer _TNodeType, infer TValue>
184
196
  ? TValue
185
197
  : T extends three_webgpu.InputNode<infer _TNodeType, infer TValue>
186
198
  ? TValue
187
- : T extends string | { r: number; g: number; b: number }
188
- ? three_webgpu.Color
189
- : T extends { x: number; y: number; z: number; w: number }
190
- ? three_webgpu.Vector4
191
- : T extends { x: number; y: number; z: number }
192
- ? three_webgpu.Vector3
193
- : T extends { x: number; y: number }
194
- ? three_webgpu.Vector2
195
- : T extends number
196
- ? number
197
- : T extends boolean
198
- ? boolean
199
- : T
199
+ : T extends TSLConstNode<infer _TNodeType, infer TValue>
200
+ ? TValue
201
+ : T extends string | { r: number; g: number; b: number }
202
+ ? three_webgpu.Color
203
+ : T extends { x: number; y: number; z: number; w: number }
204
+ ? three_webgpu.Vector4
205
+ : T extends { x: number; y: number; z: number }
206
+ ? three_webgpu.Vector3
207
+ : T extends { x: number; y: number }
208
+ ? three_webgpu.Vector2
209
+ : T extends number
210
+ ? number
211
+ : T extends boolean
212
+ ? boolean
213
+ : T
200
214
 
201
215
  /** Three's exact UniformNode with shader and value generics derived from an input. */
202
216
  type UniformNodeFor<T> = three_webgpu.UniformNode<UniformNodeType<T>, UniformNodeValue<T>>
package/dist/index.d.ts CHANGED
@@ -149,6 +149,16 @@ declare global {
149
149
  /** Node type accepted by broad dynamic node-store readers. */
150
150
  type TSLNodeType = three_webgpu.Node | CallableTSLNode
151
151
 
152
+ /**
153
+ * What TSL's constant constructors return: `int(1)`, `vec2(0, 1)`, `color('red')` and friends
154
+ * wrap a ConstNode in a VarNode. three's `uniform()` unwraps exactly this shape to
155
+ * `UniformNode<TNodeType, TValue>`, and so do the mappings below.
156
+ */
157
+ type TSLConstNode<TNodeType, TValue> = three_webgpu.VarNode<
158
+ TNodeType,
159
+ three_webgpu.ConstNode<TNodeType, TValue>
160
+ >
161
+
152
162
  /**
153
163
  * Derive Three's shader node type from an existing node or a supported raw input.
154
164
  * Existing InputNode generics take precedence over structural value normalization.
@@ -159,44 +169,48 @@ declare global {
159
169
  ? TNodeType
160
170
  : T extends three_webgpu.InputNode<infer TNodeType, infer _TValue>
161
171
  ? TNodeType
162
- : T extends number
163
- ? 'float'
164
- : T extends boolean
165
- ? 'bool'
166
- : T extends string | three_webgpu.Color | { r: number; g: number; b: number }
167
- ? 'color'
168
- : T extends three_webgpu.Vector4 | { x: number; y: number; z: number; w: number }
169
- ? 'vec4'
170
- : T extends three_webgpu.Vector3 | { x: number; y: number; z: number }
171
- ? 'vec3'
172
- : T extends three_webgpu.Vector2 | { x: number; y: number }
173
- ? 'vec2'
174
- : T extends three_webgpu.Matrix4
175
- ? 'mat4'
176
- : T extends three_webgpu.Matrix3
177
- ? 'mat3'
178
- : T extends three_webgpu.Matrix2
179
- ? 'mat2'
180
- : unknown
172
+ : T extends TSLConstNode<infer TNodeType, infer _TValue>
173
+ ? TNodeType
174
+ : T extends number
175
+ ? 'float'
176
+ : T extends boolean
177
+ ? 'bool'
178
+ : T extends string | three_webgpu.Color | { r: number; g: number; b: number }
179
+ ? 'color'
180
+ : T extends three_webgpu.Vector4 | { x: number; y: number; z: number; w: number }
181
+ ? 'vec4'
182
+ : T extends three_webgpu.Vector3 | { x: number; y: number; z: number }
183
+ ? 'vec3'
184
+ : T extends three_webgpu.Vector2 | { x: number; y: number }
185
+ ? 'vec2'
186
+ : T extends three_webgpu.Matrix4
187
+ ? 'mat4'
188
+ : T extends three_webgpu.Matrix3
189
+ ? 'mat3'
190
+ : T extends three_webgpu.Matrix2
191
+ ? 'mat2'
192
+ : unknown
181
193
 
182
194
  /** Derive the normalized JavaScript value stored by a uniform node. */
183
195
  type UniformNodeValue<T> = T extends three_webgpu.UniformNode<infer _TNodeType, infer TValue>
184
196
  ? TValue
185
197
  : T extends three_webgpu.InputNode<infer _TNodeType, infer TValue>
186
198
  ? TValue
187
- : T extends string | { r: number; g: number; b: number }
188
- ? three_webgpu.Color
189
- : T extends { x: number; y: number; z: number; w: number }
190
- ? three_webgpu.Vector4
191
- : T extends { x: number; y: number; z: number }
192
- ? three_webgpu.Vector3
193
- : T extends { x: number; y: number }
194
- ? three_webgpu.Vector2
195
- : T extends number
196
- ? number
197
- : T extends boolean
198
- ? boolean
199
- : T
199
+ : T extends TSLConstNode<infer _TNodeType, infer TValue>
200
+ ? TValue
201
+ : T extends string | { r: number; g: number; b: number }
202
+ ? three_webgpu.Color
203
+ : T extends { x: number; y: number; z: number; w: number }
204
+ ? three_webgpu.Vector4
205
+ : T extends { x: number; y: number; z: number }
206
+ ? three_webgpu.Vector3
207
+ : T extends { x: number; y: number }
208
+ ? three_webgpu.Vector2
209
+ : T extends number
210
+ ? number
211
+ : T extends boolean
212
+ ? boolean
213
+ : T
200
214
 
201
215
  /** Three's exact UniformNode with shader and value generics derived from an input. */
202
216
  type UniformNodeFor<T> = three_webgpu.UniformNode<UniformNodeType<T>, UniformNodeValue<T>>
package/dist/index.mjs CHANGED
@@ -162,6 +162,10 @@ function extractTSLValue(value) {
162
162
  if (node.isConstNode) {
163
163
  return node.value;
164
164
  }
165
+ if (node.isVarNode && node.node) {
166
+ const inner = extractTSLValue(node.node);
167
+ return inner === node.node ? value : inner;
168
+ }
165
169
  if ("value" in node) {
166
170
  let extractedValue = node.value;
167
171
  if (typeof node.traverse === "function") {
@@ -744,18 +748,20 @@ function isSameThreeType(a, b) {
744
748
  const uniformOf = uniform;
745
749
  function useUniform(name, value) {
746
750
  const store = usePrimaryStore();
751
+ const memoizedInput = useCompareMemoize(value === void 0 ? name : { [name]: normalizeValue(value) });
747
752
  const registered = useScopedResource({
748
753
  store,
749
754
  kind: "uniforms",
750
755
  scope: void 0,
751
756
  isLeaf: isUniformNode,
752
- input: name,
757
+ input: memoizedInput,
753
758
  create: () => value === void 0 ? {} : { [name]: value },
754
759
  prepare: createNamedUniform,
755
760
  reconcile: (existing2) => {
756
- if (value !== void 0 && !isTSLNode(value) && !isUniformNode(value)) {
757
- existing2.value = typeof value === "string" ? new Color(value) : value;
758
- }
761
+ if (value === void 0 || isUniformNode(value)) return;
762
+ const next = normalizeValue(value);
763
+ if (isTSLNode(next)) return;
764
+ existing2.value = next;
759
765
  }
760
766
  });
761
767
  if (registered[name]) return registered[name];
@@ -765,6 +771,9 @@ function useUniform(name, value) {
765
771
  `[useUniform] Uniform "${name}" not found. Create it first with: useUniform('${name}', initialValue)`
766
772
  );
767
773
  }
774
+ function normalizeValue(value) {
775
+ return typeof value === "string" ? new Color(value) : vectorize(value);
776
+ }
768
777
  function createNamedUniform(name, value) {
769
778
  let node;
770
779
  if (isUniformNode(value)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/tsl",
3
- "version": "10.0.0-canary.b86abaa",
3
+ "version": "10.0.0-canary.b9d5979",
4
4
  "description": "TSL resource hooks for react-three-fiber: uniforms, nodes, buffers, GPU storage and render pipelines on WebGPU",
5
5
  "keywords": [
6
6
  "react",
@@ -56,7 +56,7 @@
56
56
  "@types/three": "^0.185.0",
57
57
  "@webgpu/types": "^0.1.64",
58
58
  "three": ">=0.185.0",
59
- "@react-three/fiber": "10.0.0-canary.b86abaa"
59
+ "@react-three/fiber": "10.0.0-canary.b9d5979"
60
60
  },
61
61
  "scripts": {
62
62
  "build": "unbuild",