NodePostProcessing.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. setSize: function ( width, height ) {
  59. this.renderTarget.setSize( width, height );
  60. this.renderer.setSize( width, height );
  61. },
  62. copy: function ( source ) {
  63. this.output = source.output;
  64. return this;
  65. },
  66. toJSON: function ( meta ) {
  67. var isRootObject = ( meta === undefined || typeof meta === 'string' );
  68. if ( isRootObject ) {
  69. meta = {
  70. nodes: {}
  71. };
  72. }
  73. if ( meta && ! meta.post ) meta.post = {};
  74. if ( ! meta.post[ this.uuid ] ) {
  75. var data = {};
  76. data.uuid = this.uuid;
  77. data.type = "NodePostProcessing";
  78. meta.post[ this.uuid ] = data;
  79. if ( this.name !== "" ) data.name = this.name;
  80. if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;
  81. data.output = this.output.toJSON( meta ).uuid;
  82. }
  83. meta.post = this.uuid;
  84. return meta;
  85. }
  86. };
  87. export { NodePostProcessing };