ViewportNode.js 1.9 KB

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