@babylonjs/core 7.7.2 → 7.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/Behaviors/Meshes/sixDofDragBehavior.js +1 -1
  2. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  3. package/Cameras/Inputs/BaseCameraPointersInput.js +5 -1
  4. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  5. package/Engines/AbstractEngine/abstractEngine.states.d.ts +1 -0
  6. package/Engines/AbstractEngine/abstractEngine.states.js +1 -0
  7. package/Engines/AbstractEngine/abstractEngine.states.js.map +1 -1
  8. package/Engines/{Extensions/engine.views.d.ts → AbstractEngine/abstractEngine.views.d.ts} +1 -2
  9. package/Engines/{Extensions/engine.views.js → AbstractEngine/abstractEngine.views.js} +10 -10
  10. package/Engines/AbstractEngine/abstractEngine.views.js.map +1 -0
  11. package/Engines/AbstractEngine/index.d.ts +1 -0
  12. package/Engines/AbstractEngine/index.js +1 -0
  13. package/Engines/AbstractEngine/index.js.map +1 -1
  14. package/Engines/Extensions/engine.alpha.d.ts +2 -2
  15. package/Engines/Extensions/engine.alpha.js.map +1 -1
  16. package/Engines/Extensions/engine.cubeTexture.d.ts +10 -4
  17. package/Engines/Extensions/engine.cubeTexture.js +10 -0
  18. package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
  19. package/Engines/Extensions/engine.dynamicBuffer.d.ts +2 -2
  20. package/Engines/Extensions/engine.dynamicBuffer.js.map +1 -1
  21. package/Engines/Extensions/engine.dynamicTexture.d.ts +2 -2
  22. package/Engines/Extensions/engine.dynamicTexture.js.map +1 -1
  23. package/Engines/Extensions/engine.multiRender.d.ts +2 -2
  24. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  25. package/Engines/Extensions/engine.prefilteredCubeTexture.d.ts +22 -0
  26. package/Engines/Extensions/engine.prefilteredCubeTexture.js +88 -0
  27. package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -0
  28. package/Engines/Extensions/engine.rawTexture.d.ts +2 -63
  29. package/Engines/Extensions/engine.rawTexture.js.map +1 -1
  30. package/Engines/Extensions/engine.readTexture.d.ts +2 -2
  31. package/Engines/Extensions/engine.readTexture.js.map +1 -1
  32. package/Engines/Extensions/engine.renderTarget.d.ts +5 -11
  33. package/Engines/Extensions/engine.renderTarget.js +37 -0
  34. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  35. package/Engines/Extensions/engine.renderTargetCube.d.ts +2 -2
  36. package/Engines/Extensions/engine.renderTargetCube.js.map +1 -1
  37. package/Engines/Extensions/engine.renderTargetTexture.d.ts +14 -0
  38. package/Engines/Extensions/engine.renderTargetTexture.js +16 -0
  39. package/Engines/Extensions/engine.renderTargetTexture.js.map +1 -0
  40. package/Engines/Extensions/engine.videoTexture.d.ts +2 -2
  41. package/Engines/Extensions/engine.videoTexture.js.map +1 -1
  42. package/Engines/Extensions/index.d.ts +2 -1
  43. package/Engines/Extensions/index.js +2 -1
  44. package/Engines/Extensions/index.js.map +1 -1
  45. package/Engines/WebGPU/Extensions/engine.alpha.d.ts +3 -27
  46. package/Engines/WebGPU/Extensions/engine.alpha.js +1 -0
  47. package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
  48. package/Engines/WebGPU/Extensions/engine.cubeTexture.d.ts +10 -4
  49. package/Engines/WebGPU/Extensions/engine.cubeTexture.js +9 -0
  50. package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
  51. package/Engines/WebGPU/Extensions/engine.dynamicTexture.d.ts +2 -2
  52. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
  53. package/Engines/WebGPU/Extensions/engine.multiRender.d.ts +2 -2
  54. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  55. package/Engines/WebGPU/Extensions/engine.rawTexture.d.ts +2 -50
  56. package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
  57. package/Engines/WebGPU/Extensions/engine.readTexture.d.ts +2 -2
  58. package/Engines/WebGPU/Extensions/engine.readTexture.js.map +1 -1
  59. package/Engines/WebGPU/Extensions/engine.renderTarget.d.ts +3 -11
  60. package/Engines/WebGPU/Extensions/engine.renderTarget.js +1 -0
  61. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  62. package/Engines/WebGPU/Extensions/engine.renderTargetCube.d.ts +2 -2
  63. package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
  64. package/Engines/WebGPU/Extensions/engine.renderTargetTexture.d.ts +14 -0
  65. package/Engines/WebGPU/Extensions/engine.renderTargetTexture.js +10 -0
  66. package/Engines/WebGPU/Extensions/engine.renderTargetTexture.js.map +1 -0
  67. package/Engines/WebGPU/Extensions/engine.videoTexture.d.ts +2 -2
  68. package/Engines/WebGPU/Extensions/engine.videoTexture.js.map +1 -1
  69. package/Engines/WebGPU/Extensions/index.d.ts +1 -0
  70. package/Engines/WebGPU/Extensions/index.js +1 -0
  71. package/Engines/WebGPU/Extensions/index.js.map +1 -1
  72. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +4 -0
  73. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +4 -0
  74. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  75. package/Engines/abstractEngine.d.ts +13 -351
  76. package/Engines/abstractEngine.js +90 -5
  77. package/Engines/abstractEngine.js.map +1 -1
  78. package/Engines/engine.d.ts +11 -30
  79. package/Engines/engine.js +0 -69
  80. package/Engines/engine.js.map +1 -1
  81. package/Engines/nativeEngine.d.ts +4 -7
  82. package/Engines/nativeEngine.js +3 -8
  83. package/Engines/nativeEngine.js.map +1 -1
  84. package/Engines/thinEngine.d.ts +7 -18
  85. package/Engines/thinEngine.js +4 -146
  86. package/Engines/thinEngine.js.map +1 -1
  87. package/Engines/webgpuEngine.d.ts +4 -26
  88. package/Engines/webgpuEngine.js +3 -51
  89. package/Engines/webgpuEngine.js.map +1 -1
  90. package/Materials/Node/Blocks/Fragment/TBNBlock.js +14 -7
  91. package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
  92. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +19 -11
  93. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
  94. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +47 -20
  95. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  96. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js +3 -1
  97. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js.map +1 -1
  98. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js +4 -4
  99. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js.map +1 -1
  100. package/Materials/Node/Blocks/biPlanarBlock.js +1 -2
  101. package/Materials/Node/Blocks/biPlanarBlock.js.map +1 -1
  102. package/Materials/Node/Blocks/cloudBlock.js +1 -1
  103. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  104. package/Materials/Node/Blocks/triPlanarBlock.js +1 -1
  105. package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
  106. package/Materials/Node/nodeMaterialBuildState.d.ts +2 -0
  107. package/Materials/Node/nodeMaterialBuildState.js +7 -0
  108. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  109. package/Materials/Textures/Filtering/hdrFiltering.d.ts +1 -0
  110. package/Materials/Textures/Filtering/hdrFiltering.js +2 -1
  111. package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
  112. package/Materials/Textures/Loaders/basisTextureLoader.d.ts +1 -0
  113. package/Materials/Textures/Loaders/basisTextureLoader.js +1 -0
  114. package/Materials/Textures/Loaders/basisTextureLoader.js.map +1 -1
  115. package/Materials/Textures/Loaders/ddsTextureLoader.d.ts +1 -0
  116. package/Materials/Textures/Loaders/ddsTextureLoader.js +1 -0
  117. package/Materials/Textures/Loaders/ddsTextureLoader.js.map +1 -1
  118. package/Materials/Textures/Loaders/ktxTextureLoader.d.ts +1 -0
  119. package/Materials/Textures/Loaders/ktxTextureLoader.js +1 -0
  120. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  121. package/Materials/Textures/baseTexture.d.ts +1 -0
  122. package/Materials/Textures/baseTexture.js +1 -0
  123. package/Materials/Textures/baseTexture.js.map +1 -1
  124. package/Materials/Textures/cubeTexture.d.ts +2 -1
  125. package/Materials/Textures/cubeTexture.js +3 -2
  126. package/Materials/Textures/cubeTexture.js.map +1 -1
  127. package/Materials/Textures/dynamicTexture.d.ts +1 -1
  128. package/Materials/Textures/dynamicTexture.js.map +1 -1
  129. package/Materials/Textures/renderTargetTexture.d.ts +11 -0
  130. package/Materials/Textures/renderTargetTexture.js +10 -0
  131. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  132. package/Materials/effect.d.ts +8 -23
  133. package/Materials/effect.js +2 -25
  134. package/Materials/effect.js.map +1 -1
  135. package/Misc/dds.d.ts +2 -22
  136. package/Misc/dds.js +0 -95
  137. package/Misc/dds.js.map +1 -1
  138. package/Misc/minMaxReducer.d.ts +1 -0
  139. package/Misc/minMaxReducer.js +1 -0
  140. package/Misc/minMaxReducer.js.map +1 -1
  141. package/Misc/screenshotTools.d.ts +1 -0
  142. package/Misc/screenshotTools.js +1 -0
  143. package/Misc/screenshotTools.js.map +1 -1
  144. package/Morph/morphTargetManager.d.ts +6 -0
  145. package/Morph/morphTargetManager.js +13 -0
  146. package/Morph/morphTargetManager.js.map +1 -1
  147. package/Physics/v2/IPhysicsEnginePlugin.d.ts +1 -0
  148. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  149. package/Physics/v2/Plugins/havokPlugin.d.ts +11 -1
  150. package/Physics/v2/Plugins/havokPlugin.js +25 -1
  151. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  152. package/Physics/v2/physicsAggregate.js +3 -3
  153. package/Physics/v2/physicsAggregate.js.map +1 -1
  154. package/Physics/v2/physicsBody.d.ts +6 -0
  155. package/Physics/v2/physicsBody.js +7 -0
  156. package/Physics/v2/physicsBody.js.map +1 -1
  157. package/PostProcesses/postProcess.d.ts +37 -2
  158. package/PostProcesses/postProcess.js +34 -0
  159. package/PostProcesses/postProcess.js.map +1 -1
  160. package/Rendering/depthPeelingRenderer.d.ts +1 -0
  161. package/Rendering/depthPeelingRenderer.js +1 -0
  162. package/Rendering/depthPeelingRenderer.js.map +1 -1
  163. package/Rendering/geometryBufferRenderer.d.ts +1 -0
  164. package/Rendering/geometryBufferRenderer.js +1 -0
  165. package/Rendering/geometryBufferRenderer.js.map +1 -1
  166. package/Rendering/prePassRenderer.d.ts +1 -0
  167. package/Rendering/prePassRenderer.js +1 -0
  168. package/Rendering/prePassRenderer.js.map +1 -1
  169. package/ShadersWGSL/ShadersInclude/bumpFragment.d.ts +5 -0
  170. package/ShadersWGSL/ShadersInclude/bumpFragment.js +61 -0
  171. package/ShadersWGSL/ShadersInclude/bumpFragment.js.map +1 -0
  172. package/ShadersWGSL/ShadersInclude/bumpFragmentFunctions.d.ts +6 -0
  173. package/ShadersWGSL/ShadersInclude/bumpFragmentFunctions.js +40 -0
  174. package/ShadersWGSL/ShadersInclude/bumpFragmentFunctions.js.map +1 -0
  175. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.d.ts +5 -0
  176. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js +69 -0
  177. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -0
  178. package/ShadersWGSL/ShadersInclude/samplerFragmentDeclaration.d.ts +5 -0
  179. package/ShadersWGSL/ShadersInclude/samplerFragmentDeclaration.js +27 -0
  180. package/ShadersWGSL/ShadersInclude/samplerFragmentDeclaration.js.map +1 -0
  181. package/package.json +1 -1
  182. package/Engines/Extensions/engine.views.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"prePassRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/prePassRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { PrePassRenderTarget } from \"../Materials/Textures/prePassRenderTarget\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Material } from \"../Materials/material\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { PrePassEffectConfiguration } from \"./prePassEffectConfiguration\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { GeometryBufferRenderer } from \"../Rendering/geometryBufferRenderer\";\r\n\r\n/**\r\n * Renders a pre pass of the scene\r\n * This means every mesh in the scene will be rendered to a render target texture\r\n * And then this texture will be composited to the rendering canvas with post processes\r\n * It is necessary for effects like subsurface scattering or deferred shading\r\n */\r\nexport class PrePassRenderer {\r\n /**\r\n * @internal\r\n */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"PrePassRendererSceneComponent\");\r\n };\r\n\r\n /**\r\n * To save performance, we can excluded skinned meshes from the prepass\r\n */\r\n public excludedSkinnedMesh: AbstractMesh[] = [];\r\n\r\n /**\r\n * Force material to be excluded from the prepass\r\n * Can be useful when `useGeometryBufferFallback` is set to `true`\r\n * and you don't want a material to show in the effect.\r\n */\r\n public excludedMaterials: Material[] = [];\r\n\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n\r\n /**\r\n * Number of textures in the multi render target texture where the scene is directly rendered\r\n */\r\n public mrtCount: number = 0;\r\n\r\n private _mrtTypes: number[] = [];\r\n private _mrtFormats: number[] = [];\r\n private _mrtLayout: number[] = [];\r\n private _mrtNames: string[] = [];\r\n private _textureIndices: number[] = [];\r\n\r\n private _multiRenderAttachments: number[];\r\n private _defaultAttachments: number[];\r\n private _clearAttachments: number[];\r\n private _clearDepthAttachments: number[];\r\n private _generateNormalsInWorldSpace = false;\r\n\r\n /**\r\n * Indicates if the prepass renderer is generating normals in world space or camera space (default: camera space)\r\n */\r\n public get generateNormalsInWorldSpace() {\r\n return this._generateNormalsInWorldSpace;\r\n }\r\n\r\n public set generateNormalsInWorldSpace(value: boolean) {\r\n if (this._generateNormalsInWorldSpace === value) {\r\n return;\r\n }\r\n\r\n this._generateNormalsInWorldSpace = value;\r\n this._markAllMaterialsAsPrePassDirty();\r\n }\r\n\r\n /**\r\n * Returns the index of a texture in the multi render target texture array.\r\n * @param type Texture type\r\n * @returns The index\r\n */\r\n public getIndex(type: number): number {\r\n return this._textureIndices[type];\r\n }\r\n\r\n /**\r\n * How many samples are used for MSAA of the scene render target\r\n */\r\n public get samples() {\r\n return this.defaultRT.samples;\r\n }\r\n\r\n public set samples(n: number) {\r\n this.defaultRT.samples = n;\r\n }\r\n\r\n private _useSpecificClearForDepthTexture = false;\r\n\r\n /**\r\n * If set to true (default: false), the depth texture will be cleared with the depth value corresponding to the far plane (1 in normal mode, 0 in reverse depth buffer mode)\r\n * If set to false, the depth texture is always cleared with 0.\r\n */\r\n public get useSpecificClearForDepthTexture() {\r\n return this._useSpecificClearForDepthTexture;\r\n }\r\n\r\n public set useSpecificClearForDepthTexture(value: boolean) {\r\n if (this._useSpecificClearForDepthTexture === value) {\r\n return;\r\n }\r\n\r\n this._useSpecificClearForDepthTexture = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Describes the types and formats of the textures used by the pre-pass renderer\r\n */\r\n public static TextureFormats = [\r\n {\r\n purpose: Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Irradiance\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Position\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Velocity\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Reflectivity\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_COLOR_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Color\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_FLOAT,\r\n format: Constants.TEXTUREFORMAT_R,\r\n name: \"prePass_Depth\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_NORMAL_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Normal\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Albedo\",\r\n },\r\n ];\r\n\r\n private _isDirty: boolean = true;\r\n\r\n /**\r\n * The render target where the scene is directly rendered\r\n */\r\n public defaultRT: PrePassRenderTarget;\r\n\r\n /**\r\n * Configuration for prepass effects\r\n */\r\n private _effectConfigurations: PrePassEffectConfiguration[] = [];\r\n\r\n /**\r\n * @returns the prepass render target for the rendering pass.\r\n * If we are currently rendering a render target, it returns the PrePassRenderTarget\r\n * associated with that render target. Otherwise, it returns the scene default PrePassRenderTarget\r\n */\r\n public getRenderTarget(): PrePassRenderTarget {\r\n return this._currentTarget;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Managed by the scene component\r\n * @param prePassRenderTarget\r\n */\r\n public _setRenderTarget(prePassRenderTarget: Nullable<PrePassRenderTarget>): void {\r\n if (prePassRenderTarget) {\r\n this._currentTarget = prePassRenderTarget;\r\n } else {\r\n this._currentTarget = this.defaultRT;\r\n this._engine.currentRenderPassId = this._scene.activeCamera?.renderPassId ?? this._currentTarget.renderPassId;\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the currently rendered prePassRenderTarget is the one\r\n * associated with the scene.\r\n */\r\n public get currentRTisSceneRT(): boolean {\r\n return this._currentTarget === this.defaultRT;\r\n }\r\n\r\n private _geometryBuffer: Nullable<GeometryBufferRenderer>;\r\n\r\n /**\r\n * Prevents the PrePassRenderer from using the GeometryBufferRenderer as a fallback\r\n */\r\n public doNotUseGeometryRendererFallback = true;\r\n\r\n private _refreshGeometryBufferRendererLink() {\r\n if (!this.doNotUseGeometryRendererFallback) {\r\n this._geometryBuffer = this._scene.enableGeometryBufferRenderer();\r\n\r\n if (!this._geometryBuffer) {\r\n // Not supported\r\n this.doNotUseGeometryRendererFallback = true;\r\n return;\r\n }\r\n\r\n this._geometryBuffer._linkPrePassRenderer(this);\r\n } else {\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer._unlinkPrePassRenderer();\r\n }\r\n this._geometryBuffer = null;\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n }\r\n\r\n private _currentTarget: PrePassRenderTarget;\r\n\r\n /**\r\n * All the render targets generated by prepass\r\n */\r\n public renderTargets: PrePassRenderTarget[] = [];\r\n\r\n private readonly _clearColor = new Color4(0, 0, 0, 0);\r\n private readonly _clearDepthColor = new Color4(1e8, 0, 0, 1); // \"infinity\" value - depth in the depth texture is view.z, not a 0..1 value!\r\n\r\n private _enabled: boolean = false;\r\n\r\n private _needsCompositionForThisPass = false;\r\n private _postProcessesSourceForThisPass: Nullable<PostProcess>[];\r\n\r\n /**\r\n * Indicates if the prepass is enabled\r\n */\r\n public get enabled() {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * Set to true to disable gamma transform in PrePass.\r\n * Can be useful in case you already proceed to gamma transform on a material level\r\n * and your post processes don't need to be in linear color space.\r\n */\r\n public disableGammaTransform = false;\r\n\r\n /**\r\n * Instantiates a prepass renderer\r\n * @param scene The scene\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n\r\n let type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n if (this._engine._caps.textureFloat && this._engine._caps.textureFloatLinearFiltering) {\r\n type = Constants.TEXTURETYPE_FLOAT;\r\n } else if (this._engine._caps.textureHalfFloat && this._engine._caps.textureHalfFloatLinearFiltering) {\r\n type = Constants.TEXTURETYPE_HALF_FLOAT;\r\n }\r\n\r\n for (let i = 0; i < PrePassRenderer.TextureFormats.length; ++i) {\r\n const format = PrePassRenderer.TextureFormats[i].format;\r\n if (PrePassRenderer.TextureFormats[i].type === Constants.TEXTURETYPE_FLOAT) {\r\n PrePassRenderer.TextureFormats[Constants.PREPASS_DEPTH_TEXTURE_TYPE].type = type;\r\n if (\r\n (format === Constants.TEXTUREFORMAT_R || format === Constants.TEXTUREFORMAT_RG || format === Constants.TEXTUREFORMAT_RGBA) &&\r\n !this._engine._caps.supportFloatTexturesResolve\r\n ) {\r\n // We don't know in advance if the texture will be used as a resolve target, so we revert to half_float if the extension to resolve full float textures is not supported\r\n PrePassRenderer.TextureFormats[Constants.PREPASS_DEPTH_TEXTURE_TYPE].type = Constants.TEXTURETYPE_HALF_FLOAT;\r\n }\r\n }\r\n }\r\n\r\n PrePassRenderer._SceneComponentInitialization(this._scene);\r\n this.defaultRT = this._createRenderTarget(\"sceneprePassRT\", null);\r\n this._currentTarget = this.defaultRT;\r\n }\r\n\r\n /**\r\n * Creates a new PrePassRenderTarget\r\n * This should be the only way to instantiate a `PrePassRenderTarget`\r\n * @param name Name of the `PrePassRenderTarget`\r\n * @param renderTargetTexture RenderTarget the `PrePassRenderTarget` will be attached to.\r\n * Can be `null` if the created `PrePassRenderTarget` is attached to the scene (default framebuffer).\r\n * @internal\r\n */\r\n public _createRenderTarget(name: string, renderTargetTexture: Nullable<RenderTargetTexture>): PrePassRenderTarget {\r\n const rt = new PrePassRenderTarget(name, renderTargetTexture, { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, 0, this._scene, {\r\n generateMipMaps: false,\r\n generateStencilBuffer: this._engine.isStencilEnable,\r\n defaultType: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n types: [],\r\n drawOnlyOnFirstAttachmentByDefault: true,\r\n });\r\n\r\n this.renderTargets.push(rt);\r\n\r\n if (this._enabled) {\r\n // The pre-pass renderer is already enabled, so make sure we create the render target with the correct number of textures\r\n this._update();\r\n }\r\n\r\n return rt;\r\n }\r\n\r\n /**\r\n * Indicates if rendering a prepass is supported\r\n */\r\n public get isSupported() {\r\n return this._scene.getEngine().getCaps().drawBuffersExtension;\r\n }\r\n\r\n /**\r\n * Sets the proper output textures to draw in the engine.\r\n * @param effect The effect that is drawn. It can be or not be compatible with drawing to several output textures.\r\n * @param subMesh Submesh on which the effect is applied\r\n */\r\n public bindAttachmentsForEffect(effect: Effect, subMesh: SubMesh) {\r\n const material = subMesh.getMaterial();\r\n const isPrePassCapable = material && material.isPrePassCapable;\r\n const excluded = material && this.excludedMaterials.indexOf(material) !== -1;\r\n\r\n if (this.enabled && this._currentTarget.enabled) {\r\n if (effect._multiTarget && isPrePassCapable && !excluded) {\r\n this._engine.bindAttachments(this._multiRenderAttachments);\r\n } else {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n } else {\r\n this._engine.restoreSingleAttachment();\r\n }\r\n\r\n if (this._geometryBuffer && this.currentRTisSceneRT && !excluded) {\r\n this._geometryBuffer.renderList!.push(subMesh.getRenderingMesh());\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _reinitializeAttachments() {\r\n const multiRenderLayout = [];\r\n const clearLayout = [false];\r\n const clearDepthLayout = [false];\r\n const defaultLayout = [true];\r\n\r\n for (let i = 0; i < this.mrtCount; i++) {\r\n multiRenderLayout.push(true);\r\n\r\n if (i > 0) {\r\n if (this._useSpecificClearForDepthTexture && this._mrtLayout[i] === Constants.PREPASS_DEPTH_TEXTURE_TYPE) {\r\n clearLayout.push(false);\r\n clearDepthLayout.push(true);\r\n } else {\r\n clearLayout.push(true);\r\n clearDepthLayout.push(false);\r\n }\r\n defaultLayout.push(false);\r\n }\r\n }\r\n\r\n this._multiRenderAttachments = this._engine.buildTextureLayout(multiRenderLayout);\r\n this._clearAttachments = this._engine.buildTextureLayout(clearLayout);\r\n this._clearDepthAttachments = this._engine.buildTextureLayout(clearDepthLayout);\r\n this._defaultAttachments = this._engine.buildTextureLayout(defaultLayout);\r\n }\r\n\r\n private _resetLayout() {\r\n for (let i = 0; i < PrePassRenderer.TextureFormats.length; i++) {\r\n this._textureIndices[PrePassRenderer.TextureFormats[i].purpose] = -1;\r\n }\r\n\r\n this._textureIndices[Constants.PREPASS_COLOR_TEXTURE_TYPE] = 0;\r\n this._mrtLayout = [Constants.PREPASS_COLOR_TEXTURE_TYPE];\r\n this._mrtTypes = [PrePassRenderer.TextureFormats[Constants.PREPASS_COLOR_TEXTURE_TYPE].type];\r\n this._mrtFormats = [PrePassRenderer.TextureFormats[Constants.PREPASS_COLOR_TEXTURE_TYPE].format];\r\n this._mrtNames = [PrePassRenderer.TextureFormats[Constants.PREPASS_COLOR_TEXTURE_TYPE].name];\r\n this.mrtCount = 1;\r\n }\r\n\r\n private _updateGeometryBufferLayout() {\r\n this._refreshGeometryBufferRendererLink();\r\n\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer._resetLayout();\r\n\r\n const texturesActivated = [];\r\n\r\n for (let i = 0; i < this._mrtLayout.length; i++) {\r\n texturesActivated.push(false);\r\n }\r\n\r\n this._geometryBuffer._linkInternalTexture(this.defaultRT.getInternalTexture()!);\r\n\r\n const matches = [\r\n {\r\n prePassConstant: Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.DEPTH_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_NORMAL_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.NORMAL_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.POSITION_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.REFLECTIVITY_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.VELOCITY_TEXTURE_TYPE,\r\n },\r\n ];\r\n\r\n // replace textures in the geometryBuffer RT\r\n for (let i = 0; i < matches.length; i++) {\r\n const index = this._mrtLayout.indexOf(matches[i].prePassConstant);\r\n if (index !== -1) {\r\n this._geometryBuffer._forceTextureType(matches[i].geometryBufferConstant, index);\r\n texturesActivated[index] = true;\r\n }\r\n }\r\n\r\n this._geometryBuffer._setAttachments(this._engine.buildTextureLayout(texturesActivated));\r\n }\r\n }\r\n\r\n /**\r\n * Restores attachments for single texture draw.\r\n */\r\n public restoreAttachments() {\r\n if (this.enabled && this._currentTarget.enabled && this._defaultAttachments) {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n } else {\r\n this._engine.restoreSingleAttachment();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _beforeDraw(camera?: Camera, faceIndex?: number, layer?: number) {\r\n // const previousEnabled = this._enabled && this._currentTarget.enabled;\r\n\r\n if (this._isDirty) {\r\n this._update();\r\n }\r\n\r\n if (!this._enabled || !this._currentTarget.enabled) {\r\n return;\r\n }\r\n\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer.renderList = [];\r\n }\r\n\r\n this._setupOutputForThisPass(this._currentTarget, camera);\r\n }\r\n\r\n private _prepareFrame(prePassRenderTarget: PrePassRenderTarget, faceIndex?: number, layer?: number) {\r\n if (prePassRenderTarget.renderTargetTexture) {\r\n prePassRenderTarget.renderTargetTexture._prepareFrame(this._scene, faceIndex, layer, prePassRenderTarget.renderTargetTexture.useCameraPostProcesses);\r\n } else if (this._postProcessesSourceForThisPass.length) {\r\n this._scene.postProcessManager._prepareFrame();\r\n } else {\r\n this._engine.restoreDefaultFramebuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Sets an intermediary texture between prepass and postprocesses. This texture\r\n * will be used as input for post processes\r\n * @param rt The render target texture to use\r\n * @returns true if there are postprocesses that will use this texture,\r\n * false if there is no postprocesses - and the function has no effect\r\n */\r\n public setCustomOutput(rt: RenderTargetTexture) {\r\n const firstPP = this._postProcessesSourceForThisPass[0];\r\n if (!firstPP) {\r\n return false;\r\n }\r\n\r\n firstPP.inputTexture = rt.renderTarget!;\r\n\r\n return true;\r\n }\r\n\r\n private _renderPostProcesses(prePassRenderTarget: PrePassRenderTarget, faceIndex?: number) {\r\n const firstPP = this._postProcessesSourceForThisPass[0];\r\n const outputTexture = firstPP ? firstPP.inputTexture : prePassRenderTarget.renderTargetTexture ? prePassRenderTarget.renderTargetTexture.renderTarget : null;\r\n\r\n // Build post process chain for this prepass post draw\r\n let postProcessChain = this._currentTarget._beforeCompositionPostProcesses;\r\n\r\n if (this._needsCompositionForThisPass) {\r\n postProcessChain = postProcessChain.concat([this._currentTarget.imageProcessingPostProcess]);\r\n }\r\n\r\n // Activates and renders the chain\r\n if (postProcessChain.length) {\r\n this._scene.postProcessManager._prepareFrame(this._currentTarget.renderTarget?.texture, postProcessChain);\r\n this._scene.postProcessManager.directRender(postProcessChain, outputTexture, false, faceIndex);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _afterDraw(faceIndex?: number, layer?: number) {\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._prepareFrame(this._currentTarget, faceIndex, layer);\r\n this._renderPostProcesses(this._currentTarget, faceIndex);\r\n }\r\n }\r\n\r\n /**\r\n * Clears the current prepass render target (in the sense of settings pixels to the scene clear color value)\r\n * @internal\r\n */\r\n public _clear() {\r\n if (this._isDirty) {\r\n this._update();\r\n }\r\n\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._bindFrameBuffer();\r\n\r\n // Clearing other attachment with 0 on all other attachments\r\n this._engine.bindAttachments(this._clearAttachments);\r\n this._engine.clear(this._clearColor, true, false, false);\r\n if (this._useSpecificClearForDepthTexture) {\r\n this._engine.bindAttachments(this._clearDepthAttachments);\r\n this._engine.clear(this._clearDepthColor, true, false, false);\r\n }\r\n // Regular clear color with the scene clear color of the 1st attachment\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _bindFrameBuffer() {\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._currentTarget._checkSize();\r\n const internalTexture = this._currentTarget.renderTarget;\r\n if (internalTexture) {\r\n this._engine.bindFramebuffer(internalTexture);\r\n }\r\n }\r\n }\r\n\r\n private _setEnabled(enabled: boolean) {\r\n this._enabled = enabled;\r\n }\r\n\r\n private _setRenderTargetEnabled(prePassRenderTarget: PrePassRenderTarget, enabled: boolean) {\r\n prePassRenderTarget.enabled = enabled;\r\n if (!enabled) {\r\n this._unlinkInternalTexture(prePassRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * Adds an effect configuration to the prepass render target.\r\n * If an effect has already been added, it won't add it twice and will return the configuration\r\n * already present.\r\n * @param cfg the effect configuration\r\n * @returns the effect configuration now used by the prepass\r\n */\r\n public addEffectConfiguration(cfg: PrePassEffectConfiguration): PrePassEffectConfiguration {\r\n // Do not add twice\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].name === cfg.name) {\r\n return this._effectConfigurations[i];\r\n }\r\n }\r\n\r\n this._effectConfigurations.push(cfg);\r\n return cfg;\r\n }\r\n\r\n /**\r\n * Retrieves an effect configuration by name\r\n * @param name the name of the effect configuration\r\n * @returns the effect configuration, or null if not present\r\n */\r\n public getEffectConfiguration(name: string): Nullable<PrePassEffectConfiguration> {\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].name === name) {\r\n return this._effectConfigurations[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _enable() {\r\n const previousMrtCount = this.mrtCount;\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].enabled) {\r\n this._enableTextures(this._effectConfigurations[i].texturesRequired);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n if (this.mrtCount !== previousMrtCount || this.renderTargets[i].count !== this.mrtCount) {\r\n this.renderTargets[i].updateCount(this.mrtCount, { types: this._mrtTypes, formats: this._mrtFormats }, this._mrtNames.concat(\"prePass_DepthBuffer\"));\r\n }\r\n\r\n this.renderTargets[i]._resetPostProcessChain();\r\n\r\n for (let j = 0; j < this._effectConfigurations.length; j++) {\r\n if (this._effectConfigurations[j].enabled) {\r\n // TODO : subsurface scattering has 1 scene-wide effect configuration\r\n // solution : do not stock postProcess on effectConfiguration, but in the prepassRenderTarget (hashmap configuration => postProcess)\r\n // And call createPostProcess whenever the post process does not exist in the RT\r\n if (!this._effectConfigurations[j].postProcess && this._effectConfigurations[j].createPostProcess) {\r\n this._effectConfigurations[j].createPostProcess!();\r\n }\r\n\r\n if (this._effectConfigurations[j].postProcess) {\r\n this.renderTargets[i]._beforeCompositionPostProcesses.push(this._effectConfigurations[j].postProcess!);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._reinitializeAttachments();\r\n this._setEnabled(true);\r\n this._updateGeometryBufferLayout();\r\n }\r\n\r\n private _disable() {\r\n this._setEnabled(false);\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n this._setRenderTargetEnabled(this.renderTargets[i], false);\r\n }\r\n\r\n this._resetLayout();\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n this._effectConfigurations[i].enabled = false;\r\n }\r\n }\r\n\r\n private _getPostProcessesSource(prePassRenderTarget: PrePassRenderTarget, camera?: Camera): Nullable<PostProcess>[] {\r\n if (camera) {\r\n return camera._postProcesses;\r\n } else if (prePassRenderTarget.renderTargetTexture) {\r\n if (prePassRenderTarget.renderTargetTexture.useCameraPostProcesses) {\r\n const camera = prePassRenderTarget.renderTargetTexture.activeCamera ? prePassRenderTarget.renderTargetTexture.activeCamera : this._scene.activeCamera;\r\n return camera ? camera._postProcesses : [];\r\n } else if (prePassRenderTarget.renderTargetTexture.postProcesses) {\r\n return prePassRenderTarget.renderTargetTexture.postProcesses;\r\n } else {\r\n return [];\r\n }\r\n } else {\r\n return this._scene.activeCamera ? this._scene.activeCamera._postProcesses : [];\r\n }\r\n }\r\n\r\n private _setupOutputForThisPass(prePassRenderTarget: PrePassRenderTarget, camera?: Camera) {\r\n // Order is : draw ===> prePassRenderTarget._postProcesses ==> ipp ==> camera._postProcesses\r\n const secondaryCamera = camera && this._scene.activeCameras && !!this._scene.activeCameras.length && this._scene.activeCameras.indexOf(camera) !== 0;\r\n this._postProcessesSourceForThisPass = this._getPostProcessesSource(prePassRenderTarget, camera);\r\n this._postProcessesSourceForThisPass = this._postProcessesSourceForThisPass.filter((pp) => {\r\n return pp != null;\r\n });\r\n this._scene.autoClear = true;\r\n\r\n const cameraHasImageProcessing = this._hasImageProcessing(this._postProcessesSourceForThisPass);\r\n this._needsCompositionForThisPass = !cameraHasImageProcessing && !this.disableGammaTransform && this._needsImageProcessing() && !secondaryCamera;\r\n\r\n const firstCameraPP = this._getFirstPostProcess(this._postProcessesSourceForThisPass);\r\n const firstPrePassPP = prePassRenderTarget._beforeCompositionPostProcesses && prePassRenderTarget._beforeCompositionPostProcesses[0];\r\n let firstPP = null;\r\n\r\n // Setting the scene-wide post process configuration\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = this._needsCompositionForThisPass || cameraHasImageProcessing;\r\n\r\n // Create composition effect if needed\r\n if (this._needsCompositionForThisPass && !prePassRenderTarget.imageProcessingPostProcess) {\r\n prePassRenderTarget._createCompositionEffect();\r\n }\r\n\r\n // Setting the prePassRenderTarget as input texture of the first PP\r\n if (firstPrePassPP) {\r\n firstPP = firstPrePassPP;\r\n } else if (this._needsCompositionForThisPass) {\r\n firstPP = prePassRenderTarget.imageProcessingPostProcess;\r\n } else if (firstCameraPP) {\r\n firstPP = firstCameraPP;\r\n }\r\n\r\n this._bindFrameBuffer();\r\n this._linkInternalTexture(prePassRenderTarget, firstPP);\r\n }\r\n\r\n private _linkInternalTexture(prePassRenderTarget: PrePassRenderTarget, postProcess: Nullable<PostProcess>) {\r\n if (postProcess) {\r\n postProcess.autoClear = false;\r\n postProcess.inputTexture = prePassRenderTarget.renderTarget!;\r\n }\r\n\r\n if (prePassRenderTarget._outputPostProcess !== postProcess) {\r\n if (prePassRenderTarget._outputPostProcess) {\r\n this._unlinkInternalTexture(prePassRenderTarget);\r\n }\r\n prePassRenderTarget._outputPostProcess = postProcess;\r\n }\r\n\r\n if (prePassRenderTarget._internalTextureDirty) {\r\n this._updateGeometryBufferLayout();\r\n prePassRenderTarget._internalTextureDirty = false;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _unlinkInternalTexture(prePassRenderTarget: PrePassRenderTarget) {\r\n if (prePassRenderTarget._outputPostProcess) {\r\n prePassRenderTarget._outputPostProcess.autoClear = true;\r\n prePassRenderTarget._outputPostProcess.restoreDefaultInputTexture();\r\n prePassRenderTarget._outputPostProcess = null;\r\n }\r\n }\r\n\r\n private _needsImageProcessing(): boolean {\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].enabled && this._effectConfigurations[i].needsImageProcessing) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _hasImageProcessing(postProcesses: Nullable<PostProcess>[]): boolean {\r\n let isIPPAlreadyPresent = false;\r\n if (postProcesses) {\r\n for (let i = 0; i < postProcesses.length; i++) {\r\n if (postProcesses[i]?.getClassName() === \"ImageProcessingPostProcess\") {\r\n isIPPAlreadyPresent = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return isIPPAlreadyPresent;\r\n }\r\n\r\n /**\r\n * Internal, gets the first post proces.\r\n * @param postProcesses\r\n * @returns the first post process to be run on this camera.\r\n */\r\n private _getFirstPostProcess(postProcesses: Nullable<PostProcess>[]): Nullable<PostProcess> {\r\n for (let ppIndex = 0; ppIndex < postProcesses.length; ppIndex++) {\r\n if (postProcesses[ppIndex] !== null) {\r\n return postProcesses[ppIndex];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Marks the prepass renderer as dirty, triggering a check if the prepass is necessary for the next rendering.\r\n */\r\n public markAsDirty() {\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Enables a texture on the MultiRenderTarget for prepass\r\n * @param types\r\n */\r\n private _enableTextures(types: number[]) {\r\n // For velocity : enable storage of previous matrices for instances\r\n this._scene.needsPreviousWorldMatrices = false;\r\n\r\n for (let i = 0; i < types.length; i++) {\r\n const type = types[i];\r\n\r\n if (this._textureIndices[type] === -1) {\r\n this._textureIndices[type] = this._mrtLayout.length;\r\n this._mrtLayout.push(type);\r\n\r\n this._mrtTypes.push(PrePassRenderer.TextureFormats[type].type);\r\n this._mrtFormats.push(PrePassRenderer.TextureFormats[type].format);\r\n this._mrtNames.push(PrePassRenderer.TextureFormats[type].name);\r\n this.mrtCount++;\r\n }\r\n\r\n if (type === Constants.PREPASS_VELOCITY_TEXTURE_TYPE) {\r\n this._scene.needsPreviousWorldMatrices = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Makes sure that the prepass renderer is up to date if it has been dirtified.\r\n */\r\n public update() {\r\n if (this._isDirty) {\r\n this._update();\r\n }\r\n }\r\n\r\n private _update() {\r\n this._disable();\r\n let enablePrePass = false;\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = false;\r\n\r\n if (this._scene._depthPeelingRenderer && this._scene.useOrderIndependentTransparency) {\r\n this._scene._depthPeelingRenderer.setPrePassRenderer(this);\r\n enablePrePass = true;\r\n }\r\n\r\n for (let i = 0; i < this._scene.materials.length; i++) {\r\n if (this._scene.materials[i].setPrePassRenderer(this)) {\r\n enablePrePass = true;\r\n }\r\n }\r\n\r\n if (enablePrePass) {\r\n this._setRenderTargetEnabled(this.defaultRT, true);\r\n }\r\n\r\n let postProcesses;\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n if (this.renderTargets[i].renderTargetTexture) {\r\n postProcesses = this._getPostProcessesSource(this.renderTargets[i]);\r\n } else {\r\n const camera = this._scene.activeCamera;\r\n if (!camera) {\r\n continue;\r\n }\r\n\r\n postProcesses = camera._postProcesses;\r\n }\r\n\r\n if (!postProcesses) {\r\n continue;\r\n }\r\n\r\n postProcesses = <Nullable<PostProcess[]>>postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n\r\n if (postProcesses) {\r\n for (let j = 0; j < postProcesses.length; j++) {\r\n if (postProcesses[j].setPrePassRenderer(this)) {\r\n this._setRenderTargetEnabled(this.renderTargets[i], true);\r\n enablePrePass = true;\r\n }\r\n }\r\n\r\n if (this._hasImageProcessing(postProcesses)) {\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = true;\r\n }\r\n }\r\n }\r\n\r\n this._markAllMaterialsAsPrePassDirty();\r\n this._isDirty = false;\r\n\r\n if (enablePrePass) {\r\n this._enable();\r\n }\r\n }\r\n\r\n private _markAllMaterialsAsPrePassDirty() {\r\n const materials = this._scene.materials;\r\n\r\n for (let i = 0; i < materials.length; i++) {\r\n materials[i].markAsDirty(Material.PrePassDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the prepass renderer.\r\n */\r\n public dispose() {\r\n for (let i = this.renderTargets.length - 1; i >= 0; i--) {\r\n this.renderTargets[i].dispose();\r\n }\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].dispose) {\r\n this._effectConfigurations[i].dispose!();\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"prePassRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/prePassRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { PrePassRenderTarget } from \"../Materials/Textures/prePassRenderTarget\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Material } from \"../Materials/material\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { PrePassEffectConfiguration } from \"./prePassEffectConfiguration\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { GeometryBufferRenderer } from \"../Rendering/geometryBufferRenderer\";\r\n\r\nimport \"../Engines/Extensions/engine.multiRender\";\r\n\r\n/**\r\n * Renders a pre pass of the scene\r\n * This means every mesh in the scene will be rendered to a render target texture\r\n * And then this texture will be composited to the rendering canvas with post processes\r\n * It is necessary for effects like subsurface scattering or deferred shading\r\n */\r\nexport class PrePassRenderer {\r\n /**\r\n * @internal\r\n */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"PrePassRendererSceneComponent\");\r\n };\r\n\r\n /**\r\n * To save performance, we can excluded skinned meshes from the prepass\r\n */\r\n public excludedSkinnedMesh: AbstractMesh[] = [];\r\n\r\n /**\r\n * Force material to be excluded from the prepass\r\n * Can be useful when `useGeometryBufferFallback` is set to `true`\r\n * and you don't want a material to show in the effect.\r\n */\r\n public excludedMaterials: Material[] = [];\r\n\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n\r\n /**\r\n * Number of textures in the multi render target texture where the scene is directly rendered\r\n */\r\n public mrtCount: number = 0;\r\n\r\n private _mrtTypes: number[] = [];\r\n private _mrtFormats: number[] = [];\r\n private _mrtLayout: number[] = [];\r\n private _mrtNames: string[] = [];\r\n private _textureIndices: number[] = [];\r\n\r\n private _multiRenderAttachments: number[];\r\n private _defaultAttachments: number[];\r\n private _clearAttachments: number[];\r\n private _clearDepthAttachments: number[];\r\n private _generateNormalsInWorldSpace = false;\r\n\r\n /**\r\n * Indicates if the prepass renderer is generating normals in world space or camera space (default: camera space)\r\n */\r\n public get generateNormalsInWorldSpace() {\r\n return this._generateNormalsInWorldSpace;\r\n }\r\n\r\n public set generateNormalsInWorldSpace(value: boolean) {\r\n if (this._generateNormalsInWorldSpace === value) {\r\n return;\r\n }\r\n\r\n this._generateNormalsInWorldSpace = value;\r\n this._markAllMaterialsAsPrePassDirty();\r\n }\r\n\r\n /**\r\n * Returns the index of a texture in the multi render target texture array.\r\n * @param type Texture type\r\n * @returns The index\r\n */\r\n public getIndex(type: number): number {\r\n return this._textureIndices[type];\r\n }\r\n\r\n /**\r\n * How many samples are used for MSAA of the scene render target\r\n */\r\n public get samples() {\r\n return this.defaultRT.samples;\r\n }\r\n\r\n public set samples(n: number) {\r\n this.defaultRT.samples = n;\r\n }\r\n\r\n private _useSpecificClearForDepthTexture = false;\r\n\r\n /**\r\n * If set to true (default: false), the depth texture will be cleared with the depth value corresponding to the far plane (1 in normal mode, 0 in reverse depth buffer mode)\r\n * If set to false, the depth texture is always cleared with 0.\r\n */\r\n public get useSpecificClearForDepthTexture() {\r\n return this._useSpecificClearForDepthTexture;\r\n }\r\n\r\n public set useSpecificClearForDepthTexture(value: boolean) {\r\n if (this._useSpecificClearForDepthTexture === value) {\r\n return;\r\n }\r\n\r\n this._useSpecificClearForDepthTexture = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Describes the types and formats of the textures used by the pre-pass renderer\r\n */\r\n public static TextureFormats = [\r\n {\r\n purpose: Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Irradiance\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Position\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Velocity\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Reflectivity\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_COLOR_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Color\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_FLOAT,\r\n format: Constants.TEXTUREFORMAT_R,\r\n name: \"prePass_Depth\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_NORMAL_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Normal\",\r\n },\r\n {\r\n purpose: Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE,\r\n type: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n name: \"prePass_Albedo\",\r\n },\r\n ];\r\n\r\n private _isDirty: boolean = true;\r\n\r\n /**\r\n * The render target where the scene is directly rendered\r\n */\r\n public defaultRT: PrePassRenderTarget;\r\n\r\n /**\r\n * Configuration for prepass effects\r\n */\r\n private _effectConfigurations: PrePassEffectConfiguration[] = [];\r\n\r\n /**\r\n * @returns the prepass render target for the rendering pass.\r\n * If we are currently rendering a render target, it returns the PrePassRenderTarget\r\n * associated with that render target. Otherwise, it returns the scene default PrePassRenderTarget\r\n */\r\n public getRenderTarget(): PrePassRenderTarget {\r\n return this._currentTarget;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Managed by the scene component\r\n * @param prePassRenderTarget\r\n */\r\n public _setRenderTarget(prePassRenderTarget: Nullable<PrePassRenderTarget>): void {\r\n if (prePassRenderTarget) {\r\n this._currentTarget = prePassRenderTarget;\r\n } else {\r\n this._currentTarget = this.defaultRT;\r\n this._engine.currentRenderPassId = this._scene.activeCamera?.renderPassId ?? this._currentTarget.renderPassId;\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the currently rendered prePassRenderTarget is the one\r\n * associated with the scene.\r\n */\r\n public get currentRTisSceneRT(): boolean {\r\n return this._currentTarget === this.defaultRT;\r\n }\r\n\r\n private _geometryBuffer: Nullable<GeometryBufferRenderer>;\r\n\r\n /**\r\n * Prevents the PrePassRenderer from using the GeometryBufferRenderer as a fallback\r\n */\r\n public doNotUseGeometryRendererFallback = true;\r\n\r\n private _refreshGeometryBufferRendererLink() {\r\n if (!this.doNotUseGeometryRendererFallback) {\r\n this._geometryBuffer = this._scene.enableGeometryBufferRenderer();\r\n\r\n if (!this._geometryBuffer) {\r\n // Not supported\r\n this.doNotUseGeometryRendererFallback = true;\r\n return;\r\n }\r\n\r\n this._geometryBuffer._linkPrePassRenderer(this);\r\n } else {\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer._unlinkPrePassRenderer();\r\n }\r\n this._geometryBuffer = null;\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n }\r\n\r\n private _currentTarget: PrePassRenderTarget;\r\n\r\n /**\r\n * All the render targets generated by prepass\r\n */\r\n public renderTargets: PrePassRenderTarget[] = [];\r\n\r\n private readonly _clearColor = new Color4(0, 0, 0, 0);\r\n private readonly _clearDepthColor = new Color4(1e8, 0, 0, 1); // \"infinity\" value - depth in the depth texture is view.z, not a 0..1 value!\r\n\r\n private _enabled: boolean = false;\r\n\r\n private _needsCompositionForThisPass = false;\r\n private _postProcessesSourceForThisPass: Nullable<PostProcess>[];\r\n\r\n /**\r\n * Indicates if the prepass is enabled\r\n */\r\n public get enabled() {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * Set to true to disable gamma transform in PrePass.\r\n * Can be useful in case you already proceed to gamma transform on a material level\r\n * and your post processes don't need to be in linear color space.\r\n */\r\n public disableGammaTransform = false;\r\n\r\n /**\r\n * Instantiates a prepass renderer\r\n * @param scene The scene\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n\r\n let type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n if (this._engine._caps.textureFloat && this._engine._caps.textureFloatLinearFiltering) {\r\n type = Constants.TEXTURETYPE_FLOAT;\r\n } else if (this._engine._caps.textureHalfFloat && this._engine._caps.textureHalfFloatLinearFiltering) {\r\n type = Constants.TEXTURETYPE_HALF_FLOAT;\r\n }\r\n\r\n for (let i = 0; i < PrePassRenderer.TextureFormats.length; ++i) {\r\n const format = PrePassRenderer.TextureFormats[i].format;\r\n if (PrePassRenderer.TextureFormats[i].type === Constants.TEXTURETYPE_FLOAT) {\r\n PrePassRenderer.TextureFormats[Constants.PREPASS_DEPTH_TEXTURE_TYPE].type = type;\r\n if (\r\n (format === Constants.TEXTUREFORMAT_R || format === Constants.TEXTUREFORMAT_RG || format === Constants.TEXTUREFORMAT_RGBA) &&\r\n !this._engine._caps.supportFloatTexturesResolve\r\n ) {\r\n // We don't know in advance if the texture will be used as a resolve target, so we revert to half_float if the extension to resolve full float textures is not supported\r\n PrePassRenderer.TextureFormats[Constants.PREPASS_DEPTH_TEXTURE_TYPE].type = Constants.TEXTURETYPE_HALF_FLOAT;\r\n }\r\n }\r\n }\r\n\r\n PrePassRenderer._SceneComponentInitialization(this._scene);\r\n this.defaultRT = this._createRenderTarget(\"sceneprePassRT\", null);\r\n this._currentTarget = this.defaultRT;\r\n }\r\n\r\n /**\r\n * Creates a new PrePassRenderTarget\r\n * This should be the only way to instantiate a `PrePassRenderTarget`\r\n * @param name Name of the `PrePassRenderTarget`\r\n * @param renderTargetTexture RenderTarget the `PrePassRenderTarget` will be attached to.\r\n * Can be `null` if the created `PrePassRenderTarget` is attached to the scene (default framebuffer).\r\n * @internal\r\n */\r\n public _createRenderTarget(name: string, renderTargetTexture: Nullable<RenderTargetTexture>): PrePassRenderTarget {\r\n const rt = new PrePassRenderTarget(name, renderTargetTexture, { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, 0, this._scene, {\r\n generateMipMaps: false,\r\n generateStencilBuffer: this._engine.isStencilEnable,\r\n defaultType: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n types: [],\r\n drawOnlyOnFirstAttachmentByDefault: true,\r\n });\r\n\r\n this.renderTargets.push(rt);\r\n\r\n if (this._enabled) {\r\n // The pre-pass renderer is already enabled, so make sure we create the render target with the correct number of textures\r\n this._update();\r\n }\r\n\r\n return rt;\r\n }\r\n\r\n /**\r\n * Indicates if rendering a prepass is supported\r\n */\r\n public get isSupported() {\r\n return this._scene.getEngine().getCaps().drawBuffersExtension;\r\n }\r\n\r\n /**\r\n * Sets the proper output textures to draw in the engine.\r\n * @param effect The effect that is drawn. It can be or not be compatible with drawing to several output textures.\r\n * @param subMesh Submesh on which the effect is applied\r\n */\r\n public bindAttachmentsForEffect(effect: Effect, subMesh: SubMesh) {\r\n const material = subMesh.getMaterial();\r\n const isPrePassCapable = material && material.isPrePassCapable;\r\n const excluded = material && this.excludedMaterials.indexOf(material) !== -1;\r\n\r\n if (this.enabled && this._currentTarget.enabled) {\r\n if (effect._multiTarget && isPrePassCapable && !excluded) {\r\n this._engine.bindAttachments(this._multiRenderAttachments);\r\n } else {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n } else {\r\n this._engine.restoreSingleAttachment();\r\n }\r\n\r\n if (this._geometryBuffer && this.currentRTisSceneRT && !excluded) {\r\n this._geometryBuffer.renderList!.push(subMesh.getRenderingMesh());\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _reinitializeAttachments() {\r\n const multiRenderLayout = [];\r\n const clearLayout = [false];\r\n const clearDepthLayout = [false];\r\n const defaultLayout = [true];\r\n\r\n for (let i = 0; i < this.mrtCount; i++) {\r\n multiRenderLayout.push(true);\r\n\r\n if (i > 0) {\r\n if (this._useSpecificClearForDepthTexture && this._mrtLayout[i] === Constants.PREPASS_DEPTH_TEXTURE_TYPE) {\r\n clearLayout.push(false);\r\n clearDepthLayout.push(true);\r\n } else {\r\n clearLayout.push(true);\r\n clearDepthLayout.push(false);\r\n }\r\n defaultLayout.push(false);\r\n }\r\n }\r\n\r\n this._multiRenderAttachments = this._engine.buildTextureLayout(multiRenderLayout);\r\n this._clearAttachments = this._engine.buildTextureLayout(clearLayout);\r\n this._clearDepthAttachments = this._engine.buildTextureLayout(clearDepthLayout);\r\n this._defaultAttachments = this._engine.buildTextureLayout(defaultLayout);\r\n }\r\n\r\n private _resetLayout() {\r\n for (let i = 0; i < PrePassRenderer.TextureFormats.length; i++) {\r\n this._textureIndices[PrePassRenderer.TextureFormats[i].purpose] = -1;\r\n }\r\n\r\n this._textureIndices[Constants.PREPASS_COLOR_TEXTURE_TYPE] = 0;\r\n this._mrtLayout = [Constants.PREPASS_COLOR_TEXTURE_TYPE];\r\n this._mrtTypes = [PrePassRenderer.TextureFormats[Constants.PREPASS_COLOR_TEXTURE_TYPE].type];\r\n this._mrtFormats = [PrePassRenderer.TextureFormats[Constants.PREPASS_COLOR_TEXTURE_TYPE].format];\r\n this._mrtNames = [PrePassRenderer.TextureFormats[Constants.PREPASS_COLOR_TEXTURE_TYPE].name];\r\n this.mrtCount = 1;\r\n }\r\n\r\n private _updateGeometryBufferLayout() {\r\n this._refreshGeometryBufferRendererLink();\r\n\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer._resetLayout();\r\n\r\n const texturesActivated = [];\r\n\r\n for (let i = 0; i < this._mrtLayout.length; i++) {\r\n texturesActivated.push(false);\r\n }\r\n\r\n this._geometryBuffer._linkInternalTexture(this.defaultRT.getInternalTexture()!);\r\n\r\n const matches = [\r\n {\r\n prePassConstant: Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.DEPTH_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_NORMAL_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.NORMAL_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.POSITION_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.REFLECTIVITY_TEXTURE_TYPE,\r\n },\r\n {\r\n prePassConstant: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,\r\n geometryBufferConstant: GeometryBufferRenderer.VELOCITY_TEXTURE_TYPE,\r\n },\r\n ];\r\n\r\n // replace textures in the geometryBuffer RT\r\n for (let i = 0; i < matches.length; i++) {\r\n const index = this._mrtLayout.indexOf(matches[i].prePassConstant);\r\n if (index !== -1) {\r\n this._geometryBuffer._forceTextureType(matches[i].geometryBufferConstant, index);\r\n texturesActivated[index] = true;\r\n }\r\n }\r\n\r\n this._geometryBuffer._setAttachments(this._engine.buildTextureLayout(texturesActivated));\r\n }\r\n }\r\n\r\n /**\r\n * Restores attachments for single texture draw.\r\n */\r\n public restoreAttachments() {\r\n if (this.enabled && this._currentTarget.enabled && this._defaultAttachments) {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n } else {\r\n this._engine.restoreSingleAttachment();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _beforeDraw(camera?: Camera, faceIndex?: number, layer?: number) {\r\n // const previousEnabled = this._enabled && this._currentTarget.enabled;\r\n\r\n if (this._isDirty) {\r\n this._update();\r\n }\r\n\r\n if (!this._enabled || !this._currentTarget.enabled) {\r\n return;\r\n }\r\n\r\n if (this._geometryBuffer) {\r\n this._geometryBuffer.renderList = [];\r\n }\r\n\r\n this._setupOutputForThisPass(this._currentTarget, camera);\r\n }\r\n\r\n private _prepareFrame(prePassRenderTarget: PrePassRenderTarget, faceIndex?: number, layer?: number) {\r\n if (prePassRenderTarget.renderTargetTexture) {\r\n prePassRenderTarget.renderTargetTexture._prepareFrame(this._scene, faceIndex, layer, prePassRenderTarget.renderTargetTexture.useCameraPostProcesses);\r\n } else if (this._postProcessesSourceForThisPass.length) {\r\n this._scene.postProcessManager._prepareFrame();\r\n } else {\r\n this._engine.restoreDefaultFramebuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Sets an intermediary texture between prepass and postprocesses. This texture\r\n * will be used as input for post processes\r\n * @param rt The render target texture to use\r\n * @returns true if there are postprocesses that will use this texture,\r\n * false if there is no postprocesses - and the function has no effect\r\n */\r\n public setCustomOutput(rt: RenderTargetTexture) {\r\n const firstPP = this._postProcessesSourceForThisPass[0];\r\n if (!firstPP) {\r\n return false;\r\n }\r\n\r\n firstPP.inputTexture = rt.renderTarget!;\r\n\r\n return true;\r\n }\r\n\r\n private _renderPostProcesses(prePassRenderTarget: PrePassRenderTarget, faceIndex?: number) {\r\n const firstPP = this._postProcessesSourceForThisPass[0];\r\n const outputTexture = firstPP ? firstPP.inputTexture : prePassRenderTarget.renderTargetTexture ? prePassRenderTarget.renderTargetTexture.renderTarget : null;\r\n\r\n // Build post process chain for this prepass post draw\r\n let postProcessChain = this._currentTarget._beforeCompositionPostProcesses;\r\n\r\n if (this._needsCompositionForThisPass) {\r\n postProcessChain = postProcessChain.concat([this._currentTarget.imageProcessingPostProcess]);\r\n }\r\n\r\n // Activates and renders the chain\r\n if (postProcessChain.length) {\r\n this._scene.postProcessManager._prepareFrame(this._currentTarget.renderTarget?.texture, postProcessChain);\r\n this._scene.postProcessManager.directRender(postProcessChain, outputTexture, false, faceIndex);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _afterDraw(faceIndex?: number, layer?: number) {\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._prepareFrame(this._currentTarget, faceIndex, layer);\r\n this._renderPostProcesses(this._currentTarget, faceIndex);\r\n }\r\n }\r\n\r\n /**\r\n * Clears the current prepass render target (in the sense of settings pixels to the scene clear color value)\r\n * @internal\r\n */\r\n public _clear() {\r\n if (this._isDirty) {\r\n this._update();\r\n }\r\n\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._bindFrameBuffer();\r\n\r\n // Clearing other attachment with 0 on all other attachments\r\n this._engine.bindAttachments(this._clearAttachments);\r\n this._engine.clear(this._clearColor, true, false, false);\r\n if (this._useSpecificClearForDepthTexture) {\r\n this._engine.bindAttachments(this._clearDepthAttachments);\r\n this._engine.clear(this._clearDepthColor, true, false, false);\r\n }\r\n // Regular clear color with the scene clear color of the 1st attachment\r\n this._engine.bindAttachments(this._defaultAttachments);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _bindFrameBuffer() {\r\n if (this._enabled && this._currentTarget.enabled) {\r\n this._currentTarget._checkSize();\r\n const internalTexture = this._currentTarget.renderTarget;\r\n if (internalTexture) {\r\n this._engine.bindFramebuffer(internalTexture);\r\n }\r\n }\r\n }\r\n\r\n private _setEnabled(enabled: boolean) {\r\n this._enabled = enabled;\r\n }\r\n\r\n private _setRenderTargetEnabled(prePassRenderTarget: PrePassRenderTarget, enabled: boolean) {\r\n prePassRenderTarget.enabled = enabled;\r\n if (!enabled) {\r\n this._unlinkInternalTexture(prePassRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * Adds an effect configuration to the prepass render target.\r\n * If an effect has already been added, it won't add it twice and will return the configuration\r\n * already present.\r\n * @param cfg the effect configuration\r\n * @returns the effect configuration now used by the prepass\r\n */\r\n public addEffectConfiguration(cfg: PrePassEffectConfiguration): PrePassEffectConfiguration {\r\n // Do not add twice\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].name === cfg.name) {\r\n return this._effectConfigurations[i];\r\n }\r\n }\r\n\r\n this._effectConfigurations.push(cfg);\r\n return cfg;\r\n }\r\n\r\n /**\r\n * Retrieves an effect configuration by name\r\n * @param name the name of the effect configuration\r\n * @returns the effect configuration, or null if not present\r\n */\r\n public getEffectConfiguration(name: string): Nullable<PrePassEffectConfiguration> {\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].name === name) {\r\n return this._effectConfigurations[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _enable() {\r\n const previousMrtCount = this.mrtCount;\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].enabled) {\r\n this._enableTextures(this._effectConfigurations[i].texturesRequired);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n if (this.mrtCount !== previousMrtCount || this.renderTargets[i].count !== this.mrtCount) {\r\n this.renderTargets[i].updateCount(this.mrtCount, { types: this._mrtTypes, formats: this._mrtFormats }, this._mrtNames.concat(\"prePass_DepthBuffer\"));\r\n }\r\n\r\n this.renderTargets[i]._resetPostProcessChain();\r\n\r\n for (let j = 0; j < this._effectConfigurations.length; j++) {\r\n if (this._effectConfigurations[j].enabled) {\r\n // TODO : subsurface scattering has 1 scene-wide effect configuration\r\n // solution : do not stock postProcess on effectConfiguration, but in the prepassRenderTarget (hashmap configuration => postProcess)\r\n // And call createPostProcess whenever the post process does not exist in the RT\r\n if (!this._effectConfigurations[j].postProcess && this._effectConfigurations[j].createPostProcess) {\r\n this._effectConfigurations[j].createPostProcess!();\r\n }\r\n\r\n if (this._effectConfigurations[j].postProcess) {\r\n this.renderTargets[i]._beforeCompositionPostProcesses.push(this._effectConfigurations[j].postProcess!);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._reinitializeAttachments();\r\n this._setEnabled(true);\r\n this._updateGeometryBufferLayout();\r\n }\r\n\r\n private _disable() {\r\n this._setEnabled(false);\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n this._setRenderTargetEnabled(this.renderTargets[i], false);\r\n }\r\n\r\n this._resetLayout();\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n this._effectConfigurations[i].enabled = false;\r\n }\r\n }\r\n\r\n private _getPostProcessesSource(prePassRenderTarget: PrePassRenderTarget, camera?: Camera): Nullable<PostProcess>[] {\r\n if (camera) {\r\n return camera._postProcesses;\r\n } else if (prePassRenderTarget.renderTargetTexture) {\r\n if (prePassRenderTarget.renderTargetTexture.useCameraPostProcesses) {\r\n const camera = prePassRenderTarget.renderTargetTexture.activeCamera ? prePassRenderTarget.renderTargetTexture.activeCamera : this._scene.activeCamera;\r\n return camera ? camera._postProcesses : [];\r\n } else if (prePassRenderTarget.renderTargetTexture.postProcesses) {\r\n return prePassRenderTarget.renderTargetTexture.postProcesses;\r\n } else {\r\n return [];\r\n }\r\n } else {\r\n return this._scene.activeCamera ? this._scene.activeCamera._postProcesses : [];\r\n }\r\n }\r\n\r\n private _setupOutputForThisPass(prePassRenderTarget: PrePassRenderTarget, camera?: Camera) {\r\n // Order is : draw ===> prePassRenderTarget._postProcesses ==> ipp ==> camera._postProcesses\r\n const secondaryCamera = camera && this._scene.activeCameras && !!this._scene.activeCameras.length && this._scene.activeCameras.indexOf(camera) !== 0;\r\n this._postProcessesSourceForThisPass = this._getPostProcessesSource(prePassRenderTarget, camera);\r\n this._postProcessesSourceForThisPass = this._postProcessesSourceForThisPass.filter((pp) => {\r\n return pp != null;\r\n });\r\n this._scene.autoClear = true;\r\n\r\n const cameraHasImageProcessing = this._hasImageProcessing(this._postProcessesSourceForThisPass);\r\n this._needsCompositionForThisPass = !cameraHasImageProcessing && !this.disableGammaTransform && this._needsImageProcessing() && !secondaryCamera;\r\n\r\n const firstCameraPP = this._getFirstPostProcess(this._postProcessesSourceForThisPass);\r\n const firstPrePassPP = prePassRenderTarget._beforeCompositionPostProcesses && prePassRenderTarget._beforeCompositionPostProcesses[0];\r\n let firstPP = null;\r\n\r\n // Setting the scene-wide post process configuration\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = this._needsCompositionForThisPass || cameraHasImageProcessing;\r\n\r\n // Create composition effect if needed\r\n if (this._needsCompositionForThisPass && !prePassRenderTarget.imageProcessingPostProcess) {\r\n prePassRenderTarget._createCompositionEffect();\r\n }\r\n\r\n // Setting the prePassRenderTarget as input texture of the first PP\r\n if (firstPrePassPP) {\r\n firstPP = firstPrePassPP;\r\n } else if (this._needsCompositionForThisPass) {\r\n firstPP = prePassRenderTarget.imageProcessingPostProcess;\r\n } else if (firstCameraPP) {\r\n firstPP = firstCameraPP;\r\n }\r\n\r\n this._bindFrameBuffer();\r\n this._linkInternalTexture(prePassRenderTarget, firstPP);\r\n }\r\n\r\n private _linkInternalTexture(prePassRenderTarget: PrePassRenderTarget, postProcess: Nullable<PostProcess>) {\r\n if (postProcess) {\r\n postProcess.autoClear = false;\r\n postProcess.inputTexture = prePassRenderTarget.renderTarget!;\r\n }\r\n\r\n if (prePassRenderTarget._outputPostProcess !== postProcess) {\r\n if (prePassRenderTarget._outputPostProcess) {\r\n this._unlinkInternalTexture(prePassRenderTarget);\r\n }\r\n prePassRenderTarget._outputPostProcess = postProcess;\r\n }\r\n\r\n if (prePassRenderTarget._internalTextureDirty) {\r\n this._updateGeometryBufferLayout();\r\n prePassRenderTarget._internalTextureDirty = false;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _unlinkInternalTexture(prePassRenderTarget: PrePassRenderTarget) {\r\n if (prePassRenderTarget._outputPostProcess) {\r\n prePassRenderTarget._outputPostProcess.autoClear = true;\r\n prePassRenderTarget._outputPostProcess.restoreDefaultInputTexture();\r\n prePassRenderTarget._outputPostProcess = null;\r\n }\r\n }\r\n\r\n private _needsImageProcessing(): boolean {\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].enabled && this._effectConfigurations[i].needsImageProcessing) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _hasImageProcessing(postProcesses: Nullable<PostProcess>[]): boolean {\r\n let isIPPAlreadyPresent = false;\r\n if (postProcesses) {\r\n for (let i = 0; i < postProcesses.length; i++) {\r\n if (postProcesses[i]?.getClassName() === \"ImageProcessingPostProcess\") {\r\n isIPPAlreadyPresent = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return isIPPAlreadyPresent;\r\n }\r\n\r\n /**\r\n * Internal, gets the first post proces.\r\n * @param postProcesses\r\n * @returns the first post process to be run on this camera.\r\n */\r\n private _getFirstPostProcess(postProcesses: Nullable<PostProcess>[]): Nullable<PostProcess> {\r\n for (let ppIndex = 0; ppIndex < postProcesses.length; ppIndex++) {\r\n if (postProcesses[ppIndex] !== null) {\r\n return postProcesses[ppIndex];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Marks the prepass renderer as dirty, triggering a check if the prepass is necessary for the next rendering.\r\n */\r\n public markAsDirty() {\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Enables a texture on the MultiRenderTarget for prepass\r\n * @param types\r\n */\r\n private _enableTextures(types: number[]) {\r\n // For velocity : enable storage of previous matrices for instances\r\n this._scene.needsPreviousWorldMatrices = false;\r\n\r\n for (let i = 0; i < types.length; i++) {\r\n const type = types[i];\r\n\r\n if (this._textureIndices[type] === -1) {\r\n this._textureIndices[type] = this._mrtLayout.length;\r\n this._mrtLayout.push(type);\r\n\r\n this._mrtTypes.push(PrePassRenderer.TextureFormats[type].type);\r\n this._mrtFormats.push(PrePassRenderer.TextureFormats[type].format);\r\n this._mrtNames.push(PrePassRenderer.TextureFormats[type].name);\r\n this.mrtCount++;\r\n }\r\n\r\n if (type === Constants.PREPASS_VELOCITY_TEXTURE_TYPE) {\r\n this._scene.needsPreviousWorldMatrices = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Makes sure that the prepass renderer is up to date if it has been dirtified.\r\n */\r\n public update() {\r\n if (this._isDirty) {\r\n this._update();\r\n }\r\n }\r\n\r\n private _update() {\r\n this._disable();\r\n let enablePrePass = false;\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = false;\r\n\r\n if (this._scene._depthPeelingRenderer && this._scene.useOrderIndependentTransparency) {\r\n this._scene._depthPeelingRenderer.setPrePassRenderer(this);\r\n enablePrePass = true;\r\n }\r\n\r\n for (let i = 0; i < this._scene.materials.length; i++) {\r\n if (this._scene.materials[i].setPrePassRenderer(this)) {\r\n enablePrePass = true;\r\n }\r\n }\r\n\r\n if (enablePrePass) {\r\n this._setRenderTargetEnabled(this.defaultRT, true);\r\n }\r\n\r\n let postProcesses;\r\n\r\n for (let i = 0; i < this.renderTargets.length; i++) {\r\n if (this.renderTargets[i].renderTargetTexture) {\r\n postProcesses = this._getPostProcessesSource(this.renderTargets[i]);\r\n } else {\r\n const camera = this._scene.activeCamera;\r\n if (!camera) {\r\n continue;\r\n }\r\n\r\n postProcesses = camera._postProcesses;\r\n }\r\n\r\n if (!postProcesses) {\r\n continue;\r\n }\r\n\r\n postProcesses = <Nullable<PostProcess[]>>postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n\r\n if (postProcesses) {\r\n for (let j = 0; j < postProcesses.length; j++) {\r\n if (postProcesses[j].setPrePassRenderer(this)) {\r\n this._setRenderTargetEnabled(this.renderTargets[i], true);\r\n enablePrePass = true;\r\n }\r\n }\r\n\r\n if (this._hasImageProcessing(postProcesses)) {\r\n this._scene.imageProcessingConfiguration.applyByPostProcess = true;\r\n }\r\n }\r\n }\r\n\r\n this._markAllMaterialsAsPrePassDirty();\r\n this._isDirty = false;\r\n\r\n if (enablePrePass) {\r\n this._enable();\r\n }\r\n }\r\n\r\n private _markAllMaterialsAsPrePassDirty() {\r\n const materials = this._scene.materials;\r\n\r\n for (let i = 0; i < materials.length; i++) {\r\n materials[i].markAsDirty(Material.PrePassDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the prepass renderer.\r\n */\r\n public dispose() {\r\n for (let i = this.renderTargets.length - 1; i >= 0; i--) {\r\n this.renderTargets[i].dispose();\r\n }\r\n\r\n for (let i = 0; i < this._effectConfigurations.length; i++) {\r\n if (this._effectConfigurations[i].dispose) {\r\n this._effectConfigurations[i].dispose!();\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -0,0 +1,5 @@
1
+ /** @internal */
2
+ export declare const bumpFragment: {
3
+ name: string;
4
+ shader: string;
5
+ };
@@ -0,0 +1,61 @@
1
+ // Do not edit.
2
+ import { ShaderStore } from "../../Engines/shaderStore.js";
3
+ const name = "bumpFragment";
4
+ const shader = `var uvOffset: vec2f= vec2f(0.0,0.0);
5
+ #if defined(BUMP) || defined(PARALLAX) || defined(DETAIL)
6
+ #ifdef NORMALXYSCALE
7
+ var normalScale: f32=1.0;
8
+ #elif defined(BUMP)
9
+ var normalScale: f32=vBumpInfos.y;
10
+ #else
11
+ var normalScale: f32=1.0;
12
+ #endif
13
+ #if defined(TANGENT) && defined(NORMAL)
14
+ var TBN: mat3x3f=vTBN;
15
+ #elif defined(BUMP)
16
+ var TBNUV: vec2f=select(-vBumpUV,vBumpUV,fragmentInputs.frontFacing);var TBN: mat3x3f=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vTangentSpaceParams);
17
+ #else
18
+ var TBNUV: vec2f=select(-vDetailUV,vDetailUV,fragmentInputs.frontFacing);var TBN: mat3x3f=cotangent_frame(normalW*normalScale,vPositionW,TBNUV, vec2f(1.,1.));
19
+ #endif
20
+ #elif defined(ANISOTROPIC)
21
+ #if defined(TANGENT) && defined(NORMAL)
22
+ var TBN: mat3x3f=vTBN;
23
+ #else
24
+ var TBNUV: vec2f=select( -vMainUV1,vMainUV1,fragmentInputs.frontFacing);var TBN: mat3x3f=cotangent_frame(normalW,vPositionW,TBNUV, vec2f(1.,1.));
25
+ #endif
26
+ #endif
27
+ #ifdef PARALLAX
28
+ var invTBN: mat3x3f=transposeMat3(TBN);
29
+ #ifdef PARALLAXOCCLUSION
30
+ uvOffset=parallaxOcclusion(invTBN*-viewDirectionW,invTBN*normalW,vBumpUV,vBumpInfos.z);
31
+ #else
32
+ uvOffset=parallaxOffset(invTBN*viewDirectionW,vBumpInfos.z);
33
+ #endif
34
+ #endif
35
+ #ifdef DETAIL
36
+ var detailColor: vec4f=textureSample(detail,detailSampler,vDetailUV+uvOffset);var detailNormalRG: vec2f=detailColor.wy*2.0-1.0;var detailNormalB: f32=sqrt(1.-saturate(dot(detailNormalRG,detailNormalRG)));var detailNormal: vec3f= vec3f(detailNormalRG,detailNormalB);
37
+ #endif
38
+ #ifdef BUMP
39
+ #ifdef OBJECTSPACE_NORMALMAP
40
+ #define CUSTOM_FRAGMENT_BUMP_FRAGMENT
41
+ normalW=normalize(textureSample(bump,bumpSampler,vBumpUV).xyz *2.0-1.0);normalW=normalize( mat3x3f(normalMatrix)*normalW);
42
+ #elif !defined(DETAIL)
43
+ normalW=perturbNormal(TBN,textureSample(bump,bumpSampler,vBumpUV+uvOffset).xyz,vBumpInfos.y);
44
+ #else
45
+ var bumpNormal: vec3f=textureSample(bump,bumpSampler,vBumpUV+uvOffset).xyz*2.0-1.0;
46
+ #if DETAIL_NORMALBLENDMETHOD==0
47
+ detailNormal.xy*=vDetailInfos.z;var blendedNormal: vec3f=normalize( vec3f(bumpNormal.xy+detailNormal.xy,bumpNormal.z*detailNormal.z));
48
+ #elif DETAIL_NORMALBLENDMETHOD==1
49
+ detailNormal.xy*=vDetailInfos.z;bumpNormal+= vec3f(0.0,0.0,1.0);detailNormal*= vec3f(-1.0,-1.0,1.0);var blendedNormal: vec3f=bumpNormal*dot(bumpNormal,detailNormal)/bumpNormal.z-detailNormal;
50
+ #endif
51
+ normalW=perturbNormalBase(TBN,blendedNormal,vBumpInfos.y);
52
+ #endif
53
+ #elif defined(DETAIL)
54
+ detailNormal.xy*=vDetailInfos.z;normalW=perturbNormalBase(TBN,detailNormal,vDetailInfos.z);
55
+ #endif
56
+ `;
57
+ // Sideeffect
58
+ ShaderStore.IncludesShadersStoreWGSL[name] = shader;
59
+ /** @internal */
60
+ export const bumpFragment = { name, shader };
61
+ //# sourceMappingURL=bumpFragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bumpFragment.js","sourceRoot":"","sources":["../../../../../dev/core/src/ShadersWGSL/ShadersInclude/bumpFragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,cAAc,CAAC;AAC5B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bumpFragment\";\nconst shader = `var uvOffset: vec2f= vec2f(0.0,0.0);\n#if defined(BUMP) || defined(PARALLAX) || defined(DETAIL)\n#ifdef NORMALXYSCALE\nvar normalScale: f32=1.0;\n#elif defined(BUMP)\nvar normalScale: f32=vBumpInfos.y;\n#else\nvar normalScale: f32=1.0;\n#endif\n#if defined(TANGENT) && defined(NORMAL)\nvar TBN: mat3x3f=vTBN;\n#elif defined(BUMP)\nvar TBNUV: vec2f=select(-vBumpUV,vBumpUV,fragmentInputs.frontFacing);var TBN: mat3x3f=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vTangentSpaceParams);\n#else\nvar TBNUV: vec2f=select(-vDetailUV,vDetailUV,fragmentInputs.frontFacing);var TBN: mat3x3f=cotangent_frame(normalW*normalScale,vPositionW,TBNUV, vec2f(1.,1.));\n#endif\n#elif defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nvar TBN: mat3x3f=vTBN;\n#else\nvar TBNUV: vec2f=select( -vMainUV1,vMainUV1,fragmentInputs.frontFacing);var TBN: mat3x3f=cotangent_frame(normalW,vPositionW,TBNUV, vec2f(1.,1.));\n#endif\n#endif\n#ifdef PARALLAX\nvar invTBN: mat3x3f=transposeMat3(TBN);\n#ifdef PARALLAXOCCLUSION\nuvOffset=parallaxOcclusion(invTBN*-viewDirectionW,invTBN*normalW,vBumpUV,vBumpInfos.z);\n#else\nuvOffset=parallaxOffset(invTBN*viewDirectionW,vBumpInfos.z);\n#endif\n#endif\n#ifdef DETAIL\nvar detailColor: vec4f=textureSample(detail,detailSampler,vDetailUV+uvOffset);var detailNormalRG: vec2f=detailColor.wy*2.0-1.0;var detailNormalB: f32=sqrt(1.-saturate(dot(detailNormalRG,detailNormalRG)));var detailNormal: vec3f= vec3f(detailNormalRG,detailNormalB);\n#endif\n#ifdef BUMP\n#ifdef OBJECTSPACE_NORMALMAP\n#define CUSTOM_FRAGMENT_BUMP_FRAGMENT\nnormalW=normalize(textureSample(bump,bumpSampler,vBumpUV).xyz *2.0-1.0);normalW=normalize( mat3x3f(normalMatrix)*normalW);\n#elif !defined(DETAIL)\nnormalW=perturbNormal(TBN,textureSample(bump,bumpSampler,vBumpUV+uvOffset).xyz,vBumpInfos.y);\n#else\nvar bumpNormal: vec3f=textureSample(bump,bumpSampler,vBumpUV+uvOffset).xyz*2.0-1.0;\n#if DETAIL_NORMALBLENDMETHOD==0 \ndetailNormal.xy*=vDetailInfos.z;var blendedNormal: vec3f=normalize( vec3f(bumpNormal.xy+detailNormal.xy,bumpNormal.z*detailNormal.z));\n#elif DETAIL_NORMALBLENDMETHOD==1 \ndetailNormal.xy*=vDetailInfos.z;bumpNormal+= vec3f(0.0,0.0,1.0);detailNormal*= vec3f(-1.0,-1.0,1.0);var blendedNormal: vec3f=bumpNormal*dot(bumpNormal,detailNormal)/bumpNormal.z-detailNormal;\n#endif\nnormalW=perturbNormalBase(TBN,blendedNormal,vBumpInfos.y);\n#endif\n#elif defined(DETAIL)\ndetailNormal.xy*=vDetailInfos.z;normalW=perturbNormalBase(TBN,detailNormal,vDetailInfos.z);\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStoreWGSL[name] = shader;\n/** @internal */\nexport const bumpFragment = { name, shader };\n"]}
@@ -0,0 +1,6 @@
1
+ import "./samplerFragmentDeclaration";
2
+ /** @internal */
3
+ export declare const bumpFragmentFunctions: {
4
+ name: string;
5
+ shader: string;
6
+ };
@@ -0,0 +1,40 @@
1
+ // Do not edit.
2
+ import { ShaderStore } from "../../Engines/shaderStore.js";
3
+ import "./samplerFragmentDeclaration.js";
4
+ const name = "bumpFragmentFunctions";
5
+ const shader = `#if defined(BUMP)
6
+ #include<samplerFragmentDeclaration>(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_SAMPLERNAME_,bump)
7
+ #endif
8
+ #if defined(DETAIL)
9
+ #include<samplerFragmentDeclaration>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_SAMPLERNAME_,detail)
10
+ #endif
11
+ #if defined(BUMP) && defined(PARALLAX)
12
+ const minSamples: f32=4.;const maxSamples: f32=15.;const iMaxSamples: i32=15;fn parallaxOcclusion(vViewDirCoT: vec3f,vNormalCoT: vec3f,texCoord: vec2f,parallaxScale: f32)->vec2f {var parallaxLimit: f32=length(vViewDirCoT.xy)/vViewDirCoT.z;parallaxLimit*=parallaxScale;var vOffsetDir: vec2f=normalize(vViewDirCoT.xy);var vMaxOffset: vec2f=vOffsetDir*parallaxLimit;var numSamples: f32=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));var stepSize: f32=1.0/numSamples;var currRayHeight: f32=1.0;var vCurrOffset: vec2f= vec2f(0,0);var vLastOffset: vec2f= vec2f(0,0);var lastSampledHeight: f32=1.0;var currSampledHeight: f32=1.0;var keepWorking: bool=true;for (var i: i32=0; i<iMaxSamples; i++)
13
+ {currSampledHeight=textureSample(bump,bumpSampler,texCoord+vCurrOffset).w;if (!keepWorking)
14
+ {}
15
+ else if (currSampledHeight>currRayHeight)
16
+ {var delta1: f32=currSampledHeight-currRayHeight;var delta2: f32=(currRayHeight+stepSize)-lastSampledHeight;var ratio: f32=delta1/(delta1+delta2);vCurrOffset=(ratio)* vLastOffset+(1.0-ratio)*vCurrOffset;keepWorking=false;}
17
+ else
18
+ {currRayHeight-=stepSize;vLastOffset=vCurrOffset;
19
+ #ifdef PARALLAX_RHS
20
+ vCurrOffset-=stepSize*vMaxOffset;
21
+ #else
22
+ vCurrOffset+=stepSize*vMaxOffset;
23
+ #endif
24
+ lastSampledHeight=currSampledHeight;}}
25
+ return vCurrOffset;}
26
+ fn parallaxOffset(viewDir: vec3f,heightScale: f32)->vec2f
27
+ {var height: f32=textureSample(bump,bumpSampler,vBumpUV).w;var texCoordOffset: vec2f=heightScale*viewDir.xy*height;
28
+ #ifdef PARALLAX_RHS
29
+ return texCoordOffset;
30
+ #else
31
+ return -texCoordOffset;
32
+ #endif
33
+ }
34
+ #endif
35
+ `;
36
+ // Sideeffect
37
+ ShaderStore.IncludesShadersStoreWGSL[name] = shader;
38
+ /** @internal */
39
+ export const bumpFragmentFunctions = { name, shader };
40
+ //# sourceMappingURL=bumpFragmentFunctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bumpFragmentFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/ShadersWGSL/ShadersInclude/bumpFragmentFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,8BAA8B,CAAC;AAEtC,MAAM,IAAI,GAAG,uBAAuB,CAAC;AACrC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Bd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nimport \"./samplerFragmentDeclaration\";\n\nconst name = \"bumpFragmentFunctions\";\nconst shader = `#if defined(BUMP)\n#include<samplerFragmentDeclaration>(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_SAMPLERNAME_,bump)\n#endif\n#if defined(DETAIL)\n#include<samplerFragmentDeclaration>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_SAMPLERNAME_,detail)\n#endif\n#if defined(BUMP) && defined(PARALLAX)\nconst minSamples: f32=4.;const maxSamples: f32=15.;const iMaxSamples: i32=15;fn parallaxOcclusion(vViewDirCoT: vec3f,vNormalCoT: vec3f,texCoord: vec2f,parallaxScale: f32)->vec2f {var parallaxLimit: f32=length(vViewDirCoT.xy)/vViewDirCoT.z;parallaxLimit*=parallaxScale;var vOffsetDir: vec2f=normalize(vViewDirCoT.xy);var vMaxOffset: vec2f=vOffsetDir*parallaxLimit;var numSamples: f32=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));var stepSize: f32=1.0/numSamples;var currRayHeight: f32=1.0;var vCurrOffset: vec2f= vec2f(0,0);var vLastOffset: vec2f= vec2f(0,0);var lastSampledHeight: f32=1.0;var currSampledHeight: f32=1.0;var keepWorking: bool=true;for (var i: i32=0; i<iMaxSamples; i++)\n{currSampledHeight=textureSample(bump,bumpSampler,texCoord+vCurrOffset).w;if (!keepWorking)\n{}\nelse if (currSampledHeight>currRayHeight)\n{var delta1: f32=currSampledHeight-currRayHeight;var delta2: f32=(currRayHeight+stepSize)-lastSampledHeight;var ratio: f32=delta1/(delta1+delta2);vCurrOffset=(ratio)* vLastOffset+(1.0-ratio)*vCurrOffset;keepWorking=false;}\nelse\n{currRayHeight-=stepSize;vLastOffset=vCurrOffset;\n#ifdef PARALLAX_RHS\nvCurrOffset-=stepSize*vMaxOffset;\n#else\nvCurrOffset+=stepSize*vMaxOffset;\n#endif\nlastSampledHeight=currSampledHeight;}}\nreturn vCurrOffset;}\nfn parallaxOffset(viewDir: vec3f,heightScale: f32)->vec2f\n{var height: f32=textureSample(bump,bumpSampler,vBumpUV).w;var texCoordOffset: vec2f=heightScale*viewDir.xy*height;\n#ifdef PARALLAX_RHS\nreturn texCoordOffset;\n#else\nreturn -texCoordOffset;\n#endif\n}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStoreWGSL[name] = shader;\n/** @internal */\nexport const bumpFragmentFunctions = { name, shader };\n"]}
@@ -0,0 +1,5 @@
1
+ /** @internal */
2
+ export declare const bumpFragmentMainFunctions: {
3
+ name: string;
4
+ shader: string;
5
+ };
@@ -0,0 +1,69 @@
1
+ // Do not edit.
2
+ import { ShaderStore } from "../../Engines/shaderStore.js";
3
+ const name = "bumpFragmentMainFunctions";
4
+ const shader = `#if defined(BUMP) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) || defined(DETAIL)
5
+ #if defined(TANGENT) && defined(NORMAL)
6
+ varying vTBN: mat3x3f;
7
+ #endif
8
+ #ifdef OBJECTSPACE_NORMALMAP
9
+ uniform normalMatrix: mat4x4f;
10
+ #if defined(WEBGL2) || defined(WEBGPU)
11
+ fn toNormalMatrix(wMatrix: mat4x4f)->mat4x4f
12
+ {var ret: mat4x4f=inverse(wMatrix);ret=transpose(ret);ret[0][3]=0.;ret[1][3]=0.;ret[2][3]=0.;ret[3]= vec4f(0.,0.,0.,1.);return ret;}
13
+ #else
14
+ fn toNormalMatrix(m: mat4x4f)->mat4x4f
15
+ {var a00: f32=m[0][0],a01=m[0][1],a02=m[0][2],a03=m[0][3],
16
+ a10=m[1][0],a11=m[1][1],a12=m[1][2],a13=m[1][3],
17
+ a20=m[2][0],a21=m[2][1],a22=m[2][2],a23=m[2][3],
18
+ a30=m[3][0],a31=m[3][1],a32=m[3][2],a33=m[3][3],
19
+ b00=a00*a11-a01*a10,
20
+ b01=a00*a12-a02*a10,
21
+ b02=a00*a13-a03*a10,
22
+ b03=a01*a12-a02*a11,
23
+ b04=a01*a13-a03*a11,
24
+ b05=a02*a13-a03*a12,
25
+ b06=a20*a31-a21*a30,
26
+ b07=a20*a32-a22*a30,
27
+ b08=a20*a33-a23*a30,
28
+ b09=a21*a32-a22*a31,
29
+ b10=a21*a33-a23*a31,
30
+ b11=a22*a33-a23*a32,
31
+ det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;var mi: mat4x4f= mat4x4f(
32
+ a11*b11-a12*b10+a13*b09,
33
+ a02*b10-a01*b11-a03*b09,
34
+ a31*b05-a32*b04+a33*b03,
35
+ a22*b04-a21*b05-a23*b03,
36
+ a12*b08-a10*b11-a13*b07,
37
+ a00*b11-a02*b08+a03*b07,
38
+ a32*b02-a30*b05-a33*b01,
39
+ a20*b05-a22*b02+a23*b01,
40
+ a10*b10-a11*b08+a13*b06,
41
+ a01*b08-a00*b10-a03*b06,
42
+ a30*b04-a31*b02+a33*b00,
43
+ a21*b02-a20*b04-a23*b00,
44
+ a11*b07-a10*b09-a12*b06,
45
+ a00*b09-a01*b07+a02*b06,
46
+ a31*b01-a30*b03-a32*b00,
47
+ a20*b03-a21*b01+a22*b00)/det;return mat4x4f(mi[0][0],mi[1][0],mi[2][0],mi[3][0],
48
+ mi[0][1],mi[1][1],mi[2][1],mi[3][1],
49
+ mi[0][2],mi[1][2],mi[2][2],mi[3][2],
50
+ mi[0][3],mi[1][3],mi[2][3],mi[3][3]);}
51
+ #endif
52
+ #endif
53
+ fn perturbNormalBase(cotangentFrame: mat3x3f,normal: vec3f,scale: f32)->vec3f
54
+ {
55
+ #ifdef NORMALXYSCALE
56
+ normal=normalize(normal* vec3f(scale,scale,1.0));
57
+ #endif
58
+ return normalize(cotangentFrame*normal);}
59
+ fn perturbNormal(cotangentFrame: mat3x3f,textureSample: vec3f,scale: f32)->vec3f
60
+ {return perturbNormalBase(cotangentFrame,textureSample*2.0-1.0,scale);}
61
+ fn cotangent_frame(normal: vec3f,p: vec3f,uv: vec2f,tangentSpaceParams: vec2f)->mat3x3f
62
+ {var dp1: vec3f=dpdx(p);var dp2: vec3f=dpdy(p);var duv1: vec2f=dpdx(uv);var duv2: vec2f=dpdy(uv);var dp2perp: vec3f=cross(dp2,normal);var dp1perp: vec3f=cross(normal,dp1);var tangent: vec3f=dp2perp*duv1.x+dp1perp*duv2.x;var bitangent: vec3f=dp2perp*duv1.y+dp1perp*duv2.y;tangent*=tangentSpaceParams.x;bitangent*=tangentSpaceParams.y;var det: f32=max(dot(tangent,tangent),dot(bitangent,bitangent));var invmax: f32=select(inverseSqrt(det),0.0,det==0.0);return mat3x3f(tangent*invmax,bitangent*invmax,normal);}
63
+ #endif
64
+ `;
65
+ // Sideeffect
66
+ ShaderStore.IncludesShadersStoreWGSL[name] = shader;
67
+ /** @internal */
68
+ export const bumpFragmentMainFunctions = { name, shader };
69
+ //# sourceMappingURL=bumpFragmentMainFunctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bumpFragmentMainFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,2BAA2B,CAAC;AACzC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Dd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,gBAAgB;AAChB,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bumpFragmentMainFunctions\";\nconst shader = `#if defined(BUMP) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) || defined(DETAIL)\n#if defined(TANGENT) && defined(NORMAL) \nvarying vTBN: mat3x3f;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\nuniform normalMatrix: mat4x4f;\n#if defined(WEBGL2) || defined(WEBGPU)\nfn toNormalMatrix(wMatrix: mat4x4f)->mat4x4f\n{var ret: mat4x4f=inverse(wMatrix);ret=transpose(ret);ret[0][3]=0.;ret[1][3]=0.;ret[2][3]=0.;ret[3]= vec4f(0.,0.,0.,1.);return ret;}\n#else\nfn toNormalMatrix(m: mat4x4f)->mat4x4f\n{var a00: f32=m[0][0],a01=m[0][1],a02=m[0][2],a03=m[0][3],\na10=m[1][0],a11=m[1][1],a12=m[1][2],a13=m[1][3],\na20=m[2][0],a21=m[2][1],a22=m[2][2],a23=m[2][3],\na30=m[3][0],a31=m[3][1],a32=m[3][2],a33=m[3][3],\nb00=a00*a11-a01*a10,\nb01=a00*a12-a02*a10,\nb02=a00*a13-a03*a10,\nb03=a01*a12-a02*a11,\nb04=a01*a13-a03*a11,\nb05=a02*a13-a03*a12,\nb06=a20*a31-a21*a30,\nb07=a20*a32-a22*a30,\nb08=a20*a33-a23*a30,\nb09=a21*a32-a22*a31,\nb10=a21*a33-a23*a31,\nb11=a22*a33-a23*a32,\ndet=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;var mi: mat4x4f= mat4x4f(\na11*b11-a12*b10+a13*b09,\na02*b10-a01*b11-a03*b09,\na31*b05-a32*b04+a33*b03,\na22*b04-a21*b05-a23*b03,\na12*b08-a10*b11-a13*b07,\na00*b11-a02*b08+a03*b07,\na32*b02-a30*b05-a33*b01,\na20*b05-a22*b02+a23*b01,\na10*b10-a11*b08+a13*b06,\na01*b08-a00*b10-a03*b06,\na30*b04-a31*b02+a33*b00,\na21*b02-a20*b04-a23*b00,\na11*b07-a10*b09-a12*b06,\na00*b09-a01*b07+a02*b06,\na31*b01-a30*b03-a32*b00,\na20*b03-a21*b01+a22*b00)/det;return mat4x4f(mi[0][0],mi[1][0],mi[2][0],mi[3][0],\nmi[0][1],mi[1][1],mi[2][1],mi[3][1],\nmi[0][2],mi[1][2],mi[2][2],mi[3][2],\nmi[0][3],mi[1][3],mi[2][3],mi[3][3]);}\n#endif\n#endif\nfn perturbNormalBase(cotangentFrame: mat3x3f,normal: vec3f,scale: f32)->vec3f\n{\n#ifdef NORMALXYSCALE\nnormal=normalize(normal* vec3f(scale,scale,1.0));\n#endif\nreturn normalize(cotangentFrame*normal);}\nfn perturbNormal(cotangentFrame: mat3x3f,textureSample: vec3f,scale: f32)->vec3f\n{return perturbNormalBase(cotangentFrame,textureSample*2.0-1.0,scale);}\nfn cotangent_frame(normal: vec3f,p: vec3f,uv: vec2f,tangentSpaceParams: vec2f)->mat3x3f\n{var dp1: vec3f=dpdx(p);var dp2: vec3f=dpdy(p);var duv1: vec2f=dpdx(uv);var duv2: vec2f=dpdy(uv);var dp2perp: vec3f=cross(dp2,normal);var dp1perp: vec3f=cross(normal,dp1);var tangent: vec3f=dp2perp*duv1.x+dp1perp*duv2.x;var bitangent: vec3f=dp2perp*duv1.y+dp1perp*duv2.y;tangent*=tangentSpaceParams.x;bitangent*=tangentSpaceParams.y;var det: f32=max(dot(tangent,tangent),dot(bitangent,bitangent));var invmax: f32=select(inverseSqrt(det),0.0,det==0.0);return mat3x3f(tangent*invmax,bitangent*invmax,normal);}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStoreWGSL[name] = shader;\n/** @internal */\nexport const bumpFragmentMainFunctions = { name, shader };\n"]}
@@ -0,0 +1,5 @@
1
+ /** @internal */
2
+ export declare const samplerFragmentDeclaration: {
3
+ name: string;
4
+ shader: string;
5
+ };
@@ -0,0 +1,27 @@
1
+ // Do not edit.
2
+ import { ShaderStore } from "../../Engines/shaderStore.js";
3
+ const name = "samplerFragmentDeclaration";
4
+ const shader = `#ifdef _DEFINENAME_
5
+ #if _DEFINENAME_DIRECTUV==1
6
+ #define v_VARYINGNAME_UV vMainUV1
7
+ #elif _DEFINENAME_DIRECTUV==2
8
+ #define v_VARYINGNAME_UV vMainUV2
9
+ #elif _DEFINENAME_DIRECTUV==3
10
+ #define v_VARYINGNAME_UV vMainUV3
11
+ #elif _DEFINENAME_DIRECTUV==4
12
+ #define v_VARYINGNAME_UV vMainUV4
13
+ #elif _DEFINENAME_DIRECTUV==5
14
+ #define v_VARYINGNAME_UV vMainUV5
15
+ #elif _DEFINENAME_DIRECTUV==6
16
+ #define v_VARYINGNAME_UV vMainUV6
17
+ #else
18
+ varying v_VARYINGNAME_UV: vec2f;
19
+ #endif
20
+ uniform _SAMPLERNAME_Sampler: sampler;uniform _SAMPLERNAME_: texture_2d<f32>;
21
+ #endif
22
+ `;
23
+ // Sideeffect
24
+ ShaderStore.IncludesShadersStoreWGSL[name] = shader;
25
+ /** @internal */
26
+ export const samplerFragmentDeclaration = { name, shader };
27
+ //# sourceMappingURL=samplerFragmentDeclaration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"samplerFragmentDeclaration.js","sourceRoot":"","sources":["../../../../../dev/core/src/ShadersWGSL/ShadersInclude/samplerFragmentDeclaration.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,4BAA4B,CAAC;AAC1C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;CAkBd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,gBAAgB;AAChB,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"samplerFragmentDeclaration\";\nconst shader = `#ifdef _DEFINENAME_\n#if _DEFINENAME_DIRECTUV==1\n#define v_VARYINGNAME_UV vMainUV1\n#elif _DEFINENAME_DIRECTUV==2\n#define v_VARYINGNAME_UV vMainUV2\n#elif _DEFINENAME_DIRECTUV==3\n#define v_VARYINGNAME_UV vMainUV3\n#elif _DEFINENAME_DIRECTUV==4\n#define v_VARYINGNAME_UV vMainUV4\n#elif _DEFINENAME_DIRECTUV==5\n#define v_VARYINGNAME_UV vMainUV5\n#elif _DEFINENAME_DIRECTUV==6\n#define v_VARYINGNAME_UV vMainUV6\n#else\nvarying v_VARYINGNAME_UV: vec2f;\n#endif\nuniform _SAMPLERNAME_Sampler: sampler;uniform _SAMPLERNAME_: texture_2d<f32>;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStoreWGSL[name] = shader;\n/** @internal */\nexport const samplerFragmentDeclaration = { name, shader };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/core",
3
- "version": "7.7.2",
3
+ "version": "7.8.1",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.views.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Extensions/engine.views.ts"],"names":[],"mappings":"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","sourcesContent":["import { Engine } from \"../engine\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Observable } from \"../../Misc/observable\";\r\n\r\n/**\r\n * Class used to define an additional view for the engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/multiCanvas\r\n */\r\nexport class EngineView {\r\n /**\r\n * A randomly generated unique id\r\n */\r\n readonly id: string;\r\n /** Defines the canvas where to render the view */\r\n target: HTMLCanvasElement;\r\n /**\r\n * Defines an optional camera or array of cameras used to render the view (will use active camera / cameras else)\r\n * Support for array of cameras @since\r\n */\r\n camera?: Camera | Camera[];\r\n /** Indicates if the destination view canvas should be cleared before copying the parent canvas. Can help if the scene clear color has alpha < 1 */\r\n clearBeforeCopy?: boolean;\r\n /** Indicates if the view is enabled (true by default) */\r\n enabled: boolean;\r\n /** Defines a custom function to handle canvas size changes. (the canvas to render into is provided to the callback) */\r\n customResize?: (canvas: HTMLCanvasElement) => void;\r\n}\r\n\r\ndeclare module \"../../Engines/abstractEngine\" {\r\n export interface AbstractEngine {\r\n /** @internal */\r\n _inputElement: Nullable<HTMLElement>;\r\n\r\n /**\r\n * Gets or sets the HTML element to use for attaching events\r\n */\r\n inputElement: Nullable<HTMLElement>;\r\n\r\n /**\r\n * Observable to handle when a change to inputElement occurs\r\n * @internal\r\n */\r\n _onEngineViewChanged?: () => void;\r\n\r\n /**\r\n * Will be triggered before the view renders\r\n */\r\n readonly onBeforeViewRenderObservable: Observable<EngineView>;\r\n /**\r\n * Will be triggered after the view rendered\r\n */\r\n readonly onAfterViewRenderObservable: Observable<EngineView>;\r\n\r\n /**\r\n * Gets the current engine view\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/multiCanvas\r\n */\r\n activeView: Nullable<EngineView>;\r\n\r\n /** Gets or sets the list of views */\r\n views: EngineView[];\r\n\r\n /**\r\n * Register a new child canvas\r\n * @param canvas defines the canvas to register\r\n * @param camera defines an optional camera or array of cameras to use with this canvas (it will overwrite the scene.activeCamera / scene.activeCameras for this view). Support for array of cameras @since\r\n * @param clearBeforeCopy Indicates if the destination view canvas should be cleared before copying the parent canvas. Can help if the scene clear color has alpha \\< 1\r\n * @returns the associated view\r\n */\r\n registerView(canvas: HTMLCanvasElement, camera?: Camera | Camera[], clearBeforeCopy?: boolean): EngineView;\r\n\r\n /**\r\n * Remove a registered child canvas\r\n * @param canvas defines the canvas to remove\r\n * @returns the current engine\r\n */\r\n unRegisterView(canvas: HTMLCanvasElement): Engine;\r\n\r\n /**\r\n * @internal\r\n */\r\n _renderViewStep(view: EngineView): boolean;\r\n }\r\n}\r\n\r\nconst _onBeforeViewRenderObservable = new Observable<EngineView>();\r\nconst _onAfterViewRenderObservable = new Observable<EngineView>();\r\n\r\nObject.defineProperty(Engine.prototype, \"onBeforeViewRenderObservable\", {\r\n get: function (this: Engine) {\r\n return _onBeforeViewRenderObservable;\r\n },\r\n});\r\n\r\nObject.defineProperty(Engine.prototype, \"onAfterViewRenderObservable\", {\r\n get: function (this: Engine) {\r\n return _onAfterViewRenderObservable;\r\n },\r\n});\r\n\r\nObject.defineProperty(Engine.prototype, \"inputElement\", {\r\n get: function (this: Engine) {\r\n return this._inputElement;\r\n },\r\n set: function (this: Engine, value: HTMLElement) {\r\n if (this._inputElement !== value) {\r\n this._inputElement = value;\r\n this._onEngineViewChanged?.();\r\n }\r\n },\r\n});\r\n\r\nEngine.prototype.getInputElement = function (): Nullable<HTMLElement> {\r\n return this.inputElement || this.getRenderingCanvas();\r\n};\r\n\r\nEngine.prototype.registerView = function (canvas: HTMLCanvasElement, camera?: Camera | Camera[], clearBeforeCopy?: boolean): EngineView {\r\n if (!this.views) {\r\n this.views = [];\r\n }\r\n\r\n for (const view of this.views) {\r\n if (view.target === canvas) {\r\n return view;\r\n }\r\n }\r\n\r\n const masterCanvas = this.getRenderingCanvas();\r\n if (masterCanvas) {\r\n canvas.width = masterCanvas.width;\r\n canvas.height = masterCanvas.height;\r\n }\r\n\r\n const newView = { target: canvas, camera, clearBeforeCopy, enabled: true, id: (Math.random() * 100000).toFixed() };\r\n this.views.push(newView);\r\n\r\n if (camera && !Array.isArray(camera)) {\r\n camera.onDisposeObservable.add(() => {\r\n this.unRegisterView(canvas);\r\n });\r\n }\r\n\r\n return newView;\r\n};\r\n\r\nEngine.prototype.unRegisterView = function (canvas: HTMLCanvasElement): Engine {\r\n if (!this.views || this.views.length === 0) {\r\n return this;\r\n }\r\n\r\n for (const view of this.views) {\r\n if (view.target === canvas) {\r\n const index = this.views.indexOf(view);\r\n\r\n if (index !== -1) {\r\n this.views.splice(index, 1);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return this;\r\n};\r\n\r\nEngine.prototype._renderViewStep = function (view: EngineView): boolean {\r\n const canvas = view.target;\r\n const context = canvas.getContext(\"2d\");\r\n if (!context) {\r\n return true;\r\n }\r\n const parent = this.getRenderingCanvas()!;\r\n\r\n _onBeforeViewRenderObservable.notifyObservers(view);\r\n const camera = view.camera;\r\n let previewCamera: Nullable<Camera> = null;\r\n let previewCameras: Nullable<Camera[]> = null;\r\n let scene: Nullable<Scene> = null;\r\n if (camera) {\r\n scene = Array.isArray(camera) ? camera[0].getScene() : camera.getScene();\r\n\r\n previewCamera = scene.activeCamera;\r\n previewCameras = scene.activeCameras;\r\n\r\n this.activeView = view;\r\n\r\n if (Array.isArray(camera)) {\r\n scene.activeCameras = camera;\r\n } else {\r\n scene.activeCamera = camera;\r\n scene.activeCameras = null;\r\n }\r\n }\r\n\r\n if (view.customResize) {\r\n view.customResize(canvas);\r\n } else {\r\n // Set sizes\r\n const width = Math.floor(canvas.clientWidth / this._hardwareScalingLevel);\r\n const height = Math.floor(canvas.clientHeight / this._hardwareScalingLevel);\r\n\r\n const dimsChanged = width !== canvas.width || parent.width !== canvas.width || height !== canvas.height || parent.height !== canvas.height;\r\n if (canvas.clientWidth && canvas.clientHeight && dimsChanged) {\r\n canvas.width = width;\r\n canvas.height = height;\r\n this.setSize(width, height);\r\n }\r\n }\r\n\r\n if (!parent.width || !parent.height) {\r\n return false;\r\n }\r\n\r\n // Render the frame\r\n this._renderFrame();\r\n\r\n this.flushFramebuffer();\r\n\r\n // Copy to target\r\n if (view.clearBeforeCopy) {\r\n context.clearRect(0, 0, parent.width, parent.height);\r\n }\r\n context.drawImage(parent, 0, 0);\r\n\r\n // Restore\r\n if (scene) {\r\n scene.activeCameras = previewCameras;\r\n scene.activeCamera = previewCamera;\r\n }\r\n _onAfterViewRenderObservable.notifyObservers(view);\r\n return true;\r\n};\r\n\r\nEngine.prototype._renderViews = function () {\r\n if (!this.views || this.views.length === 0) {\r\n return false;\r\n }\r\n\r\n const parent = this.getRenderingCanvas();\r\n\r\n if (!parent) {\r\n return false;\r\n }\r\n\r\n let inputElementView;\r\n for (const view of this.views) {\r\n if (!view.enabled) {\r\n continue;\r\n }\r\n const canvas = view.target;\r\n // Always render the view correspondent to the inputElement for last\r\n if (canvas === this.inputElement) {\r\n inputElementView = view;\r\n continue;\r\n }\r\n\r\n if (!this._renderViewStep(view)) {\r\n return false;\r\n }\r\n }\r\n\r\n if (inputElementView) {\r\n if (!this._renderViewStep(inputElementView)) {\r\n return false;\r\n }\r\n }\r\n\r\n this.activeView = null;\r\n\r\n return true;\r\n};\r\n"]}