ViewportTextureNode.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import TextureNode from '../accessors/TextureNode.js';
  2. import { NodeUpdateType } from '../core/constants.js';
  3. import { addNodeClass } from '../core/Node.js';
  4. import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
  5. import { viewportTopLeft } from './ViewportNode.js';
  6. import { Vector2, FramebufferTexture } from 'three';
  7. const _size = new Vector2();
  8. class ViewportTextureNode extends TextureNode {
  9. constructor( uv = viewportTopLeft, level = null ) {
  10. super( null, uv, level );
  11. this.isOutputTextureNode = true;
  12. this.updateBeforeType = NodeUpdateType.FRAME;
  13. }
  14. constructFramebuffer( /*builder*/ ) {
  15. return new FramebufferTexture();
  16. }
  17. construct( builder ) {
  18. if ( this.value === null ) this.value = this.constructFramebuffer( builder );
  19. return super.construct( builder );
  20. }
  21. updateBefore( frame ) {
  22. const renderer = frame.renderer;
  23. renderer.getDrawingBufferSize( _size );
  24. //
  25. const framebufferTexture = this.value;
  26. if ( framebufferTexture.image.width !== _size.width || framebufferTexture.image.height !== _size.height ) {
  27. framebufferTexture.image.width = _size.width;
  28. framebufferTexture.image.height = _size.height;
  29. framebufferTexture.needsUpdate = true;
  30. }
  31. //
  32. renderer.copyFramebufferToTexture( framebufferTexture );
  33. }
  34. }
  35. export default ViewportTextureNode;
  36. export const viewportTexture = nodeProxy( ViewportTextureNode );
  37. addNodeElement( 'viewportTexture', viewportTexture );
  38. addNodeClass( ViewportTextureNode );