babylon.renderingManager.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. module BABYLON {
  2. export class RenderingManager {
  3. public static MAX_RENDERINGGROUPS = 4;
  4. private _scene; //ANY
  5. private _renderingGroups = new Array<RenderingGroup>();
  6. private _depthBufferAlreadyCleaned: boolean;
  7. //ANY
  8. constructor(scene) {
  9. this._scene = scene;
  10. }
  11. private _renderParticles(index: number, activeMeshes: Mesh[]): void {
  12. if (this._scene._activeParticleSystems.length === 0) {
  13. return;
  14. }
  15. // Particles
  16. var beforeParticlesDate = new Date().getTime();
  17. for (var particleIndex = 0; particleIndex < this._scene._activeParticleSystems.length; particleIndex++) {
  18. var particleSystem = this._scene._activeParticleSystems.data[particleIndex];
  19. if (particleSystem.renderingGroupId !== index) {
  20. continue;
  21. }
  22. this._clearDepthBuffer();
  23. if (!particleSystem.emitter.position || !activeMeshes || activeMeshes.indexOf(particleSystem.emitter) !== -1) {
  24. this._scene._activeParticles += particleSystem.render();
  25. }
  26. }
  27. this._scene._particlesDuration += new Date().getTime() - beforeParticlesDate;
  28. }
  29. private _renderSprites(index: number): void {
  30. if (this._scene.spriteManagers.length === 0) {
  31. return;
  32. }
  33. // Sprites
  34. var beforeSpritessDate = new Date().getTime();
  35. for (var id = 0; id < this._scene.spriteManagers.length; id++) {
  36. var spriteManager = this._scene.spriteManagers[id];
  37. if (spriteManager.renderingGroupId === index) {
  38. this._clearDepthBuffer();
  39. spriteManager.render();
  40. }
  41. }
  42. this._scene._spritesDuration += new Date().getTime() - beforeSpritessDate;
  43. }
  44. private _clearDepthBuffer(): void {
  45. if (this._depthBufferAlreadyCleaned) {
  46. return;
  47. }
  48. this._scene.getEngine().clear(0, false, true);
  49. this._depthBufferAlreadyCleaned = true;
  50. }
  51. public render(customRenderFunction: (opaqueSubMeshes: SmartArray, transparentSubMeshes: SmartArray, alphaTestSubMeshes: SmartArray, beforeTransparents: () => void) => void,
  52. activeMeshes: Mesh[], renderParticles: boolean, renderSprites: boolean): void {
  53. for (var index = 0; index < BABYLON.RenderingManager.MAX_RENDERINGGROUPS; index++) {
  54. this._depthBufferAlreadyCleaned = index == 0;
  55. var renderingGroup = this._renderingGroups[index];
  56. if (renderingGroup) {
  57. this._clearDepthBuffer();
  58. if (!renderingGroup.render(customRenderFunction, () => {
  59. if (renderSprites) {
  60. this._renderSprites(index);
  61. }
  62. })) {
  63. this._renderingGroups.splice(index, 1);
  64. }
  65. } else if (renderSprites) {
  66. this._renderSprites(index);
  67. }
  68. if (renderParticles) {
  69. this._renderParticles(index, activeMeshes);
  70. }
  71. }
  72. }
  73. public reset(): void {
  74. for (var index in this._renderingGroups) {
  75. var renderingGroup = this._renderingGroups[index];
  76. renderingGroup.prepare();
  77. }
  78. }
  79. public dispatch(subMesh: SubMesh): void {
  80. var mesh = subMesh.getMesh();
  81. var renderingGroupId = mesh.renderingGroupId || 0;
  82. if (!this._renderingGroups[renderingGroupId]) {
  83. this._renderingGroups[renderingGroupId] = new BABYLON.RenderingGroup(renderingGroupId, this._scene);
  84. }
  85. this._renderingGroups[renderingGroupId].dispatch(subMesh);
  86. }
  87. }
  88. }