@babylonjs/core 7.19.1 → 7.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Bones/bone.js +3 -3
- package/Bones/bone.js.map +1 -1
- package/Bones/boneLookController.js +3 -3
- package/Bones/boneLookController.js.map +1 -1
- package/Buffers/buffer.nonFloatVertexBuffers.js +1 -1
- package/Buffers/buffer.nonFloatVertexBuffers.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +8 -2
- package/Collisions/gpuPicker.js +41 -20
- package/Collisions/gpuPicker.js.map +1 -1
- package/Compat/compatibilityOptions.d.ts +13 -6
- package/Compat/compatibilityOptions.js +20 -4
- package/Compat/compatibilityOptions.js.map +1 -1
- package/Compat/index.d.ts +1 -1
- package/Compat/index.js +1 -1
- package/Compat/index.js.map +1 -1
- package/Culling/boundingBox.js +5 -5
- package/Culling/boundingBox.js.map +1 -1
- package/Culling/boundingInfo.js +2 -2
- package/Culling/boundingInfo.js.map +1 -1
- package/Culling/boundingSphere.js +2 -2
- package/Culling/boundingSphere.js.map +1 -1
- package/Culling/ray.js +2 -2
- package/Culling/ray.js.map +1 -1
- package/Debug/debugLayer.d.ts +3 -0
- package/Debug/debugLayer.js +15 -0
- package/Debug/debugLayer.js.map +1 -1
- package/Engines/Processors/shaderProcessor.d.ts +1 -0
- package/Engines/Processors/shaderProcessor.js +1 -0
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.rawTexture.js +1 -0
- package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessingContext.d.ts +1 -1
- package/Engines/WebGPU/webgpuShaderProcessingContext.js +4 -2
- package/Engines/WebGPU/webgpuShaderProcessingContext.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +2 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +12 -5
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureManager.d.ts +1 -4
- package/Engines/WebGPU/webgpuTextureManager.js +90 -75
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/abstractEngine.d.ts +2 -2
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/engine.js +11 -2
- package/Engines/engine.js.map +1 -1
- package/Engines/nativeEngine.d.ts +1 -1
- package/Engines/nativeEngine.js +2 -1
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/thinEngine.d.ts +1 -1
- package/Engines/thinEngine.functions.d.ts +1 -1
- package/Engines/thinEngine.functions.js +2 -1
- package/Engines/thinEngine.functions.js.map +1 -1
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +9 -5
- package/Engines/webgpuEngine.js +35 -22
- package/Engines/webgpuEngine.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.d.ts +2 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.js.map +1 -1
- package/Layers/effectLayer.d.ts +16 -1
- package/Layers/effectLayer.js +32 -2
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/glowLayer.d.ts +1 -2
- package/Layers/glowLayer.js +16 -3
- package/Layers/glowLayer.js.map +1 -1
- package/Layers/highlightLayer.d.ts +5 -4
- package/Layers/highlightLayer.js +35 -11
- package/Layers/highlightLayer.js.map +1 -1
- package/Layers/index.d.ts +10 -0
- package/Layers/index.js +12 -0
- package/Layers/index.js.map +1 -1
- package/Lights/Shadows/index.d.ts +8 -0
- package/Lights/Shadows/index.js +9 -0
- package/Lights/Shadows/index.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.d.ts +18 -5
- package/Lights/Shadows/shadowGenerator.js +44 -5
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Loading/sceneLoader.d.ts +155 -16
- package/Loading/sceneLoader.js +197 -99
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +8 -1
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.js +1 -1
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/Textures/Loaders/hdrTextureLoader.js +3 -3
- package/Materials/Textures/Loaders/hdrTextureLoader.js.map +1 -1
- package/Materials/Textures/hdrCubeTexture.js +2 -2
- package/Materials/Textures/hdrCubeTexture.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js +2 -2
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/Textures/texture.js +3 -3
- package/Materials/Textures/texture.js.map +1 -1
- package/Materials/effect.functions.d.ts +1 -1
- package/Materials/effect.functions.js +6 -3
- package/Materials/effect.functions.js.map +1 -1
- package/Materials/effect.js +1 -1
- package/Materials/effect.js.map +1 -1
- package/Materials/standardMaterial.d.ts +1 -1
- package/Materials/standardMaterial.js +1 -1
- package/Materials/standardMaterial.js.map +1 -1
- package/Maths/math.color.js +3 -3
- package/Maths/math.color.js.map +1 -1
- package/Maths/math.constants.d.ts +1 -2
- package/Maths/math.constants.js +1 -2
- package/Maths/math.constants.js.map +1 -1
- package/Maths/math.like.d.ts +9 -0
- package/Maths/math.like.js.map +1 -1
- package/Maths/math.vector.d.ts +23 -23
- package/Maths/math.vector.js +56 -25
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Builders/boxBuilder.js +5 -5
- package/Meshes/Builders/boxBuilder.js.map +1 -1
- package/Meshes/Builders/capsuleBuilder.js +4 -4
- package/Meshes/Builders/capsuleBuilder.js.map +1 -1
- package/Meshes/Builders/cylinderBuilder.js +8 -8
- package/Meshes/Builders/cylinderBuilder.js.map +1 -1
- package/Meshes/Builders/decalBuilder.js +3 -3
- package/Meshes/Builders/decalBuilder.js.map +1 -1
- package/Meshes/Builders/discBuilder.js +3 -3
- package/Meshes/Builders/discBuilder.js.map +1 -1
- package/Meshes/Builders/goldbergBuilder.js +2 -2
- package/Meshes/Builders/goldbergBuilder.js.map +1 -1
- package/Meshes/Builders/groundBuilder.js +2 -2
- package/Meshes/Builders/groundBuilder.js.map +1 -1
- package/Meshes/Builders/icoSphereBuilder.js +2 -2
- package/Meshes/Builders/icoSphereBuilder.js.map +1 -1
- package/Meshes/Builders/planeBuilder.js +5 -5
- package/Meshes/Builders/planeBuilder.js.map +1 -1
- package/Meshes/Builders/polygonBuilder.js +4 -4
- package/Meshes/Builders/polygonBuilder.js.map +1 -1
- package/Meshes/Builders/polyhedronBuilder.js +3 -3
- package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
- package/Meshes/Builders/ribbonBuilder.js +4 -4
- package/Meshes/Builders/ribbonBuilder.js.map +1 -1
- package/Meshes/Builders/sphereBuilder.js +2 -2
- package/Meshes/Builders/sphereBuilder.js.map +1 -1
- package/Meshes/Builders/tiledBoxBuilder.js +2 -2
- package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
- package/Meshes/Builders/torusBuilder.js +2 -2
- package/Meshes/Builders/torusBuilder.js.map +1 -1
- package/Meshes/Builders/torusKnotBuilder.js +2 -2
- package/Meshes/Builders/torusKnotBuilder.js.map +1 -1
- package/Meshes/geometry.js +7 -7
- package/Meshes/geometry.js.map +1 -1
- package/Misc/HighDynamicRange/hdr.d.ts +40 -42
- package/Misc/HighDynamicRange/hdr.js +209 -202
- package/Misc/HighDynamicRange/hdr.js.map +1 -1
- package/Misc/HighDynamicRange/index.d.ts +1 -1
- package/Misc/HighDynamicRange/index.js +1 -1
- package/Misc/HighDynamicRange/index.js.map +1 -1
- package/Misc/arrayTools.d.ts +12 -17
- package/Misc/arrayTools.js +18 -23
- package/Misc/arrayTools.js.map +1 -1
- package/Misc/dumpTools.d.ts +50 -47
- package/Misc/dumpTools.js +153 -143
- package/Misc/dumpTools.js.map +1 -1
- package/Misc/environmentTextureTools.js +2 -2
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Misc/equirectangularCapture.js +2 -2
- package/Misc/equirectangularCapture.js.map +1 -1
- package/Misc/index.d.ts +6 -1
- package/Misc/index.js +7 -1
- package/Misc/index.js.map +1 -1
- package/Misc/rgbdTextureTools.d.ts +1 -0
- package/Misc/rgbdTextureTools.js +16 -2
- package/Misc/rgbdTextureTools.js.map +1 -1
- package/Misc/screenshotTools.js +3 -3
- package/Misc/screenshotTools.js.map +1 -1
- package/Physics/v1/physicsImpostor.js +2 -2
- package/Physics/v1/physicsImpostor.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.js +2 -2
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/PostProcesses/blurPostProcess.d.ts +6 -0
- package/PostProcesses/blurPostProcess.js +20 -2
- package/PostProcesses/blurPostProcess.js.map +1 -1
- package/PostProcesses/index.d.ts +8 -0
- package/PostProcesses/index.js +10 -0
- package/PostProcesses/index.js.map +1 -1
- package/PostProcesses/passPostProcess.d.ts +2 -0
- package/PostProcesses/passPostProcess.js +24 -2
- package/PostProcesses/passPostProcess.js.map +1 -1
- package/PostProcesses/postProcess.d.ts +17 -2
- package/PostProcesses/postProcess.js +38 -1
- package/PostProcesses/postProcess.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDebug.js +1 -1
- package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bayerDitherFunctions.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/bayerDitherFunctions.js +17 -0
- package/ShadersWGSL/ShadersInclude/bayerDitherFunctions.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/kernelBlurFragment.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurFragment.js +20 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurFragment.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurFragment2.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurFragment2.js +19 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurFragment2.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurVaryingDeclaration.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurVaryingDeclaration.js +9 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurVaryingDeclaration.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurVertex.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurVertex.js +9 -0
- package/ShadersWGSL/ShadersInclude/kernelBlurVertex.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js +4 -4
- package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDebug.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/shadowMapFragment.js +5 -5
- package/ShadersWGSL/ShadersInclude/shadowMapFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/shadowMapFragmentExtraDeclaration.d.ts +7 -0
- package/ShadersWGSL/ShadersInclude/shadowMapFragmentExtraDeclaration.js +26 -0
- package/ShadersWGSL/ShadersInclude/shadowMapFragmentExtraDeclaration.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/shadowMapFragmentSoftTransparentShadow.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/shadowMapFragmentSoftTransparentShadow.js +12 -0
- package/ShadersWGSL/ShadersInclude/shadowMapFragmentSoftTransparentShadow.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/shadowMapVertexExtraDeclaration.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/shadowMapVertexExtraDeclaration.js +19 -0
- package/ShadersWGSL/ShadersInclude/shadowMapVertexExtraDeclaration.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/shadowMapVertexMetric.js +4 -4
- package/ShadersWGSL/ShadersInclude/shadowMapVertexMetric.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/shadowMapVertexNormalBias.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/shadowMapVertexNormalBias.js +17 -0
- package/ShadersWGSL/ShadersInclude/shadowMapVertexNormalBias.js.map +1 -0
- package/ShadersWGSL/background.fragment.js +1 -1
- package/ShadersWGSL/background.fragment.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +2 -2
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/depthBoxBlur.fragment.d.ts +5 -0
- package/ShadersWGSL/depthBoxBlur.fragment.js +14 -0
- package/ShadersWGSL/depthBoxBlur.fragment.js.map +1 -0
- package/ShadersWGSL/glowBlurPostProcess.fragment.d.ts +5 -0
- package/ShadersWGSL/glowBlurPostProcess.fragment.js +15 -0
- package/ShadersWGSL/glowBlurPostProcess.fragment.js.map +1 -0
- package/ShadersWGSL/glowMapGeneration.fragment.d.ts +8 -0
- package/ShadersWGSL/glowMapGeneration.fragment.js +74 -0
- package/ShadersWGSL/glowMapGeneration.fragment.js.map +1 -0
- package/ShadersWGSL/glowMapGeneration.vertex.d.ts +17 -0
- package/ShadersWGSL/glowMapGeneration.vertex.js +92 -0
- package/ShadersWGSL/glowMapGeneration.vertex.js.map +1 -0
- package/ShadersWGSL/glowMapMerge.fragment.d.ts +5 -0
- package/ShadersWGSL/glowMapMerge.fragment.js +32 -0
- package/ShadersWGSL/glowMapMerge.fragment.js.map +1 -0
- package/ShadersWGSL/glowMapMerge.vertex.d.ts +5 -0
- package/ShadersWGSL/glowMapMerge.vertex.js +16 -0
- package/ShadersWGSL/glowMapMerge.vertex.js.map +1 -0
- package/ShadersWGSL/kernelBlur.fragment.d.ts +9 -0
- package/ShadersWGSL/kernelBlur.fragment.js +48 -0
- package/ShadersWGSL/kernelBlur.fragment.js.map +1 -0
- package/ShadersWGSL/kernelBlur.vertex.d.ts +7 -0
- package/ShadersWGSL/kernelBlur.vertex.js +21 -0
- package/ShadersWGSL/kernelBlur.vertex.js.map +1 -0
- package/ShadersWGSL/pass.fragment.d.ts +5 -0
- package/ShadersWGSL/pass.fragment.js +12 -0
- package/ShadersWGSL/pass.fragment.js.map +1 -0
- package/ShadersWGSL/passCube.fragment.d.ts +5 -0
- package/ShadersWGSL/passCube.fragment.js +31 -0
- package/ShadersWGSL/passCube.fragment.js.map +1 -0
- package/ShadersWGSL/rgbdDecode.fragment.d.ts +6 -0
- package/ShadersWGSL/rgbdDecode.fragment.js +14 -0
- package/ShadersWGSL/rgbdDecode.fragment.js.map +1 -0
- package/ShadersWGSL/rgbdEncode.fragment.d.ts +6 -0
- package/ShadersWGSL/rgbdEncode.fragment.js +14 -0
- package/ShadersWGSL/rgbdEncode.fragment.js.map +1 -0
- package/ShadersWGSL/shadowMap.fragment.d.ts +9 -0
- package/ShadersWGSL/shadowMap.fragment.js +39 -0
- package/ShadersWGSL/shadowMap.fragment.js.map +1 -0
- package/ShadersWGSL/shadowMap.vertex.d.ts +22 -0
- package/ShadersWGSL/shadowMap.vertex.js +89 -0
- package/ShadersWGSL/shadowMap.vertex.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buffer.nonFloatVertexBuffers.js","sourceRoot":"","sources":["../../../../dev/core/src/Buffers/buffer.nonFloatVertexBuffers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,qCAAqC,GAAgC;IACvE,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,IAAI;IACjC,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,IAAI;IAC/B,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,IAAI;IAChC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI;IAC3B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI;IAC9B,CAAC,YAAY,CAAC,iBAAiB,CAAC,EAAE,IAAI;IACtC,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE,IAAI;IACxC,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE,IAAI;IACxC,CAAC,YAAY,CAAC,wBAAwB,CAAC,EAAE,IAAI;IAC7C,CAAC,YAAY,CAAC,wBAAwB,CAAC,EAAE,IAAI;CAChD,CAAC;AAEF;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY;IAC9B,QAAQ,IAAI,EAAE;QACV,KAAK,YAAY,CAAC,IAAI,CAAC;QACvB,KAAK,YAAY,CAAC,KAAK,CAAC;QACxB,KAAK,YAAY,CAAC,GAAG,CAAC;QACtB,KAAK,YAAY,CAAC,KAAK;YACnB,OAAO,IAAI,CAAC;QAChB,KAAK,YAAY,CAAC,aAAa,CAAC;QAChC,KAAK,YAAY,CAAC,cAAc,CAAC;QACjC,KAAK,YAAY,CAAC,YAAY;YAC1B,OAAO,KAAK,CAAC;QACjB;YACI,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,GAAG,CAAC,CAAC;KACjD;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,aAAwD,EAAE,MAAc;IAC/G,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAEhD,IAAI,CAAC,eAAe,EAAE,sBAAsB,EAAE;QAC1C,OAAO;KACV;IAED,IAAI,uBAAuB,GAAsC,IAAI,CAAC;IAEtE,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;QAC9B,MAAM,mBAAmB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,CAAC,mBAAmB,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,EAAE;YACtE,SAAS;SACZ;QAED,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAC/G,MAAM,gBAAgB,GAAG,eAAe,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAEtE,IACI,CAAC,uBAAuB,KAAK,YAAY,CAAC,KAAK,IAAI,gBAAgB,KAAK,SAAS,CAAC;YAClF,CAAC,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,uBAAuB,CAAC,EAClF;YACE,IAAI,CAAC,uBAAuB,EAAE;gBAC1B,uBAAuB,GAAG,MAAM,CAAC,2BAA2B,CAAC,MAAM,CAAC,cAAc,CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"buffer.nonFloatVertexBuffers.js","sourceRoot":"","sources":["../../../../dev/core/src/Buffers/buffer.nonFloatVertexBuffers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,qCAAqC,GAAgC;IACvE,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,IAAI;IACjC,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,IAAI;IAC/B,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,IAAI;IAChC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI;IAC3B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI;IAC9B,CAAC,YAAY,CAAC,iBAAiB,CAAC,EAAE,IAAI;IACtC,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE,IAAI;IACxC,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE,IAAI;IACxC,CAAC,YAAY,CAAC,wBAAwB,CAAC,EAAE,IAAI;IAC7C,CAAC,YAAY,CAAC,wBAAwB,CAAC,EAAE,IAAI;CAChD,CAAC;AAEF;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY;IAC9B,QAAQ,IAAI,EAAE;QACV,KAAK,YAAY,CAAC,IAAI,CAAC;QACvB,KAAK,YAAY,CAAC,KAAK,CAAC;QACxB,KAAK,YAAY,CAAC,GAAG,CAAC;QACtB,KAAK,YAAY,CAAC,KAAK;YACnB,OAAO,IAAI,CAAC;QAChB,KAAK,YAAY,CAAC,aAAa,CAAC;QAChC,KAAK,YAAY,CAAC,cAAc,CAAC;QACjC,KAAK,YAAY,CAAC,YAAY;YAC1B,OAAO,KAAK,CAAC;QACjB;YACI,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,GAAG,CAAC,CAAC;KACjD;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,aAAwD,EAAE,MAAc;IAC/G,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAEhD,IAAI,CAAC,eAAe,EAAE,sBAAsB,EAAE;QAC1C,OAAO;KACV;IAED,IAAI,uBAAuB,GAAsC,IAAI,CAAC;IAEtE,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;QAC9B,MAAM,mBAAmB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,CAAC,mBAAmB,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,EAAE;YACtE,SAAS;SACZ;QAED,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAC/G,MAAM,gBAAgB,GAAG,eAAe,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAEtE,IACI,CAAC,uBAAuB,KAAK,YAAY,CAAC,KAAK,IAAI,gBAAgB,KAAK,SAAS,CAAC;YAClF,CAAC,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,uBAAuB,CAAC,EAClF;YACE,IAAI,CAAC,uBAAuB,EAAE;gBAC1B,uBAAuB,GAAG,MAAM,CAAC,2BAA2B,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,CAAE,CAAC;aAC/F;YACD,eAAe,CAAC,sBAAsB,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC;YACvE,IAAI,uBAAuB,KAAK,YAAY,CAAC,KAAK,EAAE;gBAChD,uBAAuB,CAAC,oCAAqC,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACtG,IAAI,YAAY,CAAC,uBAAuB,CAAC,EAAE;oBACvC,uBAAuB,CAAC,oCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;iBAC7E;aACJ;SACJ;KACJ;IAED,IAAI,uBAAuB,EAAE;QACzB,6LAA6L;QAC7L,MAAM,qBAAqB,GAAG,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAE/C,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,sDAAsD,EAAE,uBAAuB,CAAC,CAAC;QAElI,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;KAC9D;AACL,CAAC","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { ShaderProcessingContext } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { VertexBuffer } from \"../Meshes/buffer\";\r\n\r\nconst vertexBufferKindForNonFloatProcessing: { [kind: string]: boolean } = {\r\n [VertexBuffer.PositionKind]: true,\r\n [VertexBuffer.NormalKind]: true,\r\n [VertexBuffer.TangentKind]: true,\r\n [VertexBuffer.UVKind]: true,\r\n [VertexBuffer.UV2Kind]: true,\r\n [VertexBuffer.UV3Kind]: true,\r\n [VertexBuffer.UV4Kind]: true,\r\n [VertexBuffer.UV5Kind]: true,\r\n [VertexBuffer.UV6Kind]: true,\r\n [VertexBuffer.ColorKind]: true,\r\n [VertexBuffer.ColorInstanceKind]: true,\r\n [VertexBuffer.MatricesIndicesKind]: true,\r\n [VertexBuffer.MatricesWeightsKind]: true,\r\n [VertexBuffer.MatricesIndicesExtraKind]: true,\r\n [VertexBuffer.MatricesWeightsExtraKind]: true,\r\n};\r\n\r\n/**\r\n * Indicates if the type is a signed or unsigned type\r\n * @param type Type to check\r\n * @returns True if it is a signed type\r\n */\r\nfunction isSignedType(type: number): boolean {\r\n switch (type) {\r\n case VertexBuffer.BYTE:\r\n case VertexBuffer.SHORT:\r\n case VertexBuffer.INT:\r\n case VertexBuffer.FLOAT:\r\n return true;\r\n case VertexBuffer.UNSIGNED_BYTE:\r\n case VertexBuffer.UNSIGNED_SHORT:\r\n case VertexBuffer.UNSIGNED_INT:\r\n return false;\r\n default:\r\n throw new Error(`Invalid type '${type}'`);\r\n }\r\n}\r\n\r\n/**\r\n * Checks whether some vertex buffers that should be of type float are of a different type (int, byte...).\r\n * If so, trigger a shader recompilation to give the shader processor the opportunity to update the code accordingly.\r\n * @param vertexBuffers List of vertex buffers to check\r\n * @param effect The effect (shaders) that should be recompiled if needed\r\n */\r\nexport function checkNonFloatVertexBuffers(vertexBuffers: { [key: string]: Nullable<VertexBuffer> }, effect: Effect): void {\r\n const engine = effect.getEngine();\r\n const pipelineContext = effect._pipelineContext;\r\n\r\n if (!pipelineContext?.vertexBufferKindToType) {\r\n return;\r\n }\r\n\r\n let shaderProcessingContext: Nullable<ShaderProcessingContext> = null;\r\n\r\n for (const kind in vertexBuffers) {\r\n const currentVertexBuffer = vertexBuffers[kind];\r\n\r\n if (!currentVertexBuffer || !vertexBufferKindForNonFloatProcessing[kind]) {\r\n continue;\r\n }\r\n\r\n const currentVertexBufferType = currentVertexBuffer.normalized ? VertexBuffer.FLOAT : currentVertexBuffer.type;\r\n const vertexBufferType = pipelineContext.vertexBufferKindToType[kind];\r\n\r\n if (\r\n (currentVertexBufferType !== VertexBuffer.FLOAT && vertexBufferType === undefined) ||\r\n (vertexBufferType !== undefined && vertexBufferType !== currentVertexBufferType)\r\n ) {\r\n if (!shaderProcessingContext) {\r\n shaderProcessingContext = engine._getShaderProcessingContext(effect.shaderLanguage, false)!;\r\n }\r\n pipelineContext.vertexBufferKindToType[kind] = currentVertexBufferType;\r\n if (currentVertexBufferType !== VertexBuffer.FLOAT) {\r\n shaderProcessingContext.vertexBufferKindToNumberOfComponents![kind] = VertexBuffer.DeduceStride(kind);\r\n if (isSignedType(currentVertexBufferType)) {\r\n shaderProcessingContext.vertexBufferKindToNumberOfComponents![kind] *= -1;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (shaderProcessingContext) {\r\n // We temporarily disable parallel compilation of shaders because we want new shaders to be compiled after the _processShaderCode call, so that they are in effect for the rest of the frame.\r\n const parallelShaderCompile = engine._caps.parallelShaderCompile;\r\n engine._caps.parallelShaderCompile = undefined;\r\n\r\n effect._processShaderCode(null, engine._features._checkNonFloatVertexBuffersDontRecreatePipelineContext, shaderProcessingContext);\r\n\r\n engine._caps.parallelShaderCompile = parallelShaderCompile;\r\n }\r\n}\r\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ShaderMaterial } from "../Materials/shaderMaterial.js";
|
|
1
2
|
import type { AbstractMesh } from "../Meshes/abstractMesh.js";
|
|
2
3
|
import type { Nullable } from "../types.js";
|
|
3
4
|
import "../Shaders/picking.fragment";
|
|
@@ -25,13 +26,15 @@ export declare class GPUPicker {
|
|
|
25
26
|
private _thinIdMap;
|
|
26
27
|
private _idColors;
|
|
27
28
|
private _cachedScene;
|
|
28
|
-
private
|
|
29
|
+
private _defaultRenderMaterial;
|
|
29
30
|
private _pickableMeshes;
|
|
31
|
+
private _meshMaterialMap;
|
|
30
32
|
private _readbuffer;
|
|
31
33
|
private _meshRenderingCount;
|
|
32
34
|
private readonly _attributeName;
|
|
33
35
|
private _createRenderTarget;
|
|
34
36
|
private _createColorMaterial;
|
|
37
|
+
private _materialBindCallback;
|
|
35
38
|
private _generateColorData;
|
|
36
39
|
private _generateThinInstanceColorData;
|
|
37
40
|
/**
|
|
@@ -40,7 +43,10 @@ export declare class GPUPicker {
|
|
|
40
43
|
* 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.
|
|
41
44
|
* @param list defines the list of meshes to pick from
|
|
42
45
|
*/
|
|
43
|
-
setPickingList(list: Nullable<Array<AbstractMesh
|
|
46
|
+
setPickingList(list: Nullable<Array<AbstractMesh | {
|
|
47
|
+
mesh: AbstractMesh;
|
|
48
|
+
material: ShaderMaterial;
|
|
49
|
+
}>>): void;
|
|
44
50
|
/**
|
|
45
51
|
* Execute a picking operation
|
|
46
52
|
* @param x defines the X coordinates where to run the pick
|
package/Collisions/gpuPicker.js
CHANGED
|
@@ -15,6 +15,7 @@ export class GPUPicker {
|
|
|
15
15
|
this._idMap = [];
|
|
16
16
|
this._thinIdMap = [];
|
|
17
17
|
this._idColors = [];
|
|
18
|
+
this._meshMaterialMap = new Map();
|
|
18
19
|
this._meshRenderingCount = 0;
|
|
19
20
|
this._attributeName = "instanceMeshID";
|
|
20
21
|
}
|
|
@@ -25,8 +26,8 @@ export class GPUPicker {
|
|
|
25
26
|
this._pickingTexure = new RenderTargetTexture("pickingTexure", { width: width, height: height }, scene, false, undefined, 0, false, 1);
|
|
26
27
|
}
|
|
27
28
|
_createColorMaterial(scene) {
|
|
28
|
-
if (this.
|
|
29
|
-
this.
|
|
29
|
+
if (this._defaultRenderMaterial) {
|
|
30
|
+
this._defaultRenderMaterial.dispose();
|
|
30
31
|
}
|
|
31
32
|
const defines = [];
|
|
32
33
|
const options = {
|
|
@@ -36,18 +37,19 @@ export class GPUPicker {
|
|
|
36
37
|
defines: defines,
|
|
37
38
|
useClipPlane: null,
|
|
38
39
|
};
|
|
39
|
-
this.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
40
|
+
this._defaultRenderMaterial = new ShaderMaterial("pickingShader", scene, "picking", options, false);
|
|
41
|
+
this._defaultRenderMaterial.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);
|
|
42
|
+
}
|
|
43
|
+
_materialBindCallback(mesh) {
|
|
44
|
+
if (!mesh) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const material = this._meshMaterialMap.get(mesh);
|
|
48
|
+
const effect = material.getEffect();
|
|
49
|
+
if (!mesh.hasInstances && !mesh.isAnInstance && !mesh.hasThinInstances) {
|
|
50
|
+
effect.setColor4("meshID", this._idColors[mesh.uniqueId], 1);
|
|
51
|
+
}
|
|
52
|
+
this._meshRenderingCount++;
|
|
51
53
|
}
|
|
52
54
|
_generateColorData(instanceCount, id, index, r, g, b, onInstance) {
|
|
53
55
|
const colorData = new Float32Array(4 * (instanceCount + 1));
|
|
@@ -103,8 +105,13 @@ export class GPUPicker {
|
|
|
103
105
|
if (this._pickingTexure) {
|
|
104
106
|
this._pickingTexure.setMaterialForRendering(mesh, undefined);
|
|
105
107
|
}
|
|
108
|
+
const material = this._meshMaterialMap.get(mesh);
|
|
109
|
+
if (material !== this._defaultRenderMaterial) {
|
|
110
|
+
material.onBindObservable.removeCallback(this._materialBindCallback);
|
|
111
|
+
}
|
|
106
112
|
}
|
|
107
113
|
this._pickableMeshes.length = 0;
|
|
114
|
+
this._meshMaterialMap.clear();
|
|
108
115
|
this._idMap.length = 0;
|
|
109
116
|
this._thinIdMap.length = 0;
|
|
110
117
|
this._idColors.length = 0;
|
|
@@ -115,9 +122,8 @@ export class GPUPicker {
|
|
|
115
122
|
if (!list || list.length === 0) {
|
|
116
123
|
return;
|
|
117
124
|
}
|
|
118
|
-
this._pickableMeshes = list;
|
|
119
125
|
// Prepare target
|
|
120
|
-
const scene = list[0].getScene();
|
|
126
|
+
const scene = ("mesh" in list[0] ? list[0].mesh : list[0]).getScene();
|
|
121
127
|
const engine = scene.getEngine();
|
|
122
128
|
const rttSizeW = engine.getRenderWidth();
|
|
123
129
|
const rttSizeH = engine.getRenderHeight();
|
|
@@ -133,13 +139,28 @@ export class GPUPicker {
|
|
|
133
139
|
if (!this._cachedScene || this._cachedScene !== scene) {
|
|
134
140
|
this._createColorMaterial(scene);
|
|
135
141
|
}
|
|
142
|
+
for (let i = 0; i < list.length; i++) {
|
|
143
|
+
const item = list[i];
|
|
144
|
+
if ("mesh" in item) {
|
|
145
|
+
this._meshMaterialMap.set(item.mesh, item.material);
|
|
146
|
+
list[i] = item.mesh;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
this._meshMaterialMap.set(item, this._defaultRenderMaterial);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
this._pickableMeshes = list;
|
|
136
153
|
this._cachedScene = scene;
|
|
137
154
|
this._pickingTexure.renderList = [];
|
|
138
155
|
// We will affect colors and create vertex color buffers
|
|
139
156
|
let id = 1;
|
|
140
157
|
for (let index = 0; index < this._pickableMeshes.length; index++) {
|
|
141
158
|
const mesh = this._pickableMeshes[index];
|
|
142
|
-
this.
|
|
159
|
+
const material = this._meshMaterialMap.get(mesh);
|
|
160
|
+
if (material !== this._defaultRenderMaterial) {
|
|
161
|
+
material.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);
|
|
162
|
+
}
|
|
163
|
+
this._pickingTexure.setMaterialForRendering(mesh, material);
|
|
143
164
|
this._pickingTexure.renderList.push(mesh);
|
|
144
165
|
if (mesh.isAnInstance) {
|
|
145
166
|
continue; // This will be handled by the source mesh
|
|
@@ -200,7 +221,7 @@ export class GPUPicker {
|
|
|
200
221
|
this._pickingTexure.renderList = [];
|
|
201
222
|
for (let index = 0; index < this._pickableMeshes.length; index++) {
|
|
202
223
|
const mesh = this._pickableMeshes[index];
|
|
203
|
-
this._pickingTexure.setMaterialForRendering(mesh, this.
|
|
224
|
+
this._pickingTexure.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh));
|
|
204
225
|
this._pickingTexure.renderList.push(mesh);
|
|
205
226
|
}
|
|
206
227
|
}
|
|
@@ -289,8 +310,8 @@ export class GPUPicker {
|
|
|
289
310
|
// Cleaning up
|
|
290
311
|
this._pickingTexure?.dispose();
|
|
291
312
|
this._pickingTexure = null;
|
|
292
|
-
this.
|
|
293
|
-
this.
|
|
313
|
+
this._defaultRenderMaterial?.dispose();
|
|
314
|
+
this._defaultRenderMaterial = null;
|
|
294
315
|
}
|
|
295
316
|
}
|
|
296
317
|
//# sourceMappingURL=gpuPicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpuPicker.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/gpuPicker.ts"],"names":[],"mappings":"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","sourcesContent":["import { 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\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\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 { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\nimport \"../Shaders/picking.fragment\";\r\nimport \"../Shaders/picking.vertex\";\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 * Class used to perform a picking operation using GPU\r\n * Please note that GPUPIcker cannot pick instances, only meshes\r\n */\r\nexport class GPUPicker {\r\n private _pickingTexure: Nullable<RenderTargetTexture> = null;\r\n private _idMap: Array<number> = [];\r\n private _thinIdMap: Array<{ meshId: number; thinId: number }> = [];\r\n private _idColors: Array<Color3> = [];\r\n private _cachedScene: Nullable<Scene>;\r\n private _renderMaterial: Nullable<ShaderMaterial>;\r\n private _pickableMeshes: Array<AbstractMesh>;\r\n private _readbuffer: Uint8Array;\r\n private _meshRenderingCount: number = 0;\r\n private readonly _attributeName = \"instanceMeshID\";\r\n\r\n private _createRenderTarget(scene: Scene, width: number, height: number) {\r\n if (this._pickingTexure) {\r\n this._pickingTexure.dispose();\r\n }\r\n this._pickingTexure = new RenderTargetTexture(\r\n \"pickingTexure\",\r\n { width: width, height: height },\r\n scene,\r\n false,\r\n undefined,\r\n Constants.TEXTURETYPE_UNSIGNED_INT,\r\n false,\r\n Constants.TEXTURE_NEAREST_NEAREST\r\n );\r\n }\r\n\r\n private _createColorMaterial(scene: Scene) {\r\n if (this._renderMaterial) {\r\n this._renderMaterial.dispose();\r\n }\r\n\r\n const defines: string[] = [];\r\n const options = {\r\n attributes: [VertexBuffer.PositionKind, this._attributeName, \"bakedVertexAnimationSettingsInstanced\"],\r\n uniforms: [\"world\", \"viewProjection\", \"meshID\"],\r\n needAlphaBlending: false,\r\n defines: defines,\r\n useClipPlane: null,\r\n };\r\n\r\n this._renderMaterial = new ShaderMaterial(\"pickingShader\", scene, \"picking\", options, false);\r\n\r\n const callback = (mesh: AbstractMesh | undefined) => {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const effect = this._renderMaterial!.getEffect();\r\n\r\n if (!mesh.hasInstances && !mesh.isAnInstance && !mesh.hasThinInstances) {\r\n effect.setColor4(\"meshID\", this._idColors[mesh.uniqueId], 1);\r\n }\r\n\r\n this._meshRenderingCount++;\r\n };\r\n\r\n this._renderMaterial.onBindObservable.add(callback);\r\n }\r\n\r\n private _generateColorData(instanceCount: number, id: number, index: number, r: number, g: number, b: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * (instanceCount + 1));\r\n\r\n colorData[0] = r / 255.0;\r\n colorData[1] = g / 255.0;\r\n colorData[2] = b / 255.0;\r\n colorData[3] = 1.0;\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[(i + 1) * 4] = r / 255.0;\r\n colorData[(i + 1) * 4 + 1] = g / 255.0;\r\n colorData[(i + 1) * 4 + 2] = b / 255.0;\r\n colorData[(i + 1) * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\r\n }\r\n\r\n private _generateThinInstanceColorData(instanceCount: number, id: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * instanceCount);\r\n\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[i * 4] = r / 255.0;\r\n colorData[i * 4 + 1] = g / 255.0;\r\n colorData[i * 4 + 2] = b / 255.0;\r\n colorData[i * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\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>>) {\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 if (mesh.hasInstances) {\r\n (mesh as Mesh).removeVerticesData(this._attributeName);\r\n }\r\n if (mesh.hasThinInstances) {\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, null);\r\n }\r\n if (this._pickingTexure) {\r\n this._pickingTexure.setMaterialForRendering(mesh, undefined);\r\n }\r\n }\r\n this._pickableMeshes.length = 0;\r\n this._idMap.length = 0;\r\n this._thinIdMap.length = 0;\r\n this._idColors.length = 0;\r\n if (this._pickingTexure) {\r\n this._pickingTexure.renderList = [];\r\n }\r\n }\r\n if (!list || list.length === 0) {\r\n return;\r\n }\r\n this._pickableMeshes = list;\r\n\r\n // Prepare target\r\n const scene = 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._pickingTexure) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n } else {\r\n const size = this._pickingTexure.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 if (!this._cachedScene || this._cachedScene !== scene) {\r\n this._createColorMaterial(scene);\r\n }\r\n\r\n this._cachedScene = scene;\r\n this._pickingTexure!.renderList = [];\r\n\r\n // We will affect colors and create vertex color buffers\r\n let id = 1;\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n this._pickingTexure!.setMaterialForRendering(mesh, this._renderMaterial!);\r\n this._pickingTexure!.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 r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n\r\n if (mesh.hasThinInstances) {\r\n const colorData = this._generateThinInstanceColorData((mesh as Mesh).thinInstanceCount, id, (i, id) => {\r\n this._thinIdMap[id] = { meshId: index, thinId: i };\r\n });\r\n id += (mesh as Mesh).thinInstanceCount;\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, colorData, 4);\r\n } else {\r\n this._idMap[id] = index;\r\n id++;\r\n\r\n if (mesh.hasInstances) {\r\n const instances = (mesh as Mesh).instances;\r\n const colorData = this._generateColorData(instances.length, id, index, r, g, b, (i, id) => {\r\n const instance = instances[i];\r\n this._idMap[id] = this._pickableMeshes.indexOf(instance);\r\n });\r\n id += instances.length;\r\n const engine = mesh.getEngine();\r\n\r\n const buffer = new VertexBuffer(engine, colorData, this._attributeName, false, false, 4, true);\r\n (mesh as Mesh).setVerticesBuffer(buffer, true);\r\n } else {\r\n this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);\r\n }\r\n }\r\n }\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 pickAsync(x: number, y: number, disposeWhenDone = false): Promise<Nullable<IGPUPickingInfo>> {\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n const scene = this._cachedScene!;\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n const devicePixelRatio = 1 / engine._hardwareScalingLevel;\r\n\r\n if (!this._readbuffer) {\r\n this._readbuffer = new Uint8Array(engine.isWebGPU ? 256 : 4); // Because of block alignment in WebGPU\r\n }\r\n\r\n // Do we need to rebuild the RTT?\r\n const size = this._pickingTexure!.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n\r\n this._pickingTexure!.renderList = [];\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n this._pickingTexure!.setMaterialForRendering(mesh, this._renderMaterial!);\r\n this._pickingTexure!.renderList.push(mesh);\r\n }\r\n }\r\n\r\n this._meshRenderingCount = 0;\r\n // Ensure ints and adapt to screen resolution\r\n x = (devicePixelRatio * x) >> 0;\r\n y = (devicePixelRatio * y) >> 0;\r\n\r\n if (x < 0 || y < 0 || x >= rttSizeW || y >= rttSizeH) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n // Invert Y\r\n y = rttSizeH - y;\r\n\r\n this._pickingTexure!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n scene.customRenderTargets.push(this._pickingTexure!);\r\n this._pickingTexure!.onBeforeRender = () => {\r\n // Enable scissor\r\n if ((engine as WebGPUEngine | Engine).enableScissor) {\r\n (engine as WebGPUEngine | Engine).enableScissor(x, y, 1, 1);\r\n }\r\n };\r\n\r\n return new Promise((resolve, reject) => {\r\n this._pickingTexure!.onAfterRender = async () => {\r\n // Disable scissor\r\n if ((engine as WebGPUEngine | Engine).disableScissor) {\r\n (engine as WebGPUEngine | Engine).disableScissor();\r\n }\r\n\r\n if (!this._pickingTexure) {\r\n reject();\r\n }\r\n\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined = undefined;\r\n const wasSuccessfull = this._meshRenderingCount > 0;\r\n\r\n if (wasSuccessfull) {\r\n // Remove from the active RTTs\r\n const index = scene.customRenderTargets.indexOf(this._pickingTexure!);\r\n if (index > -1) {\r\n scene.customRenderTargets.splice(index, 1);\r\n }\r\n\r\n // Do the actual picking\r\n if (await this._readTexturePixelsAsync(x, y)) {\r\n const r = this._readbuffer[0];\r\n const g = this._readbuffer[1];\r\n const b = this._readbuffer[2];\r\n const colorId = (r << 16) + (g << 8) + b;\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\r\n // Clean-up\r\n if (!wasSuccessfull) {\r\n this._meshRenderingCount = 0;\r\n return; // We need to wait for the shaders to be ready\r\n } else {\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\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 private async _readTexturePixelsAsync(x: number, y: number) {\r\n if (!this._cachedScene || !this._pickingTexure?._texture) {\r\n return false;\r\n }\r\n const engine = this._cachedScene.getEngine();\r\n await engine._readTexturePixels(this._pickingTexure._texture, 1, 1, -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() {\r\n this.setPickingList(null);\r\n this._cachedScene = null;\r\n\r\n // Cleaning up\r\n this._pickingTexure?.dispose();\r\n this._pickingTexure = null;\r\n this._renderMaterial?.dispose();\r\n this._renderMaterial = 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 { 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\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\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 { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\nimport \"../Shaders/picking.fragment\";\r\nimport \"../Shaders/picking.vertex\";\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 * Class used to perform a picking operation using GPU\r\n * Please note that GPUPIcker cannot pick instances, only meshes\r\n */\r\nexport class GPUPicker {\r\n private _pickingTexure: Nullable<RenderTargetTexture> = null;\r\n private _idMap: Array<number> = [];\r\n private _thinIdMap: Array<{ meshId: number; thinId: number }> = [];\r\n private _idColors: Array<Color3> = [];\r\n private _cachedScene: Nullable<Scene>;\r\n private _defaultRenderMaterial: Nullable<ShaderMaterial>;\r\n private _pickableMeshes: Array<AbstractMesh>;\r\n private _meshMaterialMap: Map<AbstractMesh, ShaderMaterial> = new Map();\r\n private _readbuffer: Uint8Array;\r\n private _meshRenderingCount: number = 0;\r\n private readonly _attributeName = \"instanceMeshID\";\r\n\r\n private _createRenderTarget(scene: Scene, width: number, height: number) {\r\n if (this._pickingTexure) {\r\n this._pickingTexure.dispose();\r\n }\r\n this._pickingTexure = new RenderTargetTexture(\r\n \"pickingTexure\",\r\n { width: width, height: height },\r\n scene,\r\n false,\r\n undefined,\r\n Constants.TEXTURETYPE_UNSIGNED_INT,\r\n false,\r\n Constants.TEXTURE_NEAREST_NEAREST\r\n );\r\n }\r\n\r\n private _createColorMaterial(scene: Scene) {\r\n if (this._defaultRenderMaterial) {\r\n this._defaultRenderMaterial.dispose();\r\n }\r\n\r\n const defines: string[] = [];\r\n const options = {\r\n attributes: [VertexBuffer.PositionKind, this._attributeName, \"bakedVertexAnimationSettingsInstanced\"],\r\n uniforms: [\"world\", \"viewProjection\", \"meshID\"],\r\n needAlphaBlending: false,\r\n defines: defines,\r\n useClipPlane: null,\r\n };\r\n\r\n this._defaultRenderMaterial = new ShaderMaterial(\"pickingShader\", scene, \"picking\", options, false);\r\n\r\n this._defaultRenderMaterial.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n }\r\n\r\n private _materialBindCallback(mesh: AbstractMesh | undefined) {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n const effect = material.getEffect()!;\r\n\r\n if (!mesh.hasInstances && !mesh.isAnInstance && !mesh.hasThinInstances) {\r\n effect.setColor4(\"meshID\", this._idColors[mesh.uniqueId], 1);\r\n }\r\n\r\n this._meshRenderingCount++;\r\n }\r\n\r\n private _generateColorData(instanceCount: number, id: number, index: number, r: number, g: number, b: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * (instanceCount + 1));\r\n\r\n colorData[0] = r / 255.0;\r\n colorData[1] = g / 255.0;\r\n colorData[2] = b / 255.0;\r\n colorData[3] = 1.0;\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[(i + 1) * 4] = r / 255.0;\r\n colorData[(i + 1) * 4 + 1] = g / 255.0;\r\n colorData[(i + 1) * 4 + 2] = b / 255.0;\r\n colorData[(i + 1) * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\r\n }\r\n\r\n private _generateThinInstanceColorData(instanceCount: number, id: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * instanceCount);\r\n\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[i * 4] = r / 255.0;\r\n colorData[i * 4 + 1] = g / 255.0;\r\n colorData[i * 4 + 2] = b / 255.0;\r\n colorData[i * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\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 }>>) {\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 if (mesh.hasInstances) {\r\n (mesh as Mesh).removeVerticesData(this._attributeName);\r\n }\r\n if (mesh.hasThinInstances) {\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, null);\r\n }\r\n if (this._pickingTexure) {\r\n this._pickingTexure.setMaterialForRendering(mesh, undefined);\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n if (material !== this._defaultRenderMaterial) {\r\n material.onBindObservable.removeCallback(this._materialBindCallback);\r\n }\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._idColors.length = 0;\r\n if (this._pickingTexure) {\r\n this._pickingTexure.renderList = [];\r\n }\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 const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n if (!this._pickingTexure) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n } else {\r\n const size = this._pickingTexure.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 if (!this._cachedScene || this._cachedScene !== scene) {\r\n this._createColorMaterial(scene);\r\n }\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 list[i] = item.mesh;\r\n } else {\r\n this._meshMaterialMap.set(item, this._defaultRenderMaterial!);\r\n }\r\n }\r\n this._pickableMeshes = list as Array<AbstractMesh>;\r\n\r\n this._cachedScene = scene;\r\n this._pickingTexure!.renderList = [];\r\n\r\n // We will affect colors and create vertex color buffers\r\n let id = 1;\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n\r\n if (material !== this._defaultRenderMaterial) {\r\n material.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n }\r\n this._pickingTexure!.setMaterialForRendering(mesh, material);\r\n this._pickingTexure!.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 r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n\r\n if (mesh.hasThinInstances) {\r\n const colorData = this._generateThinInstanceColorData((mesh as Mesh).thinInstanceCount, id, (i, id) => {\r\n this._thinIdMap[id] = { meshId: index, thinId: i };\r\n });\r\n id += (mesh as Mesh).thinInstanceCount;\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, colorData, 4);\r\n } else {\r\n this._idMap[id] = index;\r\n id++;\r\n\r\n if (mesh.hasInstances) {\r\n const instances = (mesh as Mesh).instances;\r\n const colorData = this._generateColorData(instances.length, id, index, r, g, b, (i, id) => {\r\n const instance = instances[i];\r\n this._idMap[id] = this._pickableMeshes.indexOf(instance);\r\n });\r\n id += instances.length;\r\n const engine = mesh.getEngine();\r\n\r\n const buffer = new VertexBuffer(engine, colorData, this._attributeName, false, false, 4, true);\r\n (mesh as Mesh).setVerticesBuffer(buffer, true);\r\n } else {\r\n this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);\r\n }\r\n }\r\n }\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 pickAsync(x: number, y: number, disposeWhenDone = false): Promise<Nullable<IGPUPickingInfo>> {\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n const scene = this._cachedScene!;\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n const devicePixelRatio = 1 / engine._hardwareScalingLevel;\r\n\r\n if (!this._readbuffer) {\r\n this._readbuffer = new Uint8Array(engine.isWebGPU ? 256 : 4); // Because of block alignment in WebGPU\r\n }\r\n\r\n // Do we need to rebuild the RTT?\r\n const size = this._pickingTexure!.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n\r\n this._pickingTexure!.renderList = [];\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n this._pickingTexure!.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh)!);\r\n this._pickingTexure!.renderList.push(mesh);\r\n }\r\n }\r\n\r\n this._meshRenderingCount = 0;\r\n // Ensure ints and adapt to screen resolution\r\n x = (devicePixelRatio * x) >> 0;\r\n y = (devicePixelRatio * y) >> 0;\r\n\r\n if (x < 0 || y < 0 || x >= rttSizeW || y >= rttSizeH) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n // Invert Y\r\n y = rttSizeH - y;\r\n\r\n this._pickingTexure!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n scene.customRenderTargets.push(this._pickingTexure!);\r\n this._pickingTexure!.onBeforeRender = () => {\r\n // Enable scissor\r\n if ((engine as WebGPUEngine | Engine).enableScissor) {\r\n (engine as WebGPUEngine | Engine).enableScissor(x, y, 1, 1);\r\n }\r\n };\r\n\r\n return new Promise((resolve, reject) => {\r\n this._pickingTexure!.onAfterRender = async () => {\r\n // Disable scissor\r\n if ((engine as WebGPUEngine | Engine).disableScissor) {\r\n (engine as WebGPUEngine | Engine).disableScissor();\r\n }\r\n\r\n if (!this._pickingTexure) {\r\n reject();\r\n }\r\n\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined = undefined;\r\n const wasSuccessfull = this._meshRenderingCount > 0;\r\n\r\n if (wasSuccessfull) {\r\n // Remove from the active RTTs\r\n const index = scene.customRenderTargets.indexOf(this._pickingTexure!);\r\n if (index > -1) {\r\n scene.customRenderTargets.splice(index, 1);\r\n }\r\n\r\n // Do the actual picking\r\n if (await this._readTexturePixelsAsync(x, y)) {\r\n const r = this._readbuffer[0];\r\n const g = this._readbuffer[1];\r\n const b = this._readbuffer[2];\r\n const colorId = (r << 16) + (g << 8) + b;\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\r\n // Clean-up\r\n if (!wasSuccessfull) {\r\n this._meshRenderingCount = 0;\r\n return; // We need to wait for the shaders to be ready\r\n } else {\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\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 private async _readTexturePixelsAsync(x: number, y: number) {\r\n if (!this._cachedScene || !this._pickingTexure?._texture) {\r\n return false;\r\n }\r\n const engine = this._cachedScene.getEngine();\r\n await engine._readTexturePixels(this._pickingTexure._texture, 1, 1, -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() {\r\n this.setPickingList(null);\r\n this._cachedScene = null;\r\n\r\n // Cleaning up\r\n this._pickingTexure?.dispose();\r\n this._pickingTexure = null;\r\n this._defaultRenderMaterial?.dispose();\r\n this._defaultRenderMaterial = null;\r\n }\r\n}\r\n"]}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defines if the system should use OpenGL convention for UVs when creating geometry or loading .babylon files (false by default)
|
|
3
|
+
*/
|
|
4
|
+
export declare let useOpenGLOrientationForUV: boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Sets whether to use OpenGL convention for UVs
|
|
7
|
+
* @param value the new value
|
|
8
|
+
*/
|
|
9
|
+
export declare function setOpenGLOrientationForUV(value: boolean): void;
|
|
1
10
|
/**
|
|
2
11
|
* Options used to control default behaviors regarding compatibility support
|
|
12
|
+
* @deprecated please use named exports
|
|
3
13
|
*/
|
|
4
|
-
export declare
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*/
|
|
8
|
-
static UseOpenGLOrientationForUV: boolean;
|
|
9
|
-
}
|
|
14
|
+
export declare const CompatibilityOptions: {
|
|
15
|
+
UseOpenGLOrientationForUV: boolean;
|
|
16
|
+
};
|
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Defines if the system should use OpenGL convention for UVs when creating geometry or loading .babylon files (false by default)
|
|
3
|
+
*/
|
|
4
|
+
export let useOpenGLOrientationForUV = false;
|
|
5
|
+
/**
|
|
6
|
+
* Sets whether to use OpenGL convention for UVs
|
|
7
|
+
* @param value the new value
|
|
3
8
|
*/
|
|
4
|
-
export
|
|
9
|
+
export function setOpenGLOrientationForUV(value) {
|
|
10
|
+
useOpenGLOrientationForUV = value;
|
|
5
11
|
}
|
|
6
12
|
/**
|
|
7
|
-
*
|
|
13
|
+
* Options used to control default behaviors regarding compatibility support
|
|
14
|
+
* @deprecated please use named exports
|
|
8
15
|
*/
|
|
9
|
-
CompatibilityOptions
|
|
16
|
+
export const CompatibilityOptions = {
|
|
17
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
18
|
+
get UseOpenGLOrientationForUV() {
|
|
19
|
+
return useOpenGLOrientationForUV;
|
|
20
|
+
},
|
|
21
|
+
set UseOpenGLOrientationForUV(value) {
|
|
22
|
+
useOpenGLOrientationForUV = value;
|
|
23
|
+
},
|
|
24
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
25
|
+
};
|
|
10
26
|
//# sourceMappingURL=compatibilityOptions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compatibilityOptions.js","sourceRoot":"","sources":["../../../../dev/core/src/Compat/compatibilityOptions.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"compatibilityOptions.js","sourceRoot":"","sources":["../../../../dev/core/src/Compat/compatibilityOptions.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,IAAI,yBAAyB,GAAG,KAAK,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACpD,yBAAyB,GAAG,KAAK,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAChC,yDAAyD;IACzD,IAAI,yBAAyB;QACzB,OAAO,yBAAyB,CAAC;IACrC,CAAC;IACD,IAAI,yBAAyB,CAAC,KAAK;QAC/B,yBAAyB,GAAG,KAAK,CAAC;IACtC,CAAC;IACD,wDAAwD;CAC3D,CAAC","sourcesContent":["/**\r\n * Defines if the system should use OpenGL convention for UVs when creating geometry or loading .babylon files (false by default)\r\n */\r\nexport let useOpenGLOrientationForUV = false;\r\n\r\n/**\r\n * Sets whether to use OpenGL convention for UVs\r\n * @param value the new value\r\n */\r\nexport function setOpenGLOrientationForUV(value: boolean) {\r\n useOpenGLOrientationForUV = value;\r\n}\r\n\r\n/**\r\n * Options used to control default behaviors regarding compatibility support\r\n * @deprecated please use named exports\r\n */\r\nexport const CompatibilityOptions = {\r\n /* eslint-disable @typescript-eslint/naming-convention */\r\n get UseOpenGLOrientationForUV() {\r\n return useOpenGLOrientationForUV;\r\n },\r\n set UseOpenGLOrientationForUV(value) {\r\n useOpenGLOrientationForUV = value;\r\n },\r\n /* eslint-enable @typescript-eslint/naming-convention */\r\n};\r\n"]}
|
package/Compat/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { CompatibilityOptions } from "./compatibilityOptions";
|
package/Compat/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { CompatibilityOptions } from "./compatibilityOptions.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/Compat/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Compat/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Compat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["export { CompatibilityOptions } from \"./compatibilityOptions\";\r\n"]}
|
package/Culling/boundingBox.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BuildArray } from "../Misc/arrayTools.js";
|
|
2
2
|
import { Matrix, Vector3 } from "../Maths/math.vector.js";
|
|
3
3
|
import { Epsilon } from "../Maths/math.constants.js";
|
|
4
4
|
/**
|
|
@@ -15,7 +15,7 @@ export class BoundingBox {
|
|
|
15
15
|
/**
|
|
16
16
|
* Gets the 8 vectors representing the bounding box in local space
|
|
17
17
|
*/
|
|
18
|
-
this.vectors =
|
|
18
|
+
this.vectors = BuildArray(8, Vector3.Zero);
|
|
19
19
|
/**
|
|
20
20
|
* Gets the center of the bounding box in local space
|
|
21
21
|
*/
|
|
@@ -35,11 +35,11 @@ export class BoundingBox {
|
|
|
35
35
|
/**
|
|
36
36
|
* Gets the OBB (object bounding box) directions
|
|
37
37
|
*/
|
|
38
|
-
this.directions =
|
|
38
|
+
this.directions = BuildArray(3, Vector3.Zero);
|
|
39
39
|
/**
|
|
40
40
|
* Gets the 8 vectors representing the bounding box in world space
|
|
41
41
|
*/
|
|
42
|
-
this.vectorsWorld =
|
|
42
|
+
this.vectorsWorld = BuildArray(8, Vector3.Zero);
|
|
43
43
|
/**
|
|
44
44
|
* Gets the minimum vector in world space
|
|
45
45
|
*/
|
|
@@ -288,5 +288,5 @@ export class BoundingBox {
|
|
|
288
288
|
return true;
|
|
289
289
|
}
|
|
290
290
|
}
|
|
291
|
-
BoundingBox._TmpVector3 =
|
|
291
|
+
BoundingBox._TmpVector3 = BuildArray(3, Vector3.Zero);
|
|
292
292
|
//# sourceMappingURL=boundingBox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundingBox.js","sourceRoot":"","sources":["../../../../dev/core/src/Culling/boundingBox.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DeepImmutable, Nullable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { BoundingSphere } from \"../Culling/boundingSphere\";\r\n\r\nimport type { ICullable } from \"./boundingInfo\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\n/**\r\n * Class used to store bounding box information\r\n */\r\nexport class BoundingBox implements ICullable {\r\n /**\r\n * Gets the 8 vectors representing the bounding box in local space\r\n */\r\n public readonly vectors: Vector3[] = ArrayTools.BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the center of the bounding box in local space\r\n */\r\n public readonly center: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the center of the bounding box in world space\r\n */\r\n public readonly centerWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets half the size of the extent in local space. Multiply by 2 to obtain the full size of the box!\r\n */\r\n public readonly extendSize: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets half the size of the extent in world space. Multiply by 2 to obtain the full size of the box!\r\n */\r\n public readonly extendSizeWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the OBB (object bounding box) directions\r\n */\r\n public readonly directions: Vector3[] = ArrayTools.BuildArray(3, Vector3.Zero);\r\n /**\r\n * Gets the 8 vectors representing the bounding box in world space\r\n */\r\n public readonly vectorsWorld: Vector3[] = ArrayTools.BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the minimum vector in world space\r\n */\r\n public readonly minimumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in world space\r\n */\r\n public readonly maximumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the minimum vector in local space\r\n */\r\n public readonly minimum: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in local space\r\n */\r\n public readonly maximum: Vector3 = Vector3.Zero();\r\n\r\n private _worldMatrix: DeepImmutable<Matrix>;\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero);\r\n\r\n /**\r\n * @internal\r\n */\r\n public _tag: number;\r\n\r\n /** @internal */\r\n public _drawWrapperFront: Nullable<DrawWrapper> = null;\r\n /** @internal */\r\n public _drawWrapperBack: Nullable<DrawWrapper> = null;\r\n\r\n /**\r\n * Creates a new bounding box\r\n * @param min defines the minimum vector (in local space)\r\n * @param max defines the maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n constructor(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>) {\r\n this.reConstruct(min, max, worldMatrix);\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Recreates the entire bounding box from scratch as if we call the constructor in place\r\n * @param min defines the new minimum vector (in local space)\r\n * @param max defines the new maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n public reConstruct(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>) {\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n const vectors = this.vectors;\r\n\r\n this.minimum.copyFromFloats(minX, minY, minZ);\r\n this.maximum.copyFromFloats(maxX, maxY, maxZ);\r\n vectors[0].copyFromFloats(minX, minY, minZ);\r\n vectors[1].copyFromFloats(maxX, maxY, maxZ);\r\n vectors[2].copyFromFloats(maxX, minY, minZ);\r\n vectors[3].copyFromFloats(minX, maxY, minZ);\r\n vectors[4].copyFromFloats(minX, minY, maxZ);\r\n vectors[5].copyFromFloats(maxX, maxY, minZ);\r\n vectors[6].copyFromFloats(minX, maxY, maxZ);\r\n vectors[7].copyFromFloats(maxX, minY, maxZ);\r\n\r\n // OBB\r\n max.addToRef(min, this.center).scaleInPlace(0.5);\r\n max.subtractToRef(min, this.extendSize).scaleInPlace(0.5);\r\n\r\n this._worldMatrix = worldMatrix || Matrix.IdentityReadOnly;\r\n\r\n this._update(this._worldMatrix);\r\n }\r\n\r\n /**\r\n * Scale the current bounding box by applying a scale factor\r\n * @param factor defines the scale factor to apply\r\n * @returns the current bounding box\r\n */\r\n public scale(factor: number): BoundingBox {\r\n const tmpVectors = BoundingBox._TmpVector3;\r\n const diff = this.maximum.subtractToRef(this.minimum, tmpVectors[0]);\r\n const len = diff.length();\r\n diff.normalizeFromLength(len);\r\n const distance = len * factor;\r\n const newRadius = diff.scaleInPlace(distance * 0.5);\r\n\r\n const min = this.center.subtractToRef(newRadius, tmpVectors[1]);\r\n const max = this.center.addToRef(newRadius, tmpVectors[2]);\r\n\r\n this.reConstruct(min, max, this._worldMatrix);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the world matrix of the bounding box\r\n * @returns a matrix\r\n */\r\n public getWorldMatrix(): DeepImmutable<Matrix> {\r\n return this._worldMatrix;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _update(world: DeepImmutable<Matrix>): void {\r\n const minWorld = this.minimumWorld;\r\n const maxWorld = this.maximumWorld;\r\n const directions = this.directions;\r\n const vectorsWorld = this.vectorsWorld;\r\n const vectors = this.vectors;\r\n\r\n if (!world.isIdentity()) {\r\n minWorld.setAll(Number.MAX_VALUE);\r\n maxWorld.setAll(-Number.MAX_VALUE);\r\n\r\n for (let index = 0; index < 8; ++index) {\r\n const v = vectorsWorld[index];\r\n Vector3.TransformCoordinatesToRef(vectors[index], world, v);\r\n minWorld.minimizeInPlace(v);\r\n maxWorld.maximizeInPlace(v);\r\n }\r\n\r\n // Extend\r\n maxWorld.subtractToRef(minWorld, this.extendSizeWorld).scaleInPlace(0.5);\r\n maxWorld.addToRef(minWorld, this.centerWorld).scaleInPlace(0.5);\r\n } else {\r\n minWorld.copyFrom(this.minimum);\r\n maxWorld.copyFrom(this.maximum);\r\n for (let index = 0; index < 8; ++index) {\r\n vectorsWorld[index].copyFrom(vectors[index]);\r\n }\r\n\r\n // Extend\r\n this.extendSizeWorld.copyFrom(this.extendSize);\r\n this.centerWorld.copyFrom(this.center);\r\n }\r\n\r\n Vector3.FromArrayToRef(world.m, 0, directions[0]);\r\n Vector3.FromArrayToRef(world.m, 4, directions[1]);\r\n Vector3.FromArrayToRef(world.m, 8, directions[2]);\r\n\r\n this._worldMatrix = world;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is intersecting the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public isInFrustum(frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n return BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is entirely inside the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an inclusion\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n return BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if a point is inside the bounding box\r\n * @param point defines the point to test\r\n * @returns true if the point is inside the bounding box\r\n */\r\n public intersectsPoint(point: DeepImmutable<Vector3>): boolean {\r\n const min = this.minimumWorld;\r\n const max = this.maximumWorld;\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n const pointX = point.x,\r\n pointY = point.y,\r\n pointZ = point.z;\r\n const delta = -Epsilon;\r\n\r\n if (maxX - pointX < delta || delta > pointX - minX) {\r\n return false;\r\n }\r\n\r\n if (maxY - pointY < delta || delta > pointY - minY) {\r\n return false;\r\n }\r\n\r\n if (maxZ - pointZ < delta || delta > pointZ - minZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a bounding sphere\r\n * @param sphere defines the sphere to test\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsSphere(sphere: DeepImmutable<BoundingSphere>): boolean {\r\n return BoundingBox.IntersectsSphere(this.minimumWorld, this.maximumWorld, sphere.centerWorld, sphere.radiusWorld);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a box defined by a min and max vectors\r\n * @param min defines the min vector to use\r\n * @param max defines the max vector to use\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsMinMax(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>): boolean {\r\n const myMin = this.minimumWorld;\r\n const myMax = this.maximumWorld;\r\n const myMinX = myMin.x,\r\n myMinY = myMin.y,\r\n myMinZ = myMin.z,\r\n myMaxX = myMax.x,\r\n myMaxY = myMax.y,\r\n myMaxZ = myMax.z;\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n if (myMaxX < minX || myMinX > maxX) {\r\n return false;\r\n }\r\n\r\n if (myMaxY < minY || myMinY > maxY) {\r\n return false;\r\n }\r\n\r\n if (myMaxZ < minZ || myMinZ > maxZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Disposes the resources of the class\r\n */\r\n public dispose(): void {\r\n this._drawWrapperFront?.dispose();\r\n this._drawWrapperBack?.dispose();\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Tests if two bounding boxes are intersections\r\n * @param box0 defines the first box to test\r\n * @param box1 defines the second box to test\r\n * @returns true if there is an intersection\r\n */\r\n public static Intersects(box0: DeepImmutable<BoundingBox>, box1: DeepImmutable<BoundingBox>): boolean {\r\n return box0.intersectsMinMax(box1.minimumWorld, box1.maximumWorld);\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defines by a min/max vectors intersects a sphere\r\n * @param minPoint defines the minimum vector of the bounding box\r\n * @param maxPoint defines the maximum vector of the bounding box\r\n * @param sphereCenter defines the sphere center\r\n * @param sphereRadius defines the sphere radius\r\n * @returns true if there is an intersection\r\n */\r\n public static IntersectsSphere(minPoint: DeepImmutable<Vector3>, maxPoint: DeepImmutable<Vector3>, sphereCenter: DeepImmutable<Vector3>, sphereRadius: number): boolean {\r\n const vector = BoundingBox._TmpVector3[0];\r\n Vector3.ClampToRef(sphereCenter, minPoint, maxPoint, vector);\r\n const num = Vector3.DistanceSquared(sphereCenter, vector);\r\n return num <= sphereRadius * sphereRadius;\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors is entirely inside frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an inclusion\r\n */\r\n public static IsCompletelyInFrustum(boundingVectors: Array<DeepImmutable<Vector3>>, frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n for (let p = 0; p < 6; ++p) {\r\n const frustumPlane = frustumPlanes[p];\r\n for (let i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) < 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors intersects frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public static IsInFrustum(boundingVectors: Array<DeepImmutable<Vector3>>, frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n for (let p = 0; p < 6; ++p) {\r\n let canReturnFalse = true;\r\n const frustumPlane = frustumPlanes[p];\r\n for (let i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) >= 0) {\r\n canReturnFalse = false;\r\n break;\r\n }\r\n }\r\n if (canReturnFalse) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"boundingBox.js","sourceRoot":"","sources":["../../../../dev/core/src/Culling/boundingBox.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DeepImmutable, Nullable } from \"../types\";\r\nimport { BuildArray } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { BoundingSphere } from \"../Culling/boundingSphere\";\r\n\r\nimport type { ICullable } from \"./boundingInfo\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\n/**\r\n * Class used to store bounding box information\r\n */\r\nexport class BoundingBox implements ICullable {\r\n /**\r\n * Gets the 8 vectors representing the bounding box in local space\r\n */\r\n public readonly vectors: Vector3[] = BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the center of the bounding box in local space\r\n */\r\n public readonly center: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the center of the bounding box in world space\r\n */\r\n public readonly centerWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets half the size of the extent in local space. Multiply by 2 to obtain the full size of the box!\r\n */\r\n public readonly extendSize: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets half the size of the extent in world space. Multiply by 2 to obtain the full size of the box!\r\n */\r\n public readonly extendSizeWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the OBB (object bounding box) directions\r\n */\r\n public readonly directions: Vector3[] = BuildArray(3, Vector3.Zero);\r\n /**\r\n * Gets the 8 vectors representing the bounding box in world space\r\n */\r\n public readonly vectorsWorld: Vector3[] = BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the minimum vector in world space\r\n */\r\n public readonly minimumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in world space\r\n */\r\n public readonly maximumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the minimum vector in local space\r\n */\r\n public readonly minimum: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in local space\r\n */\r\n public readonly maximum: Vector3 = Vector3.Zero();\r\n\r\n private _worldMatrix: DeepImmutable<Matrix>;\r\n private static readonly _TmpVector3 = BuildArray(3, Vector3.Zero);\r\n\r\n /**\r\n * @internal\r\n */\r\n public _tag: number;\r\n\r\n /** @internal */\r\n public _drawWrapperFront: Nullable<DrawWrapper> = null;\r\n /** @internal */\r\n public _drawWrapperBack: Nullable<DrawWrapper> = null;\r\n\r\n /**\r\n * Creates a new bounding box\r\n * @param min defines the minimum vector (in local space)\r\n * @param max defines the maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n constructor(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>) {\r\n this.reConstruct(min, max, worldMatrix);\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Recreates the entire bounding box from scratch as if we call the constructor in place\r\n * @param min defines the new minimum vector (in local space)\r\n * @param max defines the new maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n public reConstruct(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>) {\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n const vectors = this.vectors;\r\n\r\n this.minimum.copyFromFloats(minX, minY, minZ);\r\n this.maximum.copyFromFloats(maxX, maxY, maxZ);\r\n vectors[0].copyFromFloats(minX, minY, minZ);\r\n vectors[1].copyFromFloats(maxX, maxY, maxZ);\r\n vectors[2].copyFromFloats(maxX, minY, minZ);\r\n vectors[3].copyFromFloats(minX, maxY, minZ);\r\n vectors[4].copyFromFloats(minX, minY, maxZ);\r\n vectors[5].copyFromFloats(maxX, maxY, minZ);\r\n vectors[6].copyFromFloats(minX, maxY, maxZ);\r\n vectors[7].copyFromFloats(maxX, minY, maxZ);\r\n\r\n // OBB\r\n max.addToRef(min, this.center).scaleInPlace(0.5);\r\n max.subtractToRef(min, this.extendSize).scaleInPlace(0.5);\r\n\r\n this._worldMatrix = worldMatrix || Matrix.IdentityReadOnly;\r\n\r\n this._update(this._worldMatrix);\r\n }\r\n\r\n /**\r\n * Scale the current bounding box by applying a scale factor\r\n * @param factor defines the scale factor to apply\r\n * @returns the current bounding box\r\n */\r\n public scale(factor: number): BoundingBox {\r\n const tmpVectors = BoundingBox._TmpVector3;\r\n const diff = this.maximum.subtractToRef(this.minimum, tmpVectors[0]);\r\n const len = diff.length();\r\n diff.normalizeFromLength(len);\r\n const distance = len * factor;\r\n const newRadius = diff.scaleInPlace(distance * 0.5);\r\n\r\n const min = this.center.subtractToRef(newRadius, tmpVectors[1]);\r\n const max = this.center.addToRef(newRadius, tmpVectors[2]);\r\n\r\n this.reConstruct(min, max, this._worldMatrix);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the world matrix of the bounding box\r\n * @returns a matrix\r\n */\r\n public getWorldMatrix(): DeepImmutable<Matrix> {\r\n return this._worldMatrix;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _update(world: DeepImmutable<Matrix>): void {\r\n const minWorld = this.minimumWorld;\r\n const maxWorld = this.maximumWorld;\r\n const directions = this.directions;\r\n const vectorsWorld = this.vectorsWorld;\r\n const vectors = this.vectors;\r\n\r\n if (!world.isIdentity()) {\r\n minWorld.setAll(Number.MAX_VALUE);\r\n maxWorld.setAll(-Number.MAX_VALUE);\r\n\r\n for (let index = 0; index < 8; ++index) {\r\n const v = vectorsWorld[index];\r\n Vector3.TransformCoordinatesToRef(vectors[index], world, v);\r\n minWorld.minimizeInPlace(v);\r\n maxWorld.maximizeInPlace(v);\r\n }\r\n\r\n // Extend\r\n maxWorld.subtractToRef(minWorld, this.extendSizeWorld).scaleInPlace(0.5);\r\n maxWorld.addToRef(minWorld, this.centerWorld).scaleInPlace(0.5);\r\n } else {\r\n minWorld.copyFrom(this.minimum);\r\n maxWorld.copyFrom(this.maximum);\r\n for (let index = 0; index < 8; ++index) {\r\n vectorsWorld[index].copyFrom(vectors[index]);\r\n }\r\n\r\n // Extend\r\n this.extendSizeWorld.copyFrom(this.extendSize);\r\n this.centerWorld.copyFrom(this.center);\r\n }\r\n\r\n Vector3.FromArrayToRef(world.m, 0, directions[0]);\r\n Vector3.FromArrayToRef(world.m, 4, directions[1]);\r\n Vector3.FromArrayToRef(world.m, 8, directions[2]);\r\n\r\n this._worldMatrix = world;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is intersecting the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public isInFrustum(frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n return BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is entirely inside the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an inclusion\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n return BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if a point is inside the bounding box\r\n * @param point defines the point to test\r\n * @returns true if the point is inside the bounding box\r\n */\r\n public intersectsPoint(point: DeepImmutable<Vector3>): boolean {\r\n const min = this.minimumWorld;\r\n const max = this.maximumWorld;\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n const pointX = point.x,\r\n pointY = point.y,\r\n pointZ = point.z;\r\n const delta = -Epsilon;\r\n\r\n if (maxX - pointX < delta || delta > pointX - minX) {\r\n return false;\r\n }\r\n\r\n if (maxY - pointY < delta || delta > pointY - minY) {\r\n return false;\r\n }\r\n\r\n if (maxZ - pointZ < delta || delta > pointZ - minZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a bounding sphere\r\n * @param sphere defines the sphere to test\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsSphere(sphere: DeepImmutable<BoundingSphere>): boolean {\r\n return BoundingBox.IntersectsSphere(this.minimumWorld, this.maximumWorld, sphere.centerWorld, sphere.radiusWorld);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a box defined by a min and max vectors\r\n * @param min defines the min vector to use\r\n * @param max defines the max vector to use\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsMinMax(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>): boolean {\r\n const myMin = this.minimumWorld;\r\n const myMax = this.maximumWorld;\r\n const myMinX = myMin.x,\r\n myMinY = myMin.y,\r\n myMinZ = myMin.z,\r\n myMaxX = myMax.x,\r\n myMaxY = myMax.y,\r\n myMaxZ = myMax.z;\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n if (myMaxX < minX || myMinX > maxX) {\r\n return false;\r\n }\r\n\r\n if (myMaxY < minY || myMinY > maxY) {\r\n return false;\r\n }\r\n\r\n if (myMaxZ < minZ || myMinZ > maxZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Disposes the resources of the class\r\n */\r\n public dispose(): void {\r\n this._drawWrapperFront?.dispose();\r\n this._drawWrapperBack?.dispose();\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Tests if two bounding boxes are intersections\r\n * @param box0 defines the first box to test\r\n * @param box1 defines the second box to test\r\n * @returns true if there is an intersection\r\n */\r\n public static Intersects(box0: DeepImmutable<BoundingBox>, box1: DeepImmutable<BoundingBox>): boolean {\r\n return box0.intersectsMinMax(box1.minimumWorld, box1.maximumWorld);\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defines by a min/max vectors intersects a sphere\r\n * @param minPoint defines the minimum vector of the bounding box\r\n * @param maxPoint defines the maximum vector of the bounding box\r\n * @param sphereCenter defines the sphere center\r\n * @param sphereRadius defines the sphere radius\r\n * @returns true if there is an intersection\r\n */\r\n public static IntersectsSphere(minPoint: DeepImmutable<Vector3>, maxPoint: DeepImmutable<Vector3>, sphereCenter: DeepImmutable<Vector3>, sphereRadius: number): boolean {\r\n const vector = BoundingBox._TmpVector3[0];\r\n Vector3.ClampToRef(sphereCenter, minPoint, maxPoint, vector);\r\n const num = Vector3.DistanceSquared(sphereCenter, vector);\r\n return num <= sphereRadius * sphereRadius;\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors is entirely inside frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an inclusion\r\n */\r\n public static IsCompletelyInFrustum(boundingVectors: Array<DeepImmutable<Vector3>>, frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n for (let p = 0; p < 6; ++p) {\r\n const frustumPlane = frustumPlanes[p];\r\n for (let i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) < 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors intersects frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public static IsInFrustum(boundingVectors: Array<DeepImmutable<Vector3>>, frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n for (let p = 0; p < 6; ++p) {\r\n let canReturnFalse = true;\r\n const frustumPlane = frustumPlanes[p];\r\n for (let i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) >= 0) {\r\n canReturnFalse = false;\r\n break;\r\n }\r\n }\r\n if (canReturnFalse) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n"]}
|
package/Culling/boundingInfo.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BuildArray } from "../Misc/arrayTools.js";
|
|
2
2
|
import { TmpVectors } from "../Maths/math.vector.js";
|
|
3
3
|
import { Vector3 } from "../Maths/math.vector.js";
|
|
4
4
|
|
|
@@ -262,5 +262,5 @@ export class BoundingInfo {
|
|
|
262
262
|
return true;
|
|
263
263
|
}
|
|
264
264
|
}
|
|
265
|
-
BoundingInfo._TmpVector3 =
|
|
265
|
+
BoundingInfo._TmpVector3 = BuildArray(2, Vector3.Zero);
|
|
266
266
|
//# sourceMappingURL=boundingInfo.js.map
|