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
20 changes: 19 additions & 1 deletion swizzle-generator.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@ for (let i = 0; i < 4; i++) {
}
}

let swizzleOptionsNoRepetitionContiguousOrdered = [];
for (let i = 0; i < 4; i++) {
swizzleOptionsNoRepetitionContiguousOrdered[i] = [];
for (let j = 0; j < 4; j++) {
swizzleOptionsNoRepetitionContiguousOrdered[i][j] = [];
}
}

let swizzleOptionsNoRepetitionOrdered = [];
for (let i = 0; i < 4; i++) {
swizzleOptionsNoRepetitionOrdered[i] = [];
Expand Down Expand Up @@ -67,6 +75,16 @@ function setProtoSwizzle(a, b, c, d) {
}
}

if (b == null || a === b - 1) {
if (c == null || b === c - 1) {
if (d == null || c === d - 1) {
swizzleOptionsNoRepetitionContiguousOrdered[numChars - 1][maxCharNum].push(prop);
swizzleOptionsNoRepetitionContiguousOrdered[numChars - 1][maxCharNum].push(altA);
swizzleOptionsNoRepetitionContiguousOrdered[numChars - 1][maxCharNum].push(altB);
}
}
}

if (b == null || a < b) {
if (c == null || a < c && b < c) {
if (d == null || c < d && b < d && a < d) {
Expand Down Expand Up @@ -128,7 +146,7 @@ for (let i = 0; i < 4; i++) {
console.log(`interface SetSwizzle${i + 1}<TNumOrBool extends NumOrBoolType> {`);
for (let j = 0; j <= i; j++) {
for (let k = 0; k <= i; k++) {
const arr = swizzleOptionsNoRepetitionOrdered[j][k];
const arr = swizzleOptionsNoRepetitionContiguousOrdered[j][k];
for (const val of arr) {
console.log(` set${val.toUpperCase()}(value: ${assignType[j]}): ${accessType[i]};`);
}
Expand Down
10 changes: 8 additions & 2 deletions tsl-testing/TSLCore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ testVec3.setXY(5);
// Allow passing a vec of the right size when setting a vec swizzle property
testVec3.setXY(testVec2);

// Allow elements that are not right next to each other
// Disallow elements that are not right next to each other, they are not handled properly
// @ts-expect-error
testVec3.setXZ(3);

// vec2s don't have a z property
Expand All @@ -64,6 +65,10 @@ testVec2.setXZ(testVec2);
// @ts-expect-error
testVec3.setXY(testVec3);

// Disallow elements that are not right next to each other, they are not handled properly
// @ts-expect-error
testVec3.setXZ(testVec2);

// Disallow duplicate identifiers when setting a vec swizzle property
// @ts-expect-error
testVec3.setXX(5);
Expand All @@ -87,7 +92,8 @@ testVec3.flipXZ();
// @ts-expect-error
testVec2.flipXZ();

// Disallow out-of-order identifiers, since they are sorted internally
// Disallow out-of-order identifiers. They are functionally identically to the sorted variant, and unnecessarily add to
// the number of available methods
// @ts-expect-error
testVec3.flipZX();

Expand Down
48 changes: 47 additions & 1 deletion tsl-testing/node-type.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { expect, test } from "vitest";
import { Fn, normalWorldGeometry, vec2, vec3 } from "three/tsl";
import { Fn, normalWorldGeometry, vec2, vec3, vec4 } from "three/tsl";
import * as THREE from "three/webgpu";

const renderer = new THREE.WebGPURenderer();
Expand Down Expand Up @@ -112,6 +112,23 @@ test("vec3(1, 0, 2).xz = 6", async () => {
renderer.render(scene, camera);
});

test("vec3(1, 0, 2).xz = vec2(2, 3)", async () => {
const fn = Fn(() => {
const testVec3 = vec3(1, 0, 2);
testVec3.xz = vec2(2, 3);
return testVec3;
});

const result: THREE.Node<"vec3"> = fn();

expect(result.getNodeType(nodeBuilder)).toBe("vec3");

scene.backgroundNode = result.debug();

await renderer.init();
renderer.render(scene, camera);
});

test("vec3(1, 0, 2).setXY(5)", async () => {
const testVec3Set: THREE.Node<"vec3"> = vec3(1, 0, 2).setXY(5);

Expand All @@ -123,7 +140,21 @@ test("vec3(1, 0, 2).setXY(5)", async () => {
renderer.render(scene, camera);
});

test("vec4(1, 0, 2, 5).setYZ(vec2(5, 3))", async () => {
const testVec3Set: THREE.Node<"vec4"> = vec4(1, 0, 2, 5).setYZ(vec2(5, 3));

expect(testVec3Set.getNodeType(nodeBuilder)).toBe("vec4");

scene.backgroundNode = testVec3Set.debug();

await renderer.init();
renderer.render(scene, camera);
});

test("vec3(1, 0, 2).setXZ(3)", async () => {
// This doesn't work as expected, the resulting output is:
// vec3<f32>( vec2<f32>( 3.0 ), vec3<f32>( 1.0, 0.0, 2.0 ).z )
// @ts-expect-error
const testVec3Set: THREE.Node<"vec3"> = vec3(1, 0, 2).setXZ(3);

expect(testVec3Set.getNodeType(nodeBuilder)).toBe("vec3");
Expand All @@ -134,6 +165,20 @@ test("vec3(1, 0, 2).setXZ(3)", async () => {
renderer.render(scene, camera);
});

test("vec3(1, 0, 2).setXZ(vec2(5, 3))", async () => {
// This doesn't work as expected, the resulting output is:
// vec3<f32>( vec2<f32>( 5.0, 3.0 ), vec3<f32>( 1.0, 0.0, 2.0 ).z )
// @ts-expect-error
const testVec3Set: THREE.Node<"vec3"> = vec3(1, 0, 2).setXZ(vec2(5, 3));

expect(testVec3Set.getNodeType(nodeBuilder)).toBe("vec3");

scene.backgroundNode = testVec3Set.debug();

await renderer.init();
renderer.render(scene, camera);
});

test("vec3(1, 0, 2).setYZ(3)", async () => {
const testVec3Set: THREE.Node<"vec3"> = vec3(1, 0, 2).setYZ(3);

Expand Down Expand Up @@ -179,6 +224,7 @@ test("vec3(1, 0, 2).flipXZ()", async () => {
});

test("vec3(1, 0, 2).flipZX()", async () => {
// This is functions correctly, but we don't include it to cut down on the number of methods
// @ts-expect-error
const testVec3Set: THREE.Node<"vec3"> = vec3(1, 0, 2).flipZX();

Expand Down
18 changes: 0 additions & 18 deletions types/three/src/nodes/tsl/TSLCore.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1371,9 +1371,6 @@ interface SetSwizzle3<TNumOrBool extends NumOrBoolType> {
setXY(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec3<TNumOrBool>>;
setRG(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec3<TNumOrBool>>;
setST(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec3<TNumOrBool>>;
setXZ(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec3<TNumOrBool>>;
setRB(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec3<TNumOrBool>>;
setSP(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec3<TNumOrBool>>;
setYZ(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec3<TNumOrBool>>;
setGB(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec3<TNumOrBool>>;
setTP(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec3<TNumOrBool>>;
Expand All @@ -1398,30 +1395,15 @@ interface SetSwizzle4<TNumOrBool extends NumOrBoolType> {
setXY(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setRG(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setST(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setXZ(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setRB(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setSP(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setYZ(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setGB(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setTP(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setXW(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setRA(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setSQ(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setYW(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setGA(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setTQ(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setZW(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setBA(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setPQ(value: Node<NumOrBoolToVec2<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setXYZ(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setRGB(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setSTP(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setXYW(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setRGA(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setSTQ(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setXZW(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setRBA(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setSPQ(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setYZW(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setGBA(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
setTPQ(value: Node<NumOrBoolToVec3<TNumOrBool>> | NumOrBool<TNumOrBool>): Node<NumOrBoolToVec4<TNumOrBool>>;
Expand Down