NodePostProcessing.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /**
  2. * @author sunag / http://www.sunag.com.br/
  3. */
  4. import {
  5. LinearFilter,
  6. Mesh,
  7. OrthographicCamera,
  8. PlaneBufferGeometry,
  9. RGBAFormat,
  10. Scene,
  11. Vector2,
  12. WebGLRenderTarget
  13. } from '../../../../build/three.module.js';
  14. import { NodeMaterial } from '../materials/NodeMaterial.js';
  15. import { ScreenNode } from '../inputs/ScreenNode.js';
  16. function NodePostProcessing( renderer, renderTarget ) {
  17. if ( renderTarget === undefined ) {
  18. var parameters = {
  19. minFilter: LinearFilter,
  20. magFilter: LinearFilter,
  21. format: RGBAFormat,
  22. stencilBuffer: false
  23. };
  24. var size = renderer.getDrawingBufferSize( new Vector2() );
  25. renderTarget = new WebGLRenderTarget( size.width, size.height, parameters );
  26. }
  27. this.renderer = renderer;
  28. this.renderTarget = renderTarget;
  29. this.output = new ScreenNode();
  30. this.material = new NodeMaterial();
  31. this.camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
  32. this.scene = new Scene();
  33. this.quad = new Mesh( new PlaneBufferGeometry( 2, 2 ), this.material );
  34. this.quad.frustumCulled = false; // Avoid getting clipped
  35. this.scene.add( this.quad );
  36. this.needsUpdate = true;
  37. }
  38. NodePostProcessing.prototype = {
  39. constructor: NodePostProcessing,
  40. render: function ( scene, camera, frame ) {
  41. if ( this.needsUpdate ) {
  42. this.material.dispose();
  43. this.material.fragment.value = this.output;
  44. this.material.build();
  45. if ( this.material.uniforms.renderTexture ) {
  46. this.material.uniforms.renderTexture.value = this.renderTarget.texture;
  47. }
  48. this.needsUpdate = false;
  49. }
  50. frame.setRenderer( this.renderer )
  51. .setRenderTexture( this.renderTarget.texture );
  52. this.renderer.setRenderTarget( this.renderTarget );
  53. this.renderer.render( scene, camera );
  54. frame.updateNode( this.material );
  55. this.renderer.setRenderTarget( null );
  56. this.renderer.render( this.scene, this.camera );
  57. },
  58. setPixelRatio: function ( value ) {
  59. this.renderer.setPixelRatio( value );
  60. var size = this.renderer.getSize( new Vector2() );
  61. this.setSize( size.width, size.height );
  62. },
  63. setSize: function ( width, height ) {
  64. var pixelRatio = this.renderer.getPixelRatio();
  65. this.renderTarget.setSize( width * pixelRatio, height * pixelRatio );
  66. this.renderer.setSize( width, height );
  67. },
  68. copy: function ( source ) {
  69. this.output = source.output;
  70. return this;
  71. },
  72. toJSON: function ( meta ) {
  73. var isRootObject = ( meta === undefined || typeof meta === 'string' );
  74. if ( isRootObject ) {
  75. meta = {
  76. nodes: {}
  77. };
  78. }
  79. if ( meta && ! meta.post ) meta.post = {};
  80. if ( ! meta.post[ this.uuid ] ) {
  81. var data = {};
  82. data.uuid = this.uuid;
  83. data.type = "NodePostProcessing";
  84. meta.post[ this.uuid ] = data;
  85. if ( this.name !== "" ) data.name = this.name;
  86. if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;
  87. data.output = this.output.toJSON( meta ).uuid;
  88. }
  89. meta.post = this.uuid;
  90. return meta;
  91. }
  92. };
  93. export { NodePostProcessing };