@meimu/mutracer 0.1.4 → 0.2.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/LICENSES/Classroom-CC0.txt +121 -0
- package/README.md +7 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +10421 -8363
- package/docs/api.md +202 -11
- package/docs/denoising.md +30 -15
- package/docs/materials.md +18 -27
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +32 -1
- package/docs/threejs.md +19 -10
- package/docs/updates.md +44 -2
- package/docs/viewer.md +41 -3
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +27 -6
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -0
- package/lib/Engine.js +52 -25
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +44 -9
- package/lib/Render.js +115 -17
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -1
- package/lib/RenderLoop.js +94 -13
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +6 -3
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/math/access.d.ts +4 -0
- package/lib/math/access.js +10 -0
- package/lib/math/access.js.map +1 -0
- package/lib/math/mat3.d.ts +4 -0
- package/lib/math/mat3.js +54 -0
- package/lib/math/mat3.js.map +1 -0
- package/lib/math/mat4.d.ts +19 -0
- package/lib/math/mat4.js +413 -0
- package/lib/math/mat4.js.map +1 -0
- package/lib/math/storage.d.ts +6 -0
- package/lib/math/storage.js +22 -0
- package/lib/math/storage.js.map +1 -0
- package/lib/math/types.d.ts +3 -0
- package/lib/math/types.js +2 -0
- package/lib/math/types.js.map +1 -0
- package/lib/math/vec2.d.ts +13 -0
- package/lib/math/vec2.js +52 -0
- package/lib/math/vec2.js.map +1 -0
- package/lib/math/vec3.d.ts +23 -0
- package/lib/math/vec3.js +139 -0
- package/lib/math/vec3.js.map +1 -0
- package/lib/math.d.ts +5 -17
- package/lib/math.js +5 -55
- package/lib/math.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidn.js +4 -2
- package/lib/oidn.js.map +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
- package/lib/renderer/AovPrimitiveCache.js +48 -0
- package/lib/renderer/AovPrimitiveCache.js.map +1 -0
- package/lib/renderer/Box3.d.ts +5 -0
- package/lib/renderer/Box3.js +9 -0
- package/lib/renderer/Box3.js.map +1 -0
- package/lib/renderer/GPUTraceQueue.d.ts +10 -0
- package/lib/renderer/GPUTraceQueue.js +31 -0
- package/lib/renderer/GPUTraceQueue.js.map +1 -0
- package/lib/renderer/MaterialData.d.ts +15 -0
- package/lib/renderer/MaterialData.js +61 -0
- package/lib/renderer/MaterialData.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +11 -98
- package/lib/renderer/MaterialTable.js +34 -412
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +32 -13
- package/lib/renderer/RenderingPipeline.js +1 -17
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +0 -1
- package/lib/renderer/TileRender.js +14 -1
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +39 -0
- package/lib/renderer/WGPUAov.js +239 -0
- package/lib/renderer/WGPUAov.js.map +1 -0
- package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
- package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
- package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
- package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
- package/lib/renderer/WGPUBindlessTextures.js +180 -0
- package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.js +17 -97
- package/lib/renderer/WGPUBloomPass.js.map +1 -1
- package/lib/renderer/WGPUComputePass.d.ts +1 -1
- package/lib/renderer/WGPUComputePass.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
- package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.js +10 -9
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
- package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WGPURayTraceOutput.js +26 -17
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +36 -40
- package/lib/renderer/WGPURayTracePass.js +399 -548
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +239 -60
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUShaderCache.d.ts +2 -2
- package/lib/renderer/WGPUShaderCache.js +10 -5
- package/lib/renderer/WGPUShaderCache.js.map +1 -1
- package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
- package/lib/renderer/WGPUShaderCapabilities.js +54 -0
- package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
- package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
- package/lib/renderer/WGPUSkyBaker.js +85 -0
- package/lib/renderer/WGPUSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLAov.d.ts +41 -0
- package/lib/renderer/WebGLAov.js +106 -0
- package/lib/renderer/WebGLAov.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
- package/lib/renderer/WebGLFullQuadPass.js +18 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
- package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
- package/lib/renderer/WebGLRayTracePass.js +83 -7
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +116 -8
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
- package/lib/renderer/WebGLSkyBaker.js +422 -0
- package/lib/renderer/WebGLSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLSkySource.d.ts +9 -0
- package/lib/renderer/WebGLSkySource.js +28 -0
- package/lib/renderer/WebGLSkySource.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +5 -0
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +42 -0
- package/lib/renderer/aov.js +50 -0
- package/lib/renderer/aov.js.map +1 -0
- package/lib/renderer/aovDisplay.d.ts +14 -0
- package/lib/renderer/aovDisplay.js +32 -0
- package/lib/renderer/aovDisplay.js.map +1 -0
- package/lib/renderer/aovScene.d.ts +21 -0
- package/lib/renderer/aovScene.js +139 -0
- package/lib/renderer/aovScene.js.map +1 -0
- package/lib/renderer/binnedSahBvh.js +2 -1
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +20 -10
- package/lib/renderer/bvhAccel.js +168 -58
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
- package/lib/renderer/cameraSnapshot.js +2 -1
- package/lib/renderer/cameraSnapshot.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +2 -0
- package/lib/renderer/cameraUniform.js +12 -0
- package/lib/renderer/cameraUniform.js.map +1 -0
- package/lib/renderer/committedScene.js +4 -0
- package/lib/renderer/committedScene.js.map +1 -1
- package/lib/renderer/denoiser.d.ts +3 -11
- package/lib/renderer/denoiser.js.map +1 -1
- package/lib/renderer/depthQuery.js +4 -1
- package/lib/renderer/depthQuery.js.map +1 -1
- package/lib/renderer/displacementPreparation.d.ts +11 -0
- package/lib/renderer/displacementPreparation.js +351 -0
- package/lib/renderer/displacementPreparation.js.map +1 -0
- package/lib/renderer/displacementRange.d.ts +1 -0
- package/lib/renderer/displacementRange.js +9 -0
- package/lib/renderer/displacementRange.js.map +1 -0
- package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
- package/lib/renderer/displayParityDiagnostics.js +2 -0
- package/lib/renderer/displayParityDiagnostics.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +9 -8
- package/lib/renderer/envMapCreation.js +36 -12
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/envMapDistribution.d.ts +12 -2
- package/lib/renderer/envMapDistribution.js +43 -34
- package/lib/renderer/envMapDistribution.js.map +1 -1
- package/lib/renderer/geometryBvhBounds.d.ts +4 -0
- package/lib/renderer/geometryBvhBounds.js +82 -0
- package/lib/renderer/geometryBvhBounds.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +32 -0
- package/lib/renderer/geometryUpdateState.js +2 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +17 -9
- package/lib/renderer/geometryUpdates.js +92 -33
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
- package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
- package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/aovTrace.frag.js +121 -0
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +437 -435
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +146 -145
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +821 -821
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +51 -51
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +108 -108
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +7 -7
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +191 -191
- package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
- package/lib/renderer/lightConstants.d.ts +10 -0
- package/lib/renderer/lightConstants.js +11 -0
- package/lib/renderer/lightConstants.js.map +1 -0
- package/lib/renderer/lightCore.d.ts +12 -0
- package/lib/renderer/lightCore.js +13 -0
- package/lib/renderer/lightCore.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +20 -17
- package/lib/renderer/lightSampling.js +123 -56
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/lightsData.d.ts +21 -0
- package/lib/renderer/lightsData.js +192 -0
- package/lib/renderer/lightsData.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +3 -26
- package/lib/renderer/lightsUtil.js +3 -153
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialBufferData.d.ts +70 -0
- package/lib/renderer/materialBufferData.js +2 -0
- package/lib/renderer/materialBufferData.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +11 -0
- package/lib/renderer/materialConstants.js +11 -0
- package/lib/renderer/materialConstants.js.map +1 -1
- package/lib/renderer/materialCore.d.ts +8 -0
- package/lib/renderer/materialCore.js +9 -0
- package/lib/renderer/materialCore.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +2 -2
- package/lib/renderer/materialEmission.js +3 -3
- package/lib/renderer/materialEmission.js.map +1 -1
- package/lib/renderer/materialLayout.d.ts +2 -101
- package/lib/renderer/materialLayout.js +110 -172
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/materialLayoutSchema.d.ts +26 -0
- package/lib/renderer/materialLayoutSchema.js +172 -0
- package/lib/renderer/materialLayoutSchema.js.map +1 -0
- package/lib/renderer/materialParams.d.ts +69 -0
- package/lib/renderer/materialParams.js +272 -0
- package/lib/renderer/materialParams.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +14 -324
- package/lib/renderer/materialTextureSlots.js +21 -8
- package/lib/renderer/materialTextureSlots.js.map +1 -1
- package/lib/renderer/materialTextures.d.ts +6 -0
- package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
- package/lib/renderer/materialTextures.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.js +6 -147
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
- package/lib/renderer/meshInstances.d.ts +4 -21
- package/lib/renderer/meshInstances.js +10 -56
- package/lib/renderer/meshInstances.js.map +1 -1
- package/lib/renderer/oidnNetwork.d.ts +2 -2
- package/lib/renderer/oidnNetwork.js +1 -1
- package/lib/renderer/oidnNetwork.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.js +850 -846
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/ownedDenoiser.d.ts +9 -0
- package/lib/renderer/ownedDenoiser.js +2 -0
- package/lib/renderer/ownedDenoiser.js.map +1 -0
- package/lib/renderer/packedMeshInstances.d.ts +23 -0
- package/lib/renderer/packedMeshInstances.js +80 -0
- package/lib/renderer/packedMeshInstances.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +12 -47
- package/lib/renderer/prepareMeshBVH.js +21 -642
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
- package/lib/renderer/proceduralEnvironmentPower.js +8 -0
- package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +1 -0
- package/lib/renderer/progressiveScheduler.js +3 -0
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +3 -1
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/renderingLimits.d.ts +9 -0
- package/lib/renderer/renderingLimits.js +18 -0
- package/lib/renderer/renderingLimits.js.map +1 -0
- package/lib/renderer/sceneAssembly.d.ts +73 -0
- package/lib/renderer/sceneAssembly.js +109 -0
- package/lib/renderer/sceneAssembly.js.map +1 -0
- package/lib/renderer/sceneChangeCore.d.ts +39 -0
- package/lib/renderer/sceneChangeCore.js +307 -0
- package/lib/renderer/sceneChangeCore.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +3 -6
- package/lib/renderer/sceneChangeDetector.js +24 -150
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
- package/lib/renderer/sceneLayoutSchema.js +111 -0
- package/lib/renderer/sceneLayoutSchema.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +3 -3
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +55 -0
- package/lib/renderer/scenePreparation.js +360 -0
- package/lib/renderer/scenePreparation.js.map +1 -0
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/scratchSampling.js.map +1 -1
- package/lib/renderer/shader.d.ts +2 -0
- package/lib/renderer/shader.js +2 -0
- package/lib/renderer/shader.js.map +1 -1
- package/lib/renderer/shaderCapabilities.d.ts +23 -0
- package/lib/renderer/shaderCapabilities.js +55 -0
- package/lib/renderer/shaderCapabilities.js.map +1 -0
- package/lib/renderer/shaderCapacity.d.ts +2 -0
- package/lib/renderer/shaderCapacity.js +5 -0
- package/lib/renderer/shaderCapacity.js.map +1 -0
- package/lib/renderer/skyModel.d.ts +9 -0
- package/lib/renderer/skyModel.js +10 -0
- package/lib/renderer/skyModel.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +60 -0
- package/lib/renderer/textureAtlas.js +145 -0
- package/lib/renderer/textureAtlas.js.map +1 -0
- package/lib/renderer/textureAtlasPixels.d.ts +7 -0
- package/lib/renderer/textureAtlasPixels.js +68 -0
- package/lib/renderer/textureAtlasPixels.js.map +1 -0
- package/lib/renderer/util.d.ts +1 -1
- package/lib/renderer/util.js.map +1 -1
- package/lib/renderer/webgl.d.ts +9 -2
- package/lib/renderer/webgl.js +54 -9
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/wgpuBindless.d.ts +26 -0
- package/lib/renderer/wgpuBindless.js +95 -0
- package/lib/renderer/wgpuBindless.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
- package/lib/renderer/wgpuBindlessSource.js +51 -0
- package/lib/renderer/wgpuBindlessSource.js.map +1 -0
- package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
- package/lib/renderer/wgpuMaterialConstants.js +52 -0
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
- package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
- package/lib/renderer/wgpuSceneUniform.js +125 -0
- package/lib/renderer/wgpuSceneUniform.js.map +1 -0
- package/lib/renderer/wgpuShaderSource.d.ts +15 -0
- package/lib/renderer/wgpuShaderSource.js +31 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
- package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +743 -706
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +86 -83
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
- package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
- package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
- package/lib/renderer/wgsl/jnlm.compute.js +315 -0
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Camera.js +7 -3
- package/lib/scene/Camera.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +5 -9
- package/lib/scene/EnvironmentLight.js +4 -14
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/EnvironmentLightState.d.ts +18 -0
- package/lib/scene/EnvironmentLightState.js +19 -0
- package/lib/scene/EnvironmentLightState.js.map +1 -0
- package/lib/scene/Geometry.d.ts +12 -6
- package/lib/scene/Geometry.js +37 -13
- package/lib/scene/Geometry.js.map +1 -1
- package/lib/scene/InstanceState.d.ts +39 -0
- package/lib/scene/InstanceState.js +77 -0
- package/lib/scene/InstanceState.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +1 -1
- package/lib/scene/InstancedMesh.js +3 -0
- package/lib/scene/InstancedMesh.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +209 -0
- package/lib/scene/MaterialState.js +231 -0
- package/lib/scene/MaterialState.js.map +1 -0
- package/lib/scene/Mesh.d.ts +4 -6
- package/lib/scene/Mesh.js +3 -11
- package/lib/scene/Mesh.js.map +1 -1
- package/lib/scene/MeshState.d.ts +20 -0
- package/lib/scene/MeshState.js +35 -0
- package/lib/scene/MeshState.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +7 -169
- package/lib/scene/OpenPBRMaterial.js +5 -223
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/PixelTexture.d.ts +6 -0
- package/lib/scene/PixelTexture.js +10 -0
- package/lib/scene/PixelTexture.js.map +1 -0
- package/lib/scene/ProceduralSky.d.ts +24 -0
- package/lib/scene/ProceduralSky.js +40 -0
- package/lib/scene/ProceduralSky.js.map +1 -0
- package/lib/scene/RectLight.d.ts +2 -13
- package/lib/scene/RectLight.js +3 -21
- package/lib/scene/RectLight.js.map +1 -1
- package/lib/scene/RectLightState.d.ts +31 -0
- package/lib/scene/RectLightState.js +26 -0
- package/lib/scene/RectLightState.js.map +1 -0
- package/lib/scene/Scene.d.ts +15 -4
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SceneNode.js +7 -6
- package/lib/scene/SceneNode.js.map +1 -1
- package/lib/scene/Texture.d.ts +10 -41
- package/lib/scene/Texture.js +4 -33
- package/lib/scene/Texture.js.map +1 -1
- package/lib/scene/TextureState.d.ts +35 -0
- package/lib/scene/TextureState.js +35 -0
- package/lib/scene/TextureState.js.map +1 -0
- package/lib/scene/attributeData.d.ts +4 -0
- package/lib/scene/attributeData.js +10 -0
- package/lib/scene/attributeData.js.map +1 -0
- package/lib/scene/lightState.d.ts +8 -0
- package/lib/scene/lightState.js +2 -0
- package/lib/scene/lightState.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +7 -12
- package/lib/scene/openPbrSchema.js +273 -28
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/scene/skyParameters.d.ts +20 -0
- package/lib/scene/skyParameters.js +28 -0
- package/lib/scene/skyParameters.js.map +1 -0
- package/lib/scene/textureData.d.ts +9 -0
- package/lib/scene/textureData.js +2 -0
- package/lib/scene/textureData.js.map +1 -0
- package/lib/scene/texturePixels.d.ts +6 -0
- package/lib/scene/texturePixels.js +10 -0
- package/lib/scene/texturePixels.js.map +1 -0
- package/lib/settings/display.d.ts +33 -0
- package/lib/settings/display.js +7 -0
- package/lib/settings/display.js.map +1 -1
- package/lib/settings/render.d.ts +25 -3
- package/lib/settings/render.js +3 -1
- package/lib/settings/render.js.map +1 -1
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/util/commonGeometry.js +7 -7
- package/lib/util/commonGeometry.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +4 -1
- package/lib/util/fromTHREE.js +18 -5
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/util/geometry.js +42 -29
- package/lib/util/geometry.js.map +1 -1
- package/lib/util/loadRGBE.js +3 -4
- package/lib/util/loadRGBE.js.map +1 -1
- package/lib/util/studioLighting.d.ts +18 -0
- package/lib/util/studioLighting.js +36 -0
- package/lib/util/studioLighting.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +4 -0
- package/package.json +31 -5
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.js.map +0 -1
|
@@ -1,42 +1,42 @@
|
|
|
1
1
|
// Portions adapted from ray-tracing-renderer@0.10.15
|
|
2
2
|
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
3
3
|
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
4
|
-
import { uvProjectionConstants } from '../../
|
|
4
|
+
import { uvProjectionConstants } from '../../materialConstants.js';
|
|
5
5
|
import { INSTANCE_VEC4_STRIDE } from '../../bvhAccel.js';
|
|
6
6
|
import pdm_displacementWgsl from './pdm_displacement.wgsl.js';
|
|
7
7
|
import { createIntersectionAlphaWgsl } from './intersectionAlpha.wgsl.js';
|
|
8
8
|
const displacementWgsl = pdm_displacementWgsl;
|
|
9
9
|
const flatIntersectCode = function () {
|
|
10
10
|
return /* wgsl */ `
|
|
11
|
-
let hit =
|
|
11
|
+
let hit = ga(o, d, tri, eq, gY, tMax);
|
|
12
12
|
if (hit.t > 0.0) {
|
|
13
13
|
let e1 = tri.p1 - tri.p0;
|
|
14
14
|
let e2 = tri.p2 - tri.p0;
|
|
15
|
-
|
|
16
|
-
let
|
|
17
|
-
let
|
|
18
|
-
if (!doubleSided && !
|
|
19
|
-
|
|
15
|
+
eL = normalize(cross(e1, e2));
|
|
16
|
+
let kP = i32(ah(bitcast<i32>(pi.z)).x);
|
|
17
|
+
let jd = materialsBuffer[kP].doubleSided > 0.5;
|
|
18
|
+
if (!doubleSided && !jd && dot(eL, d) > 0.0) {
|
|
19
|
+
eL = vec3f(0.0);
|
|
20
20
|
continue;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
tMax = hit.t;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
sj = true;
|
|
25
|
+
pl = true;
|
|
26
|
+
fi = o + tMax * d;
|
|
27
|
+
aC = hit.barycentric;
|
|
28
28
|
}
|
|
29
29
|
`;
|
|
30
30
|
};
|
|
31
31
|
function getPDMDisplacmentCode(anyHit) {
|
|
32
32
|
return /*wgsl */ `
|
|
33
|
-
let
|
|
33
|
+
let lH = pY(
|
|
34
34
|
o, d, tMax,
|
|
35
35
|
tri.p0, tri.p1, tri.p2,
|
|
36
36
|
n0, n1, n2,
|
|
37
37
|
uv0, uv1, uv2,
|
|
38
38
|
displacementMapIndex,
|
|
39
|
-
|
|
39
|
+
jO(displacementMapIndex),
|
|
40
40
|
minH, maxH,
|
|
41
41
|
hScale,
|
|
42
42
|
matData.displacementBias,
|
|
@@ -44,17 +44,17 @@ matData.displacementStepSize,
|
|
|
44
44
|
i32(matData.displacementUvProjection),
|
|
45
45
|
displacementUvProjectionScale,
|
|
46
46
|
${anyHit ? 'true' : 'false'},
|
|
47
|
-
|
|
47
|
+
jA
|
|
48
48
|
);
|
|
49
49
|
`;
|
|
50
50
|
}
|
|
51
51
|
const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
|
|
52
52
|
return /* wgsl */ `
|
|
53
53
|
|
|
54
|
-
let hScale =
|
|
55
|
-
let
|
|
54
|
+
let hScale = pi.w;
|
|
55
|
+
let uQ = bitcast<i32>(r3.w);
|
|
56
56
|
|
|
57
|
-
let materialIndex = i32(
|
|
57
|
+
let materialIndex = i32(ah(bitcast<i32>(pi.z)).x);
|
|
58
58
|
let matData = materialsBuffer[materialIndex];
|
|
59
59
|
let n0 = normalize(attrBuffers[index.x * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
60
60
|
let n1 = normalize(attrBuffers[index.y * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
@@ -64,9 +64,9 @@ tri.p0 += n0 * matData.displacementBias;
|
|
|
64
64
|
tri.p1 += n1 * matData.displacementBias;
|
|
65
65
|
tri.p2 += n2 * matData.displacementBias;
|
|
66
66
|
}
|
|
67
|
-
if (abs(hScale) > 0.0 &&
|
|
68
|
-
let minH = f32(
|
|
69
|
-
let maxH = f32(
|
|
67
|
+
if (abs(hScale) > 0.0 && uQ > 0) {
|
|
68
|
+
let minH = f32(uQ >> 8) / 255.0;
|
|
69
|
+
let maxH = f32(uQ & 0xff) / 255.0;
|
|
70
70
|
let displacementUvProjectionScale = vec2f(matData.displacementUvProjectionScale);
|
|
71
71
|
let displacementMapIndex = i32(matData.displacementMapIndex);
|
|
72
72
|
|
|
@@ -77,18 +77,18 @@ var uv2 = attrBuffers[index.z * ATTR_STRIDE + UV_OFF].xy;
|
|
|
77
77
|
|
|
78
78
|
${getPDMDisplacmentCode(anyHit)}
|
|
79
79
|
|
|
80
|
-
if (
|
|
81
|
-
|
|
80
|
+
if (lH.t < tMax) {
|
|
81
|
+
eL = lH.normal;
|
|
82
82
|
|
|
83
83
|
|
|
84
|
-
tMax =
|
|
84
|
+
tMax = lH.t;
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
aC = lH.barycentric;
|
|
87
|
+
fi = o + tMax * d;
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
bZ = true;
|
|
90
|
+
sj = true;
|
|
91
|
+
pl = true;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
@@ -97,7 +97,7 @@ ${flatIntersectCode()}
|
|
|
97
97
|
`;
|
|
98
98
|
};
|
|
99
99
|
const cwbvhTraversalWgsl = /* wgsl */ `
|
|
100
|
-
fn
|
|
100
|
+
fn bA(value: u32) -> vec4f {
|
|
101
101
|
return vec4f(
|
|
102
102
|
f32(value & 0xffu),
|
|
103
103
|
f32((value >> 8u) & 0xffu),
|
|
@@ -112,118 +112,118 @@ f32(value >> 24u)
|
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
|
|
115
|
-
fn
|
|
115
|
+
fn lb(value: u32) -> u32 {
|
|
116
116
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
fn
|
|
119
|
+
fn oT(value: u32) -> u32 {
|
|
120
120
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
fn
|
|
123
|
+
fn pj(
|
|
124
124
|
node: i32,
|
|
125
|
-
|
|
125
|
+
uJ: i32,
|
|
126
126
|
n0: vec4f,
|
|
127
127
|
o: vec3f,
|
|
128
|
-
|
|
128
|
+
gr: vec3f,
|
|
129
129
|
tMax: f32
|
|
130
130
|
) -> u32 {
|
|
131
|
-
let i = node +
|
|
131
|
+
let i = node + uJ;
|
|
132
132
|
let n2 = bvhBuffer[i + 2];
|
|
133
133
|
let n3 = bvhBuffer[i + 3];
|
|
134
134
|
let n4 = bvhBuffer[i + 4];
|
|
135
135
|
let header = bitcast<u32>(n0.w);
|
|
136
|
-
let
|
|
137
|
-
let
|
|
138
|
-
let
|
|
139
|
-
let
|
|
140
|
-
bitcast<f32>(u32(
|
|
141
|
-
bitcast<f32>(u32(
|
|
142
|
-
bitcast<f32>(u32(
|
|
136
|
+
let sH = bitcast<i32>((header & 0xffu) << 24u) >> 24;
|
|
137
|
+
let sI = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
|
|
138
|
+
let sJ = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
|
|
139
|
+
let hZ = vec3f(
|
|
140
|
+
bitcast<f32>(u32(sH + 127) << 23u),
|
|
141
|
+
bitcast<f32>(u32(sI + 127) << 23u),
|
|
142
|
+
bitcast<f32>(u32(sJ + 127) << 23u)
|
|
143
143
|
);
|
|
144
|
-
let
|
|
145
|
-
let
|
|
146
|
-
let
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
let
|
|
151
|
-
let
|
|
152
|
-
let
|
|
153
|
-
let
|
|
154
|
-
let
|
|
155
|
-
let
|
|
156
|
-
let
|
|
157
|
-
let
|
|
158
|
-
let
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
let
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
max((min(vp, vj) - vec4f(bJ.x)), (min(vs, vl) - vec4f(bJ.y))),
|
|
168
|
-
(min(vu, vn) - vec4f(bJ.z))
|
|
144
|
+
let padding = fk(gr, o);
|
|
145
|
+
let eS = (n0.xyz - o) * gr;
|
|
146
|
+
let dq = hZ * gr;
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
let vc = bitcast<vec4u>(n2);
|
|
151
|
+
let vd = bitcast<vec4u>(n3);
|
|
152
|
+
let ve = bitcast<vec4u>(n4);
|
|
153
|
+
let negative = gr < vec3f(0.0);
|
|
154
|
+
let wn = select(vc.xy, vd.zw, negative.x);
|
|
155
|
+
let xt = select(vd.zw, vc.xy, negative.x);
|
|
156
|
+
let wo = select(vc.zw, ve.xy, negative.y);
|
|
157
|
+
let xu = select(ve.xy, vc.zw, negative.y);
|
|
158
|
+
let wp = select(vd.xy, ve.zw, negative.z);
|
|
159
|
+
let xv = select(ve.zw, vd.xy, negative.z);
|
|
160
|
+
|
|
161
|
+
let yl = max(
|
|
162
|
+
max(
|
|
163
|
+
bA(wn.x) * dq.x + eS.x - vec4f(padding.x),
|
|
164
|
+
bA(wo.x) * dq.y + eS.y - vec4f(padding.y)
|
|
165
|
+
),
|
|
166
|
+
bA(wp.x) * dq.z + eS.z - vec4f(padding.z)
|
|
169
167
|
);
|
|
170
|
-
let
|
|
171
|
-
min(
|
|
172
|
-
(
|
|
168
|
+
let yg = min(
|
|
169
|
+
min(
|
|
170
|
+
bA(xt.x) * dq.x + eS.x + vec4f(padding.x),
|
|
171
|
+
bA(xu.x) * dq.y + eS.y + vec4f(padding.y)
|
|
172
|
+
),
|
|
173
|
+
bA(xv.x) * dq.z + eS.z + vec4f(padding.z)
|
|
173
174
|
);
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
let vo = wx * dc.z + eI.z;
|
|
181
|
-
let wJ = max(
|
|
182
|
-
max((min(vq, vk) - vec4f(bJ.x)), (min(vt, vm) - vec4f(bJ.y))),
|
|
183
|
-
(min(vw, vo) - vec4f(bJ.z))
|
|
175
|
+
let ym = max(
|
|
176
|
+
max(
|
|
177
|
+
bA(wn.y) * dq.x + eS.x - vec4f(padding.x),
|
|
178
|
+
bA(wo.y) * dq.y + eS.y - vec4f(padding.y)
|
|
179
|
+
),
|
|
180
|
+
bA(wp.y) * dq.z + eS.z - vec4f(padding.z)
|
|
184
181
|
);
|
|
185
|
-
let
|
|
186
|
-
min(
|
|
187
|
-
(
|
|
182
|
+
let yh = min(
|
|
183
|
+
min(
|
|
184
|
+
bA(xt.y) * dq.x + eS.x + vec4f(padding.x),
|
|
185
|
+
bA(xu.y) * dq.y + eS.y + vec4f(padding.y)
|
|
186
|
+
),
|
|
187
|
+
bA(xv.y) * dq.z + eS.z + vec4f(padding.z)
|
|
188
188
|
);
|
|
189
189
|
|
|
190
|
-
let
|
|
191
|
-
let
|
|
192
|
-
return select(0u, 1u,
|
|
193
|
-
| select(0u, 2u,
|
|
194
|
-
| select(0u, 4u,
|
|
195
|
-
| select(0u, 8u,
|
|
196
|
-
| select(0u, 16u,
|
|
197
|
-
| select(0u, 32u,
|
|
198
|
-
| select(0u, 64u,
|
|
199
|
-
| select(0u, 128u,
|
|
190
|
+
let wl = (yl <= min(yg, vec4f(tMax))) & (yg > vec4f(0.0));
|
|
191
|
+
let wm = (ym <= min(yh, vec4f(tMax))) & (yh > vec4f(0.0));
|
|
192
|
+
return select(0u, 1u, wl.x)
|
|
193
|
+
| select(0u, 2u, wl.y)
|
|
194
|
+
| select(0u, 4u, wl.z)
|
|
195
|
+
| select(0u, 8u, wl.w)
|
|
196
|
+
| select(0u, 16u, wm.x)
|
|
197
|
+
| select(0u, 32u, wm.y)
|
|
198
|
+
| select(0u, 64u, wm.z)
|
|
199
|
+
| select(0u, 128u, wm.w);
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
`;
|
|
203
203
|
function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
|
|
204
204
|
const intersectTriangles = /* wgsl */ `
|
|
205
|
-
let
|
|
206
|
-
let vertexOffset = vec3i(bitcast<i32>(
|
|
207
|
-
for (var k = 0; k <
|
|
205
|
+
let pi = instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE}];
|
|
206
|
+
let vertexOffset = vec3i(bitcast<i32>(pi.y));
|
|
207
|
+
for (var k = 0; k < primitiveCount; k++) {
|
|
208
208
|
let triangleIndex = primitiveOffset + k;
|
|
209
209
|
${skipTriangleCode}
|
|
210
|
-
if (bounces > 0 && triangleIndex ==
|
|
210
|
+
if (bounces > 0 && triangleIndex == fV) {
|
|
211
211
|
continue;
|
|
212
212
|
}
|
|
213
213
|
|
|
214
214
|
let r3 = bvhBuffer[triangleIndex];
|
|
215
215
|
let index = bitcast<vec3i>(r3.xyz) + vertexOffset;
|
|
216
|
-
var tri =
|
|
216
|
+
var tri = fP(
|
|
217
217
|
attrBuffers[index.x * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
|
|
218
218
|
attrBuffers[index.y * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
|
|
219
219
|
attrBuffers[index.z * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''}
|
|
220
220
|
);
|
|
221
|
-
var
|
|
221
|
+
var pl = false;
|
|
222
222
|
|
|
223
223
|
${hasDisplacement
|
|
224
224
|
? displacementIntersectCode(anyHit, hasAnisotropyDirections)
|
|
225
225
|
: flatIntersectCode()}
|
|
226
|
-
if (
|
|
226
|
+
if (pl) {
|
|
227
227
|
${handleHitCode}
|
|
228
228
|
}
|
|
229
229
|
}
|
|
@@ -231,285 +231,285 @@ ${handleHitCode}
|
|
|
231
231
|
return /* wgsl */ `
|
|
232
232
|
var d = ray.d;
|
|
233
233
|
var o = ray.o;
|
|
234
|
-
var
|
|
235
|
-
var
|
|
236
|
-
var
|
|
237
|
-
var
|
|
238
|
-
var
|
|
239
|
-
var
|
|
240
|
-
var
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
jh--;
|
|
234
|
+
var jE = -1;
|
|
235
|
+
var gr = fo(d);
|
|
236
|
+
var bZ = false;
|
|
237
|
+
var sj = false;
|
|
238
|
+
var fi: vec3f;
|
|
239
|
+
var eL: vec3f;
|
|
240
|
+
var aC: vec3f;
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
if (cU(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gr, tMax) > 0.0) {
|
|
244
|
+
jE = 0;
|
|
245
|
+
mK[0] = 0;
|
|
246
|
+
}
|
|
247
|
+
while (jE >= 0) {
|
|
248
|
+
let ul = mK[jE];
|
|
249
|
+
jE--;
|
|
251
250
|
o = ray.o;
|
|
252
251
|
d = ray.d;
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
let
|
|
256
|
-
let
|
|
257
|
-
if (
|
|
258
|
-
let left =
|
|
259
|
-
let right =
|
|
260
|
-
let d0 =
|
|
252
|
+
gr = fo(d);
|
|
253
|
+
|
|
254
|
+
let xW = bvhBuffer[ul];
|
|
255
|
+
let ff = bitcast<i32>(xW.w);
|
|
256
|
+
if (ff >= 0) {
|
|
257
|
+
let left = ul + 2;
|
|
258
|
+
let right = ff;
|
|
259
|
+
let d0 = cU(
|
|
261
260
|
o,
|
|
262
261
|
bvhBuffer[left].xyz,
|
|
263
262
|
bvhBuffer[left + 1].xyz,
|
|
264
|
-
|
|
263
|
+
gr,
|
|
265
264
|
tMax
|
|
266
265
|
);
|
|
267
|
-
let d1 =
|
|
266
|
+
let d1 = cU(
|
|
268
267
|
o,
|
|
269
268
|
bvhBuffer[right].xyz,
|
|
270
269
|
bvhBuffer[right + 1].xyz,
|
|
271
|
-
|
|
270
|
+
gr,
|
|
272
271
|
tMax
|
|
273
272
|
);
|
|
274
273
|
|
|
275
274
|
if (d0 > d1) {
|
|
276
|
-
if (d0 > 0.0) {
|
|
277
|
-
if (d1 > 0.0) {
|
|
275
|
+
if (d0 > 0.0) { jE++; mK[jE] = left; }
|
|
276
|
+
if (d1 > 0.0) { jE++; mK[jE] = right; }
|
|
278
277
|
}
|
|
279
278
|
else {
|
|
280
|
-
if (d1 > 0.0) {
|
|
281
|
-
if (d0 > 0.0) {
|
|
279
|
+
if (d1 > 0.0) { jE++; mK[jE] = right; }
|
|
280
|
+
if (d0 > 0.0) { jE++; mK[jE] = left; }
|
|
282
281
|
}
|
|
283
282
|
}
|
|
284
283
|
else {
|
|
285
|
-
let
|
|
284
|
+
let rQ = -ff;
|
|
286
285
|
|
|
287
286
|
|
|
288
287
|
for (
|
|
289
|
-
var
|
|
290
|
-
|
|
291
|
-
|
|
288
|
+
var nq = rQ - 1;
|
|
289
|
+
nq >= 0;
|
|
290
|
+
nq--
|
|
292
291
|
) {
|
|
293
|
-
let
|
|
294
|
-
let
|
|
295
|
-
let
|
|
296
|
-
let
|
|
292
|
+
let qv = bvhBuffer[ul + 2 + nq];
|
|
293
|
+
let bY = bitcast<i32>(qv.x);
|
|
294
|
+
let wL = bitcast<i32>(qv.y);
|
|
295
|
+
let pi = instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE}];
|
|
297
296
|
let w2l = mat4x4<f32>(
|
|
298
|
-
instancesBuffer[
|
|
299
|
-
instancesBuffer[
|
|
300
|
-
instancesBuffer[
|
|
301
|
-
instancesBuffer[
|
|
297
|
+
instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
298
|
+
instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
299
|
+
instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
300
|
+
instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
302
301
|
);
|
|
303
302
|
o = (w2l * vec4f(ray.o, 1.0)).xyz;
|
|
304
303
|
d = (w2l * vec4f(ray.d, 0.0)).xyz;
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
304
|
+
gr = fo(d);
|
|
305
|
+
eq = maxDimension(abs(d));
|
|
306
|
+
gY = nk(d, eq);
|
|
308
307
|
|
|
309
|
-
let
|
|
310
|
-
let
|
|
311
|
-
let blasOffset = i32(
|
|
312
|
-
let
|
|
308
|
+
let fY = bitcast<u32>(pi.x);
|
|
309
|
+
let he = fY >> 30u;
|
|
310
|
+
let blasOffset = i32(fY & 0x3fffffffu);
|
|
311
|
+
let bw = rtUniform.blasOffset;
|
|
313
312
|
|
|
314
313
|
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
|
|
315
|
-
if (
|
|
314
|
+
if (he == 3u) {
|
|
316
315
|
|
|
317
316
|
|
|
318
317
|
|
|
319
318
|
|
|
320
|
-
var
|
|
321
|
-
var
|
|
322
|
-
var
|
|
323
|
-
var kZ = 0u;
|
|
319
|
+
var qj = -1;
|
|
320
|
+
var td = 0u;
|
|
321
|
+
var lJ = 0u;
|
|
324
322
|
|
|
325
|
-
var
|
|
326
|
-
let
|
|
323
|
+
var eD = 0x80000000u;
|
|
324
|
+
let vU = select(0u, 4u, d.x < 0.0)
|
|
327
325
|
| select(0u, 2u, d.y < 0.0)
|
|
328
326
|
| select(0u, 1u, d.z < 0.0);
|
|
329
|
-
let
|
|
327
|
+
let rn = 7u - vU;
|
|
330
328
|
|
|
331
329
|
|
|
332
330
|
|
|
333
331
|
|
|
334
|
-
while (
|
|
335
|
-
|
|
332
|
+
while (td < 4096u) {
|
|
333
|
+
td++;
|
|
336
334
|
|
|
337
|
-
let internalMask =
|
|
338
|
-
let
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
if ((
|
|
342
|
-
|
|
335
|
+
let internalMask = eD & 0xffu;
|
|
336
|
+
let ri =
|
|
337
|
+
lb(eD >> 24u) + 24u;
|
|
338
|
+
eD &= ~(1u << ri);
|
|
339
|
+
if ((eD & 0xff000000u) != 0u) {
|
|
340
|
+
qj++;
|
|
343
341
|
|
|
344
|
-
|
|
342
|
+
tD[qj] = vec2u(lJ, eD);
|
|
345
343
|
}
|
|
346
344
|
|
|
347
|
-
let slot = (
|
|
348
|
-
let
|
|
349
|
-
let relativeIndex = countOneBits(internalMask &
|
|
350
|
-
let
|
|
351
|
-
let node = blasOffset + i32(
|
|
352
|
-
let
|
|
353
|
-
let
|
|
354
|
-
node,
|
|
345
|
+
let slot = (ri - 24u) ^ rn;
|
|
346
|
+
let om = (1u << slot) - 1u;
|
|
347
|
+
let relativeIndex = countOneBits(internalMask & om);
|
|
348
|
+
let tA = lJ + relativeIndex;
|
|
349
|
+
let node = blasOffset + i32(tA * 5u);
|
|
350
|
+
let jZ = bvhBuffer[node + bw];
|
|
351
|
+
let vG = pj(
|
|
352
|
+
node, bw, jZ, o, gr, tMax
|
|
355
353
|
);
|
|
356
354
|
|
|
357
355
|
|
|
358
|
-
|
|
359
|
-
if (
|
|
360
|
-
let
|
|
361
|
-
let
|
|
362
|
-
var
|
|
363
|
-
var
|
|
364
|
-
while (
|
|
365
|
-
let
|
|
366
|
-
|
|
367
|
-
let
|
|
368
|
-
bitcast<u32>(
|
|
369
|
-
bitcast<u32>(
|
|
370
|
-
|
|
356
|
+
eD = 0u;
|
|
357
|
+
if (vG != 0u) {
|
|
358
|
+
let fU = bvhBuffer[node + bw + 1];
|
|
359
|
+
let sP = bitcast<u32>(jZ.w) >> 24u;
|
|
360
|
+
var uO = 0u;
|
|
361
|
+
var kM = vG;
|
|
362
|
+
while (kM != 0u) {
|
|
363
|
+
let sC = lb(kM);
|
|
364
|
+
kM &= ~(1u << sC);
|
|
365
|
+
let tT = select(
|
|
366
|
+
bitcast<u32>(fU.z),
|
|
367
|
+
bitcast<u32>(fU.w),
|
|
368
|
+
sC >= 4u
|
|
371
369
|
);
|
|
372
|
-
let
|
|
373
|
-
(
|
|
374
|
-
let
|
|
375
|
-
let
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
370
|
+
let uB =
|
|
371
|
+
(tT >> ((sC & 3u) * 8u)) & 0xffu;
|
|
372
|
+
let kb = uB & 0x1fu;
|
|
373
|
+
let wK = select(
|
|
374
|
+
kb,
|
|
375
|
+
kb ^ rn,
|
|
376
|
+
kb >= 24u
|
|
379
377
|
);
|
|
380
|
-
let
|
|
381
|
-
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
let
|
|
387
|
-
var
|
|
388
|
-
while (
|
|
389
|
-
let
|
|
390
|
-
|
|
391
|
-
let
|
|
392
|
-
let primitiveOffset =
|
|
393
|
-
+ i32(
|
|
378
|
+
let wt = (uB >> 5u) & 0x7u;
|
|
379
|
+
uO |= wt << wK;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
lJ = bitcast<u32>(fU.x);
|
|
383
|
+
eD = (uO & 0xff000000u) | sP;
|
|
384
|
+
let pM = bitcast<u32>(fU.y);
|
|
385
|
+
var pN = uO & 0x00ffffffu;
|
|
386
|
+
while (pN != 0u) {
|
|
387
|
+
let oO = oT(pN);
|
|
388
|
+
pN &= ~(1u << oO);
|
|
389
|
+
let primitiveCount = 1;
|
|
390
|
+
let primitiveOffset = bw + blasOffset
|
|
391
|
+
+ i32(pM + oO);
|
|
394
392
|
${intersectTriangles}
|
|
395
393
|
}
|
|
396
394
|
}
|
|
397
395
|
|
|
398
|
-
if ((
|
|
399
|
-
if (
|
|
400
|
-
let
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
396
|
+
if ((eD & 0xff000000u) != 0u) { continue; }
|
|
397
|
+
if (qj >= 0) {
|
|
398
|
+
let ro = tD[qj];
|
|
399
|
+
lJ = ro.x;
|
|
400
|
+
eD = ro.y;
|
|
401
|
+
qj--;
|
|
404
402
|
}
|
|
405
403
|
else { break; }
|
|
406
404
|
}
|
|
407
405
|
}
|
|
408
406
|
` : ''}
|
|
409
407
|
|
|
410
|
-
var
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
dS = 0;
|
|
408
|
+
var eh = -1;
|
|
409
|
+
if (he != 3u) {
|
|
410
|
+
eh = 0;
|
|
414
411
|
|
|
415
|
-
|
|
412
|
+
gJ[0] = wL;
|
|
416
413
|
}
|
|
417
414
|
|
|
418
|
-
while (
|
|
415
|
+
while (eh >= 0) {
|
|
419
416
|
|
|
420
|
-
let node =
|
|
421
|
-
|
|
422
|
-
var
|
|
417
|
+
let node = gJ[eh];
|
|
418
|
+
eh--;
|
|
419
|
+
var primitiveCount = 0;
|
|
423
420
|
var primitiveOffset = 0;
|
|
424
421
|
|
|
425
422
|
${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
|
|
426
|
-
if (
|
|
427
|
-
let i = node +
|
|
428
|
-
let
|
|
429
|
-
let
|
|
430
|
-
let
|
|
431
|
-
let
|
|
432
|
-
|
|
433
|
-
if (
|
|
434
|
-
primitiveOffset =
|
|
435
|
-
+ i32(bitcast<u32>(
|
|
423
|
+
if (he == 2u) {
|
|
424
|
+
let i = node + bw;
|
|
425
|
+
let wP = bvhBuffer[i];
|
|
426
|
+
let wQ = bvhBuffer[i + 1];
|
|
427
|
+
let wR = bvhBuffer[i + 2];
|
|
428
|
+
let wS = bvhBuffer[i + 3];
|
|
429
|
+
primitiveCount = i32(bitcast<u32>(wR.w));
|
|
430
|
+
if (primitiveCount > 0) {
|
|
431
|
+
primitiveOffset = bw + blasOffset
|
|
432
|
+
+ i32(bitcast<u32>(wS.w));
|
|
436
433
|
}
|
|
437
434
|
else {
|
|
438
|
-
let left = blasOffset + i32(bitcast<u32>(
|
|
439
|
-
let right = blasOffset + i32(bitcast<u32>(
|
|
440
|
-
let
|
|
441
|
-
o,
|
|
435
|
+
let left = blasOffset + i32(bitcast<u32>(wP.w) * 4u);
|
|
436
|
+
let right = blasOffset + i32(bitcast<u32>(wQ.w) * 4u);
|
|
437
|
+
let pm = cU(
|
|
438
|
+
o, wP.xyz, wQ.xyz, gr, tMax
|
|
442
439
|
);
|
|
443
|
-
let
|
|
444
|
-
o,
|
|
440
|
+
let oq = cU(
|
|
441
|
+
o, wR.xyz, wS.xyz, gr, tMax
|
|
445
442
|
);
|
|
446
|
-
if (
|
|
447
|
-
if (
|
|
448
|
-
|
|
443
|
+
if (pm > oq) {
|
|
444
|
+
if (pm > 0.0) {
|
|
445
|
+
eh++; gJ[eh] = left;
|
|
449
446
|
}
|
|
450
|
-
if (
|
|
451
|
-
|
|
447
|
+
if (oq > 0.0) {
|
|
448
|
+
eh++; gJ[eh] = right;
|
|
452
449
|
}
|
|
453
450
|
}
|
|
454
451
|
else {
|
|
455
|
-
if (
|
|
456
|
-
|
|
452
|
+
if (oq > 0.0) {
|
|
453
|
+
eh++; gJ[eh] = right;
|
|
457
454
|
}
|
|
458
|
-
if (
|
|
459
|
-
|
|
455
|
+
if (pm > 0.0) {
|
|
456
|
+
eh++; gJ[eh] = left;
|
|
460
457
|
}
|
|
461
458
|
}
|
|
462
459
|
}
|
|
463
460
|
}
|
|
464
461
|
` : ''}
|
|
465
462
|
${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
|
|
466
|
-
if (
|
|
467
|
-
let
|
|
468
|
-
if ((
|
|
469
|
-
|
|
470
|
-
primitiveOffset =
|
|
471
|
-
+ i32(
|
|
463
|
+
if (he == 1u) {
|
|
464
|
+
let iw = bitcast<u32>(node);
|
|
465
|
+
if ((iw & 0x80000000u) != 0u) {
|
|
466
|
+
primitiveCount = i32((iw >> 23u) & 0xffu);
|
|
467
|
+
primitiveOffset = bw + blasOffset
|
|
468
|
+
+ i32(iw & 0x007fffffu);
|
|
472
469
|
}
|
|
473
470
|
else {
|
|
474
|
-
let i = node +
|
|
475
|
-
let
|
|
476
|
-
let
|
|
477
|
-
let
|
|
478
|
-
let
|
|
479
|
-
let nodeMin =
|
|
480
|
-
let
|
|
481
|
-
let
|
|
482
|
-
bitcast<u32>(
|
|
483
|
-
bitcast<u32>(
|
|
471
|
+
let i = node + bw;
|
|
472
|
+
let vJ = bvhBuffer[i];
|
|
473
|
+
let sz = bvhBuffer[i + 1];
|
|
474
|
+
let qR = bvhBuffer[i + 2];
|
|
475
|
+
let oQ = bvhBuffer[i + 3];
|
|
476
|
+
let nodeMin = vJ.xyz;
|
|
477
|
+
let er = vec3f(vJ.w, sz.x, sz.y);
|
|
478
|
+
let mT = array<u32, 4>(
|
|
479
|
+
bitcast<u32>(sz.z), bitcast<u32>(sz.w),
|
|
480
|
+
bitcast<u32>(qR.x), bitcast<u32>(qR.y)
|
|
484
481
|
);
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
let
|
|
488
|
-
let
|
|
489
|
-
let
|
|
490
|
-
let
|
|
491
|
-
let
|
|
492
|
-
let
|
|
493
|
-
let
|
|
494
|
-
let
|
|
495
|
-
let
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
(
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
let negative = gr < vec3f(0.0);
|
|
485
|
+
let wn = unpack4x8unorm(bitcast<u32>(select(qR.z, oQ.y, negative.x)));
|
|
486
|
+
let xt = unpack4x8unorm(bitcast<u32>(select(oQ.y, qR.z, negative.x)));
|
|
487
|
+
let wo = unpack4x8unorm(bitcast<u32>(select(qR.w, oQ.z, negative.y)));
|
|
488
|
+
let xu = unpack4x8unorm(bitcast<u32>(select(oQ.z, qR.w, negative.y)));
|
|
489
|
+
let wp = unpack4x8unorm(bitcast<u32>(select(oQ.x, oQ.w, negative.z)));
|
|
490
|
+
let xv = unpack4x8unorm(bitcast<u32>(select(oQ.w, oQ.x, negative.z)));
|
|
491
|
+
let padding = fk(gr, o);
|
|
492
|
+
let nJ = max(
|
|
493
|
+
max(
|
|
494
|
+
(nodeMin.x + wn * er.x - o.x) * gr.x - vec4f(padding.x),
|
|
495
|
+
(nodeMin.y + wo * er.y - o.y) * gr.y - vec4f(padding.y)
|
|
496
|
+
),
|
|
497
|
+
(nodeMin.z + wp * er.z - o.z) * gr.z - vec4f(padding.z)
|
|
501
498
|
);
|
|
502
|
-
let
|
|
503
|
-
min(
|
|
504
|
-
(
|
|
499
|
+
let sY = min(
|
|
500
|
+
min(
|
|
501
|
+
(nodeMin.x + xt * er.x - o.x) * gr.x + vec4f(padding.x),
|
|
502
|
+
(nodeMin.y + xu * er.y - o.y) * gr.y + vec4f(padding.y)
|
|
503
|
+
),
|
|
504
|
+
(nodeMin.z + xv * er.z - o.z) * gr.z + vec4f(padding.z)
|
|
505
505
|
);
|
|
506
|
-
var distance = select(
|
|
506
|
+
var distance = select(sY, nJ, nJ > vec4f(0.0));
|
|
507
507
|
distance = select(
|
|
508
508
|
distance,
|
|
509
509
|
vec4f(-1.0),
|
|
510
|
-
|
|
510
|
+
nJ > min(sY, vec4f(tMax))
|
|
511
511
|
);
|
|
512
|
-
var
|
|
512
|
+
var fq = array<f32, 4>(
|
|
513
513
|
distance.x,
|
|
514
514
|
distance.y,
|
|
515
515
|
distance.z,
|
|
@@ -518,83 +518,83 @@ distance.w
|
|
|
518
518
|
|
|
519
519
|
|
|
520
520
|
for (var order = 0; order < 4; order++) {
|
|
521
|
-
var
|
|
522
|
-
var
|
|
521
|
+
var em = -1.0;
|
|
522
|
+
var eB = -1;
|
|
523
523
|
for (var child = 0; child < 4; child++) {
|
|
524
524
|
if (
|
|
525
|
-
|
|
526
|
-
|
|
525
|
+
mT[child] != 0u &&
|
|
526
|
+
fq[child] > em
|
|
527
527
|
) {
|
|
528
|
-
|
|
529
|
-
|
|
528
|
+
em = fq[child];
|
|
529
|
+
eB = child;
|
|
530
530
|
}
|
|
531
531
|
}
|
|
532
|
-
if (
|
|
533
|
-
let
|
|
534
|
-
var
|
|
535
|
-
if ((
|
|
536
|
-
|
|
532
|
+
if (eB >= 0 && em > 0.0) {
|
|
533
|
+
let oy = mT[eB];
|
|
534
|
+
var ki = bitcast<i32>(oy);
|
|
535
|
+
if ((oy & 0x80000000u) == 0u) {
|
|
536
|
+
ki += blasOffset;
|
|
537
537
|
}
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
538
|
+
eh++;
|
|
539
|
+
gJ[eh] = ki;
|
|
540
|
+
fq[eB] = -1.0;
|
|
541
541
|
}
|
|
542
542
|
}
|
|
543
543
|
}
|
|
544
544
|
}
|
|
545
545
|
` : ''}
|
|
546
546
|
${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
|
|
547
|
-
if (
|
|
548
|
-
let i = node +
|
|
547
|
+
if (he == 0u) {
|
|
548
|
+
let i = node + bw;
|
|
549
549
|
let r1 = bvhBuffer[i];
|
|
550
|
-
let
|
|
550
|
+
let bl = bitcast<i32>(r1.w);
|
|
551
551
|
|
|
552
|
-
if (
|
|
552
|
+
if (bl >= 0) {
|
|
553
553
|
let left = node + 2;
|
|
554
|
-
let right =
|
|
555
|
-
let d0 =
|
|
554
|
+
let right = bl + blasOffset;
|
|
555
|
+
let d0 = cU(
|
|
556
556
|
o,
|
|
557
|
-
bvhBuffer[left +
|
|
558
|
-
bvhBuffer[left + 1 +
|
|
559
|
-
|
|
557
|
+
bvhBuffer[left + bw].xyz,
|
|
558
|
+
bvhBuffer[left + 1 + bw].xyz,
|
|
559
|
+
gr,
|
|
560
560
|
tMax
|
|
561
561
|
);
|
|
562
|
-
let d1 =
|
|
562
|
+
let d1 = cU(
|
|
563
563
|
o,
|
|
564
|
-
bvhBuffer[right +
|
|
565
|
-
bvhBuffer[right + 1 +
|
|
566
|
-
|
|
564
|
+
bvhBuffer[right + bw].xyz,
|
|
565
|
+
bvhBuffer[right + 1 + bw].xyz,
|
|
566
|
+
gr,
|
|
567
567
|
tMax
|
|
568
568
|
);
|
|
569
569
|
|
|
570
570
|
if (d0 > d1) {
|
|
571
571
|
if (d0 > 0.0) {
|
|
572
|
-
|
|
572
|
+
eh++; gJ[eh] = left;
|
|
573
573
|
|
|
574
574
|
}
|
|
575
575
|
if (d1 > 0.0) {
|
|
576
|
-
|
|
576
|
+
eh++; gJ[eh] = right;
|
|
577
577
|
|
|
578
578
|
}
|
|
579
579
|
}
|
|
580
580
|
else {
|
|
581
581
|
if (d1 > 0.0) {
|
|
582
|
-
|
|
582
|
+
eh++; gJ[eh] = right;
|
|
583
583
|
|
|
584
584
|
}
|
|
585
585
|
if (d0 > 0.0) {
|
|
586
|
-
|
|
586
|
+
eh++; gJ[eh] = left;
|
|
587
587
|
|
|
588
588
|
}
|
|
589
589
|
}
|
|
590
590
|
}
|
|
591
591
|
else {
|
|
592
|
-
|
|
592
|
+
primitiveCount = -bl;
|
|
593
593
|
primitiveOffset = i + 2;
|
|
594
594
|
}
|
|
595
595
|
}
|
|
596
596
|
` : ''}
|
|
597
|
-
if (
|
|
597
|
+
if (primitiveCount > 0) {
|
|
598
598
|
${intersectTriangles}
|
|
599
599
|
}
|
|
600
600
|
}
|
|
@@ -604,19 +604,221 @@ ${intersectTriangles}
|
|
|
604
604
|
|
|
605
605
|
`;
|
|
606
606
|
}
|
|
607
|
-
|
|
607
|
+
// Raw first-hit contract for native diagnostics. Reuse the same traversal and
|
|
608
|
+
// triangle tests without surface completion or any integrator/alpha sampling.
|
|
609
|
+
export function createSceneHitQueryWgsl(hasAnisotropyDirections = false) {
|
|
610
|
+
return /* wgsl */ `
|
|
611
|
+
struct rd {
|
|
612
|
+
hit: bool, instance: i32, record: i32, t: f32, barycentric: vec3f,
|
|
613
|
+
}
|
|
614
|
+
fn vW(ray: Ray) -> rd {
|
|
615
|
+
var result: rd;
|
|
616
|
+
result.instance = -1; result.record = -1; result.t = RAY_MAX_DISTANCE;
|
|
617
|
+
if (rtUniform.isEmpty > 0) { return result; }
|
|
618
|
+
let bounces = 0;
|
|
619
|
+
let doubleSided = false;
|
|
620
|
+
let jA = false;
|
|
621
|
+
let fV = -1;
|
|
622
|
+
var tMax = RAY_MAX_DISTANCE;
|
|
623
|
+
var eq: i32;
|
|
624
|
+
var gY: vec3f;
|
|
625
|
+
${getBVHTraverseCode(`
|
|
626
|
+
result.hit = true; result.instance = bY; result.record = triangleIndex;
|
|
627
|
+
result.t = tMax; result.barycentric = aC;
|
|
628
|
+
`, false, false, 1, hasAnisotropyDirections)}
|
|
629
|
+
return result;
|
|
630
|
+
}
|
|
631
|
+
`;
|
|
632
|
+
}
|
|
633
|
+
export function createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, closestName = 'intersectScene', shadowName = 'intersectSceneShadow', bevelName = 'intersectSceneBevel', closestHitHook = '' }) {
|
|
634
|
+
return /* wgsl */ `
|
|
635
|
+
fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool, jA: bool) {
|
|
636
|
+
|
|
637
|
+
(*si).hit = false;
|
|
638
|
+
|
|
639
|
+
if (rtUniform.isEmpty > 0) {
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
var tMax = RAY_MAX_DISTANCE;
|
|
644
|
+
var eq: i32;
|
|
645
|
+
var gY: vec3f;
|
|
646
|
+
|
|
647
|
+
var hK: vec3i;
|
|
648
|
+
var mk: fP;
|
|
649
|
+
var ap: i32;
|
|
650
|
+
var fV: i32 = (*si).triangleIndex;
|
|
651
|
+
|
|
652
|
+
${getBVHTraverseCode(`
|
|
653
|
+
(*si).triangleIndex = triangleIndex;
|
|
654
|
+
mk = tri;
|
|
655
|
+
hK = index;
|
|
656
|
+
ap = bY;
|
|
657
|
+
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
|
|
658
|
+
|
|
659
|
+
${closestHitHook} if (sj) {
|
|
660
|
+
mV(
|
|
661
|
+
si,
|
|
662
|
+
mk,
|
|
663
|
+
aC,
|
|
664
|
+
hK,
|
|
665
|
+
bZ,
|
|
666
|
+
ap,
|
|
667
|
+
eL,
|
|
668
|
+
fi,
|
|
669
|
+
-1
|
|
670
|
+
);
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
fn ${bevelName}(ray: Ray, si: ptr<function, SurfaceInteraction>, instanceIndex: i32, maxDistance: f32) {
|
|
676
|
+
(*si).hit = false;
|
|
677
|
+
|
|
678
|
+
if (rtUniform.isEmpty > 0) {
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
let bounces = 0;
|
|
683
|
+
let doubleSided = true;
|
|
684
|
+
let jA = false;
|
|
685
|
+
var tMax = maxDistance;
|
|
686
|
+
var eq: i32;
|
|
687
|
+
var gY: vec3f;
|
|
688
|
+
var hK: vec3i;
|
|
689
|
+
var mk: fP;
|
|
690
|
+
var ap: i32;
|
|
691
|
+
var fV: i32 = -1;
|
|
692
|
+
|
|
693
|
+
${getBVHTraverseCode(`
|
|
694
|
+
(*si).triangleIndex = triangleIndex;
|
|
695
|
+
mk = tri;
|
|
696
|
+
hK = index;
|
|
697
|
+
ap = bY;
|
|
698
|
+
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
|
|
699
|
+
if (bY != instanceIndex) {
|
|
700
|
+
continue;
|
|
701
|
+
}
|
|
702
|
+
`)}
|
|
703
|
+
|
|
704
|
+
if (sj) {
|
|
705
|
+
(*si).instanceIndex = ap;
|
|
706
|
+
(*si).normal = eL;
|
|
707
|
+
(*si).position = fi;
|
|
708
|
+
(*si).materialIndex = i32(ah(bitcast<i32>(instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE}].z)).x);
|
|
709
|
+
hH(
|
|
710
|
+
si,
|
|
711
|
+
mk,
|
|
712
|
+
aC,
|
|
713
|
+
hK,
|
|
714
|
+
bZ,
|
|
715
|
+
-1
|
|
716
|
+
);
|
|
717
|
+
|
|
718
|
+
let l2w = mat4x4<f32>(
|
|
719
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 5],
|
|
720
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 6],
|
|
721
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 7],
|
|
722
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 8]
|
|
723
|
+
);
|
|
724
|
+
let w2l = mat4x4<f32>(
|
|
725
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
726
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
727
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
728
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
729
|
+
);
|
|
730
|
+
let aH = transpose(mat3x3<f32>(
|
|
731
|
+
w2l[0].xyz,
|
|
732
|
+
w2l[1].xyz,
|
|
733
|
+
w2l[2].xyz
|
|
734
|
+
));
|
|
735
|
+
(*si).faceNormal = normalize(aH * eL);
|
|
736
|
+
(*si).vertexNormal = normalize(aH * (*si).vertexNormal);
|
|
737
|
+
(*si).normal = normalize(aH * (*si).normal);
|
|
738
|
+
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
|
|
739
|
+
if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
|
|
740
|
+
(*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
|
|
741
|
+
}
|
|
742
|
+
${hasAnisotropyDirections ? /* wgsl */ `
|
|
743
|
+
(*si).directionTangent = (l2w * vec4f((*si).directionTangent, 0.0)).xyz;
|
|
744
|
+
(*si).directionBitangent = (l2w * vec4f((*si).directionBitangent, 0.0)).xyz;
|
|
745
|
+
(*si).geometryTangent = (l2w * vec4f((*si).geometryTangent, 0.0)).xyz;
|
|
746
|
+
(*si).geometryBitangent = (l2w * vec4f((*si).geometryBitangent, 0.0)).xyz;
|
|
747
|
+
` : /* wgsl */ ``}
|
|
748
|
+
(*si).shadowOffset = (l2w * vec4f((*si).shadowOffset, 0.0)).xyz;
|
|
749
|
+
(*si).position = (l2w * vec4((*si).position, 1.0)).xyz;
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
fn ${shadowName}(ray: Ray, lightDistance: f32, kn: i32) -> bool {
|
|
754
|
+
if (rtUniform.isEmpty > 0) {
|
|
755
|
+
return false;
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
let doubleSided = true;
|
|
759
|
+
let rq = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
760
|
+
var tMax = rq;
|
|
761
|
+
var eq: i32;
|
|
762
|
+
var gY: vec3f;
|
|
763
|
+
|
|
764
|
+
let bounces = 1;
|
|
765
|
+
var jA = false;
|
|
766
|
+
var fV: i32 = kn;
|
|
767
|
+
|
|
768
|
+
${getBVHTraverseCode(
|
|
769
|
+
/*wgsl */ `
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
var jS = true;
|
|
774
|
+
|
|
775
|
+
if (jS) {
|
|
776
|
+
if (HAS_ALPHA) {
|
|
777
|
+
let materialIndex = i32(ah(bitcast<i32>(pi.z)).x);
|
|
778
|
+
if (!oC(
|
|
779
|
+
materialIndex,
|
|
780
|
+
index,
|
|
781
|
+
aC,
|
|
782
|
+
fi,
|
|
783
|
+
eL
|
|
784
|
+
)) {
|
|
785
|
+
|
|
786
|
+
tMax = rq;
|
|
787
|
+
jS = false;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
if (jS) {
|
|
792
|
+
return true;
|
|
793
|
+
}
|
|
794
|
+
`, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
|
|
795
|
+
|
|
796
|
+
return false;
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
`;
|
|
800
|
+
}
|
|
801
|
+
export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, sceneIntersections = '' }) {
|
|
608
802
|
return /*wgsl*/ `
|
|
609
803
|
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
|
|
807
|
+
|
|
808
|
+
var<private> mK: array<i32, TLAS_STACK_SIZE>;
|
|
809
|
+
var<private> gJ: array<i32, BLAS_STACK_SIZE>;
|
|
810
|
+
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `var<private> tD: array<vec2u, BLAS_STACK_SIZE>;` : ''}
|
|
811
|
+
|
|
610
812
|
${hasDisplacement ? displacementWgsl : ''}
|
|
611
813
|
${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
|
|
612
814
|
|
|
613
|
-
struct
|
|
815
|
+
struct fP {
|
|
614
816
|
p0: vec3f,
|
|
615
817
|
p1: vec3f,
|
|
616
818
|
p2: vec3f,
|
|
617
819
|
};
|
|
618
820
|
|
|
619
|
-
fn
|
|
821
|
+
fn hL(rad: f32, pos: vec3f, r: Ray) -> f32 {
|
|
620
822
|
let op: vec3f = pos - r.o;
|
|
621
823
|
let eps: f32 = 0.001;
|
|
622
824
|
let b: f32 = dot(op, r.d);
|
|
@@ -639,7 +841,7 @@ return t2;
|
|
|
639
841
|
return INF;
|
|
640
842
|
}
|
|
641
843
|
|
|
642
|
-
fn
|
|
844
|
+
fn og(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
|
|
643
845
|
let dt: f32 = dot(r.d, n);
|
|
644
846
|
let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
645
847
|
|
|
@@ -659,14 +861,14 @@ return INF;
|
|
|
659
861
|
}
|
|
660
862
|
|
|
661
863
|
fn sphereSolidAnglePdf(origin: vec3f, center: vec3f, radius: f32) -> f32 {
|
|
662
|
-
let
|
|
663
|
-
if (
|
|
664
|
-
let
|
|
665
|
-
let cosThetaMax = sqrt(max(0.0, 1.0 -
|
|
864
|
+
let ak = distance(origin, center);
|
|
865
|
+
if (ak <= radius) { return INV4PI; }
|
|
866
|
+
let jV = min(1.0, radius * radius / (ak * ak));
|
|
867
|
+
let cosThetaMax = sqrt(max(0.0, 1.0 - jV));
|
|
666
868
|
return 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
|
|
667
869
|
}
|
|
668
870
|
|
|
669
|
-
fn
|
|
871
|
+
fn nr(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
|
|
670
872
|
|
|
671
873
|
|
|
672
874
|
var d: f32 = INF;
|
|
@@ -678,9 +880,9 @@ var d: f32 = INF;
|
|
|
678
880
|
(*lightSample).isDelta = false;
|
|
679
881
|
var u = light.u;
|
|
680
882
|
var v = light.v;
|
|
681
|
-
var
|
|
883
|
+
var ec = i32(light.litType);
|
|
682
884
|
|
|
683
|
-
if (
|
|
885
|
+
if (HAS_SCENE_RECT_LIGHT && ec == RECT_LIGHT) {
|
|
684
886
|
|
|
685
887
|
var pos = light.position - u * 0.5 - v * 0.5;
|
|
686
888
|
var normal = normalize(cross(u, v));
|
|
@@ -688,18 +890,18 @@ if (dot(normal, r.d) > 0.0) {
|
|
|
688
890
|
return INF;
|
|
689
891
|
}
|
|
690
892
|
|
|
691
|
-
d =
|
|
893
|
+
d = og(pos, u, v, normal, r);
|
|
692
894
|
if (d < 0.0) {
|
|
693
895
|
d = INF;
|
|
694
896
|
}
|
|
695
897
|
else {
|
|
696
|
-
var
|
|
898
|
+
var ci: f32 = dot(-r.d, normal);
|
|
697
899
|
let spread = light.radiusOrSpread;
|
|
698
|
-
if (
|
|
900
|
+
if (ci >= cos(spread * PI / 2.0)) {
|
|
699
901
|
(*lightSample).direction = r.d;
|
|
700
902
|
(*lightSample).normal = normal;
|
|
701
903
|
(*lightSample).dist = d;
|
|
702
|
-
(*lightSample).pdf = (d * d) / (light.area *
|
|
904
|
+
(*lightSample).pdf = (d * d) / (light.area * ci);
|
|
703
905
|
(*lightSample).emission = light.emission;
|
|
704
906
|
(*lightSample).isDelta = false;
|
|
705
907
|
}
|
|
@@ -709,12 +911,12 @@ d = INF;
|
|
|
709
911
|
}
|
|
710
912
|
}
|
|
711
913
|
|
|
712
|
-
else if (
|
|
914
|
+
else if (HAS_SCENE_SPHERE_LIGHT && ec == SPHERE_LIGHT) {
|
|
713
915
|
if (light.radiusOrSpread <= 0.0) {
|
|
714
|
-
let
|
|
715
|
-
let projection = dot(
|
|
716
|
-
let
|
|
717
|
-
if (projection <= EPS || dot(
|
|
916
|
+
let kT = light.position - r.o;
|
|
917
|
+
let projection = dot(kT, r.d);
|
|
918
|
+
let bk = kT - projection * r.d;
|
|
919
|
+
if (projection <= EPS || dot(bk, bk) > 1e-8) {
|
|
718
920
|
return INF;
|
|
719
921
|
}
|
|
720
922
|
d = projection;
|
|
@@ -725,7 +927,7 @@ d = projection;
|
|
|
725
927
|
(*lightSample).isDelta = true;
|
|
726
928
|
}
|
|
727
929
|
else {
|
|
728
|
-
d =
|
|
930
|
+
d = hL(light.radiusOrSpread, light.position, r);
|
|
729
931
|
(*lightSample).isDelta = false;
|
|
730
932
|
if (d > 0.0 && d != INF) {
|
|
731
933
|
(*lightSample).direction = r.d;
|
|
@@ -754,12 +956,12 @@ light.radiusOrSpread <= 0.0
|
|
|
754
956
|
}
|
|
755
957
|
}
|
|
756
958
|
|
|
757
|
-
else if (
|
|
959
|
+
else if (HAS_SCENE_SPOT_LIGHT && ec == SPOT_LIGHT) {
|
|
758
960
|
if (light.radiusOrSpread <= 0.0) {
|
|
759
|
-
let
|
|
760
|
-
let projection = dot(
|
|
761
|
-
let
|
|
762
|
-
if (projection <= EPS || dot(
|
|
961
|
+
let kT = light.position - r.o;
|
|
962
|
+
let projection = dot(kT, r.d);
|
|
963
|
+
let bk = kT - projection * r.d;
|
|
964
|
+
if (projection <= EPS || dot(bk, bk) > 1e-8) {
|
|
763
965
|
return INF;
|
|
764
966
|
}
|
|
765
967
|
d = projection;
|
|
@@ -770,13 +972,13 @@ d = projection;
|
|
|
770
972
|
(*lightSample).isDelta = true;
|
|
771
973
|
}
|
|
772
974
|
else {
|
|
773
|
-
d =
|
|
975
|
+
d = hL(light.radiusOrSpread, light.position, r);
|
|
774
976
|
(*lightSample).isDelta = false;
|
|
775
977
|
}
|
|
776
978
|
if (d != INF) {
|
|
777
|
-
let
|
|
778
|
-
let
|
|
779
|
-
if (
|
|
979
|
+
let wW = r.o + d * r.d;
|
|
980
|
+
let nv = bP(light, normalize(r.o - wW));
|
|
981
|
+
if (nv <= 0.0) { return INF; }
|
|
780
982
|
if (light.radiusOrSpread > 0.0) {
|
|
781
983
|
(*lightSample).direction = r.d;
|
|
782
984
|
(*lightSample).dist = d;
|
|
@@ -785,7 +987,7 @@ r.o + r.d * d - light.position
|
|
|
785
987
|
);
|
|
786
988
|
(*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
|
|
787
989
|
}
|
|
788
|
-
(*lightSample).emission = light.emission *
|
|
990
|
+
(*lightSample).emission = light.emission * nv * select(
|
|
789
991
|
1.0,
|
|
790
992
|
1.0 / max(d * d, 1e-8),
|
|
791
993
|
light.radiusOrSpread <= 0.0
|
|
@@ -793,7 +995,7 @@ light.radiusOrSpread <= 0.0
|
|
|
793
995
|
}
|
|
794
996
|
}
|
|
795
997
|
|
|
796
|
-
else if (
|
|
998
|
+
else if (ec != RECT_LIGHT && ec != SPHERE_LIGHT && ec != SPOT_LIGHT) {
|
|
797
999
|
|
|
798
1000
|
d = INF;
|
|
799
1001
|
}
|
|
@@ -801,111 +1003,111 @@ d = INF;
|
|
|
801
1003
|
return d;
|
|
802
1004
|
}
|
|
803
1005
|
|
|
804
|
-
fn
|
|
805
|
-
let m00 =
|
|
806
|
-
let m01 =
|
|
807
|
-
let m02 =
|
|
808
|
-
let m10 =
|
|
809
|
-
let m11 =
|
|
810
|
-
let m12 =
|
|
811
|
-
let m20 =
|
|
812
|
-
let m21 =
|
|
813
|
-
let m22 =
|
|
814
|
-
var w00 = m00.y *
|
|
815
|
-
var w01 = m01.y *
|
|
816
|
-
var w02 = m02.y *
|
|
817
|
-
var w10 = m10.y *
|
|
818
|
-
var w11 = m11.y *
|
|
819
|
-
var w12 = m12.y *
|
|
820
|
-
var w20 = m20.y *
|
|
821
|
-
var w21 = m21.y *
|
|
822
|
-
var w22 = m22.y *
|
|
823
|
-
|
|
824
|
-
var
|
|
825
|
-
|
|
826
|
-
w00 = w00 /
|
|
827
|
-
w01 = w01 /
|
|
828
|
-
w02 = w02 /
|
|
829
|
-
w10 = w10 /
|
|
830
|
-
w11 = w11 /
|
|
831
|
-
w12 = w12 /
|
|
832
|
-
w20 = w20 /
|
|
833
|
-
w21 = w21 /
|
|
834
|
-
w22 = w22 /
|
|
835
|
-
|
|
836
|
-
let rand =
|
|
837
|
-
var
|
|
1006
|
+
fn fF(m0: vec3i, m1: vec3i, m2: vec3i, eU: vec3f) -> i32 {
|
|
1007
|
+
let m00 = ah(m0.x);
|
|
1008
|
+
let m01 = ah(m0.y);
|
|
1009
|
+
let m02 = ah(m0.z);
|
|
1010
|
+
let m10 = ah(m1.x);
|
|
1011
|
+
let m11 = ah(m1.y);
|
|
1012
|
+
let m12 = ah(m1.z);
|
|
1013
|
+
let m20 = ah(m2.x);
|
|
1014
|
+
let m21 = ah(m2.y);
|
|
1015
|
+
let m22 = ah(m2.z);
|
|
1016
|
+
var w00 = m00.y * eU.x;
|
|
1017
|
+
var w01 = m01.y * eU.x;
|
|
1018
|
+
var w02 = m02.y * eU.x;
|
|
1019
|
+
var w10 = m10.y * eU.y;
|
|
1020
|
+
var w11 = m11.y * eU.y;
|
|
1021
|
+
var w12 = m12.y * eU.y;
|
|
1022
|
+
var w20 = m20.y * eU.z;
|
|
1023
|
+
var w21 = m21.y * eU.z;
|
|
1024
|
+
var w22 = m22.y * eU.z;
|
|
1025
|
+
|
|
1026
|
+
var hy = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
1027
|
+
|
|
1028
|
+
w00 = w00 / hy;
|
|
1029
|
+
w01 = w01 / hy + w00;
|
|
1030
|
+
w02 = w02 / hy + w01;
|
|
1031
|
+
w10 = w10 / hy + w02;
|
|
1032
|
+
w11 = w11 / hy + w10;
|
|
1033
|
+
w12 = w12 / hy + w11;
|
|
1034
|
+
w20 = w20 / hy + w12;
|
|
1035
|
+
w21 = w21 / hy + w20;
|
|
1036
|
+
w22 = w22 / hy + w21;
|
|
1037
|
+
|
|
1038
|
+
let rand = eC(0u);
|
|
1039
|
+
var oh: f32;
|
|
838
1040
|
if (rand < w00) {
|
|
839
|
-
|
|
1041
|
+
oh = m00.x;
|
|
840
1042
|
} else if (rand < w01) {
|
|
841
|
-
|
|
1043
|
+
oh = m01.x;
|
|
842
1044
|
} else if (rand < w02) {
|
|
843
|
-
|
|
1045
|
+
oh = m02.x;
|
|
844
1046
|
} else if (rand < w10) {
|
|
845
|
-
|
|
1047
|
+
oh = m10.x;
|
|
846
1048
|
} else if (rand < w11) {
|
|
847
|
-
|
|
1049
|
+
oh = m11.x;
|
|
848
1050
|
} else if (rand < w12) {
|
|
849
|
-
|
|
1051
|
+
oh = m12.x;
|
|
850
1052
|
} else if (rand < w20) {
|
|
851
|
-
|
|
1053
|
+
oh = m20.x;
|
|
852
1054
|
} else if (rand < w21) {
|
|
853
|
-
|
|
1055
|
+
oh = m21.x;
|
|
854
1056
|
} else {
|
|
855
|
-
|
|
1057
|
+
oh = m22.x;
|
|
856
1058
|
}
|
|
857
|
-
return i32(
|
|
1059
|
+
return i32(oh);
|
|
858
1060
|
}
|
|
859
1061
|
|
|
860
|
-
fn
|
|
861
|
-
|
|
1062
|
+
fn mF(
|
|
1063
|
+
pW: i32,
|
|
862
1064
|
index: vec3i,
|
|
863
|
-
|
|
1065
|
+
eU: vec3f
|
|
864
1066
|
) -> i32 {
|
|
865
1067
|
let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
866
1068
|
let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
867
1069
|
let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
868
1070
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
869
|
-
return
|
|
1071
|
+
return fF(m0, m1, m2, eU);
|
|
870
1072
|
}
|
|
871
|
-
return
|
|
1073
|
+
return pW;
|
|
872
1074
|
}
|
|
873
1075
|
|
|
874
1076
|
|
|
875
1077
|
|
|
876
1078
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
877
|
-
fn
|
|
878
|
-
let determinant =
|
|
1079
|
+
fn eP(normal: vec3f, dp1: vec3f, dp2: vec3f, oW: vec2f, oX: vec2f, input: vec4f) -> mat2x3f {
|
|
1080
|
+
let determinant = oW.x * oX.y - oW.y * oX.x;
|
|
879
1081
|
var t = input.xyz;
|
|
880
1082
|
var b = vec3f(0.0);
|
|
881
1083
|
|
|
882
1084
|
var sign = select(input.w, 0.0, abs(input.w) > 1.5);
|
|
883
1085
|
if (abs(determinant) > 1e-12) {
|
|
884
|
-
let dt = (dp1 *
|
|
885
|
-
let db = (dp2 *
|
|
1086
|
+
let dt = (dp1 * oX.y - dp2 * oW.y) / determinant;
|
|
1087
|
+
let db = (dp2 * oW.x - dp1 * oX.x) / determinant;
|
|
886
1088
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
887
1089
|
if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
|
|
888
1090
|
}
|
|
889
1091
|
t -= normal * dot(normal, t);
|
|
890
1092
|
if (dot(t, t) < 1e-8) {
|
|
891
|
-
let
|
|
892
|
-
let
|
|
893
|
-
let xy = normal.x * normal.y *
|
|
894
|
-
t = vec3f(1.0 +
|
|
895
|
-
b = vec3f(xy,
|
|
1093
|
+
let iI = select(-1.0, 1.0, normal.z >= 0.0);
|
|
1094
|
+
let cL = -1.0 / (iI + normal.z);
|
|
1095
|
+
let xy = normal.x * normal.y * cL;
|
|
1096
|
+
t = vec3f(1.0 + iI * normal.x * normal.x * cL, iI * xy, -iI * normal.x);
|
|
1097
|
+
b = vec3f(xy, iI + normal.y * normal.y * cL, -normal.y);
|
|
896
1098
|
}
|
|
897
1099
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
898
1100
|
return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
|
|
899
1101
|
}
|
|
900
1102
|
|
|
901
1103
|
` : /* wgsl */ ``}
|
|
902
|
-
fn
|
|
903
|
-
si: ptr<function,
|
|
904
|
-
tri:
|
|
905
|
-
|
|
1104
|
+
fn hH(
|
|
1105
|
+
si: ptr<function, SurfaceInteraction>,
|
|
1106
|
+
tri: fP,
|
|
1107
|
+
eU: vec3f,
|
|
906
1108
|
index: vec3i,
|
|
907
|
-
|
|
908
|
-
|
|
1109
|
+
bZ: bool,
|
|
1110
|
+
fM: i32
|
|
909
1111
|
) {
|
|
910
1112
|
(*si).hit = true;
|
|
911
1113
|
|
|
@@ -917,26 +1119,26 @@ let i1 = index.y;
|
|
|
917
1119
|
let i2 = index.z;
|
|
918
1120
|
(*si).vertexColor = vec3f(1.0);
|
|
919
1121
|
if (USE_VERTEX_COLOR) {
|
|
920
|
-
(*si).vertexColor =
|
|
921
|
-
+
|
|
922
|
-
+
|
|
1122
|
+
(*si).vertexColor = eU.x * attrBuffers[i0 * ATTR_STRIDE + COLOR_OFF].xyz
|
|
1123
|
+
+ eU.y * attrBuffers[i1 * ATTR_STRIDE + COLOR_OFF].xyz
|
|
1124
|
+
+ eU.z * attrBuffers[i2 * ATTR_STRIDE + COLOR_OFF].xyz;
|
|
923
1125
|
}
|
|
924
|
-
let
|
|
1126
|
+
let pU = uvProjection == ${uvProjectionConstants.spherical};
|
|
925
1127
|
|
|
926
1128
|
var normal: vec3f = (*si).normal;
|
|
927
|
-
var
|
|
1129
|
+
var hq: vec3f;
|
|
928
1130
|
var n0 = vec3f(0.0);
|
|
929
1131
|
var n1 = vec3f(0.0);
|
|
930
1132
|
var n2 = vec3f(0.0);
|
|
931
1133
|
|
|
932
1134
|
|
|
933
|
-
if (!
|
|
1135
|
+
if (!bZ || pU) {
|
|
934
1136
|
n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
935
1137
|
n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
936
1138
|
n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
937
|
-
|
|
938
|
-
if (!
|
|
939
|
-
normal =
|
|
1139
|
+
hq = normalize(eU.x * n0 + eU.y * n1 + eU.z * n2);
|
|
1140
|
+
if (!bZ) {
|
|
1141
|
+
normal = hq;
|
|
940
1142
|
}
|
|
941
1143
|
}
|
|
942
1144
|
|
|
@@ -944,19 +1146,19 @@ var uv: vec2f;
|
|
|
944
1146
|
var uv0: vec2f;
|
|
945
1147
|
var uv1: vec2f;
|
|
946
1148
|
var uv2: vec2f;
|
|
947
|
-
var
|
|
1149
|
+
var dj = vec2f(0.0);
|
|
948
1150
|
if (USE_UV) {
|
|
949
1151
|
uv0 = attrBuffers[i0 * ATTR_STRIDE + UV_OFF].xy;
|
|
950
1152
|
uv1 = attrBuffers[i1 * ATTR_STRIDE + UV_OFF].xy;
|
|
951
1153
|
uv2 = attrBuffers[i2 * ATTR_STRIDE + UV_OFF].xy;
|
|
952
|
-
uv =
|
|
1154
|
+
uv = eU.x * uv0 + eU.y * uv1 + eU.z * uv2;
|
|
953
1155
|
if (USE_UV1) {
|
|
954
1156
|
let secondaryUv0 = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
955
1157
|
let secondaryUv1 = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
956
1158
|
let secondaryUv2 = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
957
|
-
|
|
958
|
-
+
|
|
959
|
-
+
|
|
1159
|
+
dj = eU.x * secondaryUv0
|
|
1160
|
+
+ eU.y * secondaryUv1
|
|
1161
|
+
+ eU.z * secondaryUv2;
|
|
960
1162
|
}
|
|
961
1163
|
}
|
|
962
1164
|
|
|
@@ -964,28 +1166,28 @@ if (USE_TANGENT) {
|
|
|
964
1166
|
let t0 = attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
965
1167
|
let t1 = attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
966
1168
|
let t2 = attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
967
|
-
(*si).tangent = normalize(
|
|
1169
|
+
(*si).tangent = normalize(eU.x * t0 + eU.y * t1 + eU.z * t2);
|
|
968
1170
|
}
|
|
969
1171
|
|
|
970
|
-
if (
|
|
971
|
-
(*si).materialIndex =
|
|
1172
|
+
if (fM >= 0) {
|
|
1173
|
+
(*si).materialIndex = fM;
|
|
972
1174
|
}
|
|
973
1175
|
else {
|
|
974
|
-
(*si).materialIndex =
|
|
1176
|
+
(*si).materialIndex = mF(
|
|
975
1177
|
(*si).materialIndex,
|
|
976
1178
|
index,
|
|
977
|
-
|
|
1179
|
+
eU
|
|
978
1180
|
);
|
|
979
1181
|
}
|
|
980
1182
|
|
|
981
1183
|
if (uvProjection > 0) {
|
|
982
1184
|
|
|
983
|
-
uv =
|
|
984
|
-
|
|
1185
|
+
uv = gU(uvProjection, (*si).position, select(normal, hq, pU));
|
|
1186
|
+
dj = uv;
|
|
985
1187
|
}
|
|
986
1188
|
|
|
987
1189
|
uv = uv * material.uvScale;
|
|
988
|
-
|
|
1190
|
+
dj = dj * material.uvScale;
|
|
989
1191
|
|
|
990
1192
|
|
|
991
1193
|
if (uvProjection == ${uvProjectionConstants.triplanar}) {
|
|
@@ -995,44 +1197,44 @@ uv = fract(uv);
|
|
|
995
1197
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
996
1198
|
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normal;` : ''}
|
|
997
1199
|
let directionMaterial = materialsBuffer[(*si).materialIndex];
|
|
998
|
-
if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " ||
|
|
1200
|
+
if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || directionMaterial.coatWeight > 0.0" : ""}) {
|
|
999
1201
|
let dp1 = tri.p0 - tri.p2;
|
|
1000
1202
|
let dp2 = tri.p1 - tri.p2;
|
|
1001
|
-
var
|
|
1203
|
+
var aX = vec4f(0.0);
|
|
1002
1204
|
if (USE_TANGENT) {
|
|
1003
|
-
|
|
1004
|
-
+
|
|
1005
|
-
+
|
|
1006
|
-
}
|
|
1007
|
-
let
|
|
1008
|
-
(*si).geometryTangent =
|
|
1009
|
-
(*si).geometryBitangent =
|
|
1010
|
-
var
|
|
1205
|
+
aX = eU.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
|
|
1206
|
+
+ eU.y * attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]
|
|
1207
|
+
+ eU.z * attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF];
|
|
1208
|
+
}
|
|
1209
|
+
let fc = eP(normal, dp1, dp2, uv0-uv2, uv1-uv2, aX);
|
|
1210
|
+
(*si).geometryTangent = fc[0];
|
|
1211
|
+
(*si).geometryBitangent = fc[1];
|
|
1212
|
+
var gm = fc;
|
|
1011
1213
|
if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
|
|
1012
1214
|
let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1013
1215
|
let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1014
1216
|
let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1015
|
-
|
|
1217
|
+
gm = eP(normal, dp1, dp2, a-c, b-c, select(aX, vec4f(0.0), aX.w == 0.0));
|
|
1016
1218
|
}
|
|
1017
|
-
(*si).directionTangent =
|
|
1018
|
-
(*si).directionBitangent =
|
|
1219
|
+
(*si).directionTangent = gm[0];
|
|
1220
|
+
(*si).directionBitangent = gm[1];
|
|
1019
1221
|
${hasCoatNormals ? /* wgsl */ `
|
|
1020
1222
|
if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
|
|
1021
|
-
let
|
|
1022
|
-
var
|
|
1023
|
-
if (USE_UV1 && mapInfo[
|
|
1223
|
+
let lg = i32(directionMaterial.coatNormalMapIndex);
|
|
1224
|
+
var mU = fc;
|
|
1225
|
+
if (USE_UV1 && mapInfo[lg + NUM_MAPS * 2].x > 0.5) {
|
|
1024
1226
|
let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1025
1227
|
let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1026
1228
|
let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1027
|
-
|
|
1028
|
-
select(
|
|
1229
|
+
mU = eP(normal, dp1, dp2, a-c, b-c,
|
|
1230
|
+
select(aX, vec4f(0.0), aX.w == 0.0));
|
|
1029
1231
|
}
|
|
1030
1232
|
|
|
1031
1233
|
|
|
1032
|
-
let decoded = sampleMap(
|
|
1033
|
-
select(
|
|
1034
|
-
let mapped =
|
|
1035
|
-
+
|
|
1234
|
+
let decoded = sampleMap(lg, getMapUvSet(lg, uv,
|
|
1235
|
+
select(dj, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
|
|
1236
|
+
let mapped = mU[0] * decoded.x * directionMaterial.coatNormalScale.x
|
|
1237
|
+
+ mU[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
|
|
1036
1238
|
if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
1037
1239
|
}
|
|
1038
1240
|
` : ''}
|
|
@@ -1042,19 +1244,19 @@ if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
|
1042
1244
|
(*si).normal = normal;
|
|
1043
1245
|
(*si).vertexNormal = normal;
|
|
1044
1246
|
(*si).shadowOffset = vec3f(0.0);
|
|
1045
|
-
if (!
|
|
1247
|
+
if (!bZ) {
|
|
1046
1248
|
|
|
1047
1249
|
|
|
1048
1250
|
|
|
1049
1251
|
let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
1050
|
-
let
|
|
1252
|
+
let kR = eU.x * n0 + eU.y * n1 + eU.z * n2;
|
|
1051
1253
|
let a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
1052
1254
|
let b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
1053
1255
|
let c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
1054
|
-
var h = a *
|
|
1055
|
-
+ (a + b + c) *
|
|
1056
|
-
+ b *
|
|
1057
|
-
if (dot(
|
|
1256
|
+
var h = a * eU.x * (eU.x - 1.0)
|
|
1257
|
+
+ (a + b + c) * eU.x * eU.y
|
|
1258
|
+
+ b * eU.y * (eU.y - 1.0);
|
|
1259
|
+
if (dot(kR, geometricNormal) > 0.0) {
|
|
1058
1260
|
var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
1059
1261
|
var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
1060
1262
|
var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -1072,22 +1274,22 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
|
|
|
1072
1274
|
h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
|
|
1073
1275
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
1074
1276
|
}
|
|
1075
|
-
(*si).shadowOffset =
|
|
1277
|
+
(*si).shadowOffset = kR * h;
|
|
1076
1278
|
}
|
|
1077
1279
|
(*si).uv = uv;
|
|
1078
|
-
(*si).uv1 =
|
|
1280
|
+
(*si).uv1 = dj;
|
|
1079
1281
|
if (USE_NORMAL_MAPS) {
|
|
1080
1282
|
let dp1 = tri.p0 - tri.p2;
|
|
1081
1283
|
let dp2 = tri.p1 - tri.p2;
|
|
1082
|
-
let
|
|
1083
|
-
let
|
|
1084
|
-
(*si).normal =
|
|
1085
|
-
(*si).materialIndex, uv, normal, dp1, dp2,
|
|
1284
|
+
let oW = uv0 - uv2;
|
|
1285
|
+
let oX = uv1 - uv2;
|
|
1286
|
+
(*si).normal = pd(
|
|
1287
|
+
(*si).materialIndex, uv, normal, dp1, dp2, oW, oX
|
|
1086
1288
|
);
|
|
1087
1289
|
}
|
|
1088
1290
|
}
|
|
1089
1291
|
|
|
1090
|
-
struct
|
|
1292
|
+
struct eK {
|
|
1091
1293
|
t: f32,
|
|
1092
1294
|
barycentric: vec3f,
|
|
1093
1295
|
};
|
|
@@ -1096,8 +1298,8 @@ barycentric: vec3f,
|
|
|
1096
1298
|
|
|
1097
1299
|
|
|
1098
1300
|
|
|
1099
|
-
fn
|
|
1100
|
-
var ti:
|
|
1301
|
+
fn ga(o: vec3f, d: vec3f, tri: fP, eq: i32, gY: vec3f, tMax: f32) -> eK {
|
|
1302
|
+
var ti: eK;
|
|
1101
1303
|
|
|
1102
1304
|
|
|
1103
1305
|
var p0t = tri.p0 - o;
|
|
@@ -1105,11 +1307,11 @@ var p1t = tri.p1 - o;
|
|
|
1105
1307
|
var p2t = tri.p2 - o;
|
|
1106
1308
|
|
|
1107
1309
|
|
|
1108
|
-
if (
|
|
1310
|
+
if (eq == 0) {
|
|
1109
1311
|
p0t = p0t.yzx;
|
|
1110
1312
|
p1t = p1t.yzx;
|
|
1111
1313
|
p2t = p2t.yzx;
|
|
1112
|
-
} else if (
|
|
1314
|
+
} else if (eq == 1) {
|
|
1113
1315
|
p0t = p0t.zxy;
|
|
1114
1316
|
p1t = p1t.zxy;
|
|
1115
1317
|
p2t = p2t.zxy;
|
|
@@ -1117,9 +1319,9 @@ p2t = p2t.zxy;
|
|
|
1117
1319
|
|
|
1118
1320
|
|
|
1119
1321
|
|
|
1120
|
-
p0t = vec3f(p0t.xy +
|
|
1121
|
-
p1t = vec3f(p1t.xy +
|
|
1122
|
-
p2t = vec3f(p2t.xy +
|
|
1322
|
+
p0t = vec3f(p0t.xy + gY.xy * p0t.z, p0t.z);
|
|
1323
|
+
p1t = vec3f(p1t.xy + gY.xy * p1t.z, p1t.z);
|
|
1324
|
+
p2t = vec3f(p2t.xy + gY.xy * p2t.z, p2t.z);
|
|
1123
1325
|
|
|
1124
1326
|
|
|
1125
1327
|
var e = vec3f(
|
|
@@ -1131,9 +1333,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
1131
1333
|
if (DEPTH_QUERY_MODE) {
|
|
1132
1334
|
|
|
1133
1335
|
|
|
1134
|
-
let
|
|
1336
|
+
let sF = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
1135
1337
|
+ abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
1136
|
-
e = select(e, vec3f(0.0), abs(e) <=
|
|
1338
|
+
e = select(e, vec3f(0.0), abs(e) <= sF * 1e-6);
|
|
1137
1339
|
}
|
|
1138
1340
|
|
|
1139
1341
|
|
|
@@ -1144,19 +1346,19 @@ return ti;
|
|
|
1144
1346
|
let det = e.x + e.y + e.z;
|
|
1145
1347
|
if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
|
|
1146
1348
|
|
|
1147
|
-
p0t.z *=
|
|
1148
|
-
p1t.z *=
|
|
1149
|
-
p2t.z *=
|
|
1150
|
-
let
|
|
1349
|
+
p0t.z *= gY.z;
|
|
1350
|
+
p1t.z *= gY.z;
|
|
1351
|
+
p2t.z *= gY.z;
|
|
1352
|
+
let sw = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
1151
1353
|
|
|
1152
1354
|
|
|
1153
|
-
if (abs(
|
|
1355
|
+
if (abs(sw) > abs(tMax * det)) {
|
|
1154
1356
|
return ti;
|
|
1155
1357
|
}
|
|
1156
1358
|
|
|
1157
|
-
let
|
|
1158
|
-
ti.t =
|
|
1159
|
-
ti.barycentric = e *
|
|
1359
|
+
let tN = 1. / det;
|
|
1360
|
+
ti.t = sw * tN;
|
|
1361
|
+
ti.barycentric = e * tN;
|
|
1160
1362
|
|
|
1161
1363
|
return ti;
|
|
1162
1364
|
}
|
|
@@ -1166,26 +1368,26 @@ return ti;
|
|
|
1166
1368
|
|
|
1167
1369
|
override DEPTH_QUERY_MODE: bool = false;
|
|
1168
1370
|
|
|
1169
|
-
fn
|
|
1371
|
+
fn fo(d: vec3f) -> vec3f {
|
|
1170
1372
|
if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
|
|
1171
1373
|
return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
|
|
1172
1374
|
}
|
|
1173
1375
|
|
|
1174
|
-
fn
|
|
1376
|
+
fn fk(gr: vec3f, o: vec3f) -> vec3f {
|
|
1175
1377
|
if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
|
|
1176
|
-
return abs(
|
|
1378
|
+
return abs(gr) * max(vec3f(1.0), abs(o)) * 1e-6;
|
|
1177
1379
|
}
|
|
1178
1380
|
|
|
1179
1381
|
|
|
1180
1382
|
|
|
1181
|
-
fn
|
|
1182
|
-
let
|
|
1183
|
-
let
|
|
1184
|
-
let
|
|
1185
|
-
let
|
|
1186
|
-
let
|
|
1187
|
-
let t0 = max(
|
|
1188
|
-
let t1 = min(
|
|
1383
|
+
fn cU(o: vec3f, xq: vec3f, xp: vec3f, gr: vec3f, tMax: f32) -> f32 {
|
|
1384
|
+
let wG = (xq - o) * gr;
|
|
1385
|
+
let wI = (xp - o) * gr;
|
|
1386
|
+
let padding = fk(gr, o);
|
|
1387
|
+
let nJ = min(wG, wI) - padding;
|
|
1388
|
+
let sY = max(wG, wI) + padding;
|
|
1389
|
+
let t0 = max(nJ.x, max(nJ.y, nJ.z));
|
|
1390
|
+
let t1 = min(sY.x, min(sY.y, sY.z));
|
|
1189
1391
|
return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
|
|
1190
1392
|
}
|
|
1191
1393
|
|
|
@@ -1193,69 +1395,69 @@ fn maxDimension(v: vec3f) -> i32 {
|
|
|
1193
1395
|
return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
|
|
1194
1396
|
}
|
|
1195
1397
|
|
|
1196
|
-
fn
|
|
1398
|
+
fn nk(d: vec3f, eq: i32) -> vec3f {
|
|
1197
1399
|
|
|
1198
1400
|
|
|
1199
|
-
if (
|
|
1401
|
+
if (eq == 0) {
|
|
1200
1402
|
return vec3f(-d.y, -d.z, 1.0) / d.x;
|
|
1201
|
-
} else if (
|
|
1403
|
+
} else if (eq == 1) {
|
|
1202
1404
|
return vec3f(-d.z, -d.x, 1.0) / d.y;
|
|
1203
1405
|
} else {
|
|
1204
1406
|
return vec3f(-d.x, -d.y, 1.0) / d.z;
|
|
1205
1407
|
}
|
|
1206
1408
|
}
|
|
1207
1409
|
|
|
1208
|
-
fn
|
|
1209
|
-
si: ptr<function,
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1410
|
+
fn mV(
|
|
1411
|
+
si: ptr<function, SurfaceInteraction>,
|
|
1412
|
+
mk: fP,
|
|
1413
|
+
aC: vec3f,
|
|
1414
|
+
hK: vec3i,
|
|
1415
|
+
bZ: bool,
|
|
1416
|
+
ap: i32,
|
|
1417
|
+
eL: vec3f,
|
|
1418
|
+
fi: vec3f,
|
|
1419
|
+
fM: i32
|
|
1218
1420
|
) {
|
|
1219
|
-
(*si).instanceIndex =
|
|
1220
|
-
(*si).barycentrics =
|
|
1221
|
-
(*si).normal =
|
|
1222
|
-
(*si).position =
|
|
1223
|
-
(*si).materialIndex = i32(
|
|
1224
|
-
bitcast<i32>(instancesBuffer[
|
|
1421
|
+
(*si).instanceIndex = ap;
|
|
1422
|
+
(*si).barycentrics = aC.xy;
|
|
1423
|
+
(*si).normal = eL;
|
|
1424
|
+
(*si).position = fi;
|
|
1425
|
+
(*si).materialIndex = i32(ah(
|
|
1426
|
+
bitcast<i32>(instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE}].z)
|
|
1225
1427
|
).x);
|
|
1226
1428
|
|
|
1227
1429
|
|
|
1228
|
-
|
|
1430
|
+
hH(
|
|
1229
1431
|
si,
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1432
|
+
mk,
|
|
1433
|
+
aC,
|
|
1434
|
+
hK,
|
|
1435
|
+
bZ,
|
|
1436
|
+
fM
|
|
1235
1437
|
);
|
|
1236
1438
|
|
|
1237
1439
|
let l2w = mat4x4<f32>(
|
|
1238
|
-
instancesBuffer[
|
|
1239
|
-
instancesBuffer[
|
|
1240
|
-
instancesBuffer[
|
|
1241
|
-
instancesBuffer[
|
|
1440
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 5],
|
|
1441
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 6],
|
|
1442
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 7],
|
|
1443
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 8]
|
|
1242
1444
|
);
|
|
1243
1445
|
let w2l = mat4x4<f32>(
|
|
1244
|
-
instancesBuffer[
|
|
1245
|
-
instancesBuffer[
|
|
1246
|
-
instancesBuffer[
|
|
1247
|
-
instancesBuffer[
|
|
1446
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
1447
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
1448
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
1449
|
+
instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
1248
1450
|
);
|
|
1249
|
-
let
|
|
1451
|
+
let aH = transpose(mat3x3<f32>(
|
|
1250
1452
|
w2l[0].xyz,
|
|
1251
1453
|
w2l[1].xyz,
|
|
1252
1454
|
w2l[2].xyz
|
|
1253
1455
|
));
|
|
1254
1456
|
|
|
1255
|
-
(*si).faceNormal = normalize(
|
|
1256
|
-
(*si).vertexNormal = normalize(
|
|
1257
|
-
(*si).normal = normalize(
|
|
1258
|
-
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(
|
|
1457
|
+
(*si).faceNormal = normalize(aH * eL);
|
|
1458
|
+
(*si).vertexNormal = normalize(aH * (*si).vertexNormal);
|
|
1459
|
+
(*si).normal = normalize(aH * (*si).normal);
|
|
1460
|
+
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
|
|
1259
1461
|
if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
|
|
1260
1462
|
(*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
|
|
1261
1463
|
}
|
|
@@ -1274,171 +1476,6 @@ ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
|
|
|
1274
1476
|
|
|
1275
1477
|
|
|
1276
1478
|
|
|
1277
|
-
|
|
1278
|
-
fn cZ(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool, lD: bool) {
|
|
1279
|
-
|
|
1280
|
-
(*si).hit = false;
|
|
1281
|
-
|
|
1282
|
-
if (rtUniform.isEmpty > 0) {
|
|
1283
|
-
return;
|
|
1284
|
-
}
|
|
1285
|
-
|
|
1286
|
-
var tMax = RAY_MAX_DISTANCE;
|
|
1287
|
-
var ey: i32;
|
|
1288
|
-
var gP: vec3f;
|
|
1289
|
-
|
|
1290
|
-
var hw: vec3i;
|
|
1291
|
-
var lC: fA;
|
|
1292
|
-
var ao: i32;
|
|
1293
|
-
var hO: i32 = (*si).triangleIndex;
|
|
1294
|
-
|
|
1295
|
-
${getBVHTraverseCode(`
|
|
1296
|
-
(*si).triangleIndex = triangleIndex;
|
|
1297
|
-
lC = tri;
|
|
1298
|
-
hw = index;
|
|
1299
|
-
ao = cf;
|
|
1300
|
-
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
|
|
1301
|
-
|
|
1302
|
-
if (rb) {
|
|
1303
|
-
mj(
|
|
1304
|
-
si,
|
|
1305
|
-
lC,
|
|
1306
|
-
aB,
|
|
1307
|
-
hw,
|
|
1308
|
-
bU,
|
|
1309
|
-
ao,
|
|
1310
|
-
eD,
|
|
1311
|
-
eY,
|
|
1312
|
-
-1
|
|
1313
|
-
);
|
|
1314
|
-
}
|
|
1315
|
-
}
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
fn iM(ray: Ray, si: ptr<function, ad>, instanceIndex: i32, maxDistance: f32) {
|
|
1319
|
-
(*si).hit = false;
|
|
1320
|
-
|
|
1321
|
-
if (rtUniform.isEmpty > 0) {
|
|
1322
|
-
return;
|
|
1323
|
-
}
|
|
1324
|
-
|
|
1325
|
-
let bounces = 0;
|
|
1326
|
-
let doubleSided = true;
|
|
1327
|
-
let lD = false;
|
|
1328
|
-
var tMax = maxDistance;
|
|
1329
|
-
var ey: i32;
|
|
1330
|
-
var gP: vec3f;
|
|
1331
|
-
var hw: vec3i;
|
|
1332
|
-
var lC: fA;
|
|
1333
|
-
var ao: i32;
|
|
1334
|
-
var hO: i32 = -1;
|
|
1335
|
-
|
|
1336
|
-
${getBVHTraverseCode(`
|
|
1337
|
-
(*si).triangleIndex = triangleIndex;
|
|
1338
|
-
lC = tri;
|
|
1339
|
-
hw = index;
|
|
1340
|
-
ao = cf;
|
|
1341
|
-
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
|
|
1342
|
-
if (cf != instanceIndex) {
|
|
1343
|
-
continue;
|
|
1344
|
-
}
|
|
1345
|
-
`)}
|
|
1346
|
-
|
|
1347
|
-
if (rb) {
|
|
1348
|
-
(*si).instanceIndex = ao;
|
|
1349
|
-
(*si).normal = eD;
|
|
1350
|
-
(*si).position = eY;
|
|
1351
|
-
(*si).materialIndex = i32(ae(bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)).x);
|
|
1352
|
-
ht(
|
|
1353
|
-
si,
|
|
1354
|
-
lC,
|
|
1355
|
-
aB,
|
|
1356
|
-
hw,
|
|
1357
|
-
bU,
|
|
1358
|
-
-1
|
|
1359
|
-
);
|
|
1360
|
-
|
|
1361
|
-
let l2w = mat4x4<f32>(
|
|
1362
|
-
instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 5],
|
|
1363
|
-
instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 6],
|
|
1364
|
-
instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 7],
|
|
1365
|
-
instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 8]
|
|
1366
|
-
);
|
|
1367
|
-
let w2l = mat4x4<f32>(
|
|
1368
|
-
instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
1369
|
-
instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
1370
|
-
instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
1371
|
-
instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
1372
|
-
);
|
|
1373
|
-
let aD = transpose(mat3x3<f32>(
|
|
1374
|
-
w2l[0].xyz,
|
|
1375
|
-
w2l[1].xyz,
|
|
1376
|
-
w2l[2].xyz
|
|
1377
|
-
));
|
|
1378
|
-
(*si).faceNormal = normalize(aD * eD);
|
|
1379
|
-
(*si).vertexNormal = normalize(aD * (*si).vertexNormal);
|
|
1380
|
-
(*si).normal = normalize(aD * (*si).normal);
|
|
1381
|
-
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aD * (*si).coatNormal);` : ''}
|
|
1382
|
-
if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
|
|
1383
|
-
(*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
|
|
1384
|
-
}
|
|
1385
|
-
${hasAnisotropyDirections ? /* wgsl */ `
|
|
1386
|
-
(*si).directionTangent = (l2w * vec4f((*si).directionTangent, 0.0)).xyz;
|
|
1387
|
-
(*si).directionBitangent = (l2w * vec4f((*si).directionBitangent, 0.0)).xyz;
|
|
1388
|
-
(*si).geometryTangent = (l2w * vec4f((*si).geometryTangent, 0.0)).xyz;
|
|
1389
|
-
(*si).geometryBitangent = (l2w * vec4f((*si).geometryBitangent, 0.0)).xyz;
|
|
1390
|
-
` : /* wgsl */ ``}
|
|
1391
|
-
(*si).shadowOffset = (l2w * vec4f((*si).shadowOffset, 0.0)).xyz;
|
|
1392
|
-
(*si).position = (l2w * vec4((*si).position, 1.0)).xyz;
|
|
1393
|
-
}
|
|
1394
|
-
}
|
|
1395
|
-
|
|
1396
|
-
fn ex(ray: Ray, lightDistance: f32, jL: i32) -> bool {
|
|
1397
|
-
if (rtUniform.isEmpty > 0) {
|
|
1398
|
-
return false;
|
|
1399
|
-
}
|
|
1400
|
-
|
|
1401
|
-
let doubleSided = true;
|
|
1402
|
-
let qo = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
1403
|
-
var tMax = qo;
|
|
1404
|
-
var ey: i32;
|
|
1405
|
-
var gP: vec3f;
|
|
1406
|
-
|
|
1407
|
-
let bounces = 1;
|
|
1408
|
-
var lD = false;
|
|
1409
|
-
var hO: i32 = jL;
|
|
1410
|
-
|
|
1411
|
-
${getBVHTraverseCode(
|
|
1412
|
-
/*wgsl */ `
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
var jt = true;
|
|
1417
|
-
|
|
1418
|
-
if (jt) {
|
|
1419
|
-
if (HAS_ALPHA) {
|
|
1420
|
-
let materialIndex = i32(ae(bitcast<i32>(ou.z)).x);
|
|
1421
|
-
if (!nG(
|
|
1422
|
-
materialIndex,
|
|
1423
|
-
index,
|
|
1424
|
-
aB,
|
|
1425
|
-
eY,
|
|
1426
|
-
eD
|
|
1427
|
-
)) {
|
|
1428
|
-
|
|
1429
|
-
tMax = qo;
|
|
1430
|
-
jt = false;
|
|
1431
|
-
}
|
|
1432
|
-
}
|
|
1433
|
-
}
|
|
1434
|
-
if (jt) {
|
|
1435
|
-
return true;
|
|
1436
|
-
}
|
|
1437
|
-
`, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
|
|
1438
|
-
|
|
1439
|
-
return false;
|
|
1440
|
-
}
|
|
1441
|
-
|
|
1442
|
-
`;
|
|
1479
|
+
${sceneIntersections || createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections, hasCoatNormals, blasLayoutMask })}`;
|
|
1443
1480
|
}
|
|
1444
1481
|
//# sourceMappingURL=intersect.wgsl.js.map
|