@babylonjs/core 9.12.1 → 9.14.0
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.
- package/Animations/runtimeAnimation.js +11 -0
- package/Animations/runtimeAnimation.js.map +1 -1
- package/AudioV2/abstractAudio/abstractSound.d.ts +2 -1
- package/AudioV2/abstractAudio/abstractSound.js +3 -2
- package/AudioV2/abstractAudio/abstractSound.js.map +1 -1
- package/AudioV2/abstractAudio/abstractSoundInstance.d.ts +1 -1
- package/AudioV2/abstractAudio/abstractSoundInstance.js.map +1 -1
- package/AudioV2/abstractAudio/staticSound.d.ts +6 -0
- package/AudioV2/abstractAudio/staticSound.js +9 -1
- package/AudioV2/abstractAudio/staticSound.js.map +1 -1
- package/AudioV2/abstractAudio/streamingSound.d.ts +6 -0
- package/AudioV2/abstractAudio/streamingSound.js +9 -1
- package/AudioV2/abstractAudio/streamingSound.js.map +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.d.ts +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.js +6 -3
- package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.d.ts +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js +7 -4
- package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
- package/Cameras/arcRotateCamera.pure.js +9 -3
- package/Cameras/arcRotateCamera.pure.js.map +1 -1
- package/Cameras/targetCamera.pure.js +18 -18
- package/Cameras/targetCamera.pure.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +111 -4
- package/Collisions/gpuPicker.js +696 -119
- package/Collisions/gpuPicker.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +4 -2
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/Native/nativeRenderTargetWrapper.d.ts +3 -0
- package/Engines/Native/nativeRenderTargetWrapper.js +24 -1
- package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.videoTexture.pure.js +16 -3
- package/Engines/WebGPU/Extensions/engine.videoTexture.pure.js.map +1 -1
- package/Engines/abstractEngine.pure.d.ts +8 -1
- package/Engines/abstractEngine.pure.js +4 -3
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/engine.d.ts +113 -0
- package/Engines/nullEngine.pure.js +5 -1
- package/Engines/nullEngine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.d.ts +5 -0
- package/Engines/thinNativeEngine.pure.js +158 -13
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/FlowGraph/flowGraph.js +9 -0
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphDataConnection.pure.d.ts +14 -0
- package/FlowGraph/flowGraphDataConnection.pure.js +38 -1
- package/FlowGraph/flowGraphDataConnection.pure.js.map +1 -1
- package/FlowGraph/serialization.d.ts +11 -0
- package/FlowGraph/serialization.js +11 -1
- package/FlowGraph/serialization.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.d.ts +2 -2
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js +43 -51
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.d.ts +0 -1
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js +63 -35
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.pure.d.ts +1 -1
- package/Lights/Clustered/clusteredLightContainer.pure.js +2 -2
- package/Lights/Clustered/clusteredLightContainer.pure.js.map +1 -1
- package/Lights/areaLight.pure.js +5 -0
- package/Lights/areaLight.pure.js.map +1 -1
- package/Lights/light.d.ts +4 -2
- package/Lights/light.js +10 -4
- package/Lights/light.js.map +1 -1
- package/Lights/rectAreaLight.pure.d.ts +17 -0
- package/Lights/rectAreaLight.pure.js +67 -0
- package/Lights/rectAreaLight.pure.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.pure.js +1 -1
- package/Loading/Plugins/babylonFileLoader.pure.js.map +1 -1
- package/Loading/sceneLoader.d.ts +5 -1
- package/Loading/sceneLoader.js +298 -401
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.d.ts +15 -0
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js +34 -1
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.d.ts +9 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +26 -2
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js +3 -1
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js.map +1 -1
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.d.ts +43 -0
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.js +64 -0
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.js.map +1 -0
- package/Materials/Textures/HTML/htmlInteractionManager.d.ts +69 -0
- package/Materials/Textures/HTML/htmlInteractionManager.js +130 -0
- package/Materials/Textures/HTML/htmlInteractionManager.js.map +1 -0
- package/Materials/Textures/HTML/htmlRaycastInteractionManager.d.ts +84 -0
- package/Materials/Textures/HTML/htmlRaycastInteractionManager.js +246 -0
- package/Materials/Textures/HTML/htmlRaycastInteractionManager.js.map +1 -0
- package/Materials/Textures/HTML/htmlTexture.d.ts +148 -0
- package/Materials/Textures/HTML/htmlTexture.js +455 -0
- package/Materials/Textures/HTML/htmlTexture.js.map +1 -0
- package/Materials/Textures/HTML/index.d.ts +4 -0
- package/Materials/Textures/HTML/index.js +5 -0
- package/Materials/Textures/HTML/index.js.map +1 -0
- package/Materials/Textures/HTML/pure.d.ts +5 -0
- package/Materials/Textures/HTML/pure.js +6 -0
- package/Materials/Textures/HTML/pure.js.map +1 -0
- package/Materials/Textures/index.d.ts +1 -0
- package/Materials/Textures/index.js +1 -1
- package/Materials/Textures/index.js.map +1 -1
- package/Materials/Textures/pure.d.ts +1 -0
- package/Materials/Textures/pure.js +1 -0
- package/Materials/Textures/pure.js.map +1 -1
- package/Materials/Textures/videoTexture.pure.d.ts +3 -0
- package/Materials/Textures/videoTexture.pure.js +30 -0
- package/Materials/Textures/videoTexture.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +36 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +56 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.d.ts +3 -1
- package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.js +210 -48
- package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.d.ts +1 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +34 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js +1 -0
- package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/Shaders/gaussianSplatting.fragment.js +17 -1
- package/Shaders/gaussianSplatting.fragment.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +1 -1
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/Shaders/gaussianSplattingDepth.vertex.js +1 -1
- package/Shaders/gaussianSplattingDepth.vertex.js.map +1 -1
- package/Shaders/picking.fragment.js +39 -3
- package/Shaders/picking.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +3 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +4 -3
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.fragment.js +14 -1
- package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +2 -2
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js +2 -2
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
- package/ShadersWGSL/picking.fragment.js +22 -1
- package/ShadersWGSL/picking.fragment.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpuPicker.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/gpuPicker.ts"],"names":[],"mappings":"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","sourcesContent":["import { type AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type Engine } from \"core/Engines/engine\";\r\nimport { type WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture.pure\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { type IShaderMaterialOptions, ShaderMaterial } from \"core/Materials/shaderMaterial.pure\";\r\nimport { GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial.pure\";\r\nimport { GaussianSplattingGpuPickingMaterialPlugin } from \"core/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure\";\r\nimport { Color4 } from \"core/Maths/math.color.pure\";\r\nimport { type IVector2Like } from \"core/Maths/math.like\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { VertexBuffer } from \"core/Meshes/buffer\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\n\r\n/**\r\n * Class used to store the result of a GPU picking operation\r\n */\r\nexport interface IGPUPickingInfo {\r\n /**\r\n * Picked mesh\r\n */\r\n mesh: AbstractMesh;\r\n /**\r\n * Picked thin instance index\r\n */\r\n thinInstanceIndex?: number;\r\n}\r\n\r\n/**\r\n * Stores the result of a multi GPU piciking operation\r\n */\r\nexport interface IGPUMultiPickingInfo {\r\n /**\r\n * Picked mesh\r\n */\r\n meshes: Nullable<AbstractMesh>[];\r\n /**\r\n * Picked thin instance index\r\n */\r\n thinInstanceIndexes?: number[];\r\n}\r\n\r\n/**\r\n * Class used to perform a picking operation using GPU\r\n * GPUPIcker can pick meshes, instances and thin instances\r\n */\r\nexport class GPUPicker {\r\n private static readonly _AttributeName = \"instanceMeshID\";\r\n private static readonly _MaxPickingId = 0x00ffffff; // 24 bits unsigned integer max\r\n\r\n private _pickingTexture: Nullable<RenderTargetTexture> = null;\r\n\r\n private readonly _idMap: Array<number> = [];\r\n private readonly _thinIdMap: Array<{ meshId: number; thinId: number }> = [];\r\n private readonly _meshUniqueIdToPickerId: Array<number> = [];\r\n private _idWarningIssued = false;\r\n\r\n private _cachedScene: Nullable<Scene> = null;\r\n private _engine: Nullable<AbstractEngine> = null;\r\n\r\n private readonly _pickingMaterialCache: Nullable<ShaderMaterial>[] = new Array(9).fill(null);\r\n\r\n private _pickableMeshes: Array<AbstractMesh> = [];\r\n private readonly _meshMaterialMap: Map<AbstractMesh, Material> = new Map();\r\n private _readbuffer: Nullable<Uint8Array> = null;\r\n\r\n private _meshRenderingCount: number = 0;\r\n private _renderWarningIssued = false;\r\n private _renderPickingTexture = false;\r\n\r\n private _sceneBeforeRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _pickingTextureAfterRenderObserver: Nullable<Observer<number>> = null;\r\n\r\n private _nextFreeId = 1;\r\n\r\n private readonly _gsPickingMaterials: Material[] = [];\r\n private readonly _gsCompoundRenderMeshes: AbstractMesh[] = [];\r\n\r\n /** Shader language used by the generator */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this generator.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private _pickingInProgress = false;\r\n\r\n /**\r\n * Gets a boolean indicating if the picking is in progress\r\n */\r\n public get pickingInProgress(): boolean {\r\n return this._pickingInProgress;\r\n }\r\n\r\n /**\r\n * Gets the default render materials used by the picker.\r\n *\r\n * index is Material filling mode\r\n */\r\n public get defaultRenderMaterials(): readonly Nullable<ShaderMaterial>[] {\r\n return this._pickingMaterialCache;\r\n }\r\n\r\n private _getColorIdFromReadBuffer(offset: number): number {\r\n const r = this._readbuffer![offset];\r\n const g = this._readbuffer![offset + 1];\r\n const b = this._readbuffer![offset + 2];\r\n return (r << 16) + (g << 8) + b;\r\n }\r\n\r\n private _createRenderTarget(scene: Scene, width: number, height: number): void {\r\n if (this._cachedScene && this._pickingTexture) {\r\n const index = this._cachedScene.customRenderTargets.indexOf(this._pickingTexture);\r\n if (index > -1) {\r\n this._cachedScene.customRenderTargets.splice(index, 1);\r\n this._renderPickingTexture = false;\r\n }\r\n }\r\n if (this._pickingTexture) {\r\n this._pickingTexture.dispose();\r\n }\r\n this._pickingTexture = new RenderTargetTexture(\"pickingTexure\", { width: width, height: height }, scene, {\r\n generateMipMaps: false,\r\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_NEAREST,\r\n });\r\n }\r\n\r\n private _clearPickingMaterials(): void {\r\n for (let i = 0; i < this._pickingMaterialCache.length; i++) {\r\n const material = this._pickingMaterialCache[i];\r\n if (material !== null) {\r\n material.dispose();\r\n this._pickingMaterialCache[i] = null;\r\n }\r\n }\r\n }\r\n\r\n private _getPickingMaterial(scene: Scene, fillMode: number): ShaderMaterial {\r\n if (fillMode < 0 || 8 < fillMode) {\r\n fillMode = Constants.MATERIAL_TriangleFillMode;\r\n }\r\n\r\n const cachedMaterial = this._pickingMaterialCache[fillMode];\r\n if (cachedMaterial) {\r\n return cachedMaterial;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n const defines: string[] = [];\r\n const options: Partial<IShaderMaterialOptions> = {\r\n attributes: [VertexBuffer.PositionKind, GPUPicker._AttributeName],\r\n uniforms: [\"world\", \"viewProjection\", \"meshID\"],\r\n needAlphaBlending: false,\r\n defines: defines,\r\n useClipPlane: null,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/picking.fragment\"), import(\"../ShadersWGSL/picking.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/picking.fragment\"), import(\"../Shaders/picking.vertex\")]);\r\n }\r\n },\r\n };\r\n\r\n const newMaterial = new ShaderMaterial(\"pickingShader\", scene, \"picking\", options, false);\r\n newMaterial.fillMode = fillMode;\r\n newMaterial.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n\r\n this._pickingMaterialCache[fillMode] = newMaterial;\r\n return newMaterial;\r\n }\r\n\r\n private _materialBindCallback(mesh: AbstractMesh | undefined): void {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n\r\n if (!material) {\r\n if (!this._renderWarningIssued) {\r\n this._renderWarningIssued = true;\r\n Logger.Warn(\"GPUPicker issue: Mesh not found in the material map. This may happen when the root mesh of an instance is not in the picking list.\");\r\n }\r\n return;\r\n }\r\n\r\n const effect = material.getEffect();\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n if (!mesh.hasInstances && !mesh.isAnInstance && !mesh.hasThinInstances && this._meshUniqueIdToPickerId[mesh.uniqueId] !== undefined) {\r\n effect.setFloat(\"meshID\", this._meshUniqueIdToPickerId[mesh.uniqueId]);\r\n }\r\n\r\n this._meshRenderingCount++;\r\n }\r\n\r\n /**\r\n * Set the list of meshes to pick from\r\n * Set that value to null to clear the list (and avoid leaks)\r\n * The module will read and delete from the array provided by reference. Disposing the module or setting the value to null will clear the array.\r\n * @param list defines the list of meshes to pick from\r\n */\r\n public setPickingList(list: Nullable<Array<AbstractMesh | { mesh: AbstractMesh; material: ShaderMaterial }>>): void {\r\n this.clearPickingList();\r\n\r\n if (!list || list.length === 0) {\r\n return;\r\n }\r\n\r\n // Prepare target\r\n const scene = (\"mesh\" in list[0] ? list[0].mesh : list[0]).getScene();\r\n if (!this._cachedScene || this._cachedScene !== scene) {\r\n this._clearPickingMaterials();\r\n }\r\n\r\n this.addPickingList(list);\r\n }\r\n\r\n /**\r\n * Clear the current picking list and free resources\r\n */\r\n public clearPickingList(): void {\r\n if (this._pickableMeshes) {\r\n // Cleanup\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n const className = mesh.getClassName();\r\n\r\n // Skip GS part proxies - they don't have instance buffers or render list entries\r\n if (className === \"GaussianSplattingPartProxyMesh\") {\r\n continue;\r\n }\r\n\r\n // Skip thin instance cleanup for GaussianSplattingMesh (thin instances are for batching, not picking)\r\n if (className !== \"GaussianSplattingMesh\") {\r\n if (mesh.hasInstances) {\r\n (mesh as Mesh).removeVerticesData(GPUPicker._AttributeName);\r\n }\r\n if (mesh.hasThinInstances) {\r\n (mesh as Mesh).thinInstanceSetBuffer(GPUPicker._AttributeName, null);\r\n }\r\n }\r\n\r\n if (this._pickingTexture) {\r\n this._pickingTexture.setMaterialForRendering(mesh, undefined);\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh);\r\n if (material && !this._pickingMaterialCache.includes(material as ShaderMaterial)) {\r\n material.onBindObservable.removeCallback(this._materialBindCallback);\r\n }\r\n }\r\n\r\n // Clean up GS compound meshes from render list\r\n for (const mesh of this._gsCompoundRenderMeshes) {\r\n if (this._pickingTexture) {\r\n this._pickingTexture.setMaterialForRendering(mesh, undefined);\r\n }\r\n }\r\n this._gsCompoundRenderMeshes.length = 0;\r\n\r\n // Dispose GS picking materials\r\n for (const material of this._gsPickingMaterials) {\r\n material.dispose();\r\n }\r\n this._gsPickingMaterials.length = 0;\r\n\r\n this._pickableMeshes.length = 0;\r\n this._meshMaterialMap.clear();\r\n this._idMap.length = 0;\r\n this._thinIdMap.length = 0;\r\n this._meshUniqueIdToPickerId.length = 0;\r\n if (this._pickingTexture) {\r\n this._pickingTexture.renderList = [];\r\n }\r\n }\r\n\r\n this._nextFreeId = 1;\r\n }\r\n\r\n /**\r\n * Add array of meshes to the current picking list\r\n * @param list defines the array of meshes to add to the current picking list\r\n */\r\n public addPickingList(list: Array<AbstractMesh | { mesh: AbstractMesh; material: ShaderMaterial }>): void {\r\n if (!list || list.length === 0) {\r\n return;\r\n }\r\n\r\n // Prepare target\r\n const scene = (\"mesh\" in list[0] ? list[0].mesh : list[0]).getScene();\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n if (!this._pickingTexture) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n } else {\r\n const size = this._pickingTexture.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH || this._cachedScene !== scene) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n }\r\n }\r\n\r\n this._sceneBeforeRenderObserver?.remove();\r\n this._sceneBeforeRenderObserver = scene.onBeforeRenderObservable.add(() => {\r\n if (scene.frameGraph && this._renderPickingTexture && this._cachedScene && this._pickingTexture) {\r\n this._cachedScene._renderRenderTarget(this._pickingTexture, this._cachedScene.cameras?.[0] ?? null);\r\n this._cachedScene.activeCamera = null;\r\n }\r\n });\r\n\r\n this._cachedScene = scene;\r\n this._engine = scene.getEngine();\r\n if (!this._pickingTexture!.renderList) {\r\n this._pickingTexture!.renderList = [];\r\n }\r\n\r\n const newPickableMeshes: AbstractMesh[] = new Array(list.length);\r\n const pickableMeshOffset = this._pickableMeshes?.length ?? 0;\r\n\r\n this._cachedScene = scene;\r\n this._engine = scene.getEngine();\r\n\r\n for (let i = 0; i < list.length; i++) {\r\n const item = list[i];\r\n if (\"mesh\" in item) {\r\n this._meshMaterialMap.set(item.mesh, item.material);\r\n newPickableMeshes[i] = item.mesh;\r\n } else {\r\n const className = item.getClassName();\r\n if (className === \"GaussianSplattingMesh\" || className === \"GaussianSplattingPartProxyMesh\") {\r\n // GS meshes get special picking materials - handled in the ID assignment loop below\r\n newPickableMeshes[i] = item;\r\n } else {\r\n const material = this._getPickingMaterial(scene, item.material?.fillMode ?? Constants.MATERIAL_TriangleFillMode);\r\n this._meshMaterialMap.set(item, material);\r\n newPickableMeshes[i] = item;\r\n }\r\n }\r\n }\r\n\r\n if (this._pickableMeshes !== null) {\r\n this._pickableMeshes = [...this._pickableMeshes, ...newPickableMeshes];\r\n } else {\r\n this._pickableMeshes = newPickableMeshes;\r\n }\r\n\r\n // We will affect colors and create vertex color buffers\r\n let nextFreeId = this._nextFreeId;\r\n\r\n // Collect GaussianSplatting part proxy groups for compound picking\r\n const gsCompoundGroups: { compound: AbstractMesh; partEntries: { proxy: AbstractMesh; globalIndex: number }[] }[] = [];\r\n\r\n for (let index = 0; index < newPickableMeshes.length; index++) {\r\n const mesh = newPickableMeshes[index];\r\n const className = mesh.getClassName();\r\n\r\n // Handle GaussianSplatting part proxy meshes - collect by compound for processing after the loop\r\n if (className === \"GaussianSplattingPartProxyMesh\") {\r\n const proxy = mesh as any; // GaussianSplattingPartProxyMesh\r\n const compound = proxy.compoundSplatMesh;\r\n const globalIndex = index + pickableMeshOffset;\r\n\r\n let group = gsCompoundGroups[compound.uniqueId];\r\n if (!group) {\r\n group = { compound, partEntries: [] };\r\n gsCompoundGroups[compound.uniqueId] = group;\r\n }\r\n group.partEntries.push({ proxy, globalIndex });\r\n continue; // Don't add to render list - the compound mesh will render for all parts\r\n }\r\n\r\n // Handle non-compound GaussianSplatting meshes\r\n if (className === \"GaussianSplattingMesh\") {\r\n const globalIndex = index + pickableMeshOffset;\r\n const pickId = nextFreeId;\r\n this._idMap[pickId] = globalIndex;\r\n this._meshUniqueIdToPickerId[mesh.uniqueId] = pickId;\r\n nextFreeId++;\r\n\r\n if (!mesh.isPickable || !mesh.isVisible) {\r\n continue;\r\n }\r\n\r\n // Create a GaussianSplattingMaterial with picking plugin for GPU picking\r\n const gsPickingMaterial = this._createGaussianSplattingPickingMaterial(scene, mesh);\r\n const plugin = gsPickingMaterial.pluginManager!.getPlugin<GaussianSplattingGpuPickingMaterialPlugin>(\"GaussianSplatGpuPicking\")!;\r\n plugin.meshId = pickId;\r\n\r\n gsPickingMaterial.onBindObservable.add(() => {\r\n this._meshRenderingCount++;\r\n });\r\n\r\n this._gsPickingMaterials.push(gsPickingMaterial);\r\n this._meshMaterialMap.set(mesh, gsPickingMaterial);\r\n this._pickingTexture!.setMaterialForRendering(mesh, gsPickingMaterial);\r\n this._pickingTexture!.renderList!.push(mesh);\r\n continue;\r\n }\r\n\r\n // Standard mesh processing\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n\r\n if (!this._pickingMaterialCache.includes(material as ShaderMaterial)) {\r\n material.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n }\r\n this._pickingTexture!.setMaterialForRendering(mesh, material);\r\n this._pickingTexture!.renderList!.push(mesh);\r\n\r\n if (mesh.isAnInstance) {\r\n continue; // This will be handled by the source mesh\r\n }\r\n\r\n const globalIndex = index + pickableMeshOffset;\r\n\r\n if (mesh.hasThinInstances) {\r\n const thinInstanceCount = (mesh as Mesh).thinInstanceCount;\r\n const instanceIdData = new Float32Array(thinInstanceCount);\r\n for (let i = 0; i < thinInstanceCount; i++) {\r\n instanceIdData[i] = nextFreeId;\r\n this._thinIdMap[nextFreeId] = { meshId: globalIndex, thinId: i };\r\n nextFreeId++;\r\n }\r\n (mesh as Mesh).thinInstanceSetBuffer(GPUPicker._AttributeName, instanceIdData, 1);\r\n } else {\r\n const currentMeshId = nextFreeId;\r\n this._idMap[currentMeshId] = globalIndex;\r\n nextFreeId++;\r\n\r\n if (mesh.hasInstances) {\r\n // find index of instances of that mesh\r\n const instancesForPick: number[] = [];\r\n for (let pickableMeshIndex = 0; pickableMeshIndex < newPickableMeshes.length; ++pickableMeshIndex) {\r\n const m = newPickableMeshes[pickableMeshIndex];\r\n if (m.isAnInstance && (m as InstancedMesh).sourceMesh === mesh) {\r\n instancesForPick.push(pickableMeshIndex);\r\n }\r\n }\r\n const instanceIdData = new Float32Array(instancesForPick.length + 1); // +1 for the source mesh\r\n\r\n instanceIdData[0] = currentMeshId;\r\n for (let i = 0; i < instancesForPick.length; i++) {\r\n instanceIdData[i + 1] = nextFreeId;\r\n const globalInstanceIndex = instancesForPick[i] + pickableMeshOffset;\r\n this._idMap[nextFreeId] = globalInstanceIndex;\r\n nextFreeId++;\r\n }\r\n\r\n const engine = mesh.getEngine();\r\n const buffer = new VertexBuffer(engine, instanceIdData, GPUPicker._AttributeName, false, false, 1, true);\r\n (mesh as Mesh).setVerticesBuffer(buffer, true);\r\n } else {\r\n this._meshUniqueIdToPickerId[mesh.uniqueId] = currentMeshId;\r\n }\r\n }\r\n }\r\n\r\n // Process GaussianSplatting compound groups (part proxy meshes)\r\n for (const group of gsCompoundGroups) {\r\n if (!group) {\r\n continue;\r\n }\r\n const compound = group.compound;\r\n\r\n // Assign picking IDs for each part\r\n const partMeshIds: number[] = new Array((compound as any).partCount || 1).fill(0);\r\n for (const entry of group.partEntries) {\r\n const pickId = nextFreeId;\r\n this._idMap[pickId] = entry.globalIndex;\r\n const partIndex = (entry.proxy as any).partIndex;\r\n if (partIndex < partMeshIds.length) {\r\n partMeshIds[partIndex] = pickId;\r\n }\r\n nextFreeId++;\r\n }\r\n\r\n // Create compound GS picking material with plugin\r\n const gsPickingMaterial = this._createGaussianSplattingPickingMaterial(scene, compound);\r\n const plugin = gsPickingMaterial.pluginManager!.getPlugin<GaussianSplattingGpuPickingMaterialPlugin>(\"GaussianSplatGpuPicking\")!;\r\n plugin.isCompound = true;\r\n plugin.partMeshIds = partMeshIds;\r\n // Only active (included, visible, and pickable) parts should contribute to the depth buffer.\r\n const activeParts = group.partEntries\r\n .filter((e) => (e.proxy as AbstractMesh).isPickable && (e.proxy as AbstractMesh).isVisible)\r\n .map((e) => (e.proxy as any).partIndex as number);\r\n plugin.setPartActive(activeParts);\r\n\r\n gsPickingMaterial.onBindObservable.add(() => {\r\n this._meshRenderingCount++;\r\n });\r\n\r\n this._gsPickingMaterials.push(gsPickingMaterial);\r\n this._meshMaterialMap.set(compound, gsPickingMaterial);\r\n this._pickingTexture!.setMaterialForRendering(compound, gsPickingMaterial);\r\n this._pickingTexture!.renderList!.push(compound);\r\n this._gsCompoundRenderMeshes.push(compound);\r\n }\r\n\r\n if (GPUPicker._MaxPickingId < nextFreeId - 1) {\r\n if (!this._idWarningIssued) {\r\n this._idWarningIssued = true;\r\n Logger.Warn(`GPUPicker maximum number of pickable meshes and instances is ${GPUPicker._MaxPickingId}. Some meshes or instances won't be pickable.`);\r\n }\r\n }\r\n\r\n this._nextFreeId = nextFreeId;\r\n }\r\n\r\n /**\r\n * Execute a picking operation\r\n * @param x defines the X coordinates where to run the pick\r\n * @param y defines the Y coordinates where to run the pick\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)\r\n * @returns A promise with the picking results\r\n */\r\n public async pickAsync(x: number, y: number, disposeWhenDone = false): Promise<Nullable<IGPUPickingInfo>> {\r\n if (this._pickingInProgress) {\r\n return null;\r\n }\r\n\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return null;\r\n }\r\n\r\n const { rttSizeW, rttSizeH, devicePixelRatio } = this._getRenderInfo();\r\n\r\n const { x: adjustedX, y: adjustedY } = this._prepareForPicking(x, y, devicePixelRatio);\r\n if (adjustedX < 0 || adjustedY < 0 || adjustedX >= rttSizeW || adjustedY >= rttSizeH) {\r\n return null;\r\n }\r\n\r\n this._pickingInProgress = true;\r\n\r\n // Invert Y\r\n const invertedY = rttSizeH - adjustedY - 1;\r\n this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, adjustedX, invertedY);\r\n\r\n await this._waitForPickingMaterialsReadyAsync();\r\n\r\n return await this._executePickingAsync(adjustedX, invertedY, disposeWhenDone);\r\n }\r\n\r\n /**\r\n * Execute a picking operation on multiple coordinates\r\n * @param xy defines the X,Y coordinates where to run the pick\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)\r\n * @returns A promise with the picking results. Always returns an array with the same length as the number of coordinates. The mesh or null at the index where no mesh was picked.\r\n */\r\n public async multiPickAsync(xy: IVector2Like[], disposeWhenDone = false): Promise<Nullable<IGPUMultiPickingInfo>> {\r\n if (this._pickingInProgress) {\r\n return null;\r\n }\r\n\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0 || xy.length === 0) {\r\n return null;\r\n }\r\n\r\n if (xy.length === 1) {\r\n const pi = await this.pickAsync(xy[0].x, xy[0].y, disposeWhenDone);\r\n return {\r\n meshes: [pi?.mesh ?? null],\r\n thinInstanceIndexes: pi?.thinInstanceIndex ? [pi.thinInstanceIndex] : undefined,\r\n };\r\n }\r\n\r\n this._pickingInProgress = true;\r\n\r\n const processedXY = new Array(xy.length);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n const { rttSizeW, rttSizeH, devicePixelRatio } = this._getRenderInfo();\r\n\r\n // Process screen coordinates adjust to dpr\r\n for (let i = 0; i < xy.length; i++) {\r\n const item = xy[i];\r\n const { x, y } = item;\r\n\r\n const { x: adjustedX, y: adjustedY } = this._prepareForPicking(x, y, devicePixelRatio);\r\n\r\n processedXY[i] = {\r\n ...item,\r\n x: adjustedX,\r\n y: adjustedY,\r\n };\r\n\r\n minX = Math.min(minX, adjustedX);\r\n maxX = Math.max(maxX, adjustedX);\r\n minY = Math.min(minY, adjustedY);\r\n maxY = Math.max(maxY, adjustedY);\r\n }\r\n\r\n const w = Math.max(maxX - minX, 1);\r\n const h = Math.max(maxY - minY, 1);\r\n const partialCutH = rttSizeH - maxY - 1;\r\n\r\n this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, minX, partialCutH, w, h);\r\n\r\n await this._waitForPickingMaterialsReadyAsync();\r\n\r\n return await this._executeMultiPickingAsync(processedXY, minX, maxY, rttSizeH, w, h, disposeWhenDone);\r\n }\r\n\r\n /**\r\n * Execute a picking operation on box defined by two screen coordinates\r\n * @param x1 defines the X coordinate of the first corner of the box where to run the pick\r\n * @param y1 defines the Y coordinate of the first corner of the box where to run the pick\r\n * @param x2 defines the X coordinate of the opposite corner of the box where to run the pick\r\n * @param y2 defines the Y coordinate of the opposite corner of the box where to run the pick\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)\r\n * @returns A promise with the picking results. Always returns an array with the same length as the number of coordinates. The mesh or null at the index where no mesh was picked.\r\n */\r\n public async boxPickAsync(x1: number, y1: number, x2: number, y2: number, disposeWhenDone = false): Promise<Nullable<IGPUMultiPickingInfo>> {\r\n if (this._pickingInProgress) {\r\n return null;\r\n }\r\n\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return null;\r\n }\r\n\r\n this._pickingInProgress = true;\r\n\r\n const { rttSizeW, rttSizeH, devicePixelRatio } = this._getRenderInfo();\r\n\r\n const { x: adjustedX1, y: adjustedY1 } = this._prepareForPicking(x1, y1, devicePixelRatio);\r\n const { x: adjustedX2, y: adjustedY2 } = this._prepareForPicking(x2, y2, devicePixelRatio);\r\n\r\n const minX = Math.max(Math.min(adjustedX1, adjustedX2), 0);\r\n const maxX = Math.min(Math.max(adjustedX1, adjustedX2), rttSizeW - 1);\r\n const minY = Math.max(Math.min(adjustedY1, adjustedY2), 0);\r\n const maxY = Math.min(Math.max(adjustedY1, adjustedY2), rttSizeH - 1);\r\n\r\n if (minX >= rttSizeW || minY >= rttSizeH || maxX < 0 || maxY < 0) {\r\n this._pickingInProgress = false;\r\n return null;\r\n }\r\n\r\n const w = Math.max(maxX - minX, 1);\r\n const h = Math.max(maxY - minY, 1);\r\n const partialCutH = rttSizeH - maxY - 1;\r\n\r\n this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, minX, partialCutH, w, h);\r\n\r\n await this._waitForPickingMaterialsReadyAsync();\r\n\r\n return await this._executeBoxPickingAsync(minX, partialCutH, w, h, disposeWhenDone);\r\n }\r\n\r\n private _getRenderInfo(): { rttSizeW: number; rttSizeH: number; devicePixelRatio: number } {\r\n const engine = this._cachedScene!.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n const devicePixelRatio = 1 / engine._hardwareScalingLevel;\r\n\r\n return {\r\n rttSizeW,\r\n rttSizeH,\r\n devicePixelRatio,\r\n };\r\n }\r\n\r\n private _prepareForPicking(x: number, y: number, devicePixelRatio: number): IVector2Like {\r\n return { x: (devicePixelRatio * x) >> 0, y: (devicePixelRatio * y) >> 0 };\r\n }\r\n\r\n private _preparePickingBuffer(engine: AbstractEngine, rttSizeW: number, rttSizeH: number, x: number, y: number, w = 1, h = 1): void {\r\n this._meshRenderingCount = 0;\r\n\r\n const requiredBufferSize = engine.isWebGPU ? (4 * w * h + 255) & ~255 : 4 * w * h;\r\n if (!this._readbuffer || this._readbuffer.length < requiredBufferSize) {\r\n this._readbuffer = new Uint8Array(requiredBufferSize);\r\n }\r\n\r\n // Do we need to rebuild the RTT?\r\n const size = this._pickingTexture!.getSize();\r\n if (size.width !== rttSizeW || size.height !== rttSizeH) {\r\n this._createRenderTarget(this._cachedScene!, rttSizeW, rttSizeH);\r\n this._updateRenderList();\r\n }\r\n\r\n this._pickingTexture!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n this._pickingTexture!.onBeforeRender = (): void => {\r\n this._enableScissor(x, y, w, h);\r\n };\r\n\r\n this._pickingTextureAfterRenderObserver?.remove();\r\n this._pickingTextureAfterRenderObserver = this._pickingTexture!.onAfterRenderObservable.add(() => {\r\n this._disableScissor();\r\n });\r\n\r\n this._cachedScene!.customRenderTargets.push(this._pickingTexture!);\r\n this._renderPickingTexture = true;\r\n }\r\n\r\n // pick one pixel\r\n private async _executePickingAsync(x: number, y: number, disposeWhenDone: boolean): Promise<Nullable<IGPUPickingInfo>> {\r\n return await new Promise((resolve, reject) => {\r\n if (!this._pickingTexture) {\r\n this._pickingInProgress = false;\r\n reject(new Error(\"Picking texture not created\"));\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\r\n this._pickingTexture.onAfterRender = async (): Promise<void> => {\r\n if (this._checkRenderStatus()) {\r\n this._pickingTexture!.onAfterRender = null as any;\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined = undefined;\r\n\r\n // Remove from the active RTTs\r\n const index = this._cachedScene!.customRenderTargets.indexOf(this._pickingTexture!);\r\n if (index > -1) {\r\n this._cachedScene!.customRenderTargets.splice(index, 1);\r\n this._renderPickingTexture = false;\r\n }\r\n\r\n // Do the actual picking\r\n if (await this._readTexturePixelsAsync(x, y)) {\r\n const colorId = this._getColorIdFromReadBuffer(0);\r\n\r\n // Thin?\r\n if (this._thinIdMap[colorId]) {\r\n pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n } else {\r\n pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n }\r\n }\r\n\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n\r\n this._pickingInProgress = false;\r\n if (pickedMesh) {\r\n resolve({ mesh: pickedMesh, thinInstanceIndex: thinInstanceIndex });\r\n } else {\r\n resolve(null);\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n // pick multiple pixels\r\n private async _executeMultiPickingAsync(\r\n xy: IVector2Like[],\r\n minX: number,\r\n maxY: number,\r\n rttSizeH: number,\r\n w: number,\r\n h: number,\r\n disposeWhenDone: boolean\r\n ): Promise<Nullable<IGPUMultiPickingInfo>> {\r\n return await new Promise((resolve, reject) => {\r\n if (!this._pickingTexture) {\r\n this._pickingInProgress = false;\r\n reject(new Error(\"Picking texture not created\"));\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\r\n this._pickingTexture.onAfterRender = async (): Promise<void> => {\r\n if (this._checkRenderStatus()) {\r\n this._pickingTexture!.onAfterRender = null as any;\r\n const pickedMeshes: Nullable<AbstractMesh>[] = [];\r\n const thinInstanceIndexes: number[] = [];\r\n\r\n if (await this._readTexturePixelsAsync(minX, rttSizeH - maxY - 1, w, h)) {\r\n for (let i = 0; i < xy.length; i++) {\r\n const { pickedMesh, thinInstanceIndex } = this._getMeshFromMultiplePoints(xy[i].x, xy[i].y, minX, maxY, w);\r\n pickedMeshes.push(pickedMesh);\r\n thinInstanceIndexes.push(thinInstanceIndex ?? 0);\r\n }\r\n }\r\n\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n\r\n this._pickingInProgress = false;\r\n resolve({ meshes: pickedMeshes, thinInstanceIndexes: thinInstanceIndexes });\r\n }\r\n };\r\n });\r\n }\r\n\r\n // pick box area\r\n private async _executeBoxPickingAsync(x: number, y: number, w: number, h: number, disposeWhenDone: boolean): Promise<IGPUMultiPickingInfo> {\r\n return await new Promise((resolve, reject) => {\r\n if (!this._pickingTexture) {\r\n this._pickingInProgress = false;\r\n reject(new Error(\"Picking texture not created\"));\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\r\n this._pickingTexture.onAfterRender = async (): Promise<void> => {\r\n if (this._checkRenderStatus()) {\r\n this._pickingTexture!.onAfterRender = null as any;\r\n const pickedMeshes: Nullable<AbstractMesh>[] = [];\r\n const thinInstanceIndexes: number[] = [];\r\n\r\n if (await this._readTexturePixelsAsync(x, y, w, h)) {\r\n for (let offsetY = 0; offsetY < h; ++offsetY) {\r\n for (let offsetX = 0; offsetX < w; ++offsetX) {\r\n const colorId = this._getColorIdFromReadBuffer((offsetY * w + offsetX) * 4);\r\n if (colorId > 0) {\r\n // Thin?\r\n if (this._thinIdMap[colorId]) {\r\n const pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n const thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n pickedMeshes.push(pickedMesh);\r\n thinInstanceIndexes.push(thinInstanceIndex);\r\n } else {\r\n const pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n pickedMeshes.push(pickedMesh);\r\n thinInstanceIndexes.push(0);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n\r\n this._pickingInProgress = false;\r\n resolve({ meshes: pickedMeshes, thinInstanceIndexes: thinInstanceIndexes });\r\n }\r\n };\r\n });\r\n }\r\n\r\n private _enableScissor(x: number, y: number, w = 1, h = 1): void {\r\n if ((this._engine as WebGPUEngine | Engine).enableScissor) {\r\n (this._engine as WebGPUEngine | Engine).enableScissor(x, y, w, h);\r\n }\r\n }\r\n private _disableScissor(): void {\r\n if ((this._engine as WebGPUEngine | Engine).disableScissor) {\r\n (this._engine as WebGPUEngine | Engine).disableScissor();\r\n }\r\n }\r\n\r\n /**\r\n * @returns true if rendering if the picking texture has finished, otherwise false\r\n */\r\n private _checkRenderStatus(): boolean {\r\n const wasSuccessful = this._meshRenderingCount > 0;\r\n if (wasSuccessful) {\r\n // Remove from the active RTTs\r\n const index = this._cachedScene!.customRenderTargets.indexOf(this._pickingTexture!);\r\n if (index > -1) {\r\n this._cachedScene!.customRenderTargets.splice(index, 1);\r\n this._renderPickingTexture = false;\r\n }\r\n return true;\r\n }\r\n\r\n this._meshRenderingCount = 0;\r\n return false; // Wait for shaders to be ready\r\n }\r\n\r\n /**\r\n * Polls the picking material variant for every mesh in the render list until every\r\n * variant is ready. Picking materials use parallel shader compilation, and a single\r\n * ShaderMaterial may produce different effect variants per mesh (instances, thin\r\n * instances, vertex colors, ...). If we render the picking texture before all variants\r\n * are compiled, the renderer silently skips meshes whose effect is not yet ready, which\r\n * can leave the click pixel cleared (0,0,0,0) and cause pickAsync to incorrectly return\r\n * null. Once compiled, effects are cached by define string in the engine, so this\r\n * polling only blocks on the very first pick (or whenever the render list changes to\r\n * include meshes with new define combinations).\r\n */\r\n private async _waitForPickingMaterialsReadyAsync(): Promise<void> {\r\n const renderList = this._pickingTexture?.renderList;\r\n if (!renderList || renderList.length === 0) {\r\n return;\r\n }\r\n\r\n // Cap the number of polling attempts to avoid hanging forever if a shader fails to compile.\r\n const maxAttempts = 200;\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n let allReady = true;\r\n // Iterate every mesh (do not break early): each isReady call kicks off compilation\r\n // of that mesh's effect variant if not yet started, so visiting them all on the first\r\n // attempt lets the compiles run in parallel (KHR_parallel_shader_compile) instead of\r\n // being serialized one variant per render frame.\r\n for (let i = 0; i < renderList.length; i++) {\r\n const mesh = renderList[i];\r\n const material = this._meshMaterialMap.get(mesh);\r\n // Match the canonical \"uses instanced shader variant\" check used elsewhere in this file\r\n // (see addPickingList) — InstancedMesh entries report isAnInstance=true while\r\n // hasInstances=false, so omitting isAnInstance would validate the wrong shader variant.\r\n const useInstances = mesh.hasInstances || mesh.isAnInstance || mesh.hasThinInstances;\r\n if (material && !material.isReady(mesh, useInstances)) {\r\n allReady = false;\r\n }\r\n }\r\n if (allReady) {\r\n return;\r\n }\r\n // Wait for the next scene render before re-checking. Effect compilation status\r\n // (especially with KHR_parallel_shader_compile) is typically observed between\r\n // frames, so tying the poll to the render loop is more efficient than a fixed timer.\r\n // eslint-disable-next-line no-await-in-loop\r\n await new Promise<void>((resolve) => {\r\n this._cachedScene!.onAfterRenderObservable.addOnce(() => resolve());\r\n });\r\n }\r\n\r\n Logger.Warn(`GPUPicker: gave up waiting for picking materials to compile after ${maxAttempts} attempts; picking results may be incorrect.`);\r\n }\r\n\r\n private _getMeshFromMultiplePoints(x: number, y: number, minX: number, maxY: number, w: number): { pickedMesh: Nullable<AbstractMesh>; thinInstanceIndex: number | undefined } {\r\n let offsetX = (x - minX - 1) * 4;\r\n let offsetY = (maxY - y - 1) * w * 4;\r\n\r\n offsetX = Math.max(offsetX, 0);\r\n offsetY = Math.max(offsetY, 0);\r\n\r\n const colorId = this._getColorIdFromReadBuffer(offsetX + offsetY);\r\n\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined;\r\n\r\n if (colorId > 0) {\r\n if (this._thinIdMap[colorId]) {\r\n pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n } else {\r\n pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n }\r\n }\r\n\r\n return { pickedMesh, thinInstanceIndex };\r\n }\r\n\r\n /**\r\n * Updates the render list with the current pickable meshes.\r\n */\r\n private _updateRenderList(): void {\r\n this._pickingTexture!.renderList = [];\r\n for (const mesh of this._pickableMeshes) {\r\n const className = mesh.getClassName();\r\n // Part proxies don't render directly - their compound renders for them\r\n if (className === \"GaussianSplattingPartProxyMesh\") {\r\n continue;\r\n }\r\n this._pickingTexture!.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh));\r\n this._pickingTexture!.renderList.push(mesh);\r\n }\r\n // Also add compound GS meshes that render on behalf of part proxies\r\n for (const mesh of this._gsCompoundRenderMeshes) {\r\n this._pickingTexture!.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh));\r\n this._pickingTexture!.renderList.push(mesh);\r\n }\r\n }\r\n\r\n /**\r\n * Creates a GaussianSplattingMaterial configured for GPU picking by attaching\r\n * a GaussianSplattingGpuPickingMaterialPlugin. The plugin injects picking ID\r\n * encoding into the existing Gaussian Splatting shaders via material plugin hooks.\r\n * @param scene The scene\r\n * @param gsMesh The Gaussian Splatting mesh (used to set the source mesh on the material)\r\n * @returns A GaussianSplattingMaterial with the picking plugin attached\r\n */\r\n private _createGaussianSplattingPickingMaterial(scene: Scene, gsMesh: AbstractMesh): GaussianSplattingMaterial {\r\n const gsPickingMaterial = new GaussianSplattingMaterial(\"gaussianSplattingGpuPicking\", scene);\r\n gsPickingMaterial.setSourceMesh(gsMesh as any);\r\n gsPickingMaterial.needAlphaBlending = () => false;\r\n gsPickingMaterial.backFaceCulling = false;\r\n\r\n // Attach the GPU picking plugin\r\n new GaussianSplattingGpuPickingMaterialPlugin(gsPickingMaterial);\r\n\r\n return gsPickingMaterial;\r\n }\r\n\r\n private async _readTexturePixelsAsync(x: number, y: number, w = 1, h = 1): Promise<boolean> {\r\n if (!this._cachedScene || !this._pickingTexture?._texture) {\r\n return false;\r\n }\r\n const engine = this._cachedScene.getEngine();\r\n await engine._readTexturePixels(this._pickingTexture._texture, w, h, -1, 0, this._readbuffer, true, true, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /** Release the resources */\r\n public dispose(): void {\r\n this.setPickingList(null);\r\n this._cachedScene = null;\r\n\r\n // Cleaning up\r\n this._pickingTexture?.dispose();\r\n this._pickingTexture = null;\r\n this._clearPickingMaterials();\r\n this._sceneBeforeRenderObserver?.remove();\r\n this._sceneBeforeRenderObserver = null;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"gpuPicker.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/gpuPicker.ts"],"names":[],"mappings":"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","sourcesContent":["import { type AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type Engine } from \"core/Engines/engine\";\r\nimport { type WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\nimport { MultiRenderTarget } from \"core/Materials/Textures/multiRenderTarget.pure\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture.pure\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { type IShaderMaterialOptions, ShaderMaterial } from \"core/Materials/shaderMaterial.pure\";\r\nimport { GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial.pure\";\r\nimport { GaussianSplattingGpuPickingMaterialPlugin } from \"core/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure\";\r\nimport { Color4 } from \"core/Maths/math.color.pure\";\r\nimport { Epsilon } from \"core/Maths/math.constants\";\r\nimport { type IVector2Like } from \"core/Maths/math.like\";\r\nimport { Matrix, TmpVectors, Vector3 } from \"core/Maths/math.vector.pure\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { VertexBuffer } from \"core/Meshes/buffer\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\n\r\n/**\r\n * Class used to store the result of a GPU picking operation\r\n */\r\nexport interface IGPUPickingInfo {\r\n /**\r\n * Picked mesh\r\n */\r\n mesh: AbstractMesh;\r\n /**\r\n * Picked thin instance index\r\n */\r\n thinInstanceIndex?: number;\r\n /**\r\n * Picked point in world space.\r\n *\r\n * Only available when enableDepthPicking is true and a valid depth value can be read.\r\n * Custom picking materials or special material plugins that do not write the depth attachment may return undefined.\r\n */\r\n pickedPoint?: Vector3;\r\n /**\r\n * Reconstructed normal in world space.\r\n *\r\n * Only available when enableDepthPicking is true and enough valid depth neighbors can be read.\r\n * Custom picking materials or special material plugins that do not write the depth attachment may return undefined.\r\n */\r\n normal?: Vector3;\r\n}\r\n\r\n/**\r\n * Stores the result of a multi GPU picking operation\r\n */\r\nexport interface IGPUMultiPickingInfo {\r\n /**\r\n * Picked mesh\r\n */\r\n meshes: Nullable<AbstractMesh>[];\r\n /**\r\n * Picked thin instance index\r\n */\r\n thinInstanceIndexes?: number[];\r\n /**\r\n * Picked points in world space.\r\n *\r\n * Only available when enableDepthPicking is true and a valid depth value can be read.\r\n * Custom picking materials or special material plugins that do not write the depth attachment may return null.\r\n */\r\n pickedPoints?: Nullable<Vector3>[];\r\n /**\r\n * Reconstructed normals in world space.\r\n *\r\n * Only available when enableDepthPicking is true and enough valid depth neighbors can be read.\r\n * Custom picking materials or special material plugins that do not write the depth attachment may return null.\r\n */\r\n normals?: Nullable<Vector3>[];\r\n}\r\n\r\n/**\r\n * Defines how multi pick texture readbacks should be performed.\r\n */\r\nexport const enum GPUMultiPickReadbackStrategy {\r\n /**\r\n * Chooses between a single rectangle readback and small per-point readbacks using the thresholds in IGPUMultiPickOptions.\r\n */\r\n Auto = 0,\r\n /**\r\n * Always reads the full bounding rectangle of the picked points. This minimizes readback calls and is best for dense point sets.\r\n */\r\n Rectangle = 1,\r\n /**\r\n * Always reads each picked point independently. This minimizes transferred pixels for sparse point sets but can be slower when many points are picked.\r\n */\r\n Individual = 2,\r\n}\r\n\r\n/**\r\n * Options used to tune multi GPU picking.\r\n */\r\nexport interface IGPUMultiPickOptions {\r\n /**\r\n * Defines how multi pick texture readbacks should be performed.\r\n *\r\n * Defaults to GPUMultiPickReadbackStrategy.Auto.\r\n */\r\n readbackStrategy?: GPUMultiPickReadbackStrategy;\r\n /**\r\n * Maximum number of in-bounds points allowed for the automatic individual readback path.\r\n * This value is ignored when readbackStrategy is set to GPUMultiPickReadbackStrategy.Rectangle or GPUMultiPickReadbackStrategy.Individual.\r\n *\r\n * Defaults to 32.\r\n */\r\n maxIndividualReadbackCount?: number;\r\n /**\r\n * Minimum rectangle-area / individual-area ratio required before the automatic path uses individual readbacks.\r\n * This value is ignored when readbackStrategy is set to GPUMultiPickReadbackStrategy.Rectangle or GPUMultiPickReadbackStrategy.Individual.\r\n *\r\n * Defaults to 16.\r\n */\r\n individualReadbackAreaRatio?: number;\r\n}\r\n\r\n/**\r\n * Class used to perform a picking operation using GPU\r\n * GPUPicker can pick meshes, instances and thin instances\r\n */\r\nexport class GPUPicker {\r\n private static readonly _AttributeName = \"instanceMeshID\";\r\n private static readonly _MaxPickingId = 0x00ffffff; // 24 bits unsigned integer max\r\n private static readonly _DepthPixelRadius = 1;\r\n private static readonly _MaxMultiPickIndividualReadbackCount = 32;\r\n private static readonly _MultiPickIndividualReadbackAreaRatio = 16;\r\n private static readonly _DepthNeighborOffsets = [\r\n [-1, 1],\r\n [0, 1],\r\n [1, 1],\r\n [1, 0],\r\n [1, -1],\r\n [0, -1],\r\n [-1, -1],\r\n [-1, 0],\r\n ] as const;\r\n\r\n private _pickingTexture: Nullable<RenderTargetTexture | MultiRenderTarget> = null;\r\n\r\n private readonly _idMap: Array<number> = [];\r\n private readonly _thinIdMap: Array<{ meshId: number; thinId: number }> = [];\r\n private readonly _meshUniqueIdToPickerId: Array<number> = [];\r\n private _idWarningIssued = false;\r\n\r\n private _cachedScene: Nullable<Scene> = null;\r\n private _engine: Nullable<AbstractEngine> = null;\r\n\r\n private readonly _pickingMaterialCache: Nullable<ShaderMaterial>[] = new Array(9).fill(null);\r\n\r\n private _pickableMeshes: Array<AbstractMesh> = [];\r\n private readonly _meshMaterialMap: Map<AbstractMesh, Material> = new Map();\r\n private _readbuffer: Nullable<Uint8Array> = null;\r\n private _depthReadbuffer: Nullable<ArrayBufferView> = null;\r\n private _depthTextureType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n private _isDepthTexturePacked = false;\r\n private _useDepthPicking = false;\r\n private _isUsingDepthPickingRenderTarget = false;\r\n\r\n private _meshRenderingCount: number = 0;\r\n private _renderWarningIssued = false;\r\n private _renderPickingTexture = false;\r\n\r\n private _sceneBeforeRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _pickingTextureClearObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private _pickingTextureAfterRenderObserver: Nullable<Observer<number>> = null;\r\n\r\n private _nextFreeId = 1;\r\n\r\n private readonly _gsPickingMaterials: Material[] = [];\r\n private readonly _gsCompoundRenderMeshes: AbstractMesh[] = [];\r\n\r\n /** Shader language used by the generator */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this generator.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private _pickingInProgress = false;\r\n\r\n /**\r\n * Gets a boolean indicating if the picking is in progress\r\n */\r\n public get pickingInProgress(): boolean {\r\n return this._pickingInProgress;\r\n }\r\n\r\n /**\r\n * Gets the default render materials used by the picker.\r\n *\r\n * index is Material filling mode\r\n */\r\n public get defaultRenderMaterials(): readonly Nullable<ShaderMaterial>[] {\r\n return this._pickingMaterialCache;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if depth-based pickedPoint and normal reconstruction should be enabled.\r\n *\r\n * When disabled, GPUPicker uses the original single-color render target and shader path. When enabled, GPUPicker\r\n * switches to a MultiRenderTarget and compiles the default picking shader with GPUPICKER_DEPTH to output both the\r\n * picking id and the depth required to reconstruct the picked point and normal.\r\n *\r\n * Custom picking materials and special picking material plugins should also write the depth attachment. If they do\r\n * not, GPUPicker will still try to reconstruct pickedPoint and normal from the depth target, but the returned values\r\n * may be missing or incorrect.\r\n */\r\n public get enableDepthPicking(): boolean {\r\n return this._useDepthPicking;\r\n }\r\n\r\n public set enableDepthPicking(value: boolean) {\r\n if (this._useDepthPicking === value) {\r\n return;\r\n }\r\n\r\n this._useDepthPicking = value;\r\n this._isUsingDepthPickingRenderTarget = false;\r\n this._depthReadbuffer = null;\r\n\r\n let pickableMeshes: Array<AbstractMesh | { mesh: AbstractMesh; material: ShaderMaterial }> = [];\r\n if (this._cachedScene && this._pickingTexture) {\r\n pickableMeshes = this._pickableMeshes.map((mesh) => {\r\n const material = this._meshMaterialMap.get(mesh);\r\n const className = mesh.getClassName();\r\n if (\r\n material instanceof ShaderMaterial &&\r\n !this._pickingMaterialCache.includes(material) &&\r\n className !== \"GaussianSplattingMesh\" &&\r\n className !== \"GaussianSplattingPartProxyMesh\"\r\n ) {\r\n return { mesh, material };\r\n }\r\n\r\n return mesh;\r\n });\r\n }\r\n\r\n this._clearPickingMaterials();\r\n\r\n if (this._cachedScene && this._pickingTexture) {\r\n this.clearPickingList();\r\n this._pickingTexture.dispose();\r\n this._pickingTexture = null;\r\n if (pickableMeshes.length > 0) {\r\n this.addPickingList(pickableMeshes);\r\n }\r\n }\r\n }\r\n\r\n private _getColorIdFromReadBuffer(offset: number): number {\r\n const r = this._readbuffer![offset];\r\n const g = this._readbuffer![offset + 1];\r\n const b = this._readbuffer![offset + 2];\r\n return (r << 16) + (g << 8) + b;\r\n }\r\n\r\n private _getReadBufferOffset(x: number, y: number, width: number, height: number): number {\r\n const bufferY = this._cachedScene?.getEngine().isWebGPU ? height - y - 1 : y;\r\n return (bufferY * width + x) * 4;\r\n }\r\n\r\n private _createColorPickingRenderTarget(scene: Scene, width: number, height: number): RenderTargetTexture {\r\n return new RenderTargetTexture(\"pickingTexture\", { width: width, height: height }, scene, {\r\n generateMipMaps: false,\r\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_NEAREST,\r\n });\r\n }\r\n\r\n private _createRenderTarget(scene: Scene, width: number, height: number): void {\r\n if (this._cachedScene && this._pickingTexture) {\r\n const index = this._cachedScene.customRenderTargets.indexOf(this._pickingTexture);\r\n if (index > -1) {\r\n this._cachedScene.customRenderTargets.splice(index, 1);\r\n this._renderPickingTexture = false;\r\n }\r\n }\r\n if (this._pickingTexture) {\r\n this._pickingTexture.dispose();\r\n }\r\n if (this._useDepthPicking) {\r\n const engine = scene.getEngine();\r\n const supportsDepthPickingRenderTarget = engine.isWebGPU || (engine as AbstractEngine & { webGLVersion?: number }).webGLVersion !== 1;\r\n if (!supportsDepthPickingRenderTarget) {\r\n Logger.Warn(\"GPUPicker depth picking requires WebGL2, WebGPU, or Native engine support. Falling back to color-only GPU picking.\");\r\n this._useDepthPicking = false;\r\n this._isUsingDepthPickingRenderTarget = false;\r\n this._isDepthTexturePacked = false;\r\n this._pickingTexture = this._createColorPickingRenderTarget(scene, width, height);\r\n return;\r\n }\r\n\r\n if (engine.getCaps().textureFloatRender) {\r\n this._depthTextureType = Constants.TEXTURETYPE_FLOAT;\r\n } else if (engine.getCaps().textureHalfFloatRender) {\r\n this._depthTextureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n } else {\r\n this._depthTextureType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n }\r\n this._isDepthTexturePacked = this._depthTextureType === Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n\r\n const pickingTexture = new MultiRenderTarget(\r\n \"pickingTexture\",\r\n { width: width, height: height },\r\n 2,\r\n scene,\r\n {\r\n generateMipMaps: false,\r\n generateDepthBuffer: true,\r\n generateStencilBuffer: false,\r\n types: [Constants.TEXTURETYPE_UNSIGNED_BYTE, this._depthTextureType],\r\n samplingModes: [Constants.TEXTURE_NEAREST_NEAREST, Constants.TEXTURE_NEAREST_NEAREST],\r\n formats: [Constants.TEXTUREFORMAT_RGBA, Constants.TEXTUREFORMAT_RGBA],\r\n },\r\n [\"pickingTexture_id\", \"pickingTexture_depth\"]\r\n );\r\n if (pickingTexture.isSupported) {\r\n this._pickingTexture = pickingTexture;\r\n this._isUsingDepthPickingRenderTarget = true;\r\n } else {\r\n Logger.Warn(\"GPUPicker depth picking requires MultiRenderTarget support. Falling back to color-only GPU picking.\");\r\n this._useDepthPicking = false;\r\n this._isUsingDepthPickingRenderTarget = false;\r\n this._isDepthTexturePacked = false;\r\n pickingTexture.dispose();\r\n this._pickingTexture = this._createColorPickingRenderTarget(scene, width, height);\r\n }\r\n } else {\r\n this._pickingTexture = this._createColorPickingRenderTarget(scene, width, height);\r\n this._isUsingDepthPickingRenderTarget = false;\r\n this._isDepthTexturePacked = false;\r\n }\r\n }\r\n\r\n private _clearPickingMaterials(): void {\r\n for (let i = 0; i < this._pickingMaterialCache.length; i++) {\r\n const material = this._pickingMaterialCache[i];\r\n if (material !== null) {\r\n material.dispose();\r\n this._pickingMaterialCache[i] = null;\r\n }\r\n }\r\n }\r\n\r\n private _getPickingMaterial(scene: Scene, fillMode: number): ShaderMaterial {\r\n if (fillMode < 0 || 8 < fillMode) {\r\n fillMode = Constants.MATERIAL_TriangleFillMode;\r\n }\r\n\r\n const cachedMaterial = this._pickingMaterialCache[fillMode];\r\n if (cachedMaterial) {\r\n return cachedMaterial;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n const defines: string[] = [];\r\n if (this._useDepthPicking) {\r\n defines.push(\"#define GPUPICKER_DEPTH\");\r\n if (this._isDepthTexturePacked) {\r\n defines.push(\"#define GPUPICKER_PACK_DEPTH\");\r\n }\r\n }\r\n const options: Partial<IShaderMaterialOptions> = {\r\n attributes: [VertexBuffer.PositionKind, GPUPicker._AttributeName],\r\n uniforms: [\"world\", \"viewProjection\", \"meshID\"],\r\n needAlphaBlending: false,\r\n defines: defines,\r\n useClipPlane: null,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/picking.fragment\"), import(\"../ShadersWGSL/picking.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/picking.fragment\"), import(\"../Shaders/picking.vertex\")]);\r\n }\r\n },\r\n };\r\n\r\n const newMaterial = new ShaderMaterial(\"pickingShader\", scene, \"picking\", options, false);\r\n newMaterial.fillMode = fillMode;\r\n newMaterial.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n\r\n this._pickingMaterialCache[fillMode] = newMaterial;\r\n return newMaterial;\r\n }\r\n\r\n private _materialBindCallback(mesh: AbstractMesh | undefined): void {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n\r\n if (!material) {\r\n if (!this._renderWarningIssued) {\r\n this._renderWarningIssued = true;\r\n Logger.Warn(\"GPUPicker issue: Mesh not found in the material map. This may happen when the root mesh of an instance is not in the picking list.\");\r\n }\r\n return;\r\n }\r\n\r\n const effect = material.getEffect();\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n if (!mesh.hasInstances && !mesh.isAnInstance && !mesh.hasThinInstances && this._meshUniqueIdToPickerId[mesh.uniqueId] !== undefined) {\r\n effect.setFloat(\"meshID\", this._meshUniqueIdToPickerId[mesh.uniqueId]);\r\n }\r\n\r\n this._meshRenderingCount++;\r\n }\r\n\r\n /**\r\n * Set the list of meshes to pick from\r\n * Set that value to null to clear the list (and avoid leaks)\r\n * The module will read and delete from the array provided by reference. Disposing the module or setting the value to null will clear the array.\r\n * @param list defines the list of meshes to pick from\r\n */\r\n public setPickingList(list: Nullable<Array<AbstractMesh | { mesh: AbstractMesh; material: ShaderMaterial }>>): void {\r\n this.clearPickingList();\r\n\r\n if (!list || list.length === 0) {\r\n return;\r\n }\r\n\r\n // Prepare target\r\n const scene = (\"mesh\" in list[0] ? list[0].mesh : list[0]).getScene();\r\n if (!this._cachedScene || this._cachedScene !== scene) {\r\n this._clearPickingMaterials();\r\n }\r\n\r\n this.addPickingList(list);\r\n }\r\n\r\n /**\r\n * Clear the current picking list and free resources\r\n */\r\n public clearPickingList(): void {\r\n if (this._pickableMeshes) {\r\n // Cleanup\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n const className = mesh.getClassName();\r\n\r\n // Skip GS part proxies - they don't have instance buffers or render list entries\r\n if (className === \"GaussianSplattingPartProxyMesh\") {\r\n continue;\r\n }\r\n\r\n // Skip thin instance cleanup for GaussianSplattingMesh (thin instances are for batching, not picking)\r\n if (className !== \"GaussianSplattingMesh\") {\r\n if (mesh.hasInstances) {\r\n (mesh as Mesh).removeVerticesData(GPUPicker._AttributeName);\r\n }\r\n if (mesh.hasThinInstances) {\r\n (mesh as Mesh).thinInstanceSetBuffer(GPUPicker._AttributeName, null);\r\n }\r\n }\r\n\r\n if (this._pickingTexture) {\r\n this._pickingTexture.setMaterialForRendering(mesh, undefined);\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh);\r\n if (material && !this._pickingMaterialCache.includes(material as ShaderMaterial)) {\r\n material.onBindObservable.removeCallback(this._materialBindCallback);\r\n }\r\n }\r\n\r\n // Clean up GS compound meshes from render list\r\n for (const mesh of this._gsCompoundRenderMeshes) {\r\n if (this._pickingTexture) {\r\n this._pickingTexture.setMaterialForRendering(mesh, undefined);\r\n }\r\n }\r\n this._gsCompoundRenderMeshes.length = 0;\r\n\r\n // Dispose GS picking materials\r\n for (const material of this._gsPickingMaterials) {\r\n material.dispose();\r\n }\r\n this._gsPickingMaterials.length = 0;\r\n\r\n this._pickableMeshes.length = 0;\r\n this._meshMaterialMap.clear();\r\n this._idMap.length = 0;\r\n this._thinIdMap.length = 0;\r\n this._meshUniqueIdToPickerId.length = 0;\r\n if (this._pickingTexture) {\r\n this._pickingTexture.renderList = [];\r\n }\r\n }\r\n\r\n this._nextFreeId = 1;\r\n }\r\n\r\n /**\r\n * Add array of meshes to the current picking list\r\n * @param list defines the array of meshes to add to the current picking list\r\n */\r\n public addPickingList(list: Array<AbstractMesh | { mesh: AbstractMesh; material: ShaderMaterial }>): void {\r\n if (!list || list.length === 0) {\r\n return;\r\n }\r\n\r\n // Prepare target\r\n const scene = (\"mesh\" in list[0] ? list[0].mesh : list[0]).getScene();\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n if (!this._pickingTexture) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n } else {\r\n const size = this._pickingTexture.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH || this._cachedScene !== scene) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n }\r\n }\r\n\r\n this._sceneBeforeRenderObserver?.remove();\r\n this._sceneBeforeRenderObserver = scene.onBeforeRenderObservable.add(() => {\r\n if (scene.frameGraph && this._renderPickingTexture && this._cachedScene && this._pickingTexture) {\r\n this._cachedScene._renderRenderTarget(this._pickingTexture, this._cachedScene.cameras?.[0] ?? null);\r\n this._cachedScene.activeCamera = null;\r\n }\r\n });\r\n\r\n this._cachedScene = scene;\r\n this._engine = scene.getEngine();\r\n if (!this._pickingTexture!.renderList) {\r\n this._pickingTexture!.renderList = [];\r\n }\r\n\r\n const newPickableMeshes: AbstractMesh[] = new Array(list.length);\r\n const pickableMeshOffset = this._pickableMeshes?.length ?? 0;\r\n\r\n this._cachedScene = scene;\r\n this._engine = scene.getEngine();\r\n\r\n for (let i = 0; i < list.length; i++) {\r\n const item = list[i];\r\n if (\"mesh\" in item) {\r\n this._meshMaterialMap.set(item.mesh, item.material);\r\n newPickableMeshes[i] = item.mesh;\r\n } else {\r\n const className = item.getClassName();\r\n if (className === \"GaussianSplattingMesh\" || className === \"GaussianSplattingPartProxyMesh\") {\r\n // GS meshes get special picking materials - handled in the ID assignment loop below\r\n newPickableMeshes[i] = item;\r\n } else {\r\n const material = this._getPickingMaterial(scene, item.material?.fillMode ?? Constants.MATERIAL_TriangleFillMode);\r\n this._meshMaterialMap.set(item, material);\r\n newPickableMeshes[i] = item;\r\n }\r\n }\r\n }\r\n\r\n if (this._pickableMeshes !== null) {\r\n this._pickableMeshes = [...this._pickableMeshes, ...newPickableMeshes];\r\n } else {\r\n this._pickableMeshes = newPickableMeshes;\r\n }\r\n\r\n // We will affect colors and create vertex color buffers\r\n let nextFreeId = this._nextFreeId;\r\n\r\n // Collect GaussianSplatting part proxy groups for compound picking\r\n const gsCompoundGroups: { compound: AbstractMesh; partEntries: { proxy: AbstractMesh; globalIndex: number }[] }[] = [];\r\n\r\n for (let index = 0; index < newPickableMeshes.length; index++) {\r\n const mesh = newPickableMeshes[index];\r\n const className = mesh.getClassName();\r\n\r\n // Handle GaussianSplatting part proxy meshes - collect by compound for processing after the loop\r\n if (className === \"GaussianSplattingPartProxyMesh\") {\r\n const proxy = mesh as any; // GaussianSplattingPartProxyMesh\r\n const compound = proxy.compoundSplatMesh;\r\n const globalIndex = index + pickableMeshOffset;\r\n\r\n let group = gsCompoundGroups[compound.uniqueId];\r\n if (!group) {\r\n group = { compound, partEntries: [] };\r\n gsCompoundGroups[compound.uniqueId] = group;\r\n }\r\n group.partEntries.push({ proxy, globalIndex });\r\n continue; // Don't add to render list - the compound mesh will render for all parts\r\n }\r\n\r\n // Handle non-compound GaussianSplatting meshes\r\n if (className === \"GaussianSplattingMesh\") {\r\n const globalIndex = index + pickableMeshOffset;\r\n const pickId = nextFreeId;\r\n this._idMap[pickId] = globalIndex;\r\n this._meshUniqueIdToPickerId[mesh.uniqueId] = pickId;\r\n nextFreeId++;\r\n\r\n if (!mesh.isPickable || !mesh.isVisible) {\r\n continue;\r\n }\r\n\r\n // Create a GaussianSplattingMaterial with picking plugin for GPU picking\r\n const gsPickingMaterial = this._createGaussianSplattingPickingMaterial(scene, mesh);\r\n const plugin = gsPickingMaterial.pluginManager!.getPlugin<GaussianSplattingGpuPickingMaterialPlugin>(\"GaussianSplatGpuPicking\")!;\r\n plugin.meshId = pickId;\r\n\r\n gsPickingMaterial.onBindObservable.add(() => {\r\n this._meshRenderingCount++;\r\n });\r\n\r\n this._gsPickingMaterials.push(gsPickingMaterial);\r\n this._meshMaterialMap.set(mesh, gsPickingMaterial);\r\n this._pickingTexture!.setMaterialForRendering(mesh, gsPickingMaterial);\r\n this._pickingTexture!.renderList!.push(mesh);\r\n continue;\r\n }\r\n\r\n // Standard mesh processing\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n\r\n if (!this._pickingMaterialCache.includes(material as ShaderMaterial)) {\r\n material.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n }\r\n this._pickingTexture!.setMaterialForRendering(mesh, material);\r\n this._pickingTexture!.renderList!.push(mesh);\r\n\r\n if (mesh.isAnInstance) {\r\n continue; // This will be handled by the source mesh\r\n }\r\n\r\n const globalIndex = index + pickableMeshOffset;\r\n\r\n if (mesh.hasThinInstances) {\r\n const thinInstanceCount = (mesh as Mesh).thinInstanceCount;\r\n const instanceIdData = new Float32Array(thinInstanceCount);\r\n for (let i = 0; i < thinInstanceCount; i++) {\r\n instanceIdData[i] = nextFreeId;\r\n this._thinIdMap[nextFreeId] = { meshId: globalIndex, thinId: i };\r\n nextFreeId++;\r\n }\r\n (mesh as Mesh).thinInstanceSetBuffer(GPUPicker._AttributeName, instanceIdData, 1);\r\n } else {\r\n const currentMeshId = nextFreeId;\r\n this._idMap[currentMeshId] = globalIndex;\r\n nextFreeId++;\r\n\r\n if (mesh.hasInstances) {\r\n // find index of instances of that mesh\r\n const instancesForPick: number[] = [];\r\n for (let pickableMeshIndex = 0; pickableMeshIndex < newPickableMeshes.length; ++pickableMeshIndex) {\r\n const m = newPickableMeshes[pickableMeshIndex];\r\n if (m.isAnInstance && (m as InstancedMesh).sourceMesh === mesh) {\r\n instancesForPick.push(pickableMeshIndex);\r\n }\r\n }\r\n const instanceIdData = new Float32Array(instancesForPick.length + 1); // +1 for the source mesh\r\n\r\n instanceIdData[0] = currentMeshId;\r\n for (let i = 0; i < instancesForPick.length; i++) {\r\n instanceIdData[i + 1] = nextFreeId;\r\n const globalInstanceIndex = instancesForPick[i] + pickableMeshOffset;\r\n this._idMap[nextFreeId] = globalInstanceIndex;\r\n nextFreeId++;\r\n }\r\n\r\n const engine = mesh.getEngine();\r\n const buffer = new VertexBuffer(engine, instanceIdData, GPUPicker._AttributeName, false, false, 1, true);\r\n (mesh as Mesh).setVerticesBuffer(buffer, true);\r\n } else {\r\n this._meshUniqueIdToPickerId[mesh.uniqueId] = currentMeshId;\r\n }\r\n }\r\n }\r\n\r\n // Process GaussianSplatting compound groups (part proxy meshes)\r\n for (const group of gsCompoundGroups) {\r\n if (!group) {\r\n continue;\r\n }\r\n const compound = group.compound;\r\n\r\n // Assign picking IDs for each part\r\n const partMeshIds: number[] = new Array((compound as any).partCount || 1).fill(0);\r\n for (const entry of group.partEntries) {\r\n const pickId = nextFreeId;\r\n this._idMap[pickId] = entry.globalIndex;\r\n const partIndex = (entry.proxy as any).partIndex;\r\n if (partIndex < partMeshIds.length) {\r\n partMeshIds[partIndex] = pickId;\r\n }\r\n nextFreeId++;\r\n }\r\n\r\n // Create compound GS picking material with plugin\r\n const gsPickingMaterial = this._createGaussianSplattingPickingMaterial(scene, compound);\r\n const plugin = gsPickingMaterial.pluginManager!.getPlugin<GaussianSplattingGpuPickingMaterialPlugin>(\"GaussianSplatGpuPicking\")!;\r\n plugin.isCompound = true;\r\n plugin.partMeshIds = partMeshIds;\r\n // Only active (included, visible, and pickable) parts should contribute to the depth buffer.\r\n const activeParts = group.partEntries\r\n .filter((e) => (e.proxy as AbstractMesh).isPickable && (e.proxy as AbstractMesh).isVisible)\r\n .map((e) => (e.proxy as any).partIndex as number);\r\n plugin.setPartActive(activeParts);\r\n\r\n gsPickingMaterial.onBindObservable.add(() => {\r\n this._meshRenderingCount++;\r\n });\r\n\r\n this._gsPickingMaterials.push(gsPickingMaterial);\r\n this._meshMaterialMap.set(compound, gsPickingMaterial);\r\n this._pickingTexture!.setMaterialForRendering(compound, gsPickingMaterial);\r\n this._pickingTexture!.renderList!.push(compound);\r\n this._gsCompoundRenderMeshes.push(compound);\r\n }\r\n\r\n if (GPUPicker._MaxPickingId < nextFreeId - 1) {\r\n if (!this._idWarningIssued) {\r\n this._idWarningIssued = true;\r\n Logger.Warn(`GPUPicker maximum number of pickable meshes and instances is ${GPUPicker._MaxPickingId}. Some meshes or instances won't be pickable.`);\r\n }\r\n }\r\n\r\n this._nextFreeId = nextFreeId;\r\n }\r\n\r\n /**\r\n * Execute a picking operation\r\n * @param x defines the X coordinates where to run the pick\r\n * @param y defines the Y coordinates where to run the pick\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)\r\n * @returns A promise with the picking results\r\n */\r\n public async pickAsync(x: number, y: number, disposeWhenDone = false): Promise<Nullable<IGPUPickingInfo>> {\r\n if (this._pickingInProgress) {\r\n return null;\r\n }\r\n\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return null;\r\n }\r\n\r\n const { rttSizeW, rttSizeH, scaleX, scaleY } = this._getRenderInfo();\r\n\r\n const { x: adjustedX, y: adjustedY } = this._prepareForPicking(x, y, scaleX, scaleY);\r\n if (adjustedX < 0 || adjustedY < 0 || adjustedX >= rttSizeW || adjustedY >= rttSizeH) {\r\n return null;\r\n }\r\n\r\n this._pickingInProgress = true;\r\n\r\n // Invert Y\r\n const invertedY = rttSizeH - adjustedY - 1;\r\n const pickingRegion = this._getPickingRenderRegion(adjustedX, invertedY, rttSizeW, rttSizeH);\r\n this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, pickingRegion.x, pickingRegion.y, pickingRegion.width, pickingRegion.height);\r\n\r\n await this._waitForPickingMaterialsReadyAsync();\r\n this._addPickingTextureToRenderTargets();\r\n\r\n return await this._executePickingAsync(adjustedX, invertedY, disposeWhenDone);\r\n }\r\n\r\n /**\r\n * Execute a picking operation on multiple coordinates\r\n * @param xy defines the X,Y coordinates where to run the pick\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)\r\n * @param options defines options used to tune the multi pick readback strategy\r\n * @returns A promise with the picking results. Always returns an array with the same length as the number of coordinates. The mesh or null at the index where no mesh was picked.\r\n */\r\n public async multiPickAsync(xy: IVector2Like[], disposeWhenDone = false, options?: IGPUMultiPickOptions): Promise<Nullable<IGPUMultiPickingInfo>> {\r\n if (this._pickingInProgress) {\r\n return null;\r\n }\r\n\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0 || xy.length === 0) {\r\n return null;\r\n }\r\n\r\n if (xy.length === 1) {\r\n const pi = await this.pickAsync(xy[0].x, xy[0].y, disposeWhenDone);\r\n const result: IGPUMultiPickingInfo = {\r\n meshes: [pi?.mesh ?? null],\r\n thinInstanceIndexes: pi?.thinInstanceIndex !== undefined ? [pi.thinInstanceIndex] : undefined,\r\n };\r\n if (this._useDepthPicking) {\r\n result.pickedPoints = [pi?.pickedPoint ?? null];\r\n result.normals = [pi?.normal ?? null];\r\n }\r\n return result;\r\n }\r\n\r\n this._pickingInProgress = true;\r\n\r\n const processedXY = new Array<IVector2Like>(xy.length);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n const { rttSizeW, rttSizeH, scaleX, scaleY } = this._getRenderInfo();\r\n let hasInBoundsPoint = false;\r\n let inBoundsPointCount = 0;\r\n\r\n // Process screen coordinates adjust to dpr\r\n for (let i = 0; i < xy.length; i++) {\r\n const item = xy[i];\r\n const { x, y } = item;\r\n const { x: adjustedX, y: adjustedY } = this._prepareForPicking(x, y, scaleX, scaleY);\r\n processedXY[i] = {\r\n ...item,\r\n x: adjustedX,\r\n y: adjustedY,\r\n };\r\n\r\n if (adjustedX < 0 || adjustedY < 0 || adjustedX >= rttSizeW || adjustedY >= rttSizeH) {\r\n continue;\r\n }\r\n\r\n hasInBoundsPoint = true;\r\n inBoundsPointCount++;\r\n minX = Math.min(minX, adjustedX);\r\n maxX = Math.max(maxX, adjustedX);\r\n minY = Math.min(minY, adjustedY);\r\n maxY = Math.max(maxY, adjustedY);\r\n }\r\n\r\n if (!hasInBoundsPoint) {\r\n this._pickingInProgress = false;\r\n return null;\r\n }\r\n\r\n const depthPadding = this._useDepthPicking ? GPUPicker._DepthPixelRadius : 0;\r\n const regionLeft = Math.max(minX - depthPadding, 0);\r\n const regionRight = Math.min(maxX + depthPadding, rttSizeW - 1);\r\n const regionTop = Math.max(minY - depthPadding, 0);\r\n const regionBottom = Math.min(maxY + depthPadding, rttSizeH - 1);\r\n\r\n if (regionLeft >= rttSizeW || regionTop >= rttSizeH || regionRight < 0 || regionBottom < 0) {\r\n this._pickingInProgress = false;\r\n return null;\r\n }\r\n\r\n const w = regionRight - regionLeft + 1;\r\n const h = regionBottom - regionTop + 1;\r\n const partialCutH = rttSizeH - regionBottom - 1;\r\n const useIndividualReadback = this._shouldUseIndividualMultiPickReadback(inBoundsPointCount, w * h, options);\r\n\r\n this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, regionLeft, partialCutH, w, h, useIndividualReadback ? 1 : w, useIndividualReadback ? 1 : h);\r\n\r\n await this._waitForPickingMaterialsReadyAsync();\r\n this._addPickingTextureToRenderTargets();\r\n\r\n return await this._executeMultiPickingAsync(processedXY, regionLeft, partialCutH, rttSizeW, rttSizeH, w, h, useIndividualReadback, disposeWhenDone);\r\n }\r\n\r\n /**\r\n * Execute a picking operation on box defined by two screen coordinates\r\n * @param x1 defines the X coordinate of the first corner of the box where to run the pick\r\n * @param y1 defines the Y coordinate of the first corner of the box where to run the pick\r\n * @param x2 defines the X coordinate of the opposite corner of the box where to run the pick\r\n * @param y2 defines the Y coordinate of the opposite corner of the box where to run the pick\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)\r\n * @returns A promise with the picking results. Contains one entry for each picked pixel in the box.\r\n */\r\n public async boxPickAsync(x1: number, y1: number, x2: number, y2: number, disposeWhenDone = false): Promise<Nullable<IGPUMultiPickingInfo>> {\r\n if (this._pickingInProgress) {\r\n return null;\r\n }\r\n\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return null;\r\n }\r\n\r\n this._pickingInProgress = true;\r\n\r\n const { rttSizeW, rttSizeH, scaleX, scaleY } = this._getRenderInfo();\r\n\r\n const { x: adjustedX1, y: adjustedY1 } = this._prepareForPicking(x1, y1, scaleX, scaleY);\r\n const { x: adjustedX2, y: adjustedY2 } = this._prepareForPicking(x2, y2, scaleX, scaleY);\r\n\r\n const minX = Math.max(Math.min(adjustedX1, adjustedX2), 0);\r\n const maxX = Math.min(Math.max(adjustedX1, adjustedX2), rttSizeW - 1);\r\n const minY = Math.max(Math.min(adjustedY1, adjustedY2), 0);\r\n const maxY = Math.min(Math.max(adjustedY1, adjustedY2), rttSizeH - 1);\r\n\r\n if (minX >= rttSizeW || minY >= rttSizeH || maxX < 0 || maxY < 0) {\r\n this._pickingInProgress = false;\r\n return null;\r\n }\r\n\r\n const depthPadding = this._useDepthPicking ? GPUPicker._DepthPixelRadius : 0;\r\n const regionLeft = Math.max(minX - depthPadding, 0);\r\n const regionRight = Math.min(maxX + depthPadding, rttSizeW - 1);\r\n const regionTop = Math.max(minY - depthPadding, 0);\r\n const regionBottom = Math.min(maxY + depthPadding, rttSizeH - 1);\r\n const w = regionRight - regionLeft + 1;\r\n const h = regionBottom - regionTop + 1;\r\n const partialCutH = rttSizeH - regionBottom - 1;\r\n\r\n this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, regionLeft, partialCutH, w, h);\r\n\r\n await this._waitForPickingMaterialsReadyAsync();\r\n this._addPickingTextureToRenderTargets();\r\n\r\n return await this._executeBoxPickingAsync(\r\n minX,\r\n maxY,\r\n Math.max(maxX - minX, 1),\r\n Math.max(maxY - minY, 1),\r\n regionLeft,\r\n partialCutH,\r\n rttSizeW,\r\n rttSizeH,\r\n w,\r\n h,\r\n disposeWhenDone\r\n );\r\n }\r\n\r\n private _getRenderInfo(): { rttSizeW: number; rttSizeH: number; scaleX: number; scaleY: number } {\r\n const engine = this._cachedScene!.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n // Picking coordinates are expected in input/canvas CSS pixels, matching Babylon pointer coordinates.\r\n // Use the actual client rect so CSS scaling/stretching is handled, and fall back to hardware scaling\r\n // for engines without a DOM input element.\r\n let inputElementClientRect: Nullable<ClientRect> = null;\r\n try {\r\n inputElementClientRect = engine.getInputElementClientRect();\r\n } catch {\r\n // Non-DOM or pure engine builds may not register the DOM side effect. Fall back below.\r\n }\r\n const scaleX = inputElementClientRect?.width ? rttSizeW / inputElementClientRect.width : 1 / engine._hardwareScalingLevel;\r\n const scaleY = inputElementClientRect?.height ? rttSizeH / inputElementClientRect.height : 1 / engine._hardwareScalingLevel;\r\n\r\n return {\r\n rttSizeW,\r\n rttSizeH,\r\n scaleX,\r\n scaleY,\r\n };\r\n }\r\n\r\n private _prepareForPicking(x: number, y: number, scaleX: number, scaleY: number): IVector2Like {\r\n return { x: (scaleX * x) >> 0, y: (scaleY * y) >> 0 };\r\n }\r\n\r\n private _getPickingRenderRegion(x: number, y: number, renderWidth: number, renderHeight: number): { x: number; y: number; width: number; height: number } {\r\n if (!this._useDepthPicking) {\r\n return { x, y, width: 1, height: 1 };\r\n }\r\n\r\n const radius = GPUPicker._DepthPixelRadius;\r\n const left = Math.max(x - radius, 0);\r\n const bottom = Math.max(y - radius, 0);\r\n const right = Math.min(x + radius, renderWidth - 1);\r\n const top = Math.min(y + radius, renderHeight - 1);\r\n\r\n return {\r\n x: left,\r\n y: bottom,\r\n width: right - left + 1,\r\n height: top - bottom + 1,\r\n };\r\n }\r\n\r\n private _shouldUseIndividualMultiPickReadback(inBoundsPointCount: number, readArea: number, options?: IGPUMultiPickOptions): boolean {\r\n const readbackStrategy = options?.readbackStrategy ?? GPUMultiPickReadbackStrategy.Auto;\r\n if (inBoundsPointCount === 0 || readbackStrategy === GPUMultiPickReadbackStrategy.Rectangle) {\r\n return false;\r\n }\r\n\r\n if (readbackStrategy === GPUMultiPickReadbackStrategy.Individual) {\r\n return true;\r\n }\r\n\r\n const maxIndividualReadbackCount =\r\n options?.maxIndividualReadbackCount !== undefined && Number.isFinite(options.maxIndividualReadbackCount) && options.maxIndividualReadbackCount >= 0\r\n ? options.maxIndividualReadbackCount\r\n : GPUPicker._MaxMultiPickIndividualReadbackCount;\r\n if (inBoundsPointCount > maxIndividualReadbackCount) {\r\n return false;\r\n }\r\n\r\n const individualReadbackAreaRatio =\r\n options?.individualReadbackAreaRatio !== undefined && Number.isFinite(options.individualReadbackAreaRatio) && options.individualReadbackAreaRatio > 0\r\n ? options.individualReadbackAreaRatio\r\n : GPUPicker._MultiPickIndividualReadbackAreaRatio;\r\n const pointReadArea = inBoundsPointCount * (this._useDepthPicking ? 1 + (GPUPicker._DepthPixelRadius * 2 + 1) ** 2 : 1);\r\n return readArea > pointReadArea * individualReadbackAreaRatio;\r\n }\r\n\r\n private _preparePickingBuffer(engine: AbstractEngine, rttSizeW: number, rttSizeH: number, x: number, y: number, w = 1, h = 1, readBufferW = w, readBufferH = h): void {\r\n this._meshRenderingCount = 0;\r\n\r\n const requiredBufferSize = engine.isWebGPU ? (4 * readBufferW * readBufferH + 255) & ~255 : 4 * readBufferW * readBufferH;\r\n if (!this._readbuffer || this._readbuffer.length < requiredBufferSize) {\r\n this._readbuffer = new Uint8Array(requiredBufferSize);\r\n }\r\n\r\n // Do we need to rebuild the RTT?\r\n const size = this._pickingTexture!.getSize();\r\n if (size.width !== rttSizeW || size.height !== rttSizeH) {\r\n this._createRenderTarget(this._cachedScene!, rttSizeW, rttSizeH);\r\n this._updateRenderList();\r\n }\r\n\r\n this._pickingTexture!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n this._pickingTextureClearObserver?.remove();\r\n this._pickingTextureClearObserver = this._pickingTexture!.onClearObservable.add((engine) => {\r\n if (this._isUsingDepthPickingRenderTarget) {\r\n engine.bindAttachments(engine.buildTextureLayout([true, false]));\r\n }\r\n engine.clear(this._pickingTexture!.clearColor, true, true, true);\r\n if (this._isUsingDepthPickingRenderTarget) {\r\n engine.bindAttachments(engine.buildTextureLayout([true, true]));\r\n }\r\n });\r\n\r\n this._pickingTexture!.onBeforeRender = (): void => {\r\n this._enableScissor(x, y, w, h);\r\n };\r\n\r\n this._pickingTextureAfterRenderObserver?.remove();\r\n this._pickingTextureAfterRenderObserver = this._pickingTexture!.onAfterRenderObservable.add(() => {\r\n this._disableScissor();\r\n });\r\n }\r\n\r\n private _addPickingTextureToRenderTargets(): void {\r\n this._removePickingTextureFromRenderTargets();\r\n this._cachedScene!.customRenderTargets.push(this._pickingTexture!);\r\n this._renderPickingTexture = true;\r\n }\r\n\r\n private _removePickingTextureFromRenderTargets(): void {\r\n if (!this._cachedScene || !this._pickingTexture) {\r\n return;\r\n }\r\n\r\n const index = this._cachedScene.customRenderTargets.indexOf(this._pickingTexture);\r\n if (index > -1) {\r\n this._cachedScene.customRenderTargets.splice(index, 1);\r\n this._renderPickingTexture = false;\r\n }\r\n }\r\n\r\n // pick one pixel\r\n private async _executePickingAsync(x: number, y: number, disposeWhenDone: boolean): Promise<Nullable<IGPUPickingInfo>> {\r\n return await new Promise((resolve, reject) => {\r\n if (!this._pickingTexture) {\r\n this._pickingInProgress = false;\r\n reject(new Error(\"Picking texture not created\"));\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\r\n this._pickingTexture.onAfterRender = async (): Promise<void> => {\r\n if (this._checkRenderStatus()) {\r\n try {\r\n this._pickingTexture!.onAfterRender = null as any;\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined = undefined;\r\n\r\n this._removePickingTextureFromRenderTargets();\r\n\r\n // Do the actual picking\r\n if (await this._readTexturePixelsAsync(x, y)) {\r\n const colorId = this._getColorIdFromReadBuffer(0);\r\n\r\n // Thin?\r\n if (this._thinIdMap[colorId]) {\r\n pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n } else {\r\n pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n }\r\n }\r\n\r\n // Depth reconstruction is guaranteed for GPUPicker's default picking shader. Custom picking\r\n // materials and special material plugins can also work if they write the second MRT attachment;\r\n // otherwise the reconstructed pickedPoint/normal may be missing or incorrect.\r\n let depthPickingInfo: Nullable<{ pickedPoint?: Vector3; normal?: Vector3 }> = null;\r\n if (this._useDepthPicking && pickedMesh) {\r\n const camera = this._cachedScene!.activeCamera;\r\n if (camera) {\r\n const { rttSizeW, rttSizeH } = this._getRenderInfo();\r\n const viewport = camera.viewport.toGlobal(rttSizeW, rttSizeH);\r\n const view = this._cachedScene!.getViewMatrix().clone();\r\n const projection = this._cachedScene!.getProjectionMatrix().clone();\r\n const cameraPosition = camera.globalPosition.clone();\r\n depthPickingInfo = await this._getDepthPickingInfoAsync(x, y, rttSizeW, rttSizeH, view, projection, cameraPosition, viewport);\r\n }\r\n }\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n\r\n this._pickingInProgress = false;\r\n if (pickedMesh) {\r\n resolve({ mesh: pickedMesh, thinInstanceIndex: thinInstanceIndex, ...depthPickingInfo });\r\n } else {\r\n resolve(null);\r\n }\r\n } catch (error) {\r\n this._removePickingTextureFromRenderTargets();\r\n this._pickingInProgress = false;\r\n reject(error instanceof Error ? error : new Error(`${error}`));\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n // pick multiple pixels\r\n private async _executeMultiPickingAsync(\r\n xy: IVector2Like[],\r\n readX: number,\r\n readY: number,\r\n rttSizeW: number,\r\n rttSizeH: number,\r\n w: number,\r\n h: number,\r\n useIndividualReadback: boolean,\r\n disposeWhenDone: boolean\r\n ): Promise<Nullable<IGPUMultiPickingInfo>> {\r\n return await new Promise((resolve, reject) => {\r\n if (!this._pickingTexture) {\r\n this._pickingInProgress = false;\r\n reject(new Error(\"Picking texture not created\"));\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\r\n this._pickingTexture.onAfterRender = async (): Promise<void> => {\r\n if (this._checkRenderStatus()) {\r\n try {\r\n this._pickingTexture!.onAfterRender = null as any;\r\n const pickedMeshes = new Array<Nullable<AbstractMesh>>(xy.length).fill(null);\r\n const thinInstanceIndexes = new Array<number>(xy.length).fill(0);\r\n\r\n if (useIndividualReadback) {\r\n for (let i = 0; i < xy.length; i++) {\r\n const pointBottomY = rttSizeH - xy[i].y - 1;\r\n if (xy[i].x < 0 || pointBottomY < 0 || xy[i].x >= rttSizeW || pointBottomY >= rttSizeH) {\r\n continue;\r\n }\r\n\r\n // eslint-disable-next-line no-await-in-loop\r\n if (await this._readTexturePixelsAsync(xy[i].x, pointBottomY, 1, 1)) {\r\n const { pickedMesh, thinInstanceIndex } = this._getMeshFromReadBuffer(0);\r\n pickedMeshes[i] = pickedMesh;\r\n thinInstanceIndexes[i] = thinInstanceIndex ?? 0;\r\n }\r\n }\r\n } else {\r\n if (await this._readTexturePixelsAsync(readX, readY, w, h)) {\r\n for (let i = 0; i < xy.length; i++) {\r\n const { pickedMesh, thinInstanceIndex } = this._getMeshFromMultiplePoints(xy[i].x, xy[i].y, readX, readY, rttSizeH, w, h);\r\n pickedMeshes[i] = pickedMesh;\r\n thinInstanceIndexes[i] = thinInstanceIndex ?? 0;\r\n }\r\n }\r\n }\r\n\r\n let pickedPoints: Nullable<Vector3>[] | undefined;\r\n let normals: Nullable<Vector3>[] | undefined;\r\n if (this._useDepthPicking) {\r\n pickedPoints = new Array(xy.length).fill(null);\r\n normals = new Array(xy.length).fill(null);\r\n }\r\n\r\n if (pickedPoints && normals && pickedMeshes.some((mesh) => !!mesh)) {\r\n const camera = this._cachedScene!.activeCamera;\r\n if (camera) {\r\n const viewport = camera.viewport.toGlobal(rttSizeW, rttSizeH);\r\n const view = this._cachedScene!.getViewMatrix().clone();\r\n const projection = this._cachedScene!.getProjectionMatrix().clone();\r\n const cameraPosition = camera.globalPosition.clone();\r\n\r\n if (useIndividualReadback) {\r\n for (let i = 0; i < xy.length; i++) {\r\n if (!pickedMeshes[i]) {\r\n continue;\r\n }\r\n\r\n const pointY = rttSizeH - xy[i].y - 1;\r\n // eslint-disable-next-line no-await-in-loop\r\n const depthPickingInfo = await this._getDepthPickingInfoAsync(\r\n xy[i].x,\r\n pointY,\r\n rttSizeW,\r\n rttSizeH,\r\n view,\r\n projection,\r\n cameraPosition,\r\n viewport\r\n );\r\n pickedPoints[i] = depthPickingInfo?.pickedPoint ?? null;\r\n normals[i] = depthPickingInfo?.normal ?? null;\r\n }\r\n } else {\r\n const depthPixels = await this._readDepthTexturePixelsAsync(readX, readY, w, h);\r\n if (depthPixels) {\r\n for (let i = 0; i < xy.length; i++) {\r\n if (!pickedMeshes[i]) {\r\n continue;\r\n }\r\n\r\n const pointY = rttSizeH - xy[i].y - 1;\r\n const depthPickingInfo = this._getDepthPickingInfoFromBuffer(\r\n depthPixels,\r\n xy[i].x,\r\n pointY,\r\n readX,\r\n readY,\r\n w,\r\n h,\r\n rttSizeH,\r\n view,\r\n projection,\r\n cameraPosition,\r\n viewport\r\n );\r\n pickedPoints[i] = depthPickingInfo?.pickedPoint ?? null;\r\n normals[i] = depthPickingInfo?.normal ?? null;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n\r\n this._pickingInProgress = false;\r\n resolve({ meshes: pickedMeshes, thinInstanceIndexes: thinInstanceIndexes, pickedPoints, normals });\r\n } catch (error) {\r\n this._removePickingTextureFromRenderTargets();\r\n this._pickingInProgress = false;\r\n reject(error instanceof Error ? error : new Error(`${error}`));\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n // pick box area\r\n private async _executeBoxPickingAsync(\r\n scanX: number,\r\n scanMaxY: number,\r\n scanW: number,\r\n scanH: number,\r\n readX: number,\r\n readY: number,\r\n rttSizeW: number,\r\n rttSizeH: number,\r\n readW: number,\r\n readH: number,\r\n disposeWhenDone: boolean\r\n ): Promise<IGPUMultiPickingInfo> {\r\n return await new Promise((resolve, reject) => {\r\n if (!this._pickingTexture) {\r\n this._pickingInProgress = false;\r\n reject(new Error(\"Picking texture not created\"));\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\r\n this._pickingTexture.onAfterRender = async (): Promise<void> => {\r\n if (this._checkRenderStatus()) {\r\n try {\r\n this._pickingTexture!.onAfterRender = null as any;\r\n const pickedMeshes: Nullable<AbstractMesh>[] = [];\r\n const thinInstanceIndexes: number[] = [];\r\n const pickedPixelCoordinates: IVector2Like[] = [];\r\n const scanBufferX = scanX - readX;\r\n const scanBufferY = rttSizeH - scanMaxY - 1 - readY;\r\n\r\n if (await this._readTexturePixelsAsync(readX, readY, readW, readH)) {\r\n for (let offsetY = 0; offsetY < scanH; ++offsetY) {\r\n for (let offsetX = 0; offsetX < scanW; ++offsetX) {\r\n const bufferX = scanBufferX + offsetX;\r\n const bufferY = scanBufferY + offsetY;\r\n if (bufferX < 0 || bufferY < 0 || bufferX >= readW || bufferY >= readH) {\r\n continue;\r\n }\r\n\r\n const colorId = this._getColorIdFromReadBuffer(this._getReadBufferOffset(bufferX, bufferY, readW, readH));\r\n if (colorId > 0) {\r\n // Thin?\r\n if (this._thinIdMap[colorId]) {\r\n const pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n const thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n pickedMeshes.push(pickedMesh);\r\n thinInstanceIndexes.push(thinInstanceIndex);\r\n pickedPixelCoordinates.push({ x: scanX + offsetX, y: scanMaxY - offsetY });\r\n } else {\r\n const pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n pickedMeshes.push(pickedMesh);\r\n thinInstanceIndexes.push(0);\r\n pickedPixelCoordinates.push({ x: scanX + offsetX, y: scanMaxY - offsetY });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n let pickedPoints: Nullable<Vector3>[] | undefined;\r\n let normals: Nullable<Vector3>[] | undefined;\r\n if (this._useDepthPicking) {\r\n pickedPoints = new Array(pickedMeshes.length).fill(null);\r\n normals = new Array(pickedMeshes.length).fill(null);\r\n }\r\n\r\n if (pickedPoints && normals && pickedMeshes.length > 0) {\r\n const camera = this._cachedScene!.activeCamera;\r\n const depthPixels = await this._readDepthTexturePixelsAsync(readX, readY, readW, readH);\r\n if (camera && depthPixels) {\r\n const viewport = camera.viewport.toGlobal(rttSizeW, rttSizeH);\r\n const view = this._cachedScene!.getViewMatrix().clone();\r\n const projection = this._cachedScene!.getProjectionMatrix().clone();\r\n const cameraPosition = camera.globalPosition.clone();\r\n\r\n for (let i = 0; i < pickedPixelCoordinates.length; i++) {\r\n const point = pickedPixelCoordinates[i];\r\n const pointY = rttSizeH - point.y - 1;\r\n const depthPickingInfo = this._getDepthPickingInfoFromBuffer(\r\n depthPixels,\r\n point.x,\r\n pointY,\r\n readX,\r\n readY,\r\n readW,\r\n readH,\r\n rttSizeH,\r\n view,\r\n projection,\r\n cameraPosition,\r\n viewport\r\n );\r\n pickedPoints[i] = depthPickingInfo?.pickedPoint ?? null;\r\n normals[i] = depthPickingInfo?.normal ?? null;\r\n }\r\n }\r\n }\r\n\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n\r\n this._pickingInProgress = false;\r\n resolve({ meshes: pickedMeshes, thinInstanceIndexes: thinInstanceIndexes, pickedPoints, normals });\r\n } catch (error) {\r\n this._removePickingTextureFromRenderTargets();\r\n this._pickingInProgress = false;\r\n reject(error instanceof Error ? error : new Error(`${error}`));\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n private _enableScissor(x: number, y: number, w = 1, h = 1): void {\r\n if ((this._engine as WebGPUEngine | Engine).enableScissor) {\r\n const scissorY = this._engine?.isWebGPU && this._pickingTexture ? this._pickingTexture.getSize().height - y - h : y;\r\n (this._engine as WebGPUEngine | Engine).enableScissor(x, scissorY, w, h);\r\n }\r\n }\r\n private _disableScissor(): void {\r\n if ((this._engine as WebGPUEngine | Engine).disableScissor) {\r\n (this._engine as WebGPUEngine | Engine).disableScissor();\r\n }\r\n }\r\n\r\n /**\r\n * @returns true if rendering if the picking texture has finished, otherwise false\r\n */\r\n private _checkRenderStatus(): boolean {\r\n const wasSuccessful = this._meshRenderingCount > 0;\r\n if (wasSuccessful) {\r\n // Remove from the active RTTs\r\n const index = this._cachedScene!.customRenderTargets.indexOf(this._pickingTexture!);\r\n if (index > -1) {\r\n this._cachedScene!.customRenderTargets.splice(index, 1);\r\n this._renderPickingTexture = false;\r\n }\r\n return true;\r\n }\r\n\r\n this._meshRenderingCount = 0;\r\n return false; // Wait for shaders to be ready\r\n }\r\n\r\n /**\r\n * Polls the picking material variant for every mesh in the render list until every\r\n * variant is ready. Picking materials use parallel shader compilation, and a single\r\n * ShaderMaterial may produce different effect variants per mesh (instances, thin\r\n * instances, vertex colors, ...). If we render the picking texture before all variants\r\n * are compiled, the renderer silently skips meshes whose effect is not yet ready, which\r\n * can leave the click pixel cleared (0,0,0,0) and cause pickAsync to incorrectly return\r\n * null. Once compiled, effects are cached by define string in the engine, so this\r\n * polling only blocks on the very first pick (or whenever the render list changes to\r\n * include meshes with new define combinations).\r\n */\r\n private async _waitForPickingMaterialsReadyAsync(): Promise<void> {\r\n const renderList = this._pickingTexture?.renderList;\r\n if (!renderList || renderList.length === 0) {\r\n return;\r\n }\r\n\r\n const engine = this._cachedScene!.getEngine();\r\n\r\n // Cap the number of polling attempts to avoid hanging forever if a shader fails to compile.\r\n const maxAttempts = 200;\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n let allReady = true;\r\n // Compile picking effects under the picking texture's render pass id so per-pass effect caches\r\n // (e.g. GaussianSplattingMaterial) don't stamp them onto the main pass draw wrapper.\r\n const previousRenderPassId = engine.currentRenderPassId;\r\n engine.currentRenderPassId = this._pickingTexture!.renderPassId;\r\n try {\r\n // Iterate every mesh (do not break early): each isReady call kicks off compilation\r\n // of that mesh's effect variant if not yet started, so visiting them all on the first\r\n // attempt lets the compiles run in parallel (KHR_parallel_shader_compile) instead of\r\n // being serialized one variant per render frame.\r\n for (let i = 0; i < renderList.length; i++) {\r\n const mesh = renderList[i];\r\n const material = this._meshMaterialMap.get(mesh);\r\n // Match the canonical \"uses instanced shader variant\" check used elsewhere in this file\r\n // (see addPickingList) — InstancedMesh entries report isAnInstance=true while\r\n // hasInstances=false, so omitting isAnInstance would validate the wrong shader variant.\r\n const useInstances = mesh.hasInstances || mesh.isAnInstance || mesh.hasThinInstances;\r\n if (material && !material.isReady(mesh, useInstances)) {\r\n allReady = false;\r\n }\r\n }\r\n } finally {\r\n engine.currentRenderPassId = previousRenderPassId;\r\n }\r\n if (allReady) {\r\n return;\r\n }\r\n // Wait for the next scene render before re-checking. Effect compilation status\r\n // (especially with KHR_parallel_shader_compile) is typically observed between\r\n // frames, so tying the poll to the render loop is more efficient than a fixed timer.\r\n // eslint-disable-next-line no-await-in-loop\r\n await new Promise<void>((resolve) => {\r\n this._cachedScene!.onAfterRenderObservable.addOnce(() => resolve());\r\n });\r\n }\r\n\r\n Logger.Warn(`GPUPicker: gave up waiting for picking materials to compile after ${maxAttempts} attempts; picking results may be incorrect.`);\r\n }\r\n\r\n private _getMeshFromMultiplePoints(\r\n x: number,\r\n y: number,\r\n readX: number,\r\n readY: number,\r\n renderHeight: number,\r\n readWidth: number,\r\n readHeight: number\r\n ): { pickedMesh: Nullable<AbstractMesh>; thinInstanceIndex: number | undefined } {\r\n const bufferX = x - readX;\r\n const bufferY = renderHeight - y - 1 - readY;\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined;\r\n\r\n if (bufferX < 0 || bufferY < 0 || bufferX >= readWidth || bufferY >= readHeight) {\r\n return { pickedMesh, thinInstanceIndex };\r\n }\r\n\r\n const colorId = this._getColorIdFromReadBuffer(this._getReadBufferOffset(bufferX, bufferY, readWidth, readHeight));\r\n\r\n if (colorId > 0) {\r\n if (this._thinIdMap[colorId]) {\r\n pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n } else {\r\n pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n }\r\n }\r\n\r\n return { pickedMesh, thinInstanceIndex };\r\n }\r\n\r\n private _getMeshFromReadBuffer(offset: number): { pickedMesh: Nullable<AbstractMesh>; thinInstanceIndex: number | undefined } {\r\n const colorId = this._getColorIdFromReadBuffer(offset);\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined;\r\n\r\n if (colorId > 0) {\r\n if (this._thinIdMap[colorId]) {\r\n pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n } else {\r\n pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n }\r\n }\r\n\r\n return { pickedMesh, thinInstanceIndex };\r\n }\r\n\r\n /**\r\n * Updates the render list with the current pickable meshes.\r\n */\r\n private _updateRenderList(): void {\r\n this._pickingTexture!.renderList = [];\r\n for (const mesh of this._pickableMeshes) {\r\n const className = mesh.getClassName();\r\n // Part proxies don't render directly - their compound renders for them\r\n if (className === \"GaussianSplattingPartProxyMesh\") {\r\n continue;\r\n }\r\n this._pickingTexture!.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh));\r\n this._pickingTexture!.renderList.push(mesh);\r\n }\r\n // Also add compound GS meshes that render on behalf of part proxies\r\n for (const mesh of this._gsCompoundRenderMeshes) {\r\n this._pickingTexture!.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh));\r\n this._pickingTexture!.renderList.push(mesh);\r\n }\r\n }\r\n\r\n /**\r\n * Creates a GaussianSplattingMaterial configured for GPU picking by attaching\r\n * a GaussianSplattingGpuPickingMaterialPlugin. The plugin injects picking ID\r\n * encoding into the existing Gaussian Splatting shaders via material plugin hooks.\r\n * @param scene The scene\r\n * @param gsMesh The Gaussian Splatting mesh (used to set the source mesh on the material)\r\n * @returns A GaussianSplattingMaterial with the picking plugin attached\r\n */\r\n private _createGaussianSplattingPickingMaterial(scene: Scene, gsMesh: AbstractMesh): GaussianSplattingMaterial {\r\n const gsPickingMaterial = new GaussianSplattingMaterial(\"gaussianSplattingGpuPicking\", scene);\r\n gsPickingMaterial.setSourceMesh(gsMesh as any);\r\n gsPickingMaterial.needAlphaBlending = () => false;\r\n gsPickingMaterial.backFaceCulling = false;\r\n\r\n // Attach the GPU picking plugin\r\n const plugin = new GaussianSplattingGpuPickingMaterialPlugin(gsPickingMaterial);\r\n plugin.enableDepthPicking = this._useDepthPicking;\r\n plugin.enablePackedDepthPicking = this._isDepthTexturePacked;\r\n\r\n return gsPickingMaterial;\r\n }\r\n\r\n private async _readTexturePixelsAsync(x: number, y: number, w = 1, h = 1): Promise<boolean> {\r\n if (!this._cachedScene || !this._pickingTexture) {\r\n return false;\r\n }\r\n const engine = this._cachedScene.getEngine();\r\n const texture = this._isUsingDepthPickingRenderTarget ? (this._pickingTexture as MultiRenderTarget).textures[0]._texture : this._pickingTexture._texture;\r\n if (!texture) {\r\n return false;\r\n }\r\n\r\n const readY = engine.isWebGPU ? texture.height - y - h : y;\r\n await engine._readTexturePixels(texture, w, h, -1, 0, this._readbuffer, true, true, x, readY);\r\n\r\n return true;\r\n }\r\n\r\n private async _readDepthTexturePixelsAsync(x: number, y: number, w: number, h: number): Promise<Nullable<ArrayBufferView>> {\r\n if (!this._cachedScene || !this._isUsingDepthPickingRenderTarget || !(this._pickingTexture instanceof MultiRenderTarget)) {\r\n return null;\r\n }\r\n\r\n const texture = this._pickingTexture.textures[1]._texture;\r\n if (!texture) {\r\n return null;\r\n }\r\n\r\n const engine = this._cachedScene.getEngine();\r\n const requiredByteLength = engine.isWebGPU ? (4 * 4 * w * h + 255) & ~255 : 4 * 4 * w * h;\r\n if (!this._depthReadbuffer || this._depthReadbuffer.byteLength < requiredByteLength) {\r\n this._depthReadbuffer = this._depthTextureType === Constants.TEXTURETYPE_UNSIGNED_BYTE ? new Uint8Array(requiredByteLength) : new Float32Array(requiredByteLength / 4);\r\n }\r\n\r\n const readY = engine.isWebGPU ? texture.height - y - h : y;\r\n return await engine._readTexturePixels(texture, w, h, -1, 0, this._depthReadbuffer, true, false, x, readY);\r\n }\r\n\r\n private async _getDepthPickingInfoAsync(\r\n x: number,\r\n y: number,\r\n renderWidth: number,\r\n renderHeight: number,\r\n view: Matrix,\r\n projection: Matrix,\r\n cameraPosition: Vector3,\r\n viewport: { x: number; y: number; width: number; height: number }\r\n ): Promise<Nullable<{ pickedPoint?: Vector3; normal?: Vector3 }>> {\r\n const radius = GPUPicker._DepthPixelRadius;\r\n const left = Math.max(x - radius, 0);\r\n const bottom = Math.max(y - radius, 0);\r\n const right = Math.min(x + radius, renderWidth - 1);\r\n const top = Math.min(y + radius, renderHeight - 1);\r\n const width = right - left + 1;\r\n const height = top - bottom + 1;\r\n\r\n const pixels = await this._readDepthTexturePixelsAsync(left, bottom, width, height);\r\n if (!pixels) {\r\n return null;\r\n }\r\n\r\n return this._getDepthPickingInfoFromBuffer(pixels, x, y, left, bottom, width, height, renderHeight, view, projection, cameraPosition, viewport);\r\n }\r\n\r\n private _getDepthPickingInfoFromBuffer(\r\n pixels: ArrayBufferView,\r\n x: number,\r\n y: number,\r\n bufferLeft: number,\r\n bufferBottom: number,\r\n bufferWidth: number,\r\n bufferHeight: number,\r\n renderHeight: number,\r\n view: Matrix,\r\n projection: Matrix,\r\n cameraPosition: Vector3,\r\n viewport: { x: number; y: number; width: number; height: number }\r\n ): Nullable<{ pickedPoint?: Vector3; normal?: Vector3 }> {\r\n let centerBufferX = x - bufferLeft;\r\n let centerBufferY = y - bufferBottom;\r\n let centerDepth = this._getDepthFromBuffer(pixels, centerBufferX, centerBufferY, bufferWidth, bufferHeight);\r\n if (centerDepth === null) {\r\n let closestDistanceSquared = Infinity;\r\n for (let yy = 0; yy < bufferHeight; yy++) {\r\n for (let xx = 0; xx < bufferWidth; xx++) {\r\n const depth = this._getDepthFromBuffer(pixels, xx, yy, bufferWidth, bufferHeight);\r\n if (depth === null) {\r\n continue;\r\n }\r\n\r\n const dx = xx - centerBufferX;\r\n const dy = yy - centerBufferY;\r\n const distanceSquared = dx * dx + dy * dy;\r\n if (distanceSquared < closestDistanceSquared) {\r\n closestDistanceSquared = distanceSquared;\r\n centerBufferX = xx;\r\n centerBufferY = yy;\r\n centerDepth = depth;\r\n }\r\n }\r\n }\r\n }\r\n if (centerDepth === null) {\r\n return null;\r\n }\r\n\r\n x = bufferLeft + centerBufferX;\r\n y = bufferBottom + centerBufferY;\r\n\r\n const viewportTop = renderHeight - viewport.y - viewport.height;\r\n const centerViewportX = x - viewport.x;\r\n const centerViewportY = renderHeight - y - 1 - viewportTop;\r\n if (centerViewportX < 0 || centerViewportY < 0 || centerViewportX >= viewport.width || centerViewportY >= viewport.height) {\r\n return null;\r\n }\r\n\r\n const pickedPoint = Vector3.UnprojectFloatsToRef(\r\n centerViewportX,\r\n centerViewportY,\r\n centerDepth,\r\n viewport.width,\r\n viewport.height,\r\n Matrix.IdentityReadOnly,\r\n view,\r\n projection,\r\n new Vector3()\r\n );\r\n const fallbackNormal = (): Vector3 => cameraPosition.subtractToRef(pickedPoint, new Vector3()).normalize();\r\n let bestOffsetA: Nullable<(typeof GPUPicker._DepthNeighborOffsets)[number]> = null;\r\n let bestOffsetB: Nullable<(typeof GPUPicker._DepthNeighborOffsets)[number]> = null;\r\n let bestDepthDelta = Infinity;\r\n const offsets = GPUPicker._DepthNeighborOffsets;\r\n const depthNeighbors: { offset: (typeof GPUPicker._DepthNeighborOffsets)[number]; depth: number; depthDelta: number }[] = [];\r\n\r\n const epsilonSquared = Epsilon * Epsilon;\r\n for (let i = 0; i < offsets.length; i++) {\r\n const offset = offsets[i];\r\n const depth = this._getDepthFromBuffer(pixels, centerBufferX + offset[0], centerBufferY + offset[1], bufferWidth, bufferHeight);\r\n if (\r\n depth === null ||\r\n !this._getDepthPointFromBufferToRef(\r\n pixels,\r\n x,\r\n y,\r\n offset[0],\r\n offset[1],\r\n bufferLeft,\r\n bufferBottom,\r\n bufferWidth,\r\n bufferHeight,\r\n renderHeight,\r\n view,\r\n projection,\r\n viewport,\r\n TmpVectors.Vector3[3]\r\n )\r\n ) {\r\n continue;\r\n }\r\n\r\n depthNeighbors.push({ offset, depth, depthDelta: Math.abs(centerDepth - depth) });\r\n }\r\n\r\n depthNeighbors.sort((a, b) => a.depthDelta - b.depthDelta);\r\n\r\n for (let i = 0; i < depthNeighbors.length; i++) {\r\n const neighborA = depthNeighbors[i];\r\n this._getDepthPointFromBufferToRef(\r\n pixels,\r\n x,\r\n y,\r\n neighborA.offset[0],\r\n neighborA.offset[1],\r\n bufferLeft,\r\n bufferBottom,\r\n bufferWidth,\r\n bufferHeight,\r\n renderHeight,\r\n view,\r\n projection,\r\n viewport,\r\n TmpVectors.Vector3[3]\r\n );\r\n\r\n for (let j = i + 1; j < depthNeighbors.length; j++) {\r\n const neighborB = depthNeighbors[j];\r\n this._getDepthPointFromBufferToRef(\r\n pixels,\r\n x,\r\n y,\r\n neighborB.offset[0],\r\n neighborB.offset[1],\r\n bufferLeft,\r\n bufferBottom,\r\n bufferWidth,\r\n bufferHeight,\r\n renderHeight,\r\n view,\r\n projection,\r\n viewport,\r\n TmpVectors.Vector3[4]\r\n );\r\n\r\n const toA = TmpVectors.Vector3[3].subtractToRef(pickedPoint, TmpVectors.Vector3[0]);\r\n const toB = TmpVectors.Vector3[4].subtractToRef(pickedPoint, TmpVectors.Vector3[1]);\r\n if (toA.lengthSquared() < epsilonSquared || toB.lengthSquared() < epsilonSquared) {\r\n continue;\r\n }\r\n\r\n Vector3.CrossToRef(toB, toA, TmpVectors.Vector3[5]);\r\n if (TmpVectors.Vector3[5].lengthSquared() < epsilonSquared) {\r\n continue;\r\n }\r\n\r\n const depthDelta = neighborA.depthDelta + neighborB.depthDelta + Math.abs(neighborA.depth - neighborB.depth);\r\n if (depthDelta < bestDepthDelta) {\r\n bestDepthDelta = depthDelta;\r\n bestOffsetA = neighborA.offset;\r\n bestOffsetB = neighborB.offset;\r\n }\r\n }\r\n }\r\n\r\n if (!bestOffsetA || !bestOffsetB) {\r\n return { pickedPoint, normal: fallbackNormal() };\r\n }\r\n\r\n this._getDepthPointFromBufferToRef(\r\n pixels,\r\n x,\r\n y,\r\n bestOffsetA[0],\r\n bestOffsetA[1],\r\n bufferLeft,\r\n bufferBottom,\r\n bufferWidth,\r\n bufferHeight,\r\n renderHeight,\r\n view,\r\n projection,\r\n viewport,\r\n TmpVectors.Vector3[3]\r\n );\r\n this._getDepthPointFromBufferToRef(\r\n pixels,\r\n x,\r\n y,\r\n bestOffsetB[0],\r\n bestOffsetB[1],\r\n bufferLeft,\r\n bufferBottom,\r\n bufferWidth,\r\n bufferHeight,\r\n renderHeight,\r\n view,\r\n projection,\r\n viewport,\r\n TmpVectors.Vector3[4]\r\n );\r\n\r\n const toA = TmpVectors.Vector3[3].subtractToRef(pickedPoint, TmpVectors.Vector3[0]);\r\n const toB = TmpVectors.Vector3[4].subtractToRef(pickedPoint, TmpVectors.Vector3[1]);\r\n if (toA.lengthSquared() < epsilonSquared || toB.lengthSquared() < epsilonSquared) {\r\n return { pickedPoint, normal: fallbackNormal() };\r\n }\r\n\r\n toA.normalize();\r\n toB.normalize();\r\n\r\n const normal = Vector3.CrossToRef(toB, toA, new Vector3());\r\n if (normal.lengthSquared() < epsilonSquared) {\r\n return { pickedPoint, normal: fallbackNormal() };\r\n }\r\n\r\n normal.normalize();\r\n const cameraDirection = pickedPoint.subtractToRef(cameraPosition, TmpVectors.Vector3[2]).normalize();\r\n if (Vector3.Dot(normal, cameraDirection) > 0) {\r\n normal.negateInPlace();\r\n }\r\n\r\n return { pickedPoint, normal };\r\n }\r\n\r\n private _getDepthPointFromBufferToRef(\r\n pixels: ArrayBufferView,\r\n x: number,\r\n y: number,\r\n offsetX: number,\r\n offsetY: number,\r\n left: number,\r\n bottom: number,\r\n bufferWidth: number,\r\n bufferHeight: number,\r\n renderHeight: number,\r\n view: Matrix,\r\n projection: Matrix,\r\n viewport: { x: number; y: number; width: number; height: number },\r\n result: Vector3\r\n ): boolean {\r\n const bufferX = x + offsetX - left;\r\n const bufferY = y + offsetY - bottom;\r\n const depth = this._getDepthFromBuffer(pixels, bufferX, bufferY, bufferWidth, bufferHeight);\r\n if (depth === null) {\r\n return false;\r\n }\r\n\r\n const viewportTop = renderHeight - viewport.y - viewport.height;\r\n const viewportX = x + offsetX - viewport.x;\r\n const viewportY = renderHeight - (y + offsetY) - 1 - viewportTop;\r\n if (viewportX < 0 || viewportY < 0 || viewportX >= viewport.width || viewportY >= viewport.height) {\r\n return false;\r\n }\r\n\r\n Vector3.UnprojectFloatsToRef(viewportX, viewportY, depth, viewport.width, viewport.height, Matrix.IdentityReadOnly, view, projection, result);\r\n return true;\r\n }\r\n\r\n private _getDepthFromBuffer(pixels: ArrayBufferView, x: number, y: number, width: number, height: number): Nullable<number> {\r\n if (x < 0 || y < 0 || x >= width || y >= height) {\r\n return null;\r\n }\r\n\r\n const index = this._getReadBufferOffset(x, y, width, height);\r\n let depth: number;\r\n if (pixels instanceof Uint8Array || pixels instanceof Uint8ClampedArray) {\r\n if (this._isDepthTexturePacked) {\r\n depth = pixels[index] / (255 * 255 * 255 * 255) + pixels[index + 1] / (255 * 255 * 255) + pixels[index + 2] / (255 * 255) + pixels[index + 3] / 255;\r\n } else {\r\n depth = pixels[index] / 255;\r\n }\r\n } else {\r\n depth = (pixels as Float32Array)[index];\r\n }\r\n\r\n if (!Number.isFinite(depth) || depth <= 0 || depth >= 1) {\r\n return null;\r\n }\r\n\r\n return depth;\r\n }\r\n\r\n /** Release the resources */\r\n public dispose(): void {\r\n this.setPickingList(null);\r\n this._cachedScene = null;\r\n\r\n // Cleaning up\r\n this._pickingTexture?.dispose();\r\n this._pickingTexture = null;\r\n this._clearPickingMaterials();\r\n this._sceneBeforeRenderObserver?.remove();\r\n this._sceneBeforeRenderObserver = null;\r\n this._pickingTextureClearObserver?.remove();\r\n this._pickingTextureClearObserver = null;\r\n this._pickingTextureAfterRenderObserver?.remove();\r\n this._pickingTextureAfterRenderObserver = null;\r\n }\r\n}\r\n"]}
|
|
@@ -41,19 +41,21 @@ export interface INativeEngine {
|
|
|
41
41
|
getUniforms(shaderProgram: NativeProgram, uniformsNames: string[]): WebGLUniformLocation[];
|
|
42
42
|
getAttributes(shaderProgram: NativeProgram, attributeNames: string[]): number[];
|
|
43
43
|
createTexture(): NativeTexture;
|
|
44
|
-
initializeTexture(texture: NativeTexture, width: number, height: number, hasMips: boolean, format: number, renderTarget: boolean, srgb: boolean, samples: number): void;
|
|
44
|
+
initializeTexture(texture: NativeTexture, width: number, height: number, hasMips: boolean, format: number, renderTarget: boolean, srgb: boolean, samples: number, isCube?: boolean): void;
|
|
45
45
|
loadTexture(texture: NativeTexture, data: ArrayBufferView, generateMips: boolean, invertY: boolean, srgb: boolean, onSuccess: () => void, onError: () => void): void;
|
|
46
46
|
loadRawTexture(texture: NativeTexture, data: ArrayBufferView, width: number, height: number, format: number, generateMips: boolean, invertY: boolean): void;
|
|
47
|
+
updateTextureData?(texture: NativeTexture, data: ArrayBufferView, xOffset: number, yOffset: number, width: number, height: number, faceIndex: number, lod: number, invertY: boolean): void;
|
|
47
48
|
loadRawTexture2DArray(texture: NativeTexture, data: Nullable<ArrayBufferView>, width: number, height: number, depth: number, format: number, generateMipMaps: boolean, invertY: boolean): void;
|
|
48
49
|
loadCubeTexture(texture: NativeTexture, data: Array<ArrayBufferView>, generateMips: boolean, invertY: boolean, srgb: boolean, onSuccess: () => void, onError: () => void): void;
|
|
49
50
|
loadCubeTextureWithMips(texture: NativeTexture, data: Array<Array<ArrayBufferView>>, invertY: boolean, srgb: boolean, onSuccess: () => void, onError: () => void): void;
|
|
50
51
|
getTextureWidth(texture: NativeTexture): number;
|
|
51
52
|
getTextureHeight(texture: NativeTexture): number;
|
|
53
|
+
getTextureLayerCount?(texture: NativeTexture): number;
|
|
52
54
|
deleteTexture(texture: NativeTexture): void;
|
|
53
55
|
readTexture(texture: NativeTexture, mipLevel: number, x: number, y: number, width: number, height: number, buffer: Nullable<ArrayBuffer>, bufferOffset: number, bufferLength: number): Promise<ArrayBuffer>;
|
|
54
56
|
createImageBitmap(data: ArrayBuffer | IImage): ImageBitmap;
|
|
55
57
|
resizeImageBitmap(image: ImageBitmap, bufferWidth: number, bufferHeight: number): Uint8Array;
|
|
56
|
-
createFrameBuffer(texture: Nullable<NativeTexture>, width: number, height: number, generateStencilBuffer: boolean, generateDepthBuffer: boolean, samples: number): NativeFramebuffer;
|
|
58
|
+
createFrameBuffer(texture: Nullable<NativeTexture>, width: number, height: number, generateStencilBuffer: boolean, generateDepthBuffer: boolean, samples: number, layer?: number): NativeFramebuffer;
|
|
57
59
|
getRenderWidth(): number;
|
|
58
60
|
getRenderHeight(): number;
|
|
59
61
|
setHardwareScalingLevel(level: number): void;
|