@onerjs/core 8.56.4 → 9.0.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 (722) hide show
  1. package/Animations/animatable.core.js +36 -0
  2. package/Animations/animatable.core.js.map +1 -1
  3. package/Animations/animationGroup.pure.d.ts +61 -1
  4. package/Animations/animationGroup.pure.js +191 -2
  5. package/Animations/animationGroup.pure.js.map +1 -1
  6. package/Animations/index.d.ts +1 -0
  7. package/Animations/index.js +1 -0
  8. package/Animations/index.js.map +1 -1
  9. package/Animations/pure.d.ts +1 -0
  10. package/Animations/pure.js +1 -0
  11. package/Animations/pure.js.map +1 -1
  12. package/Animations/rootMotion.d.ts +560 -0
  13. package/Animations/rootMotion.js +1709 -0
  14. package/Animations/rootMotion.js.map +1 -0
  15. package/Animations/runtimeAnimation.d.ts +57 -0
  16. package/Animations/runtimeAnimation.js +127 -3
  17. package/Animations/runtimeAnimation.js.map +1 -1
  18. package/Cameras/arcRotateCamera.pure.d.ts +2 -0
  19. package/Cameras/arcRotateCamera.pure.js +2 -0
  20. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  21. package/Cameras/targetCamera.pure.d.ts +2 -0
  22. package/Cameras/targetCamera.pure.js +13 -2
  23. package/Cameras/targetCamera.pure.js.map +1 -1
  24. package/Collisions/gpuPicker.js +5 -5
  25. package/Collisions/gpuPicker.js.map +1 -1
  26. package/Engines/AbstractEngine/abstractEngine.query.pure.js +4 -2
  27. package/Engines/AbstractEngine/abstractEngine.query.pure.js.map +1 -1
  28. package/Engines/AbstractEngine/abstractEngine.query.types.d.ts +11 -2
  29. package/Engines/AbstractEngine/abstractEngine.query.types.js.map +1 -1
  30. package/Engines/AbstractEngine/abstractEngine.renderPass.pure.js +1 -0
  31. package/Engines/AbstractEngine/abstractEngine.renderPass.pure.js.map +1 -1
  32. package/Engines/Extensions/engine.multiRender.pure.js +63 -0
  33. package/Engines/Extensions/engine.multiRender.pure.js.map +1 -1
  34. package/Engines/Extensions/engine.multiRender.types.d.ts +13 -0
  35. package/Engines/Extensions/engine.multiRender.types.js.map +1 -1
  36. package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js +2 -2
  37. package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js.map +1 -1
  38. package/Engines/Extensions/engine.prefilteredCubeTexture.types.d.ts +2 -1
  39. package/Engines/Extensions/engine.prefilteredCubeTexture.types.js.map +1 -1
  40. package/Engines/Extensions/index.d.ts +1 -0
  41. package/Engines/Extensions/index.js +1 -0
  42. package/Engines/Extensions/index.js.map +1 -1
  43. package/Engines/Extensions/pure.d.ts +1 -1
  44. package/Engines/Extensions/pure.js +1 -1
  45. package/Engines/Extensions/pure.js.map +1 -1
  46. package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js +88 -39
  47. package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js.map +1 -1
  48. package/Engines/Native/Extensions/nativeEngine.cubeTexture.types.d.ts +20 -2
  49. package/Engines/Native/Extensions/nativeEngine.cubeTexture.types.js.map +1 -1
  50. package/Engines/Native/nativeHardwareTexture.d.ts +8 -1
  51. package/Engines/Native/nativeHardwareTexture.js +7 -0
  52. package/Engines/Native/nativeHardwareTexture.js.map +1 -1
  53. package/Engines/Native/nativeHelpers.js +56 -1
  54. package/Engines/Native/nativeHelpers.js.map +1 -1
  55. package/Engines/Native/nativeInterfaces.d.ts +37 -8
  56. package/Engines/Native/nativeInterfaces.js.map +1 -1
  57. package/Engines/Native/nativeRenderTargetWrapper.d.ts +40 -0
  58. package/Engines/Native/nativeRenderTargetWrapper.js +265 -5
  59. package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
  60. package/Engines/Processors/shaderCodeCursor.d.ts +1 -0
  61. package/Engines/Processors/shaderCodeCursor.js +40 -3
  62. package/Engines/Processors/shaderCodeCursor.js.map +1 -1
  63. package/Engines/WebGPU/Extensions/engine.multiRender.pure.js +4 -0
  64. package/Engines/WebGPU/Extensions/engine.multiRender.pure.js.map +1 -1
  65. package/Engines/WebGPU/Extensions/engine.multiRender.types.d.ts +13 -0
  66. package/Engines/WebGPU/Extensions/engine.multiRender.types.js.map +1 -1
  67. package/Engines/WebGPU/Extensions/engine.query.pure.js +11 -3
  68. package/Engines/WebGPU/Extensions/engine.query.pure.js.map +1 -1
  69. package/Engines/WebGPU/Extensions/engine.renderTarget.pure.js +1 -0
  70. package/Engines/WebGPU/Extensions/engine.renderTarget.pure.js.map +1 -1
  71. package/Engines/WebGPU/Extensions/index.d.ts +1 -0
  72. package/Engines/WebGPU/Extensions/index.js +1 -0
  73. package/Engines/WebGPU/Extensions/index.js.map +1 -1
  74. package/Engines/WebGPU/Extensions/pure.d.ts +1 -1
  75. package/Engines/WebGPU/Extensions/pure.js +1 -1
  76. package/Engines/WebGPU/Extensions/pure.js.map +1 -1
  77. package/Engines/WebGPU/webgpuBundleList.d.ts +2 -0
  78. package/Engines/WebGPU/webgpuBundleList.js +4 -0
  79. package/Engines/WebGPU/webgpuBundleList.js.map +1 -1
  80. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +5 -2
  81. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  82. package/Engines/WebGPU/webgpuHardwareTexture.js +3 -1
  83. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  84. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
  85. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  86. package/Engines/WebGPU/webgpuSnapshotRendering.d.ts +4 -0
  87. package/Engines/WebGPU/webgpuSnapshotRendering.js +40 -7
  88. package/Engines/WebGPU/webgpuSnapshotRendering.js.map +1 -1
  89. package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -1
  90. package/Engines/WebGPU/webgpuTextureHelper.js +2 -2
  91. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  92. package/Engines/WebGPU/webgpuTextureManager.d.ts +2 -0
  93. package/Engines/WebGPU/webgpuTextureManager.js +286 -13
  94. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  95. package/Engines/abstractEngine.pure.d.ts +17 -1
  96. package/Engines/abstractEngine.pure.js +17 -5
  97. package/Engines/abstractEngine.pure.js.map +1 -1
  98. package/Engines/constants.d.ts +4 -0
  99. package/Engines/constants.js +4 -0
  100. package/Engines/constants.js.map +1 -1
  101. package/Engines/engine.pure.d.ts +0 -1
  102. package/Engines/engine.pure.js +0 -7
  103. package/Engines/engine.pure.js.map +1 -1
  104. package/Engines/nativeEngine.pure.js +1 -1
  105. package/Engines/nativeEngine.pure.js.map +1 -1
  106. package/Engines/thinEngine.pure.d.ts +15 -0
  107. package/Engines/thinEngine.pure.js +61 -14
  108. package/Engines/thinEngine.pure.js.map +1 -1
  109. package/Engines/thinNativeEngine.pure.d.ts +218 -17
  110. package/Engines/thinNativeEngine.pure.js +1438 -165
  111. package/Engines/thinNativeEngine.pure.js.map +1 -1
  112. package/Engines/thinWebGPUEngine.d.ts +4 -0
  113. package/Engines/thinWebGPUEngine.js +16 -2
  114. package/Engines/thinWebGPUEngine.js.map +1 -1
  115. package/Engines/webgpuEngine.pure.d.ts +17 -3
  116. package/Engines/webgpuEngine.pure.js +56 -13
  117. package/Engines/webgpuEngine.pure.js.map +1 -1
  118. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js +2 -2
  119. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js.map +1 -1
  120. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.d.ts +10 -0
  121. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js +24 -12
  122. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js.map +1 -1
  123. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.d.ts +11 -2
  124. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js +1 -1
  125. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js.map +1 -1
  126. package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.pure.d.ts +7 -0
  127. package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.pure.js +43 -0
  128. package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.pure.js.map +1 -1
  129. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.d.ts +9 -1
  130. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.js +6 -8
  131. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.js.map +1 -1
  132. package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.d.ts +2 -0
  133. package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.js +5 -1
  134. package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.js.map +1 -1
  135. package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.d.ts +2 -0
  136. package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.js +5 -1
  137. package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.js.map +1 -1
  138. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.d.ts +9 -0
  139. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js +34 -9
  140. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js.map +1 -1
  141. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.d.ts +2 -0
  142. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js +4 -0
  143. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js.map +1 -1
  144. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.d.ts +18 -4
  145. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js +24 -6
  146. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js.map +1 -1
  147. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.pure.js +19 -7
  148. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.pure.js.map +1 -1
  149. package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js +3 -3
  150. package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js.map +1 -1
  151. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.d.ts +20 -2
  152. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js +85 -25
  153. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js.map +1 -1
  154. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.d.ts +16 -1
  155. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js +64 -14
  156. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js.map +1 -1
  157. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.d.ts +12 -1
  158. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js +8 -0
  159. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js.map +1 -1
  160. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js +4 -1
  161. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js.map +1 -1
  162. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.d.ts +12 -1
  163. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.js +5 -1
  164. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.js.map +1 -1
  165. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.js +64 -16
  166. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.js.map +1 -1
  167. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.d.ts +2 -0
  168. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.js +14 -2
  169. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.js.map +1 -1
  170. package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.d.ts +5 -1
  171. package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.js +23 -8
  172. package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.js.map +1 -1
  173. package/FlowGraph/CustomTypes/flowGraphInteger.pure.d.ts +5 -0
  174. package/FlowGraph/CustomTypes/flowGraphInteger.pure.js +7 -0
  175. package/FlowGraph/CustomTypes/flowGraphInteger.pure.js.map +1 -1
  176. package/FlowGraph/CustomTypes/flowGraphMatrix.d.ts +10 -0
  177. package/FlowGraph/CustomTypes/flowGraphMatrix.js +14 -0
  178. package/FlowGraph/CustomTypes/flowGraphMatrix.js.map +1 -1
  179. package/FlowGraph/flowGraph.d.ts +6 -1
  180. package/FlowGraph/flowGraph.js +41 -9
  181. package/FlowGraph/flowGraph.js.map +1 -1
  182. package/FlowGraph/flowGraphAnimationHelpers.d.ts +24 -0
  183. package/FlowGraph/flowGraphAnimationHelpers.js +21 -0
  184. package/FlowGraph/flowGraphAnimationHelpers.js.map +1 -0
  185. package/FlowGraph/flowGraphBlock.js +3 -0
  186. package/FlowGraph/flowGraphBlock.js.map +1 -1
  187. package/FlowGraph/flowGraphConnection.d.ts +7 -0
  188. package/FlowGraph/flowGraphConnection.js +7 -0
  189. package/FlowGraph/flowGraphConnection.js.map +1 -1
  190. package/FlowGraph/flowGraphContext.d.ts +2 -1
  191. package/FlowGraph/flowGraphContext.js +5 -3
  192. package/FlowGraph/flowGraphContext.js.map +1 -1
  193. package/FlowGraph/flowGraphCoordinator.d.ts +15 -1
  194. package/FlowGraph/flowGraphCoordinator.js +47 -16
  195. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  196. package/FlowGraph/flowGraphEventBlock.d.ts +5 -0
  197. package/FlowGraph/flowGraphEventBlock.js +7 -0
  198. package/FlowGraph/flowGraphEventBlock.js.map +1 -1
  199. package/FlowGraph/flowGraphHostResolver.d.ts +2 -1
  200. package/FlowGraph/flowGraphHostResolver.js.map +1 -1
  201. package/FlowGraph/flowGraphParser.js +60 -2
  202. package/FlowGraph/flowGraphParser.js.map +1 -1
  203. package/FlowGraph/flowGraphValidator.js +0 -4
  204. package/FlowGraph/flowGraphValidator.js.map +1 -1
  205. package/FlowGraph/index.d.ts +2 -0
  206. package/FlowGraph/index.js +2 -0
  207. package/FlowGraph/index.js.map +1 -1
  208. package/FlowGraph/pure.d.ts +2 -0
  209. package/FlowGraph/pure.js +2 -0
  210. package/FlowGraph/pure.js.map +1 -1
  211. package/FlowGraph/serialization.d.ts +4 -2
  212. package/FlowGraph/serialization.js +12 -24
  213. package/FlowGraph/serialization.js.map +1 -1
  214. package/FlowGraph/typeDefinitions.d.ts +9 -1
  215. package/FlowGraph/typeDefinitions.js.map +1 -1
  216. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.d.ts +5 -0
  217. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.js +8 -0
  218. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.js.map +1 -0
  219. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.d.ts +87 -0
  220. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.js +295 -0
  221. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.js.map +1 -0
  222. package/FrameGraph/Node/Blocks/PostProcesses/pure.d.ts +1 -0
  223. package/FrameGraph/Node/Blocks/PostProcesses/pure.js +1 -0
  224. package/FrameGraph/Node/Blocks/PostProcesses/pure.js.map +1 -1
  225. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +4 -4
  226. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  227. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.d.ts +5 -1
  228. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js +13 -1
  229. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js.map +1 -1
  230. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.d.ts +1 -0
  231. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.js +4 -0
  232. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.js.map +1 -0
  233. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.d.ts +54 -0
  234. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.js +155 -0
  235. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.js.map +1 -0
  236. package/FrameGraph/Node/Blocks/Textures/pure.d.ts +1 -0
  237. package/FrameGraph/Node/Blocks/Textures/pure.js +1 -0
  238. package/FrameGraph/Node/Blocks/Textures/pure.js.map +1 -1
  239. package/FrameGraph/Node/Blocks/allBlocks.pure.js +4 -0
  240. package/FrameGraph/Node/Blocks/allBlocks.pure.js.map +1 -1
  241. package/FrameGraph/Node/Blocks/index.d.ts +2 -0
  242. package/FrameGraph/Node/Blocks/index.js +2 -0
  243. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  244. package/FrameGraph/Node/Blocks/inputBlock.pure.js +20 -1
  245. package/FrameGraph/Node/Blocks/inputBlock.pure.js.map +1 -1
  246. package/FrameGraph/Node/Blocks/pure.d.ts +2 -0
  247. package/FrameGraph/Node/Blocks/pure.js +2 -0
  248. package/FrameGraph/Node/Blocks/pure.js.map +1 -1
  249. package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +4 -2
  250. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js +4 -2
  251. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
  252. package/FrameGraph/Node/nodeRenderGraph.js +1 -1
  253. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  254. package/FrameGraph/Tasks/Layers/selectionOutlineTask.js +1 -0
  255. package/FrameGraph/Tasks/Layers/selectionOutlineTask.js.map +1 -1
  256. package/FrameGraph/Tasks/Misc/cullObjectsTask.js +5 -1
  257. package/FrameGraph/Tasks/Misc/cullObjectsTask.js.map +1 -1
  258. package/FrameGraph/Tasks/Misc/lightingVolumeTask.js +1 -0
  259. package/FrameGraph/Tasks/Misc/lightingVolumeTask.js.map +1 -1
  260. package/FrameGraph/Tasks/Misc/minMaxReducerTask.d.ts +62 -0
  261. package/FrameGraph/Tasks/Misc/minMaxReducerTask.js +159 -0
  262. package/FrameGraph/Tasks/Misc/minMaxReducerTask.js.map +1 -0
  263. package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.d.ts +69 -0
  264. package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.js +223 -0
  265. package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.js.map +1 -0
  266. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +25 -3
  267. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +72 -34
  268. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  269. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +3 -1
  270. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  271. package/FrameGraph/frameGraph.d.ts +4 -0
  272. package/FrameGraph/frameGraph.js +14 -0
  273. package/FrameGraph/frameGraph.js.map +1 -1
  274. package/FrameGraph/frameGraphObjectList.d.ts +6 -1
  275. package/FrameGraph/frameGraphObjectList.js.map +1 -1
  276. package/FrameGraph/frameGraphRenderContext.d.ts +3 -1
  277. package/FrameGraph/frameGraphRenderContext.js +5 -5
  278. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  279. package/FrameGraph/index.d.ts +2 -0
  280. package/FrameGraph/index.js +2 -0
  281. package/FrameGraph/index.js.map +1 -1
  282. package/FrameGraph/pure.d.ts +2 -0
  283. package/FrameGraph/pure.js +2 -0
  284. package/FrameGraph/pure.js.map +1 -1
  285. package/Inputs/scene.inputManager.d.ts +4 -0
  286. package/Inputs/scene.inputManager.js +50 -8
  287. package/Inputs/scene.inputManager.js.map +1 -1
  288. package/Lights/Clustered/clusteredLightingSceneComponent.pure.d.ts +5 -0
  289. package/Lights/Clustered/clusteredLightingSceneComponent.pure.js +22 -1
  290. package/Lights/Clustered/clusteredLightingSceneComponent.pure.js.map +1 -1
  291. package/Lights/Shadows/cascadedShadowGenerator.pure.js +7 -3
  292. package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
  293. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.d.ts +7 -0
  294. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.js +8 -0
  295. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.js.map +1 -0
  296. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.d.ts +54 -0
  297. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.js +81 -0
  298. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.js.map +1 -0
  299. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.d.ts +7 -0
  300. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.js +8 -0
  301. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.js.map +1 -0
  302. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.d.ts +60 -0
  303. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.js +90 -0
  304. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.js.map +1 -0
  305. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.d.ts +31 -0
  306. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js +103 -5
  307. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js.map +1 -1
  308. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js +6 -6
  309. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js.map +1 -1
  310. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.d.ts +26 -1
  311. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +153 -49
  312. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
  313. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.d.ts +1 -0
  314. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.js +4 -0
  315. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.js.map +1 -0
  316. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.d.ts +83 -0
  317. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.js +191 -0
  318. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.js.map +1 -0
  319. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.d.ts +1 -0
  320. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.js +4 -0
  321. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.js.map +1 -0
  322. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.d.ts +62 -0
  323. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.js +125 -0
  324. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.js.map +1 -0
  325. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js +5 -5
  326. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js.map +1 -1
  327. package/Materials/GaussianSplatting/pure.d.ts +4 -0
  328. package/Materials/GaussianSplatting/pure.js +4 -0
  329. package/Materials/GaussianSplatting/pure.js.map +1 -1
  330. package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.d.ts +1 -0
  331. package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.js +12 -0
  332. package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.js.map +1 -1
  333. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js +11 -1
  334. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js.map +1 -1
  335. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +17 -2
  336. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
  337. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js +2 -2
  338. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js.map +1 -1
  339. package/Materials/Node/nodeMaterial.pure.d.ts +4 -0
  340. package/Materials/Node/nodeMaterial.pure.js +4 -0
  341. package/Materials/Node/nodeMaterial.pure.js.map +1 -1
  342. package/Materials/Node/nodeMaterialBuildState.d.ts +1 -1
  343. package/Materials/Node/nodeMaterialBuildState.js +25 -3
  344. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  345. package/Materials/PBR/openpbrMaterial.pure.d.ts +2 -0
  346. package/Materials/PBR/pbrBaseMaterial.pure.d.ts +2 -0
  347. package/Materials/Textures/Procedurals/proceduralTexture.pure.d.ts +14 -14
  348. package/Materials/Textures/Procedurals/proceduralTexture.pure.js +37 -13
  349. package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
  350. package/Materials/Textures/baseTexture.pure.js +3 -0
  351. package/Materials/Textures/baseTexture.pure.js.map +1 -1
  352. package/Materials/Textures/cubeTexture.pure.js +1 -1
  353. package/Materials/Textures/cubeTexture.pure.js.map +1 -1
  354. package/Materials/Textures/internalTexture.d.ts +8 -1
  355. package/Materials/Textures/internalTexture.js +9 -2
  356. package/Materials/Textures/internalTexture.js.map +1 -1
  357. package/Materials/Textures/mirrorTexture.pure.js +3 -1
  358. package/Materials/Textures/mirrorTexture.pure.js.map +1 -1
  359. package/Materials/Textures/rawTexture2DArray.functions.d.ts +3 -3
  360. package/Materials/Textures/rawTexture2DArray.functions.js.map +1 -1
  361. package/Materials/Textures/rawTexture3D.d.ts +1 -1
  362. package/Materials/Textures/rawTexture3D.js +1 -1
  363. package/Materials/Textures/rawTexture3D.js.map +1 -1
  364. package/Materials/Textures/texture.pure.js +1 -1
  365. package/Materials/Textures/texture.pure.js.map +1 -1
  366. package/Materials/Textures/textureHelper.functions.d.ts +14 -0
  367. package/Materials/Textures/textureHelper.functions.js +24 -0
  368. package/Materials/Textures/textureHelper.functions.js.map +1 -1
  369. package/Materials/ditheredTileFadeMaterialPlugin.d.ts +210 -0
  370. package/Materials/ditheredTileFadeMaterialPlugin.js +509 -0
  371. package/Materials/ditheredTileFadeMaterialPlugin.js.map +1 -0
  372. package/Materials/effectRenderer.pure.d.ts +4 -0
  373. package/Materials/effectRenderer.pure.js +3 -2
  374. package/Materials/effectRenderer.pure.js.map +1 -1
  375. package/Materials/index.d.ts +5 -0
  376. package/Materials/index.js +5 -0
  377. package/Materials/index.js.map +1 -1
  378. package/Materials/material.pure.js +25 -12
  379. package/Materials/material.pure.js.map +1 -1
  380. package/Materials/materialHelper.geometryrendering.d.ts +46 -1
  381. package/Materials/materialHelper.geometryrendering.js +105 -8
  382. package/Materials/materialHelper.geometryrendering.js.map +1 -1
  383. package/Materials/prepass.defines.d.ts +2 -0
  384. package/Materials/prepass.defines.js +2 -0
  385. package/Materials/prepass.defines.js.map +1 -1
  386. package/Materials/pure.d.ts +5 -0
  387. package/Materials/pure.js +5 -0
  388. package/Materials/pure.js.map +1 -1
  389. package/Materials/standardMaterial.pure.d.ts +10 -0
  390. package/Materials/standardMaterial.pure.js +30 -5
  391. package/Materials/standardMaterial.pure.js.map +1 -1
  392. package/Meshes/Builders/polygonBuilder.pure.d.ts +4 -0
  393. package/Meshes/Builders/polygonBuilder.pure.js +3 -0
  394. package/Meshes/Builders/polygonBuilder.pure.js.map +1 -1
  395. package/Meshes/GaussianSplatting/gaussianPointSplattingController.d.ts +8 -0
  396. package/Meshes/GaussianSplatting/gaussianPointSplattingController.js +11 -0
  397. package/Meshes/GaussianSplatting/gaussianPointSplattingController.js.map +1 -0
  398. package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.d.ts +231 -0
  399. package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.js +1212 -0
  400. package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.js.map +1 -0
  401. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.d.ts +14 -0
  402. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.js +15 -0
  403. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.js.map +1 -0
  404. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.d.ts +285 -0
  405. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.js +812 -0
  406. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.js.map +1 -0
  407. package/Meshes/GaussianSplatting/gaussianSplatting.functions.d.ts +19 -0
  408. package/Meshes/GaussianSplatting/gaussianSplatting.functions.js +23 -0
  409. package/Meshes/GaussianSplatting/gaussianSplatting.functions.js.map +1 -0
  410. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +1 -0
  411. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +2 -0
  412. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  413. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +163 -14
  414. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +239 -24
  415. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  416. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +34 -4
  417. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +125 -25
  418. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  419. package/Meshes/GaussianSplatting/pure.d.ts +2 -0
  420. package/Meshes/GaussianSplatting/pure.js +2 -0
  421. package/Meshes/GaussianSplatting/pure.js.map +1 -1
  422. package/Meshes/Node/Blocks/booleanGeometryBlock.pure.js +25 -11
  423. package/Meshes/Node/Blocks/booleanGeometryBlock.pure.js.map +1 -1
  424. package/Meshes/abstractMesh.pure.d.ts +30 -0
  425. package/Meshes/abstractMesh.pure.js +54 -0
  426. package/Meshes/abstractMesh.pure.js.map +1 -1
  427. package/Meshes/index.d.ts +2 -0
  428. package/Meshes/index.js +2 -0
  429. package/Meshes/index.js.map +1 -1
  430. package/Meshes/instancedMesh.pure.d.ts +5 -0
  431. package/Meshes/instancedMesh.pure.js +12 -0
  432. package/Meshes/instancedMesh.pure.js.map +1 -1
  433. package/Meshes/mesh.pure.js +23 -8
  434. package/Meshes/mesh.pure.js.map +1 -1
  435. package/Meshes/meshBlendingTag.d.ts +47 -0
  436. package/Meshes/meshBlendingTag.js +64 -0
  437. package/Meshes/meshBlendingTag.js.map +1 -0
  438. package/Meshes/polygonMesh.js +2 -2
  439. package/Meshes/polygonMesh.js.map +1 -1
  440. package/Meshes/pure.d.ts +2 -0
  441. package/Meshes/pure.js +2 -0
  442. package/Meshes/pure.js.map +1 -1
  443. package/Meshes/subMesh.pure.d.ts +11 -2
  444. package/Meshes/subMesh.pure.js +20 -5
  445. package/Meshes/subMesh.pure.js.map +1 -1
  446. package/Meshes/thinInstanceMesh.pure.js +1 -0
  447. package/Meshes/thinInstanceMesh.pure.js.map +1 -1
  448. package/Misc/andOrNotEvaluator.js +4 -0
  449. package/Misc/andOrNotEvaluator.js.map +1 -1
  450. package/Misc/fileTools.pure.js +21 -0
  451. package/Misc/fileTools.pure.js.map +1 -1
  452. package/Misc/minMaxReducer.pure.d.ts +6 -0
  453. package/Misc/minMaxReducer.pure.js +10 -0
  454. package/Misc/minMaxReducer.pure.js.map +1 -1
  455. package/Misc/snapshotRenderingHelper.js +2 -2
  456. package/Misc/snapshotRenderingHelper.js.map +1 -1
  457. package/Misc/thinMinMaxReducer.d.ts +19 -2
  458. package/Misc/thinMinMaxReducer.js +74 -21
  459. package/Misc/thinMinMaxReducer.js.map +1 -1
  460. package/Misc/tools.pure.js +1 -1
  461. package/Misc/tools.pure.js.map +1 -1
  462. package/Particles/Node/Blocks/Update/updateNoiseBlock.pure.js +19 -7
  463. package/Particles/Node/Blocks/Update/updateNoiseBlock.pure.js.map +1 -1
  464. package/Particles/Node/Blocks/particleSourceTextureBlock.pure.js +3 -2
  465. package/Particles/Node/Blocks/particleSourceTextureBlock.pure.js.map +1 -1
  466. package/Particles/gpuParticleSystem.pure.d.ts +4 -0
  467. package/Particles/gpuParticleSystem.pure.js +101 -32
  468. package/Particles/gpuParticleSystem.pure.js.map +1 -1
  469. package/Particles/particle.js +3 -2
  470. package/Particles/particle.js.map +1 -1
  471. package/Particles/solidParticleSystem.js +7 -1
  472. package/Particles/solidParticleSystem.js.map +1 -1
  473. package/Particles/thinParticleSystem.function.d.ts +6 -0
  474. package/Particles/thinParticleSystem.function.js +144 -88
  475. package/Particles/thinParticleSystem.function.js.map +1 -1
  476. package/Particles/thinParticleSystem.pure.d.ts +8 -0
  477. package/Particles/thinParticleSystem.pure.js +154 -28
  478. package/Particles/thinParticleSystem.pure.js.map +1 -1
  479. package/Particles/webgl2ParticleSystem.pure.d.ts +1 -0
  480. package/Particles/webgl2ParticleSystem.pure.js +12 -4
  481. package/Particles/webgl2ParticleSystem.pure.js.map +1 -1
  482. package/Physics/v2/ragdoll.d.ts +2 -4
  483. package/Physics/v2/ragdoll.js +11 -4
  484. package/Physics/v2/ragdoll.js.map +1 -1
  485. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js +7 -0
  486. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js.map +1 -1
  487. package/PostProcesses/index.d.ts +2 -0
  488. package/PostProcesses/index.js +2 -0
  489. package/PostProcesses/index.js.map +1 -1
  490. package/PostProcesses/meshBlendingBlueNoise.d.ts +15 -0
  491. package/PostProcesses/meshBlendingBlueNoise.js +77 -0
  492. package/PostProcesses/meshBlendingBlueNoise.js.map +1 -0
  493. package/PostProcesses/meshBlendingPostProcess.d.ts +131 -0
  494. package/PostProcesses/meshBlendingPostProcess.js +315 -0
  495. package/PostProcesses/meshBlendingPostProcess.js.map +1 -0
  496. package/PostProcesses/pure.d.ts +2 -0
  497. package/PostProcesses/pure.js +2 -0
  498. package/PostProcesses/pure.js.map +1 -1
  499. package/PostProcesses/thinMeshBlendingPostProcess.d.ts +339 -0
  500. package/PostProcesses/thinMeshBlendingPostProcess.js +771 -0
  501. package/PostProcesses/thinMeshBlendingPostProcess.js.map +1 -0
  502. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +6 -6
  503. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
  504. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.d.ts +12 -0
  505. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +50 -25
  506. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
  507. package/Rendering/boundingBoxRenderer.pure.js +2 -1
  508. package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
  509. package/Rendering/depthRenderer.pure.d.ts +9 -0
  510. package/Rendering/depthRenderer.pure.js +15 -4
  511. package/Rendering/depthRenderer.pure.js.map +1 -1
  512. package/Rendering/edgesRenderer.pure.d.ts +4 -2
  513. package/Rendering/edgesRenderer.pure.js +11 -2
  514. package/Rendering/edgesRenderer.pure.js.map +1 -1
  515. package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +14 -0
  516. package/Rendering/fluidRenderer/fluidRenderingObject.js +26 -0
  517. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  518. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +13 -3
  519. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +22 -9
  520. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
  521. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +3 -0
  522. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  523. package/Rendering/geometryBufferRenderer.pure.d.ts +38 -4
  524. package/Rendering/geometryBufferRenderer.pure.js +130 -18
  525. package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
  526. package/Rendering/objectRenderer.d.ts +7 -1
  527. package/Rendering/objectRenderer.js +45 -7
  528. package/Rendering/objectRenderer.js.map +1 -1
  529. package/Rendering/outlineRenderer.pure.js +6 -2
  530. package/Rendering/outlineRenderer.pure.js.map +1 -1
  531. package/Rendering/prePassRenderer.pure.js +3 -3
  532. package/Rendering/prePassRenderer.pure.js.map +1 -1
  533. package/Rendering/renderingManager.d.ts +1 -1
  534. package/Rendering/renderingManager.js +5 -4
  535. package/Rendering/renderingManager.js.map +1 -1
  536. package/Shaders/ShadersInclude/defaultFragmentAlpha.d.ts +5 -0
  537. package/Shaders/ShadersInclude/defaultFragmentAlpha.js +34 -0
  538. package/Shaders/ShadersInclude/defaultFragmentAlpha.js.map +1 -0
  539. package/Shaders/ShadersInclude/gaussianSplatting.js +3 -1
  540. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  541. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js +5 -1
  542. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
  543. package/Shaders/ShadersInclude/geometryRenderingFragment.d.ts +5 -0
  544. package/Shaders/ShadersInclude/geometryRenderingFragment.js +74 -0
  545. package/Shaders/ShadersInclude/geometryRenderingFragment.js.map +1 -0
  546. package/Shaders/ShadersInclude/lightsFragmentFunctions.js +27 -3
  547. package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  548. package/Shaders/ShadersInclude/mrtFragmentDeclaration.js +89 -0
  549. package/Shaders/ShadersInclude/mrtFragmentDeclaration.js.map +1 -1
  550. package/Shaders/ShadersInclude/oitDeclaration.js +1 -1
  551. package/Shaders/ShadersInclude/oitDeclaration.js.map +1 -1
  552. package/Shaders/ShadersInclude/openpbrBlockPrePass.js +24 -17
  553. package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  554. package/Shaders/ShadersInclude/pbrBlockPrePass.js +27 -20
  555. package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  556. package/Shaders/ShadersInclude/pbrDebug.js +6 -2
  557. package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
  558. package/Shaders/ShadersInclude/prePassDeclaration.js +95 -2
  559. package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
  560. package/Shaders/default.fragment.js +31 -40
  561. package/Shaders/default.fragment.js.map +1 -1
  562. package/Shaders/depthOfField.fragment.js +13 -9
  563. package/Shaders/depthOfField.fragment.js.map +1 -1
  564. package/Shaders/fluidRenderingParticleDepth.vertex.js +16 -1
  565. package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
  566. package/Shaders/fluidRenderingParticleThickness.vertex.js +16 -1
  567. package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
  568. package/Shaders/gaussianSplatting.fragment.js +63 -3
  569. package/Shaders/gaussianSplatting.fragment.js.map +1 -1
  570. package/Shaders/gaussianSplatting.vertex.js +80 -0
  571. package/Shaders/gaussianSplatting.vertex.js.map +1 -1
  572. package/Shaders/geometry.fragment.js +17 -11
  573. package/Shaders/geometry.fragment.js.map +1 -1
  574. package/Shaders/gpuRenderParticles.fragment.js +43 -1
  575. package/Shaders/gpuRenderParticles.fragment.js.map +1 -1
  576. package/Shaders/gpuRenderParticles.vertex.js +96 -16
  577. package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
  578. package/Shaders/meshBlending.fragment.d.ts +5 -0
  579. package/Shaders/meshBlending.fragment.js +519 -0
  580. package/Shaders/meshBlending.fragment.js.map +1 -0
  581. package/Shaders/minmaxRedux.fragment.js +6 -1
  582. package/Shaders/minmaxRedux.fragment.js.map +1 -1
  583. package/Shaders/particles.fragment.js +43 -1
  584. package/Shaders/particles.fragment.js.map +1 -1
  585. package/Shaders/particles.vertex.js +84 -3
  586. package/Shaders/particles.vertex.js.map +1 -1
  587. package/Shaders/sprites.fragment.js +52 -2
  588. package/Shaders/sprites.fragment.js.map +1 -1
  589. package/Shaders/sprites.vertex.js +62 -1
  590. package/Shaders/sprites.vertex.js.map +1 -1
  591. package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.d.ts +5 -0
  592. package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.js +33 -0
  593. package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.js.map +1 -0
  594. package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.d.ts +5 -0
  595. package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.js +65 -0
  596. package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.js.map +1 -0
  597. package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.d.ts +5 -0
  598. package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.js +17 -0
  599. package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.js.map +1 -0
  600. package/ShadersWGSL/ShadersInclude/gaussianSplatting.d.ts +1 -0
  601. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +6 -78
  602. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  603. package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.js +2 -2
  604. package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.js.map +1 -1
  605. package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.d.ts +5 -0
  606. package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.js +79 -0
  607. package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.js.map +1 -0
  608. package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.d.ts +6 -0
  609. package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.js +76 -0
  610. package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.js.map +1 -0
  611. package/ShadersWGSL/ShadersInclude/lightFragment.js +1 -1
  612. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  613. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +27 -3
  614. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  615. package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.d.ts +5 -0
  616. package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.js +18 -0
  617. package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.js.map +1 -0
  618. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.d.ts +1 -0
  619. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +11 -25
  620. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  621. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.d.ts +1 -0
  622. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +11 -25
  623. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  624. package/ShadersWGSL/ShadersInclude/pbrDebug.js +5 -1
  625. package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
  626. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +6 -1
  627. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
  628. package/ShadersWGSL/default.fragment.js +17 -48
  629. package/ShadersWGSL/default.fragment.js.map +1 -1
  630. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +15 -2
  631. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
  632. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -2
  633. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
  634. package/ShadersWGSL/gaussianPointSplattingBlit.fragment.d.ts +5 -0
  635. package/ShadersWGSL/gaussianPointSplattingBlit.fragment.js +22 -0
  636. package/ShadersWGSL/gaussianPointSplattingBlit.fragment.js.map +1 -0
  637. package/ShadersWGSL/gaussianPointSplattingBlit.vertex.d.ts +5 -0
  638. package/ShadersWGSL/gaussianPointSplattingBlit.vertex.js +19 -0
  639. package/ShadersWGSL/gaussianPointSplattingBlit.vertex.js.map +1 -0
  640. package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.d.ts +5 -0
  641. package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.js +21 -0
  642. package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.js.map +1 -0
  643. package/ShadersWGSL/gaussianSplatting.fragment.js +63 -2
  644. package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -1
  645. package/ShadersWGSL/gaussianSplatting.vertex.js +82 -1
  646. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  647. package/ShadersWGSL/gaussianSplattingDepth.vertex.js +2 -1
  648. package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
  649. package/ShadersWGSL/gaussianSplattingVoxel.vertex.js +2 -1
  650. package/ShadersWGSL/gaussianSplattingVoxel.vertex.js.map +1 -1
  651. package/ShadersWGSL/geometry.fragment.js +37 -2
  652. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  653. package/ShadersWGSL/gpsHiZBuild.compute.d.ts +5 -0
  654. package/ShadersWGSL/gpsHiZBuild.compute.js +16 -0
  655. package/ShadersWGSL/gpsHiZBuild.compute.js.map +1 -0
  656. package/ShadersWGSL/gpsPartition.compute.d.ts +5 -0
  657. package/ShadersWGSL/gpsPartition.compute.js +27 -0
  658. package/ShadersWGSL/gpsPartition.compute.js.map +1 -0
  659. package/ShadersWGSL/gpsPreprocess.compute.d.ts +5 -0
  660. package/ShadersWGSL/gpsPreprocess.compute.js +86 -0
  661. package/ShadersWGSL/gpsPreprocess.compute.js.map +1 -0
  662. package/ShadersWGSL/gpsResolve.compute.d.ts +5 -0
  663. package/ShadersWGSL/gpsResolve.compute.js +41 -0
  664. package/ShadersWGSL/gpsResolve.compute.js.map +1 -0
  665. package/ShadersWGSL/gpsScanAdd.compute.d.ts +5 -0
  666. package/ShadersWGSL/gpsScanAdd.compute.js +22 -0
  667. package/ShadersWGSL/gpsScanAdd.compute.js.map +1 -0
  668. package/ShadersWGSL/gpsScanBlocks.compute.d.ts +5 -0
  669. package/ShadersWGSL/gpsScanBlocks.compute.js +23 -0
  670. package/ShadersWGSL/gpsScanBlocks.compute.js.map +1 -0
  671. package/ShadersWGSL/gpsScanSums.compute.d.ts +5 -0
  672. package/ShadersWGSL/gpsScanSums.compute.js +30 -0
  673. package/ShadersWGSL/gpsScanSums.compute.js.map +1 -0
  674. package/ShadersWGSL/gpsSplat.compute.d.ts +5 -0
  675. package/ShadersWGSL/gpsSplat.compute.js +37 -0
  676. package/ShadersWGSL/gpsSplat.compute.js.map +1 -0
  677. package/ShadersWGSL/gpuRenderParticles.fragment.js +47 -2
  678. package/ShadersWGSL/gpuRenderParticles.fragment.js.map +1 -1
  679. package/ShadersWGSL/gpuRenderParticles.vertex.js +110 -7
  680. package/ShadersWGSL/gpuRenderParticles.vertex.js.map +1 -1
  681. package/ShadersWGSL/meshBlending.fragment.d.ts +5 -0
  682. package/ShadersWGSL/meshBlending.fragment.js +576 -0
  683. package/ShadersWGSL/meshBlending.fragment.js.map +1 -0
  684. package/ShadersWGSL/minmaxRedux.fragment.js +20 -3
  685. package/ShadersWGSL/minmaxRedux.fragment.js.map +1 -1
  686. package/ShadersWGSL/openpbr.fragment.js +2 -1
  687. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  688. package/ShadersWGSL/particles.fragment.js +45 -1
  689. package/ShadersWGSL/particles.fragment.js.map +1 -1
  690. package/ShadersWGSL/particles.vertex.js +86 -4
  691. package/ShadersWGSL/particles.vertex.js.map +1 -1
  692. package/ShadersWGSL/pbr.fragment.js +2 -1
  693. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  694. package/ShadersWGSL/sprites.fragment.js +56 -2
  695. package/ShadersWGSL/sprites.fragment.js.map +1 -1
  696. package/ShadersWGSL/sprites.vertex.js +62 -1
  697. package/ShadersWGSL/sprites.vertex.js.map +1 -1
  698. package/Sprites/spriteManager.d.ts +13 -0
  699. package/Sprites/spriteManager.js +15 -0
  700. package/Sprites/spriteManager.js.map +1 -1
  701. package/Sprites/spriteRenderer.d.ts +24 -1
  702. package/Sprites/spriteRenderer.js +368 -50
  703. package/Sprites/spriteRenderer.js.map +1 -1
  704. package/Sprites/thinSprite.d.ts +4 -0
  705. package/Sprites/thinSprite.js +4 -0
  706. package/Sprites/thinSprite.js.map +1 -1
  707. package/States/alphaCullingState.d.ts +3 -1
  708. package/States/alphaCullingState.js +18 -3
  709. package/States/alphaCullingState.js.map +1 -1
  710. package/XR/features/WebXRSpaceWarp.pure.js +2 -1
  711. package/XR/features/WebXRSpaceWarp.pure.js.map +1 -1
  712. package/XR/webXRDefaultExperience.d.ts +5 -1
  713. package/XR/webXRDefaultExperience.js.map +1 -1
  714. package/XR/webXREnterExitUI.d.ts +2 -1
  715. package/XR/webXREnterExitUI.js.map +1 -1
  716. package/assetContainer.d.ts +1 -0
  717. package/assetContainer.js +5 -1
  718. package/assetContainer.js.map +1 -1
  719. package/package.json +1 -1
  720. package/scene.pure.d.ts +36 -2
  721. package/scene.pure.js +63 -4
  722. package/scene.pure.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"thinNativeEngine.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Engines/thinNativeEngine.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable, type IndicesArray, type DataArray, type FloatArray, type DeepImmutable, type int } from \"../types\";\r\n\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { type VertexBuffer } from \"../Buffers/buffer.pure\";\r\nimport { RegisterBufferAlign } from \"../Buffers/buffer.align.pure\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport { type BaseTexture } from \"../Materials/Textures/baseTexture.pure\";\r\nimport { type VideoTexture } from \"../Materials/Textures/videoTexture.pure\";\r\nimport { type RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture.pure\";\r\nimport { type Effect } from \"../Materials/effect.pure\";\r\nimport { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { type Observer, Observable } from \"../Misc/observable.pure\";\r\nimport {\r\n type RenderTargetCreationOptions,\r\n type TextureSize,\r\n type DepthTextureCreationOptions,\r\n type InternalTextureCreationOptions,\r\n} from \"../Materials/Textures/textureCreationOptions\";\r\nimport { type IPipelineContext } from \"./IPipelineContext\";\r\nimport { type IMultiRenderTargetOptions } from \"../Materials/Textures/multiRenderTarget.pure\";\r\nimport { type IColor3Like, type IColor4Like, type IViewportLike } from \"../Maths/math.like\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Constants } from \"./constants\";\r\nimport { AbstractEngine, type ISceneLike } from \"./abstractEngine.pure\";\r\nimport { ThinEngine } from \"./thinEngine.pure\";\r\nimport { type IWebRequest } from \"../Misc/interfaces/iWebRequest\";\r\nimport { EngineStore } from \"./engineStore\";\r\nimport { ShaderCodeInliner } from \"./Processors/shaderCodeInliner\";\r\nimport { NativeShaderProcessor } from \"./Native/nativeShaderProcessors\";\r\nimport { type IMaterialContext } from \"./IMaterialContext\";\r\nimport { type IDrawContext } from \"./IDrawContext\";\r\nimport { type ICanvas, type IImage, type IPath2D } from \"./ICanvas\";\r\nimport { type IStencilState } from \"../States/IStencilState\";\r\nimport { type RenderTargetWrapper } from \"./renderTargetWrapper\";\r\nimport { type NativeData, NativeDataStream } from \"./Native/nativeDataStream\";\r\nimport {\r\n type INative,\r\n type INativeCamera,\r\n type INativeEngine,\r\n type NativeFramebuffer,\r\n type NativeFrameStats,\r\n type NativeProgram,\r\n type NativeTexture,\r\n type NativeUniform,\r\n type NativeVertexArrayObject,\r\n} from \"./Native/nativeInterfaces\";\r\nimport { NativePipelineContext } from \"./Native/nativePipelineContext\";\r\nimport { NativeRenderTargetWrapper } from \"./Native/nativeRenderTargetWrapper\";\r\nimport { NativeHardwareTexture } from \"./Native/nativeHardwareTexture\";\r\nimport { type IHardwareTextureWrapper } from \"../Materials/Textures/hardwareTextureWrapper\";\r\nimport {\r\n getNativeAlphaMode,\r\n getNativeAttribType,\r\n getNativeSamplingMode,\r\n getNativeTextureFormat,\r\n getNativeStencilDepthFail,\r\n getNativeStencilDepthPass,\r\n getNativeStencilFunc,\r\n getNativeStencilOpFail,\r\n getNativeAddressMode,\r\n} from \"./Native/nativeHelpers\";\r\nimport { checkNonFloatVertexBuffers } from \"../Buffers/buffer.nonFloatVertexBuffers\";\r\nimport { type _IShaderProcessingContext } from \"./Processors/shaderProcessingOptions\";\r\nimport { NativeShaderProcessingContext } from \"./Native/nativeShaderProcessingContext\";\r\nimport { type ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport { type WebGLHardwareTexture } from \"./WebGL/webGLHardwareTexture\";\r\n\r\nimport { _TimeToken } from \"../Instrumentation/timeToken\";\r\nimport { PerfCounter } from \"../Misc/perfCounter\";\r\nimport { DecodeBase64UrlToBinary } from \"../Misc/fileTools.pure\";\r\n\r\ndeclare const _native: INative;\r\n\r\nconst onNativeObjectInitialized = /*#__PURE__*/ new Observable<INative>();\r\nif (typeof self !== \"undefined\" && !Object.prototype.hasOwnProperty.call(self, \"_native\")) {\r\n let __native: INative;\r\n Object.defineProperty(self, \"_native\", {\r\n get: () => __native,\r\n set: (value: INative) => {\r\n __native = value;\r\n if (__native) {\r\n onNativeObjectInitialized.notifyObservers(__native);\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Returns _native only after it has been defined by BabylonNative.\r\n * @internal\r\n */\r\nexport async function AcquireNativeObjectAsync(): Promise<INative> {\r\n return await new Promise((resolve) => {\r\n if (typeof _native === \"undefined\") {\r\n onNativeObjectInitialized.addOnce((nativeObject) => resolve(nativeObject));\r\n } else {\r\n resolve(_native);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Registers a constructor on the _native object. See NativeXRFrame for an example.\r\n * @internal\r\n */\r\nexport async function RegisterNativeTypeAsync<Type>(typeName: string, constructor: Type) {\r\n ((await AcquireNativeObjectAsync()) as any)[typeName] = constructor;\r\n}\r\n\r\n/**\r\n * Container for accessors for natively-stored mesh data buffers.\r\n */\r\nclass NativeDataBuffer extends DataBuffer {\r\n /**\r\n * Accessor value used to identify/retrieve a natively-stored index buffer.\r\n */\r\n public nativeIndexBuffer?: NativeData;\r\n\r\n /**\r\n * Accessor value used to identify/retrieve a natively-stored vertex buffer.\r\n */\r\n public nativeVertexBuffer?: NativeData;\r\n}\r\n\r\n/**\r\n * Options to create the Native engine\r\n */\r\nexport interface ThinNativeEngineOptions {\r\n /**\r\n * defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n adaptToDeviceRatio?: boolean;\r\n}\r\n\r\n/** @internal */\r\nclass CommandBufferEncoder {\r\n private readonly _commandStream: NativeDataStream;\r\n private readonly _pending = new Array<NativeData>();\r\n private _isCommandBufferScopeActive = false;\r\n\r\n public constructor(private readonly _engine: INativeEngine) {\r\n this._commandStream = ThinNativeEngine._createNativeDataStream();\r\n this._engine.setCommandDataStream(this._commandStream);\r\n }\r\n\r\n public beginCommandScope() {\r\n if (this._isCommandBufferScopeActive) {\r\n throw new Error(\"Command scope already active.\");\r\n }\r\n\r\n this._isCommandBufferScopeActive = true;\r\n }\r\n\r\n public endCommandScope() {\r\n if (!this._isCommandBufferScopeActive) {\r\n throw new Error(\"Command scope is not active.\");\r\n }\r\n\r\n this._isCommandBufferScopeActive = false;\r\n this._submit();\r\n }\r\n\r\n public startEncodingCommand(command: NativeData) {\r\n this._commandStream.writeNativeData(command);\r\n }\r\n\r\n public encodeCommandArgAsUInt32(commandArg: number) {\r\n this._commandStream.writeUint32(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsUInt32s(commandArg: Uint32Array) {\r\n this._commandStream.writeUint32Array(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsInt32(commandArg: number) {\r\n this._commandStream.writeInt32(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsInt32s(commandArg: Int32Array) {\r\n this._commandStream.writeInt32Array(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsFloat32(commandArg: number) {\r\n this._commandStream.writeFloat32(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsFloat32s(commandArg: DeepImmutable<FloatArray>) {\r\n this._commandStream.writeFloat32Array(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsNativeData(commandArg: NativeData) {\r\n this._commandStream.writeNativeData(commandArg);\r\n this._pending.push(commandArg);\r\n }\r\n\r\n public finishEncodingCommand() {\r\n if (!this._isCommandBufferScopeActive) {\r\n this._submit();\r\n }\r\n }\r\n\r\n private _submit() {\r\n this._engine.submitCommands();\r\n this._pending.length = 0;\r\n }\r\n}\r\n\r\nconst remappedAttributesNames: string[] = [];\r\n\r\n/** @internal */\r\nexport class ThinNativeEngine extends ThinEngine {\r\n // This must match the protocol version in NativeEngine.cpp\r\n private static readonly PROTOCOL_VERSION = 9;\r\n\r\n /** @internal */\r\n public static _createNativeDataStream(): NativeDataStream {\r\n return new NativeDataStream();\r\n }\r\n\r\n /////////// No assignment allowed in constructor ///////////\r\n /////////// They should all be in _initializeNativeEngine ///////////\r\n /////////// To ensure a correct sharing with NativeEngine ///////////\r\n protected _engine: INativeEngine;\r\n private _camera: Nullable<INativeCamera>;\r\n private _commandBufferEncoder: CommandBufferEncoder;\r\n private _frameStats: NativeFrameStats;\r\n private _boundBuffersVertexArray: any;\r\n private _currentDepthTest: number;\r\n private _depthTestEnabled: boolean;\r\n private _stencilTest: boolean;\r\n private _stencilMask: number;\r\n private _stencilFunc: number;\r\n private _stencilFuncRef: number;\r\n private _stencilFuncMask: number;\r\n private _stencilOpStencilFail: number;\r\n private _stencilOpDepthFail: number;\r\n private _stencilOpStencilDepthPass: number;\r\n private _zOffset: number;\r\n private _zOffsetUnits: number;\r\n private _cachedCulling: boolean;\r\n private _cachedReverseSide: boolean;\r\n private _cachedCullBackFaces: boolean;\r\n private _cachedZOffset: number;\r\n private _cachedZOffsetUnits: number;\r\n private _depthWrite: boolean;\r\n // warning for non supported fill mode has already been displayed\r\n private _fillModeWarningDisplayed: boolean;\r\n\r\n public constructor(options: ThinNativeEngineOptions = {}) {\r\n super(null, false, undefined, options.adaptToDeviceRatio);\r\n this._initializeNativeEngine(options.adaptToDeviceRatio ?? false);\r\n }\r\n //////////////////////////////////////////////////////////////////////\r\n\r\n /**\r\n * Keeps as a separate function to use in NativeEngine\r\n * @internal\r\n */\r\n protected _initializeNativeEngine(adaptToDeviceRatio: boolean): void {\r\n // ThinNativeEngine relies on VertexBuffer.effective{Buffer,ByteOffset,ByteStride}\r\n // (defined in Buffers/buffer.align.pure) to bind vertex attributes through\r\n // recordVertexBuffer. Register the side effect here so the engine is usable\r\n // on its own without callers having to remember to import the wrapper module.\r\n // The registration is idempotent.\r\n RegisterBufferAlign();\r\n\r\n this._engine = new _native.Engine({\r\n version: AbstractEngine.Version,\r\n nonFloatVertexBuffers: true,\r\n });\r\n this._camera = _native.Camera ? new _native.Camera() : null;\r\n this._commandBufferEncoder = new CommandBufferEncoder(this._engine);\r\n this._frameStats = { gpuTimeNs: Number.NaN };\r\n this._boundBuffersVertexArray = null;\r\n this._currentDepthTest = _native.Engine.DEPTH_TEST_LEQUAL;\r\n this._depthTestEnabled = true;\r\n this._stencilTest = false;\r\n this._stencilMask = 255;\r\n this._stencilFunc = Constants.ALWAYS;\r\n this._stencilFuncRef = 0;\r\n this._stencilFuncMask = 255;\r\n this._stencilOpStencilFail = Constants.KEEP;\r\n this._stencilOpDepthFail = Constants.KEEP;\r\n this._stencilOpStencilDepthPass = Constants.REPLACE;\r\n this._zOffset = 0;\r\n this._zOffsetUnits = 0;\r\n this._cachedCulling = true;\r\n this._cachedReverseSide = false;\r\n this._cachedCullBackFaces = true;\r\n this._cachedZOffset = 0;\r\n this._cachedZOffsetUnits = 0;\r\n this._depthWrite = true;\r\n // warning for non supported fill mode has already been displayed\r\n this._fillModeWarningDisplayed = false;\r\n\r\n this._drawCalls = new PerfCounter();\r\n\r\n if (_native.Engine.PROTOCOL_VERSION !== ThinNativeEngine.PROTOCOL_VERSION) {\r\n throw new Error(`Protocol version mismatch: ${_native.Engine.PROTOCOL_VERSION} (Native) !== ${ThinNativeEngine.PROTOCOL_VERSION} (JS)`);\r\n }\r\n\r\n // Prefer setRenderResetCallback (accurate name -- fires when bgfx is (re)initialized,\r\n // i.e. on device restore). Fall back to the legacy setDeviceLostCallback for backward\r\n // compatibility with older BabylonNative builds. See BabylonNative #1722.\r\n const renderResetCallback = () => {\r\n this.onContextLostObservable.notifyObservers(this);\r\n this._contextWasLost = true;\r\n this._restoreEngineAfterContextLost();\r\n };\r\n if (this._engine.setRenderResetCallback) {\r\n this._engine.setRenderResetCallback(renderResetCallback);\r\n } else if (this._engine.setDeviceLostCallback) {\r\n this._engine.setDeviceLostCallback(renderResetCallback);\r\n }\r\n\r\n this._webGLVersion = 2;\r\n this.disableUniformBuffers = true;\r\n this._shaderPlatformName = \"NATIVE\";\r\n // Babylon Native is not WebGL and has no _gl context. Report a distinct engine name (like\r\n // WebGPU reports \"WebGPU\") so application/feature code that branches on engine.name === \"WebGL\"\r\n // to touch the WebGL-only _gl context skips the native engine instead of dereferencing null.\r\n this._name = \"Native\";\r\n\r\n // TODO: Initialize this more correctly based on the hardware capabilities.\r\n // Init caps\r\n\r\n this._caps = {\r\n maxTexturesImageUnits: 16,\r\n maxVertexTextureImageUnits: 16,\r\n maxCombinedTexturesImageUnits: 32,\r\n maxTextureSize: _native.Engine.CAPS_LIMITS_MAX_TEXTURE_SIZE,\r\n maxCubemapTextureSize: 512,\r\n maxRenderTextureSize: 512,\r\n maxVertexAttribs: 16,\r\n maxVaryingVectors: 16,\r\n maxDrawBuffers: 8,\r\n maxFragmentUniformVectors: 16,\r\n maxVertexUniformVectors: 256,\r\n shaderFloatPrecision: 23, // TODO: is this correct?\r\n standardDerivatives: true,\r\n astc: null,\r\n pvrtc: null,\r\n etc1: null,\r\n etc2: null,\r\n bptc: null,\r\n maxAnisotropy: 16, // TODO: Retrieve this smartly. Currently set to D3D11 maximum allowable value.\r\n uintIndices: true,\r\n fragmentDepthSupported: false,\r\n highPrecisionShaderSupported: true,\r\n colorBufferFloat: true,\r\n blendFloat: true,\r\n supportFloatTexturesResolve: false,\r\n rg11b10ufColorRenderable: false,\r\n textureFloat: true,\r\n textureFloatLinearFiltering: true,\r\n textureFloatRender: true,\r\n textureHalfFloat: true,\r\n textureHalfFloatLinearFiltering: true,\r\n textureHalfFloatRender: true,\r\n textureLOD: true,\r\n texelFetch: true,\r\n drawBuffersExtension: true,\r\n depthTextureExtension: false,\r\n vertexArrayObject: true,\r\n instancedArrays: true,\r\n supportOcclusionQuery: false,\r\n canUseTimestampForTimerQuery: false,\r\n blendMinMax: false,\r\n maxMSAASamples: 16,\r\n canUseGLInstanceID: true,\r\n canUseGLVertexID: true,\r\n supportComputeShaders: false,\r\n supportSRGBBuffers: true,\r\n supportTransformFeedbacks: false,\r\n textureMaxLevel: false,\r\n texture2DArrayMaxLayerCount: _native.Engine.CAPS_LIMITS_MAX_TEXTURE_LAYERS,\r\n disableMorphTargetTexture: false,\r\n parallelShaderCompile: { COMPLETION_STATUS_KHR: 0 },\r\n textureNorm16: false,\r\n blendParametersPerTarget: false,\r\n dualSourceBlending: false,\r\n supportReadWriteStorageTextures: false,\r\n };\r\n\r\n this._features = {\r\n forceBitmapOverHTMLImageElement: true,\r\n supportRenderAndCopyToLodForFloatTextures: false,\r\n supportDepthStencilTexture: false,\r\n supportShadowSamplers: false,\r\n uniformBufferHardCheckMatrix: false,\r\n allowTexturePrefiltering: false,\r\n trackUbosInFrame: false,\r\n checkUbosContentBeforeUpload: false,\r\n supportCSM: false,\r\n basisNeedsPOT: false,\r\n support3DTextures: false,\r\n needTypeSuffixInShaderConstants: false,\r\n supportMSAA: true,\r\n supportSSAO2: false,\r\n supportIBLShadows: false,\r\n supportExtendedTextureFormats: false,\r\n supportSwitchCaseInShader: false,\r\n supportSyncTextureRead: false,\r\n needsInvertingBitmap: true,\r\n useUBOBindingCache: true,\r\n needShaderCodeInlining: true,\r\n needToAlwaysBindUniformBuffers: false,\r\n supportRenderPasses: true,\r\n supportSpriteInstancing: false,\r\n forceVertexBufferStrideAndOffsetMultiple4Bytes: true,\r\n _checkNonFloatVertexBuffersDontRecreatePipelineContext: false,\r\n };\r\n\r\n Logger.Log(\"Babylon Native (v\" + AbstractEngine.Version + \") launched\");\r\n\r\n // Wrappers\r\n if (typeof URL === \"undefined\") {\r\n (window.URL as any) = {\r\n createObjectURL: function () {},\r\n revokeObjectURL: function () {},\r\n };\r\n }\r\n\r\n // TODO: Remove in next protocol version update\r\n if (typeof Blob === \"undefined\") {\r\n (window.Blob as any) = function (v: any) {\r\n return v;\r\n };\r\n }\r\n\r\n // polyfill for Chakra\r\n if (!Array.prototype.flat) {\r\n Object.defineProperty(Array.prototype, \"flat\", {\r\n configurable: true,\r\n value: function flat(this: any[], depth?: number) {\r\n depth = isNaN(depth as any) ? 1 : Number(depth);\r\n\r\n return depth\r\n ? Array.prototype.reduce.call(\r\n this,\r\n function (acc: any, cur: any) {\r\n if (Array.isArray(cur)) {\r\n // eslint-disable-next-line prefer-spread\r\n acc.push.apply(acc, flat.call(cur, depth - 1));\r\n } else {\r\n acc.push(cur);\r\n }\r\n return acc;\r\n },\r\n []\r\n )\r\n : Array.prototype.slice.call(this);\r\n },\r\n writable: true,\r\n });\r\n }\r\n\r\n // Currently we do not fully configure the ThinEngine on construction of NativeEngine.\r\n // Setup resolution scaling based on display settings.\r\n const devicePixelRatio = window ? window.devicePixelRatio || 1.0 : 1.0;\r\n this._hardwareScalingLevel = adaptToDeviceRatio ? 1.0 / devicePixelRatio : 1.0;\r\n this._engine.setHardwareScalingLevel(this._hardwareScalingLevel);\r\n this._lastDevicePixelRatio = devicePixelRatio;\r\n this.resize();\r\n\r\n const currentDepthFunction = this.getDepthFunction();\r\n if (currentDepthFunction) {\r\n this.setDepthFunction(currentDepthFunction);\r\n }\r\n\r\n // Shader processor\r\n this._shaderProcessor = new NativeShaderProcessor();\r\n\r\n this.onNewSceneAddedObservable.add((scene) => {\r\n this._wrapSceneRenderWithCommandScope(scene);\r\n });\r\n }\r\n\r\n /**\r\n * Brackets a scene's render with a command scope, so the commands it encodes are submitted together.\r\n * @param scene the scene whose render should be wrapped\r\n */\r\n private _wrapSceneRenderWithCommandScope(scene: Scene): void {\r\n const originalRender = scene.render;\r\n scene.render = (...args: Parameters<typeof originalRender>) => {\r\n this._commandBufferEncoder.beginCommandScope();\r\n try {\r\n originalRender.apply(scene, args);\r\n } catch (renderException) {\r\n // The scope must be closed even when the render throws. Otherwise it stays\r\n // open forever and every later frame fails with \"Command scope already\r\n // active.\", so one recoverable error permanently breaks the engine instead\r\n // of affecting just this frame.\r\n try {\r\n this._commandBufferEncoder.endCommandScope();\r\n } catch (endException) {\r\n // Never let this replace the root cause; report it separately instead.\r\n Logger.Error(`Failed to end the command scope while unwinding a render error: ${endException}`);\r\n }\r\n throw renderException;\r\n }\r\n\r\n this._commandBufferEncoder.endCommandScope();\r\n };\r\n }\r\n\r\n public override setHardwareScalingLevel(level: number): void {\r\n super.setHardwareScalingLevel(level);\r\n this._engine.setHardwareScalingLevel(level);\r\n }\r\n\r\n public override dispose(): void {\r\n super.dispose();\r\n if (this._boundBuffersVertexArray) {\r\n this._deleteVertexArray(this._boundBuffersVertexArray);\r\n }\r\n this._engine.dispose();\r\n }\r\n\r\n /**\r\n * Enable scissor test on a specific rectangle (ie. render will only be executed on a specific portion of the screen)\r\n * @param x defines the x-coordinate of the bottom left corner of the clear rectangle\r\n * @param y defines the y-coordinate of the corner of the clear rectangle\r\n * @param width defines the width of the clear rectangle\r\n * @param height defines the height of the clear rectangle\r\n */\r\n public override enableScissor(x: number, y: number, width: number, height: number): void {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETSCISSOR);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(x);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(y);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(width);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(height);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Disable previously set scissor test rectangle\r\n */\r\n public override disableScissor() {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETSCISSOR);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(0);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Can be used to override the current requestAnimationFrame requester.\r\n * @internal\r\n */\r\n protected override _queueNewFrame(bindedRenderFunction: any, requester?: any): number {\r\n // Use the provided requestAnimationFrame, unless the requester is the window. In that case, we will default to the Babylon Native version of requestAnimationFrame.\r\n if (requester?.requestAnimationFrame && requester !== this.getHostWindow()) {\r\n return requester.requestAnimationFrame(bindedRenderFunction);\r\n } else {\r\n this._engine.requestAnimationFrame(bindedRenderFunction);\r\n }\r\n return 0;\r\n }\r\n\r\n protected override _restoreEngineAfterContextLost(): void {\r\n this._clearEmptyResources();\r\n\r\n const depthTest = this._depthCullingState.depthTest; // backup those values because the call to initEngine / wipeCaches will reset them\r\n const depthFunc = this._depthCullingState.depthFunc;\r\n const depthMask = this._depthCullingState.depthMask;\r\n const stencilTest = this._stencilState.stencilTest;\r\n\r\n this._rebuildGraphicsResources();\r\n\r\n this._depthCullingState.depthTest = depthTest;\r\n this._depthCullingState.depthFunc = depthFunc;\r\n this._depthCullingState.depthMask = depthMask;\r\n this._stencilState.stencilTest = stencilTest;\r\n\r\n this._flagContextRestored();\r\n }\r\n\r\n /**\r\n * Override default engine behavior.\r\n * @param framebuffer\r\n */\r\n public override _bindUnboundFramebuffer(framebuffer: Nullable<WebGLFramebuffer>) {\r\n if (this._currentFramebuffer !== framebuffer) {\r\n if (this._currentFramebuffer) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_UNBINDFRAMEBUFFER);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(this._currentFramebuffer as NativeFramebuffer);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n if (framebuffer) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_BINDFRAMEBUFFER);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(framebuffer as NativeFramebuffer);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n this._currentFramebuffer = framebuffer;\r\n }\r\n }\r\n\r\n /**\r\n * Gets host document\r\n * @returns the host document object\r\n */\r\n public override getHostDocument(): Nullable<Document> {\r\n return null;\r\n }\r\n\r\n public override clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil: boolean = false, stencilClearValue = 0): void {\r\n if (depth && this.useReverseDepthBuffer) {\r\n // Reverse-Z: the scene is rendered with a flipped projection (near maps to 1, far to 0), so the\r\n // depth buffer is cleared to 0 and the comparison must accept greater values. The WebGL engine\r\n // sets depthCullingState.depthFunc = GEQUAL here and relies on applyStates() running the depth\r\n // comparison to the GL context before each draw. The native draw path does not call applyStates()\r\n // (only depth-test enable/disable is reconciled in _flushDepthTestState()), so setting the shared\r\n // state alone would never reach the backend. Route the comparison through the native command path\r\n // as well -- mirroring the WebGPU engine's clear path, which calls setDepthFunctionToGreaterOrEqual().\r\n this._depthCullingState.depthFunc = Constants.GEQUAL;\r\n this.setDepthFunction(Constants.GEQUAL);\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_CLEAR);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(backBuffer && color ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(color ? color.r : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(color ? color.g : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(color ? color.b : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(color ? color.a : 1);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(depth ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(depth && this.useReverseDepthBuffer ? 0 : 1);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(stencil ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(stencilClearValue);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override createIndexBuffer(indices: IndicesArray, updateable?: boolean, _label?: string): NativeDataBuffer {\r\n const data = this._normalizeIndexData(indices);\r\n const buffer = new NativeDataBuffer();\r\n buffer.references = 1;\r\n buffer.is32Bits = data.BYTES_PER_ELEMENT === 4;\r\n if (data.byteLength) {\r\n buffer.nativeIndexBuffer = this._engine.createIndexBuffer(data.buffer, data.byteOffset, data.byteLength, buffer.is32Bits, updateable ?? false);\r\n }\r\n return buffer;\r\n }\r\n\r\n public override createVertexBuffer(vertices: DataArray, updateable?: boolean, _label?: string): NativeDataBuffer {\r\n const data = ArrayBuffer.isView(vertices) ? vertices : new Float32Array(vertices);\r\n const buffer = new NativeDataBuffer();\r\n buffer.references = 1;\r\n if (data.byteLength) {\r\n buffer.nativeVertexBuffer = this._engine.createVertexBuffer(data.buffer, data.byteOffset, data.byteLength, updateable ?? false);\r\n }\r\n return buffer;\r\n }\r\n\r\n private _recordVertexArrayObject(\r\n vertexArray: any,\r\n vertexBuffers: { [key: string]: VertexBuffer },\r\n indexBuffer: Nullable<NativeDataBuffer>,\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable<VertexBuffer> }\r\n ): void {\r\n if (!effect._checkedNonFloatVertexBuffers) {\r\n checkNonFloatVertexBuffers(vertexBuffers, effect);\r\n effect._checkedNonFloatVertexBuffers = true;\r\n }\r\n\r\n if (indexBuffer) {\r\n this._engine.recordIndexBuffer(vertexArray, indexBuffer.nativeIndexBuffer!);\r\n }\r\n\r\n const attributes = effect.getAttributesNames();\r\n for (let index = 0; index < attributes.length; index++) {\r\n const location = effect.getAttributeLocation(index);\r\n if (location >= 0) {\r\n const kind = attributes[index];\r\n let vertexBuffer: Nullable<VertexBuffer> = null;\r\n\r\n if (overrideVertexBuffers) {\r\n vertexBuffer = overrideVertexBuffers[kind];\r\n }\r\n if (!vertexBuffer) {\r\n vertexBuffer = vertexBuffers[kind];\r\n }\r\n\r\n if (vertexBuffer) {\r\n const buffer = vertexBuffer.effectiveBuffer as Nullable<NativeDataBuffer>;\r\n if (buffer && buffer.nativeVertexBuffer) {\r\n this._engine.recordVertexBuffer(\r\n vertexArray,\r\n buffer.nativeVertexBuffer,\r\n location,\r\n vertexBuffer.effectiveByteOffset,\r\n vertexBuffer.effectiveByteStride,\r\n vertexBuffer.getSize(),\r\n getNativeAttribType(vertexBuffer.type),\r\n vertexBuffer.normalized,\r\n vertexBuffer.getInstanceDivisor()\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public override bindBuffers(vertexBuffers: { [key: string]: VertexBuffer }, indexBuffer: Nullable<NativeDataBuffer>, effect: Effect): void {\r\n if (this._boundBuffersVertexArray) {\r\n this._deleteVertexArray(this._boundBuffersVertexArray);\r\n }\r\n this._boundBuffersVertexArray = this._engine.createVertexArray();\r\n this._recordVertexArrayObject(this._boundBuffersVertexArray, vertexBuffers, indexBuffer, effect);\r\n this.bindVertexArrayObject(this._boundBuffersVertexArray);\r\n }\r\n\r\n public override recordVertexArrayObject(\r\n vertexBuffers: { [key: string]: VertexBuffer },\r\n indexBuffer: Nullable<NativeDataBuffer>,\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable<VertexBuffer> }\r\n ): WebGLVertexArrayObject {\r\n const vertexArray = this._engine.createVertexArray();\r\n this._recordVertexArrayObject(vertexArray, vertexBuffers, indexBuffer, effect, overrideVertexBuffers);\r\n return vertexArray;\r\n }\r\n\r\n private _deleteVertexArray(vertexArray: NativeVertexArrayObject) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DELETEVERTEXARRAY);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(vertexArray);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override bindVertexArrayObject(vertexArray: WebGLVertexArrayObject): void {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_BINDVERTEXARRAY);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(vertexArray as NativeVertexArrayObject);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override releaseVertexArrayObject(vertexArray: WebGLVertexArrayObject) {\r\n this._deleteVertexArray(vertexArray as NativeVertexArrayObject);\r\n }\r\n\r\n public override getAttributes(pipelineContext: IPipelineContext, attributesNames: string[]): number[] {\r\n const nativePipelineContext = pipelineContext as NativePipelineContext;\r\n const nativeShaderProcessingContext = nativePipelineContext.shaderProcessingContext!;\r\n\r\n remappedAttributesNames.length = 0;\r\n for (let index = 0; index < attributesNames.length; index++) {\r\n const origAttributeName = attributesNames[index];\r\n const attributeName = nativeShaderProcessingContext.remappedAttributeNames[origAttributeName] ?? origAttributeName;\r\n remappedAttributesNames[index] = attributeName;\r\n }\r\n return this._engine.getAttributes(nativePipelineContext.program, remappedAttributesNames);\r\n }\r\n\r\n /**\r\n * Triangle Fan and Line Loop are not supported by modern rendering API\r\n * @param fillMode defines the primitive to use\r\n * @returns true if supported\r\n */\r\n private _checkSupportedFillMode(fillMode: number): boolean {\r\n if (fillMode == Constants.MATERIAL_LineLoopDrawMode || fillMode == Constants.MATERIAL_TriangleFanDrawMode) {\r\n if (!this._fillModeWarningDisplayed) {\r\n Logger.Warn(\"Line Loop and Triangle Fan are not supported fill modes with Babylon Native. Elements with these fill mode will not be visible.\");\r\n this._fillModeWarningDisplayed = true;\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Draw a list of indexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public override drawElementsType(fillMode: number, indexStart: number, indexCount: number, instancesCount?: number): void {\r\n if (!this._checkSupportedFillMode(fillMode)) {\r\n return;\r\n }\r\n // Apply states\r\n this._flushDepthTestState();\r\n this._drawCalls.addCount(1, false);\r\n\r\n if (instancesCount) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DRAWINDEXEDINSTANCED);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(fillMode);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(indexStart);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(indexCount);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(instancesCount);\r\n } else {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DRAWINDEXED);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(fillMode);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(indexStart);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(indexCount);\r\n }\r\n\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public override drawArraysType(fillMode: number, verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n if (!this._checkSupportedFillMode(fillMode)) {\r\n return;\r\n }\r\n // Apply states\r\n this._flushDepthTestState();\r\n this._drawCalls.addCount(1, false);\r\n\r\n if (instancesCount) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DRAWINSTANCED);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(fillMode);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(verticesStart);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(verticesCount);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(instancesCount);\r\n } else {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DRAW);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(fillMode);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(verticesStart);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(verticesCount);\r\n }\r\n\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override createPipelineContext(shaderProcessingContext: Nullable<_IShaderProcessingContext>): IPipelineContext {\r\n const isAsync = !!this._caps.parallelShaderCompile;\r\n return new NativePipelineContext(this, isAsync, shaderProcessingContext as Nullable<NativeShaderProcessingContext>);\r\n }\r\n\r\n public override createMaterialContext(): IMaterialContext | undefined {\r\n return undefined;\r\n }\r\n\r\n public override createDrawContext(): IDrawContext | undefined {\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Function is not technically Async\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public override _preparePipelineContextAsync(\r\n pipelineContext: IPipelineContext,\r\n vertexSourceCode: string,\r\n fragmentSourceCode: string,\r\n createAsRaw: boolean,\r\n _rawVertexSourceCode: string,\r\n _rawFragmentSourceCode: string,\r\n _rebuildRebind: any,\r\n defines: Nullable<string>,\r\n _transformFeedbackVaryings: Nullable<string[]>,\r\n _key: string,\r\n onReady: () => void\r\n ) {\r\n if (createAsRaw) {\r\n this.createRawShaderProgram();\r\n } else {\r\n this.createShaderProgram(pipelineContext, vertexSourceCode, fragmentSourceCode, defines);\r\n }\r\n\r\n onReady();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _getShaderProcessingContext(_shaderLanguage: ShaderLanguage): Nullable<_IShaderProcessingContext> {\r\n return new NativeShaderProcessingContext();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _executeWhenRenderingStateIsCompiled(pipelineContext: IPipelineContext, action: () => void) {\r\n const nativePipelineContext = pipelineContext as NativePipelineContext;\r\n if (nativePipelineContext.isAsync) {\r\n if (nativePipelineContext.onCompiled) {\r\n const oldHandler = nativePipelineContext.onCompiled;\r\n nativePipelineContext.onCompiled = () => {\r\n oldHandler();\r\n action();\r\n };\r\n } else {\r\n nativePipelineContext.onCompiled = action;\r\n }\r\n } else {\r\n action();\r\n }\r\n }\r\n\r\n public override createRawShaderProgram(): WebGLProgram {\r\n throw new Error(\"Not Supported\");\r\n }\r\n\r\n public override createShaderProgram(pipelineContext: IPipelineContext, vertexCode: string, fragmentCode: string, defines: Nullable<string>): WebGLProgram {\r\n const nativePipelineContext = pipelineContext as NativePipelineContext;\r\n\r\n this.onBeforeShaderCompilationObservable.notifyObservers(this);\r\n\r\n const vertexInliner = new ShaderCodeInliner(vertexCode);\r\n vertexInliner.processCode();\r\n vertexCode = vertexInliner.code;\r\n\r\n const fragmentInliner = new ShaderCodeInliner(fragmentCode);\r\n fragmentInliner.processCode();\r\n fragmentCode = fragmentInliner.code;\r\n\r\n vertexCode = ThinEngine._ConcatenateShader(vertexCode, defines);\r\n fragmentCode = ThinEngine._ConcatenateShader(fragmentCode, defines);\r\n\r\n const onSuccess = () => {\r\n nativePipelineContext.isCompiled = true;\r\n nativePipelineContext.onCompiled?.();\r\n this.onAfterShaderCompilationObservable.notifyObservers(this);\r\n };\r\n\r\n if (pipelineContext.isAsync) {\r\n nativePipelineContext.program = this._engine.createProgramAsync(vertexCode, fragmentCode, onSuccess, (error: Error) => {\r\n nativePipelineContext.compilationError = error;\r\n });\r\n } else {\r\n try {\r\n nativePipelineContext.program = this._engine.createProgram(vertexCode, fragmentCode);\r\n onSuccess();\r\n } catch (e) {\r\n const message = e?.message;\r\n throw new Error(\"SHADER ERROR\" + (typeof message === \"string\" ? \"\\n\" + message : \"\"), { cause: e });\r\n }\r\n }\r\n\r\n return nativePipelineContext.program as WebGLProgram;\r\n }\r\n\r\n /**\r\n * Inline functions in shader code that are marked to be inlined\r\n * @param code code to inline\r\n * @returns inlined code\r\n */\r\n public override inlineShaderCode(code: string): string {\r\n const sci = new ShaderCodeInliner(code);\r\n sci.debug = false;\r\n sci.processCode();\r\n return sci.code;\r\n }\r\n\r\n protected override _setProgram(program: WebGLProgram): void {\r\n if (this._currentProgram !== program) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETPROGRAM);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(program as NativeProgram);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n this._currentProgram = program;\r\n }\r\n }\r\n\r\n public override _deletePipelineContext(pipelineContext: IPipelineContext): void {\r\n const nativePipelineContext = pipelineContext as NativePipelineContext;\r\n if (nativePipelineContext && nativePipelineContext.program) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DELETEPROGRAM);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(nativePipelineContext.program);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n }\r\n\r\n public override getUniforms(pipelineContext: IPipelineContext, uniformsNames: string[]): WebGLUniformLocation[] {\r\n const nativePipelineContext = pipelineContext as NativePipelineContext;\r\n return this._engine.getUniforms(nativePipelineContext.program, uniformsNames);\r\n }\r\n\r\n public override bindUniformBlock(pipelineContext: IPipelineContext, blockName: string, index: number): void {\r\n // TODO\r\n throw new Error(\"Not Implemented\");\r\n }\r\n\r\n public override bindSamplers(effect: Effect): void {\r\n const nativePipelineContext = effect.getPipelineContext() as NativePipelineContext;\r\n this._setProgram(nativePipelineContext.program as WebGLProgram);\r\n\r\n // TODO: share this with engine?\r\n const samplers = effect.getSamplers();\r\n for (let index = 0; index < samplers.length; index++) {\r\n const uniform = effect.getUniform(samplers[index]);\r\n\r\n if (uniform) {\r\n this._boundUniforms[index] = uniform;\r\n }\r\n }\r\n this._currentEffect = null;\r\n }\r\n\r\n public override getRenderWidth(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.width;\r\n }\r\n\r\n return this._engine.getRenderWidth();\r\n }\r\n\r\n public override getRenderHeight(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.height;\r\n }\r\n\r\n return this._engine.getRenderHeight();\r\n }\r\n\r\n public override setViewport(viewport: IViewportLike, requiredWidth?: number, requiredHeight?: number): void {\r\n this._cachedViewport = viewport;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETVIEWPORT);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(viewport.x);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(viewport.y);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(viewport.width);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(viewport.height);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override setStateCullFaceType(cullBackFaces?: boolean, force?: boolean): void {\r\n const cullBack = this.cullBackFaces ?? cullBackFaces ?? true;\r\n if (this._cachedCullBackFaces === cullBack && !force) {\r\n return;\r\n }\r\n this._cachedCullBackFaces = cullBack;\r\n\r\n // Native uses an immediate command-buffer state model (no lazy _depthCullingState), so\r\n // re-issue the last COMMAND_SETSTATE payload with only the cull face changed. The zOffset\r\n // values are the ones that command actually encoded rather than the live _zOffset fields,\r\n // which setZOffset()/setZOffsetUnits() can update independently (and encode with the\r\n // opposite sign under a reverse depth buffer).\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETSTATE);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(this._cachedCulling ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(this._cachedZOffset);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(this._cachedZOffsetUnits);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(cullBack ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(this._cachedReverseSide ? 1 : 0);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override setState(\r\n culling: boolean,\r\n zOffset: number = 0,\r\n force?: boolean,\r\n reverseSide = false,\r\n cullBackFaces?: boolean,\r\n stencil?: IStencilState,\r\n zOffsetUnits: number = 0\r\n ): void {\r\n this._zOffset = zOffset;\r\n this._zOffsetUnits = zOffsetUnits;\r\n if (this._zOffset !== 0) {\r\n Logger.Warn(\"zOffset is not supported in Native engine.\");\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETSTATE);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(culling ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(zOffset);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(zOffsetUnits);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32((this.cullBackFaces ?? cullBackFaces ?? true) ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(reverseSide ? 1 : 0);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n\r\n // Cache the resolved state so setStateCullFaceType() can re-issue it with a new cull face.\r\n this._cachedCulling = culling;\r\n this._cachedReverseSide = reverseSide;\r\n this._cachedCullBackFaces = this.cullBackFaces ?? cullBackFaces ?? true;\r\n this._cachedZOffset = zOffset;\r\n this._cachedZOffsetUnits = zOffsetUnits;\r\n }\r\n\r\n /**\r\n * Gets the client rect of native canvas. Needed for InputManager.\r\n * @returns a client rectangle\r\n */\r\n public override getInputElementClientRect(): Nullable<DOMRect> {\r\n const rect = {\r\n bottom: this.getRenderHeight(),\r\n height: this.getRenderHeight(),\r\n left: 0,\r\n right: this.getRenderWidth(),\r\n top: 0,\r\n width: this.getRenderWidth(),\r\n x: 0,\r\n y: 0,\r\n toJSON: () => {},\r\n };\r\n return rect;\r\n }\r\n\r\n /**\r\n * Set the z offset Factor to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public override setZOffset(value: number): void {\r\n if (value !== this._zOffset) {\r\n this._zOffset = value;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETZOFFSET);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(this.useReverseDepthBuffer ? -value : value);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Factor\r\n * @returns the current zOffset Factor state\r\n */\r\n public override getZOffset(): number {\r\n return this._zOffset;\r\n }\r\n\r\n /**\r\n * Set the z offset Units to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public override setZOffsetUnits(value: number): void {\r\n if (value !== this._zOffsetUnits) {\r\n this._zOffsetUnits = value;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETZOFFSETUNITS);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(this.useReverseDepthBuffer ? -value : value);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Units\r\n * @returns the current zOffset Units state\r\n */\r\n public override getZOffsetUnits(): number {\r\n return this._zOffsetUnits;\r\n }\r\n\r\n /**\r\n * Enable or disable depth buffering\r\n * @param enable defines the state to set\r\n */\r\n public override setDepthBuffer(enable: boolean): void {\r\n // Keep the shared depth-culling state in sync so that code paths which toggle\r\n // depth testing through engine.depthCullingState.depthTest (for example\r\n // EffectRenderer.applyEffectWrapper) are also honored on the native side. The\r\n // native draw path does not go through the WebGL applyStates() flush, so the\r\n // value is reconciled in _flushDepthTestState() right before each draw.\r\n this._depthCullingState.depthTest = enable;\r\n this._encodeDepthTest(enable);\r\n }\r\n\r\n private _encodeDepthTest(enable: boolean): void {\r\n this._depthTestEnabled = enable;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETDEPTHTEST);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(enable ? this._currentDepthTest : _native.Engine.DEPTH_TEST_ALWAYS);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n private _flushDepthTestState(): void {\r\n // Unlike the WebGL engine, the native engine does not call applyStates() before\r\n // a draw, so depth-test toggles made directly on engine.depthCullingState are\r\n // flushed here to match the cross-engine contract.\r\n if (this._depthCullingState.depthTest !== this._depthTestEnabled) {\r\n this._encodeDepthTest(this._depthCullingState.depthTest);\r\n }\r\n }\r\n\r\n public override applyStates(): void {\r\n // The base ThinEngine.applyStates() drives the WebGL context (this._gl) directly, which is null on\r\n // Native. Flush the depth-culling state through the native command path instead, so callers that\r\n // mutate engine.depthCullingState directly and then call applyStates() (e.g. the depth-peeling / OIT\r\n // renderer) take effect. Alpha and stencil state are applied on Native via their dedicated setters\r\n // (setAlphaMode / setStencil*), which encode their commands when called.\r\n const depthCullingState = this._depthCullingState;\r\n if (depthCullingState.depthFunc !== null && depthCullingState.depthFunc !== undefined) {\r\n this.setDepthFunction(depthCullingState.depthFunc);\r\n }\r\n this.setDepthBuffer(depthCullingState.depthTest);\r\n this.setDepthWrite(depthCullingState.depthMask);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if depth writing is enabled\r\n * @returns the current depth writing state\r\n */\r\n public override getDepthWrite(): boolean {\r\n return this._depthWrite;\r\n }\r\n\r\n public override getDepthFunction(): Nullable<number> {\r\n switch (this._currentDepthTest) {\r\n case _native.Engine.DEPTH_TEST_NEVER:\r\n return Constants.NEVER;\r\n case _native.Engine.DEPTH_TEST_ALWAYS:\r\n return Constants.ALWAYS;\r\n case _native.Engine.DEPTH_TEST_GREATER:\r\n return Constants.GREATER;\r\n case _native.Engine.DEPTH_TEST_GEQUAL:\r\n return Constants.GEQUAL;\r\n case _native.Engine.DEPTH_TEST_NOTEQUAL:\r\n return Constants.NOTEQUAL;\r\n case _native.Engine.DEPTH_TEST_EQUAL:\r\n return Constants.EQUAL;\r\n case _native.Engine.DEPTH_TEST_LESS:\r\n return Constants.LESS;\r\n case _native.Engine.DEPTH_TEST_LEQUAL:\r\n return Constants.LEQUAL;\r\n }\r\n return null;\r\n }\r\n\r\n public override setDepthFunction(depthFunc: number) {\r\n let nativeDepthFunc = 0;\r\n switch (depthFunc) {\r\n case Constants.NEVER:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_NEVER;\r\n break;\r\n case Constants.ALWAYS:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_ALWAYS;\r\n break;\r\n case Constants.GREATER:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_GREATER;\r\n break;\r\n case Constants.GEQUAL:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_GEQUAL;\r\n break;\r\n case Constants.NOTEQUAL:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_NOTEQUAL;\r\n break;\r\n case Constants.EQUAL:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_EQUAL;\r\n break;\r\n case Constants.LESS:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_LESS;\r\n break;\r\n case Constants.LEQUAL:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_LEQUAL;\r\n break;\r\n }\r\n\r\n this._currentDepthTest = nativeDepthFunc;\r\n // Route through _encodeDepthTest so the tracked _depthTestEnabled state stays in\r\n // sync with the encoded command. Because COMMAND_SETDEPTHTEST conflates the\r\n // compare function and the enable bit (DEPTH_TEST_ALWAYS == disabled), encoding\r\n // the new function directly here would silently re-enable depth testing while\r\n // depth testing is logically disabled; _encodeDepthTest honors the current\r\n // depthCullingState.depthTest and only emits the new function when enabled.\r\n this._encodeDepthTest(this._depthCullingState.depthTest);\r\n }\r\n\r\n /**\r\n * Enable or disable depth writing\r\n * @param enable defines the state to set\r\n */\r\n public override setDepthWrite(enable: boolean): void {\r\n this._depthWrite = enable;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETDEPTHWRITE);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(Number(enable));\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Enable or disable color writing\r\n * @param enable defines the state to set\r\n */\r\n public override setColorWrite(enable: boolean): void {\r\n this._colorWrite = enable;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETCOLORWRITE);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(Number(enable));\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if color writing is enabled\r\n * @returns the current color writing state\r\n */\r\n public override getColorWrite(): boolean {\r\n return this._colorWrite;\r\n }\r\n\r\n private applyStencil(): void {\r\n this._setStencil(\r\n this._stencilMask,\r\n getNativeStencilOpFail(this._stencilOpStencilFail),\r\n getNativeStencilDepthFail(this._stencilOpDepthFail),\r\n getNativeStencilDepthPass(this._stencilOpStencilDepthPass),\r\n getNativeStencilFunc(this._stencilFunc),\r\n this._stencilFuncRef\r\n );\r\n }\r\n\r\n private _setStencil(mask: number, stencilOpFail: number, depthOpFail: number, depthOpPass: number, func: number, ref: number) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETSTENCIL);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(mask);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(stencilOpFail);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(depthOpFail);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(depthOpPass);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(func);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(ref);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Enable or disable the stencil buffer\r\n * @param enable defines if the stencil buffer must be enabled or disabled\r\n */\r\n public override setStencilBuffer(enable: boolean): void {\r\n this._stencilTest = enable;\r\n if (enable) {\r\n this.applyStencil();\r\n } else {\r\n this._setStencil(\r\n 255,\r\n _native.Engine.STENCIL_OP_FAIL_S_KEEP,\r\n _native.Engine.STENCIL_OP_FAIL_Z_KEEP,\r\n _native.Engine.STENCIL_OP_PASS_Z_KEEP,\r\n _native.Engine.STENCIL_TEST_ALWAYS,\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if stencil buffer is enabled\r\n * @returns the current stencil buffer state\r\n */\r\n public override getStencilBuffer(): boolean {\r\n return this._stencilTest;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when stencil passes\r\n * @returns a number defining stencil operation to use when stencil passes\r\n */\r\n public override getStencilOperationPass(): number {\r\n return this._stencilOpStencilDepthPass;\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when stencil passes\r\n * @param operation defines the stencil operation to use when stencil passes\r\n */\r\n public override setStencilOperationPass(operation: number): void {\r\n this._stencilOpStencilDepthPass = operation;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the current stencil mask\r\n * @param mask defines the new stencil mask to use\r\n */\r\n public override setStencilMask(mask: number): void {\r\n this._stencilMask = mask;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the current stencil function\r\n * @param stencilFunc defines the new stencil function to use\r\n */\r\n public override setStencilFunction(stencilFunc: number) {\r\n this._stencilFunc = stencilFunc;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the current stencil reference\r\n * @param reference defines the new stencil reference to use\r\n */\r\n public override setStencilFunctionReference(reference: number) {\r\n this._stencilFuncRef = reference;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the current stencil mask\r\n * @param mask defines the new stencil mask to use\r\n */\r\n public override setStencilFunctionMask(mask: number) {\r\n this._stencilFuncMask = mask;\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when stencil fails\r\n * @param operation defines the stencil operation to use when stencil fails\r\n */\r\n public override setStencilOperationFail(operation: number): void {\r\n this._stencilOpStencilFail = operation;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when depth fails\r\n * @param operation defines the stencil operation to use when depth fails\r\n */\r\n public override setStencilOperationDepthFail(operation: number): void {\r\n this._stencilOpDepthFail = operation;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Gets the current stencil mask\r\n * @returns a number defining the new stencil mask to use\r\n */\r\n public override getStencilMask(): number {\r\n return this._stencilMask;\r\n }\r\n\r\n /**\r\n * Gets the current stencil function\r\n * @returns a number defining the stencil function to use\r\n */\r\n public override getStencilFunction(): number {\r\n return this._stencilFunc;\r\n }\r\n\r\n /**\r\n * Gets the current stencil reference value\r\n * @returns a number defining the stencil reference value to use\r\n */\r\n public override getStencilFunctionReference(): number {\r\n return this._stencilFuncRef;\r\n }\r\n\r\n /**\r\n * Gets the current stencil mask\r\n * @returns a number defining the stencil mask to use\r\n */\r\n public override getStencilFunctionMask(): number {\r\n return this._stencilFuncMask;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when stencil fails\r\n * @returns a number defining stencil operation to use when stencil fails\r\n */\r\n public override getStencilOperationFail(): number {\r\n return this._stencilOpStencilFail;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when depth fails\r\n * @returns a number defining stencil operation to use when depth fails\r\n */\r\n public override getStencilOperationDepthFail(): number {\r\n return this._stencilOpDepthFail;\r\n }\r\n\r\n /**\r\n * Sets alpha constants used by some alpha blending modes\r\n * @param r defines the red component\r\n * @param g defines the green component\r\n * @param b defines the blue component\r\n * @param a defines the alpha component\r\n */\r\n public override setAlphaConstants(r: number, g: number, b: number, a: number) {\r\n throw new Error(\"Setting alpha blend constant color not yet implemented.\");\r\n }\r\n\r\n /**\r\n * Sets the current alpha mode\r\n * @param mode defines the mode to use (one of the BABYLON.Constants.ALPHA_XXX)\r\n * @param noDepthWriteChange defines if depth writing state should remains unchanged (false by default)\r\n * @param targetIndex defines the index of the target to set the alpha mode for (default is 0)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering\r\n */\r\n public override setAlphaMode(mode: number, noDepthWriteChange: boolean = false, targetIndex = 0): void {\r\n if (this._alphaMode[targetIndex] === mode) {\r\n return;\r\n }\r\n\r\n const nativeMode = getNativeAlphaMode(mode);\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETBLENDMODE);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(nativeMode);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n\r\n if (!noDepthWriteChange) {\r\n this.setDepthWrite(mode === Constants.ALPHA_DISABLE);\r\n }\r\n\r\n this._alphaMode[targetIndex] = mode;\r\n }\r\n\r\n public override setInt(uniform: WebGLUniformLocation, int: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETINT);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsInt32(int);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setIntArray(uniform: WebGLUniformLocation, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETINTARRAY);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsInt32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setIntArray2(uniform: WebGLUniformLocation, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETINTARRAY2);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsInt32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setIntArray3(uniform: WebGLUniformLocation, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETINTARRAY3);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsInt32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setIntArray4(uniform: WebGLUniformLocation, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETINTARRAY4);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsInt32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public setFloatArray(uniform: WebGLUniformLocation, array: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOATARRAY);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public setFloatArray2(uniform: WebGLUniformLocation, array: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOATARRAY2);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public setFloatArray3(uniform: WebGLUniformLocation, array: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOATARRAY3);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public setFloatArray4(uniform: WebGLUniformLocation, array: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOATARRAY4);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setArray(uniform: WebGLUniformLocation, array: number[]): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n return this.setFloatArray(uniform, new Float32Array(array));\r\n }\r\n\r\n public override setArray2(uniform: WebGLUniformLocation, array: number[]): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n return this.setFloatArray2(uniform, new Float32Array(array));\r\n }\r\n\r\n public override setArray3(uniform: WebGLUniformLocation, array: number[]): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n return this.setFloatArray3(uniform, new Float32Array(array));\r\n }\r\n\r\n public override setArray4(uniform: WebGLUniformLocation, array: number[]): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n return this.setFloatArray4(uniform, new Float32Array(array));\r\n }\r\n\r\n public override setMatrices(uniform: WebGLUniformLocation, matrices: DeepImmutable<FloatArray>): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETMATRICES);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(matrices);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n\r\n return true;\r\n }\r\n\r\n public override setMatrix3x3(uniform: WebGLUniformLocation, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETMATRIX3X3);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(matrix);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setMatrix2x2(uniform: WebGLUniformLocation, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETMATRIX2X2);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(matrix);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setFloat(uniform: WebGLUniformLocation, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOAT);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(value);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setFloat2(uniform: WebGLUniformLocation, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOAT2);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(x);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(y);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setFloat3(uniform: WebGLUniformLocation, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOAT3);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(x);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(y);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(z);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setFloat4(uniform: WebGLUniformLocation, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOAT4);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(x);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(y);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(z);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(w);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public setColor3(uniform: WebGLUniformLocation, color3: IColor3Like): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this.setFloat3(uniform, color3.r, color3.g, color3.b);\r\n return true;\r\n }\r\n\r\n public setColor4(uniform: WebGLUniformLocation, color3: IColor3Like, alpha: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this.setFloat4(uniform, color3.r, color3.g, color3.b, alpha);\r\n return true;\r\n }\r\n\r\n public override wipeCaches(bruteForce?: boolean): void {\r\n if (this.preventCacheWipeBetweenFrames) {\r\n return;\r\n }\r\n this.resetTextureCache();\r\n this._currentEffect = null;\r\n\r\n if (bruteForce) {\r\n this._currentProgram = null;\r\n\r\n this._stencilStateComposer.reset();\r\n this._depthCullingState.reset();\r\n this._alphaState.reset();\r\n }\r\n\r\n this._cachedVertexBuffers = null;\r\n this._cachedIndexBuffer = null;\r\n this._cachedEffectForVertexBuffers = null;\r\n }\r\n\r\n protected override _createTexture(): WebGLTexture {\r\n return this._engine.createTexture();\r\n }\r\n\r\n protected override _deleteTexture(texture: Nullable<WebGLHardwareTexture>): void {\r\n if (texture) {\r\n this._engine.deleteTexture(texture.underlyingResource as NativeTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Update the content of a dynamic texture\r\n * @param texture defines the texture to update\r\n * @param canvas defines the canvas containing the source\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param premulAlpha defines if alpha is stored as premultiplied\r\n * @param format defines the format of the data\r\n */\r\n public override updateDynamicTexture(texture: Nullable<InternalTexture>, canvas: any, invertY: boolean, premulAlpha: boolean = false, format?: number): void {\r\n if (!!texture && !!texture._hardwareTexture) {\r\n const destination = texture._hardwareTexture.underlyingResource;\r\n const context = canvas.getContext();\r\n // flush need to happen before getCanvasTexture: flush will create the render target synchronously (if it's not been created before)\r\n context.flush();\r\n const source = canvas.getCanvasTexture();\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_COPYTEXTURE);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(source as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(destination as NativeData);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n texture.isReady = true;\r\n }\r\n }\r\n\r\n public override createDynamicTexture(width: number, height: number, generateMipMaps: boolean, samplingMode: number): InternalTexture {\r\n // Canvas dimensions are integral in browsers. Coerce before allocating so the native dimensions and byte length agree.\r\n // Keep at least 1x1 because many bgfx methods assume a non-zero texture size.\r\n width = Math.max(Math.floor(width), 1);\r\n height = Math.max(Math.floor(height), 1);\r\n return this.createRawTexture(new Uint8Array(width * height * 4), width, height, Constants.TEXTUREFORMAT_RGBA, false, false, samplingMode);\r\n }\r\n\r\n public override createVideoElement(constraints: MediaTrackConstraints): any {\r\n // create native object depending on stream. Only NativeCamera is supported for now.\r\n if (this._camera) {\r\n return this._camera.createVideo(constraints);\r\n }\r\n return null;\r\n }\r\n\r\n public override updateVideoTexture(texture: Nullable<InternalTexture>, video: HTMLVideoElement, invertY: boolean): void {\r\n if (texture && texture._hardwareTexture && this._camera) {\r\n const webGLTexture = texture._hardwareTexture.underlyingResource;\r\n this._camera.updateVideoTexture(webGLTexture, video, invertY);\r\n }\r\n }\r\n\r\n public override createRawTexture(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable<string> = null,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n creationFlags: number = 0,\r\n useSRGBBuffer: boolean = false\r\n ): InternalTexture {\r\n const texture = new InternalTexture(this, InternalTextureSource.Raw);\r\n\r\n texture.format = format;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.invertY = invertY;\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = texture.baseWidth;\r\n texture.height = texture.baseHeight;\r\n texture._compression = compression;\r\n texture.type = type;\r\n texture._useSRGBBuffer = this._getUseSRGBBuffer(useSRGBBuffer, !generateMipMaps);\r\n\r\n this.updateRawTexture(texture, data, format, invertY, compression, type, texture._useSRGBBuffer);\r\n\r\n if (texture._hardwareTexture) {\r\n const webGLTexture = texture._hardwareTexture.underlyingResource;\r\n const filter = getNativeSamplingMode(samplingMode);\r\n this._setTextureSampling(webGLTexture, filter);\r\n }\r\n\r\n this._internalTexturesCache.push(texture);\r\n return texture;\r\n }\r\n\r\n public override createRawTexture2DArray(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable<string> = null,\r\n textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n ): InternalTexture {\r\n const texture = new InternalTexture(this, InternalTextureSource.Raw2DArray);\r\n\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.baseDepth = depth;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.depth = depth;\r\n texture.format = format;\r\n texture.type = textureType;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.is2DArray = true;\r\n\r\n if (texture._hardwareTexture) {\r\n const nativeTexture = texture._hardwareTexture.underlyingResource;\r\n this._engine.loadRawTexture2DArray(nativeTexture, data, width, height, depth, getNativeTextureFormat(format, textureType), generateMipMaps, invertY);\r\n\r\n const filter = getNativeSamplingMode(samplingMode);\r\n this._setTextureSampling(nativeTexture, filter);\r\n }\r\n\r\n texture.isReady = true;\r\n\r\n this._internalTexturesCache.push(texture);\r\n return texture;\r\n }\r\n\r\n public override updateRawTexture(\r\n texture: Nullable<InternalTexture>,\r\n bufferView: Nullable<ArrayBufferView>,\r\n format: number,\r\n invertY: boolean,\r\n compression: Nullable<string> = null,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n useSRGBBuffer: boolean = false\r\n ): void {\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n if (bufferView && texture._hardwareTexture) {\r\n const underlyingResource = texture._hardwareTexture.underlyingResource;\r\n this._engine.loadRawTexture(\r\n underlyingResource,\r\n bufferView,\r\n texture.width,\r\n texture.height,\r\n getNativeTextureFormat(format, type),\r\n texture.generateMipMaps,\r\n texture.invertY\r\n );\r\n }\r\n\r\n texture.isReady = true;\r\n }\r\n\r\n // TODO: Refactor to share more logic with babylon.engine.ts version.\r\n /**\r\n * Usually called from Texture.ts.\r\n * Passed information to create a NativeTexture\r\n * @param url defines a value which contains one of the following:\r\n * * A conventional http URL, e.g. 'http://...' or 'file://...'\r\n * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'\r\n * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'\r\n * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file\r\n * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx)\r\n * @param scene needed for loading to the correct scene\r\n * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE)\r\n * @param onLoad optional callback to be called upon successful completion\r\n * @param onError optional callback to be called upon failure\r\n * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob\r\n * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities\r\n * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @param mimeType defines an optional mime type\r\n * @param loaderOptions options to be passed to the loader\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\r\n * @returns a InternalTexture for assignment back into BABYLON.Texture\r\n */\r\n public override createTexture(\r\n url: Nullable<string>,\r\n noMipmap: boolean,\r\n invertY: boolean,\r\n scene: Nullable<ISceneLike>,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<(texture: InternalTexture) => void> = null,\r\n onError: Nullable<(message: string, exception: any) => void> = null,\r\n buffer: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap> = null,\r\n fallback: Nullable<InternalTexture> = null,\r\n format: Nullable<number> = null,\r\n forcedExtension: Nullable<string> = null,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n creationFlags?: number,\r\n useSRGBBuffer = false\r\n ): InternalTexture {\r\n url = url || \"\";\r\n const fromData = url.substring(0, 5) === \"data:\";\r\n //const fromBlob = url.substring(0, 5) === \"blob:\";\r\n const isBase64 = fromData && url.indexOf(\";base64,\") !== -1;\r\n\r\n const texture = fallback ? fallback : new InternalTexture(this, InternalTextureSource.Url);\r\n\r\n const originalUrl = url;\r\n if (this._transformTextureUrl && !isBase64 && !fallback && !buffer) {\r\n url = this._transformTextureUrl(url);\r\n }\r\n\r\n // establish the file extension, if possible\r\n const lastDot = url.lastIndexOf(\".\");\r\n const extension = forcedExtension ? forcedExtension : lastDot > -1 ? url.substring(lastDot).toLowerCase() : \"\";\r\n\r\n // some formats are already supported by bimg, no need to try to load them with JS\r\n // leaving TextureLoader extension check for future use\r\n let loaderPromise = null;\r\n if (extension.endsWith(\".basis\") || extension.endsWith(\".ktx\") || extension.endsWith(\".ktx2\") || mimeType === \"image/ktx\" || mimeType === \"image/ktx2\") {\r\n loaderPromise = AbstractEngine.GetCompatibleTextureLoader(extension);\r\n }\r\n\r\n if (scene) {\r\n scene.addPendingData(texture);\r\n }\r\n texture.url = url;\r\n texture.generateMipMaps = !noMipmap;\r\n texture.samplingMode = samplingMode;\r\n texture.invertY = invertY;\r\n texture._useSRGBBuffer = this._getUseSRGBBuffer(useSRGBBuffer, noMipmap);\r\n\r\n if (!this.doNotHandleContextLost) {\r\n // Keep a link to the buffer only if we plan to handle context lost\r\n texture._buffer = buffer;\r\n }\r\n\r\n let onLoadObserver: Nullable<Observer<InternalTexture>> = null;\r\n if (onLoad && !fallback) {\r\n onLoadObserver = texture.onLoadedObservable.add(onLoad);\r\n }\r\n\r\n if (!fallback) {\r\n this._internalTexturesCache.push(texture);\r\n }\r\n\r\n const onInternalError = (message?: string, exception?: any) => {\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n if (url === originalUrl) {\r\n if (onLoadObserver) {\r\n texture.onLoadedObservable.remove(onLoadObserver);\r\n }\r\n\r\n if (EngineStore.UseFallbackTexture) {\r\n this.createTexture(EngineStore.FallbackTexture, noMipmap, texture.invertY, scene, samplingMode, null, onError, buffer, texture);\r\n }\r\n\r\n if (onError) {\r\n onError((message || \"Unknown error\") + (EngineStore.UseFallbackTexture ? \" - Fallback texture was used\" : \"\"), exception);\r\n }\r\n } else {\r\n // fall back to the original url if the transformed url fails to load\r\n Logger.Warn(`Failed to load ${url}, falling back to ${originalUrl}`);\r\n this.createTexture(originalUrl, noMipmap, texture.invertY, scene, samplingMode, onLoad, onError, buffer, texture, format, forcedExtension, mimeType, loaderOptions);\r\n }\r\n };\r\n\r\n // processing for non-image formats\r\n if (loaderPromise) {\r\n throw new Error(\"Loading textures from IInternalTextureLoader not yet implemented.\");\r\n } else {\r\n const onload = (data: ArrayBufferView) => {\r\n if (!texture._hardwareTexture) {\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n return;\r\n }\r\n\r\n const underlyingResource = texture._hardwareTexture.underlyingResource;\r\n\r\n this._engine.loadTexture(\r\n underlyingResource,\r\n data,\r\n !noMipmap,\r\n invertY,\r\n texture._useSRGBBuffer,\r\n () => {\r\n texture.baseWidth = this._engine.getTextureWidth(underlyingResource);\r\n texture.baseHeight = this._engine.getTextureHeight(underlyingResource);\r\n texture.width = texture.baseWidth;\r\n texture.height = texture.baseHeight;\r\n texture.isReady = true;\r\n\r\n const filter = getNativeSamplingMode(samplingMode);\r\n this._setTextureSampling(underlyingResource, filter);\r\n\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n texture.onLoadedObservable.notifyObservers(texture);\r\n texture.onLoadedObservable.clear();\r\n },\r\n () => {\r\n throw new Error(\"Could not load a native texture.\");\r\n }\r\n );\r\n };\r\n\r\n if (fromData && buffer) {\r\n if (buffer instanceof ArrayBuffer) {\r\n onload(new Uint8Array(buffer));\r\n } else if (ArrayBuffer.isView(buffer)) {\r\n onload(buffer);\r\n } else if (typeof buffer === \"string\") {\r\n onload(new Uint8Array(DecodeBase64UrlToBinary(buffer)));\r\n } else {\r\n throw new Error(\"Unsupported buffer type\");\r\n }\r\n } else {\r\n if (isBase64) {\r\n onload(new Uint8Array(DecodeBase64UrlToBinary(url)));\r\n } else {\r\n this._loadFile(\r\n url,\r\n (data) => onload(new Uint8Array(data as ArrayBuffer)),\r\n undefined,\r\n undefined,\r\n true,\r\n (request?: IWebRequest, exception?: any) => {\r\n onInternalError(\"Unable to load \" + (request ? request.responseURL : url, exception));\r\n }\r\n );\r\n }\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Wraps an external native texture in a Babylon texture.\r\n * @param texture defines the external texture\r\n * @param hasMipMaps defines whether the external texture has mip maps\r\n * @param samplingMode defines the sampling mode for the external texture (default: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE)\r\n * @returns the babylon internal texture\r\n */\r\n public wrapNativeTexture(texture: NativeTexture, hasMipMaps: boolean = false, samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE): InternalTexture {\r\n const hardwareTexture = new NativeHardwareTexture(texture, this._engine);\r\n const internalTexture = new InternalTexture(this, InternalTextureSource.External, true);\r\n internalTexture._hardwareTexture = hardwareTexture;\r\n internalTexture.baseWidth = this._engine.getTextureWidth(texture);\r\n internalTexture.baseHeight = this._engine.getTextureHeight(texture);\r\n internalTexture.width = internalTexture.baseWidth;\r\n internalTexture.height = internalTexture.baseHeight;\r\n if (this._engine.getTextureLayerCount) {\r\n const layerCount = this._engine.getTextureLayerCount(texture);\r\n if (layerCount > 1) {\r\n internalTexture.is2DArray = true;\r\n internalTexture.baseDepth = internalTexture.depth = layerCount;\r\n }\r\n }\r\n internalTexture.isReady = true;\r\n internalTexture.useMipMaps = hasMipMaps;\r\n this.updateTextureSamplingMode(samplingMode, internalTexture);\r\n return internalTexture;\r\n }\r\n\r\n /**\r\n * Replaces the underlying native texture handle of a texture previously created via {@link wrapNativeTexture},\r\n * preserving the InternalTexture identity.\r\n *\r\n * Intended for the device-loss / device-restored flow (a DisableRendering / EnableRendering cycle from the host\r\n * application): when the host recreates its external resource on the new graphics device, it calls this method to\r\n * repoint Babylon's wrapper at the new handle without losing references held by materials, render-target wrappers,\r\n * particle systems, etc.\r\n *\r\n * The new handle must match the wrapped texture's recorded dimensions. To change dimensions, dispose the wrapped\r\n * texture and call {@link wrapNativeTexture} again. Sampling mode and mip-map flag are properties of the logical\r\n * wrapped texture and are re-applied to the new resource. Any render-target wrapper holding this texture as its\r\n * color attachment has its framebuffer rebuilt with the new handle.\r\n *\r\n * Throws if the target was not produced by {@link wrapNativeTexture}, if the new handle's dimensions don't match,\r\n * if the wrapped texture is part of a multi render-target, or if the wrapper has a depth/stencil texture (these\r\n * are not supported in this version; dispose and re-wrap).\r\n * @param internalTexture defines the wrapped InternalTexture to repoint\r\n * @param texture defines the new native texture handle to wrap\r\n */\r\n public updateWrappedNativeTexture(internalTexture: InternalTexture, texture: NativeTexture): void {\r\n if (internalTexture.source !== InternalTextureSource.External) {\r\n throw new Error(\"updateWrappedNativeTexture: target InternalTexture was not produced by wrapNativeTexture.\");\r\n }\r\n\r\n const newWidth = this._engine.getTextureWidth(texture);\r\n const newHeight = this._engine.getTextureHeight(texture);\r\n if (newWidth !== internalTexture.baseWidth || newHeight !== internalTexture.baseHeight) {\r\n throw new Error(\r\n `updateWrappedNativeTexture: new handle dimensions (${newWidth}x${newHeight}) must match the wrapped texture's dimensions (${internalTexture.baseWidth}x${internalTexture.baseHeight}).`\r\n );\r\n }\r\n if (this._engine.getTextureLayerCount) {\r\n const newLayerCount = this._engine.getTextureLayerCount(texture);\r\n const oldLayerCount = internalTexture.is2DArray ? internalTexture.depth : 1;\r\n if (newLayerCount !== oldLayerCount) {\r\n throw new Error(`updateWrappedNativeTexture: new handle layer count (${newLayerCount}) must match the wrapped texture's layer count (${oldLayerCount}).`);\r\n }\r\n }\r\n\r\n // Pre-validate before mutating any state so a thrown precondition leaves the InternalTexture untouched.\r\n // Note: rtWrapper.texture only returns _textures[0]; walk every attachment to catch the multi-RT case where\r\n // the wrapped texture is at index > 0.\r\n for (const rtWrapper of this._renderTargetWrapperCache) {\r\n if (!rtWrapper.textures?.includes(internalTexture)) {\r\n continue;\r\n }\r\n if (rtWrapper.isMulti) {\r\n throw new Error(\"updateWrappedNativeTexture: wrapped texture is part of a multi render-target; not supported. Dispose and re-wrap.\");\r\n }\r\n if (rtWrapper._depthStencilTexture) {\r\n // After a DisableRendering / EnableRendering cycle the bgfx framebuffer + the depth/stencil texture's\r\n // bgfx handle are both stale. Rebuilding the depth/stencil texture from the wrapper's stored settings\r\n // is feasible but non-trivial; v1 rejects and asks the caller to dispose + re-wrap.\r\n throw new Error(\"updateWrappedNativeTexture: wrapped texture's render-target wrapper has a depth/stencil texture; not supported. Dispose and re-wrap.\");\r\n }\r\n }\r\n\r\n internalTexture._hardwareTexture = new NativeHardwareTexture(texture, this._engine);\r\n internalTexture.isReady = true;\r\n this.updateTextureSamplingMode(internalTexture.samplingMode, internalTexture);\r\n\r\n // Rebuild the framebuffer of any render-target wrapper holding this wrapped texture as its color attachment.\r\n // After a DisableRendering / EnableRendering cycle the bgfx framebuffer handle is stale; the consumer-supplied\r\n // new texture is the moment we have a fresh handle to rebuild against.\r\n for (const rtWrapper of this._renderTargetWrapperCache) {\r\n if (rtWrapper.texture !== internalTexture) {\r\n continue;\r\n }\r\n const nativeRTWrapper = rtWrapper as NativeRenderTargetWrapper;\r\n // NativeRenderTargetWrapper._framebuffer setter releases the old framebuffer before assigning,\r\n // so no manual _releaseFramebufferObjects call is needed (and would double-delete the handle).\r\n nativeRTWrapper._framebuffer = this._engine.createFrameBuffer(\r\n texture,\r\n rtWrapper.width,\r\n rtWrapper.height,\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper._generateDepthBuffer,\r\n rtWrapper.samples ?? 1\r\n );\r\n }\r\n }\r\n\r\n public override _createDepthStencilTexture(size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture {\r\n // TODO: handle other options?\r\n const generateStencil = options.generateStencil || false;\r\n const samples = options.samples || 1;\r\n\r\n const nativeRTWrapper = rtWrapper as NativeRenderTargetWrapper;\r\n const texture = new InternalTexture(this, InternalTextureSource.DepthStencil);\r\n\r\n const width = (<{ width: number; height: number; layers?: number }>size).width ?? <number>size;\r\n const height = (<{ width: number; height: number; layers?: number }>size).height ?? <number>size;\r\n const layers = (<{ width: number; height: number; depth?: number; layers?: number }>size).layers || 0;\r\n const depth = (<{ width: number; height: number; depth?: number; layers?: number }>size).depth || 0;\r\n\r\n // Populate the standard depth/stencil texture metadata, mirroring ThinEngine._setupDepthStencilTexture.\r\n // In particular `samples` must be set so consumers such as the FrameGraph texture manager report the\r\n // correct sample count; leaving it at the InternalTexture default (0) breaks FrameGraph MSAA\r\n // depth/output sample-count validation. `is2DArray`/`depth` matter for the texture-array depth targets\r\n // used by cascaded shadow maps.\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.is2DArray = layers > 0;\r\n texture.depth = layers || depth;\r\n texture.isReady = true;\r\n texture.samples = samples;\r\n texture.generateMipMaps = false;\r\n texture.samplingMode = options.bilinearFiltering ? Constants.TEXTURE_BILINEAR_SAMPLINGMODE : Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n texture._comparisonFunction = options.comparisonFunction ?? 0;\r\n\r\n const framebuffer = this._engine.createFrameBuffer(texture._hardwareTexture!.underlyingResource, width, height, generateStencil, true, samples);\r\n nativeRTWrapper._framebufferDepthStencil = framebuffer;\r\n return texture;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseFramebufferObjects(framebuffer: Nullable<NativeFramebuffer>): void {\r\n if (framebuffer) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DELETEFRAMEBUFFER);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(framebuffer);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n }\r\n\r\n /**\r\n * @internal Engine abstraction for loading and creating an image bitmap from a given source string.\r\n * @param imageSource source to load the image from.\r\n * @param _options An object that sets options for the image's extraction.\r\n * @returns ImageBitmap\r\n */\r\n public override async _createImageBitmapFromSource(imageSource: string, _options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n const promise = new Promise<ImageBitmap>((resolve, reject) => {\r\n const image = this.createCanvasImage();\r\n image.onload = () => {\r\n try {\r\n const imageBitmap = this._engine.createImageBitmap(image);\r\n resolve(imageBitmap);\r\n } catch (error) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(`Error loading image ${image.src} with exception: ${error}`);\r\n }\r\n };\r\n image.onerror = (error) => {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(`Error loading image ${image.src} with exception: ${error}`);\r\n };\r\n\r\n image.src = imageSource;\r\n });\r\n\r\n return await promise;\r\n }\r\n\r\n /**\r\n * Engine abstraction for createImageBitmap\r\n * @param image source for image\r\n * @param options An object that sets options for the image's extraction.\r\n * @returns ImageBitmap\r\n */\r\n public override async createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n // Back-compat: Because of the previous Blob hack, this could be an array of BlobParts.\r\n if (Array.isArray(image)) {\r\n const arr = <Array<ArrayBuffer>>image;\r\n if (arr.length) {\r\n return this._engine.createImageBitmap(arr[0]);\r\n }\r\n }\r\n\r\n if (image instanceof Blob) {\r\n const data = await image.arrayBuffer();\r\n return this._engine.createImageBitmap(data);\r\n }\r\n\r\n throw new Error(\"Unsupported data for createImageBitmap.\");\r\n }\r\n\r\n /**\r\n * Resize an image and returns the image data as an uint8array\r\n * @param image image to resize\r\n * @param bufferWidth destination buffer width\r\n * @param bufferHeight destination buffer height\r\n * @returns an uint8array containing RGBA values of bufferWidth * bufferHeight size\r\n */\r\n public override resizeImageBitmap(image: ImageBitmap, bufferWidth: number, bufferHeight: number): Uint8Array {\r\n return this._engine.resizeImageBitmap(image, bufferWidth, bufferHeight);\r\n }\r\n\r\n /** @internal */\r\n public override _createHardwareTexture(): IHardwareTextureWrapper {\r\n return new NativeHardwareTexture(this._createTexture() as NativeTexture, this._engine);\r\n }\r\n\r\n /** @internal */\r\n public override _createHardwareRenderTargetWrapper(isMulti: boolean, isCube: boolean, size: TextureSize): RenderTargetWrapper {\r\n const rtWrapper = new NativeRenderTargetWrapper(isMulti, isCube, size, this);\r\n this._renderTargetWrapperCache.push(rtWrapper);\r\n return rtWrapper;\r\n }\r\n\r\n /** @internal */\r\n public override _createInternalTexture(\r\n size: TextureSize,\r\n options: boolean | InternalTextureCreationOptions,\r\n _delayGPUTextureCreation = true,\r\n source = InternalTextureSource.Unknown\r\n ): InternalTexture {\r\n let generateMipMaps: boolean;\r\n let type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n let samplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n let format = Constants.TEXTUREFORMAT_RGBA;\r\n let useSRGBBuffer = false;\r\n let samples = 1;\r\n let label: string | undefined;\r\n if (options !== undefined && typeof options === \"object\") {\r\n generateMipMaps = !!options.generateMipMaps;\r\n type = options.type === undefined ? Constants.TEXTURETYPE_UNSIGNED_BYTE : options.type;\r\n samplingMode = options.samplingMode === undefined ? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE : options.samplingMode;\r\n format = options.format === undefined ? Constants.TEXTUREFORMAT_RGBA : options.format;\r\n useSRGBBuffer = options.useSRGBBuffer === undefined ? false : options.useSRGBBuffer;\r\n samples = options.samples ?? 1;\r\n label = options.label;\r\n } else {\r\n generateMipMaps = !!options;\r\n }\r\n\r\n useSRGBBuffer = this._getUseSRGBBuffer(useSRGBBuffer, !generateMipMaps);\r\n\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n // if floating point linear (gl.FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n Logger.Warn(\"Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE\");\r\n }\r\n\r\n const texture = new InternalTexture(this, source);\r\n const width = (<{ width: number; height: number; layers?: number }>size).width ?? <number>size;\r\n const height = (<{ width: number; height: number; layers?: number }>size).height ?? <number>size;\r\n\r\n const layers = (<{ width: number; height: number; layers?: number }>size).layers || 0;\r\n if (layers !== 0) {\r\n throw new Error(\"Texture layers are not supported in Babylon Native\");\r\n }\r\n\r\n const nativeTexture = texture._hardwareTexture!.underlyingResource;\r\n const nativeTextureFormat = getNativeTextureFormat(format, type);\r\n // TODO(bgfx-msaa-mips): stopgap workaround for a bgfx bug -- D3D11/D3D12/Vulkan backends share one\r\n // texture descriptor between the MSAA render target and the non-MSAA resolve target, so requesting\r\n // both mips > 1 and samples > 1 makes the API (D3D11 E_INVALIDARG, Vulkan VUID-02257, ...) reject the\r\n // MSAA texture creation. Force hasMips = false here to keep the combo from reaching bgfx. The fix\r\n // belongs in bgfx (separate descs per target, like OpenGL/WebGL do with a non-mipped renderbuffer);\r\n // this guard should be removed once a fixed bgfx ships in a stable BabylonNative npm release. Tracked\r\n // in BabylonNative#1714. Cost: MSAA RTs on Native lose post-resolve auto-mipgen and diverge from\r\n // WebGL/WebGPU semantics -- texture.generateMipMaps stays true on the InternalTexture but the\r\n // underlying bgfx resource has 1 mip.\r\n const hasMips = samples > 1 ? false : generateMipMaps;\r\n // REVIEW: We are always setting the renderTarget flag as we don't know whether the texture will be used as a render target.\r\n this._engine.initializeTexture(nativeTexture, width, height, hasMips, nativeTextureFormat, true, useSRGBBuffer, samples);\r\n this._setTextureSampling(nativeTexture, getNativeSamplingMode(samplingMode));\r\n\r\n texture._useSRGBBuffer = useSRGBBuffer;\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.depth = layers;\r\n texture.isReady = true;\r\n texture.samples = samples;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture.format = format;\r\n texture.label = label;\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n return texture;\r\n }\r\n\r\n public override createRenderTargetTexture(\r\n size: number | { width: number; height: number; depth: number },\r\n options: boolean | RenderTargetCreationOptions\r\n ): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(false, false, size) as NativeRenderTargetWrapper;\r\n\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let noColorAttachment = false;\r\n let colorAttachment: InternalTexture | undefined = undefined;\r\n let samples = 1;\r\n if (options !== undefined && typeof options === \"object\") {\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = !!options.generateStencilBuffer;\r\n noColorAttachment = !!options.noColorAttachment;\r\n colorAttachment = options.colorAttachment;\r\n samples = options.samples ?? 1;\r\n }\r\n\r\n const texture = colorAttachment || (noColorAttachment ? null : this._createInternalTexture(size, options, true, InternalTextureSource.RenderTarget));\r\n const width = (<{ width: number; height: number; layers?: number }>size).width ?? <number>size;\r\n const height = (<{ width: number; height: number; layers?: number }>size).height ?? <number>size;\r\n\r\n const framebuffer = this._engine.createFrameBuffer(\r\n texture ? texture._hardwareTexture!.underlyingResource : null,\r\n width,\r\n height,\r\n generateStencilBuffer,\r\n generateDepthBuffer,\r\n samples\r\n );\r\n\r\n rtWrapper._framebuffer = framebuffer;\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._samples = samples;\r\n\r\n rtWrapper.setTextures(texture);\r\n\r\n return rtWrapper;\r\n }\r\n\r\n public override createRenderTargetCubeTexture(size: number, options?: RenderTargetCreationOptions): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(false, true, size) as NativeRenderTargetWrapper;\r\n\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let generateMipMaps = false;\r\n let type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n let samplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n let format = Constants.TEXTUREFORMAT_RGBA;\r\n let samples = 1;\r\n let label: string | undefined;\r\n if (options !== undefined && typeof options === \"object\") {\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = !!options.generateStencilBuffer;\r\n generateMipMaps = !!options.generateMipMaps;\r\n type = options.type ?? Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n samplingMode = options.samplingMode ?? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n format = options.format ?? Constants.TEXTUREFORMAT_RGBA;\r\n samples = options.samples ?? 1;\r\n label = options.label;\r\n }\r\n\r\n // Match _createInternalTexture: float/half-float RTTs that the platform can't linearly filter fall\r\n // back to NEAREST so the cube RTT never carries an unsupported sampling mode.\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n Logger.Warn(\"Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE\");\r\n }\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.RenderTarget);\r\n texture.isCube = true;\r\n texture.baseWidth = size;\r\n texture.baseHeight = size;\r\n texture.width = size;\r\n texture.height = size;\r\n texture.isReady = true;\r\n texture.samples = samples;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture.format = format;\r\n texture.label = label;\r\n\r\n const nativeTexture = texture._hardwareTexture!.underlyingResource;\r\n const nativeTextureFormat = getNativeTextureFormat(format, type);\r\n // See the createRenderTargetTexture MSAA/mips note: avoid the mips + samples combo on bgfx.\r\n const hasMips = samples > 1 ? false : generateMipMaps;\r\n this._engine.initializeTexture(nativeTexture, size, size, hasMips, nativeTextureFormat, /*renderTarget*/ true, /*srgb*/ false, samples, /*isCube*/ true);\r\n this._setTextureSampling(nativeTexture, getNativeSamplingMode(samplingMode));\r\n\r\n // The native engine cannot render to all six faces through one framebuffer, so create one\r\n // framebuffer per face (the C++ side binds the matching cube layer); bindFramebuffer(faceIndex)\r\n // then selects the right one.\r\n const framebuffers: NativeFramebuffer[] = [];\r\n for (let face = 0; face < 6; face++) {\r\n framebuffers.push(this._engine.createFrameBuffer(nativeTexture, size, size, generateStencilBuffer, generateDepthBuffer, samples, face));\r\n }\r\n\r\n rtWrapper._framebuffers = framebuffers;\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._samples = samples;\r\n\r\n rtWrapper.setTextures(texture);\r\n\r\n // Track the hand-built cube RTT texture the same way _createInternalTexture tracks 2D textures so it\r\n // participates in engine-wide lifecycle management (dispose iteration, context rebuild, stats).\r\n this._internalTexturesCache.push(texture);\r\n\r\n return rtWrapper;\r\n }\r\n\r\n public override createMultipleRenderTarget(size: TextureSize, options: IMultiRenderTargetOptions, _initializeBuffers = true): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(true, false, size) as NativeRenderTargetWrapper;\r\n\r\n let generateMipMaps = false;\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let generateDepthTexture = false;\r\n let textureCount = 1;\r\n let samples = 1;\r\n let types: number[] = [];\r\n let samplingModes: number[] = [];\r\n let formats: number[] = [];\r\n let targets: number[] = [];\r\n let faceIndex: number[] = [];\r\n let layerIndex: number[] = [];\r\n let labels: string[] = [];\r\n let dontCreateTextures = false;\r\n\r\n if (options !== undefined) {\r\n generateMipMaps = options.generateMipMaps ?? false;\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = options.generateStencilBuffer ?? false;\r\n generateDepthTexture = options.generateDepthTexture ?? false;\r\n textureCount = options.textureCount ?? 1;\r\n samples = options.samples ?? 1;\r\n types = options.types || types;\r\n samplingModes = options.samplingModes || samplingModes;\r\n formats = options.formats || formats;\r\n targets = options.targetTypes || targets;\r\n faceIndex = options.faceIndex || faceIndex;\r\n layerIndex = options.layerIndex || layerIndex;\r\n labels = options.labels || labels;\r\n dontCreateTextures = options.dontCreateTextures ?? false;\r\n }\r\n\r\n rtWrapper.label = options?.label ?? \"MultiRenderTargetWrapper\";\r\n\r\n const width = (<{ width: number; height: number }>size).width ?? <number>size;\r\n const height = (<{ width: number; height: number }>size).height ?? <number>size;\r\n\r\n const textures: InternalTexture[] = [];\r\n const attachments: number[] = [];\r\n\r\n for (let i = 0; i < textureCount; i++) {\r\n const samplingMode = samplingModes[i] || Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n let type = types[i] || Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n const format = formats[i] || Constants.TEXTUREFORMAT_RGBA;\r\n const target = targets[i] || Constants.TEXTURE_2D;\r\n\r\n attachments.push(i);\r\n\r\n // target === -1 marks an attachment with no engine-created texture; dontCreateTextures defers them.\r\n if (target === -1 || dontCreateTextures) {\r\n continue;\r\n }\r\n\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n Logger.Warn(\"Float textures are not supported. Multi render target attachment forced to TEXTURETYPE_UNSIGNED_BYTE type\");\r\n }\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.MultiRenderTarget);\r\n const nativeTexture = texture._hardwareTexture!.underlyingResource;\r\n if (target !== Constants.TEXTURE_2D) {\r\n // Native multi render targets currently only attach 2D color textures; cube / 2D-array\r\n // attachments are created as 2D so the attachment still exists and mrt.textures[i] is populated.\r\n Logger.Warn(\"Multi render target attachment target \" + target + \" is not supported on Native; using a 2D texture.\");\r\n }\r\n // bgfx auto-generates the mip chain on resolve; avoid the mips + MSAA combo (see createRenderTargetTexture).\r\n const hasMips = samples > 1 ? false : generateMipMaps;\r\n this._engine.initializeTexture(nativeTexture, width, height, hasMips, getNativeTextureFormat(format, type), /*renderTarget*/ true, /*srgb*/ false, samples);\r\n this._setTextureSampling(nativeTexture, getNativeSamplingMode(samplingMode));\r\n\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.isReady = true;\r\n texture.samples = samples;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture.format = format;\r\n texture.label = labels[i] ?? rtWrapper.label + \"-Texture\" + i;\r\n\r\n textures[i] = texture;\r\n this._internalTexturesCache.push(texture);\r\n }\r\n\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer || generateDepthTexture;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._samples = samples;\r\n rtWrapper._attachments = attachments;\r\n\r\n rtWrapper.setTextures(textures);\r\n rtWrapper.setLayerAndFaceIndices(layerIndex, faceIndex);\r\n\r\n // The native engine creates one framebuffer with all the color attachments (bgfx writes to every\r\n // attachment of the bound framebuffer, so there is no drawBuffers equivalent to issue per draw).\r\n this._createMultiRenderTargetFramebuffer(rtWrapper);\r\n\r\n return rtWrapper;\r\n }\r\n\r\n /**\r\n * Creates (or recreates) the native framebuffer of a multi render target from the color attachment\r\n * textures currently held by the wrapper. bgfx binds a fixed attachment set when a framebuffer is\r\n * created and cannot re-point an individual attachment the way GL's framebufferTexture2D can, so the\r\n * whole framebuffer has to be recreated whenever an attachment is swapped after creation (e.g. the OIT\r\n * depth-peeling renderer replaces every attachment via MultiRenderTarget.setInternalTexture).\r\n * @param rtWrapper The multi render target wrapper to build the framebuffer for.\r\n * @internal\r\n */\r\n public _createMultiRenderTargetFramebuffer(rtWrapper: NativeRenderTargetWrapper): void {\r\n const textures = rtWrapper.textures;\r\n if (!textures) {\r\n return;\r\n }\r\n\r\n const colorHandles: NativeTexture[] = [];\r\n for (const texture of textures) {\r\n const handle = texture?._hardwareTexture?.underlyingResource;\r\n if (handle) {\r\n colorHandles.push(handle);\r\n }\r\n }\r\n\r\n // bgfx framebuffers use a dense, ordered attachment list, so only (re)build once every expected color\r\n // attachment is present. Building from a partial set (e.g. attachments deferred via dontCreateTextures /\r\n // targetTypes[i] === -1, or filled out of order) would compress the attachment indices -- attachment 2\r\n // would become attachment 1, etc. -- and produce a framebuffer that does not match the MRT layout. The\r\n // count match guarantees the collected handles are contiguous and in attachment order.\r\n const expectedCount = rtWrapper._attachments ? rtWrapper._attachments.length : colorHandles.length;\r\n if (colorHandles.length === 0 || colorHandles.length !== expectedCount) {\r\n return;\r\n }\r\n\r\n const width = rtWrapper.width;\r\n const height = rtWrapper.height;\r\n\r\n if (this._engine.createMultiFrameBuffer) {\r\n rtWrapper._framebuffer = this._engine.createMultiFrameBuffer(\r\n colorHandles,\r\n width,\r\n height,\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper._generateDepthBuffer,\r\n rtWrapper._samples\r\n );\r\n } else {\r\n // Older Babylon Native binaries (predating multi render target support) do not expose createMultiFrameBuffer.\r\n // Fall back to a single-attachment framebuffer bound to the first color target so the scene keeps rendering.\r\n // Warn once (limit 1): the framebuffer can be rebuilt many times during attachment setup/swaps.\r\n Logger.Warn(\r\n \"createMultiFrameBuffer is not supported by this version of Babylon Native; multi render targets are unavailable. Falling back to a single-attachment framebuffer bound to the first color target.\",\r\n 1\r\n );\r\n rtWrapper._framebuffer = this._engine.createFrameBuffer(\r\n colorHandles[0],\r\n width,\r\n height,\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper._generateDepthBuffer,\r\n rtWrapper._samples\r\n );\r\n }\r\n }\r\n\r\n public override generateMipMapsForCubemap(_texture: InternalTexture, _unbind = true): void {\r\n // The WebGL path rebinds gl.TEXTURE_CUBE_MAP and calls gl.generateMipmap; both deref _gl, which is\r\n // null on Native. bgfx auto-generates the mip chain when a render target texture created with mips is\r\n // resolved (the same way 2D RTTs get their mips here -- unBindFramebuffer issues no explicit mipgen),\r\n // so this is a no-op on Native.\r\n }\r\n\r\n public override bindAttachments(_attachments: number[]): void {\r\n // No-op on Native: bgfx renders to every color attachment of the bound framebuffer, so there is\r\n // no gl.drawBuffers equivalent to select a subset.\r\n }\r\n\r\n public override buildTextureLayout(textureStatus: boolean[], _backBufferLayout = false): number[] {\r\n // Native has no gl draw-buffer enums; return a per-attachment index list (consumers only use the\r\n // length/order, and bindAttachments is a no-op).\r\n const result: number[] = [];\r\n for (let i = 0; i < textureStatus.length; i++) {\r\n result.push(textureStatus[i] ? i : -1);\r\n }\r\n return result;\r\n }\r\n\r\n public override restoreSingleAttachment(): void {\r\n // No-op on Native (see bindAttachments).\r\n }\r\n\r\n public override restoreSingleAttachmentForRenderTarget(): void {\r\n // No-op on Native (see bindAttachments).\r\n }\r\n\r\n public override generateMipMapsMultiFramebuffer(_texture: RenderTargetWrapper): void {\r\n // No-op on Native: bgfx auto-generates mips on render-target resolve (as for 2D/cube RTTs).\r\n }\r\n\r\n public override resolveMultiFramebuffer(_texture: RenderTargetWrapper): void {\r\n // No-op on Native: bgfx resolves MSAA render targets automatically.\r\n }\r\n\r\n public override unBindMultiColorAttachmentFramebuffer(_rtWrapper: RenderTargetWrapper, _disableGenerateMipMaps = false, onBeforeUnbind?: () => void): void {\r\n this._currentRenderTarget = null;\r\n if (onBeforeUnbind) {\r\n onBeforeUnbind();\r\n }\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n\r\n public override updateMultipleRenderTargetTextureSampleCount(rtWrapper: Nullable<RenderTargetWrapper>, samples: number, _initializeBuffers = true): number {\r\n if (!rtWrapper || rtWrapper.samples === samples) {\r\n return samples;\r\n }\r\n\r\n const textures = rtWrapper.textures;\r\n if (!textures) {\r\n return rtWrapper.samples;\r\n }\r\n\r\n const nativeRTWrapper = rtWrapper as NativeRenderTargetWrapper;\r\n\r\n // bgfx couples MSAA to the texture creation flags (see updateRenderTargetTextureSampleCount), so\r\n // changing the sample count after the fact requires reissuing every color attachment's underlying\r\n // bgfx handle with the new MSAA flag. initializeTexture disposes the old handle and allocates a fresh\r\n // one while preserving the InternalTexture / Graphics::Texture identity; only the internal bgfx handle\r\n // rotates. Afterwards the framebuffer is recreated so its attachment list refers to the new handles.\r\n for (const texture of textures) {\r\n // Wrapped (External-source) textures own an opaque external handle (format=-1); reinitializing\r\n // would destroy it and getNativeTextureFormat would throw, so leave those attachments untouched.\r\n if (!texture?._hardwareTexture || texture.source === InternalTextureSource.External) {\r\n continue;\r\n }\r\n\r\n const nativeTexture = texture._hardwareTexture.underlyingResource;\r\n // See the bgfx-msaa-mips workaround in updateRenderTargetTextureSampleCount (BabylonNative#1714).\r\n const hasMips = samples > 1 ? false : texture.generateMipMaps;\r\n this._engine.initializeTexture(\r\n nativeTexture,\r\n texture.baseWidth,\r\n texture.baseHeight,\r\n hasMips,\r\n getNativeTextureFormat(texture.format, texture.type),\r\n /*renderTarget*/ true,\r\n texture._useSRGBBuffer,\r\n samples\r\n );\r\n texture.samples = samples;\r\n }\r\n\r\n nativeRTWrapper._samples = samples;\r\n this._createMultiRenderTargetFramebuffer(nativeRTWrapper);\r\n\r\n return samples;\r\n }\r\n\r\n public override updateRenderTargetTextureSampleCount(rtWrapper: RenderTargetWrapper, samples: number): number {\r\n if (rtWrapper.samples === samples) {\r\n return samples;\r\n }\r\n\r\n const texture = rtWrapper.texture;\r\n if (!texture?._hardwareTexture) {\r\n return rtWrapper.samples;\r\n }\r\n\r\n // Wrapped (External-source) textures carry an opaque external handle with unknown format/type.\r\n // Recreating the underlying bgfx texture here would destroy the wrapped handle, breaking the\r\n // consumer's ownership contract, and getNativeTextureFormat would throw on format=-1 anyway.\r\n // Reject the request explicitly with a targeted error rather than failing deeper in the stack.\r\n if (texture.source === InternalTextureSource.External) {\r\n throw new Error(\r\n \"updateRenderTargetTextureSampleCount: changing MSAA samples is not supported on wrapped (External-source) textures. Dispose and re-wrap with the desired samples.\"\r\n );\r\n }\r\n\r\n const nativeRTWrapper = rtWrapper as NativeRenderTargetWrapper;\r\n const nativeTexture = texture._hardwareTexture.underlyingResource;\r\n\r\n // bgfx couples MSAA to the texture creation flags, so changing samples after the fact requires\r\n // recreating the underlying bgfx texture handle with the new MSAA flag. initializeTexture on the\r\n // Native side calls Graphics::Texture::Create2D, which disposes the existing bgfx handle and\r\n // allocates a fresh one. The Graphics::Texture / InternalTexture wrapper identity is preserved --\r\n // only the internal bgfx handle rotates. After the texture is reissued we also recreate the\r\n // framebuffer so its attachment list refers to the new handle.\r\n //\r\n // TODO(bgfx-msaa-mips): stopgap workaround for a bgfx bug. D3D11 forbids MipLevels > 1 on\r\n // multisampled textures (E_INVALIDARG on CreateTexture2D); D3D12/Vulkan have equivalent rules. bgfx's\r\n // D3D11 backend uses one D3D11_TEXTURE2D_DESC for both the MSAA render texture (m_rt2d) and the\r\n // non-MSAA sample target (m_texture2d) and doesn't reset desc.MipLevels between them -- so requesting\r\n // samples > 1 with hasMips = true crashes at m_rt2d creation. The trigger in practice is the glTF\r\n // transmission helper, which creates an `opaqueSceneTexture` RTT with generateMipmaps: true and\r\n // immediately sets samples = 4. WebGL2 sidesteps this with a separate non-mipped multisample\r\n // renderbuffer; bgfx D3D11 conflates the two-stage pattern. The proper fix lives in bgfx (per-backend\r\n // patches reset MipLevels=1 for the MSAA target). Tracked in BabylonNative#1714. Until that ships\r\n // through bgfx -> bgfx.cmake -> BabylonNative -> stable npm, force hasMips = false here so the bad\r\n // combo never reaches bgfx. Cost: MSAA RTs on Native lose post-resolve auto-mipgen and diverge from\r\n // WebGL/WebGPU semantics -- texture.generateMipMaps still reads true on the JS side, but the\r\n // underlying bgfx resource has 1 mip level. Remove this guard once a fixed bgfx is in stable BN npm.\r\n const hasMips = samples > 1 ? false : texture.generateMipMaps;\r\n const nativeTextureFormat = getNativeTextureFormat(texture.format, texture.type);\r\n const isCube = texture.isCube;\r\n this._engine.initializeTexture(\r\n nativeTexture,\r\n texture.baseWidth,\r\n texture.baseHeight,\r\n hasMips,\r\n nativeTextureFormat,\r\n /*renderTarget*/ true,\r\n texture._useSRGBBuffer,\r\n samples,\r\n isCube\r\n );\r\n\r\n if (isCube) {\r\n // Cube RTTs render through one framebuffer per face (see createRenderTargetCubeTexture). The\r\n // underlying bgfx handle was just rotated, so recreate all six attachments; the _framebuffers\r\n // setter releases the stale ones and keeps _framebuffer aliased to face 0 for single-target paths.\r\n const framebuffers: NativeFramebuffer[] = [];\r\n for (let face = 0; face < 6; face++) {\r\n framebuffers.push(\r\n this._engine.createFrameBuffer(\r\n nativeTexture,\r\n texture.baseWidth,\r\n texture.baseHeight,\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper._generateDepthBuffer,\r\n samples,\r\n face\r\n )\r\n );\r\n }\r\n nativeRTWrapper._framebuffers = framebuffers;\r\n } else {\r\n // NativeRenderTargetWrapper._framebuffer setter releases the old framebuffer before assigning,\r\n // so no manual _releaseFramebufferObjects call is needed (and would double-delete the handle).\r\n nativeRTWrapper._framebuffer = this._engine.createFrameBuffer(\r\n nativeTexture,\r\n texture.baseWidth,\r\n texture.baseHeight,\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper._generateDepthBuffer,\r\n samples\r\n );\r\n }\r\n\r\n rtWrapper._samples = samples;\r\n texture.samples = samples;\r\n return samples;\r\n }\r\n\r\n public override updateTextureSamplingMode(samplingMode: number, texture: InternalTexture): void {\r\n if (texture._hardwareTexture) {\r\n const filter = getNativeSamplingMode(samplingMode);\r\n this._setTextureSampling(texture._hardwareTexture.underlyingResource, filter);\r\n }\r\n\r\n texture.samplingMode = samplingMode;\r\n }\r\n\r\n public override bindFramebuffer(texture: RenderTargetWrapper, faceIndex?: number, requiredWidth?: number, requiredHeight?: number, forceFullscreenViewport?: boolean): void {\r\n const nativeRTWrapper = texture as NativeRenderTargetWrapper;\r\n\r\n if (this._currentRenderTarget) {\r\n this.unBindFramebuffer(this._currentRenderTarget);\r\n }\r\n\r\n this._currentRenderTarget = texture;\r\n\r\n if (requiredWidth || requiredHeight) {\r\n throw new Error(\"Required width/height for frame buffers not yet supported in NativeEngine.\");\r\n }\r\n\r\n if (nativeRTWrapper._framebuffers) {\r\n // Cube render target: bind the framebuffer for the requested face.\r\n this._bindUnboundFramebuffer(nativeRTWrapper._framebuffers[faceIndex ?? 0]);\r\n } else if (faceIndex) {\r\n throw new Error(\"Cuboid frame buffers are not yet supported in NativeEngine.\");\r\n } else if (nativeRTWrapper._framebufferDepthStencil) {\r\n this._bindUnboundFramebuffer(nativeRTWrapper._framebufferDepthStencil);\r\n } else {\r\n this._bindUnboundFramebuffer(nativeRTWrapper._framebuffer);\r\n }\r\n }\r\n\r\n public override unBindFramebuffer(texture: RenderTargetWrapper, disableGenerateMipMaps = false, onBeforeUnbind?: () => void): void {\r\n // NOTE: Disabling mipmap generation is not yet supported in NativeEngine.\r\n\r\n this._currentRenderTarget = null;\r\n\r\n if (onBeforeUnbind) {\r\n onBeforeUnbind();\r\n }\r\n\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n\r\n public override createDynamicVertexBuffer(data: DataArray): DataBuffer {\r\n return this.createVertexBuffer(data, true);\r\n }\r\n\r\n public override updateDynamicIndexBuffer(indexBuffer: DataBuffer, indices: IndicesArray, offset: number = 0): void {\r\n const buffer = indexBuffer as NativeDataBuffer;\r\n const data = this._normalizeIndexData(indices);\r\n buffer.is32Bits = data.BYTES_PER_ELEMENT === 4;\r\n this._engine.updateDynamicIndexBuffer(buffer.nativeIndexBuffer!, data.buffer, data.byteOffset, data.byteLength, offset);\r\n }\r\n\r\n public override updateDynamicVertexBuffer(vertexBuffer: DataBuffer, data: DataArray, byteOffset = 0, byteLength?: number): void {\r\n const buffer = vertexBuffer as NativeDataBuffer;\r\n const dataView = data instanceof Array ? new Float32Array(data) : ArrayBuffer.isView(data) ? data : new Uint8Array(data);\r\n const byteView = new Uint8Array(dataView.buffer, dataView.byteOffset, byteLength ?? dataView.byteLength);\r\n this._engine.updateDynamicVertexBuffer(buffer.nativeVertexBuffer!, byteView.buffer, byteView.byteOffset, byteView.byteLength, byteOffset);\r\n }\r\n\r\n // TODO: Refactor to share more logic with base Engine implementation.\r\n /**\r\n * @internal\r\n */\r\n public override _setTexture(channel: number, texture: Nullable<BaseTexture>, isPartOfTextureArray = false, depthStencilTexture = false): boolean {\r\n const uniform = this._boundUniforms[channel] as unknown as NativeUniform;\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n // Not ready?\r\n if (!texture) {\r\n if (this._boundTexturesCache[channel] != null) {\r\n this._activeChannel = channel;\r\n this._boundTexturesCache[channel] = null;\r\n this._unsetNativeTexture(uniform);\r\n }\r\n return false;\r\n }\r\n\r\n // Video\r\n if ((<VideoTexture>texture).video) {\r\n this._activeChannel = channel;\r\n (<VideoTexture>texture).update();\r\n } else if (texture.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n // Delay loading\r\n texture.delayLoad();\r\n return false;\r\n }\r\n\r\n let internalTexture: InternalTexture;\r\n if (depthStencilTexture) {\r\n internalTexture = (<RenderTargetTexture>texture).depthStencilTexture!;\r\n } else if (texture.isReady()) {\r\n internalTexture = <InternalTexture>texture.getInternalTexture();\r\n } else if (texture.isCube) {\r\n internalTexture = this.emptyCubeTexture;\r\n } else if (texture.is3D) {\r\n internalTexture = this.emptyTexture3D;\r\n } else if (texture.is2DArray) {\r\n internalTexture = this.emptyTexture2DArray;\r\n } else {\r\n internalTexture = this.emptyTexture;\r\n }\r\n\r\n this._activeChannel = channel;\r\n\r\n if (!internalTexture || !internalTexture._hardwareTexture) {\r\n return false;\r\n }\r\n\r\n this._setTextureWrapMode(\r\n internalTexture._hardwareTexture.underlyingResource,\r\n getNativeAddressMode(texture.wrapU),\r\n getNativeAddressMode(texture.wrapV),\r\n getNativeAddressMode(texture.wrapR)\r\n );\r\n this._updateAnisotropicLevel(texture);\r\n\r\n this._setNativeTexture(uniform, internalTexture._hardwareTexture.underlyingResource);\r\n\r\n return true;\r\n }\r\n\r\n // filter is a NativeFilter.XXXX value.\r\n private _setTextureSampling(texture: NativeTexture, filter: number) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETTEXTURESAMPLING);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(texture);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(filter);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n // addressModes are NativeAddressMode.XXXX values.\r\n private _setTextureWrapMode(texture: NativeTexture, addressModeU: number, addressModeV: number, addressModeW: number) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETTEXTUREWRAPMODE);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(texture);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(addressModeU);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(addressModeV);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(addressModeW);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n private _setNativeTexture(uniform: NativeUniform, texture: NativeTexture) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETTEXTURE);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(texture);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n private _unsetNativeTexture(uniform: NativeUniform) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_UNSETTEXTURE);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n // TODO: Share more of this logic with the base implementation.\r\n // TODO: Rename to match naming in base implementation once refactoring allows different parameters.\r\n private _updateAnisotropicLevel(texture: BaseTexture) {\r\n const internalTexture = texture.getInternalTexture();\r\n const value = texture.anisotropicFilteringLevel;\r\n\r\n if (!internalTexture || !internalTexture._hardwareTexture) {\r\n return;\r\n }\r\n\r\n if (internalTexture._cachedAnisotropicFilteringLevel !== value) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETTEXTUREANISOTROPICLEVEL);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(internalTexture._hardwareTexture.underlyingResource);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(value);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n internalTexture._cachedAnisotropicFilteringLevel = value;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _bindTexture(channel: number, texture: Nullable<InternalTexture>): void {\r\n const uniform = this._boundUniforms[channel] as unknown as NativeUniform;\r\n if (!uniform) {\r\n return;\r\n }\r\n\r\n if (texture && texture._hardwareTexture) {\r\n const underlyingResource = texture._hardwareTexture.underlyingResource;\r\n this._setNativeTexture(uniform, underlyingResource);\r\n } else {\r\n this._unsetNativeTexture(uniform);\r\n }\r\n }\r\n\r\n /**\r\n * Unbind all textures\r\n */\r\n public override unbindAllTextures(): void {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DISCARDALLTEXTURES);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n protected override _deleteBuffer(buffer: NativeDataBuffer): void {\r\n if (buffer.nativeIndexBuffer) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DELETEINDEXBUFFER);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(buffer.nativeIndexBuffer);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n delete buffer.nativeIndexBuffer;\r\n }\r\n\r\n if (buffer.nativeVertexBuffer) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DELETEVERTEXBUFFER);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(buffer.nativeVertexBuffer);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n delete buffer.nativeVertexBuffer;\r\n }\r\n }\r\n\r\n /**\r\n * Create a canvas\r\n * @param width width\r\n * @param height height\r\n * @returns ICanvas interface\r\n */\r\n public override createCanvas(width: number, height: number): ICanvas {\r\n if (!_native.Canvas) {\r\n throw new Error(\"Native Canvas plugin not available.\");\r\n }\r\n const canvas = new _native.Canvas();\r\n canvas.width = width;\r\n canvas.height = height;\r\n return canvas;\r\n }\r\n\r\n /**\r\n * Create an image to use with canvas\r\n * @returns IImage interface\r\n */\r\n public override createCanvasImage(): IImage {\r\n if (!_native.Image) {\r\n throw new Error(\"Native Canvas plugin not available.\");\r\n }\r\n const image = new _native.Image();\r\n return image;\r\n }\r\n\r\n /**\r\n * Create a 2D path to use with canvas\r\n * @returns IPath2D interface\r\n * @param d SVG path string\r\n */\r\n public override createCanvasPath2D(d?: string): IPath2D {\r\n if (!_native.Path2D) {\r\n throw new Error(\"Native Canvas plugin not available.\");\r\n }\r\n const path2d = new _native.Path2D(d);\r\n return path2d;\r\n }\r\n\r\n /**\r\n * Update a portion of an internal texture\r\n * @param texture defines the texture to update\r\n * @param imageData defines the data to store into the texture\r\n * @param xOffset defines the x coordinates of the update rectangle\r\n * @param yOffset defines the y coordinates of the update rectangle\r\n * @param width defines the width of the update rectangle\r\n * @param height defines the height of the update rectangle\r\n * @param faceIndex defines the face index if texture is a cube (0 by default)\r\n * @param lod defines the lod level to update (0 by default)\r\n * @param generateMipMaps defines whether to generate mipmaps or not\r\n */\r\n public override updateTextureData(\r\n texture: InternalTexture,\r\n imageData: ArrayBufferView,\r\n xOffset: number,\r\n yOffset: number,\r\n width: number,\r\n height: number,\r\n faceIndex: number = 0,\r\n lod: number = 0,\r\n generateMipMaps = false\r\n ): void {\r\n if (!texture._hardwareTexture) {\r\n return;\r\n }\r\n\r\n if (!this._engine.updateTextureData) {\r\n throw new Error(\"updateTextureData not implemented.\");\r\n }\r\n\r\n // bgfx updates the requested sub-rectangle of the existing texture (faceIndex selects the cube\r\n // face / array layer, lod selects the mip level). invertY is forwarded so the native side can match\r\n // the vertical orientation the base texture upload uses. Mip regeneration after a partial update is\r\n // not supported on Native, so generateMipMaps is ignored (consistent with the other raw-texture paths).\r\n this._engine.updateTextureData(texture._hardwareTexture.underlyingResource, imageData, xOffset, yOffset, width, height, faceIndex, lod, texture.invertY);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _uploadCompressedDataToTextureDirectly(\r\n texture: InternalTexture,\r\n internalFormat: number,\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n faceIndex: number = 0,\r\n lod: number = 0\r\n ) {\r\n throw new Error(\"_uploadCompressedDataToTextureDirectly not implemented.\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _uploadDataToTextureDirectly(texture: InternalTexture, imageData: ArrayBufferView, faceIndex: number = 0, lod: number = 0): void {\r\n throw new Error(\"_uploadDataToTextureDirectly not implemented.\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _uploadArrayBufferViewToTexture(texture: InternalTexture, imageData: ArrayBufferView, faceIndex: number = 0, lod: number = 0): void {\r\n throw new Error(\"_uploadArrayBufferViewToTexture not implemented.\");\r\n }\r\n\r\n public override getFontOffset(font: string): { ascent: number; height: number; descent: number } {\r\n // TODO\r\n const result = { ascent: 0, height: 0, descent: 0 };\r\n return result;\r\n }\r\n\r\n /**\r\n * No equivalent for native. Do nothing.\r\n */\r\n public override flushFramebuffer(): void {}\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public override _readTexturePixels(\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex?: number,\r\n level?: number,\r\n buffer?: Nullable<ArrayBufferView<ArrayBuffer>>,\r\n _flushRenderer?: boolean,\r\n _noDataConversion?: boolean,\r\n x?: number,\r\n y?: number\r\n ): Promise<ArrayBufferView> {\r\n if (faceIndex !== undefined && faceIndex !== -1) {\r\n throw new Error(`Reading cubemap faces is not supported, but faceIndex is ${faceIndex}.`);\r\n }\r\n\r\n return (\r\n this._engine\r\n .readTexture(\r\n texture._hardwareTexture?.underlyingResource,\r\n level ?? 0,\r\n x ?? 0,\r\n y ?? 0,\r\n width,\r\n height,\r\n buffer?.buffer ?? null,\r\n buffer?.byteOffset ?? 0,\r\n buffer?.byteLength ?? 0\r\n )\r\n // eslint-disable-next-line github/no-then\r\n .then((rawBuffer) => {\r\n if (!buffer) {\r\n buffer = new Uint8Array(rawBuffer);\r\n }\r\n\r\n return buffer;\r\n })\r\n );\r\n }\r\n\r\n override startTimeQuery(): Nullable<_TimeToken> {\r\n if (!this._gpuFrameTimeToken) {\r\n this._gpuFrameTimeToken = new _TimeToken();\r\n }\r\n\r\n // Always return the same time token. For native, we don't need a start marker, we just query for native frame stats.\r\n return this._gpuFrameTimeToken;\r\n }\r\n\r\n override endTimeQuery(token: _TimeToken): int {\r\n this._engine.populateFrameStats(this._frameStats);\r\n return this._frameStats.gpuTimeNs;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"thinNativeEngine.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Engines/thinNativeEngine.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable, type IndicesArray, type DataArray, type FloatArray, type DeepImmutable, type int } from \"../types\";\r\n\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { type VertexBuffer } from \"../Buffers/buffer.pure\";\r\nimport { RegisterBufferAlign } from \"../Buffers/buffer.align.pure\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport { HasStencilAspect } from \"../Materials/Textures/textureHelper.functions\";\r\nimport { type IInternalTextureLoader } from \"../Materials/Textures/Loaders/internalTextureLoader\";\r\nimport { _IESTextureLoader } from \"../Materials/Textures/Loaders/iesTextureLoader\";\r\nimport { type BaseTexture } from \"../Materials/Textures/baseTexture.pure\";\r\nimport { type VideoTexture } from \"../Materials/Textures/videoTexture.pure\";\r\nimport { type RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture.pure\";\r\nimport { type Effect } from \"../Materials/effect.pure\";\r\nimport { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { type Observer, Observable } from \"../Misc/observable.pure\";\r\nimport {\r\n type RenderTargetCreationOptions,\r\n type TextureSize,\r\n type DepthTextureCreationOptions,\r\n type InternalTextureCreationOptions,\r\n} from \"../Materials/Textures/textureCreationOptions\";\r\nimport { type IPipelineContext } from \"./IPipelineContext\";\r\nimport { type IMultiRenderTargetOptions } from \"../Materials/Textures/multiRenderTarget.pure\";\r\nimport { type IColor3Like, type IColor4Like, type IViewportLike } from \"../Maths/math.like\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Constants } from \"./constants\";\r\nimport { AbstractEngine, type AbstractEngineOptions, type ISceneLike } from \"./abstractEngine.pure\";\r\nimport { ThinEngine } from \"./thinEngine.pure\";\r\nimport { type IWebRequest } from \"../Misc/interfaces/iWebRequest\";\r\nimport { EngineStore } from \"./engineStore\";\r\nimport { ShaderCodeInliner } from \"./Processors/shaderCodeInliner\";\r\nimport { NativeShaderProcessor } from \"./Native/nativeShaderProcessors\";\r\nimport { type IMaterialContext } from \"./IMaterialContext\";\r\nimport { type IDrawContext } from \"./IDrawContext\";\r\nimport { type ICanvas, type IImage, type IPath2D } from \"./ICanvas\";\r\nimport { type IStencilState } from \"../States/IStencilState\";\r\nimport { type RenderTargetWrapper } from \"./renderTargetWrapper\";\r\nimport { type NativeData, NativeDataStream } from \"./Native/nativeDataStream\";\r\nimport {\r\n type INative,\r\n type INativeCamera,\r\n type INativeEngine,\r\n type NativeFramebuffer,\r\n type NativeFrameStats,\r\n type NativeProgram,\r\n type NativeTexture,\r\n type NativeUniform,\r\n type NativeVertexArrayObject,\r\n} from \"./Native/nativeInterfaces\";\r\nimport { NativePipelineContext } from \"./Native/nativePipelineContext\";\r\nimport { NativeRenderTargetWrapper } from \"./Native/nativeRenderTargetWrapper\";\r\nimport { NativeHardwareTexture } from \"./Native/nativeHardwareTexture\";\r\nimport { type IHardwareTextureWrapper } from \"../Materials/Textures/hardwareTextureWrapper\";\r\nimport {\r\n getNativeAlphaMode,\r\n getNativeAttribType,\r\n getNativeSamplingMode,\r\n getNativeTextureFormat,\r\n getNativeStencilDepthFail,\r\n getNativeStencilDepthPass,\r\n getNativeStencilFunc,\r\n getNativeStencilOpFail,\r\n getNativeAddressMode,\r\n} from \"./Native/nativeHelpers\";\r\nimport { checkNonFloatVertexBuffers } from \"../Buffers/buffer.nonFloatVertexBuffers\";\r\nimport { type _IShaderProcessingContext } from \"./Processors/shaderProcessingOptions\";\r\nimport { NativeShaderProcessingContext } from \"./Native/nativeShaderProcessingContext\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport { type WebGLHardwareTexture } from \"./WebGL/webGLHardwareTexture\";\r\n\r\nimport { _TimeToken } from \"../Instrumentation/timeToken\";\r\nimport { PerfCounter } from \"../Misc/perfCounter\";\r\nimport { DecodeBase64UrlToBinary } from \"../Misc/fileTools.pure\";\r\n\r\ndeclare const _native: INative;\r\n\r\nconst onNativeObjectInitialized = /*#__PURE__*/ new Observable<INative>();\r\nif (typeof self !== \"undefined\" && !Object.prototype.hasOwnProperty.call(self, \"_native\")) {\r\n let __native: INative;\r\n Object.defineProperty(self, \"_native\", {\r\n get: () => __native,\r\n set: (value: INative) => {\r\n __native = value;\r\n if (__native) {\r\n onNativeObjectInitialized.notifyObservers(__native);\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Returns _native only after it has been defined by BabylonNative.\r\n * @internal\r\n */\r\nexport async function AcquireNativeObjectAsync(): Promise<INative> {\r\n return await new Promise((resolve) => {\r\n if (typeof _native === \"undefined\") {\r\n onNativeObjectInitialized.addOnce((nativeObject) => resolve(nativeObject));\r\n } else {\r\n resolve(_native);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Registers a constructor on the _native object. See NativeXRFrame for an example.\r\n * @internal\r\n */\r\nexport async function RegisterNativeTypeAsync<Type>(typeName: string, constructor: Type) {\r\n ((await AcquireNativeObjectAsync()) as any)[typeName] = constructor;\r\n}\r\n\r\n/**\r\n * Container for accessors for natively-stored mesh data buffers.\r\n */\r\nclass NativeDataBuffer extends DataBuffer {\r\n /**\r\n * Accessor value used to identify/retrieve a natively-stored index buffer.\r\n */\r\n public nativeIndexBuffer?: NativeData;\r\n\r\n /**\r\n * Accessor value used to identify/retrieve a natively-stored vertex buffer.\r\n */\r\n public nativeVertexBuffer?: NativeData;\r\n}\r\n\r\n/**\r\n * Options to create the Native engine\r\n */\r\nexport interface ThinNativeEngineOptions extends AbstractEngineOptions {\r\n /**\r\n * defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n adaptToDeviceRatio?: boolean;\r\n}\r\n\r\n/** @internal */\r\nclass CommandBufferEncoder {\r\n private readonly _commandStream: NativeDataStream;\r\n private readonly _pending = new Array<NativeData>();\r\n private _isCommandBufferScopeActive = false;\r\n\r\n public constructor(private readonly _engine: INativeEngine) {\r\n this._commandStream = ThinNativeEngine._createNativeDataStream();\r\n this._engine.setCommandDataStream(this._commandStream);\r\n }\r\n\r\n public beginCommandScope() {\r\n if (this._isCommandBufferScopeActive) {\r\n throw new Error(\"Command scope already active.\");\r\n }\r\n\r\n this._isCommandBufferScopeActive = true;\r\n }\r\n\r\n public endCommandScope() {\r\n if (!this._isCommandBufferScopeActive) {\r\n throw new Error(\"Command scope is not active.\");\r\n }\r\n\r\n this._isCommandBufferScopeActive = false;\r\n this._submit();\r\n }\r\n\r\n public startEncodingCommand(command: NativeData) {\r\n this._commandStream.writeNativeData(command);\r\n }\r\n\r\n public encodeCommandArgAsUInt32(commandArg: number) {\r\n this._commandStream.writeUint32(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsUInt32s(commandArg: Uint32Array) {\r\n this._commandStream.writeUint32Array(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsInt32(commandArg: number) {\r\n this._commandStream.writeInt32(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsInt32s(commandArg: Int32Array) {\r\n this._commandStream.writeInt32Array(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsFloat32(commandArg: number) {\r\n this._commandStream.writeFloat32(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsFloat32s(commandArg: DeepImmutable<FloatArray>) {\r\n this._commandStream.writeFloat32Array(commandArg);\r\n }\r\n\r\n public encodeCommandArgAsNativeData(commandArg: NativeData) {\r\n this._commandStream.writeNativeData(commandArg);\r\n this._pending.push(commandArg);\r\n }\r\n\r\n public finishEncodingCommand() {\r\n if (!this._isCommandBufferScopeActive) {\r\n this._submit();\r\n }\r\n }\r\n\r\n private _submit() {\r\n this._engine.submitCommands();\r\n this._pending.length = 0;\r\n }\r\n}\r\n\r\nconst remappedAttributesNames: string[] = [];\r\n\r\n// Reused by bindFramebuffer(forceFullscreenViewport) to avoid allocating a viewport per bind.\r\nconst _FullscreenViewport: IViewportLike = { x: 0, y: 0, width: 1, height: 1 };\r\n\r\n// Render-target textures created with mip storage (createMipMaps or generateMipMaps). Tracked separately from\r\n// generateMipMaps so sample-count changes and context-loss rebuilds keep an explicitly authored mip chain.\r\nconst _TexturesWithMipStorage = /*#__PURE__*/ new WeakSet<InternalTexture>();\r\n\r\n/**\r\n * Sentinel for \"no attachment masking\": every color attachment of the bound framebuffer takes part in\r\n * the clear. Native treats this value specially and skips the bgfx color-palette clear path.\r\n */\r\nconst _AllAttachmentsMask = 0xff;\r\n\r\n/** @internal */\r\nexport class ThinNativeEngine extends ThinEngine {\r\n // This must match the protocol version in NativeEngine.cpp\r\n private static readonly PROTOCOL_VERSION = 9;\r\n\r\n /** @internal */\r\n public static _createNativeDataStream(): NativeDataStream {\r\n return new NativeDataStream();\r\n }\r\n\r\n /////////// No assignment allowed in constructor ///////////\r\n /////////// They should all be in _initializeNativeEngine ///////////\r\n /////////// To ensure a correct sharing with NativeEngine ///////////\r\n protected _engine: INativeEngine;\r\n private _camera: Nullable<INativeCamera>;\r\n private _commandBufferEncoder: CommandBufferEncoder;\r\n private _frameStats: NativeFrameStats;\r\n private _boundBuffersVertexArray: any;\r\n private _transformFeedbackBuffer: Nullable<NativeDataBuffer> = null;\r\n private _transformFeedbackActive = false;\r\n /**\r\n * Bit i is set when color attachment i is selected by the last bindAttachments() call.\r\n * Only used to mask clears (see bindAttachments).\r\n */\r\n private _clearAttachmentMask: number;\r\n private _currentDepthTest: number;\r\n private _depthTestEnabled: boolean;\r\n private _stencilTest: boolean;\r\n private _stencilMask: number;\r\n private _stencilFunc: number;\r\n private _stencilFuncRef: number;\r\n private _stencilFuncMask: number;\r\n private _stencilOpStencilFail: number;\r\n private _stencilOpDepthFail: number;\r\n private _stencilOpStencilDepthPass: number;\r\n private _zOffset: number;\r\n private _zOffsetUnits: number;\r\n private _cachedCulling: boolean;\r\n private _cachedReverseSide: boolean;\r\n private _cachedCullBackFaces: boolean;\r\n private _cachedZOffset: number;\r\n private _cachedZOffsetUnits: number;\r\n private _depthWrite: boolean;\r\n // warning for non supported fill mode has already been displayed\r\n private _fillModeWarningDisplayed: boolean;\r\n // Scratch buffers for setInt2/3/4; NativeDataStream copies them synchronously.\r\n private _int2Scratch: Int32Array;\r\n private _int3Scratch: Int32Array;\r\n private _int4Scratch: Int32Array;\r\n // Reference counts + metadata for framebuffers shared across frame graph render-target wrappers\r\n // (see _buildFrameGraphFramebuffer). Initialized in _initializeNativeEngine to match the other fields.\r\n private _frameGraphFramebufferRefCount: Map<\r\n NativeFramebuffer,\r\n {\r\n count: number;\r\n hardwareTexture: NativeHardwareTexture;\r\n colorResources: NativeTexture[];\r\n hasDepth: boolean;\r\n hasStencil: boolean;\r\n samples: number;\r\n sharedDepthResource?: NativeTexture;\r\n }\r\n >;\r\n\r\n public constructor(options: ThinNativeEngineOptions = {}) {\r\n super(null, false, options, options.adaptToDeviceRatio);\r\n this._initializeNativeEngine(options.adaptToDeviceRatio ?? false);\r\n }\r\n //////////////////////////////////////////////////////////////////////\r\n\r\n /**\r\n * Keeps as a separate function to use in NativeEngine\r\n * @internal\r\n */\r\n protected _initializeNativeEngine(adaptToDeviceRatio: boolean): void {\r\n // ThinNativeEngine relies on VertexBuffer.effective{Buffer,ByteOffset,ByteStride}\r\n // (defined in Buffers/buffer.align.pure) to bind vertex attributes through\r\n // recordVertexBuffer. Register the side effect here so the engine is usable\r\n // on its own without callers having to remember to import the wrapper module.\r\n // The registration is idempotent.\r\n RegisterBufferAlign();\r\n\r\n this._engine = new _native.Engine({\r\n version: AbstractEngine.Version,\r\n nonFloatVertexBuffers: true,\r\n });\r\n this._camera = _native.Camera ? new _native.Camera() : null;\r\n this._commandBufferEncoder = new CommandBufferEncoder(this._engine);\r\n this._frameGraphFramebufferRefCount = new Map();\r\n this._frameStats = { gpuTimeNs: Number.NaN };\r\n // There is no DOM canvas to draw the default loading screen into, so install a no-op one; this keeps\r\n // the loading-UI accessors (loadingUIText, loadingUIBackgroundColor, display/hide) usable on native.\r\n let loadingScreenWarningDisplayed = false;\r\n this._loadingScreen = {\r\n displayLoadingUI: () => {\r\n if (!loadingScreenWarningDisplayed) {\r\n Logger.Warn(\"NativeEngine is unable to display the loading screen UI.\");\r\n loadingScreenWarningDisplayed = true;\r\n }\r\n },\r\n hideLoadingUI: () => {},\r\n loadingUIBackgroundColor: \"\",\r\n loadingUIText: \"\",\r\n };\r\n this._boundBuffersVertexArray = null;\r\n this._clearAttachmentMask = _AllAttachmentsMask;\r\n this._currentDepthTest = _native.Engine.DEPTH_TEST_LEQUAL;\r\n this._depthTestEnabled = true;\r\n this._stencilTest = false;\r\n this._stencilMask = 255;\r\n this._stencilFunc = Constants.ALWAYS;\r\n this._stencilFuncRef = 0;\r\n this._stencilFuncMask = 255;\r\n this._stencilOpStencilFail = Constants.KEEP;\r\n this._stencilOpDepthFail = Constants.KEEP;\r\n this._stencilOpStencilDepthPass = Constants.REPLACE;\r\n this._zOffset = 0;\r\n this._zOffsetUnits = 0;\r\n this._cachedCulling = true;\r\n this._cachedReverseSide = false;\r\n this._cachedCullBackFaces = true;\r\n this._cachedZOffset = 0;\r\n this._cachedZOffsetUnits = 0;\r\n this._depthWrite = true;\r\n // warning for non supported fill mode has already been displayed\r\n this._fillModeWarningDisplayed = false;\r\n this._int2Scratch = new Int32Array(2);\r\n this._int3Scratch = new Int32Array(3);\r\n this._int4Scratch = new Int32Array(4);\r\n\r\n this._drawCalls = new PerfCounter();\r\n\r\n if (_native.Engine.PROTOCOL_VERSION !== ThinNativeEngine.PROTOCOL_VERSION) {\r\n throw new Error(`Protocol version mismatch: ${_native.Engine.PROTOCOL_VERSION} (Native) !== ${ThinNativeEngine.PROTOCOL_VERSION} (JS)`);\r\n }\r\n\r\n // Prefer setRenderResetCallback (accurate name -- fires when bgfx is (re)initialized,\r\n // i.e. on device restore). Fall back to the legacy setDeviceLostCallback for backward\r\n // compatibility with older BabylonNative builds. See BabylonNative #1722.\r\n const renderResetCallback = () => {\r\n this.onContextLostObservable.notifyObservers(this);\r\n this._contextWasLost = true;\r\n this._restoreEngineAfterContextLost();\r\n };\r\n if (this._engine.setRenderResetCallback) {\r\n this._engine.setRenderResetCallback(renderResetCallback);\r\n } else if (this._engine.setDeviceLostCallback) {\r\n this._engine.setDeviceLostCallback(renderResetCallback);\r\n }\r\n\r\n this._webGLVersion = 2;\r\n this.disableUniformBuffers = true;\r\n this._shaderPlatformName = \"NATIVE\";\r\n // Babylon Native is not WebGL and has no _gl context. Report a distinct engine name (like\r\n // WebGPU reports \"WebGPU\") so application/feature code that branches on engine.name === \"WebGL\"\r\n // to touch the WebGL-only _gl context skips the native engine instead of dereferencing null.\r\n this._name = \"Native\";\r\n\r\n // TODO: Initialize this more correctly based on the hardware capabilities.\r\n // Init caps\r\n\r\n this._caps = {\r\n maxTexturesImageUnits: 16,\r\n maxVertexTextureImageUnits: 16,\r\n maxCombinedTexturesImageUnits: 32,\r\n maxTextureSize: _native.Engine.CAPS_LIMITS_MAX_TEXTURE_SIZE,\r\n maxCubemapTextureSize: 512,\r\n maxRenderTextureSize: 512,\r\n maxVertexAttribs: 16,\r\n maxVaryingVectors: 16,\r\n maxDrawBuffers: 8,\r\n maxFragmentUniformVectors: 16,\r\n maxVertexUniformVectors: 256,\r\n shaderFloatPrecision: 23, // TODO: is this correct?\r\n standardDerivatives: true,\r\n astc: null,\r\n pvrtc: null,\r\n etc1: null,\r\n etc2: null,\r\n bptc: null,\r\n maxAnisotropy: 16, // TODO: Retrieve this smartly. Currently set to D3D11 maximum allowable value.\r\n uintIndices: true,\r\n fragmentDepthSupported: false,\r\n highPrecisionShaderSupported: true,\r\n colorBufferFloat: true,\r\n blendFloat: true,\r\n supportFloatTexturesResolve: false,\r\n rg11b10ufColorRenderable: false,\r\n textureFloat: true,\r\n textureFloatLinearFiltering: true,\r\n textureFloatRender: true,\r\n textureHalfFloat: true,\r\n textureHalfFloatLinearFiltering: true,\r\n textureHalfFloatRender: true,\r\n textureLOD: true,\r\n texelFetch: true,\r\n drawBuffersExtension: true,\r\n depthTextureExtension: false,\r\n vertexArrayObject: true,\r\n instancedArrays: true,\r\n supportOcclusionQuery: false,\r\n canUseTimestampForTimerQuery: false,\r\n blendMinMax: false,\r\n maxMSAASamples: 16,\r\n canUseGLInstanceID: true,\r\n canUseGLVertexID: true,\r\n supportComputeShaders: false,\r\n supportSRGBBuffers: true,\r\n supportTransformFeedbacks: !!_native.Engine.COMMAND_DRAWTRANSFORMFEEDBACK,\r\n textureMaxLevel: false,\r\n texture2DArrayMaxLayerCount: _native.Engine.CAPS_LIMITS_MAX_TEXTURE_LAYERS,\r\n disableMorphTargetTexture: false,\r\n parallelShaderCompile: { COMPLETION_STATUS_KHR: 0 },\r\n textureNorm16: true,\r\n blendParametersPerTarget: false,\r\n dualSourceBlending: false,\r\n supportReadWriteStorageTextures: false,\r\n };\r\n\r\n this._features = {\r\n forceBitmapOverHTMLImageElement: true,\r\n supportRenderAndCopyToLodForFloatTextures: false,\r\n // Native can attach an explicit depth/stencil texture to a render target (see\r\n // _createDepthStencilTexture) and sample it afterwards. Hardware comparison samplers are\r\n // available through bgfx BGFX_SAMPLER_COMPARE_* (set via updateTextureComparisonFunction),\r\n // which is what ShadowGenerator needs for FILTER_PCF / FILTER_PCSS (incl. cascaded shadows).\r\n // Both are optional runtime extensions, so only advertise them when the runtime provides them.\r\n supportDepthStencilTexture: !!this._engine.createMultiFrameBuffer,\r\n supportShadowSamplers: !!this._engine.createMultiFrameBuffer && !!this._engine.setTextureComparisonFunction,\r\n uniformBufferHardCheckMatrix: false,\r\n // Native supports GPU cube prefiltering (HDRFiltering / HDRIrradianceFiltering): the render path\r\n // binds a specific cube-face + mip via bindFramebuffer(faceIndex, lodLevel) and convolves the\r\n // environment per-roughness. Required so OpenPBR/PBR IBL scenes get real prefiltered radiance\r\n // (and irradiance) instead of black/energy-lossy CPU-SH fallbacks.\r\n allowTexturePrefiltering: true,\r\n trackUbosInFrame: false,\r\n checkUbosContentBeforeUpload: false,\r\n // Cascaded shadow maps render into 2D-array render targets, one framebuffer per layer.\r\n supportCSM: true,\r\n basisNeedsPOT: false,\r\n support3DTextures: false,\r\n needTypeSuffixInShaderConstants: false,\r\n supportMSAA: true,\r\n supportSSAO2: false,\r\n supportIBLShadows: false,\r\n supportExtendedTextureFormats: false,\r\n supportSwitchCaseInShader: false,\r\n supportSyncTextureRead: false,\r\n needsInvertingBitmap: true,\r\n useUBOBindingCache: true,\r\n needShaderCodeInlining: true,\r\n needToAlwaysBindUniformBuffers: false,\r\n supportRenderPasses: true,\r\n supportSpriteInstancing: true,\r\n forceVertexBufferStrideAndOffsetMultiple4Bytes: true,\r\n _checkNonFloatVertexBuffersDontRecreatePipelineContext: false,\r\n };\r\n\r\n Logger.Log(\"Babylon Native (v\" + AbstractEngine.Version + \") launched\");\r\n\r\n // Wrappers\r\n if (typeof URL === \"undefined\") {\r\n (window.URL as any) = {\r\n createObjectURL: function () {},\r\n revokeObjectURL: function () {},\r\n };\r\n }\r\n\r\n // TODO: Remove in next protocol version update\r\n if (typeof Blob === \"undefined\") {\r\n (window.Blob as any) = function (v: any) {\r\n return v;\r\n };\r\n }\r\n\r\n // polyfill for Chakra\r\n if (!Array.prototype.flat) {\r\n Object.defineProperty(Array.prototype, \"flat\", {\r\n configurable: true,\r\n value: function flat(this: any[], depth?: number) {\r\n depth = isNaN(depth as any) ? 1 : Number(depth);\r\n\r\n return depth\r\n ? Array.prototype.reduce.call(\r\n this,\r\n function (acc: any, cur: any) {\r\n if (Array.isArray(cur)) {\r\n // eslint-disable-next-line prefer-spread\r\n acc.push.apply(acc, flat.call(cur, depth - 1));\r\n } else {\r\n acc.push(cur);\r\n }\r\n return acc;\r\n },\r\n []\r\n )\r\n : Array.prototype.slice.call(this);\r\n },\r\n writable: true,\r\n });\r\n }\r\n\r\n // Currently we do not fully configure the ThinEngine on construction of NativeEngine.\r\n // Setup resolution scaling based on display settings.\r\n const devicePixelRatio = window ? window.devicePixelRatio || 1.0 : 1.0;\r\n this._hardwareScalingLevel = adaptToDeviceRatio ? 1.0 / devicePixelRatio : 1.0;\r\n this._engine.setHardwareScalingLevel(this._hardwareScalingLevel);\r\n this._lastDevicePixelRatio = devicePixelRatio;\r\n this.resize();\r\n\r\n const currentDepthFunction = this.getDepthFunction();\r\n if (currentDepthFunction) {\r\n this.setDepthFunction(currentDepthFunction);\r\n }\r\n\r\n // Shader processor\r\n this._shaderProcessor = new NativeShaderProcessor();\r\n\r\n this.onNewSceneAddedObservable.add((scene) => {\r\n this._wrapSceneRenderWithCommandScope(scene);\r\n });\r\n }\r\n\r\n /**\r\n * Brackets a scene's render with a command scope, so the commands it encodes are submitted together.\r\n * @param scene the scene whose render should be wrapped\r\n */\r\n private _wrapSceneRenderWithCommandScope(scene: Scene): void {\r\n const originalRender = scene.render;\r\n scene.render = (...args: Parameters<typeof originalRender>) => {\r\n this._commandBufferEncoder.beginCommandScope();\r\n try {\r\n originalRender.apply(scene, args);\r\n } catch (renderException) {\r\n // The scope must be closed even when the render throws. Otherwise it stays\r\n // open forever and every later frame fails with \"Command scope already\r\n // active.\", so one recoverable error permanently breaks the engine instead\r\n // of affecting just this frame.\r\n try {\r\n this._commandBufferEncoder.endCommandScope();\r\n } catch (endException) {\r\n // Never let this replace the root cause; report it separately instead.\r\n Logger.Error(`Failed to end the command scope while unwinding a render error: ${endException}`);\r\n }\r\n throw renderException;\r\n }\r\n\r\n this._commandBufferEncoder.endCommandScope();\r\n };\r\n }\r\n\r\n public override setHardwareScalingLevel(level: number): void {\r\n super.setHardwareScalingLevel(level);\r\n this._engine.setHardwareScalingLevel(level);\r\n }\r\n\r\n public override dispose(): void {\r\n super.dispose();\r\n if (this._boundBuffersVertexArray) {\r\n this._deleteVertexArray(this._boundBuffersVertexArray);\r\n }\r\n this._engine.dispose();\r\n }\r\n\r\n /**\r\n * Enable scissor test on a specific rectangle (ie. render will only be executed on a specific portion of the screen)\r\n * @param x defines the x-coordinate of the bottom left corner of the clear rectangle\r\n * @param y defines the y-coordinate of the corner of the clear rectangle\r\n * @param width defines the width of the clear rectangle\r\n * @param height defines the height of the clear rectangle\r\n */\r\n public override enableScissor(x: number, y: number, width: number, height: number): void {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETSCISSOR);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(x);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(y);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(width);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(height);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Disable previously set scissor test rectangle\r\n */\r\n public override disableScissor() {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETSCISSOR);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(0);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Can be used to override the current requestAnimationFrame requester.\r\n * @internal\r\n */\r\n protected override _queueNewFrame(bindedRenderFunction: any, requester?: any): number {\r\n // Use the provided requestAnimationFrame, unless the requester is the window. In that case, we will default to the Babylon Native version of requestAnimationFrame.\r\n if (requester?.requestAnimationFrame && requester !== this.getHostWindow()) {\r\n return requester.requestAnimationFrame(bindedRenderFunction);\r\n } else {\r\n this._engine.requestAnimationFrame(bindedRenderFunction);\r\n }\r\n return 0;\r\n }\r\n\r\n protected override _restoreEngineAfterContextLost(): void {\r\n this._clearEmptyResources();\r\n\r\n // The frame graph framebuffers of the lost context are invalid: forget their bookkeeping (without deleting\r\n // the stale native handles) so each reset does not leave another generation of entries behind.\r\n for (const shared of this._frameGraphFramebufferRefCount.values()) {\r\n shared.hardwareTexture._frameGraphFramebuffer = null;\r\n }\r\n this._frameGraphFramebufferRefCount.clear();\r\n\r\n const depthTest = this._depthCullingState.depthTest; // backup those values because the call to initEngine / wipeCaches will reset them\r\n const depthFunc = this._depthCullingState.depthFunc;\r\n const depthMask = this._depthCullingState.depthMask;\r\n const stencilTest = this._stencilState.stencilTest;\r\n\r\n this._rebuildGraphicsResources();\r\n\r\n this._depthCullingState.depthTest = depthTest;\r\n this._depthCullingState.depthFunc = depthFunc;\r\n this._depthCullingState.depthMask = depthMask;\r\n this._stencilState.stencilTest = stencilTest;\r\n\r\n this._flagContextRestored();\r\n }\r\n\r\n /**\r\n * Override default engine behavior.\r\n * @param framebuffer\r\n */\r\n public override _bindUnboundFramebuffer(framebuffer: Nullable<WebGLFramebuffer>) {\r\n if (this._currentFramebuffer !== framebuffer) {\r\n if (this._currentFramebuffer) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_UNBINDFRAMEBUFFER);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(this._currentFramebuffer as NativeFramebuffer);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n if (framebuffer) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_BINDFRAMEBUFFER);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(framebuffer as NativeFramebuffer);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n this._currentFramebuffer = framebuffer;\r\n\r\n // drawBuffers state is per-framebuffer on WebGL, so a framebuffer switch resets the\r\n // attachment selection back to \"every attachment\".\r\n this._clearAttachmentMask = _AllAttachmentsMask;\r\n }\r\n }\r\n\r\n /**\r\n * Gets host document\r\n * @returns the host document object\r\n */\r\n public override getHostDocument(): Nullable<Document> {\r\n return null;\r\n }\r\n\r\n public override clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil: boolean = false, stencilClearValue = 0): void {\r\n if (depth && this.useReverseDepthBuffer) {\r\n // Reverse-Z: the scene is rendered with a flipped projection (near maps to 1, far to 0), so the\r\n // depth buffer is cleared to 0 and the comparison must accept greater values. The WebGL engine\r\n // sets depthCullingState.depthFunc = GEQUAL here and relies on applyStates() running the depth\r\n // comparison to the GL context before each draw. The native draw path does not call applyStates()\r\n // (only depth-test enable/disable is reconciled in _flushDepthTestState()), so setting the shared\r\n // state alone would never reach the backend. Route the comparison through the native command path\r\n // as well -- mirroring the WebGPU engine's clear path, which calls setDepthFunctionToGreaterOrEqual().\r\n this._depthCullingState.depthFunc = Constants.GEQUAL;\r\n this.setDepthFunction(Constants.GEQUAL);\r\n }\r\n\r\n const clear2 = _native.Engine.COMMAND_CLEAR2;\r\n this._commandBufferEncoder.startEncodingCommand(clear2 ?? _native.Engine.COMMAND_CLEAR);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(backBuffer && color && this._clearAttachmentMask !== 0 ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(color ? color.r : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(color ? color.g : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(color ? color.b : 0);\r\n // Playgrounds often assign Color3 to scene.clearColor; Color3 has no .a, so\r\n // `color.a` is undefined and was encoded as 0 → transparent clear. PNG\r\n // screenshots then show black sky on dark HTML backgrounds while RGB still\r\n // matches (pixel compare ignores alpha). Default missing alpha to opaque.\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(color ? (color.a ?? 1) : 1);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(depth ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(depth && this.useReverseDepthBuffer ? 0 : 1);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(stencil ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(stencilClearValue);\r\n if (clear2) {\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(this._clearAttachmentMask);\r\n }\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override createIndexBuffer(indices: IndicesArray, updateable?: boolean, _label?: string): NativeDataBuffer {\r\n const data = this._normalizeIndexData(indices);\r\n const buffer = new NativeDataBuffer();\r\n buffer.references = 1;\r\n buffer.is32Bits = data.BYTES_PER_ELEMENT === 4;\r\n if (data.byteLength) {\r\n buffer.nativeIndexBuffer = this._engine.createIndexBuffer(data.buffer, data.byteOffset, data.byteLength, buffer.is32Bits, updateable ?? false);\r\n }\r\n return buffer;\r\n }\r\n\r\n public override createVertexBuffer(vertices: DataArray, updateable?: boolean, _label?: string): NativeDataBuffer {\r\n const data = ArrayBuffer.isView(vertices) ? vertices : new Float32Array(vertices);\r\n const buffer = new NativeDataBuffer();\r\n buffer.references = 1;\r\n if (data.byteLength) {\r\n buffer.nativeVertexBuffer = this._engine.createVertexBuffer(data.buffer, data.byteOffset, data.byteLength, updateable ?? false);\r\n }\r\n return buffer;\r\n }\r\n\r\n private _recordVertexArrayObject(\r\n vertexArray: any,\r\n vertexBuffers: { [key: string]: VertexBuffer },\r\n indexBuffer: Nullable<NativeDataBuffer>,\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable<VertexBuffer> }\r\n ): void {\r\n if (!effect._checkedNonFloatVertexBuffers) {\r\n checkNonFloatVertexBuffers(vertexBuffers, effect);\r\n effect._checkedNonFloatVertexBuffers = true;\r\n }\r\n\r\n if (indexBuffer) {\r\n this._engine.recordIndexBuffer(vertexArray, indexBuffer.nativeIndexBuffer!);\r\n }\r\n\r\n const attributes = effect.getAttributesNames();\r\n for (let index = 0; index < attributes.length; index++) {\r\n const location = effect.getAttributeLocation(index);\r\n if (location >= 0) {\r\n const kind = attributes[index];\r\n let vertexBuffer: Nullable<VertexBuffer> = null;\r\n\r\n if (overrideVertexBuffers) {\r\n vertexBuffer = overrideVertexBuffers[kind];\r\n }\r\n if (!vertexBuffer) {\r\n vertexBuffer = vertexBuffers[kind];\r\n }\r\n\r\n if (vertexBuffer) {\r\n const buffer = vertexBuffer.effectiveBuffer as Nullable<NativeDataBuffer>;\r\n if (buffer && buffer.nativeVertexBuffer) {\r\n this._engine.recordVertexBuffer(\r\n vertexArray,\r\n buffer.nativeVertexBuffer,\r\n location,\r\n vertexBuffer.effectiveByteOffset,\r\n vertexBuffer.effectiveByteStride,\r\n vertexBuffer.getSize(),\r\n getNativeAttribType(vertexBuffer.type),\r\n vertexBuffer.normalized,\r\n vertexBuffer.getInstanceDivisor()\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public override bindBuffers(vertexBuffers: { [key: string]: VertexBuffer }, indexBuffer: Nullable<NativeDataBuffer>, effect: Effect): void {\r\n if (this._boundBuffersVertexArray) {\r\n this._deleteVertexArray(this._boundBuffersVertexArray);\r\n }\r\n this._boundBuffersVertexArray = this._engine.createVertexArray();\r\n this._recordVertexArrayObject(this._boundBuffersVertexArray, vertexBuffers, indexBuffer, effect);\r\n this.bindVertexArrayObject(this._boundBuffersVertexArray);\r\n }\r\n\r\n public override recordVertexArrayObject(\r\n vertexBuffers: { [key: string]: VertexBuffer },\r\n indexBuffer: Nullable<NativeDataBuffer>,\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable<VertexBuffer> }\r\n ): WebGLVertexArrayObject {\r\n const vertexArray = this._engine.createVertexArray();\r\n this._recordVertexArrayObject(vertexArray, vertexBuffers, indexBuffer, effect, overrideVertexBuffers);\r\n return vertexArray;\r\n }\r\n\r\n private _deleteVertexArray(vertexArray: NativeVertexArrayObject) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DELETEVERTEXARRAY);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(vertexArray);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override bindVertexArrayObject(vertexArray: WebGLVertexArrayObject): void {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_BINDVERTEXARRAY);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(vertexArray as NativeVertexArrayObject);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /** @internal Native vertex arrays capture their buffers when recorded; there is no bound array buffer. */\r\n public override bindArrayBuffer(_buffer: Nullable<DataBuffer>): void {}\r\n\r\n public override releaseVertexArrayObject(vertexArray: WebGLVertexArrayObject) {\r\n this._deleteVertexArray(vertexArray as NativeVertexArrayObject);\r\n }\r\n\r\n public override getAttributes(pipelineContext: IPipelineContext, attributesNames: string[]): number[] {\r\n const nativePipelineContext = pipelineContext as NativePipelineContext;\r\n const nativeShaderProcessingContext = nativePipelineContext.shaderProcessingContext!;\r\n\r\n remappedAttributesNames.length = 0;\r\n for (let index = 0; index < attributesNames.length; index++) {\r\n const origAttributeName = attributesNames[index];\r\n const attributeName = nativeShaderProcessingContext.remappedAttributeNames[origAttributeName] ?? origAttributeName;\r\n remappedAttributesNames[index] = attributeName;\r\n }\r\n return this._engine.getAttributes(nativePipelineContext.program, remappedAttributesNames);\r\n }\r\n\r\n /**\r\n * Check whether the runtime can expand primitive modes unavailable in modern rendering APIs.\r\n * @param fillMode defines the primitive to use\r\n * @returns true if supported\r\n */\r\n private _checkSupportedFillMode(fillMode: number): boolean {\r\n if (fillMode == Constants.MATERIAL_LineLoopDrawMode || fillMode == Constants.MATERIAL_TriangleFanDrawMode) {\r\n if (this._engine.supportsPrimitiveModeExpansion) {\r\n return true;\r\n }\r\n if (!this._fillModeWarningDisplayed) {\r\n Logger.Warn(\"Line Loop and Triangle Fan are not supported fill modes with Babylon Native. Elements with these fill mode will not be visible.\");\r\n this._fillModeWarningDisplayed = true;\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Draw a list of indexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public override drawElementsType(fillMode: number, indexStart: number, indexCount: number, instancesCount?: number): void {\r\n if (!this._checkSupportedFillMode(fillMode)) {\r\n return;\r\n }\r\n // Apply states\r\n this._flushDepthTestState();\r\n this._drawCalls.addCount(1, false);\r\n\r\n if (instancesCount) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DRAWINDEXEDINSTANCED);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(fillMode);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(indexStart);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(indexCount);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(instancesCount);\r\n } else {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DRAWINDEXED);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(fillMode);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(indexStart);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(indexCount);\r\n }\r\n\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public override drawArraysType(fillMode: number, verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n if (this._transformFeedbackActive) {\r\n // The native engine runs the transform feedback program over the bound vertex array\r\n // and writes the captured varyings into the bound feedback buffer.\r\n const target = this._transformFeedbackBuffer?.nativeVertexBuffer;\r\n if (!target) {\r\n throw new Error(\"Transform feedback requires a bound native vertex buffer.\");\r\n }\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DRAWTRANSFORMFEEDBACK!);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(target);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(verticesStart);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(verticesCount);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return;\r\n }\r\n\r\n if (!this._checkSupportedFillMode(fillMode)) {\r\n return;\r\n }\r\n // Apply states\r\n this._flushDepthTestState();\r\n this._drawCalls.addCount(1, false);\r\n\r\n if (instancesCount) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DRAWINSTANCED);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(fillMode);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(verticesStart);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(verticesCount);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(instancesCount);\r\n } else {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DRAW);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(fillMode);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(verticesStart);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(verticesCount);\r\n }\r\n\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /** @internal Transform feedback objects are implicit on native; state lives on the engine. */\r\n public createTransformFeedback(): WebGLTransformFeedback {\r\n return {} as WebGLTransformFeedback;\r\n }\r\n\r\n /** @internal */\r\n public deleteTransformFeedback(_value: WebGLTransformFeedback): void {}\r\n\r\n /** @internal */\r\n public bindTransformFeedback(_value: Nullable<WebGLTransformFeedback>): void {}\r\n\r\n /** @internal */\r\n public bindTransformFeedbackBuffer(value: Nullable<DataBuffer>): void {\r\n this._transformFeedbackBuffer = value as Nullable<NativeDataBuffer>;\r\n }\r\n\r\n /** @internal Varyings are passed to the native program when it is created. */\r\n public setTranformFeedbackVaryings(_program: WebGLProgram, _value: string[]): void {}\r\n\r\n /** @internal */\r\n public beginTransformFeedback(_usePoints: boolean = true): void {\r\n this._transformFeedbackActive = true;\r\n }\r\n\r\n /** @internal */\r\n public endTransformFeedback(): void {\r\n this._transformFeedbackActive = false;\r\n }\r\n\r\n /** @internal */\r\n public readTransformFeedbackBuffer(target: ArrayBufferView): void {\r\n const buffer = this._transformFeedbackBuffer?.nativeVertexBuffer;\r\n if (!buffer) {\r\n throw new Error(\"Reading transform feedback requires a bound native vertex buffer.\");\r\n }\r\n if (!this._engine.readTransformFeedbackBuffer) {\r\n throw new Error(\"This native engine build does not support reading transform feedback buffers.\");\r\n }\r\n this._engine.readTransformFeedbackBuffer(buffer, target.buffer, target.byteOffset, target.byteLength);\r\n }\r\n\r\n /** @internal Transform feedback draws never rasterize on native. */\r\n public setRasterizerState(_value: boolean): void {}\r\n\r\n public override createPipelineContext(shaderProcessingContext: Nullable<_IShaderProcessingContext>): IPipelineContext {\r\n const isAsync = !!this._caps.parallelShaderCompile;\r\n return new NativePipelineContext(this, isAsync, shaderProcessingContext as Nullable<NativeShaderProcessingContext>);\r\n }\r\n\r\n public override createMaterialContext(): IMaterialContext | undefined {\r\n return undefined;\r\n }\r\n\r\n public override createDrawContext(): IDrawContext | undefined {\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Function is not technically Async\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public override _preparePipelineContextAsync(\r\n pipelineContext: IPipelineContext,\r\n vertexSourceCode: string,\r\n fragmentSourceCode: string,\r\n createAsRaw: boolean,\r\n _rawVertexSourceCode: string,\r\n _rawFragmentSourceCode: string,\r\n _rebuildRebind: any,\r\n defines: Nullable<string>,\r\n transformFeedbackVaryings: Nullable<string[]>,\r\n _key: string,\r\n onReady: () => void\r\n ) {\r\n if (createAsRaw) {\r\n this.createRawShaderProgram();\r\n } else {\r\n this.createShaderProgram(pipelineContext, vertexSourceCode, fragmentSourceCode, defines, undefined, transformFeedbackVaryings);\r\n }\r\n\r\n onReady();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _getShaderProcessingContext(shaderLanguage: ShaderLanguage): Nullable<_IShaderProcessingContext> {\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n throw new Error(\"NativeEngine does not support WGSL graphics shaders.\");\r\n }\r\n return new NativeShaderProcessingContext();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _executeWhenRenderingStateIsCompiled(pipelineContext: IPipelineContext, action: () => void) {\r\n const nativePipelineContext = pipelineContext as NativePipelineContext;\r\n if (nativePipelineContext.isAsync) {\r\n if (nativePipelineContext.onCompiled) {\r\n const oldHandler = nativePipelineContext.onCompiled;\r\n nativePipelineContext.onCompiled = () => {\r\n oldHandler();\r\n action();\r\n };\r\n } else {\r\n nativePipelineContext.onCompiled = action;\r\n }\r\n } else {\r\n action();\r\n }\r\n }\r\n\r\n public override createRawShaderProgram(): WebGLProgram {\r\n throw new Error(\"Not Supported\");\r\n }\r\n\r\n public override createShaderProgram(\r\n pipelineContext: IPipelineContext,\r\n vertexCode: string,\r\n fragmentCode: string,\r\n defines: Nullable<string>,\r\n _context?: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable<string[]> = null\r\n ): WebGLProgram {\r\n const varyings = transformFeedbackVaryings?.length ? transformFeedbackVaryings : undefined;\r\n if (varyings && !_native.Engine.COMMAND_DRAWTRANSFORMFEEDBACK) {\r\n throw new Error(\"This native engine build does not support transform feedback.\");\r\n }\r\n\r\n const nativePipelineContext = pipelineContext as NativePipelineContext;\r\n\r\n this.onBeforeShaderCompilationObservable.notifyObservers(this);\r\n\r\n const vertexInliner = new ShaderCodeInliner(vertexCode);\r\n vertexInliner.processCode();\r\n vertexCode = vertexInliner.code;\r\n\r\n const fragmentInliner = new ShaderCodeInliner(fragmentCode);\r\n fragmentInliner.processCode();\r\n fragmentCode = fragmentInliner.code;\r\n\r\n vertexCode = ThinEngine._ConcatenateShader(vertexCode, defines);\r\n fragmentCode = ThinEngine._ConcatenateShader(fragmentCode, defines);\r\n\r\n const onSuccess = () => {\r\n nativePipelineContext.isCompiled = true;\r\n nativePipelineContext.onCompiled?.();\r\n this.onAfterShaderCompilationObservable.notifyObservers(this);\r\n };\r\n\r\n if (pipelineContext.isAsync) {\r\n nativePipelineContext.program = this._engine.createProgramAsync(\r\n vertexCode,\r\n fragmentCode,\r\n onSuccess,\r\n (error: Error) => {\r\n nativePipelineContext.compilationError = error;\r\n },\r\n varyings\r\n );\r\n } else {\r\n try {\r\n nativePipelineContext.program = this._engine.createProgram(vertexCode, fragmentCode, varyings);\r\n onSuccess();\r\n } catch (e) {\r\n const message = e?.message;\r\n throw new Error(\"SHADER ERROR\" + (typeof message === \"string\" ? \"\\n\" + message : \"\"), { cause: e });\r\n }\r\n }\r\n\r\n return nativePipelineContext.program as WebGLProgram;\r\n }\r\n\r\n /**\r\n * Inline functions in shader code that are marked to be inlined\r\n * @param code code to inline\r\n * @returns inlined code\r\n */\r\n public override inlineShaderCode(code: string): string {\r\n const sci = new ShaderCodeInliner(code);\r\n sci.debug = false;\r\n sci.processCode();\r\n return sci.code;\r\n }\r\n\r\n protected override _setProgram(program: WebGLProgram): void {\r\n if (this._currentProgram !== program) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETPROGRAM);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(program as NativeProgram);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n this._currentProgram = program;\r\n }\r\n }\r\n\r\n public override _deletePipelineContext(pipelineContext: IPipelineContext): void {\r\n const nativePipelineContext = pipelineContext as NativePipelineContext;\r\n if (nativePipelineContext && nativePipelineContext.program) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DELETEPROGRAM);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(nativePipelineContext.program);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n }\r\n\r\n public override getUniforms(pipelineContext: IPipelineContext, uniformsNames: string[]): WebGLUniformLocation[] {\r\n const nativePipelineContext = pipelineContext as NativePipelineContext;\r\n return this._engine.getUniforms(nativePipelineContext.program, uniformsNames);\r\n }\r\n\r\n public override bindUniformBlock(pipelineContext: IPipelineContext, blockName: string, index: number): void {\r\n // TODO\r\n throw new Error(\"Not Implemented\");\r\n }\r\n\r\n public override bindSamplers(effect: Effect): void {\r\n const nativePipelineContext = effect.getPipelineContext() as NativePipelineContext;\r\n this._setProgram(nativePipelineContext.program as WebGLProgram);\r\n\r\n // TODO: share this with engine?\r\n const samplers = effect.getSamplers();\r\n for (let index = 0; index < samplers.length; index++) {\r\n const uniform = effect.getUniform(samplers[index]);\r\n\r\n if (uniform) {\r\n this._boundUniforms[index] = uniform;\r\n }\r\n }\r\n this._currentEffect = null;\r\n }\r\n\r\n public override getRenderWidth(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.width;\r\n }\r\n\r\n return this._engine.getRenderWidth();\r\n }\r\n\r\n public override getRenderHeight(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.height;\r\n }\r\n\r\n return this._engine.getRenderHeight();\r\n }\r\n\r\n public override setViewport(viewport: IViewportLike, requiredWidth?: number, requiredHeight?: number): void {\r\n this._cachedViewport = viewport;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETVIEWPORT);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(viewport.x);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(viewport.y);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(viewport.width);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(viewport.height);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override setStateCullFaceType(cullBackFaces?: boolean, force?: boolean): void {\r\n const cullBack = this.cullBackFaces ?? cullBackFaces ?? true;\r\n if (this._cachedCullBackFaces === cullBack && !force) {\r\n return;\r\n }\r\n this._cachedCullBackFaces = cullBack;\r\n\r\n // Native uses an immediate command-buffer state model (no lazy _depthCullingState), so\r\n // re-issue the last COMMAND_SETSTATE payload with only the cull face changed. The zOffset\r\n // values are the ones that command actually encoded rather than the live _zOffset fields,\r\n // which setZOffset()/setZOffsetUnits() can update independently (and encode with the\r\n // opposite sign under a reverse depth buffer).\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETSTATE);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(this._cachedCulling ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(this._cachedZOffset);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(this._cachedZOffsetUnits);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(cullBack ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(this._cachedReverseSide ? 1 : 0);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override setState(\r\n culling: boolean,\r\n zOffset: number = 0,\r\n force?: boolean,\r\n reverseSide = false,\r\n cullBackFaces?: boolean,\r\n stencil?: IStencilState,\r\n zOffsetUnits: number = 0\r\n ): void {\r\n this._zOffset = zOffset;\r\n this._zOffsetUnits = zOffsetUnits;\r\n if (this._zOffset !== 0) {\r\n Logger.Warn(\"zOffset is not supported in Native engine.\");\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETSTATE);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(culling ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(zOffset);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(zOffsetUnits);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32((this.cullBackFaces ?? cullBackFaces ?? true) ? 1 : 0);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(reverseSide ? 1 : 0);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n\r\n // Cache the resolved state so setStateCullFaceType() can re-issue it with a new cull face.\r\n this._cachedCulling = culling;\r\n this._cachedReverseSide = reverseSide;\r\n this._cachedCullBackFaces = this.cullBackFaces ?? cullBackFaces ?? true;\r\n this._cachedZOffset = zOffset;\r\n this._cachedZOffsetUnits = zOffsetUnits;\r\n }\r\n\r\n /**\r\n * Gets the client rect of native canvas. Needed for InputManager.\r\n * @returns a client rectangle\r\n */\r\n public override getInputElementClientRect(): Nullable<DOMRect> {\r\n const rect = {\r\n bottom: this.getRenderHeight(),\r\n height: this.getRenderHeight(),\r\n left: 0,\r\n right: this.getRenderWidth(),\r\n top: 0,\r\n width: this.getRenderWidth(),\r\n x: 0,\r\n y: 0,\r\n toJSON: () => {},\r\n };\r\n return rect;\r\n }\r\n\r\n /**\r\n * Set the z offset Factor to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public override setZOffset(value: number): void {\r\n if (value !== this._zOffset) {\r\n this._zOffset = value;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETZOFFSET);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(this.useReverseDepthBuffer ? -value : value);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Factor\r\n * @returns the current zOffset Factor state\r\n */\r\n public override getZOffset(): number {\r\n return this._zOffset;\r\n }\r\n\r\n /**\r\n * Set the z offset Units to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public override setZOffsetUnits(value: number): void {\r\n if (value !== this._zOffsetUnits) {\r\n this._zOffsetUnits = value;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETZOFFSETUNITS);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(this.useReverseDepthBuffer ? -value : value);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Units\r\n * @returns the current zOffset Units state\r\n */\r\n public override getZOffsetUnits(): number {\r\n return this._zOffsetUnits;\r\n }\r\n\r\n /**\r\n * Enable or disable depth buffering\r\n * @param enable defines the state to set\r\n */\r\n public override setDepthBuffer(enable: boolean): void {\r\n // Keep the shared depth-culling state in sync so that code paths which toggle\r\n // depth testing through engine.depthCullingState.depthTest (for example\r\n // EffectRenderer.applyEffectWrapper) are also honored on the native side. The\r\n // native draw path does not go through the WebGL applyStates() flush, so the\r\n // value is reconciled in _flushDepthTestState() right before each draw.\r\n this._depthCullingState.depthTest = enable;\r\n this._encodeDepthTest(enable);\r\n }\r\n\r\n private _encodeDepthTest(enable: boolean): void {\r\n this._depthTestEnabled = enable;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETDEPTHTEST);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(enable ? this._currentDepthTest : _native.Engine.DEPTH_TEST_ALWAYS);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n private _flushDepthTestState(): void {\r\n // Unlike the WebGL engine, the native engine does not call applyStates() before\r\n // a draw, so depth-test toggles made directly on engine.depthCullingState are\r\n // flushed here to match the cross-engine contract.\r\n // Reconcile the depth compare function too: features that set it directly on\r\n // depthCullingState (e.g. reverse depth buffer -> GEQUAL) never go through\r\n // setDepthFunction, so push any divergence to the native side here. setDepthFunction\r\n // also re-encodes the depth-test enable, so no separate enable flush is needed after.\r\n const targetFunc = this._depthCullingState.depthFunc;\r\n if (targetFunc && targetFunc !== this.getDepthFunction()) {\r\n this.setDepthFunction(targetFunc);\r\n return;\r\n }\r\n if (this._depthCullingState.depthTest !== this._depthTestEnabled) {\r\n this._encodeDepthTest(this._depthCullingState.depthTest);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if depth writing is enabled\r\n * @returns the current depth writing state\r\n */\r\n public override getDepthWrite(): boolean {\r\n return this._depthWrite;\r\n }\r\n\r\n public override getDepthFunction(): Nullable<number> {\r\n switch (this._currentDepthTest) {\r\n case _native.Engine.DEPTH_TEST_NEVER:\r\n return Constants.NEVER;\r\n case _native.Engine.DEPTH_TEST_ALWAYS:\r\n return Constants.ALWAYS;\r\n case _native.Engine.DEPTH_TEST_GREATER:\r\n return Constants.GREATER;\r\n case _native.Engine.DEPTH_TEST_GEQUAL:\r\n return Constants.GEQUAL;\r\n case _native.Engine.DEPTH_TEST_NOTEQUAL:\r\n return Constants.NOTEQUAL;\r\n case _native.Engine.DEPTH_TEST_EQUAL:\r\n return Constants.EQUAL;\r\n case _native.Engine.DEPTH_TEST_LESS:\r\n return Constants.LESS;\r\n case _native.Engine.DEPTH_TEST_LEQUAL:\r\n return Constants.LEQUAL;\r\n }\r\n return null;\r\n }\r\n\r\n public override setDepthFunction(depthFunc: number) {\r\n // Keep the shared depth-culling state in sync (the base impl sets this) so the\r\n // per-draw reconcile in _flushDepthTestState treats material-driven changes as a\r\n // no-op and only pushes divergences that bypass this method (e.g. reverse depth).\r\n this._depthCullingState.depthFunc = depthFunc;\r\n let nativeDepthFunc = 0;\r\n switch (depthFunc) {\r\n case Constants.NEVER:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_NEVER;\r\n break;\r\n case Constants.ALWAYS:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_ALWAYS;\r\n break;\r\n case Constants.GREATER:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_GREATER;\r\n break;\r\n case Constants.GEQUAL:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_GEQUAL;\r\n break;\r\n case Constants.NOTEQUAL:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_NOTEQUAL;\r\n break;\r\n case Constants.EQUAL:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_EQUAL;\r\n break;\r\n case Constants.LESS:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_LESS;\r\n break;\r\n case Constants.LEQUAL:\r\n nativeDepthFunc = _native.Engine.DEPTH_TEST_LEQUAL;\r\n break;\r\n }\r\n\r\n this._currentDepthTest = nativeDepthFunc;\r\n // Route through _encodeDepthTest so the tracked _depthTestEnabled state stays in\r\n // sync with the encoded command. Because COMMAND_SETDEPTHTEST conflates the\r\n // compare function and the enable bit (DEPTH_TEST_ALWAYS == disabled), encoding\r\n // the new function directly here would silently re-enable depth testing while\r\n // depth testing is logically disabled; _encodeDepthTest honors the current\r\n // depthCullingState.depthTest and only emits the new function when enabled.\r\n this._encodeDepthTest(this._depthCullingState.depthTest);\r\n }\r\n\r\n /**\r\n * Enable or disable depth writing\r\n * @param enable defines the state to set\r\n */\r\n public override setDepthWrite(enable: boolean): void {\r\n this._depthWrite = enable;\r\n // Keep depthCullingState.depthMask in sync. applyStates() reconciles native depth write\r\n // from depthMask; if it stays true after setDepthWrite(false), the next applyStates()\r\n // (e.g. during particle/material draws) silently turns WRITE_Z back on. Coplanar\r\n // triangle-strip particle quads then lose the second tri to DEPTH_LESS.\r\n if (this._depthCullingState) {\r\n this._depthCullingState.depthMask = enable;\r\n }\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETDEPTHWRITE);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(Number(enable));\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Enable or disable color writing\r\n * @param enable defines the state to set\r\n */\r\n public override setColorWrite(enable: boolean): void {\r\n this._colorWrite = enable;\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETCOLORWRITE);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(Number(enable));\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if color writing is enabled\r\n * @returns the current color writing state\r\n */\r\n public override getColorWrite(): boolean {\r\n return this._colorWrite;\r\n }\r\n\r\n /**\r\n * Apply the currently pending engine states.\r\n *\r\n * The base ThinEngine.applyStates() flushes state by calling\r\n * this._depthCullingState.apply(this._gl) (and similar for alpha/stencil), but the\r\n * native engine has no WebGL context (_gl is undefined), so inheriting that path\r\n * throws \"Cannot read properties of undefined (reading 'depthMask')\". Callers such\r\n * as the depth-peeling (OIT) renderer mutate engine.depthCullingState directly and\r\n * then call applyStates() expecting the change to be flushed, so reconcile the shared\r\n * depth-culling state into the native command buffer here instead. Alpha and stencil\r\n * states are already encoded immediately on the native side (setAlphaMode /\r\n * setStencil* emit commands directly), so only the depth state needs reconciling.\r\n */\r\n public override applyStates(): void {\r\n // Depth test (the native command conflates enable + compare function).\r\n this._flushDepthTestState();\r\n\r\n // Depth write (depthMask).\r\n if (this._depthCullingState.depthMask !== this._depthWrite) {\r\n this.setDepthWrite(this._depthCullingState.depthMask);\r\n }\r\n }\r\n\r\n private applyStencil(): void {\r\n if (!this._stencilTest) {\r\n return;\r\n }\r\n\r\n this._setStencil(\r\n this._stencilMask,\r\n getNativeStencilOpFail(this._stencilOpStencilFail),\r\n getNativeStencilDepthFail(this._stencilOpDepthFail),\r\n getNativeStencilDepthPass(this._stencilOpStencilDepthPass),\r\n getNativeStencilFunc(this._stencilFunc),\r\n this._stencilFuncRef,\r\n this._stencilFuncMask\r\n );\r\n }\r\n\r\n private _setStencil(mask: number, stencilOpFail: number, depthOpFail: number, depthOpPass: number, func: number, ref: number, funcMask: number = 0xff) {\r\n const setStencil2 = _native.Engine.COMMAND_SETSTENCIL2;\r\n this._commandBufferEncoder.startEncodingCommand(setStencil2 ?? _native.Engine.COMMAND_SETSTENCIL);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(mask);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(stencilOpFail);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(depthOpFail);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(depthOpPass);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(func);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(ref);\r\n // Stencil function mask (gl.stencilFunc mask / BGFX_STENCIL_FUNC_RMASK). Required for\r\n // HighlightLayer, which compares only the glowing-mesh reference bits while ignoring\r\n // lower reserved bits. Without this, Native always used 0xFF and the outer/inner glow\r\n // stencil tests matched the wrong fragments.\r\n if (setStencil2) {\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(funcMask & 0xff);\r\n }\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n /**\r\n * Enable or disable the stencil buffer\r\n * @param enable defines if the stencil buffer must be enabled or disabled\r\n */\r\n public override setStencilBuffer(enable: boolean): void {\r\n this._stencilTest = enable;\r\n if (enable) {\r\n this.applyStencil();\r\n } else {\r\n this._setStencil(\r\n 255,\r\n _native.Engine.STENCIL_OP_FAIL_S_KEEP,\r\n _native.Engine.STENCIL_OP_FAIL_Z_KEEP,\r\n _native.Engine.STENCIL_OP_PASS_Z_KEEP,\r\n _native.Engine.STENCIL_TEST_ALWAYS,\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if stencil buffer is enabled\r\n * @returns the current stencil buffer state\r\n */\r\n public override getStencilBuffer(): boolean {\r\n return this._stencilTest;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when stencil passes\r\n * @returns a number defining stencil operation to use when stencil passes\r\n */\r\n public override getStencilOperationPass(): number {\r\n return this._stencilOpStencilDepthPass;\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when stencil passes\r\n * @param operation defines the stencil operation to use when stencil passes\r\n */\r\n public override setStencilOperationPass(operation: number): void {\r\n this._stencilOpStencilDepthPass = operation;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the current stencil mask\r\n * @param mask defines the new stencil mask to use\r\n */\r\n public override setStencilMask(mask: number): void {\r\n this._stencilMask = mask;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the current stencil function\r\n * @param stencilFunc defines the new stencil function to use\r\n */\r\n public override setStencilFunction(stencilFunc: number) {\r\n this._stencilFunc = stencilFunc;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the current stencil reference\r\n * @param reference defines the new stencil reference to use\r\n */\r\n public override setStencilFunctionReference(reference: number) {\r\n this._stencilFuncRef = reference;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the current stencil function mask\r\n * @param mask defines the new stencil function mask to use\r\n */\r\n public override setStencilFunctionMask(mask: number) {\r\n this._stencilFuncMask = mask;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when stencil fails\r\n * @param operation defines the stencil operation to use when stencil fails\r\n */\r\n public override setStencilOperationFail(operation: number): void {\r\n this._stencilOpStencilFail = operation;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when depth fails\r\n * @param operation defines the stencil operation to use when depth fails\r\n */\r\n public override setStencilOperationDepthFail(operation: number): void {\r\n this._stencilOpDepthFail = operation;\r\n this.applyStencil();\r\n }\r\n\r\n /**\r\n * Gets the current stencil mask\r\n * @returns a number defining the new stencil mask to use\r\n */\r\n public override getStencilMask(): number {\r\n return this._stencilMask;\r\n }\r\n\r\n /**\r\n * Gets the current stencil function\r\n * @returns a number defining the stencil function to use\r\n */\r\n public override getStencilFunction(): number {\r\n return this._stencilFunc;\r\n }\r\n\r\n /**\r\n * Gets the current stencil reference value\r\n * @returns a number defining the stencil reference value to use\r\n */\r\n public override getStencilFunctionReference(): number {\r\n return this._stencilFuncRef;\r\n }\r\n\r\n /**\r\n * Gets the current stencil mask\r\n * @returns a number defining the stencil mask to use\r\n */\r\n public override getStencilFunctionMask(): number {\r\n return this._stencilFuncMask;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when stencil fails\r\n * @returns a number defining stencil operation to use when stencil fails\r\n */\r\n public override getStencilOperationFail(): number {\r\n return this._stencilOpStencilFail;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when depth fails\r\n * @returns a number defining stencil operation to use when depth fails\r\n */\r\n public override getStencilOperationDepthFail(): number {\r\n return this._stencilOpDepthFail;\r\n }\r\n\r\n /**\r\n * Sets alpha constants used by some alpha blending modes\r\n * @param r defines the red component\r\n * @param g defines the green component\r\n * @param b defines the blue component\r\n * @param a defines the alpha component\r\n */\r\n public override setAlphaConstants(r: number, g: number, b: number, a: number) {\r\n throw new Error(\"Setting alpha blend constant color not yet implemented.\");\r\n }\r\n\r\n /**\r\n * Sets the current alpha mode\r\n * @param mode defines the mode to use (one of the BABYLON.Constants.ALPHA_XXX)\r\n * @param noDepthWriteChange defines if depth writing state should remains unchanged (false by default)\r\n * @param targetIndex defines the index of the target to set the alpha mode for (default is 0)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering\r\n */\r\n public override setAlphaMode(mode: number, noDepthWriteChange: boolean = false, targetIndex = 0): void {\r\n if (this._alphaMode[targetIndex] === mode) {\r\n return;\r\n }\r\n\r\n const nativeMode = getNativeAlphaMode(mode);\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETBLENDMODE);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(nativeMode);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n\r\n if (!noDepthWriteChange) {\r\n this.setDepthWrite(mode === Constants.ALPHA_DISABLE);\r\n }\r\n\r\n this._alphaMode[targetIndex] = mode;\r\n }\r\n\r\n /**\r\n * Sets the current alpha blend equation (ADD / SUB / MAX / MIN / ...).\r\n * Dual depth peeling (OIT) requires ALPHA_EQUATION_MAX so peel passes accumulate\r\n * farthest/nearest depths. Native previously only wired blend *factors*; equations\r\n * stayed at bgfx's default ADD and transparent peels never wrote useful depth.\r\n * @param equation one of Constants.ALPHA_EQUATION_*\r\n * @param targetIndex MRT attachment index (Native applies equation globally; kept for API parity)\r\n */\r\n public override setAlphaEquation(equation: number, targetIndex: number = 0): void {\r\n if (this._alphaEquation[targetIndex] === equation) {\r\n return;\r\n }\r\n\r\n this._alphaEquation[targetIndex] = equation;\r\n\r\n const command = _native.Engine.COMMAND_SETBLENDEQUATION;\r\n if (!command) {\r\n // Older Babylon Native binaries predating blend-equation support.\r\n return;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(command);\r\n // Pass the Babylon Constants.ALPHA_EQUATION_* value; NativeEngine::SetBlendEquation maps it to bgfx.\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(equation);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n public override setInt(uniform: WebGLUniformLocation, int: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETINT);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsInt32(int);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setInt2(uniform: Nullable<WebGLUniformLocation>, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n const values = this._int2Scratch;\r\n values[0] = x;\r\n values[1] = y;\r\n return this.setIntArray2(uniform, values);\r\n }\r\n\r\n public override setInt3(uniform: Nullable<WebGLUniformLocation>, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n const values = this._int3Scratch;\r\n values[0] = x;\r\n values[1] = y;\r\n values[2] = z;\r\n return this.setIntArray3(uniform, values);\r\n }\r\n\r\n public override setInt4(uniform: Nullable<WebGLUniformLocation>, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n const values = this._int4Scratch;\r\n values[0] = x;\r\n values[1] = y;\r\n values[2] = z;\r\n values[3] = w;\r\n return this.setIntArray4(uniform, values);\r\n }\r\n\r\n public override setIntArray(uniform: WebGLUniformLocation, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETINTARRAY);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsInt32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setIntArray2(uniform: WebGLUniformLocation, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETINTARRAY2);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsInt32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setIntArray3(uniform: WebGLUniformLocation, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETINTARRAY3);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsInt32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setIntArray4(uniform: WebGLUniformLocation, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETINTARRAY4);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsInt32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public setFloatArray(uniform: WebGLUniformLocation, array: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOATARRAY);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public setFloatArray2(uniform: WebGLUniformLocation, array: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOATARRAY2);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public setFloatArray3(uniform: WebGLUniformLocation, array: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOATARRAY3);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public setFloatArray4(uniform: WebGLUniformLocation, array: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOATARRAY4);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(array);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setArray(uniform: WebGLUniformLocation, array: number[]): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n return this.setFloatArray(uniform, new Float32Array(array));\r\n }\r\n\r\n public override setArray2(uniform: WebGLUniformLocation, array: number[]): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n return this.setFloatArray2(uniform, new Float32Array(array));\r\n }\r\n\r\n public override setArray3(uniform: WebGLUniformLocation, array: number[]): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n return this.setFloatArray3(uniform, new Float32Array(array));\r\n }\r\n\r\n public override setArray4(uniform: WebGLUniformLocation, array: number[]): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n return this.setFloatArray4(uniform, new Float32Array(array));\r\n }\r\n\r\n public override setMatrices(uniform: WebGLUniformLocation, matrices: DeepImmutable<FloatArray>): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETMATRICES);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(matrices);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n\r\n return true;\r\n }\r\n\r\n public override setMatrix3x3(uniform: WebGLUniformLocation, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETMATRIX3X3);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(matrix);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setMatrix2x2(uniform: WebGLUniformLocation, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETMATRIX2X2);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32s(matrix);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setFloat(uniform: WebGLUniformLocation, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOAT);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(value);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setFloat2(uniform: WebGLUniformLocation, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOAT2);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(x);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(y);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setFloat3(uniform: WebGLUniformLocation, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOAT3);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(x);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(y);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(z);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public override setFloat4(uniform: WebGLUniformLocation, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETFLOAT4);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform as any as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(x);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(y);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(z);\r\n this._commandBufferEncoder.encodeCommandArgAsFloat32(w);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n return true;\r\n }\r\n\r\n public setColor3(uniform: WebGLUniformLocation, color3: IColor3Like): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this.setFloat3(uniform, color3.r, color3.g, color3.b);\r\n return true;\r\n }\r\n\r\n public setColor4(uniform: WebGLUniformLocation, color3: IColor3Like, alpha: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this.setFloat4(uniform, color3.r, color3.g, color3.b, alpha);\r\n return true;\r\n }\r\n\r\n public override wipeCaches(bruteForce?: boolean): void {\r\n if (this.preventCacheWipeBetweenFrames) {\r\n return;\r\n }\r\n this.resetTextureCache();\r\n this._currentEffect = null;\r\n\r\n if (bruteForce) {\r\n this._currentProgram = null;\r\n\r\n this._stencilStateComposer.reset();\r\n this._depthCullingState.reset();\r\n this._alphaState.reset();\r\n }\r\n\r\n this._cachedVertexBuffers = null;\r\n this._cachedIndexBuffer = null;\r\n this._cachedEffectForVertexBuffers = null;\r\n }\r\n\r\n protected override _createTexture(): WebGLTexture {\r\n return this._engine.createTexture();\r\n }\r\n\r\n protected override _deleteTexture(texture: Nullable<WebGLHardwareTexture>): void {\r\n if (texture) {\r\n this._engine.deleteTexture(texture.underlyingResource as NativeTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Update the content of a dynamic texture\r\n * @param texture defines the texture to update\r\n * @param canvas defines the canvas containing the source\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param premulAlpha defines if alpha is stored as premultiplied\r\n * @param format defines the format of the data\r\n */\r\n public override updateDynamicTexture(texture: Nullable<InternalTexture>, canvas: any, invertY: boolean, premulAlpha: boolean = false, format?: number): void {\r\n if (!!texture && !!texture._hardwareTexture) {\r\n const destination = texture._hardwareTexture.underlyingResource;\r\n const context = canvas.getContext();\r\n // flush need to happen before getCanvasTexture: flush will create the render target synchronously (if it's not been created before)\r\n context.flush();\r\n const source = canvas.getCanvasTexture();\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_COPYTEXTURE);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(source as NativeData);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(destination as NativeData);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n texture.isReady = true;\r\n }\r\n }\r\n\r\n public override createDynamicTexture(width: number, height: number, generateMipMaps: boolean, samplingMode: number): InternalTexture {\r\n // Canvas dimensions are integral in browsers. Coerce before allocating so the native dimensions and byte length agree.\r\n // Keep at least 1x1 because many bgfx methods assume a non-zero texture size.\r\n width = Math.max(Math.floor(width), 1);\r\n height = Math.max(Math.floor(height), 1);\r\n return this.createRawTexture(new Uint8Array(width * height * 4), width, height, Constants.TEXTUREFORMAT_RGBA, false, false, samplingMode);\r\n }\r\n\r\n public override createVideoElement(constraints: MediaTrackConstraints): any {\r\n // create native object depending on stream. Only NativeCamera is supported for now.\r\n if (this._camera) {\r\n return this._camera.createVideo(constraints);\r\n }\r\n return null;\r\n }\r\n\r\n public override updateVideoTexture(texture: Nullable<InternalTexture>, video: HTMLVideoElement, invertY: boolean): void {\r\n if (texture && texture._hardwareTexture && this._camera) {\r\n const webGLTexture = texture._hardwareTexture.underlyingResource;\r\n this._camera.updateVideoTexture(webGLTexture, video, invertY);\r\n }\r\n }\r\n\r\n public override createRawTexture(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable<string> = null,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n creationFlags: number = 0,\r\n useSRGBBuffer: boolean = false\r\n ): InternalTexture {\r\n const texture = new InternalTexture(this, InternalTextureSource.Raw);\r\n\r\n texture.format = format;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.invertY = invertY;\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = texture.baseWidth;\r\n texture.height = texture.baseHeight;\r\n texture._compression = compression;\r\n texture.type = type;\r\n texture._useSRGBBuffer = this._getUseSRGBBuffer(useSRGBBuffer, !generateMipMaps);\r\n\r\n this.updateRawTexture(texture, data, format, invertY, compression, type, texture._useSRGBBuffer);\r\n\r\n if (texture._hardwareTexture) {\r\n const webGLTexture = texture._hardwareTexture.underlyingResource;\r\n const filter = getNativeSamplingMode(samplingMode);\r\n this._setTextureSampling(webGLTexture, filter);\r\n }\r\n\r\n this._internalTexturesCache.push(texture);\r\n return texture;\r\n }\r\n\r\n public override createRawTexture2DArray(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable<string> = null,\r\n textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n ): InternalTexture {\r\n const texture = new InternalTexture(this, InternalTextureSource.Raw2DArray);\r\n\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.baseDepth = depth;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.depth = depth;\r\n texture.format = format;\r\n texture.type = textureType;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.is2DArray = true;\r\n\r\n if (texture._hardwareTexture) {\r\n const nativeTexture = texture._hardwareTexture.underlyingResource;\r\n this._engine.loadRawTexture2DArray(nativeTexture, data, width, height, depth, getNativeTextureFormat(format, textureType), generateMipMaps, invertY);\r\n\r\n const filter = getNativeSamplingMode(samplingMode);\r\n this._setTextureSampling(nativeTexture, filter);\r\n }\r\n\r\n texture.isReady = true;\r\n\r\n this._internalTexturesCache.push(texture);\r\n return texture;\r\n }\r\n\r\n public override createRawTexture3D(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable<string> = null,\r\n textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n ): InternalTexture {\r\n if (compression) {\r\n throw new Error(`NativeEngine.createRawTexture3D: compressed raw volume uploads are not supported (${compression}).`);\r\n }\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.Raw3D);\r\n\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.baseDepth = depth;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.depth = depth;\r\n texture.format = format;\r\n texture.type = textureType;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.is3D = true;\r\n texture.invertY = invertY;\r\n texture._compression = compression;\r\n if (!this._doNotHandleContextLost) {\r\n texture._bufferView = data;\r\n }\r\n\r\n if (texture._hardwareTexture) {\r\n const nativeTexture = texture._hardwareTexture.underlyingResource;\r\n this._engine.loadRawTexture3D(nativeTexture, data, width, height, depth, getNativeTextureFormat(format, textureType), generateMipMaps, invertY);\r\n\r\n const filter = getNativeSamplingMode(samplingMode);\r\n this._setTextureSampling(nativeTexture, filter);\r\n }\r\n\r\n texture.isReady = true;\r\n\r\n this._internalTexturesCache.push(texture);\r\n return texture;\r\n }\r\n\r\n public override updateRawTexture3D(\r\n texture: Nullable<InternalTexture>,\r\n bufferView: Nullable<ArrayBufferView>,\r\n format: number,\r\n invertY: boolean,\r\n compression: Nullable<string> = null,\r\n textureType: number = Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n ): void {\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n if (compression) {\r\n throw new Error(`NativeEngine.updateRawTexture3D: compressed raw volume uploads are not supported (${compression}).`);\r\n }\r\n\r\n texture.format = format;\r\n texture.type = textureType;\r\n texture.invertY = invertY;\r\n texture._compression = compression;\r\n if (!this._doNotHandleContextLost) {\r\n texture._bufferView = bufferView;\r\n }\r\n\r\n if (bufferView && texture._hardwareTexture) {\r\n const nativeTexture = texture._hardwareTexture.underlyingResource;\r\n this._engine.loadRawTexture3D(\r\n nativeTexture,\r\n bufferView,\r\n texture.width,\r\n texture.height,\r\n texture.depth,\r\n getNativeTextureFormat(format, textureType),\r\n texture.generateMipMaps,\r\n invertY\r\n );\r\n }\r\n\r\n texture.isReady = true;\r\n }\r\n\r\n public override updateRawTexture(\r\n texture: Nullable<InternalTexture>,\r\n bufferView: Nullable<ArrayBufferView>,\r\n format: number,\r\n invertY: boolean,\r\n compression: Nullable<string> = null,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n useSRGBBuffer: boolean = false\r\n ): void {\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n if (bufferView && texture._hardwareTexture) {\r\n const underlyingResource = texture._hardwareTexture.underlyingResource;\r\n this._engine.loadRawTexture(\r\n underlyingResource,\r\n bufferView,\r\n texture.width,\r\n texture.height,\r\n getNativeTextureFormat(format, type),\r\n texture.generateMipMaps,\r\n texture.invertY,\r\n useSRGBBuffer\r\n );\r\n }\r\n\r\n texture.isReady = true;\r\n }\r\n\r\n /**\r\n * Creates a raw cube texture on the native engine.\r\n *\r\n * The WebGL implementation (engine.rawTexture) drives the whole upload through `this._gl`, which is null\r\n * on Native, so loading an HDR/`.env` cube via `createRawCubeTextureFromUrl` used to throw\r\n * `Cannot read properties of undefined (reading 'FLOAT')`. This override allocates a native cube texture\r\n * and uploads its faces through the bgfx `updateTextureData` path instead.\r\n *\r\n * Native has no 3-component float texture format, so an RGB float/half-float source (what HDRCubeTexture\r\n * requests) is allocated and uploaded as RGBA; the per-face RGB->RGBA expansion happens in\r\n * `updateRawCubeTexture`.\r\n * @param data defines the data used to create the texture (6 faces, +X +Y +Z -X -Y -Z) or null\r\n * @param size defines the size of the textures (each face is size x size)\r\n * @param format defines the format of the data\r\n * @param type defines the type of the data\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compression used (null by default)\r\n * @returns the cube texture as an InternalTexture\r\n */\r\n public override createRawCubeTexture(\r\n data: Nullable<ArrayBufferView[]>,\r\n size: number,\r\n format: number,\r\n type: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable<string> = null\r\n ): InternalTexture {\r\n if (compression) {\r\n throw new Error(`NativeEngine.createRawCubeTexture: compressed raw cube uploads are not supported (${compression}).`);\r\n }\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.CubeRaw);\r\n texture.isCube = true;\r\n texture.format = format;\r\n texture.type = type;\r\n texture.width = size;\r\n texture.height = size;\r\n texture.baseWidth = size;\r\n texture.baseHeight = size;\r\n texture.invertY = invertY;\r\n texture._compression = compression;\r\n\r\n // Match the WebGL raw-cube path and createRenderTargetCubeTexture: float/half-float formats that the\r\n // platform cannot linearly filter fall back to NEAREST and drop mip generation.\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n generateMipMaps = false;\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n generateMipMaps = false;\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n\r\n const nativeTexture = texture._hardwareTexture!.underlyingResource;\r\n this._engine.initializeTexture(\r\n nativeTexture,\r\n size,\r\n size,\r\n generateMipMaps,\r\n getNativeTextureFormat(format, type),\r\n /*renderTarget*/ false,\r\n /*srgb*/ false,\r\n /*samples*/ 1,\r\n /*isCube*/ true\r\n );\r\n this._setTextureSampling(nativeTexture, getNativeSamplingMode(samplingMode));\r\n\r\n if (data) {\r\n this.updateRawCubeTexture(texture, data, format, type, invertY, compression);\r\n } else {\r\n texture.isReady = true;\r\n }\r\n\r\n // Like WebGL, the cache registration is owned by the caller (e.g. createRawCubeTextureFromUrl).\r\n return texture;\r\n }\r\n\r\n /**\r\n * Updates a raw cube texture on the native engine.\r\n * @param texture defines the texture to update\r\n * @param data defines the data to store (6 faces, +X +Y +Z -X -Y -Z)\r\n * @param format defines the data format\r\n * @param type defines the type of the data\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param compression defines the compression used (null by default)\r\n * @param level defines which mip level of the texture to update (0 by default)\r\n */\r\n public override updateRawCubeTexture(\r\n texture: InternalTexture,\r\n data: ArrayBufferView[],\r\n format: number,\r\n type: number,\r\n invertY: boolean,\r\n compression: Nullable<string> = null,\r\n level: number = 0\r\n ): void {\r\n if (compression) {\r\n throw new Error(`NativeEngine.updateRawCubeTexture: compressed raw cube uploads are not supported (${compression}).`);\r\n }\r\n\r\n const descriptorChanged = texture.format !== format || texture.type !== type;\r\n if (descriptorChanged && level !== 0) {\r\n throw new Error(\"NativeEngine.updateRawCubeTexture: changing the format or type is only supported when updating level 0.\");\r\n }\r\n\r\n const nativeTexture = texture._hardwareTexture?.underlyingResource;\r\n const nativeTextureFormat = descriptorChanged ? getNativeTextureFormat(format, type) : undefined;\r\n if (descriptorChanged && nativeTexture) {\r\n this._engine.initializeTexture(\r\n nativeTexture,\r\n texture.width,\r\n texture.height,\r\n texture.generateMipMaps,\r\n nativeTextureFormat!,\r\n /*renderTarget*/ false,\r\n texture._useSRGBBuffer,\r\n /*samples*/ 1,\r\n /*isCube*/ true\r\n );\r\n this._setTextureSampling(nativeTexture, getNativeSamplingMode(texture.samplingMode));\r\n }\r\n\r\n // NativeEngine.updateTextureData honors invertY directly on cubes (no D3D origin\r\n // compensation). That matches WebGL: HDRCubeTexture uploads with invertY=false and\r\n // UNPACK_FLIP_Y_WEBGL=false. Forcing invertY here double-flipped float/half faces and\r\n // made the -Y cubemap a hard brown cap on OpenPBR IBL (513/514). Byte RGBD .env\r\n // uploads already pass invertY=true and are unchanged.\r\n texture.format = format;\r\n texture.type = type;\r\n texture.invertY = invertY;\r\n texture._compression = compression;\r\n if (level === 0 && !this._doNotHandleContextLost) {\r\n texture._bufferViewArray = data;\r\n }\r\n\r\n // Data are in +X +Y +Z -X -Y -Z order, which matches the bgfx cube sides. Like gl.generateMipmap in the\r\n // WebGL path, Native rebuilds the rest of each face's mip chain from a full level 0 upload.\r\n const width = Math.max(1, texture.width >> level);\r\n const height = Math.max(1, texture.height >> level);\r\n const generateMipMaps = level === 0 && texture.generateMipMaps;\r\n for (let faceIndex = 0; faceIndex < 6; faceIndex++) {\r\n this.updateTextureData(texture, data[faceIndex], 0, 0, width, height, faceIndex, level, generateMipMaps);\r\n }\r\n texture.isReady = true;\r\n }\r\n\r\n // TODO: Refactor to share more logic with babylon.engine.ts version.\r\n /**\r\n * Usually called from Texture.ts.\r\n * Passed information to create a NativeTexture\r\n * @param url defines a value which contains one of the following:\r\n * * A conventional http URL, e.g. 'http://...' or 'file://...'\r\n * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'\r\n * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'\r\n * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file\r\n * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx)\r\n * @param scene needed for loading to the correct scene\r\n * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE)\r\n * @param onLoad optional callback to be called upon successful completion\r\n * @param onError optional callback to be called upon failure\r\n * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob\r\n * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities\r\n * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @param mimeType defines an optional mime type\r\n * @param loaderOptions options to be passed to the loader\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\r\n * @returns a InternalTexture for assignment back into BABYLON.Texture\r\n */\r\n public override createTexture(\r\n url: Nullable<string>,\r\n noMipmap: boolean,\r\n invertY: boolean,\r\n scene: Nullable<ISceneLike>,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<(texture: InternalTexture) => void> = null,\r\n onError: Nullable<(message: string, exception: any) => void> = null,\r\n buffer: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap> = null,\r\n fallback: Nullable<InternalTexture> = null,\r\n format: Nullable<number> = null,\r\n forcedExtension: Nullable<string> = null,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n creationFlags?: number,\r\n useSRGBBuffer = false\r\n ): InternalTexture {\r\n url = url || \"\";\r\n const fromData = url.substring(0, 5) === \"data:\";\r\n //const fromBlob = url.substring(0, 5) === \"blob:\";\r\n const isBase64 = fromData && url.indexOf(\";base64,\") !== -1;\r\n\r\n const texture = fallback ? fallback : new InternalTexture(this, InternalTextureSource.Url);\r\n\r\n const originalUrl = url;\r\n if (this._transformTextureUrl && !isBase64 && !fallback && !buffer) {\r\n url = this._transformTextureUrl(url);\r\n }\r\n\r\n // establish the file extension, if possible\r\n const lastDot = url.lastIndexOf(\".\");\r\n const extension = forcedExtension ? forcedExtension : lastDot > -1 ? url.substring(lastDot).toLowerCase() : \"\";\r\n\r\n // some formats are already supported by bimg, no need to try to load them with JS\r\n // leaving TextureLoader extension check for future use\r\n let loaderPromise: Nullable<Promise<IInternalTextureLoader>> = null;\r\n if (extension.endsWith(\".ies\")) {\r\n // The UMD/global build (used by Babylon Native) stubs dynamic import(), so\r\n // AbstractEngine.GetCompatibleTextureLoader cannot resolve the loader module. Instantiate the\r\n // statically-bundled IES loader directly instead.\r\n loaderPromise = Promise.resolve(new _IESTextureLoader());\r\n } else if (extension.endsWith(\".basis\") || extension.endsWith(\".ktx\") || extension.endsWith(\".ktx2\") || mimeType === \"image/ktx\" || mimeType === \"image/ktx2\") {\r\n loaderPromise = AbstractEngine.GetCompatibleTextureLoader(extension, mimeType);\r\n }\r\n\r\n if (scene) {\r\n scene.addPendingData(texture);\r\n }\r\n texture.url = url;\r\n texture.generateMipMaps = !noMipmap;\r\n texture.samplingMode = samplingMode;\r\n texture.invertY = invertY;\r\n texture._useSRGBBuffer = this._getUseSRGBBuffer(useSRGBBuffer, noMipmap);\r\n\r\n if (!this.doNotHandleContextLost) {\r\n // Keep a link to the buffer only if we plan to handle context lost\r\n texture._buffer = buffer;\r\n }\r\n\r\n let onLoadObserver: Nullable<Observer<InternalTexture>> = null;\r\n if (onLoad && !fallback) {\r\n onLoadObserver = texture.onLoadedObservable.add(onLoad);\r\n }\r\n\r\n if (!fallback) {\r\n this._internalTexturesCache.push(texture);\r\n }\r\n\r\n const onInternalError = (message?: string, exception?: any) => {\r\n texture.isReady = false;\r\n\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n if (url === originalUrl) {\r\n if (onLoadObserver) {\r\n texture.onLoadedObservable.remove(onLoadObserver);\r\n }\r\n\r\n if (EngineStore.UseFallbackTexture) {\r\n this.createTexture(EngineStore.FallbackTexture, noMipmap, texture.invertY, scene, samplingMode, null, onError, buffer, texture);\r\n }\r\n\r\n const errorMessage = (message || \"Unknown error\") + (EngineStore.UseFallbackTexture ? \" - Fallback texture was used\" : \"\");\r\n texture._setError(errorMessage, exception);\r\n if (onError) {\r\n onError(errorMessage, exception);\r\n }\r\n } else {\r\n // fall back to the original url if the transformed url fails to load\r\n Logger.Warn(`Failed to load ${url}, falling back to ${originalUrl}`);\r\n this.createTexture(originalUrl, noMipmap, texture.invertY, scene, samplingMode, onLoad, onError, buffer, texture, format, forcedExtension, mimeType, loaderOptions);\r\n }\r\n };\r\n\r\n // processing for non-image formats\r\n if (loaderPromise) {\r\n // These formats (e.g. .ies) are decoded on the JS side by an IInternalTextureLoader and then\r\n // uploaded to the native texture as raw pixel data. bimg cannot decode them directly.\r\n const texLoaderPromise = loaderPromise;\r\n const callbackAsync = async (data: ArrayBufferView) => {\r\n const loader = await texLoaderPromise;\r\n loader.loadData(\r\n data,\r\n texture,\r\n (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, loadFailed?: boolean) => {\r\n if (loadFailed) {\r\n onInternalError(\"TextureLoader failed to load data\");\r\n return;\r\n }\r\n\r\n const baseWidth = texture.baseWidth || width;\r\n const baseHeight = texture.baseHeight || height;\r\n texture.baseWidth = baseWidth;\r\n texture.baseHeight = baseHeight;\r\n texture.width = baseWidth;\r\n texture.height = baseHeight;\r\n\r\n // The loader-supplied done() performs the actual GPU upload (e.g. via\r\n // _uploadDataToTextureDirectly), so texture dimensions must be set beforehand.\r\n try {\r\n done();\r\n } finally {\r\n // Some loaders temporarily publish each mip's dimensions through width/height.\r\n // Restore the level-zero dimensions even when a later mip upload fails.\r\n texture.baseWidth = baseWidth;\r\n texture.baseHeight = baseHeight;\r\n texture.width = baseWidth;\r\n texture.height = baseHeight;\r\n }\r\n\r\n if (texture._hardwareTexture) {\r\n const filter = getNativeSamplingMode(samplingMode);\r\n this._setTextureSampling(texture._hardwareTexture.underlyingResource, filter);\r\n }\r\n\r\n texture.isReady = true;\r\n\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n texture.onLoadedObservable.notifyObservers(texture);\r\n texture.onLoadedObservable.clear();\r\n },\r\n loaderOptions\r\n );\r\n };\r\n\r\n if (buffer) {\r\n const processBufferAsync = async (data: ArrayBufferView) => {\r\n try {\r\n await callbackAsync(data);\r\n } catch (reason) {\r\n onInternalError(\"Failed to parse texture data\", reason);\r\n }\r\n };\r\n if (buffer instanceof ArrayBuffer) {\r\n void processBufferAsync(new Uint8Array(buffer));\r\n } else if (ArrayBuffer.isView(buffer)) {\r\n void processBufferAsync(buffer);\r\n } else {\r\n onInternalError(\"Unable to load: only ArrayBuffer or ArrayBufferView is supported\");\r\n }\r\n } else {\r\n this._loadFile(\r\n url,\r\n async (data) => {\r\n try {\r\n await callbackAsync(new Uint8Array(data as ArrayBuffer));\r\n } catch (reason) {\r\n onInternalError(\"Failed to parse texture data\", reason);\r\n }\r\n },\r\n undefined,\r\n undefined,\r\n true,\r\n (request?: IWebRequest, exception?: any) => {\r\n onInternalError(\"Unable to load \" + (request ? request.responseURL : url), exception);\r\n }\r\n );\r\n }\r\n } else {\r\n const onload = (data: ArrayBufferView) => {\r\n if (!texture._hardwareTexture) {\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n return;\r\n }\r\n\r\n const underlyingResource = texture._hardwareTexture.underlyingResource;\r\n\r\n this._engine.loadTexture(\r\n underlyingResource,\r\n data,\r\n !noMipmap,\r\n invertY,\r\n texture._useSRGBBuffer,\r\n () => {\r\n texture.baseWidth = this._engine.getTextureWidth(underlyingResource);\r\n texture.baseHeight = this._engine.getTextureHeight(underlyingResource);\r\n texture.width = texture.baseWidth;\r\n texture.height = texture.baseHeight;\r\n texture.isReady = true;\r\n\r\n const filter = getNativeSamplingMode(samplingMode);\r\n this._setTextureSampling(underlyingResource, filter);\r\n\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n texture.onLoadedObservable.notifyObservers(texture);\r\n texture.onLoadedObservable.clear();\r\n },\r\n () => {\r\n throw new Error(\"Could not load a native texture.\");\r\n }\r\n );\r\n };\r\n\r\n if (fromData && buffer) {\r\n if (buffer instanceof ArrayBuffer) {\r\n onload(new Uint8Array(buffer));\r\n } else if (ArrayBuffer.isView(buffer)) {\r\n onload(buffer);\r\n } else if (typeof buffer === \"string\") {\r\n onload(new Uint8Array(DecodeBase64UrlToBinary(buffer)));\r\n } else {\r\n throw new Error(\"Unsupported buffer type\");\r\n }\r\n } else {\r\n if (isBase64) {\r\n onload(new Uint8Array(DecodeBase64UrlToBinary(url)));\r\n } else {\r\n this._loadFile(\r\n url,\r\n (data) => onload(new Uint8Array(data as ArrayBuffer)),\r\n undefined,\r\n undefined,\r\n true,\r\n (request?: IWebRequest, exception?: any) => {\r\n onInternalError(\"Unable to load \" + (request ? request.responseURL : url, exception));\r\n }\r\n );\r\n }\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Wraps an external native texture in a Babylon texture.\r\n * @param texture defines the external texture\r\n * @param hasMipMaps defines whether the external texture has mip maps\r\n * @param samplingMode defines the sampling mode for the external texture (default: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE)\r\n * @returns the babylon internal texture\r\n */\r\n public wrapNativeTexture(texture: NativeTexture, hasMipMaps: boolean = false, samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE): InternalTexture {\r\n const hardwareTexture = new NativeHardwareTexture(texture, this._engine);\r\n const internalTexture = new InternalTexture(this, InternalTextureSource.External, true);\r\n internalTexture._hardwareTexture = hardwareTexture;\r\n internalTexture.baseWidth = this._engine.getTextureWidth(texture);\r\n internalTexture.baseHeight = this._engine.getTextureHeight(texture);\r\n internalTexture.width = internalTexture.baseWidth;\r\n internalTexture.height = internalTexture.baseHeight;\r\n if (this._engine.getTextureLayerCount) {\r\n const layerCount = this._engine.getTextureLayerCount(texture);\r\n if (layerCount > 1) {\r\n internalTexture.is2DArray = true;\r\n internalTexture.baseDepth = internalTexture.depth = layerCount;\r\n }\r\n }\r\n internalTexture.isReady = true;\r\n internalTexture.useMipMaps = hasMipMaps;\r\n this.updateTextureSamplingMode(samplingMode, internalTexture);\r\n return internalTexture;\r\n }\r\n\r\n /**\r\n * Replaces the underlying native texture handle of a texture previously created via {@link wrapNativeTexture},\r\n * preserving the InternalTexture identity.\r\n *\r\n * Intended for the device-loss / device-restored flow (a DisableRendering / EnableRendering cycle from the host\r\n * application): when the host recreates its external resource on the new graphics device, it calls this method to\r\n * repoint Babylon's wrapper at the new handle without losing references held by materials, render-target wrappers,\r\n * particle systems, etc.\r\n *\r\n * The new handle must match the wrapped texture's recorded dimensions. To change dimensions, dispose the wrapped\r\n * texture and call {@link wrapNativeTexture} again. Sampling mode and mip-map flag are properties of the logical\r\n * wrapped texture and are re-applied to the new resource. Any render-target wrapper holding this texture as its\r\n * color attachment has its framebuffer rebuilt with the new handle.\r\n *\r\n * Throws if the target was not produced by {@link wrapNativeTexture}, if the new handle's dimensions don't match,\r\n * if the wrapped texture is part of a multi render-target, or if the wrapper has a depth/stencil texture (these\r\n * are not supported in this version; dispose and re-wrap).\r\n * @param internalTexture defines the wrapped InternalTexture to repoint\r\n * @param texture defines the new native texture handle to wrap\r\n */\r\n public updateWrappedNativeTexture(internalTexture: InternalTexture, texture: NativeTexture): void {\r\n if (internalTexture.source !== InternalTextureSource.External) {\r\n throw new Error(\"updateWrappedNativeTexture: target InternalTexture was not produced by wrapNativeTexture.\");\r\n }\r\n\r\n const newWidth = this._engine.getTextureWidth(texture);\r\n const newHeight = this._engine.getTextureHeight(texture);\r\n if (newWidth !== internalTexture.baseWidth || newHeight !== internalTexture.baseHeight) {\r\n throw new Error(\r\n `updateWrappedNativeTexture: new handle dimensions (${newWidth}x${newHeight}) must match the wrapped texture's dimensions (${internalTexture.baseWidth}x${internalTexture.baseHeight}).`\r\n );\r\n }\r\n if (this._engine.getTextureLayerCount) {\r\n const newLayerCount = this._engine.getTextureLayerCount(texture);\r\n const oldLayerCount = internalTexture.is2DArray ? internalTexture.depth : 1;\r\n if (newLayerCount !== oldLayerCount) {\r\n throw new Error(`updateWrappedNativeTexture: new handle layer count (${newLayerCount}) must match the wrapped texture's layer count (${oldLayerCount}).`);\r\n }\r\n }\r\n\r\n // Pre-validate before mutating any state so a thrown precondition leaves the InternalTexture untouched.\r\n // Note: rtWrapper.texture only returns _textures[0]; walk every attachment to catch the multi-RT case where\r\n // the wrapped texture is at index > 0.\r\n for (const rtWrapper of this._renderTargetWrapperCache) {\r\n if (!rtWrapper.textures?.includes(internalTexture)) {\r\n continue;\r\n }\r\n if (rtWrapper.isMulti) {\r\n throw new Error(\"updateWrappedNativeTexture: wrapped texture is part of a multi render-target; not supported. Dispose and re-wrap.\");\r\n }\r\n if (rtWrapper._depthStencilTexture) {\r\n // After a DisableRendering / EnableRendering cycle the bgfx framebuffer + the depth/stencil texture's\r\n // bgfx handle are both stale. Rebuilding the depth/stencil texture from the wrapper's stored settings\r\n // is feasible but non-trivial; v1 rejects and asks the caller to dispose + re-wrap.\r\n throw new Error(\"updateWrappedNativeTexture: wrapped texture's render-target wrapper has a depth/stencil texture; not supported. Dispose and re-wrap.\");\r\n }\r\n }\r\n\r\n internalTexture._hardwareTexture = new NativeHardwareTexture(texture, this._engine);\r\n internalTexture.isReady = true;\r\n this.updateTextureSamplingMode(internalTexture.samplingMode, internalTexture);\r\n\r\n // Rebuild the framebuffer of any render-target wrapper holding this wrapped texture as its color attachment.\r\n // After a DisableRendering / EnableRendering cycle the bgfx framebuffer handle is stale; the consumer-supplied\r\n // new texture is the moment we have a fresh handle to rebuild against.\r\n for (const rtWrapper of this._renderTargetWrapperCache) {\r\n if (rtWrapper.texture !== internalTexture) {\r\n continue;\r\n }\r\n const nativeRTWrapper = rtWrapper as NativeRenderTargetWrapper;\r\n if (nativeRTWrapper._framebuffers && !rtWrapper.isCube) {\r\n // Wrapped 2D-array color attachment with one framebuffer per layer: rebuild every layer\r\n // against the new handle. The _framebuffers setter releases the stale handles.\r\n const { generateDepth, generateStencil } = this._getLayerFramebufferDepthStencil(rtWrapper);\r\n nativeRTWrapper._framebuffers = this._createLayerFramebuffers(\r\n texture,\r\n rtWrapper.width,\r\n rtWrapper.height,\r\n nativeRTWrapper._framebuffers.length,\r\n generateStencil,\r\n generateDepth,\r\n rtWrapper.samples ?? 1,\r\n rtWrapper.texture?.generateMipMaps\r\n );\r\n continue;\r\n }\r\n // NativeRenderTargetWrapper._framebuffer setter releases the old framebuffer before assigning,\r\n // so no manual _releaseFramebufferObjects call is needed (and would double-delete the handle).\r\n nativeRTWrapper._framebuffer = this._engine.createFrameBuffer(\r\n texture,\r\n rtWrapper.width,\r\n rtWrapper.height,\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper._generateDepthBuffer,\r\n rtWrapper.samples ?? 1\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Creates a depth/stencil texture for a render target wrapper.\r\n * @param size The size of the depth texture\r\n * @param options The options defining the depth texture\r\n * @param rtWrapper The render target wrapper the depth texture belongs to\r\n * @returns The depth/stencil texture\r\n */\r\n public override createDepthStencilTexture(size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture {\r\n // AbstractEngine routes cube render targets (point-light shadow maps) to _createDepthStencilCubeTexture,\r\n // which only exists on the WebGL engine and drives gl.TEXTURE_CUBE_MAP directly. Native already handles\r\n // cube and 2D-array targets in _createDepthStencilTexture through the wrapper's per-face framebuffers,\r\n // so route every request there instead of throwing on an undefined GL context.\r\n return this._createDepthStencilTexture(size, options, rtWrapper);\r\n }\r\n\r\n public override _createDepthStencilTexture(size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture {\r\n // TODO: handle other options?\r\n const requestedFormat = options.depthTextureFormat;\r\n // Native allocates either D32F (depth only) or D24S8 (depth + stencil). Requested depth formats map onto\r\n // whichever of those matches their stencil aspect, and texture.format records what was actually allocated.\r\n const requestedStencil =\r\n requestedFormat === Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 ||\r\n requestedFormat === Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 ||\r\n requestedFormat === Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8;\r\n if (\r\n requestedFormat !== undefined &&\r\n !requestedStencil &&\r\n requestedFormat !== Constants.TEXTUREFORMAT_DEPTH16 &&\r\n requestedFormat !== Constants.TEXTUREFORMAT_DEPTH24 &&\r\n requestedFormat !== Constants.TEXTUREFORMAT_DEPTH32_FLOAT\r\n ) {\r\n throw new Error(`NativeEngine: depth texture format ${requestedFormat} is not supported.`);\r\n }\r\n\r\n const generateStencil = !!options.generateStencil || requestedStencil;\r\n const samples = options.samples || 1;\r\n\r\n const nativeRTWrapper = rtWrapper as NativeRenderTargetWrapper;\r\n this._assertDepthAttachmentCompatible(nativeRTWrapper, samples);\r\n const texture = new InternalTexture(this, InternalTextureSource.DepthStencil);\r\n\r\n const width = (<{ width: number; height: number; layers?: number }>size).width ?? <number>size;\r\n const height = (<{ width: number; height: number; layers?: number }>size).height ?? <number>size;\r\n const layers = (<{ width: number; height: number; depth?: number; layers?: number }>size).layers || 0;\r\n const depth = (<{ width: number; height: number; depth?: number; layers?: number }>size).depth || 0;\r\n\r\n // Populate the standard depth/stencil texture metadata, mirroring ThinEngine._setupDepthStencilTexture.\r\n // In particular `samples` must be set so consumers such as the FrameGraph texture manager report the\r\n // correct sample count; leaving it at the InternalTexture default (0) breaks FrameGraph MSAA\r\n // depth/output sample-count validation. `is2DArray`/`depth` matter for the texture-array depth targets\r\n // used by cascaded shadow maps.\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.is2DArray = layers > 0;\r\n texture.isCube = !!options.isCube;\r\n texture.depth = layers || depth;\r\n texture.isReady = true;\r\n texture.samples = samples;\r\n texture.generateMipMaps = false;\r\n texture.samplingMode = options.bilinearFiltering ? Constants.TEXTURE_BILINEAR_SAMPLINGMODE : Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n texture.format = generateStencil ? Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 : Constants.TEXTUREFORMAT_DEPTH32_FLOAT;\r\n texture._comparisonFunction = options.comparisonFunction ?? 0;\r\n nativeRTWrapper._depthStencilTextureWithStencil = generateStencil;\r\n\r\n this._attachDepthStencilTexture(nativeRTWrapper, texture, width, height, generateStencil, samples);\r\n return texture;\r\n }\r\n\r\n /**\r\n * Builds the framebuffer(s) of a render target so they carry its sampleable depth/stencil texture. The depth\r\n * texture's native handle must not be allocated yet: the first framebuffer creation allocates it.\r\n * @internal\r\n */\r\n public _attachDepthStencilTexture(\r\n nativeRTWrapper: NativeRenderTargetWrapper,\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n generateStencil: boolean,\r\n samples: number\r\n ): void {\r\n if (nativeRTWrapper.is3D) {\r\n this._assertVolumeDepthAttachmentSupported(texture.samples, samples);\r\n // Volume slices bind lazily built framebuffers; drop cached slices so the next bind attaches the new depth.\r\n nativeRTWrapper._releaseLayerFramebuffers();\r\n return;\r\n }\r\n\r\n if (nativeRTWrapper._framebuffers) {\r\n // Layered (2D array) or cube render target: the color framebuffers were created one-per-layer\r\n // (see createRenderTargetTexture / createRenderTargetCubeTexture). When the color RTT was built\r\n // without a depth buffer (e.g. cascaded shadow maps create the RTT with generateDepthBuffer=false\r\n // and then call createDepthStencilTexture), rebuild each per-layer framebuffer so it carries a\r\n // *shared sampleable* depth/stencil array attachment. PCF binds the whole array as\r\n // sampler2DArrayShadow; each cascade layer framebuffer writes into its own depth slice.\r\n // A single shared _framebufferDepthStencil would be ignored because bindFramebuffer selects\r\n // _framebuffers[layer] first.\r\n const colorTexture = nativeRTWrapper.texture;\r\n if (colorTexture && colorTexture._hardwareTexture) {\r\n const nativeColor = colorTexture._hardwareTexture.underlyingResource;\r\n const nativeDepth = texture._hardwareTexture!.underlyingResource;\r\n const layerCount = nativeRTWrapper._framebuffers.length;\r\n const framebuffers: NativeFramebuffer[] = [];\r\n for (let layer = 0; layer < layerCount; layer++) {\r\n // First call creates the multi-layer sampleable depth and aliases it into nativeDepth;\r\n // subsequent calls borrow the same depth array and attach the matching layer.\r\n framebuffers.push(this._createNativeMultiFrameBuffer([nativeColor], width, height, generateStencil, true, samples, [layer], nativeDepth));\r\n }\r\n // The _framebuffers setter releases the previous handles.\r\n nativeRTWrapper._framebuffers = framebuffers;\r\n this._setTextureSampling(nativeDepth, getNativeSamplingMode(texture.samplingMode));\r\n this.updateTextureComparisonFunction(texture, texture._comparisonFunction);\r\n }\r\n return;\r\n }\r\n\r\n // Plain 2D render target: build a framebuffer that carries BOTH the render target's color attachment\r\n // and the standalone depth/stencil texture. bindFramebuffer prefers _framebufferDepthStencil over\r\n // _framebuffer, so attaching depth alone would silently drop the color target -- shadow maps would\r\n // render their packed depth into nothing. The depth texture's bgfx handle is still invalid at this\r\n // point, which is how CreateFrameBufferImpl recognizes a request for a readable depth attachment that\r\n // it aliases back into the supplied texture so it can be sampled afterwards.\r\n const colorResources: NativeTexture[] = [];\r\n for (const colorTexture of nativeRTWrapper.textures ?? []) {\r\n const colorResource = colorTexture?._hardwareTexture?.underlyingResource;\r\n if (colorResource) {\r\n colorResources.push(colorResource);\r\n }\r\n }\r\n const nativeDepth = texture._hardwareTexture!.underlyingResource;\r\n const framebuffer = this._createNativeMultiFrameBuffer(colorResources, width, height, generateStencil, true, samples, undefined, nativeDepth);\r\n nativeRTWrapper._framebufferDepthStencil = framebuffer;\r\n this._setTextureSampling(nativeDepth, getNativeSamplingMode(texture.samplingMode));\r\n this.updateTextureComparisonFunction(texture, texture._comparisonFunction);\r\n }\r\n\r\n // Reallocates a render target's sampleable depth/stencil texture with a new sample count and reattaches it to\r\n // the (already rebuilt) color framebuffer(s), so rendering and later depth sampling keep using the same resource.\r\n private _recreateDepthStencilTexture(nativeRTWrapper: NativeRenderTargetWrapper, samples: number): void {\r\n const depthTexture = nativeRTWrapper._depthStencilTexture;\r\n if (!depthTexture?._hardwareTexture) {\r\n return;\r\n }\r\n\r\n const previous = depthTexture._hardwareTexture;\r\n depthTexture._hardwareTexture = this._createHardwareTexture();\r\n depthTexture.samples = samples;\r\n if (nativeRTWrapper.isMulti) {\r\n nativeRTWrapper._framebufferDepthStencil = null;\r\n } else {\r\n this._attachDepthStencilTexture(nativeRTWrapper, depthTexture, depthTexture.width, depthTexture.height, nativeRTWrapper._depthStencilTextureWithStencil, samples);\r\n }\r\n previous.release();\r\n }\r\n\r\n /**\r\n * Returns whether a render-target texture was created with mip storage, independently of generateMipMaps.\r\n * @internal\r\n */\r\n public _hasMipStorage(texture: InternalTexture): boolean {\r\n return _TexturesWithMipStorage.has(texture) || texture.generateMipMaps;\r\n }\r\n\r\n private _setHasMipStorage(texture: InternalTexture, hasMipStorage: boolean): void {\r\n if (hasMipStorage) {\r\n _TexturesWithMipStorage.add(texture);\r\n } else {\r\n _TexturesWithMipStorage.delete(texture);\r\n }\r\n }\r\n\r\n /**\r\n * Ensures a cloned render-target texture retains allocation-only mip storage.\r\n * @internal\r\n */\r\n public _ensureRenderTargetMipStorage(texture: InternalTexture): boolean {\r\n if (this._hasMipStorage(texture)) {\r\n return false;\r\n }\r\n\r\n this._setHasMipStorage(texture, true);\r\n if (!texture._hardwareTexture) {\r\n return false;\r\n }\r\n\r\n this._engine.initializeTexture(\r\n texture._hardwareTexture.underlyingResource,\r\n texture.baseWidth,\r\n texture.baseHeight,\r\n this._getRenderTargetHasMips(true, texture.samples),\r\n getNativeTextureFormat(texture.format, texture.type),\r\n /*renderTarget*/ true,\r\n texture._useSRGBBuffer,\r\n texture.samples,\r\n texture.isCube,\r\n texture.is2DArray || texture.is3D ? texture.depth : 0,\r\n texture.is3D\r\n );\r\n return true;\r\n }\r\n\r\n /**\r\n * Rebuilds native framebuffer objects after a wrapper's explicit depth attachment changes.\r\n * @internal\r\n */\r\n public _rebuildRenderTargetFramebuffersAfterDepthChange(nativeRTWrapper: NativeRenderTargetWrapper): void {\r\n nativeRTWrapper._releaseLayerFramebuffers();\r\n nativeRTWrapper._framebufferDepthStencil = null;\r\n\r\n if (nativeRTWrapper._usesLayeredFramebuffer) {\r\n nativeRTWrapper._invalidateLayeredFramebuffer();\r\n return;\r\n }\r\n\r\n if (nativeRTWrapper.isMulti) {\r\n if (nativeRTWrapper._framebuffer && this._isFrameGraphFramebuffer(nativeRTWrapper._framebuffer)) {\r\n nativeRTWrapper._framebuffer = null;\r\n } else if (nativeRTWrapper._framebuffer) {\r\n this._createMultiRenderTargetFramebuffer(nativeRTWrapper);\r\n }\r\n return;\r\n }\r\n\r\n const texture = nativeRTWrapper.texture;\r\n const nativeTexture = texture?._hardwareTexture?.underlyingResource;\r\n const depthTexture = nativeRTWrapper._depthStencilTexture;\r\n const nativeDepth = depthTexture?._hardwareTexture?.underlyingResource;\r\n if (nativeRTWrapper._framebuffers && nativeTexture) {\r\n if (nativeDepth) {\r\n this._attachDepthStencilTexture(\r\n nativeRTWrapper,\r\n depthTexture!,\r\n nativeRTWrapper.width,\r\n nativeRTWrapper.height,\r\n nativeRTWrapper._depthStencilTextureWithStencil,\r\n nativeRTWrapper.samples\r\n );\r\n } else {\r\n nativeRTWrapper._framebuffers = this._createLayerFramebuffers(\r\n nativeTexture,\r\n nativeRTWrapper.width,\r\n nativeRTWrapper.height,\r\n nativeRTWrapper.isCube ? 6 : nativeRTWrapper.layers,\r\n nativeRTWrapper._generateStencilBuffer,\r\n nativeRTWrapper._generateDepthBuffer,\r\n nativeRTWrapper.samples,\r\n nativeRTWrapper.texture?.generateMipMaps\r\n );\r\n }\r\n return;\r\n }\r\n\r\n if (nativeDepth) {\r\n this._attachDepthStencilTexture(\r\n nativeRTWrapper,\r\n depthTexture!,\r\n nativeRTWrapper.width,\r\n nativeRTWrapper.height,\r\n nativeRTWrapper._depthStencilTextureWithStencil,\r\n nativeRTWrapper.samples\r\n );\r\n } else {\r\n nativeRTWrapper._framebuffer = this._engine.createFrameBuffer(\r\n nativeTexture ?? null,\r\n nativeRTWrapper.width,\r\n nativeRTWrapper.height,\r\n nativeRTWrapper._generateStencilBuffer,\r\n nativeRTWrapper._generateDepthBuffer,\r\n nativeRTWrapper.samples\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Rejects an explicit depth attachment the render target cannot use, before any attachment state is mutated.\r\n * bgfx requires every framebuffer attachment to share one sample count.\r\n * @internal\r\n */\r\n public _assertDepthAttachmentCompatible(rtWrapper: NativeRenderTargetWrapper, depthSamples: number): void {\r\n if (rtWrapper.is3D) {\r\n this._assertVolumeDepthAttachmentSupported();\r\n }\r\n if ((depthSamples || 1) !== (rtWrapper.samples || 1)) {\r\n throw new Error(`NativeEngine: explicit depth attachments must use the render target's sample count (depth: ${depthSamples || 1}, color: ${rtWrapper.samples || 1}).`);\r\n }\r\n }\r\n\r\n /**\r\n * Whether the depth attachment carries stencil: an explicit depth texture decides from its own format (its handle\r\n * may be unallocated after a sample-count change), otherwise the automatic depth buffer request does.\r\n * @internal\r\n */\r\n public _getDepthAttachmentStencil(rtWrapper: NativeRenderTargetWrapper): boolean {\r\n const depthTexture = rtWrapper._depthStencilTexture;\r\n return depthTexture ? HasStencilAspect(depthTexture.format) : rtWrapper._generateStencilBuffer;\r\n }\r\n\r\n /** @internal */\r\n public _assertVolumeDepthAttachmentSupported(depthSamples?: number, colorSamples?: number): void {\r\n if (!this._engine.createMultiFrameBuffer) {\r\n throw new Error(\"NativeEngine: explicit depth attachments on volume render targets require createMultiFrameBuffer support.\");\r\n }\r\n if (depthSamples !== undefined && colorSamples !== undefined && depthSamples !== colorSamples) {\r\n throw new Error(\"NativeEngine: explicit depth and color attachments on volume render targets must use the same sample count.\");\r\n }\r\n }\r\n\r\n /**\r\n * Updates a depth texture Comparison Mode and Function.\r\n * @param texture The texture to set the comparison function for\r\n * @param comparisonFunction The comparison function to set, 0 if no comparison required\r\n */\r\n public updateTextureComparisonFunction(texture: InternalTexture, comparisonFunction: number): void {\r\n texture._comparisonFunction = comparisonFunction;\r\n // Drive bgfx BGFX_SAMPLER_COMPARE_* so PCF/PCSS shaders (sampler2DShadow / sampler2DArrayShadow)\r\n // get hardware depth compares. Engine-agnostic callers (LightingVolume) also toggle this around\r\n // a copy and expect the recorded value to stay in sync even when the hardware texture is missing.\r\n const nativeTexture = texture._hardwareTexture?.underlyingResource;\r\n if (nativeTexture && this._engine.setTextureComparisonFunction) {\r\n this._engine.setTextureComparisonFunction(nativeTexture, comparisonFunction);\r\n }\r\n }\r\n\r\n /**\r\n * Generates mipmaps for the given texture.\r\n * @param _texture The texture to generate the mipmaps for.\r\n */\r\n public override generateMipmaps(_texture: InternalTexture): void {\r\n // The WebGL implementation binds the texture and calls gl.generateMipmap; there is no equivalent\r\n // standalone command on Babylon Native, and none is needed: a render target whose mip chain must be\r\n // rebuilt is attached to its framebuffer with BGFX_RESOLVE_AUTO_GEN_MIPS (see CreateFrameBufferImpl),\r\n // so bgfx regenerates the chain when the view resolves. Without this override the inherited WebGL path\r\n // dereferenced a non-existent GL context (frame graph tasks call generateMipMaps explicitly).\r\n }\r\n\r\n /**\r\n * Creates one framebuffer per layer (or cube face) of a native texture.\r\n * @internal\r\n */\r\n public _createLayerFramebuffers(\r\n nativeTexture: NativeTexture,\r\n width: number,\r\n height: number,\r\n layerCount: number,\r\n generateStencilBuffer: boolean,\r\n generateDepthBuffer: boolean,\r\n samples: number,\r\n autoGenerateMips = true\r\n ): NativeFramebuffer[] {\r\n const framebuffers: NativeFramebuffer[] = [];\r\n for (let layer = 0; layer < layerCount; layer++) {\r\n framebuffers.push(this._engine.createFrameBuffer(nativeTexture, width, height, generateStencilBuffer, generateDepthBuffer, samples, layer, 0, autoGenerateMips));\r\n }\r\n return framebuffers;\r\n }\r\n\r\n /**\r\n * Per-layer framebuffers carry their own depth/stencil attachment, either requested at creation or added by\r\n * createDepthStencilTexture (see _createDepthStencilTexture), so recreate them with the same attachments.\r\n * @internal\r\n */\r\n public _getLayerFramebufferDepthStencil(rtWrapper: RenderTargetWrapper): { generateDepth: boolean; generateStencil: boolean } {\r\n const hasDepthStencilTexture = !!rtWrapper._depthStencilTexture;\r\n return {\r\n generateDepth: rtWrapper._generateDepthBuffer || hasDepthStencilTexture,\r\n generateStencil: rtWrapper._generateStencilBuffer || (hasDepthStencilTexture && rtWrapper._depthStencilTextureWithStencil),\r\n };\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseFramebufferObjects(framebuffer: Nullable<NativeFramebuffer>): void {\r\n if (framebuffer) {\r\n // Frame graph framebuffers are shared across several render-target wrappers (see\r\n // _buildFrameGraphFramebuffer). Each wrapper releases its reference on dispose/reassignment, so\r\n // reference-count the shared framebuffer and only delete the underlying bgfx handle once.\r\n const shared = this._frameGraphFramebufferRefCount.get(framebuffer);\r\n if (shared !== undefined) {\r\n if (shared.count > 1) {\r\n shared.count--;\r\n return;\r\n }\r\n this._frameGraphFramebufferRefCount.delete(framebuffer);\r\n if (shared.hardwareTexture._frameGraphFramebuffer === framebuffer) {\r\n shared.hardwareTexture._frameGraphFramebuffer = null;\r\n }\r\n }\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DELETEFRAMEBUFFER);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(framebuffer);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n }\r\n\r\n /**\r\n * Returns true when the given framebuffer was built by the frame graph path (_buildFrameGraphFramebuffer),\r\n * i.e. it is reference-counted, shared between wrappers and rebuilt lazily on bind.\r\n * @param framebuffer The framebuffer to test\r\n * @returns true if the framebuffer is a frame graph framebuffer\r\n * @internal\r\n */\r\n public _isFrameGraphFramebuffer(framebuffer: NativeFramebuffer): boolean {\r\n return this._frameGraphFramebufferRefCount.has(framebuffer);\r\n }\r\n\r\n // Reference counts + metadata for framebuffers shared across frame graph render-target wrappers\r\n // are stored in _frameGraphFramebufferRefCount (declared with the other engine fields).\r\n\r\n /**\r\n * Lazily builds (or reuses a shared) bgfx framebuffer for a frame graph render-target wrapper whose\r\n * textures were attached after creation (dontCreateTextures). All wrappers that reference the same\r\n * underlying color texture share a single framebuffer, cached on that texture's hardware wrapper, so that\r\n * successive passes (clear, object render, post) accumulate into the same target instead of each fresh\r\n * framebuffer/view clearing it.\r\n * @internal\r\n */\r\n private _buildFrameGraphFramebuffer(nativeRTWrapper: NativeRenderTargetWrapper): void {\r\n const textures = nativeRTWrapper.textures;\r\n if (!textures || textures.length === 0) {\r\n // Depth-only frame graph render target: 0 color attachments plus a shared depth-stencil texture.\r\n // The FrameGraph schedules a standalone depth-clear pass against the geometry buffer's depth texture,\r\n // separately from the geometry MRT render. Build a depth-only framebuffer that BORROWS the shared\r\n // depth texture (its bgfx handle is already valid, created up-front by _createInternalTexture) so the\r\n // clear hits the exact buffer the geometry MRT later depth-tests against. Without this the clear is\r\n // misdirected to the back buffer and the geometry prepass depth is never cleared, leaving the geometry\r\n // buffer empty (breaks SSR / motion blur / curvature / SSAO).\r\n const depthOnlyTexture = nativeRTWrapper._depthStencilTexture;\r\n const depthOnlyResource = depthOnlyTexture?._hardwareTexture?.underlyingResource;\r\n if (depthOnlyResource && !nativeRTWrapper._framebufferDepthStencil) {\r\n nativeRTWrapper._framebufferDepthStencil = this._createNativeMultiFrameBuffer(\r\n [],\r\n nativeRTWrapper.width,\r\n nativeRTWrapper.height,\r\n nativeRTWrapper._generateStencilBuffer,\r\n true,\r\n depthOnlyTexture!.samples || nativeRTWrapper.samples || 1,\r\n undefined,\r\n depthOnlyResource\r\n );\r\n }\r\n return;\r\n }\r\n\r\n const textureCount = textures.length;\r\n for (let i = 0; i < textureCount; i++) {\r\n if (!textures[i]?._hardwareTexture?.underlyingResource) {\r\n // A color texture is not yet backed by a hardware texture; leave the wrapper unbuilt (the base\r\n // path will bind the back buffer). This wrapper will be retried on its next bind.\r\n return;\r\n }\r\n }\r\n\r\n const hardwareTexture = textures[0]._hardwareTexture as NativeHardwareTexture;\r\n const depthStencilTexture = nativeRTWrapper._depthStencilTexture;\r\n const generateDepthBuffer = !!depthStencilTexture || nativeRTWrapper._generateDepthBuffer;\r\n const generateStencilBuffer = this._getDepthAttachmentStencil(nativeRTWrapper);\r\n const samples = textures[0].samples || nativeRTWrapper.samples || 1;\r\n\r\n // Like a GL framebuffer, an explicit depth-stencil texture is always attached as-is, so every pass that\r\n // references it (clears, geometry, overlays, later samplers) sees the same real depth buffer.\r\n const sharedDepthResource = depthStencilTexture?._hardwareTexture?.underlyingResource as NativeTexture | undefined;\r\n const cached = hardwareTexture._frameGraphFramebuffer;\r\n const cachedMeta = cached ? this._frameGraphFramebufferRefCount.get(cached) : undefined;\r\n\r\n // Reuse the cached framebuffer when it is compatible: the same ordered color attachments (a swap of any\r\n // attachment, not only the primary one, needs a new framebuffer), the same sample count, depth/stencil\r\n // buffers when this pass needs them (a pass that does not need them can safely reuse a framebuffer that\r\n // has them), and the same shared depth texture (so a shared-depth pass never reuses an auto-depth\r\n // framebuffer, and vice versa). History-texture swaps invalidate these wrappers every frame, so this check\r\n // runs in the render loop: compare in place and only allocate the color list for a new framebuffer.\r\n let sameColors = !!cachedMeta && cachedMeta.colorResources.length === textureCount;\r\n for (let i = 0; sameColors && i < textureCount; i++) {\r\n sameColors = cachedMeta!.colorResources[i] === textures[i]._hardwareTexture!.underlyingResource;\r\n }\r\n if (\r\n cached &&\r\n cachedMeta &&\r\n sameColors &&\r\n cachedMeta.samples === samples &&\r\n (cachedMeta.hasDepth || !generateDepthBuffer) &&\r\n (cachedMeta.hasStencil || !generateStencilBuffer) &&\r\n cachedMeta.sharedDepthResource === sharedDepthResource\r\n ) {\r\n cachedMeta.count++;\r\n nativeRTWrapper._framebuffer = cached;\r\n return;\r\n }\r\n\r\n const colorTextures: NativeTexture[] = new Array(textureCount);\r\n for (let i = 0; i < textureCount; i++) {\r\n colorTextures[i] = textures[i]._hardwareTexture!.underlyingResource;\r\n }\r\n\r\n const framebuffer = sharedDepthResource\r\n ? this._createNativeMultiFrameBuffer(colorTextures, nativeRTWrapper.width, nativeRTWrapper.height, generateStencilBuffer, true, samples, undefined, sharedDepthResource)\r\n : colorTextures.length === 1\r\n ? this._engine.createFrameBuffer(colorTextures[0], nativeRTWrapper.width, nativeRTWrapper.height, generateStencilBuffer, generateDepthBuffer, samples)\r\n : this._createNativeMultiFrameBuffer(colorTextures, nativeRTWrapper.width, nativeRTWrapper.height, generateStencilBuffer, generateDepthBuffer, samples);\r\n\r\n this._frameGraphFramebufferRefCount.set(framebuffer, {\r\n count: 1,\r\n hardwareTexture,\r\n colorResources: colorTextures,\r\n hasDepth: generateDepthBuffer,\r\n hasStencil: generateStencilBuffer,\r\n samples,\r\n sharedDepthResource,\r\n });\r\n hardwareTexture._frameGraphFramebuffer = framebuffer;\r\n nativeRTWrapper._framebuffer = framebuffer;\r\n }\r\n\r\n /**\r\n * @internal Engine abstraction for loading and creating an image bitmap from a given source string.\r\n * @param imageSource source to load the image from.\r\n * @param _options An object that sets options for the image's extraction.\r\n * @returns ImageBitmap\r\n */\r\n public override async _createImageBitmapFromSource(imageSource: string, _options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n const promise = new Promise<ImageBitmap>((resolve, reject) => {\r\n const image = this.createCanvasImage();\r\n image.onload = () => {\r\n try {\r\n const imageBitmap = this._engine.createImageBitmap(image);\r\n resolve(imageBitmap);\r\n } catch (error) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(`Error loading image ${image.src} with exception: ${error}`);\r\n }\r\n };\r\n image.onerror = (error) => {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(`Error loading image ${image.src} with exception: ${error}`);\r\n };\r\n\r\n image.src = imageSource;\r\n });\r\n\r\n return await promise;\r\n }\r\n\r\n /**\r\n * Engine abstraction for createImageBitmap\r\n * @param image source for image\r\n * @param options An object that sets options for the image's extraction.\r\n * @returns ImageBitmap\r\n */\r\n public override async createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n // Back-compat: Because of the previous Blob hack, this could be an array of BlobParts.\r\n if (Array.isArray(image)) {\r\n const arr = <Array<ArrayBuffer>>image;\r\n if (arr.length) {\r\n return this._engine.createImageBitmap(arr[0]);\r\n }\r\n }\r\n\r\n if (image instanceof Blob) {\r\n const data = await image.arrayBuffer();\r\n return this._engine.createImageBitmap(data);\r\n }\r\n\r\n throw new Error(\"Unsupported data for createImageBitmap.\");\r\n }\r\n\r\n /**\r\n * Resize an image and returns the image data as an uint8array\r\n * @param image image to resize\r\n * @param bufferWidth destination buffer width\r\n * @param bufferHeight destination buffer height\r\n * @returns an uint8array containing RGBA values of bufferWidth * bufferHeight size\r\n */\r\n public override resizeImageBitmap(image: ImageBitmap, bufferWidth: number, bufferHeight: number): Uint8Array {\r\n return this._engine.resizeImageBitmap(image, bufferWidth, bufferHeight);\r\n }\r\n\r\n /** @internal */\r\n public override _createHardwareTexture(): IHardwareTextureWrapper {\r\n return new NativeHardwareTexture(this._createTexture() as NativeTexture, this._engine);\r\n }\r\n\r\n /** @internal */\r\n public override _createHardwareRenderTargetWrapper(isMulti: boolean, isCube: boolean, size: TextureSize): RenderTargetWrapper {\r\n const rtWrapper = new NativeRenderTargetWrapper(isMulti, isCube, size, this);\r\n this._renderTargetWrapperCache.push(rtWrapper);\r\n return rtWrapper;\r\n }\r\n\r\n /**\r\n * Older bgfx D3D11/D3D12/Vulkan backends share one texture descriptor between the MSAA render target and its\r\n * resolve target, so requesting mips together with samples > 1 fails texture creation (BabylonNative#1714).\r\n * Only keep the mip chain of a multisampled render target when the runtime reports that it supports it.\r\n * @internal\r\n */\r\n public _getRenderTargetHasMips(generateMipMaps: boolean, samples: number): boolean {\r\n return generateMipMaps && (samples <= 1 || !!this._engine.supportsMultisampledMipmaps);\r\n }\r\n\r\n /** @internal */\r\n public override _createInternalTexture(\r\n size: TextureSize,\r\n options: boolean | InternalTextureCreationOptions,\r\n _delayGPUTextureCreation = true,\r\n source = InternalTextureSource.Unknown\r\n ): InternalTexture {\r\n let generateMipMaps: boolean;\r\n let createMipMaps = false;\r\n let type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n let samplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n let format = Constants.TEXTUREFORMAT_RGBA;\r\n let useSRGBBuffer = false;\r\n let samples = 1;\r\n let label: string | undefined;\r\n if (options !== undefined && typeof options === \"object\") {\r\n generateMipMaps = !!options.generateMipMaps;\r\n createMipMaps = !!options.createMipMaps;\r\n type = options.type === undefined ? Constants.TEXTURETYPE_UNSIGNED_BYTE : options.type;\r\n samplingMode = options.samplingMode === undefined ? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE : options.samplingMode;\r\n format = options.format === undefined ? Constants.TEXTUREFORMAT_RGBA : options.format;\r\n useSRGBBuffer = options.useSRGBBuffer === undefined ? false : options.useSRGBBuffer;\r\n samples = options.samples ?? 1;\r\n label = options.label;\r\n } else {\r\n generateMipMaps = !!options;\r\n }\r\n\r\n useSRGBBuffer = this._getUseSRGBBuffer(useSRGBBuffer, !generateMipMaps);\r\n\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n // if floating point linear (gl.FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n Logger.Warn(\"Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE\");\r\n }\r\n\r\n // A cube render-target attachment routed through _createInternalTexture (e.g. a frame-graph MRT cube\r\n // target: the texture manager creates each attachment via _createInternalTexture and sets isCube for a\r\n // TEXTURE_CUBE_MAP target) must be created as a real bgfx cube texture. This path otherwise only\r\n // produces 2D / 2D-array textures (isCube was silently dropped), so a samplerCube read it back as a\r\n // plain 2D texture and the cube attachment rendered/sampled wrong. Delegate to the cube path so its\r\n // per-face layers (layer*6+face) are addressable.\r\n if (typeof options === \"object\" && options.isCube) {\r\n const cubeSize = (<{ width: number }>size).width ?? <number>size;\r\n return this._createInternalCubeTexture(cubeSize, options, source);\r\n }\r\n\r\n const texture = new InternalTexture(this, source);\r\n const width = (<{ width: number; height: number; layers?: number }>size).width ?? <number>size;\r\n const height = (<{ width: number; height: number; layers?: number }>size).height ?? <number>size;\r\n\r\n const layers = (<{ width: number; height: number; layers?: number }>size).layers || 0;\r\n // Like WebGL, a depth (without layers) requests a volume texture (e.g. a TEXTURE_3D MRT attachment).\r\n const depth = layers ? 0 : (<{ width: number; height: number; depth?: number }>size).depth || 0;\r\n\r\n const nativeTexture = texture._hardwareTexture!.underlyingResource;\r\n const nativeTextureFormat = getNativeTextureFormat(format, type);\r\n // createMipMaps allocates mip storage (e.g. FrameGraph textures) without requesting automatic generation.\r\n const hasMips = this._getRenderTargetHasMips(generateMipMaps || createMipMaps, samples);\r\n // REVIEW: We are always setting the renderTarget flag as we don't know whether the texture will be used as a render target.\r\n // A layers > 0 request creates a 2D texture array (e.g. a cascaded-shadow-map render target); the\r\n // matching per-layer framebuffers are built by createRenderTargetTexture and bound via bindFramebuffer(layer).\r\n this._engine.initializeTexture(nativeTexture, width, height, hasMips, nativeTextureFormat, true, useSRGBBuffer, samples, false, layers || depth, depth > 0);\r\n this._setTextureSampling(nativeTexture, getNativeSamplingMode(samplingMode));\r\n\r\n texture._useSRGBBuffer = useSRGBBuffer;\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.depth = layers || depth;\r\n if (layers > 0) {\r\n texture.is2DArray = true;\r\n texture.baseDepth = layers;\r\n } else if (depth > 0) {\r\n texture.is3D = true;\r\n texture.baseDepth = depth;\r\n }\r\n texture.isReady = true;\r\n texture.samples = samples;\r\n texture.generateMipMaps = generateMipMaps;\r\n this._setHasMipStorage(texture, generateMipMaps || createMipMaps);\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture.format = format;\r\n texture.label = label;\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n return texture;\r\n }\r\n\r\n // Creates a standalone, sampleable cube InternalTexture usable as a mixed-type MRT color attachment (a\r\n // single face is targeted per attachment via the framebuffer's per-attachment layer). Mirrors\r\n // _createInternalTexture's float/half-float linear-filter fallbacks + cache registration, but initializes\r\n // the bgfx texture as a cube render target (there is no cube path through _createInternalTexture, which\r\n // only produces 2D / 2D-array textures).\r\n private _createInternalCubeTexture(size: number, options: InternalTextureCreationOptions, source: InternalTextureSource): InternalTexture {\r\n let type = options.type ?? Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n let samplingMode = options.samplingMode ?? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n const format = options.format ?? Constants.TEXTUREFORMAT_RGBA;\r\n const generateMipMaps = !!options.generateMipMaps;\r\n const samples = options.samples ?? 1;\r\n const useSRGBBuffer = this._getUseSRGBBuffer(!!options.useSRGBBuffer, !generateMipMaps);\r\n\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n Logger.Warn(\"Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE\");\r\n }\r\n\r\n const texture = new InternalTexture(this, source);\r\n texture.isCube = true;\r\n texture.baseWidth = size;\r\n texture.baseHeight = size;\r\n texture.width = size;\r\n texture.height = size;\r\n texture.isReady = true;\r\n texture.samples = samples;\r\n texture.generateMipMaps = generateMipMaps;\r\n this._setHasMipStorage(texture, generateMipMaps || !!options.createMipMaps);\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture.format = format;\r\n texture.label = options.label;\r\n texture._useSRGBBuffer = useSRGBBuffer;\r\n\r\n const nativeTexture = texture._hardwareTexture!.underlyingResource;\r\n const nativeTextureFormat = getNativeTextureFormat(format, type);\r\n // createMipMaps allocates mip storage (e.g. FrameGraph textures) without requesting automatic generation.\r\n const hasMips = this._getRenderTargetHasMips(generateMipMaps || !!options.createMipMaps, samples);\r\n this._engine.initializeTexture(nativeTexture, size, size, hasMips, nativeTextureFormat, /*renderTarget*/ true, useSRGBBuffer, samples, /*isCube*/ true);\r\n this._setTextureSampling(nativeTexture, getNativeSamplingMode(samplingMode));\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n return texture;\r\n }\r\n\r\n public override createRenderTargetTexture(size: TextureSize, options: boolean | RenderTargetCreationOptions): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(false, false, size) as NativeRenderTargetWrapper;\r\n\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let noColorAttachment = false;\r\n let colorAttachment: InternalTexture | undefined = undefined;\r\n let samples = 1;\r\n if (options !== undefined && typeof options === \"object\") {\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = !!options.generateStencilBuffer;\r\n noColorAttachment = !!options.noColorAttachment;\r\n colorAttachment = options.colorAttachment;\r\n samples = options.samples ?? 1;\r\n }\r\n\r\n const width = typeof size === \"number\" ? size : size.width;\r\n const height = typeof size === \"number\" ? size : size.height;\r\n const layers = typeof size === \"number\" ? 0 : size.layers || 0;\r\n const depth = typeof size === \"number\" ? 0 : size.depth || 0;\r\n\r\n // 3D render target (IBL voxel grid + its procedural mip chain): create a real volume texture and\r\n // render to each Z-slice / mip through its own lazily-built framebuffer (see _get3DLayerFramebuffer).\r\n if (depth > 0 && !noColorAttachment && !colorAttachment) {\r\n return this._createRenderTargetTexture3D(rtWrapper, options, width, height, depth, generateDepthBuffer, generateStencilBuffer);\r\n }\r\n\r\n const texture = colorAttachment || (noColorAttachment ? null : this._createInternalTexture(size, options, true, InternalTextureSource.RenderTarget));\r\n\r\n if (layers > 0 && texture) {\r\n // 2D texture array render target (e.g. cascaded shadow maps): the native engine renders each\r\n // array layer through its own framebuffer bound to that layer (mirroring the cube per-face path);\r\n // bindFramebuffer(layerIndex) then selects the right one.\r\n rtWrapper._framebuffers = this._createLayerFramebuffers(\r\n texture._hardwareTexture!.underlyingResource,\r\n width,\r\n height,\r\n layers,\r\n generateStencilBuffer,\r\n generateDepthBuffer,\r\n samples,\r\n texture.generateMipMaps\r\n );\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._samples = samples;\r\n rtWrapper.setTextures(texture);\r\n return rtWrapper;\r\n }\r\n\r\n const framebuffer = this._engine.createFrameBuffer(\r\n texture ? texture._hardwareTexture!.underlyingResource : null,\r\n width,\r\n height,\r\n generateStencilBuffer,\r\n generateDepthBuffer,\r\n samples\r\n );\r\n\r\n rtWrapper._framebuffer = framebuffer;\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._samples = samples;\r\n\r\n rtWrapper.setTextures(texture);\r\n\r\n return rtWrapper;\r\n }\r\n\r\n // Builds a 3D (volume) render-target texture. bgfx renders to individual Z-slices/mips through per-slice\r\n // framebuffers created on demand in _get3DLayerFramebuffer; the volume is sampled as a sampler3D.\r\n private _createRenderTargetTexture3D(\r\n rtWrapper: NativeRenderTargetWrapper,\r\n options: boolean | RenderTargetCreationOptions,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n generateDepthBuffer: boolean,\r\n generateStencilBuffer: boolean\r\n ): RenderTargetWrapper {\r\n const texture = this._createInternalTexture({ width, height, depth }, options, true, InternalTextureSource.RenderTarget);\r\n\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._samples = texture.samples;\r\n rtWrapper.setTextures(texture);\r\n\r\n return rtWrapper;\r\n }\r\n\r\n public override createRenderTargetCubeTexture(size: number, options?: RenderTargetCreationOptions): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(false, true, size) as NativeRenderTargetWrapper;\r\n\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let generateMipMaps = false;\r\n let createMipMaps: boolean | undefined;\r\n let type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n let samplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n let format = Constants.TEXTUREFORMAT_RGBA;\r\n let samples = 1;\r\n let label: string | undefined;\r\n if (options !== undefined && typeof options === \"object\") {\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = !!options.generateStencilBuffer;\r\n generateMipMaps = !!options.generateMipMaps;\r\n createMipMaps = options.createMipMaps;\r\n type = options.type ?? Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n samplingMode = options.samplingMode ?? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n format = options.format ?? Constants.TEXTUREFORMAT_RGBA;\r\n samples = options.samples ?? 1;\r\n label = options.label;\r\n }\r\n\r\n // Storage for a full mip chain is requested via createMipMaps (falling back to generateMipMaps when\r\n // unspecified). HDR prefiltering passes createMipMaps:true + generateMipMaps:false because it renders\r\n // each roughness mip explicitly and must NOT have them auto-regenerated on unbind.\r\n const allocateMips = createMipMaps ?? generateMipMaps;\r\n\r\n // Match _createInternalTexture: float/half-float RTTs that the platform can't linearly filter fall\r\n // back to NEAREST so the cube RTT never carries an unsupported sampling mode.\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n Logger.Warn(\"Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE\");\r\n }\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.RenderTarget);\r\n texture.isCube = true;\r\n texture.baseWidth = size;\r\n texture.baseHeight = size;\r\n texture.width = size;\r\n texture.height = size;\r\n texture.isReady = true;\r\n texture.samples = samples;\r\n texture.generateMipMaps = generateMipMaps;\r\n this._setHasMipStorage(texture, allocateMips);\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture.format = format;\r\n texture.label = label;\r\n\r\n const nativeTexture = texture._hardwareTexture!.underlyingResource;\r\n const nativeTextureFormat = getNativeTextureFormat(format, type);\r\n // See the createRenderTargetTexture MSAA/mips note: avoid the mips + samples combo on bgfx.\r\n const hasMips = this._getRenderTargetHasMips(allocateMips, samples);\r\n this._engine.initializeTexture(nativeTexture, size, size, hasMips, nativeTextureFormat, /*renderTarget*/ true, /*srgb*/ false, samples, /*isCube*/ true);\r\n this._setTextureSampling(nativeTexture, getNativeSamplingMode(samplingMode));\r\n\r\n // The native engine cannot render to all six faces through one framebuffer, so create one\r\n // framebuffer per face (the C++ side binds the matching cube layer); bindFramebuffer(faceIndex)\r\n // then selects the right one.\r\n // generateMipMaps is forwarded as autoGenerateMips: a cube RTT that authors its own mip levels\r\n // (HDR radiance prefiltering passes createMipMaps:true + generateMipMaps:false and renders one\r\n // convolution per face+mip) must not have the chain regenerated from mip 0 when a face resolves,\r\n // which would wipe every explicitly rendered roughness level.\r\n const framebuffers: NativeFramebuffer[] = [];\r\n for (let face = 0; face < 6; face++) {\r\n framebuffers.push(this._engine.createFrameBuffer(nativeTexture, size, size, generateStencilBuffer, generateDepthBuffer, samples, face, 0, generateMipMaps));\r\n }\r\n\r\n rtWrapper._framebuffers = framebuffers;\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._samples = samples;\r\n\r\n rtWrapper.setTextures(texture);\r\n\r\n // Track the hand-built cube RTT texture the same way _createInternalTexture tracks 2D textures so it\r\n // participates in engine-wide lifecycle management (dispose iteration, context rebuild, stats).\r\n this._internalTexturesCache.push(texture);\r\n\r\n return rtWrapper;\r\n }\r\n\r\n // The Native engine renders a multi render target through a single bgfx framebuffer with several color\r\n // attachments (see NativeEngine.cpp CreateMultiFrameBuffer / CreateFrameBufferImpl). Plain 2D color\r\n // attachments (the WebGL prepass / geometry-buffer path) build their framebuffer eagerly here; mixed-type\r\n // attachments (specific cube faces / 2D-array layers) and 3D voxelization MRTs build a layered\r\n // multi-attachment framebuffer lazily on first bind. Sampleable depth textures (generateDepthTexture)\r\n // are not supported. Attachments swapped after creation (e.g. the OIT depth-peeling renderer) rebuild the\r\n // framebuffer via _createMultiRenderTargetFramebuffer (called from NativeRenderTargetWrapper.setTexture).\r\n public override createMultipleRenderTarget(size: TextureSize, options: IMultiRenderTargetOptions, _initializeBuffers = true): RenderTargetWrapper {\r\n let generateMipMaps = false;\r\n let createMipMaps = false;\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let generateDepthTexture = false;\r\n let textureCount = 1;\r\n let samples = 1;\r\n\r\n const defaultType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n const defaultSamplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n const defaultFormat = Constants.TEXTUREFORMAT_RGBA;\r\n\r\n let types: number[] = [];\r\n let samplingModes: number[] = [];\r\n let useSRGBBuffers: boolean[] = [];\r\n let formats: number[] = [];\r\n let targets: number[] = [];\r\n let labels: string[] = [];\r\n let dontCreateTextures = false;\r\n\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(true, false, size) as NativeRenderTargetWrapper;\r\n\r\n if (options !== undefined) {\r\n generateMipMaps = options.generateMipMaps ?? false;\r\n createMipMaps = options.createMipMaps ?? generateMipMaps;\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = options.generateStencilBuffer ?? false;\r\n generateDepthTexture = options.generateDepthTexture ?? false;\r\n textureCount = options.textureCount ?? 1;\r\n samples = options.samples ?? samples;\r\n types = options.types || types;\r\n samplingModes = options.samplingModes || samplingModes;\r\n useSRGBBuffers = options.useSRGBBuffers || useSRGBBuffers;\r\n formats = options.formats || formats;\r\n targets = options.targetTypes || targets;\r\n labels = options.labels || labels;\r\n dontCreateTextures = options.dontCreateTextures ?? false;\r\n }\r\n\r\n const width = (<{ width: number; height: number }>size).width ?? <number>size;\r\n const height = (<{ width: number; height: number }>size).height ?? <number>size;\r\n\r\n // MRT whose color attachments are distinct layers of one shared 3D texture (IBL voxelization: N draw\r\n // buffers → N Z-slices of the voxel grid). The shared texture is assigned later via setInternalTexture,\r\n // so the layered multi-attachment framebuffer is (re)built lazily on first bind (_bindLayeredMultiFramebuffer).\r\n const layerIndex = options?.layerIndex;\r\n const faceIndex = options?.faceIndex;\r\n const layerCounts = options?.layerCounts;\r\n const is3DLayeredMRT = targets.some((t) => t === Constants.TEXTURE_3D);\r\n // A mixed-type MRT renders each color attachment into a specific layer of a 2D-array texture or a\r\n // specific face of a cube texture (alongside plain 2D targets). Detect it so each color texture is\r\n // created with the correct dimensionality and the multi-attachment framebuffer is built lazily with\r\n // per-attachment layer/face (setInternalTexture may swap a shared texture in after creation, e.g. the\r\n // MRT that renders two different layers of one 2D-array via a -1 target + setInternalTexture).\r\n const isLayeredMRT = is3DLayeredMRT || targets.some((t) => t === Constants.TEXTURE_2D_ARRAY || t === Constants.TEXTURE_CUBE_MAP);\r\n\r\n const textures: InternalTexture[] = [];\r\n const attachments: number[] = [];\r\n\r\n rtWrapper.label = options?.label ?? \"MultiRenderTargetWrapper\";\r\n // Without a sampleable depth attachment on Native, a generateDepthTexture request still needs depth testing.\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer || generateDepthTexture;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._attachments = attachments;\r\n\r\n for (let i = 0; i < textureCount; i++) {\r\n const samplingMode = samplingModes[i] || defaultSamplingMode;\r\n const type = types[i] || defaultType;\r\n const format = formats[i] || defaultFormat;\r\n const useSRGBBuffer = (useSRGBBuffers[i] || false) && this._caps.supportSRGBBuffers;\r\n const target = targets[i];\r\n\r\n // Attachment index i+1 mirrors the WebGL COLOR_ATTACHMENTi convention consumers rely on.\r\n attachments.push(i + 1);\r\n\r\n if (target === -1 || dontCreateTextures) {\r\n continue;\r\n }\r\n\r\n // _createInternalTexture initializes the bgfx texture as a sampleable render target and applies\r\n // the float/half-float linear-filter fallbacks + cache registration, matching createRenderTargetTexture.\r\n // The color attachments must carry the same MSAA sample count as the framebuffer's depth attachment\r\n // (created with `samples` below): bgfx rejects a framebuffer that mixes single-sample color targets\r\n // with a multisample depth target, which surfaced as \"Failed to create frame buffer\" for MSAA MRTs\r\n // (e.g. the SSAO prepass). _createInternalTexture already drops mips when samples > 1.\r\n // A mixed-type MRT creates the attachment with the dimensionality requested by targetTypes: a cube\r\n // texture (one face targeted per attachment) or a 2D-array texture with layerCounts layers (one\r\n // layer targeted per attachment). The framebuffer selects the specific face/layer per attachment.\r\n const textureLabel = labels[i] ?? rtWrapper.label + \"-Texture\" + i;\r\n const textureOptions = { generateMipMaps, createMipMaps, type, format, samplingMode, useSRGBBuffer, samples, label: textureLabel };\r\n let texture: InternalTexture;\r\n if (target === Constants.TEXTURE_CUBE_MAP) {\r\n texture = this._createInternalCubeTexture(width, textureOptions, InternalTextureSource.MultiRenderTarget);\r\n } else if (target === Constants.TEXTURE_2D_ARRAY) {\r\n const layerCount = Math.max(1, layerCounts?.[i] ?? 1);\r\n texture = this._createInternalTexture({ width, height, layers: layerCount }, textureOptions, true, InternalTextureSource.MultiRenderTarget);\r\n } else if (target === Constants.TEXTURE_3D) {\r\n const depth = Math.max(1, layerCounts?.[i] || (<{ depth?: number }>size).depth || 1);\r\n texture = this._createInternalTexture({ width, height, depth }, textureOptions, true, InternalTextureSource.MultiRenderTarget);\r\n } else {\r\n texture = this._createInternalTexture({ width, height }, textureOptions, true, InternalTextureSource.MultiRenderTarget);\r\n }\r\n texture._cachedWrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n texture._cachedWrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n\r\n textures[i] = texture;\r\n }\r\n\r\n if (generateDepthTexture && !dontCreateTextures) {\r\n // The multi-framebuffer path allocates its own (non-sampleable) depth/stencil buffer; a separate\r\n // sampleable depth texture attachment is not wired up on Native.\r\n Logger.Warn(\"NativeEngine.createMultipleRenderTarget: generateDepthTexture is not supported; using a non-sampleable depth buffer.\");\r\n }\r\n\r\n if (isLayeredMRT || layerIndex) {\r\n rtWrapper.setLayerAndFaceIndices(layerIndex ?? [], faceIndex ?? []);\r\n }\r\n\r\n // Layered MRTs (3D / 2D-array / cube attachments, possibly mixed with 2D) build their multi-attachment\r\n // framebuffer lazily on first bind. The flag selects that path in bindFramebuffer so per-attachment\r\n // layer/face and post-creation setInternalTexture are honored, even when the size carries no depth.\r\n if (isLayeredMRT) {\r\n rtWrapper._isMixedTypeMRT = true;\r\n }\r\n\r\n rtWrapper._samples = samples;\r\n rtWrapper.setTextures(textures);\r\n\r\n if (!dontCreateTextures && !isLayeredMRT) {\r\n this._createMultiRenderTargetFramebuffer(rtWrapper);\r\n }\r\n\r\n return rtWrapper;\r\n }\r\n\r\n /**\r\n * Creates (or recreates) the native framebuffer of a multi render target from the color attachment\r\n * textures currently held by the wrapper. bgfx binds a fixed attachment set when a framebuffer is\r\n * created and cannot re-point an individual attachment the way GL's framebufferTexture2D can, so the\r\n * whole framebuffer has to be recreated whenever an attachment is swapped after creation (e.g. the OIT\r\n * depth-peeling renderer replaces every attachment via MultiRenderTarget.setInternalTexture).\r\n * @param rtWrapper The multi render target wrapper to build the framebuffer for.\r\n * @internal\r\n */\r\n public _createMultiRenderTargetFramebuffer(rtWrapper: NativeRenderTargetWrapper): void {\r\n const textures = rtWrapper.textures;\r\n if (!textures) {\r\n return;\r\n }\r\n\r\n const colorHandles: NativeTexture[] = [];\r\n for (const texture of textures) {\r\n const handle = texture?._hardwareTexture?.underlyingResource;\r\n if (handle) {\r\n colorHandles.push(handle);\r\n }\r\n }\r\n\r\n // bgfx framebuffers use a dense, ordered attachment list, so only (re)build once every expected color\r\n // attachment is present. Building from a partial set (e.g. attachments deferred via dontCreateTextures /\r\n // targetTypes[i] === -1, or filled out of order) would compress the attachment indices -- attachment 2\r\n // would become attachment 1, etc. -- and produce a framebuffer that does not match the MRT layout. The\r\n // count match guarantees the collected handles are contiguous and in attachment order.\r\n const expectedCount = rtWrapper._attachments ? rtWrapper._attachments.length : colorHandles.length;\r\n if (colorHandles.length === 0 || colorHandles.length !== expectedCount) {\r\n return;\r\n }\r\n\r\n const width = rtWrapper.width;\r\n const height = rtWrapper.height;\r\n\r\n // Prefer an explicit shared depth texture when present (OIT depth peeling shareDepth, FG depth\r\n // attached after dontCreateTextures). Otherwise fall back to auto depth from _generateDepthBuffer.\r\n const explicitDepth = rtWrapper._depthStencilTexture?._hardwareTexture?.underlyingResource as NativeTexture | undefined;\r\n const generateDepthBuffer = !!explicitDepth || rtWrapper._generateDepthBuffer;\r\n\r\n rtWrapper._framebuffer = this._createNativeMultiFrameBuffer(\r\n colorHandles,\r\n width,\r\n height,\r\n this._getDepthAttachmentStencil(rtWrapper),\r\n generateDepthBuffer,\r\n rtWrapper._samples,\r\n undefined,\r\n explicitDepth\r\n );\r\n this._applyDepthTextureSampling(rtWrapper);\r\n }\r\n\r\n private _applyDepthTextureSampling(rtWrapper: NativeRenderTargetWrapper): void {\r\n const depthTexture = rtWrapper._depthStencilTexture;\r\n const nativeDepth = depthTexture?._hardwareTexture?.underlyingResource;\r\n if (!depthTexture || !nativeDepth) {\r\n return;\r\n }\r\n\r\n this._setTextureSampling(nativeDepth, getNativeSamplingMode(depthTexture.samplingMode));\r\n this.updateTextureComparisonFunction(depthTexture, depthTexture._comparisonFunction);\r\n }\r\n\r\n /**\r\n * Creates a multi-attachment framebuffer, falling back to a single-attachment framebuffer bound to the first\r\n * color target (and its first requested layer) on older Babylon Native runtimes without createMultiFrameBuffer.\r\n * @internal\r\n */\r\n public _createNativeMultiFrameBuffer(\r\n colorTextures: NativeTexture[],\r\n width: number,\r\n height: number,\r\n generateStencilBuffer: boolean,\r\n generateDepthBuffer: boolean,\r\n samples: number,\r\n layers?: number[],\r\n explicitDepthTexture?: NativeTexture\r\n ): NativeFramebuffer {\r\n if (this._engine.createMultiFrameBuffer) {\r\n return this._engine.createMultiFrameBuffer(colorTextures, width, height, generateStencilBuffer, generateDepthBuffer, samples, layers, explicitDepthTexture);\r\n }\r\n\r\n // Warn once (limit 1): the framebuffer can be rebuilt many times during attachment setup/swaps.\r\n Logger.Warn(\r\n \"createMultiFrameBuffer is not supported by this version of Babylon Native; multi render targets are unavailable. Falling back to a single-attachment framebuffer bound to the first color target.\",\r\n 1\r\n );\r\n return this._engine.createFrameBuffer(colorTextures[0] ?? null, width, height, generateStencilBuffer, generateDepthBuffer, samples, layers?.[0]);\r\n }\r\n\r\n public override generateMipMapsForCubemap(_texture: InternalTexture, _unbind = true): void {\r\n // The WebGL path rebinds gl.TEXTURE_CUBE_MAP and calls gl.generateMipmap; both deref _gl, which is\r\n // null on Native. bgfx auto-generates the mip chain when a render target texture created with mips is\r\n // resolved (the same way 2D RTTs get their mips here -- unBindFramebuffer issues no explicit mipgen),\r\n // so this is a no-op on Native.\r\n }\r\n\r\n public override bindAttachments(attachments: number[]): void {\r\n // bgfx has no gl.drawBuffers equivalent, so draw calls always write to every color attachment of\r\n // the bound framebuffer. Clears, however, can be masked per attachment (bgfx clear color palette),\r\n // and code such as PrePassRenderer._clear() / ThinDepthPeelingRenderer relies on that.\r\n //\r\n // attachments[i] is the attachment index to enable, or -1 to skip (see buildTextureLayout).\r\n // Do NOT promote \"every entry in this array is enabled\" to 0xff: OIT passes layout [0] (only\r\n // the depth attachment) as a length-1 array, and treating that as \"all attachments\" would\r\n // clear the shared front/back color MRTs with the depth clear value (-99999).\r\n let mask = 0;\r\n for (let i = 0; i < attachments.length; i++) {\r\n const attachmentIndex = attachments[i];\r\n if (attachmentIndex >= 0) {\r\n mask |= 1 << attachmentIndex;\r\n }\r\n }\r\n\r\n // An empty layout disables color clears; it must not clear every attachment instead.\r\n this._clearAttachmentMask = mask;\r\n }\r\n\r\n public override clearAttachments(\r\n color: Nullable<IColor4Like>,\r\n attachments: number[],\r\n clearColor: boolean,\r\n clearDepth: boolean,\r\n clearStencil = false,\r\n stencilClearValue = 0\r\n ): void {\r\n this.bindAttachments(attachments);\r\n this.clear(color, clearColor, clearDepth, clearStencil, stencilClearValue);\r\n }\r\n\r\n public override buildTextureLayout(textureStatus: boolean[], _backBufferLayout = false): number[] {\r\n // Native layouts use attachment indices instead of WebGL draw-buffer enums.\r\n const result: number[] = [];\r\n for (let i = 0; i < textureStatus.length; i++) {\r\n result.push(textureStatus[i] ? i : -1);\r\n }\r\n return result;\r\n }\r\n\r\n public override restoreSingleAttachment(): void {\r\n // Back to the single-attachment back buffer: no masking (see bindAttachments).\r\n this._clearAttachmentMask = _AllAttachmentsMask;\r\n }\r\n\r\n public override restoreSingleAttachmentForRenderTarget(): void {\r\n // Back to a single-attachment render target: no masking (see bindAttachments).\r\n this._clearAttachmentMask = _AllAttachmentsMask;\r\n }\r\n\r\n public override generateMipMapsMultiFramebuffer(_texture: RenderTargetWrapper): void {\r\n // No-op on Native: bgfx auto-generates mips on render-target resolve (as for 2D/cube RTTs).\r\n }\r\n\r\n public override resolveMultiFramebuffer(_texture: RenderTargetWrapper): void {\r\n // No-op on Native: bgfx resolves MSAA render targets automatically.\r\n }\r\n\r\n public override unBindMultiColorAttachmentFramebuffer(_rtWrapper: RenderTargetWrapper, _disableGenerateMipMaps = false, onBeforeUnbind?: () => void): void {\r\n this._currentRenderTarget = null;\r\n if (onBeforeUnbind) {\r\n onBeforeUnbind();\r\n }\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n\r\n public override updateMultipleRenderTargetTextureSampleCount(rtWrapper: Nullable<RenderTargetWrapper>, samples: number, _initializeBuffers = true): number {\r\n if (!rtWrapper || rtWrapper.samples === samples) {\r\n return samples;\r\n }\r\n\r\n const textures = rtWrapper.textures;\r\n if (!textures) {\r\n return rtWrapper.samples;\r\n }\r\n\r\n const nativeRTWrapper = rtWrapper as NativeRenderTargetWrapper;\r\n const depthTexture = nativeRTWrapper._depthStencilTexture;\r\n if (depthTexture?._hardwareTexture && depthTexture.samples !== samples && depthTexture._references > 1) {\r\n throw new Error(\"updateMultipleRenderTargetTextureSampleCount: cannot change samples while using a shared depth texture.\");\r\n }\r\n\r\n // bgfx couples MSAA to the texture creation flags (see updateRenderTargetTextureSampleCount), so\r\n // changing the sample count after the fact requires reissuing every color attachment's underlying\r\n // bgfx handle with the new MSAA flag. initializeTexture disposes the old handle and allocates a fresh\r\n // one while preserving the InternalTexture / Graphics::Texture identity; only the internal bgfx handle\r\n // rotates. Afterwards the framebuffer is recreated so its attachment list refers to the new handles.\r\n const reinitialized = new Set<InternalTexture>();\r\n for (const texture of textures) {\r\n // Wrapped (External-source) textures own an opaque external handle (format=-1); reinitializing\r\n // would destroy it and getNativeTextureFormat would throw, so leave those attachments untouched.\r\n // A texture shared by several attachments (different layers/faces) is reinitialized only once.\r\n if (!texture?._hardwareTexture || texture.source === InternalTextureSource.External || reinitialized.has(texture)) {\r\n continue;\r\n }\r\n reinitialized.add(texture);\r\n\r\n // Keep the full descriptor so cube / 2D-array / 3D attachments keep their dimensionality.\r\n const nativeTexture = texture._hardwareTexture.underlyingResource;\r\n const hasMips = this._getRenderTargetHasMips(this._hasMipStorage(texture), samples);\r\n this._engine.initializeTexture(\r\n nativeTexture,\r\n texture.baseWidth,\r\n texture.baseHeight,\r\n hasMips,\r\n getNativeTextureFormat(texture.format, texture.type),\r\n /*renderTarget*/ true,\r\n texture._useSRGBBuffer,\r\n samples,\r\n texture.isCube,\r\n texture.is2DArray || texture.is3D ? texture.depth : 0,\r\n texture.is3D\r\n );\r\n texture.samples = samples;\r\n }\r\n\r\n nativeRTWrapper._samples = samples;\r\n if (depthTexture?._hardwareTexture && depthTexture.samples !== samples) {\r\n this._recreateDepthStencilTexture(nativeRTWrapper, samples);\r\n }\r\n if (nativeRTWrapper._usesLayeredFramebuffer) {\r\n // Rebuilt on the next bind with the per-attachment layers/faces (the layout key includes samples).\r\n nativeRTWrapper._invalidateLayeredFramebuffer();\r\n } else {\r\n this._createMultiRenderTargetFramebuffer(nativeRTWrapper);\r\n }\r\n\r\n return samples;\r\n }\r\n\r\n public override updateRenderTargetTextureSampleCount(rtWrapper: RenderTargetWrapper, samples: number): number {\r\n if (rtWrapper.samples === samples) {\r\n return samples;\r\n }\r\n\r\n const texture = rtWrapper.texture;\r\n if (!texture?._hardwareTexture) {\r\n return rtWrapper.samples;\r\n }\r\n\r\n // Wrapped (External-source) textures carry an opaque external handle with unknown format/type.\r\n // Recreating the underlying bgfx texture here would destroy the wrapped handle, breaking the\r\n // consumer's ownership contract, and getNativeTextureFormat would throw on format=-1 anyway.\r\n // Reject the request explicitly with a targeted error rather than failing deeper in the stack.\r\n if (texture.source === InternalTextureSource.External) {\r\n throw new Error(\r\n \"updateRenderTargetTextureSampleCount: changing MSAA samples is not supported on wrapped (External-source) textures. Dispose and re-wrap with the desired samples.\"\r\n );\r\n }\r\n\r\n const nativeRTWrapper = rtWrapper as NativeRenderTargetWrapper;\r\n const depthTexture = nativeRTWrapper._depthStencilTexture;\r\n if (depthTexture?._hardwareTexture && depthTexture.samples !== samples && depthTexture._references > 1) {\r\n throw new Error(\"updateRenderTargetTextureSampleCount: cannot change samples while using a shared depth texture.\");\r\n }\r\n const nativeTexture = texture._hardwareTexture.underlyingResource;\r\n\r\n // bgfx couples MSAA to the texture creation flags, so changing samples after the fact requires\r\n // recreating the underlying bgfx texture handle with the new MSAA flag. initializeTexture on the\r\n // Native side calls Graphics::Texture::Create2D, which disposes the existing bgfx handle and\r\n // allocates a fresh one. The Graphics::Texture / InternalTexture wrapper identity is preserved --\r\n // only the internal bgfx handle rotates. After the texture is reissued we also recreate the\r\n // framebuffer so its attachment list refers to the new handle.\r\n //\r\n const hasMips = this._getRenderTargetHasMips(this._hasMipStorage(texture), samples);\r\n const nativeTextureFormat = getNativeTextureFormat(texture.format, texture.type);\r\n const isCube = texture.isCube;\r\n const is3D = texture.is3D;\r\n const layers = texture.is2DArray || is3D ? texture.depth : 0;\r\n\r\n // Lazily-built per-(mip, layer/face) framebuffers reference the texture about to be recreated.\r\n nativeRTWrapper._releaseLayerFramebuffers();\r\n\r\n this._engine.initializeTexture(\r\n nativeTexture,\r\n texture.baseWidth,\r\n texture.baseHeight,\r\n hasMips,\r\n nativeTextureFormat,\r\n /*renderTarget*/ true,\r\n texture._useSRGBBuffer,\r\n samples,\r\n isCube,\r\n layers,\r\n is3D\r\n );\r\n\r\n rtWrapper._samples = samples;\r\n texture.samples = samples;\r\n\r\n const hasDepthStencilTexture = !!rtWrapper._depthStencilTexture?._hardwareTexture;\r\n if (is3D) {\r\n // 3D render targets render through the per-(mip, layer) framebuffers released above.\r\n if (hasDepthStencilTexture) {\r\n this._recreateDepthStencilTexture(nativeRTWrapper, samples);\r\n }\r\n return samples;\r\n }\r\n\r\n if (layers > 0 || isCube) {\r\n // 2D-array RTTs render through one framebuffer per layer and cube RTTs through one per face (see\r\n // createRenderTargetTexture / createRenderTargetCubeTexture). The _framebuffers setter releases the stale\r\n // handles and keeps _framebuffer aliased to the first one for single-target paths.\r\n nativeRTWrapper._framebuffers = this._createLayerFramebuffers(\r\n nativeTexture,\r\n texture.baseWidth,\r\n texture.baseHeight,\r\n isCube ? 6 : layers,\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper._generateDepthBuffer && !hasDepthStencilTexture,\r\n samples,\r\n texture.generateMipMaps\r\n );\r\n } else {\r\n // NativeRenderTargetWrapper._framebuffer setter releases the old framebuffer before assigning,\r\n // so no manual _releaseFramebufferObjects call is needed (and would double-delete the handle).\r\n nativeRTWrapper._framebuffer = this._engine.createFrameBuffer(\r\n nativeTexture,\r\n texture.baseWidth,\r\n texture.baseHeight,\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper._generateDepthBuffer,\r\n samples\r\n );\r\n }\r\n\r\n // A sampleable depth texture must match the new sample count and stay attached to every framebuffer.\r\n if (hasDepthStencilTexture) {\r\n this._recreateDepthStencilTexture(nativeRTWrapper, samples);\r\n }\r\n\r\n return samples;\r\n }\r\n\r\n public override updateTextureSamplingMode(samplingMode: number, texture: InternalTexture): void {\r\n if (texture._hardwareTexture) {\r\n const filter = getNativeSamplingMode(samplingMode);\r\n this._setTextureSampling(texture._hardwareTexture.underlyingResource, filter);\r\n }\r\n\r\n texture.samplingMode = samplingMode;\r\n }\r\n\r\n public override updateTextureWrappingMode(texture: InternalTexture, wrapU: Nullable<number>, wrapV: Nullable<number> = null, wrapR: Nullable<number> = null): void {\r\n if (wrapU !== null) {\r\n texture._cachedWrapU = wrapU;\r\n }\r\n if (wrapV !== null) {\r\n texture._cachedWrapV = wrapV;\r\n }\r\n if ((texture.is2DArray || texture.is3D) && wrapR !== null) {\r\n texture._cachedWrapR = wrapR;\r\n }\r\n\r\n // Apply to the native texture too; axes that were not specified keep their cached (or default) mode.\r\n const nativeTexture = texture._hardwareTexture?.underlyingResource;\r\n if (nativeTexture) {\r\n this._setTextureWrapMode(\r\n nativeTexture,\r\n getNativeAddressMode(texture._cachedWrapU ?? Constants.TEXTURE_WRAP_ADDRESSMODE),\r\n getNativeAddressMode(texture._cachedWrapV ?? Constants.TEXTURE_WRAP_ADDRESSMODE),\r\n getNativeAddressMode(texture._cachedWrapR ?? Constants.TEXTURE_WRAP_ADDRESSMODE)\r\n );\r\n }\r\n }\r\n\r\n public override bindFramebuffer(\r\n texture: RenderTargetWrapper,\r\n faceIndex?: number,\r\n requiredWidth?: number,\r\n requiredHeight?: number,\r\n forceFullscreenViewport?: boolean,\r\n lodLevel?: number,\r\n layer?: number\r\n ): void {\r\n const nativeRTWrapper = texture as NativeRenderTargetWrapper;\r\n\r\n if (this._currentRenderTarget) {\r\n this.unBindFramebuffer(this._currentRenderTarget);\r\n }\r\n\r\n this._currentRenderTarget = texture;\r\n\r\n // Multi render target whose color attachments each target a specific layer/face of a texture: the IBL\r\n // voxelization MRTs (several Z-slices of one shared 3D texture, routed via is3D) and mixed-type MRTs\r\n // (2D-array layer / cube face / 2D attachments, routed via _isMixedTypeMRT). The color textures may be\r\n // swapped in via setInternalTexture after creation, so (re)build the layered multi-attachment\r\n // framebuffer here from the current textures + their per-attachment layer/face indices.\r\n if (nativeRTWrapper.isMulti && (nativeRTWrapper.is3D || nativeRTWrapper._isMixedTypeMRT || this._isLayeredFrameGraphMRT(nativeRTWrapper))) {\r\n this._bindLayeredMultiFramebuffer(nativeRTWrapper);\r\n this._applyBoundViewport(forceFullscreenViewport);\r\n return;\r\n }\r\n\r\n // Single 3D render target (IBL voxel grid + its procedural mip chain): render to the requested\r\n // (mip, layer) through a lazily-built, cached per-slice framebuffer. requiredWidth/Height carry the\r\n // mip dimensions for the voxel mip-copy pass (forceFullscreenViewport is always set by that caller).\r\n if (nativeRTWrapper.is3D) {\r\n this._bindUnboundFramebuffer(this._get3DLayerFramebuffer(nativeRTWrapper, lodLevel ?? 0, layer ?? 0, requiredWidth, requiredHeight));\r\n this._applyBoundViewport(forceFullscreenViewport);\r\n return;\r\n }\r\n\r\n if (requiredWidth || requiredHeight) {\r\n throw new Error(\"Required width/height for frame buffers not yet supported in NativeEngine.\");\r\n }\r\n\r\n // Frame graph render targets are created via createMultipleRenderTarget({ dontCreateTextures: true }),\r\n // so no bgfx framebuffer is built up-front; the externally-allocated color/depth textures are attached\r\n // afterwards via setTexture/setDepthStencilTexture. Lazily build a framebuffer from those textures the\r\n // first time the wrapper is bound. Several wrappers can reference the same underlying texture(s), so the\r\n // framebuffer is cached on (and shared through) the first color texture's hardware wrapper to avoid each\r\n // fresh framebuffer/view clearing the texture and clobbering earlier passes.\r\n if (!nativeRTWrapper._framebuffers && !nativeRTWrapper._framebufferDepthStencil && !nativeRTWrapper._framebuffer) {\r\n this._buildFrameGraphFramebuffer(nativeRTWrapper);\r\n }\r\n\r\n if (nativeRTWrapper._framebuffers) {\r\n // _framebuffers is indexed by cube face for cube render targets, but by array layer for 2D-array\r\n // render targets (cascaded shadow maps, the atmosphere aerial-perspective LUT). Callers pass the\r\n // face in `faceIndex` and the array slice in `layer`, so pick whichever applies to this wrapper;\r\n // indexing a layered target by `faceIndex` bound slice 0 for every layer and left slices 1..N-1\r\n // unwritten.\r\n const isCubeTarget = nativeRTWrapper.isCube;\r\n const framebufferIndex = isCubeTarget ? (faceIndex ?? 0) : layer || faceIndex || 0;\r\n\r\n // Cube render target: bind the framebuffer for the requested face. HDR prefiltering renders each\r\n // roughness level into its own mip, so for lodLevel > 0 lazily build/cache a per-(face, mip)\r\n // framebuffer; the pre-built _framebuffers array only targets mip 0.\r\n if (lodLevel && isCubeTarget) {\r\n this._bindUnboundFramebuffer(this._getCubeFaceMipFramebuffer(nativeRTWrapper, faceIndex ?? 0, lodLevel));\r\n } else {\r\n this._bindUnboundFramebuffer(nativeRTWrapper._framebuffers[Math.min(framebufferIndex, nativeRTWrapper._framebuffers.length - 1)]);\r\n }\r\n } else if (faceIndex) {\r\n throw new Error(\"Cuboid frame buffers are not yet supported in NativeEngine.\");\r\n } else if (nativeRTWrapper._framebufferDepthStencil) {\r\n this._bindUnboundFramebuffer(nativeRTWrapper._framebufferDepthStencil);\r\n } else {\r\n this._bindUnboundFramebuffer(nativeRTWrapper._framebuffer);\r\n }\r\n\r\n // Match ThinEngine: re-apply the cached viewport (or the fullscreen override) after a framebuffer bind.\r\n this._applyBoundViewport(forceFullscreenViewport);\r\n }\r\n\r\n // Re-apply the engine's cached viewport onto the newly bound framebuffer (WebGL/WebGPU behaviour).\r\n // forceFullscreenViewport paints 0..1 without clobbering _cachedViewport, matching ThinEngine's\r\n // use of _viewport() for the fullscreen path.\r\n private _applyBoundViewport(forceFullscreenViewport?: boolean): void {\r\n if (this._cachedViewport && !forceFullscreenViewport) {\r\n this.setViewport(this._cachedViewport);\r\n return;\r\n }\r\n if (forceFullscreenViewport) {\r\n const cached = this._cachedViewport;\r\n this.setViewport(_FullscreenViewport);\r\n this._cachedViewport = cached;\r\n }\r\n }\r\n\r\n // Returns (building + caching on first use) the bgfx framebuffer that targets a single (mip, layer)\r\n // slice of a 3D render-target texture. Used by the IBL voxel grid + procedural mip chain, whose\r\n // ProceduralTexture / mip-copy passes render one Z-slice at a time via bindFramebuffer(lodLevel, layer).\r\n private _get3DLayerFramebuffer(nativeRTWrapper: NativeRenderTargetWrapper, mip: number, layer: number, requiredWidth?: number, requiredHeight?: number): NativeFramebuffer {\r\n if (!nativeRTWrapper._layerFramebuffers) {\r\n nativeRTWrapper._layerFramebuffers = new Map<number, NativeFramebuffer>();\r\n }\r\n const key = mip * nativeRTWrapper.depth + layer;\r\n let framebuffer = nativeRTWrapper._layerFramebuffers.get(key);\r\n if (!framebuffer) {\r\n const nativeTexture = nativeRTWrapper.texture!._hardwareTexture!.underlyingResource;\r\n const depthTexture = nativeRTWrapper._depthStencilTexture;\r\n const nativeDepth = depthTexture?._hardwareTexture?.underlyingResource;\r\n const width = requiredWidth || Math.max(1, nativeRTWrapper.width >> mip);\r\n const height = requiredHeight || Math.max(1, nativeRTWrapper.height >> mip);\r\n if (nativeDepth) {\r\n this._assertVolumeDepthAttachmentSupported();\r\n // createMultiFrameBuffer has no mip selector and the explicit depth texture only covers mip 0.\r\n if (mip !== 0) {\r\n throw new Error(\"NativeEngine: explicit depth attachments on volume render targets only support rendering to mip 0.\");\r\n }\r\n // generateDepth must be set so a depth texture without a native handle yet (created directly on this\r\n // volume) is allocated and aliased by the first slice; later slices borrow the existing handle.\r\n framebuffer = this._engine.createMultiFrameBuffer!(\r\n [nativeTexture],\r\n width,\r\n height,\r\n HasStencilAspect(depthTexture.format),\r\n true,\r\n nativeRTWrapper.samples,\r\n [layer],\r\n nativeDepth\r\n );\r\n this._setTextureSampling(nativeDepth, getNativeSamplingMode(depthTexture.samplingMode));\r\n this.updateTextureComparisonFunction(depthTexture, depthTexture._comparisonFunction);\r\n } else {\r\n framebuffer = this._engine.createFrameBuffer(\r\n nativeTexture,\r\n width,\r\n height,\r\n nativeRTWrapper._generateStencilBuffer,\r\n nativeRTWrapper._generateDepthBuffer,\r\n nativeRTWrapper.samples,\r\n layer,\r\n mip\r\n );\r\n }\r\n nativeRTWrapper._layerFramebuffers.set(key, framebuffer);\r\n }\r\n return framebuffer;\r\n }\r\n\r\n // Returns (building + caching on first use) the bgfx framebuffer that targets a single (face, mip) of a\r\n // cube render-target texture. Used by HDR radiance/irradiance prefiltering, whose face×mip loop renders\r\n // an increasingly-rough convolution of the environment into each mip via bindFramebuffer(faceIndex, lod).\r\n // The pre-built _framebuffers array only covers mip 0, so mips > 0 are built here on demand.\r\n private _getCubeFaceMipFramebuffer(nativeRTWrapper: NativeRenderTargetWrapper, face: number, mip: number): NativeFramebuffer {\r\n // An explicit (sampleable) depth texture only covers mip 0 and native framebuffers cannot select a depth mip,\r\n // so a per-mip framebuffer would silently render against unrelated depth instead of the attached texture.\r\n if (nativeRTWrapper._depthStencilTexture) {\r\n throw new Error(\"NativeEngine: explicit depth attachments on cube render targets only support rendering to mip 0.\");\r\n }\r\n if (!nativeRTWrapper._layerFramebuffers) {\r\n nativeRTWrapper._layerFramebuffers = new Map<number, NativeFramebuffer>();\r\n }\r\n const key = mip * 6 + face;\r\n let framebuffer = nativeRTWrapper._layerFramebuffers.get(key);\r\n if (!framebuffer) {\r\n const nativeTexture = nativeRTWrapper.texture!._hardwareTexture!.underlyingResource;\r\n const width = Math.max(1, nativeRTWrapper.width >> mip);\r\n const height = Math.max(1, nativeRTWrapper.height >> mip);\r\n framebuffer = this._engine.createFrameBuffer(\r\n nativeTexture,\r\n width,\r\n height,\r\n nativeRTWrapper._generateStencilBuffer,\r\n nativeRTWrapper._generateDepthBuffer,\r\n nativeRTWrapper.samples,\r\n face,\r\n mip,\r\n nativeRTWrapper.texture!.generateMipMaps\r\n );\r\n nativeRTWrapper._layerFramebuffers.set(key, framebuffer);\r\n }\r\n return framebuffer;\r\n }\r\n\r\n // A frame-graph multi-render-target wrapper is created via createMultipleRenderTarget({dontCreateTextures:\r\n // true}) WITHOUT targetTypes/layerIndex/faceIndex, so it is never flagged _isMixedTypeMRT at creation: its\r\n // color textures (setTexture) and per-attachment layer/face indices (setLayerAndFaceIndex, from the render\r\n // pass's setOutputLayerAndFaceIndices) are assigned afterwards. Detect the layered case at bind time so it\r\n // routes through _bindLayeredMultiFramebuffer (which renders each draw buffer into the correct 2D-array\r\n // layer / cube face) instead of the flat _buildFrameGraphFramebuffer (which would bind layer 0 of every\r\n // attachment and duplicate a shared array/cube resource, leaving the extra targets unwritten).\r\n private _isLayeredFrameGraphMRT(wrapper: NativeRenderTargetWrapper): boolean {\r\n const textures = wrapper.textures;\r\n if (!textures || textures.length === 0) {\r\n return false;\r\n }\r\n for (const tex of textures) {\r\n if (tex && (tex.isCube || tex.is2DArray || tex.is3D)) {\r\n return true;\r\n }\r\n }\r\n const faceIndices = wrapper.faceIndices;\r\n if (faceIndices) {\r\n for (const face of faceIndices) {\r\n if (face) {\r\n return true;\r\n }\r\n }\r\n }\r\n const layerIndices = wrapper.layerIndices;\r\n if (layerIndices) {\r\n for (const layer of layerIndices) {\r\n if (layer) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n // (Re)builds and binds the multi-attachment framebuffer for a layered MRT: either an IBL voxelization MRT\r\n // (color attachments are distinct Z-slices of one shared 3D texture) or a mixed-type MRT (color attachments\r\n // are specific layers of 2D-array textures and/or faces of cube textures, plus plain 2D). Textures may be\r\n // assigned via setInternalTexture and layers/faces retargeted via setLayerAndFaceIndex after creation, so the\r\n // framebuffer is built lazily here and rebuilt whenever its attachment layout changes.\r\n private _bindLayeredMultiFramebuffer(nativeRTWrapper: NativeRenderTargetWrapper): void {\r\n const textures = nativeRTWrapper.textures;\r\n const layerIndices = nativeRTWrapper.layerIndices;\r\n const expectedCount = nativeRTWrapper._attachments?.length ?? textures?.length ?? 0;\r\n if (!textures || textures.length < expectedCount) {\r\n throw new Error(\"NativeEngine: cannot bind a layered MRT until every color attachment is assigned.\");\r\n }\r\n\r\n const depth = nativeRTWrapper._depthStencilTexture?._hardwareTexture?.underlyingResource as NativeTexture | undefined;\r\n const samples = nativeRTWrapper.samples;\r\n const key = nativeRTWrapper._layeredFramebufferKey;\r\n let upToDate = !!nativeRTWrapper._framebuffer && !!key && key.depth === depth && key.samples === samples && key.colors.length === expectedCount;\r\n\r\n for (let i = 0; i < expectedCount; i++) {\r\n const tex = textures[i];\r\n const nativeTexture = tex?._hardwareTexture?.underlyingResource;\r\n if (!nativeTexture) {\r\n throw new Error(\"NativeEngine: cannot bind a layered MRT until every color attachment is assigned.\");\r\n }\r\n const attachmentLayer = tex.is3D ? (layerIndices?.[i] ?? i) : nativeRTWrapper.getBaseArrayLayer(i);\r\n if (upToDate && (key!.colors[i] !== nativeTexture || key!.layers[i] !== attachmentLayer)) {\r\n upToDate = false;\r\n }\r\n }\r\n\r\n if (!upToDate) {\r\n const colorTextures: NativeTexture[] = new Array(expectedCount);\r\n const layers: number[] = new Array(expectedCount);\r\n for (let i = 0; i < expectedCount; i++) {\r\n const tex = textures[i]!;\r\n colorTextures[i] = tex._hardwareTexture!.underlyingResource;\r\n layers[i] = tex.is3D ? (layerIndices?.[i] ?? i) : nativeRTWrapper.getBaseArrayLayer(i);\r\n }\r\n nativeRTWrapper._framebuffer = this._createNativeMultiFrameBuffer(\r\n colorTextures,\r\n nativeRTWrapper.width,\r\n nativeRTWrapper.height,\r\n this._getDepthAttachmentStencil(nativeRTWrapper),\r\n !!depth || nativeRTWrapper._generateDepthBuffer,\r\n samples,\r\n layers,\r\n depth\r\n );\r\n nativeRTWrapper._layeredFramebufferKey = { colors: colorTextures, layers, depth, samples };\r\n this._applyDepthTextureSampling(nativeRTWrapper);\r\n }\r\n this._bindUnboundFramebuffer(nativeRTWrapper._framebuffer);\r\n }\r\n\r\n public override unBindFramebuffer(texture: RenderTargetWrapper, disableGenerateMipMaps = false, onBeforeUnbind?: () => void): void {\r\n // NOTE: Disabling mipmap generation is not yet supported in NativeEngine.\r\n\r\n this._currentRenderTarget = null;\r\n\r\n if (onBeforeUnbind) {\r\n onBeforeUnbind();\r\n }\r\n\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n\r\n public override createDynamicVertexBuffer(data: DataArray): DataBuffer {\r\n return this.createVertexBuffer(data, true);\r\n }\r\n\r\n public override updateDynamicIndexBuffer(indexBuffer: DataBuffer, indices: IndicesArray, offset: number = 0): void {\r\n const buffer = indexBuffer as NativeDataBuffer;\r\n const data = this._normalizeIndexData(indices);\r\n buffer.is32Bits = data.BYTES_PER_ELEMENT === 4;\r\n this._engine.updateDynamicIndexBuffer(buffer.nativeIndexBuffer!, data.buffer, data.byteOffset, data.byteLength, offset);\r\n }\r\n\r\n public override updateDynamicVertexBuffer(vertexBuffer: DataBuffer, data: DataArray, byteOffset = 0, byteLength?: number): void {\r\n const buffer = vertexBuffer as NativeDataBuffer;\r\n const dataView = data instanceof Array ? new Float32Array(data) : ArrayBuffer.isView(data) ? data : new Uint8Array(data);\r\n const byteView = new Uint8Array(dataView.buffer, dataView.byteOffset, byteLength ?? dataView.byteLength);\r\n this._engine.updateDynamicVertexBuffer(buffer.nativeVertexBuffer!, byteView.buffer, byteView.byteOffset, byteView.byteLength, byteOffset);\r\n }\r\n\r\n // TODO: Refactor to share more logic with base Engine implementation.\r\n /**\r\n * @internal\r\n */\r\n public override _setTexture(channel: number, texture: Nullable<BaseTexture>, isPartOfTextureArray = false, depthStencilTexture = false): boolean {\r\n const uniform = this._boundUniforms[channel] as unknown as NativeUniform;\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n // Not ready?\r\n if (!texture) {\r\n if (this._boundTexturesCache[channel] != null) {\r\n this._activeChannel = channel;\r\n this._boundTexturesCache[channel] = null;\r\n this._unsetNativeTexture(uniform);\r\n }\r\n return false;\r\n }\r\n\r\n // Video\r\n if ((<VideoTexture>texture).video) {\r\n this._activeChannel = channel;\r\n (<VideoTexture>texture).update();\r\n } else if (texture.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n // Delay loading\r\n texture.delayLoad();\r\n return false;\r\n }\r\n\r\n let internalTexture: InternalTexture;\r\n if (depthStencilTexture) {\r\n internalTexture = (<RenderTargetTexture>texture).depthStencilTexture!;\r\n } else if (texture.isReady()) {\r\n internalTexture = <InternalTexture>texture.getInternalTexture();\r\n } else if (texture.isCube) {\r\n internalTexture = this.emptyCubeTexture;\r\n } else if (texture.is3D) {\r\n internalTexture = this.emptyTexture3D;\r\n } else if (texture.is2DArray) {\r\n internalTexture = this.emptyTexture2DArray;\r\n } else {\r\n internalTexture = this.emptyTexture;\r\n }\r\n\r\n this._activeChannel = channel;\r\n\r\n if (!internalTexture || !internalTexture._hardwareTexture) {\r\n return false;\r\n }\r\n\r\n this._setTextureWrapMode(\r\n internalTexture._hardwareTexture.underlyingResource,\r\n getNativeAddressMode(texture.wrapU),\r\n getNativeAddressMode(texture.wrapV),\r\n getNativeAddressMode(texture.wrapR)\r\n );\r\n this._updateAnisotropicLevel(texture);\r\n\r\n this._setNativeTexture(uniform, internalTexture._hardwareTexture.underlyingResource);\r\n\r\n return true;\r\n }\r\n\r\n // filter is a NativeFilter.XXXX value.\r\n private _setTextureSampling(texture: NativeTexture, filter: number) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETTEXTURESAMPLING);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(texture);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(filter);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n // addressModes are NativeAddressMode.XXXX values.\r\n private _setTextureWrapMode(texture: NativeTexture, addressModeU: number, addressModeV: number, addressModeW: number) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETTEXTUREWRAPMODE);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(texture);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(addressModeU);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(addressModeV);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(addressModeW);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n private _setNativeTexture(uniform: NativeUniform, texture: NativeTexture) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETTEXTURE);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(texture);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n private _unsetNativeTexture(uniform: NativeUniform) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_UNSETTEXTURE);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(uniform);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n // TODO: Share more of this logic with the base implementation.\r\n // TODO: Rename to match naming in base implementation once refactoring allows different parameters.\r\n private _updateAnisotropicLevel(texture: BaseTexture) {\r\n const internalTexture = texture.getInternalTexture();\r\n const value = texture.anisotropicFilteringLevel;\r\n\r\n if (!internalTexture || !internalTexture._hardwareTexture) {\r\n return;\r\n }\r\n\r\n if (internalTexture._cachedAnisotropicFilteringLevel !== value) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_SETTEXTUREANISOTROPICLEVEL);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(internalTexture._hardwareTexture.underlyingResource);\r\n this._commandBufferEncoder.encodeCommandArgAsUInt32(value);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n internalTexture._cachedAnisotropicFilteringLevel = value;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _bindTexture(channel: number, texture: Nullable<InternalTexture>): void {\r\n const uniform = this._boundUniforms[channel] as unknown as NativeUniform;\r\n if (!uniform) {\r\n return;\r\n }\r\n\r\n if (texture && texture._hardwareTexture) {\r\n const underlyingResource = texture._hardwareTexture.underlyingResource;\r\n this._setNativeTexture(uniform, underlyingResource);\r\n } else {\r\n this._unsetNativeTexture(uniform);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _bindTextureDirectly(_target: number, _texture: Nullable<InternalTexture>, _forTextureDataUpdate = false, _force = false): boolean {\r\n // Generic texture loaders use this WebGL-shaped method around direct uploads. Native upload commands\r\n // already receive the destination texture explicitly, so there is no bind operation to perform.\r\n return false;\r\n }\r\n\r\n /**\r\n * Unbind all textures\r\n */\r\n public override unbindAllTextures(): void {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DISCARDALLTEXTURES);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n }\r\n\r\n protected override _deleteBuffer(buffer: NativeDataBuffer): void {\r\n if (buffer.nativeIndexBuffer) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DELETEINDEXBUFFER);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(buffer.nativeIndexBuffer);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n delete buffer.nativeIndexBuffer;\r\n }\r\n\r\n if (buffer.nativeVertexBuffer) {\r\n this._commandBufferEncoder.startEncodingCommand(_native.Engine.COMMAND_DELETEVERTEXBUFFER);\r\n this._commandBufferEncoder.encodeCommandArgAsNativeData(buffer.nativeVertexBuffer);\r\n this._commandBufferEncoder.finishEncodingCommand();\r\n delete buffer.nativeVertexBuffer;\r\n }\r\n }\r\n\r\n /**\r\n * Create a canvas\r\n * @param width width\r\n * @param height height\r\n * @returns ICanvas interface\r\n */\r\n public override createCanvas(width: number, height: number): ICanvas {\r\n if (!_native.Canvas) {\r\n throw new Error(\"Native Canvas plugin not available.\");\r\n }\r\n const canvas = new _native.Canvas();\r\n canvas.width = width;\r\n canvas.height = height;\r\n return canvas;\r\n }\r\n\r\n /**\r\n * Create an image to use with canvas\r\n * @returns IImage interface\r\n */\r\n public override createCanvasImage(): IImage {\r\n if (!_native.Image) {\r\n throw new Error(\"Native Canvas plugin not available.\");\r\n }\r\n const image = new _native.Image();\r\n return image;\r\n }\r\n\r\n /**\r\n * Create a 2D path to use with canvas\r\n * @returns IPath2D interface\r\n * @param d SVG path string\r\n */\r\n public override createCanvasPath2D(d?: string): IPath2D {\r\n if (!_native.Path2D) {\r\n throw new Error(\"Native Canvas plugin not available.\");\r\n }\r\n const path2d = new _native.Path2D(d);\r\n return path2d;\r\n }\r\n\r\n /**\r\n * Update a portion of an internal texture\r\n * @param texture defines the texture to update\r\n * @param imageData defines the data to store into the texture\r\n * @param xOffset defines the x coordinates of the update rectangle\r\n * @param yOffset defines the y coordinates of the update rectangle\r\n * @param width defines the width of the update rectangle\r\n * @param height defines the height of the update rectangle\r\n * @param faceIndex defines the face index if texture is a cube (0 by default)\r\n * @param lod defines the lod level to update (0 by default)\r\n * @param generateMipMaps defines whether to generate mipmaps or not\r\n */\r\n public override updateTextureData(\r\n texture: InternalTexture,\r\n imageData: ArrayBufferView,\r\n xOffset: number,\r\n yOffset: number,\r\n width: number,\r\n height: number,\r\n faceIndex: number = 0,\r\n lod: number = 0,\r\n generateMipMaps = false\r\n ): void {\r\n if (!texture._hardwareTexture) {\r\n return;\r\n }\r\n\r\n if (!this._engine.updateTextureData) {\r\n throw new Error(\"updateTextureData not implemented.\");\r\n }\r\n\r\n // bgfx updates the requested sub-rectangle of the existing texture (faceIndex selects the cube\r\n // face / array layer, lod selects the mip level). invertY is forwarded so the native side can match\r\n // the vertical orientation the base texture upload uses. Native rebuilds mips from a full level only, so\r\n // generateMipMaps is ignored for partial updates.\r\n const fullLevel = xOffset === 0 && yOffset === 0 && width === Math.max(1, texture.width >> lod) && height === Math.max(1, texture.height >> lod);\r\n this._engine.updateTextureData(\r\n texture._hardwareTexture.underlyingResource,\r\n imageData,\r\n xOffset,\r\n yOffset,\r\n width,\r\n height,\r\n faceIndex,\r\n lod,\r\n texture.invertY,\r\n generateMipMaps && fullLevel\r\n );\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _uploadCompressedDataToTextureDirectly(\r\n texture: InternalTexture,\r\n internalFormat: number,\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n faceIndex: number = 0,\r\n lod: number = 0\r\n ) {\r\n throw new Error(\"_uploadCompressedDataToTextureDirectly not implemented.\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _uploadDataToTextureDirectly(texture: InternalTexture, imageData: ArrayBufferView, faceIndex: number = 0, lod: number = 0): void {\r\n if (!texture._hardwareTexture) {\r\n return;\r\n }\r\n\r\n const underlyingResource = texture._hardwareTexture.underlyingResource;\r\n\r\n // Per-mip uploads (e.g. KTX2 decoded mip levels, called with that mip's dimensions in texture.width/height)\r\n // update only the requested level of the texture allocated by the lod 0 upload. Older runtimes without\r\n // updateTextureData cannot preserve authored mip content, so fail the load instead of silently\r\n // substituting a chain generated from lod 0.\r\n if (lod > 0) {\r\n if (!this._engine.updateTextureData) {\r\n throw new Error(\"NativeEngine._uploadDataToTextureDirectly: uploading mip levels above 0 requires a Babylon Native runtime with updateTextureData.\");\r\n }\r\n this._engine.updateTextureData(underlyingResource, imageData, 0, 0, texture.width, texture.height, faceIndex, lod, texture.invertY, false);\r\n return;\r\n }\r\n\r\n texture.baseWidth = texture.width;\r\n texture.baseHeight = texture.height;\r\n\r\n // Upload raw pixel data (e.g. the decoded IES profile: a single-channel FLOAT texture) into the\r\n // native texture. Mirrors updateRawTexture. Like texImage2D, Native reads only the texels it needs from a\r\n // larger buffer.\r\n this._engine.loadRawTexture(\r\n underlyingResource,\r\n imageData,\r\n texture.width,\r\n texture.height,\r\n getNativeTextureFormat(texture.format, texture.type),\r\n texture.generateMipMaps,\r\n texture.invertY,\r\n texture._useSRGBBuffer\r\n );\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _uploadArrayBufferViewToTexture(texture: InternalTexture, imageData: ArrayBufferView, faceIndex: number = 0, lod: number = 0): void {\r\n throw new Error(\"_uploadArrayBufferViewToTexture not implemented.\");\r\n }\r\n\r\n public override getFontOffset(font: string): { ascent: number; height: number; descent: number } {\r\n // TODO\r\n const result = { ascent: 0, height: 0, descent: 0 };\r\n return result;\r\n }\r\n\r\n /**\r\n * No equivalent for native. Do nothing.\r\n */\r\n public override flushFramebuffer(): void {}\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public override _readTexturePixels(\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex?: number,\r\n level?: number,\r\n buffer?: Nullable<ArrayBufferView<ArrayBuffer>>,\r\n _flushRenderer?: boolean,\r\n _noDataConversion?: boolean,\r\n x?: number,\r\n y?: number\r\n ): Promise<ArrayBufferView> {\r\n if (faceIndex !== undefined && faceIndex !== -1 && (faceIndex < 0 || faceIndex > 5)) {\r\n throw new Error(`Invalid cubemap face index ${faceIndex}; expected 0-5 or -1.`);\r\n }\r\n\r\n return (\r\n (this._engine.readTexture2 ?? this._engine.readTexture)\r\n .call(\r\n this._engine,\r\n texture._hardwareTexture?.underlyingResource,\r\n level ?? 0,\r\n x ?? 0,\r\n y ?? 0,\r\n width,\r\n height,\r\n buffer?.buffer ?? null,\r\n buffer?.byteOffset ?? 0,\r\n buffer?.byteLength ?? 0,\r\n faceIndex ?? -1\r\n )\r\n // eslint-disable-next-line github/no-then\r\n .then((rawBuffer) => {\r\n if (!buffer) {\r\n // Legacy readTexture returns RGBA8; readTexture2 preserves float sources as RGBA32F.\r\n buffer = rawBuffer.byteLength === 16 * width * height ? new Float32Array(rawBuffer) : new Uint8Array(rawBuffer);\r\n }\r\n\r\n return buffer;\r\n })\r\n );\r\n }\r\n\r\n override startTimeQuery(): Nullable<_TimeToken> {\r\n if (!this._gpuFrameTimeToken) {\r\n this._gpuFrameTimeToken = new _TimeToken();\r\n }\r\n\r\n // Always return the same time token. For native, we don't need a start marker, we just query for native frame stats.\r\n return this._gpuFrameTimeToken;\r\n }\r\n\r\n override endTimeQuery(token: _TimeToken): int {\r\n this._engine.populateFrameStats(this._frameStats);\r\n return this._frameStats.gpuTimeNs;\r\n }\r\n}\r\n"]}