Skip to content

Commit 4892820

Browse files
authored
TSL: Improve types for Fn (#2051)
* Add some tests * Update patch and delete TSL test file * Delete changes.patch * Update patch and delete TSL test file * Add TSL test file * Update patch and delete TSL test file * Update patch and delete TSL test file * Add tests for color constructor function * Update float * Revert Fn changes for now * Update * Updates * Keep that one * Add examples * Update patch and delete examples * Revert constructor changes * Add nodeObject tests * Remove NodeObjectOption * Update Proxied to (hopefully) be correct * Add examples * Update scatteringNode * Delete examples * Remove distracting tests * Add sources * Add jsdoc * Update patch and delete jsdoc * Add test * Remove tests * Format * Narrow Layout parameter * Add examples * Better layout type * Delete examples * Naming * stash * Temp fix * Remove for now
1 parent b02dc3b commit 4892820

File tree

19 files changed

+393
-300
lines changed

19 files changed

+393
-300
lines changed

.github/workflows/CI.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ jobs:
9494
- run: pnpm install
9595
- run: pnpm run build-declarations
9696
working-directory: jsdoc-testing
97-
- run: git apply changes.patch --allow-empty
97+
- run: git apply changes.patch
9898
working-directory: jsdoc-testing
9999
- run: pnpm run format-dprint
100100
working-directory: jsdoc-testing
@@ -118,6 +118,10 @@ jobs:
118118
working-directory: tsl-testing
119119
- run: pnpm run type-check
120120
working-directory: tsl-testing
121+
- run: pnpm generate-tsl-test
122+
working-directory: tsl-testing
123+
- run: git apply changes.patch --allow-empty
124+
working-directory: tsl-testing
121125
- run: pnpm run format-check
122126
working-directory: tsl-testing
123127
- run: pnpm run test

examples-testing/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ for (const section of Object.values(examplesFiles)) {
108108
encoding: 'utf-8',
109109
});
110110
const results = re.exec(fileContents);
111-
const options = await prettier.resolveConfig(file);
111+
const options = await prettier.resolveConfig(import.meta.filename);
112112
const formattedFile = await prettier.format(results[1], { ...options, parser: 'babel' });
113113
fs.writeFileSync(path.join(outDir, `${file}.ts`), formattedFile);
114114
}

jsdoc-testing/changes.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9901,7 +9901,7 @@ index 7f8da84d3..b25508365 100644
99019901
+
99029902
+export default SpriteNodeMaterial;
99039903
diff --git a/jsdoc-testing/jsdoc/materials/nodes/VolumeNodeMaterial.d.ts b/jsdoc-testing/jsdoc/materials/nodes/VolumeNodeMaterial.d.ts
9904-
index 8b5885c3c..961cefb6a 100644
9904+
index 8b5885c3c..6175b46ab 100644
99059905
--- a/jsdoc-testing/jsdoc/materials/nodes/VolumeNodeMaterial.d.ts
99069906
+++ b/jsdoc-testing/jsdoc/materials/nodes/VolumeNodeMaterial.d.ts
99079907
@@ -1,28 +1,12 @@
@@ -9956,7 +9956,7 @@ index 8b5885c3c..961cefb6a 100644
99569956
*/
99579957
- scatteringNode: Function | FunctionNode<vec4>;
99589958
- side: number;
9959-
+ scatteringNode: (params: { positionRay: Node }) => Node | null;
9959+
+ scatteringNode: (params: { positionRay: Node<"vec3"> }) => Node | null;
99609960
+}
99619961
+
99629962
+// eslint-disable-next-line @typescript-eslint/no-empty-interface

tsl-testing/.prettierrc.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"$schema": "http://json.schemastore.org/prettierrc",
3+
"arrowParens": "avoid",
4+
"singleQuote": true,
5+
"trailingComma": "all",
6+
"tabWidth": 4,
7+
"printWidth": 120
8+
}

tsl-testing/TSLCore.test.ts

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import { expect, test } from 'vitest';
2+
import { nodeObject, vec3 } from 'three/tsl';
3+
import * as THREE from 'three/webgpu';
4+
5+
const renderer = new THREE.WebGPURenderer();
6+
const nodeBuilder: THREE.NodeBuilder = renderer.backend.createNodeBuilder(null!, renderer);
7+
8+
test('nodeObject(Node)', () => {
9+
const testVec3 = vec3(1, 0, 2);
10+
const result: typeof testVec3 = nodeObject(testVec3);
11+
expect(result).toStrictEqual(testVec3);
12+
});
13+
14+
test('nodeObject(number)', () => {
15+
const result: THREE.Node<'float'> = nodeObject(5);
16+
expect(result).toBeInstanceOf(THREE.Node);
17+
expect(result.getNodeType(nodeBuilder)).toBe('float');
18+
});
19+
20+
test('nodeObject(boolean)', () => {
21+
const result: THREE.Node<'bool'> = nodeObject(true);
22+
expect(result).toBeInstanceOf(THREE.Node);
23+
expect(result.getNodeType(nodeBuilder)).toBe('bool');
24+
});
25+
26+
test('nodeObject(string)', () => {
27+
const stringValue = 'test';
28+
const result: string = nodeObject(stringValue);
29+
expect(result).toStrictEqual(stringValue);
30+
});
31+
32+
test('nodeObject(Vector2)', () => {
33+
const result: THREE.Node<'vec2'> = nodeObject(new THREE.Vector2());
34+
expect(result).toBeInstanceOf(THREE.Node);
35+
expect(result.getNodeType(nodeBuilder)).toBe('vec2');
36+
});
37+
38+
test('nodeObject(Vector3)', () => {
39+
const result: THREE.Node<'vec3'> = nodeObject(new THREE.Vector3());
40+
expect(result).toBeInstanceOf(THREE.Node);
41+
expect(result.getNodeType(nodeBuilder)).toBe('vec3');
42+
});
43+
44+
test('nodeObject(Vector4)', () => {
45+
const result: THREE.Node<'vec4'> = nodeObject(new THREE.Vector4());
46+
expect(result).toBeInstanceOf(THREE.Node);
47+
expect(result.getNodeType(nodeBuilder)).toBe('vec4');
48+
});
49+
50+
test('nodeObject(Matrix2)', () => {
51+
const result: THREE.Node<'mat2'> = nodeObject(new THREE.Matrix2());
52+
expect(result).toBeInstanceOf(THREE.Node);
53+
expect(result.getNodeType(nodeBuilder)).toBe('mat2');
54+
});
55+
56+
test('nodeObject(Matrix3)', () => {
57+
const result: THREE.Node<'mat3'> = nodeObject(new THREE.Matrix3());
58+
expect(result).toBeInstanceOf(THREE.Node);
59+
expect(result.getNodeType(nodeBuilder)).toBe('mat3');
60+
});
61+
62+
test('nodeObject(Matrix4)', () => {
63+
const result: THREE.Node<'mat4'> = nodeObject(new THREE.Matrix4());
64+
expect(result).toBeInstanceOf(THREE.Node);
65+
expect(result.getNodeType(nodeBuilder)).toBe('mat4');
66+
});
67+
68+
test('nodeObject(Color)', () => {
69+
const result: THREE.Node<'color'> = nodeObject(new THREE.Color());
70+
expect(result).toBeInstanceOf(THREE.Node);
71+
expect(result.getNodeType(nodeBuilder)).toBe('color');
72+
});
73+
74+
test('nodeObject(ArrayBuffer)', () => {
75+
const result: THREE.Node<'ArrayBuffer'> = nodeObject(new ArrayBuffer(8));
76+
expect(result).toBeInstanceOf(THREE.Node);
77+
expect(result.getNodeType(nodeBuilder)).toBe('ArrayBuffer');
78+
});
79+
80+
test('nodeObject(object)', () => {
81+
const randomObject = { test: 5 };
82+
const result: typeof randomObject = nodeObject(randomObject);
83+
expect(result).toStrictEqual(randomObject);
84+
});

tsl-testing/TSLCore.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { vec2, vec3 } from "three/tsl";
2-
import * as THREE from "three/webgpu";
1+
import { Fn, uniform, vec2, vec3 } from 'three/tsl';
2+
import * as THREE from 'three/webgpu';
33

44
/**
55
* Setup
@@ -12,7 +12,7 @@ const testVec3 = vec3(1, 0, 2);
1212
* Access swizzle properties
1313
*/
1414

15-
const testVec2Swizzle: THREE.Node<"vec2"> = testVec3.xy;
15+
const testVec2Swizzle: THREE.Node<'vec2'> = testVec3.xy;
1616

1717
// vec2s don't have a z property
1818
// @ts-expect-error
@@ -100,3 +100,20 @@ testVec3.flipZX();
100100
// Disallow duplicate identifiers when flipping a vec swizzle property
101101
// @ts-expect-error
102102
testVec3.flipXX();
103+
104+
/**
105+
* Fn
106+
*/
107+
108+
// If the Node type is more specific, we shouldn't be able to pass in a more general Node type
109+
const test = Fn(([param]: [THREE.ConstNode<'float', number>]) => {
110+
return vec3(param);
111+
});
112+
113+
declare const floatConstNode: THREE.ConstNode<'float', number>;
114+
115+
test(floatConstNode);
116+
// @ts-expect-error
117+
test(5);
118+
// @ts-expect-error
119+
test(uniform(5));

tsl-testing/changes.patch

Whitespace-only changes.

tsl-testing/generate-tsl-test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import * as fs from 'node:fs';
2+
import * as path from 'node:path';
3+
4+
import prettier from 'prettier';
5+
6+
const files = ['nodes/tsl/TSLCore'];
7+
8+
const inDir = '../three.js/src';
9+
const outDir = './tsl-comments';
10+
11+
for (const file of files) {
12+
console.log(file);
13+
14+
const fileContents = fs.readFileSync(path.join(inDir, `${file}.js`), {
15+
encoding: 'utf-8',
16+
});
17+
const options = await prettier.resolveConfig(import.meta.filename);
18+
const formattedFile = await prettier.format(fileContents, {
19+
...options,
20+
parser: 'babel',
21+
});
22+
23+
const outFile = path.join(outDir, `${file}.js`);
24+
fs.mkdirSync(path.dirname(outFile), { recursive: true });
25+
fs.writeFileSync(outFile, formattedFile);
26+
}

0 commit comments

Comments
 (0)