Skip to content

Commit

Permalink
WebGPURenderer: ReflectorNode + Examples (#787)
Browse files Browse the repository at this point in the history
* WebGPURenderer: ReflectorNode + Examples

* Fix

* Update three.js

* Add examples

* getMaxAnisotropy

* Updates

* Update patch

* Delete examples

* Fix
  • Loading branch information
Methuselah96 committed Jan 25, 2024
1 parent 8b5efd3 commit 5305474
Show file tree
Hide file tree
Showing 12 changed files with 141 additions and 28 deletions.
81 changes: 60 additions & 21 deletions examples-testing/changes.patch
Original file line number Diff line number Diff line change
Expand Up @@ -13861,12 +13861,53 @@ index b8fb383..0bcc65c 100644

const gui = new GUI();

diff --git a/examples-testing/examples/webgpu_materials_texture_anisotropy.ts b/examples-testing/examples/webgpu_materials_texture_anisotropy.ts
index 00672da..cf96e31 100644
--- a/examples-testing/examples/webgpu_materials_texture_anisotropy.ts
+++ b/examples-testing/examples/webgpu_materials_texture_anisotropy.ts
@@ -3,9 +3,9 @@ import * as THREE from 'three';
import Stats from 'three/addons/libs/stats.module.js';
import WebGPURenderer from 'three/addons/renderers/webgpu/WebGPURenderer.js';

-let container, stats;
+let container: HTMLDivElement, stats: Stats;

-let camera, scene1, scene2, renderer;
+let camera: THREE.PerspectiveCamera, scene1: THREE.Scene, scene2: THREE.Scene, renderer: WebGPURenderer;

let mouseX = 0,
mouseY = 0;
@@ -76,11 +76,11 @@ async function init() {
texture2.repeat.set(512, 512);

if (maxAnisotropy > 0) {
- document.getElementById('val_left').innerHTML = texture1.anisotropy;
- document.getElementById('val_right').innerHTML = texture2.anisotropy;
+ document.getElementById('val_left')!.innerHTML = texture1.anisotropy.toString();
+ document.getElementById('val_right')!.innerHTML = texture2.anisotropy.toString();
} else {
- document.getElementById('val_left').innerHTML = 'not supported';
- document.getElementById('val_right').innerHTML = 'not supported';
+ document.getElementById('val_left')!.innerHTML = 'not supported';
+ document.getElementById('val_right')!.innerHTML = 'not supported';
}

//
@@ -115,7 +115,7 @@ function onWindowResize() {
renderer.setSize(window.innerWidth, window.innerHeight);
}

-function onDocumentMouseMove(event) {
+function onDocumentMouseMove(event: MouseEvent) {
const windowHalfX = window.innerWidth / 2;
const windowHalfY = window.innerHeight / 2;

diff --git a/examples-testing/examples/webgpu_materials_video.ts b/examples-testing/examples/webgpu_materials_video.ts
index f50456f..59ec321 100644
index fbbabfc..a1a82bd 100644
--- a/examples-testing/examples/webgpu_materials_video.ts
+++ b/examples-testing/examples/webgpu_materials_video.ts
@@ -3,11 +3,14 @@ import * as THREE from 'three';
import WebGPU from 'three/addons/capabilities/WebGPU.js';
@@ -2,11 +2,14 @@ import * as THREE from 'three';

import WebGPURenderer from 'three/addons/renderers/webgpu/WebGPURenderer.js';

-let container;
Expand All @@ -13883,7 +13924,7 @@ index f50456f..59ec321 100644

let mouseX = 0;
let mouseY = 0;
@@ -15,14 +18,14 @@ let mouseY = 0;
@@ -14,20 +17,20 @@ let mouseY = 0;
let windowHalfX = window.innerWidth / 2;
let windowHalfY = window.innerHeight / 2;

Expand All @@ -13902,16 +13943,14 @@ index f50456f..59ec321 100644
startButton.addEventListener('click', function () {
init();
});
@@ -34,7 +37,7 @@ function init() {
throw new Error('No WebGPU support');
}

function init() {
- const overlay = document.getElementById('overlay');
+ const overlay = document.getElementById('overlay')!;
overlay.remove();

container = document.createElement('div');
@@ -55,7 +58,7 @@ function init() {
@@ -48,7 +51,7 @@ function init() {
renderer.setAnimationLoop(render);
container.appendChild(renderer.domElement);

Expand All @@ -13920,7 +13959,7 @@ index f50456f..59ec321 100644
video.play();
video.addEventListener('play', function () {
this.currentTime = 3;
@@ -131,7 +134,7 @@ function onWindowResize() {
@@ -124,7 +127,7 @@ function onWindowResize() {
renderer.setSize(window.innerWidth, window.innerHeight);
}

Expand All @@ -13929,7 +13968,7 @@ index f50456f..59ec321 100644
const uvs = geometry.attributes.uv.array;

for (let i = 0; i < uvs.length; i += 2) {
@@ -140,7 +143,7 @@ function change_uvs(geometry, unitx, unity, offsetx, offsety) {
@@ -133,7 +136,7 @@ function change_uvs(geometry, unitx, unity, offsetx, offsety) {
}
}

Expand All @@ -13938,7 +13977,7 @@ index f50456f..59ec321 100644
mouseX = event.clientX - windowHalfX;
mouseY = (event.clientY - windowHalfY) * 0.3;
}
@@ -161,20 +164,20 @@ function render() {
@@ -154,20 +157,20 @@ function render() {
for (let i = 0; i < cube_count; i++) {
material = materials[i];

Expand Down Expand Up @@ -13966,7 +14005,7 @@ index f50456f..59ec321 100644
}
}

@@ -182,8 +185,8 @@ function render() {
@@ -175,8 +178,8 @@ function render() {
for (let i = 0; i < cube_count; i++) {
mesh = meshes[i];

Expand Down Expand Up @@ -14114,28 +14153,28 @@ index 4184cb4..f6d36c0 100644

torusKnot.rotation.x += 0.25 * delta;
diff --git a/examples-testing/examples/webgpu_video_panorama.ts b/examples-testing/examples/webgpu_video_panorama.ts
index 527cc17..eb03f96 100644
index c6e051f..dca0db3 100644
--- a/examples-testing/examples/webgpu_video_panorama.ts
+++ b/examples-testing/examples/webgpu_video_panorama.ts
@@ -3,7 +3,7 @@ import * as THREE from 'three';
import WebGPU from 'three/addons/capabilities/WebGPU.js';
@@ -2,7 +2,7 @@ import * as THREE from 'three';

import WebGPURenderer from 'three/addons/renderers/webgpu/WebGPURenderer.js';

-let camera, scene, renderer;
+let camera: THREE.PerspectiveCamera, scene: THREE.Scene, renderer: WebGPURenderer;

let isUserInteracting = false,
lon = 0,
@@ -26,7 +26,7 @@ function init() {
throw new Error('No WebGPU support');
}
@@ -19,7 +19,7 @@ const distance = 0.5;
init();

function init() {
- const container = document.getElementById('container');
+ const container = document.getElementById('container')!;

camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.25, 10);

@@ -36,7 +36,7 @@ function init() {
@@ -29,7 +29,7 @@ function init() {
// invert the geometry on the x-axis so that all of the faces point inward
geometry.scale(-1, 1, 1);

Expand All @@ -14144,7 +14183,7 @@ index 527cc17..eb03f96 100644
video.play();

const texture = new THREE.VideoTexture(video);
@@ -68,7 +68,7 @@ function onWindowResize() {
@@ -61,7 +61,7 @@ function onWindowResize() {
renderer.setSize(window.innerWidth, window.innerHeight);
}

Expand All @@ -14153,7 +14192,7 @@ index 527cc17..eb03f96 100644
isUserInteracting = true;

onPointerDownPointerX = event.clientX;
@@ -78,7 +78,7 @@ function onPointerDown(event) {
@@ -71,7 +71,7 @@ function onPointerDown(event) {
onPointerDownLat = lat;
}

Expand Down
3 changes: 3 additions & 0 deletions examples-testing/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,7 @@ const files = {
// 'webgpu_occlusion',
// 'webgpu_particles',
// 'webgpu_portal',
// 'webgpu_reflection',
// 'webgpu_rtt',
// 'webgpu_sandbox',
// 'webgpu_shadertoy',
Expand All @@ -374,7 +375,9 @@ const files = {
// 'webgpu_tsl_transpiler',
'webgpu_video_panorama',
'webgpu_postprocessing_afterimage',
// 'webgpu_mirror',
// 'webgpu_multisampled_renderbuffers',
'webgpu_materials_texture_anisotropy',
],
webaudio: ['webaudio_orientation', 'webaudio_sandbox', 'webaudio_timing', 'webaudio_visualizer'],
webxr: [
Expand Down
2 changes: 1 addition & 1 deletion three.js
Submodule three.js updated 38 files
+53 −16 build/three.cjs
+53 −16 build/three.module.js
+1 −1 build/three.module.min.js
+4 −1 examples/files.json
+2 −1 examples/jsm/nodes/Nodes.js
+2 −3 examples/jsm/nodes/accessors/CameraNode.js
+2 −13 examples/jsm/nodes/core/NodeBuilder.js
+16 −8 examples/jsm/nodes/core/NodeFrame.js
+1 −0 examples/jsm/nodes/core/constants.js
+1 −1 examples/jsm/nodes/display/GaussianBlurNode.js
+1 −1 examples/jsm/nodes/lighting/LightsNode.js
+4 −4 examples/jsm/nodes/materials/NodeMaterial.js
+1 −7 examples/jsm/nodes/materials/SpriteNodeMaterial.js
+9 −0 examples/jsm/nodes/shadernode/ShaderNode.js
+2 −2 examples/jsm/nodes/utils/JoinNode.js
+227 −0 examples/jsm/nodes/utils/ReflectorNode.js
+32 −7 examples/jsm/nodes/utils/RotateNode.js
+1 −9 examples/jsm/nodes/utils/RotateUVNode.js
+4 −4 examples/jsm/nodes/utils/SplitNode.js
+2 −0 examples/jsm/renderers/common/Backend.js
+4 −4 examples/jsm/renderers/common/Pipelines.js
+184 −12 examples/jsm/renderers/common/Renderer.js
+76 −4 examples/jsm/renderers/webgl/WebGLBackend.js
+8 −8 examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js
+3 −3 examples/jsm/renderers/webgpu/WebGPUBackend.js
+5 −0 examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js
+24 −3 examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js
+ examples/screenshots/webgpu_materials_texture_anisotropy.jpg
+ examples/screenshots/webgpu_mirror.jpg
+ examples/screenshots/webgpu_reflection.jpg
+ examples/screenshots/webgpu_video_panorama.jpg
+245 −0 examples/webgpu_materials_texture_anisotropy.html
+0 −9 examples/webgpu_materials_video.html
+224 −0 examples/webgpu_mirror.html
+6 −2 examples/webgpu_occlusion.html
+206 −0 examples/webgpu_reflection.html
+0 −9 examples/webgpu_video_panorama.html
+2 −1 test/e2e/puppeteer.js
2 changes: 2 additions & 0 deletions types/three/examples/jsm/nodes/Nodes.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ export {
triplanarTextures,
triplanarTexture,
} from './utils/TriplanarTexturesNode.js';
export { default as ReflectorNode, reflector, ReflectorNodeParameters } from './utils/ReflectorNode.js';

// shader node
export * from './shadernode/ShaderNode.js';
Expand Down Expand Up @@ -322,6 +323,7 @@ export {
depthPixel,
ViewportDepthNodeScope,
} from './display/ViewportDepthNode.js';
export { default as GaussianBlurNode, gaussianBlur } from './display/GaussianBlurNode.js';
export { default as AfterImageNode, afterImage } from './display/AfterImageNode.js';

export { default as PassNode, pass, depthPass, PassNodeScope } from './display/PassNode.js';
Expand Down
4 changes: 2 additions & 2 deletions types/three/examples/jsm/nodes/accessors/CubeTextureNode.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import { NodeRepresentation, ShaderNodeObject } from '../shadernode/ShaderNode.j

export default class CubeTextureNode extends TextureNode {
isCubeTextureNode: boolean;
uvNode: Node | null;
levelNode: Node | null;
uvNode: ShaderNodeObject<Node> | null;
levelNode: ShaderNodeObject<Node> | null;

constructor(value: CubeTexture, uvNode?: Node | null, levelNode?: Node | null);

Expand Down
6 changes: 3 additions & 3 deletions types/three/examples/jsm/nodes/accessors/TextureNode.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import { NodeRepresentation, ShaderNodeObject } from '../shadernode/ShaderNode.j
export default class TextureNode extends UniformNode<Texture> {
isTextureNode: true;

uvNode: Node | null;
levelNode: Node | null;
uvNode: ShaderNodeObject<Node> | null;
levelNode: ShaderNodeObject<Node> | null;

constructor(value: Texture, uvNode?: Node, levelNode?: Node | null);
constructor(value: Texture, uvNode?: ShaderNodeObject<Node>, levelNode?: ShaderNodeObject<Node> | null);

getDefaultUV(): Node;

Expand Down
26 changes: 26 additions & 0 deletions types/three/examples/jsm/nodes/display/GaussianBlurNode.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Vector2 } from '../../../../src/Three.js';
import TempNode from '../core/TempNode.js';
import TextureNode from '../accessors/TextureNode.js';
import Node from '../core/Node.js';
import { NodeRepresentation, ShaderNodeObject } from '../shadernode/ShaderNode.js';

export default class GaussianBlurNode extends TempNode {
textureNode: TextureNode;
sigma: number;

directionNode: Node;

resolution: Vector2;

constructor(textureNode: TextureNode, sigma?: number);

setSize(width: number, height: number): void;
}

export const gaussianBlur: (node: NodeRepresentation, sigma?: number) => ShaderNodeObject<GaussianBlurNode>;

declare module '../shadernode/ShaderNode.js' {
interface NodeElements {
gaussianBlur: typeof gaussianBlur;
}
}
3 changes: 2 additions & 1 deletion types/three/examples/jsm/nodes/display/PassNode.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Camera, RenderTarget, Scene, Texture } from '../../../../src/Three.js';
import { ShaderNodeObject } from '../shadernode/ShaderNode.js';
import TempNode from '../core/TempNode.js';
import TextureNode from '../accessors/TextureNode.js';
import Node from '../core/Node.js';

declare class PassTextureNode extends TextureNode {
passNode: PassNode;
Expand All @@ -24,7 +25,7 @@ export default class PassNode extends TempNode {

getTextureDepthNode(): ShaderNodeObject<PassTextureNode>;

getDepthNode(): Node;
getDepthNode(): ShaderNodeObject<Node>;

setSize(width: number, height: number): void;

Expand Down
30 changes: 30 additions & 0 deletions types/three/examples/jsm/nodes/utils/ReflectorNode.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { Camera, Object3D, RenderTarget } from '../../../../src/Three.js';
import TextureNode from '../accessors/TextureNode.js';
import { ShaderNodeObject } from '../shadernode/ShaderNode.js';

export interface ReflectorNodeParameters {
target?: Object3D | undefined;
resolution?: number | undefined;
generateMipmaps?: boolean | undefined;
bounces?: boolean | undefined;
}

export default class ReflectorNode extends TextureNode {
target: Object3D;
resolution: number;
generateMipmaps: boolean;
bounces: boolean;

virtualCameras: WeakMap<Camera, Camera>;
renderTargets: WeakMap<Camera, RenderTarget>;

constructor(parameters?: ReflectorNodeParameters);

getTextureNode(): TextureNode;

getVirtualCamera(camera: Camera): Camera;

getRenderTarget(camera: Camera): RenderTarget;
}

export const reflector: (parameters?: ReflectorNodeParameters) => ShaderNodeObject<ReflectorNode>;
6 changes: 6 additions & 0 deletions types/three/examples/jsm/renderers/common/Renderer.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@ export default class Renderer {

renderAsync(scene: Scene, camera: Camera): Promise<void>;

getMaxAnisotropy(): number;

getActiveCubeFace(): number;

getActiveMipmapLevel(): number;

setAnimationLoop(callback: ((time: DOMHighResTimeStamp) => void) | null): Promise<void>;

/**
Expand Down
2 changes: 2 additions & 0 deletions types/three/examples/jsm/renderers/webgl/WebGLBackend.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ export default class WebGLBackend extends Backend {
constructor(parameters?: BackendParameters);

get coordinateSystem(): CoordinateSystem;

getMaxAnisotropy(): number;
}
4 changes: 4 additions & 0 deletions types/three/examples/jsm/renderers/webgpu/WebGPUBackend.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,8 @@ export default class WebGPUBackend extends Backend {
constructor(parameters?: WebGPUBackendParameters);

get coordinateSystem(): CoordinateSystem;

// utils public

getMaxAnisotropy(): number;
}

0 comments on commit 5305474

Please sign in to comment.