ViewportNode.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import Node, { addNodeClass } from '../core/Node.js';
  2. import { NodeUpdateType } from '../core/constants.js';
  3. import { uniform } from '../core/UniformNode.js';
  4. import { Fn, nodeImmutable, vec2 } from '../shadernode/ShaderNode.js';
  5. import { Vector2 } from '../../math/Vector2.js';
  6. import { Vector4 } from '../../math/Vector4.js';
  7. let resolution, viewportResult;
  8. class ViewportNode extends Node {
  9. constructor( scope ) {
  10. super();
  11. this.scope = scope;
  12. this.isViewportNode = true;
  13. }
  14. getNodeType() {
  15. if ( this.scope === ViewportNode.VIEWPORT ) return 'vec4';
  16. else return 'vec2';
  17. }
  18. getUpdateType() {
  19. let updateType = NodeUpdateType.NONE;
  20. if ( this.scope === ViewportNode.RESOLUTION || this.scope === ViewportNode.VIEWPORT ) {
  21. updateType = NodeUpdateType.RENDER;
  22. }
  23. this.updateType = updateType;
  24. return updateType;
  25. }
  26. update( { renderer } ) {
  27. if ( this.scope === ViewportNode.VIEWPORT ) {
  28. renderer.getViewport( viewportResult );
  29. } else {
  30. renderer.getDrawingBufferSize( resolution );
  31. }
  32. }
  33. setup( /*builder*/ ) {
  34. const scope = this.scope;
  35. let output = null;
  36. if ( scope === ViewportNode.RESOLUTION ) {
  37. output = uniform( resolution || ( resolution = new Vector2() ) );
  38. } else if ( scope === ViewportNode.VIEWPORT ) {
  39. output = uniform( viewportResult || ( viewportResult = new Vector4() ) );
  40. } else {
  41. output = vec2( viewportCoordinate.div( viewportResolution ) );
  42. }
  43. return output;
  44. }
  45. generate( builder ) {
  46. if ( this.scope === ViewportNode.COORDINATE ) {
  47. let coord = builder.getFragCoord();
  48. if ( builder.isFlipY() ) {
  49. // follow webgpu standards
  50. const resolution = builder.getNodeProperties( viewportResolution ).outputNode.build( builder );
  51. coord = `${ builder.getType( 'vec2' ) }( ${ coord }.x, ${ resolution }.y - ${ coord }.y )`;
  52. }
  53. return coord;
  54. }
  55. return super.generate( builder );
  56. }
  57. }
  58. ViewportNode.COORDINATE = 'coordinate';
  59. ViewportNode.RESOLUTION = 'resolution';
  60. ViewportNode.VIEWPORT = 'viewport';
  61. ViewportNode.TOP_LEFT = 'topLeft';
  62. ViewportNode.BOTTOM_LEFT = 'bottomLeft';
  63. ViewportNode.TOP_RIGHT = 'topRight';
  64. ViewportNode.BOTTOM_RIGHT = 'bottomRight';
  65. export default ViewportNode;
  66. export const viewportCoordinate = nodeImmutable( ViewportNode, ViewportNode.COORDINATE );
  67. export const viewportResolution = nodeImmutable( ViewportNode, ViewportNode.RESOLUTION );
  68. export const viewport = nodeImmutable( ViewportNode, ViewportNode.VIEWPORT );
  69. export const viewportUV = nodeImmutable( ViewportNode, ViewportNode.TOP_LEFT );
  70. export const viewportTopLeft = /*@__PURE__*/ ( Fn( () => { // @deprecated, r168
  71. console.warn( 'TSL.ViewportNode: "viewportTopLeft" is deprecated. Use "viewportUV" instead.' );
  72. return viewportUV;
  73. }, 'vec2' ).once() )();
  74. export const viewportBottomLeft = /*@__PURE__*/ ( Fn( () => { // @deprecated, r168
  75. console.warn( 'TSL.ViewportNode: "viewportBottomLeft" is deprecated. Use "viewportUV.flipY()" instead.' );
  76. return viewportUV.flipY();
  77. }, 'vec2' ).once() )();
  78. addNodeClass( 'ViewportNode', ViewportNode );
粤ICP备19079148号