RenderContexts.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import ChainMap from './ChainMap.js';
  2. import RenderContext from './RenderContext.js';
  3. class RenderContexts {
  4. constructor() {
  5. this.chainMaps = {};
  6. }
  7. get( scene, camera, renderTarget = null ) {
  8. const chainKey = [ scene, camera ];
  9. let attachmentState;
  10. if ( renderTarget === null ) {
  11. attachmentState = 'default';
  12. } else {
  13. let format, count;
  14. if ( renderTarget.isWebGLMultipleRenderTargets ) {
  15. format = renderTarget.texture[ 0 ].format;
  16. count = renderTarget.texture.length;
  17. } else {
  18. format = renderTarget.texture.format;
  19. count = 1;
  20. }
  21. attachmentState = `${count}:${format}:${renderTarget.samples}:${renderTarget.depthBuffer}:${renderTarget.stencilBuffer}`;
  22. }
  23. const chainMap = this.getChainMap( attachmentState );
  24. let renderState = chainMap.get( chainKey );
  25. if ( renderState === undefined ) {
  26. renderState = new RenderContext();
  27. chainMap.set( chainKey, renderState );
  28. }
  29. if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
  30. return renderState;
  31. }
  32. getChainMap( attachmentState ) {
  33. return this.chainMaps[ attachmentState ] || ( this.chainMaps[ attachmentState ] = new ChainMap() );
  34. }
  35. dispose() {
  36. this.chainMaps = {};
  37. }
  38. }
  39. export default RenderContexts;