Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions examples-testing/changes.patch
Original file line number Diff line number Diff line change
Expand Up @@ -14204,7 +14204,7 @@ index 384311dd4..8d39e8acc 100644
});
}
diff --git a/examples-testing/examples/webgpu_backdrop_water.ts b/examples-testing/examples/webgpu_backdrop_water.ts
index a8538cf94..53b975193 100644
index a8538cf94..ac7a9b71f 100644
--- a/examples-testing/examples/webgpu_backdrop_water.ts
+++ b/examples-testing/examples/webgpu_backdrop_water.ts
@@ -24,11 +24,13 @@ import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
Expand All @@ -14226,16 +14226,19 @@ index a8538cf94..53b975193 100644

init();

@@ -157,7 +159,7 @@ function init() {
@@ -157,7 +159,10 @@ function init() {
let transition = waterPosY.add(0.1).saturate().oneMinus();
transition = waterPosY.lessThan(0).select(transition, normalWorld.y.mix(transition, 0)).toVar();

- const colorNode = transition.mix(material.colorNode, material.colorNode.add(waterLayer0));
+ const colorNode = transition.mix(material.colorNode!, material.colorNode!.add(waterLayer0));
+ const colorNode = transition.mix(
+ material.colorNode as THREE.Node<'vec4'>,
+ (material.colorNode as THREE.Node<'vec4'>).add(waterLayer0),
+ );

//material.colorNode = colorNode;
floor.material.colorNode = colorNode;
@@ -182,7 +184,7 @@ function init() {
@@ -182,7 +187,7 @@ function init() {

// gui

Expand Down
55 changes: 35 additions & 20 deletions jsdoc-testing/changes.patch
Original file line number Diff line number Diff line change
Expand Up @@ -10296,7 +10296,7 @@ index 60775a2a1..2ed041bfc 100644
-import { InterleavedBuffer } from '../../core/InterleavedBuffer.js';
-import InputNode from '../core/InputNode.js';
diff --git a/jsdoc-testing/jsdoc/nodes/core/Node.d.ts b/jsdoc-testing/jsdoc/nodes/core/Node.d.ts
index 8299d6c54..1764023d1 100644
index 8299d6c54..74b76b2cb 100644
--- a/jsdoc-testing/jsdoc/nodes/core/Node.d.ts
+++ b/jsdoc-testing/jsdoc/nodes/core/Node.d.ts
@@ -1,10 +1,85 @@
Expand Down Expand Up @@ -10636,7 +10636,7 @@ index 8299d6c54..1764023d1 100644
/**
* This method performs the build of a node. The behavior and return value depend on the current build stage:
* - **setup**: Prepares the node and its children for the build process. This process can also create new nodes. Returns the node itself or a variant.
@@ -410,28 +463,161 @@ declare class Node extends EventDispatcher {
@@ -410,28 +463,176 @@ declare class Node extends EventDispatcher {
*
* @return {Generator<Object>} An iterable list of serialized child objects as JSON.
*/
Expand Down Expand Up @@ -10664,7 +10664,9 @@ index 8299d6c54..1764023d1 100644
*/
- toJSON(meta: Object | null): Object;
+ toJSON(meta?: NodeJSONMeta | string): NodeJSONOutputData;
+}
}
-declare namespace Node {
- let captureStackTrace: boolean;
+
+declare const Node: {
+ new<TNodeType>(nodeType?: TNodeType | null): Node<TNodeType>;
Expand All @@ -10680,12 +10682,10 @@ index 8299d6c54..1764023d1 100644
+
+export interface NodeElements {
}
-declare namespace Node {
- let captureStackTrace: boolean;
-import { EventDispatcher } from '../../core/EventDispatcher.js';
+
+export interface NodeExtensions<TNodeType> {
}
-import { EventDispatcher } from '../../core/EventDispatcher.js';
+}
+
+export type NumType = "float" | "int" | "uint";
+export type IntegerType = "int" | "uint";
Expand Down Expand Up @@ -10747,6 +10747,18 @@ index 8299d6c54..1764023d1 100644
+export interface FloatVecExtensions<TVec extends FloatVecType> {
+}
+
+export interface FloatOrVecExtensions<TNodeType> {
+}
+
+export interface IntOrVecExtensions<TNodeType> {
+}
+
+export interface UintOrVecExtensions<TNodeType> {
+}
+
+export interface BoolOrVecExtensions {
+}
+
+export interface Mat2Extensions {
+}
+
Expand All @@ -10763,36 +10775,39 @@ index 8299d6c54..1764023d1 100644
+ & NodeClass
+ & NodeElements
+ & (unknown extends TNodeType ? {} : NodeExtensions<TNodeType>)
+ & (TNodeType extends "float" ? NumOrBoolExtensions<"float"> & FloatExtensions & NumExtensions<"float">
+ & (TNodeType extends "float" ? NumOrBoolExtensions<"float"> & FloatExtensions & NumExtensions<"float"> & FloatOrVecExtensions<"float">
+ : TNodeType extends "int"
+ ? NumOrBoolExtensions<"int"> & IntExtensions & NumExtensions<"int"> & IntegerExtensions<"int">
+ ? NumOrBoolExtensions<"int"> & IntExtensions & NumExtensions<"int"> & IntegerExtensions<"int"> & IntOrVecExtensions<"int">
+ : TNodeType extends "uint"
+ ? NumOrBoolExtensions<"uint"> & UintExtensions & NumExtensions<"uint"> & IntegerExtensions<"uint">
+ : TNodeType extends "bool" ? NumOrBoolExtensions<"bool"> & BoolExtensions
+ ? NumOrBoolExtensions<"uint"> & UintExtensions & NumExtensions<"uint"> & IntegerExtensions<"uint"> & IntOrVecExtensions<"uint">
+ : TNodeType extends "bool" ? NumOrBoolExtensions<"bool"> & BoolExtensions & BoolOrVecExtensions
+ : TNodeType extends "vec2" ?
+ & NumOrBoolVec2Extensions<"float">
+ & Vec2Extensions
+ & NumVec2Extensions<"float">
+ & FloatVecExtensions<"vec2">
+ : TNodeType extends "ivec2" ? NumOrBoolVec2Extensions<"int"> & NumVec2Extensions<"int">
+ : TNodeType extends "uvec2" ? NumOrBoolVec2Extensions<"uint"> & NumVec2Extensions<"uint">
+ : TNodeType extends "bvec2" ? NumOrBoolVec2Extensions<"bool">
+ & FloatOrVecExtensions<"vec2">
+ : TNodeType extends "ivec2" ? NumOrBoolVec2Extensions<"int"> & NumVec2Extensions<"int"> & IntOrVecExtensions<"ivec2">
+ : TNodeType extends "uvec2" ? NumOrBoolVec2Extensions<"uint"> & NumVec2Extensions<"uint"> & IntOrVecExtensions<"uvec2">
+ : TNodeType extends "bvec2" ? NumOrBoolVec2Extensions<"bool"> & BoolOrVecExtensions
+ : TNodeType extends "vec3" ?
+ & NumOrBoolVec3Extensions<"float">
+ & Vec3Extensions
+ & NumVec3Extensions<"float">
+ & FloatVecExtensions<"vec3">
+ : TNodeType extends "ivec3" ? NumOrBoolVec3Extensions<"int"> & NumVec3Extensions<"int">
+ : TNodeType extends "uvec3" ? NumOrBoolVec3Extensions<"uint"> & NumVec3Extensions<"uint">
+ : TNodeType extends "bvec3" ? NumOrBoolVec3Extensions<"bool">
+ & FloatOrVecExtensions<"vec3">
+ : TNodeType extends "ivec3" ? NumOrBoolVec3Extensions<"int"> & NumVec3Extensions<"int"> & IntOrVecExtensions<"ivec3">
+ : TNodeType extends "uvec3" ? NumOrBoolVec3Extensions<"uint"> & NumVec3Extensions<"uint"> & IntOrVecExtensions<"uvec3">
+ : TNodeType extends "bvec3" ? NumOrBoolVec3Extensions<"bool"> & BoolOrVecExtensions
+ : TNodeType extends "vec4" ?
+ & NumOrBoolVec4Extensions<"float">
+ & Vec4Extensions
+ & NumVec4Extensions<"float">
+ & FloatVecExtensions<"vec4">
+ : TNodeType extends "ivec4" ? NumOrBoolVec4Extensions<"int"> & NumVec4Extensions<"int">
+ : TNodeType extends "uvec4" ? NumOrBoolVec4Extensions<"uint"> & NumVec4Extensions<"uint">
+ : TNodeType extends "bvec4" ? NumOrBoolVec4Extensions<"bool">
+ & FloatOrVecExtensions<"vec4">
+ : TNodeType extends "ivec4" ? NumOrBoolVec4Extensions<"int"> & NumVec4Extensions<"int"> & IntOrVecExtensions<"ivec4">
+ : TNodeType extends "uvec4" ? NumOrBoolVec4Extensions<"uint"> & NumVec4Extensions<"uint"> & IntOrVecExtensions<"uvec4">
+ : TNodeType extends "bvec4" ? NumOrBoolVec4Extensions<"bool"> & BoolOrVecExtensions
+ : TNodeType extends "color" ? ColorExtensions
+ : TNodeType extends "mat2" ? Mat2Extensions & MatExtensions<"mat2">
+ : TNodeType extends "mat3" ? Mat3Extensions & MatExtensions<"mat3">
Expand Down
127 changes: 127 additions & 0 deletions tsl-testing/MathNode.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import { beforeAll, expect, test } from 'vitest';
import { all, any, atan, bvec2, bvec3, int, normalize, radians, sign, uvec3, vec2, vec3 } from 'three/tsl';
import * as THREE from 'three/webgpu';

const renderer = new THREE.WebGPURenderer();
const nodeBuilder: THREE.NodeBuilder = renderer.backend.createNodeBuilder(null!, renderer);

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera();

beforeAll(async () => {
await renderer.init();
});

function assertNode<TNodeType>(node: THREE.Node<TNodeType>, nodeType: string) {
expect(node).toBeInstanceOf(THREE.Node);
expect(node.getNodeType(nodeBuilder)).toBe(nodeType);

scene.backgroundNode = node.debug();
renderer.render(scene, camera);
}

test('all(boolean)', () => {
const result: THREE.Node<'bool'> = all(true);
assertNode(result, 'bool');
});

test('all(Node<"bvec2">)', () => {
const vec = bvec2(true, false);
const result: THREE.Node<'bool'> = all(vec);
assertNode(result, 'bool');
});

test('bvec3.all()', () => {
const vec = bvec3(true, false, true);
const result: THREE.Node<'bool'> = vec.all();
assertNode(result, 'bool');
});

test('any(boolean)', () => {
const result: THREE.Node<'bool'> = any(true);
assertNode(result, 'bool');
});

test('any(Node<"bvec2">)', () => {
const vec = bvec2(true, false);
const result: THREE.Node<'bool'> = any(vec);
assertNode(result, 'bool');
});

test('bvec3.any()', () => {
const vec = bvec3(true, false, true);
const result: THREE.Node<'bool'> = vec.any();
assertNode(result, 'bool');
});

test('radians(number)', () => {
const result: THREE.Node<'float'> = radians(3);
assertNode(result, 'float');
});

test('radians(int)', () => {
const intNode = int(3);
// This is likely to be a mistake because it returns an integer
// @ts-expect-error
radians(intNode);
});

test('radians(vec2)', () => {
const vec = vec2(3, 1);
const result: THREE.Node<'vec2'> = radians(vec);
assertNode(result, 'vec2');
});

test('vec3.radians()', () => {
const vec = vec3(3, 1);
const result: THREE.Node<'vec3'> = vec.radians();
assertNode(result, 'vec3');
});

test('radians(Vector4)', () => {
const vector = new THREE.Vector4(1, 2, 3, 4);
const result: THREE.Node<'vec4'> = radians(vector);
assertNode(result, 'vec4');
});

test('normalize(vec2)', () => {
const vec = vec2(3, 1);
const result: THREE.Node<'vec2'> = normalize(vec);
assertNode(result, 'vec2');
});

test('vec3.normalize()', () => {
const vec = vec3(3, 1);
const result: THREE.Node<'vec3'> = normalize(vec);
assertNode(result, 'vec3');
});

test('vec2.atan(number)', () => {
const vec = vec2(3, 1);
const result: THREE.Node<'vec2'> = vec.atan(5);
assertNode(result, 'vec2');
});

test('atan(number, Vector3)', () => {
const vector = new THREE.Vector3(5, 3, 1);
const result: THREE.Node<'vec3'> = atan(5, vector);
assertNode(result, 'vec3');
});

test('vec2.abs()', () => {
const vec = vec2(5, 3);
const result: THREE.Node<'vec2'> = vec.abs();
assertNode(result, 'vec2');
});

test('abs(uvec3)', () => {
const vec = uvec3(5, 3, 1);
const result: THREE.Node<'uvec3'> = vec.abs();
assertNode(result, 'uvec3');
});

test('sign(Vector4)', () => {
const vector = new THREE.Vector4(1, 2, 3, 4);
const result: THREE.Node<'vec4'> = sign(vector);
assertNode(result, 'vec4');
});
60 changes: 45 additions & 15 deletions types/three/src/nodes/core/Node.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -563,6 +563,18 @@ export interface ColorExtensions {
export interface FloatVecExtensions<TVec extends FloatVecType> {
}

export interface FloatOrVecExtensions<TNodeType> {
}

export interface IntOrVecExtensions<TNodeType> {
}

export interface UintOrVecExtensions<TNodeType> {
}

export interface BoolOrVecExtensions {
}

export interface Mat2Extensions {
}

Expand All @@ -579,36 +591,54 @@ type Node<TNodeType = unknown> =
& NodeClass
& NodeElements
& (unknown extends TNodeType ? {} : NodeExtensions<TNodeType>)
& (TNodeType extends "float" ? NumOrBoolExtensions<"float"> & FloatExtensions & NumExtensions<"float">
: TNodeType extends "int"
? NumOrBoolExtensions<"int"> & IntExtensions & NumExtensions<"int"> & IntegerExtensions<"int">
: TNodeType extends "uint"
? NumOrBoolExtensions<"uint"> & UintExtensions & NumExtensions<"uint"> & IntegerExtensions<"uint">
: TNodeType extends "bool" ? NumOrBoolExtensions<"bool"> & BoolExtensions
& (TNodeType extends "float"
? NumOrBoolExtensions<"float"> & FloatExtensions & NumExtensions<"float"> & FloatOrVecExtensions<"float">
: TNodeType extends "int" ?
& NumOrBoolExtensions<"int">
& IntExtensions
& NumExtensions<"int">
& IntegerExtensions<"int">
& IntOrVecExtensions<"int">
: TNodeType extends "uint" ?
& NumOrBoolExtensions<"uint">
& UintExtensions
& NumExtensions<"uint">
& IntegerExtensions<"uint">
& IntOrVecExtensions<"uint">
: TNodeType extends "bool" ? NumOrBoolExtensions<"bool"> & BoolExtensions & BoolOrVecExtensions
: TNodeType extends "vec2" ?
& NumOrBoolVec2Extensions<"float">
& Vec2Extensions
& NumVec2Extensions<"float">
& FloatVecExtensions<"vec2">
: TNodeType extends "ivec2" ? NumOrBoolVec2Extensions<"int"> & NumVec2Extensions<"int">
: TNodeType extends "uvec2" ? NumOrBoolVec2Extensions<"uint"> & NumVec2Extensions<"uint">
: TNodeType extends "bvec2" ? NumOrBoolVec2Extensions<"bool">
& FloatOrVecExtensions<"vec2">
: TNodeType extends "ivec2"
? NumOrBoolVec2Extensions<"int"> & NumVec2Extensions<"int"> & IntOrVecExtensions<"ivec2">
: TNodeType extends "uvec2"
? NumOrBoolVec2Extensions<"uint"> & NumVec2Extensions<"uint"> & IntOrVecExtensions<"uvec2">
: TNodeType extends "bvec2" ? NumOrBoolVec2Extensions<"bool"> & BoolOrVecExtensions
: TNodeType extends "vec3" ?
& NumOrBoolVec3Extensions<"float">
& Vec3Extensions
& NumVec3Extensions<"float">
& FloatVecExtensions<"vec3">
: TNodeType extends "ivec3" ? NumOrBoolVec3Extensions<"int"> & NumVec3Extensions<"int">
: TNodeType extends "uvec3" ? NumOrBoolVec3Extensions<"uint"> & NumVec3Extensions<"uint">
: TNodeType extends "bvec3" ? NumOrBoolVec3Extensions<"bool">
& FloatOrVecExtensions<"vec3">
: TNodeType extends "ivec3"
? NumOrBoolVec3Extensions<"int"> & NumVec3Extensions<"int"> & IntOrVecExtensions<"ivec3">
: TNodeType extends "uvec3"
? NumOrBoolVec3Extensions<"uint"> & NumVec3Extensions<"uint"> & IntOrVecExtensions<"uvec3">
: TNodeType extends "bvec3" ? NumOrBoolVec3Extensions<"bool"> & BoolOrVecExtensions
: TNodeType extends "vec4" ?
& NumOrBoolVec4Extensions<"float">
& Vec4Extensions
& NumVec4Extensions<"float">
& FloatVecExtensions<"vec4">
: TNodeType extends "ivec4" ? NumOrBoolVec4Extensions<"int"> & NumVec4Extensions<"int">
: TNodeType extends "uvec4" ? NumOrBoolVec4Extensions<"uint"> & NumVec4Extensions<"uint">
: TNodeType extends "bvec4" ? NumOrBoolVec4Extensions<"bool">
& FloatOrVecExtensions<"vec4">
: TNodeType extends "ivec4"
? NumOrBoolVec4Extensions<"int"> & NumVec4Extensions<"int"> & IntOrVecExtensions<"ivec4">
: TNodeType extends "uvec4"
? NumOrBoolVec4Extensions<"uint"> & NumVec4Extensions<"uint"> & IntOrVecExtensions<"uvec4">
: TNodeType extends "bvec4" ? NumOrBoolVec4Extensions<"bool"> & BoolOrVecExtensions
: TNodeType extends "color" ? ColorExtensions
: TNodeType extends "mat2" ? Mat2Extensions & MatExtensions<"mat2">
: TNodeType extends "mat3" ? Mat3Extensions & MatExtensions<"mat3">
Expand Down
Loading
Loading