webXRRenderTargetTextureProvider.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { WebGLHardwareTexture } from "../Engines/WebGL/webGLHardwareTexture.js";
  2. import { InternalTexture, InternalTextureSource } from "../Materials/Textures/internalTexture.js";
  3. import { MultiviewRenderTarget } from "../Materials/Textures/MultiviewRenderTarget.js";
  4. import { RenderTargetTexture } from "../Materials/Textures/renderTargetTexture.js";
  5. /**
  6. * Provides render target textures and other important rendering information for a given XRLayer.
  7. * @internal
  8. */
  9. export class WebXRLayerRenderTargetTextureProvider {
  10. constructor(_scene, layerWrapper) {
  11. this._scene = _scene;
  12. this.layerWrapper = layerWrapper;
  13. this._renderTargetTextures = new Array();
  14. this._engine = _scene.getEngine();
  15. }
  16. _createInternalTexture(textureSize, texture) {
  17. const internalTexture = new InternalTexture(this._engine, InternalTextureSource.Unknown, true);
  18. internalTexture.width = textureSize.width;
  19. internalTexture.height = textureSize.height;
  20. internalTexture._hardwareTexture = new WebGLHardwareTexture(texture, this._engine._gl);
  21. internalTexture.isReady = true;
  22. return internalTexture;
  23. }
  24. _createRenderTargetTexture(width, height, framebuffer, colorTexture, depthStencilTexture, multiview) {
  25. if (!this._engine) {
  26. throw new Error("Engine is disposed");
  27. }
  28. const textureSize = { width, height };
  29. // Create render target texture from the internal texture
  30. const renderTargetTexture = multiview ? new MultiviewRenderTarget(this._scene, textureSize) : new RenderTargetTexture("XR renderTargetTexture", textureSize, this._scene);
  31. const renderTargetWrapper = renderTargetTexture.renderTarget;
  32. renderTargetWrapper._samples = renderTargetTexture.samples;
  33. // Set the framebuffer, make sure it works in all scenarios - emulator, no layers and layers
  34. if (framebuffer || !colorTexture) {
  35. renderTargetWrapper._framebuffer = framebuffer;
  36. }
  37. // Create internal texture
  38. if (colorTexture) {
  39. if (multiview) {
  40. renderTargetWrapper._colorTextureArray = colorTexture;
  41. }
  42. else {
  43. const internalTexture = this._createInternalTexture(textureSize, colorTexture);
  44. renderTargetWrapper.setTexture(internalTexture, 0);
  45. renderTargetTexture._texture = internalTexture;
  46. }
  47. }
  48. if (depthStencilTexture) {
  49. if (multiview) {
  50. renderTargetWrapper._depthStencilTextureArray = depthStencilTexture;
  51. }
  52. else {
  53. renderTargetWrapper._depthStencilTexture = this._createInternalTexture(textureSize, depthStencilTexture);
  54. }
  55. }
  56. renderTargetTexture.disableRescaling();
  57. this._renderTargetTextures.push(renderTargetTexture);
  58. return renderTargetTexture;
  59. }
  60. _destroyRenderTargetTexture(renderTargetTexture) {
  61. this._renderTargetTextures.splice(this._renderTargetTextures.indexOf(renderTargetTexture), 1);
  62. renderTargetTexture.dispose();
  63. }
  64. getFramebufferDimensions() {
  65. return this._framebufferDimensions;
  66. }
  67. dispose() {
  68. this._renderTargetTextures.forEach((rtt) => rtt.dispose());
  69. this._renderTargetTextures.length = 0;
  70. }
  71. }
  72. //# sourceMappingURL=webXRRenderTargetTextureProvider.js.map