ViewportTextureNode.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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, LinearMipmapLinearFilter } from 'three';
  7. const _size = new Vector2();
  8. class ViewportTextureNode extends TextureNode {
  9. constructor( uvNode = viewportTopLeft, levelNode = null, framebufferTexture = null ) {
  10. if ( framebufferTexture === null ) {
  11. framebufferTexture = new FramebufferTexture();
  12. framebufferTexture.minFilter = LinearMipmapLinearFilter;
  13. }
  14. super( framebufferTexture, uvNode, levelNode );
  15. this.generateMipmaps = false;
  16. this.isOutputTextureNode = true;
  17. this.updateBeforeType = NodeUpdateType.FRAME;
  18. }
  19. updateBefore( frame ) {
  20. const renderer = frame.renderer;
  21. renderer.getDrawingBufferSize( _size );
  22. //
  23. const framebufferTexture = this.value;
  24. if ( framebufferTexture.image.width !== _size.width || framebufferTexture.image.height !== _size.height ) {
  25. framebufferTexture.image.width = _size.width;
  26. framebufferTexture.image.height = _size.height;
  27. framebufferTexture.needsUpdate = true;
  28. }
  29. //
  30. const currentGenerateMipmaps = framebufferTexture.generateMipmaps;
  31. framebufferTexture.generateMipmaps = this.generateMipmaps;
  32. renderer.copyFramebufferToTexture( framebufferTexture );
  33. framebufferTexture.generateMipmaps = currentGenerateMipmaps;
  34. }
  35. clone() {
  36. const viewportTextureNode = new this.constructor( this.uvNode, this.levelNode, this.value );
  37. viewportTextureNode.generateMipmaps = this.generateMipmaps;
  38. return viewportTextureNode;
  39. }
  40. }
  41. export default ViewportTextureNode;
  42. export const viewportTexture = nodeProxy( ViewportTextureNode );
  43. export const viewportMipTexture = nodeProxy( ViewportTextureNode, null, null, { generateMipmaps: true } );
  44. addNodeElement( 'viewportTexture', viewportTexture );
  45. addNodeElement( 'viewportMipTexture', viewportMipTexture );
  46. addNodeClass( 'ViewportTextureNode', ViewportTextureNode );