Spaces:
Running
Running
File size: 2,005 Bytes
a28eca3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
import { NodeMaterial } from 'three/webgpu';
import { nodeObject, Fn, vec4, uv, If, mod, screenCoordinate } from 'three/tsl';
import StereoCompositePassNode from './StereoCompositePassNode.js';
/** @module ParallaxBarrierPassNode **/
/**
* A render pass node that creates a parallax barrier effect.
*
* @augments StereoCompositePassNode
*/
class ParallaxBarrierPassNode extends StereoCompositePassNode {
static get type() {
return 'ParallaxBarrierPassNode';
}
/**
* Constructs a new parallax barrier pass node.
*
* @param {Scene} scene - The scene to render.
* @param {Camera} camera - The camera to render the scene with.
*/
constructor( scene, camera ) {
super( scene, camera );
/**
* This flag can be used for type testing.
*
* @type {Boolean}
* @readonly
* @default true
*/
this.isParallaxBarrierPassNode = true;
}
/**
* This method is used to setup the effect's TSL code.
*
* @param {NodeBuilder} builder - The current node builder.
* @return {PassTextureNode}
*/
setup( builder ) {
const uvNode = uv();
const parallaxBarrier = Fn( () => {
const color = vec4().toVar();
If( mod( screenCoordinate.y, 2 ).greaterThan( 1 ), () => {
color.assign( this._mapLeft.sample( uvNode ) );
} ).Else( () => {
color.assign( this._mapRight.sample( uvNode ) );
} );
return color;
} );
const material = this._material || ( this._material = new NodeMaterial() );
material.fragmentNode = parallaxBarrier().context( builder.getSharedContext() );
material.needsUpdate = true;
return super.setup( builder );
}
}
export default ParallaxBarrierPassNode;
/**
* TSL function for creating an parallax barrier pass node.
*
* @function
* @param {Scene} scene - The scene to render.
* @param {Camera} camera - The camera to render the scene with.
* @returns {ParallaxBarrierPassNode}
*/
export const parallaxBarrierPass = ( scene, camera ) => nodeObject( new ParallaxBarrierPassNode( scene, camera ) );
|