ViewportNode.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import Node, { addNodeClass } from '../core/Node.js';
  2. import { NodeUpdateType } from '../core/constants.js';
  3. import { uniform } from '../core/UniformNode.js';
  4. import { nodeImmutable, vec2 } from '../shadernode/ShaderNode.js';
  5. import { Vector2 } from 'three';
  6. let resolution;
  7. class ViewportNode extends Node {
  8. constructor( scope ) {
  9. super();
  10. this.scope = scope;
  11. this.isViewportNode = true;
  12. }
  13. getNodeType() {
  14. return this.scope === ViewportNode.COORDINATE ? 'vec4' : 'vec2';
  15. }
  16. getUpdateType() {
  17. let updateType = NodeUpdateType.NONE;
  18. if ( this.scope === ViewportNode.RESOLUTION ) {
  19. updateType = NodeUpdateType.FRAME;
  20. }
  21. this.updateType = updateType;
  22. return updateType;
  23. }
  24. update( { renderer } ) {
  25. renderer.getDrawingBufferSize( resolution );
  26. }
  27. construct( builder ) {
  28. const scope = this.scope;
  29. if ( scope === ViewportNode.COORDINATE ) return;
  30. let output = null;
  31. if ( scope === ViewportNode.RESOLUTION ) {
  32. output = uniform( resolution || ( resolution = new Vector2() ) );
  33. } else {
  34. const coordinateNode = vec2( new ViewportNode( ViewportNode.COORDINATE ) );
  35. const resolutionNode = new ViewportNode( ViewportNode.RESOLUTION );
  36. output = coordinateNode.div( resolutionNode );
  37. let outX = output.x;
  38. let outY = output.y;
  39. if ( /top/i.test( scope ) && builder.isFlipY() ) outY = outY.oneMinus();
  40. else if ( /bottom/i.test( scope ) && builder.isFlipY() === false ) outY = outY.oneMinus();
  41. if ( /right/i.test( scope ) ) outX = outX.oneMinus();
  42. output = vec2( outX, outY );
  43. }
  44. return output;
  45. }
  46. generate( builder ) {
  47. if ( this.scope === ViewportNode.COORDINATE ) {
  48. return builder.getFragCoord();
  49. }
  50. return super.generate( builder );
  51. }
  52. }
  53. ViewportNode.COORDINATE = 'coordinate';
  54. ViewportNode.RESOLUTION = 'resolution';
  55. ViewportNode.TOP_LEFT = 'topLeft';
  56. ViewportNode.BOTTOM_LEFT = 'bottomLeft';
  57. ViewportNode.TOP_RIGHT = 'topRight';
  58. ViewportNode.BOTTOM_RIGHT = 'bottomRight';
  59. export default ViewportNode;
  60. export const viewportCoordinate = nodeImmutable( ViewportNode, ViewportNode.COORDINATE );
  61. export const viewportResolution = nodeImmutable( ViewportNode, ViewportNode.RESOLUTION );
  62. export const viewportTopLeft = nodeImmutable( ViewportNode, ViewportNode.TOP_LEFT );
  63. export const viewportBottomLeft = nodeImmutable( ViewportNode, ViewportNode.BOTTOM_LEFT );
  64. export const viewportTopRight = nodeImmutable( ViewportNode, ViewportNode.TOP_RIGHT );
  65. export const viewportBottomRight = nodeImmutable( ViewportNode, ViewportNode.BOTTOM_RIGHT );
  66. addNodeClass( ViewportNode );