RenderContexts.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. const format = renderTarget.texture.format;
  14. const count = renderTarget.count;
  15. attachmentState = `${ count }:${ format }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
  16. }
  17. const chainMap = this.getChainMap( attachmentState );
  18. let renderState = chainMap.get( chainKey );
  19. if ( renderState === undefined ) {
  20. renderState = new RenderContext();
  21. chainMap.set( chainKey, renderState );
  22. }
  23. if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
  24. return renderState;
  25. }
  26. getChainMap( attachmentState ) {
  27. return this.chainMaps[ attachmentState ] || ( this.chainMaps[ attachmentState ] = new ChainMap() );
  28. }
  29. dispose() {
  30. this.chainMaps = {};
  31. }
  32. }
  33. export default RenderContexts;