WebGLRenderStates.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import { WebGLLights } from './WebGLLights.js';
  2. function WebGLRenderState( extensions ) {
  3. const lights = new WebGLLights( extensions );
  4. const lightsArray = [];
  5. const shadowsArray = [];
  6. function init() {
  7. lightsArray.length = 0;
  8. shadowsArray.length = 0;
  9. }
  10. function pushLight( light ) {
  11. lightsArray.push( light );
  12. }
  13. function pushShadow( shadowLight ) {
  14. shadowsArray.push( shadowLight );
  15. }
  16. function setupLights( useLegacyLights ) {
  17. lights.setup( lightsArray, useLegacyLights );
  18. }
  19. function setupLightsView( camera ) {
  20. lights.setupView( lightsArray, camera );
  21. }
  22. const state = {
  23. lightsArray: lightsArray,
  24. shadowsArray: shadowsArray,
  25. lights: lights,
  26. transmissionRenderTarget: null
  27. };
  28. return {
  29. init: init,
  30. state: state,
  31. setupLights: setupLights,
  32. setupLightsView: setupLightsView,
  33. pushLight: pushLight,
  34. pushShadow: pushShadow
  35. };
  36. }
  37. function WebGLRenderStates( extensions ) {
  38. let renderStates = new WeakMap();
  39. function get( scene, renderCallDepth = 0 ) {
  40. const renderStateArray = renderStates.get( scene );
  41. let renderState;
  42. if ( renderStateArray === undefined ) {
  43. renderState = new WebGLRenderState( extensions );
  44. renderStates.set( scene, [ renderState ] );
  45. } else {
  46. if ( renderCallDepth >= renderStateArray.length ) {
  47. renderState = new WebGLRenderState( extensions );
  48. renderStateArray.push( renderState );
  49. } else {
  50. renderState = renderStateArray[ renderCallDepth ];
  51. }
  52. }
  53. return renderState;
  54. }
  55. function dispose() {
  56. renderStates = new WeakMap();
  57. }
  58. return {
  59. get: get,
  60. dispose: dispose
  61. };
  62. }
  63. export { WebGLRenderStates };