123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- import Node from '../core/Node.js';
- import { uniform, div, vec2, invert } from '../shadernode/ShaderNodeBaseElements.js';
- import { Vector2 } from 'three';
- import { NodeUpdateType } from '../core/constants.js';
- let resolution;
- class ViewportNode extends Node {
- constructor( scope ) {
- super();
- this.scope = scope;
- this.isViewportNode = true;
- }
- getNodeType() {
- return this.scope === ViewportNode.COORDINATE ? 'vec4' : 'vec2';
- }
- getUpdateType() {
- let updateType = NodeUpdateType.NONE;
- if ( this.scope === ViewportNode.RESOLUTION ) {
- updateType = NodeUpdateType.FRAME;
- }
- this.updateType = updateType;
- return updateType;
- }
- update( { renderer } ) {
- renderer.getSize( resolution );
- }
- construct( builder ) {
- const scope = this.scope;
- if ( scope === ViewportNode.COORDINATE ) return;
- let output = null;
- if ( scope === ViewportNode.RESOLUTION ) {
- output = uniform( resolution || ( resolution = new Vector2() ) );
- } else {
- const coordinateNode = vec2( new ViewportNode( ViewportNode.COORDINATE ) );
- const resolutionNode = new ViewportNode( ViewportNode.RESOLUTION );
- output = div( coordinateNode, resolutionNode );
- let outX = output.x;
- let outY = output.y;
- if ( /top/i.test( scope ) && builder.isFlipY() ) outY = invert( outY );
- else if ( /bottom/i.test( scope ) && builder.isFlipY() === false ) outY = invert( outY );
- if ( /right/i.test( scope ) ) outX = invert( outX );
- output = vec2( outX, outY );
- }
- return output;
- }
- generate( builder ) {
- if ( this.scope === ViewportNode.COORDINATE ) {
- return builder.getFragCoord();
- }
- return super.generate( builder );
- }
- }
- ViewportNode.COORDINATE = 'coordinate';
- ViewportNode.RESOLUTION = 'resolution';
- ViewportNode.TOP_LEFT = 'topLeft';
- ViewportNode.BOTTOM_LEFT = 'bottomLeft';
- ViewportNode.TOP_RIGHT = 'topRight';
- ViewportNode.BOTTOM_RIGHT = 'bottomRight';
- export default ViewportNode;
|