@meimu/mutracer 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +222 -0
- package/LICENSES/FidelityFX-FSR.txt +19 -0
- package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
- package/README.md +3 -0
- package/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +9328 -7614
- package/docs/api.md +83 -35
- package/docs/caustics.md +80 -0
- package/docs/materials.md +9 -6
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +53 -9
- package/docs/sampling.md +4 -0
- package/docs/technical/acceleration.md +52 -0
- package/docs/technical/aovs.md +79 -0
- package/docs/technical/caustics.md +109 -0
- package/docs/technical/continuous-spectrum.md +122 -0
- package/docs/technical/display-upscale.md +82 -0
- package/docs/technical/openpbr.md +99 -0
- package/docs/technical/pbrt-import.md +168 -0
- package/docs/technical/tiling.md +74 -0
- package/docs/technical/webgl.md +53 -0
- package/docs/updates.md +3 -1
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +18 -6
- package/lib/Display.d.ts +19 -5
- package/lib/Display.js +10 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +4 -1
- package/lib/Engine.js +77 -14
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +81 -24
- package/lib/Render.js +201 -26
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -3
- package/lib/RenderLoop.js +68 -44
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +4 -2
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/renderer/AovPrimitiveCache.js +39 -8
- package/lib/renderer/AovPrimitiveCache.js.map +1 -1
- package/lib/renderer/DisplayPostProcess.d.ts +8 -3
- package/lib/renderer/DisplayPostProcess.js +51 -18
- package/lib/renderer/DisplayPostProcess.js.map +1 -1
- package/lib/renderer/GPUTraceQueue.d.ts +2 -1
- package/lib/renderer/GPUTraceQueue.js +3 -1
- package/lib/renderer/GPUTraceQueue.js.map +1 -1
- package/lib/renderer/MaterialData.js +7 -2
- package/lib/renderer/MaterialData.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +11 -1
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +2 -2
- package/lib/renderer/TileRender.js +128 -7
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +6 -1
- package/lib/renderer/WGPUAov.js +108 -14
- package/lib/renderer/WGPUAov.js.map +1 -1
- package/lib/renderer/WGPUCanvasSurface.js +12 -1
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
- package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
- package/lib/renderer/WGPUCausticLightPass.js +217 -0
- package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
- package/lib/renderer/WGPUPhotonMap.js +191 -0
- package/lib/renderer/WGPUPhotonMap.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
- package/lib/renderer/WGPURayTraceOutput.js +122 -28
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +65 -21
- package/lib/renderer/WGPURayTracePass.js +730 -409
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +110 -68
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLAov.js +3 -3
- package/lib/renderer/WebGLAov.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
- package/lib/renderer/WebGLFullQuadPass.js +10 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
- package/lib/renderer/WebGLRayTracePass.js +157 -116
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +17 -14
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +60 -60
- package/lib/renderer/accumulationTarget.d.ts +2 -1
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +13 -1
- package/lib/renderer/aov.js +21 -2
- package/lib/renderer/aov.js.map +1 -1
- package/lib/renderer/aovDisplay.js +2 -2
- package/lib/renderer/aovDisplay.js.map +1 -1
- package/lib/renderer/binnedSahBvh.d.ts +2 -1
- package/lib/renderer/binnedSahBvh.js +24 -17
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +3 -1
- package/lib/renderer/bvhAccel.js +36 -6
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +1 -1
- package/lib/renderer/cameraUniform.js +6 -2
- package/lib/renderer/cameraUniform.js.map +1 -1
- package/lib/renderer/causticDiagnostics.d.ts +31 -0
- package/lib/renderer/causticDiagnostics.js +5 -0
- package/lib/renderer/causticDiagnostics.js.map +1 -0
- package/lib/renderer/causticEmission.d.ts +10 -0
- package/lib/renderer/causticEmission.js +40 -0
- package/lib/renderer/causticEmission.js.map +1 -0
- package/lib/renderer/causticUniform.d.ts +12 -0
- package/lib/renderer/causticUniform.js +22 -0
- package/lib/renderer/causticUniform.js.map +1 -0
- package/lib/renderer/caustics.d.ts +16 -0
- package/lib/renderer/caustics.js +93 -0
- package/lib/renderer/caustics.js.map +1 -0
- package/lib/renderer/compactVertices.d.ts +14 -0
- package/lib/renderer/compactVertices.js +124 -0
- package/lib/renderer/compactVertices.js.map +1 -0
- package/lib/renderer/easu.d.ts +11 -0
- package/lib/renderer/easu.js +156 -0
- package/lib/renderer/easu.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +1 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +3 -2
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +45 -37
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
- package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
- 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.d.ts +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +13 -7
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +338 -252
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.js.map +1 -1
- package/lib/renderer/lightSampling.d.ts +3 -2
- package/lib/renderer/lightSampling.js +14 -8
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
- package/lib/renderer/openPbrEnergyLut.js +18 -1
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/pathLimits.d.ts +5 -4
- package/lib/renderer/pathLimits.js +6 -5
- package/lib/renderer/pathLimits.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +2 -0
- package/lib/renderer/prepareMeshBVH.js +5 -3
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +5 -4
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +5 -0
- package/lib/renderer/renderPipeline.js +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +31 -0
- package/lib/renderer/researchTransport.js +5 -0
- package/lib/renderer/researchTransport.js.map +1 -0
- package/lib/renderer/sceneAssembly.d.ts +1 -1
- package/lib/renderer/sceneAssembly.js +4 -3
- package/lib/renderer/sceneAssembly.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.d.ts +1 -1
- package/lib/renderer/sceneChangeDetector.js +3 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
- package/lib/renderer/sceneLayoutSchema.js +3 -3
- package/lib/renderer/sceneLayoutSchema.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +3 -2
- package/lib/renderer/scenePreparation.js +18 -2
- package/lib/renderer/scenePreparation.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.js.map +1 -0
- package/lib/renderer/staticBvhPreparation.d.ts +9 -0
- package/lib/renderer/staticBvhPreparation.js +8 -2
- package/lib/renderer/staticBvhPreparation.js.map +1 -1
- package/lib/renderer/surfaceHit.d.ts +10 -0
- package/lib/renderer/surfaceHit.js +22 -0
- package/lib/renderer/surfaceHit.js.map +1 -0
- package/lib/renderer/tangentRequirements.d.ts +2 -0
- package/lib/renderer/tangentRequirements.js +7 -0
- package/lib/renderer/tangentRequirements.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +4 -0
- package/lib/renderer/textureAtlas.js +48 -2
- package/lib/renderer/textureAtlas.js.map +1 -1
- package/lib/renderer/webgl.js +4 -0
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- package/lib/renderer/webglVertexAttributes.d.ts +17 -0
- package/lib/renderer/webglVertexAttributes.js +44 -0
- package/lib/renderer/webglVertexAttributes.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +3 -3
- package/lib/renderer/wgpuMaterialConstants.js +4 -3
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
- package/lib/renderer/wgpuSceneUniform.js +2 -2
- package/lib/renderer/wgpuSceneUniform.js.map +1 -1
- package/lib/renderer/wgpuShaderSource.d.ts +22 -0
- package/lib/renderer/wgpuShaderSource.js +3 -1
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +539 -0
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
- 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 +77 -74
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
- 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 +5 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
- 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 +142 -138
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
- 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 +11 -11
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
- 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.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/easu.wgsl.js +80 -0
- package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
- package/lib/renderer/wgsl/photonMap.compute.js +352 -0
- package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +2 -2
- package/lib/scene/MaterialState.js +2 -2
- package/lib/scene/MaterialState.js.map +1 -1
- package/lib/scene/Scene.js.map +1 -1
- package/lib/settings/render.d.ts +22 -0
- package/lib/settings/render.js +2 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +23 -16
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +2 -1
- package/package.json +7 -4
- package/lib/oidnBundledWeights.cdn.d.ts +0 -2
- package/lib/oidnBundledWeights.cdn.js +0 -5
- package/lib/oidnBundledWeights.cdn.js.map +0 -1
- package/lib/renderer/bvh.worker.d.ts +0 -1
- package/lib/renderer/bvh.worker.js +0 -16
- package/lib/renderer/bvh.worker.js.map +0 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
- package/lib/renderer/bvhWorkerBuild.js +0 -17
- package/lib/renderer/bvhWorkerBuild.js.map +0 -1
- package/lib/renderer/lightCore.d.ts +0 -12
- package/lib/renderer/lightCore.js +0 -13
- package/lib/renderer/lightCore.js.map +0 -1
- package/lib/renderer/materialCore.d.ts +0 -8
- package/lib/renderer/materialCore.js +0 -9
- package/lib/renderer/materialCore.js.map +0 -1
- package/lib/scene/PixelTexture.d.ts +0 -6
- package/lib/scene/PixelTexture.js +0 -10
- package/lib/scene/PixelTexture.js.map +0 -1
- package/lib/util/studioLighting.d.ts +0 -18
- package/lib/util/studioLighting.js +0 -36
- package/lib/util/studioLighting.js.map +0 -1
|
@@ -6,31 +6,31 @@ import { INSTANCE_VEC4_STRIDE } from '../../bvhAccel.js';
|
|
|
6
6
|
import { createShaderMixin, glsl, Shader } from '../../shader.js';
|
|
7
7
|
function getBVHTraverseCode(handleHitCode, skipTriangleCode = '', initialTMax = 'RAY_MAX_DISTANCE') {
|
|
8
8
|
const intersectTriangles = glsl `
|
|
9
|
-
ivec3 vertexOffset = ivec3(floatBitsToInt(
|
|
9
|
+
ivec3 vertexOffset = ivec3(floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).y));
|
|
10
10
|
for (int k = 0; k < primitiveCount; k++) {
|
|
11
11
|
int triangleIndex = primitiveOffset + k;
|
|
12
12
|
${skipTriangleCode}
|
|
13
|
-
vec4 r3 =
|
|
13
|
+
vec4 r3 = fetchBVH(triangleIndex);
|
|
14
14
|
ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
fL tri = fL(
|
|
16
|
+
fetchData(positionBuffer, index.x, vertexColumns).xyz,
|
|
17
|
+
fetchData(positionBuffer, index.y, vertexColumns).xyz,
|
|
18
|
+
fetchData(positionBuffer, index.z, vertexColumns).xyz
|
|
19
19
|
);
|
|
20
|
-
|
|
20
|
+
eF hit = fY(o, d, tri, ei, gZ, tMax);
|
|
21
21
|
|
|
22
22
|
if (hit.t > 0.0) {
|
|
23
23
|
tMax = hit.t;
|
|
24
24
|
vec3 e1 = tri.p1 - tri.p0;
|
|
25
25
|
vec3 e2 = tri.p2 - tri.p0;
|
|
26
26
|
vec3 faceNormal = normalize(cross(e1, e2));
|
|
27
|
-
int
|
|
28
|
-
floatBitsToInt(
|
|
27
|
+
int lc = int(af(
|
|
28
|
+
floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)
|
|
29
29
|
).x);
|
|
30
|
-
bool
|
|
31
|
-
|
|
30
|
+
bool jm = fetchMatData(
|
|
31
|
+
lc * MAT_DATA_SIZE + MAT_ROW_ALPHA
|
|
32
32
|
).z > 0.5;
|
|
33
|
-
if (!doubleSided && !
|
|
33
|
+
if (!doubleSided && !jm && dot(faceNormal, d) > 0.0) {
|
|
34
34
|
continue;
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -41,257 +41,260 @@ ${handleHitCode}
|
|
|
41
41
|
return glsl `
|
|
42
42
|
ivec2 stack[STACK_SIZE];
|
|
43
43
|
int top = -1;
|
|
44
|
-
int
|
|
44
|
+
int vQ = -1;
|
|
45
45
|
float tMax = ${initialTMax};
|
|
46
46
|
|
|
47
47
|
vec3 o = ray.o;
|
|
48
48
|
vec3 d = ray.d;
|
|
49
49
|
|
|
50
|
-
bool
|
|
51
|
-
vec3
|
|
52
|
-
vec3
|
|
53
|
-
ivec3
|
|
50
|
+
bool tD = false;
|
|
51
|
+
vec3 hU;
|
|
52
|
+
vec3 aw;
|
|
53
|
+
ivec3 hL;
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
fL mL;
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
top = 0;
|
|
59
59
|
stack[0] = ivec2(0, -1);
|
|
60
60
|
|
|
61
|
-
int
|
|
62
|
-
while(top >= 0 &&
|
|
63
|
-
|
|
61
|
+
int AI = 0;
|
|
62
|
+
while(top >= 0 && AI < 5000) {
|
|
63
|
+
AI++;
|
|
64
64
|
ivec2 node = stack[top--];
|
|
65
65
|
|
|
66
|
-
int
|
|
66
|
+
int bK = node.y;
|
|
67
67
|
|
|
68
|
-
if (
|
|
69
|
-
if (
|
|
68
|
+
if (bK != vQ) {
|
|
69
|
+
if (bK < 0) {
|
|
70
70
|
o = ray.o;
|
|
71
71
|
d = ray.d;
|
|
72
72
|
}
|
|
73
73
|
else {
|
|
74
74
|
mat4 w2l = mat4(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 1),
|
|
76
|
+
fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 2),
|
|
77
|
+
fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
78
|
+
fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
79
79
|
);
|
|
80
80
|
o = (w2l * vec4(ray.o, 1.0)).xyz;
|
|
81
81
|
d = (w2l * vec4(ray.d, 0.0)).xyz;
|
|
82
82
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
ei = maxDimension(abs(d));
|
|
84
|
+
gZ = nV(d, ei);
|
|
85
|
+
vQ = bK;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
int
|
|
89
|
-
uint
|
|
90
|
-
int
|
|
91
|
-
int
|
|
88
|
+
int bufferOff = bK < 0 ? 0 : blasOffset;
|
|
89
|
+
uint fW = bK < 0 ? 0u : floatBitsToUint(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).x);
|
|
90
|
+
int hj = int(fW >> 30u);
|
|
91
|
+
int fc = int(fW & 0x3fffffffu);
|
|
92
92
|
int primitiveCount = 0;
|
|
93
93
|
int primitiveOffset = 0;
|
|
94
94
|
|
|
95
|
-
if (
|
|
96
|
-
uint
|
|
97
|
-
if ((
|
|
98
|
-
primitiveCount = int((
|
|
99
|
-
primitiveOffset =
|
|
95
|
+
if (hj == 3) {
|
|
96
|
+
uint iE = uint(node.x);
|
|
97
|
+
if ((iE & 0x80000000u) != 0u) {
|
|
98
|
+
primitiveCount = int((iE >> 23u) & 0xffu);
|
|
99
|
+
primitiveOffset = bufferOff + fc + int(iE & 0x007fffffu);
|
|
100
100
|
}
|
|
101
101
|
else {
|
|
102
|
-
int i = node.x +
|
|
103
|
-
vec4
|
|
104
|
-
vec4
|
|
105
|
-
vec4
|
|
106
|
-
vec4
|
|
107
|
-
vec4
|
|
108
|
-
uint header = floatBitsToUint(
|
|
109
|
-
int
|
|
110
|
-
int
|
|
111
|
-
int
|
|
112
|
-
vec3
|
|
113
|
-
uintBitsToFloat(uint(
|
|
114
|
-
uintBitsToFloat(uint(
|
|
115
|
-
uintBitsToFloat(uint(
|
|
102
|
+
int i = node.x + bufferOff;
|
|
103
|
+
vec4 kj = fetchBVH(i);
|
|
104
|
+
vec4 fR = fetchBVH(i + 1);
|
|
105
|
+
vec4 oG = fetchBVH(i + 2);
|
|
106
|
+
vec4 oH = fetchBVH(i + 3);
|
|
107
|
+
vec4 oI = fetchBVH(i + 4);
|
|
108
|
+
uint header = floatBitsToUint(kj.w);
|
|
109
|
+
int uc = int(header << 24u) >> 24;
|
|
110
|
+
int ud = int((header >> 8u) << 24u) >> 24;
|
|
111
|
+
int ue = int((header >> 16u) << 24u) >> 24;
|
|
112
|
+
vec3 ih = vec3(
|
|
113
|
+
uintBitsToFloat(uint(uc + 127) << 23u),
|
|
114
|
+
uintBitsToFloat(uint(ud + 127) << 23u),
|
|
115
|
+
uintBitsToFloat(uint(ue + 127) << 23u)
|
|
116
116
|
);
|
|
117
|
-
uint childBase = floatBitsToUint(
|
|
118
|
-
uint
|
|
117
|
+
uint childBase = floatBitsToUint(fR.x);
|
|
118
|
+
uint qE = floatBitsToUint(fR.y);
|
|
119
119
|
uint internalMask = header >> 24u;
|
|
120
|
-
uint
|
|
120
|
+
uint yl = (d.x < 0.0 ? 4u : 0u) |
|
|
121
121
|
(d.y < 0.0 ? 2u : 0u) |
|
|
122
122
|
(d.z < 0.0 ? 1u : 0u);
|
|
123
|
-
uint
|
|
124
|
-
floatBitsToUint(
|
|
125
|
-
floatBitsToUint(
|
|
126
|
-
floatBitsToUint(
|
|
127
|
-
floatBitsToUint(
|
|
128
|
-
floatBitsToUint(
|
|
129
|
-
floatBitsToUint(
|
|
123
|
+
uint gX[12] = uint[12](
|
|
124
|
+
floatBitsToUint(oG.x), floatBitsToUint(oG.y),
|
|
125
|
+
floatBitsToUint(oG.z), floatBitsToUint(oG.w),
|
|
126
|
+
floatBitsToUint(oH.x), floatBitsToUint(oH.y),
|
|
127
|
+
floatBitsToUint(oH.z), floatBitsToUint(oH.w),
|
|
128
|
+
floatBitsToUint(oI.x), floatBitsToUint(oI.y),
|
|
129
|
+
floatBitsToUint(oI.z), floatBitsToUint(oI.w)
|
|
130
130
|
);
|
|
131
131
|
|
|
132
132
|
for (int order = 7; order >= 0; order--) {
|
|
133
|
-
uint slot = uint(order) ^
|
|
134
|
-
uint
|
|
135
|
-
? floatBitsToUint(
|
|
136
|
-
: floatBitsToUint(
|
|
137
|
-
uint meta = (
|
|
133
|
+
uint slot = uint(order) ^ yl;
|
|
134
|
+
uint vF = slot >= 4u
|
|
135
|
+
? floatBitsToUint(fR.w)
|
|
136
|
+
: floatBitsToUint(fR.z);
|
|
137
|
+
uint meta = (vF >> ((slot & 3u) * 8u)) & 0xffu;
|
|
138
138
|
if (meta == 0u) continue;
|
|
139
|
-
uint
|
|
140
|
-
uint
|
|
141
|
-
vec3
|
|
142
|
-
float((
|
|
143
|
-
float((
|
|
144
|
-
float((
|
|
139
|
+
uint nr = (slot & 3u) * 8u;
|
|
140
|
+
uint me = slot >> 2u;
|
|
141
|
+
vec3 wS = vec3(
|
|
142
|
+
float((gX[me] >> nr) & 0xffu),
|
|
143
|
+
float((gX[2u + me] >> nr) & 0xffu),
|
|
144
|
+
float((gX[4u + me] >> nr) & 0xffu)
|
|
145
145
|
);
|
|
146
|
-
vec3
|
|
147
|
-
float((
|
|
148
|
-
float((
|
|
149
|
-
float((
|
|
146
|
+
vec3 wR = vec3(
|
|
147
|
+
float((gX[6u + me] >> nr) & 0xffu),
|
|
148
|
+
float((gX[8u + me] >> nr) & 0xffu),
|
|
149
|
+
float((gX[10u + me] >> nr) & 0xffu)
|
|
150
150
|
);
|
|
151
|
-
vec3
|
|
152
|
-
vec3
|
|
153
|
-
if (
|
|
154
|
-
uint
|
|
155
|
-
if (
|
|
156
|
-
uint
|
|
157
|
-
uint
|
|
151
|
+
vec3 zp = kj.xyz + wS * ih;
|
|
152
|
+
vec3 zo = kj.xyz + wR * ih;
|
|
153
|
+
if (bP(o, d, zp, zo, tMax) <= 0.0) continue;
|
|
154
|
+
uint kl = meta & 0x1fu;
|
|
155
|
+
if (kl >= 24u) {
|
|
156
|
+
uint oZ = internalMask & ((1u << slot) - 1u);
|
|
157
|
+
uint wb = childBase + tl(oZ);
|
|
158
158
|
stack[++top] = ivec2(
|
|
159
|
-
|
|
159
|
+
fc + int(wb * 5u), bK
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
162
|
else {
|
|
163
|
-
uint triangleCount =
|
|
164
|
-
uint
|
|
165
|
-
uint
|
|
163
|
+
uint triangleCount = tl(meta >> 5u);
|
|
164
|
+
uint ut = qE + kl;
|
|
165
|
+
uint zC = 0x80000000u |
|
|
166
166
|
(triangleCount << 23u) |
|
|
167
|
-
(
|
|
168
|
-
stack[++top] = ivec2(int(
|
|
167
|
+
(ut & 0x007fffffu);
|
|
168
|
+
stack[++top] = ivec2(int(zC), bK);
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
-
else if (
|
|
174
|
-
int i = node.x +
|
|
175
|
-
vec4
|
|
176
|
-
vec4
|
|
177
|
-
vec4
|
|
178
|
-
vec4
|
|
179
|
-
primitiveCount = int(floatBitsToUint(
|
|
173
|
+
else if (hj == 2) {
|
|
174
|
+
int i = node.x + bufferOff;
|
|
175
|
+
vec4 zr = fetchBVH(i);
|
|
176
|
+
vec4 zs = fetchBVH(i + 1);
|
|
177
|
+
vec4 zt = fetchBVH(i + 2);
|
|
178
|
+
vec4 zu = fetchBVH(i + 3);
|
|
179
|
+
primitiveCount = int(floatBitsToUint(zt.w));
|
|
180
180
|
if (primitiveCount > 0) {
|
|
181
|
-
primitiveOffset =
|
|
181
|
+
primitiveOffset = bufferOff + fc + int(floatBitsToUint(zu.w));
|
|
182
182
|
}
|
|
183
183
|
else {
|
|
184
|
-
int left =
|
|
185
|
-
int right =
|
|
186
|
-
float d0 =
|
|
187
|
-
float d1 =
|
|
184
|
+
int left = fc + int(floatBitsToUint(zr.w) * 4u);
|
|
185
|
+
int right = fc + int(floatBitsToUint(zs.w) * 4u);
|
|
186
|
+
float d0 = bP(o, d, zr.xyz, zs.xyz, tMax);
|
|
187
|
+
float d1 = bP(o, d, zt.xyz, zu.xyz, tMax);
|
|
188
188
|
if (d0 > d1) {
|
|
189
|
-
if (d0 > 0.0) stack[++top] = ivec2(left,
|
|
190
|
-
if (d1 > 0.0) stack[++top] = ivec2(right,
|
|
189
|
+
if (d0 > 0.0) stack[++top] = ivec2(left, bK);
|
|
190
|
+
if (d1 > 0.0) stack[++top] = ivec2(right, bK);
|
|
191
191
|
}
|
|
192
192
|
else {
|
|
193
|
-
if (d1 > 0.0) stack[++top] = ivec2(right,
|
|
194
|
-
if (d0 > 0.0) stack[++top] = ivec2(left,
|
|
193
|
+
if (d1 > 0.0) stack[++top] = ivec2(right, bK);
|
|
194
|
+
if (d0 > 0.0) stack[++top] = ivec2(left, bK);
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
|
-
else if (
|
|
199
|
-
uint
|
|
200
|
-
if ((
|
|
201
|
-
primitiveCount = int((
|
|
202
|
-
primitiveOffset =
|
|
198
|
+
else if (hj == 1) {
|
|
199
|
+
uint iE = uint(node.x);
|
|
200
|
+
if ((iE & 0x80000000u) != 0u) {
|
|
201
|
+
primitiveCount = int((iE >> 23u) & 0xffu);
|
|
202
|
+
primitiveOffset = bufferOff + fc + int(iE & 0x007fffffu);
|
|
203
203
|
}
|
|
204
204
|
else {
|
|
205
|
-
int i = node.x +
|
|
206
|
-
vec4
|
|
207
|
-
vec4
|
|
208
|
-
vec4
|
|
209
|
-
vec4
|
|
210
|
-
vec3 nodeMin =
|
|
211
|
-
vec3
|
|
212
|
-
uint
|
|
213
|
-
floatBitsToUint(
|
|
214
|
-
floatBitsToUint(
|
|
205
|
+
int i = node.x + bufferOff;
|
|
206
|
+
vec4 xS = fetchBVH(i);
|
|
207
|
+
vec4 tR = fetchBVH(i + 1);
|
|
208
|
+
vec4 rW = fetchBVH(i + 2);
|
|
209
|
+
vec4 pL = fetchBVH(i + 3);
|
|
210
|
+
vec3 nodeMin = xS.xyz;
|
|
211
|
+
vec3 ej = vec3(xS.w, tR.x, tR.y);
|
|
212
|
+
uint nH[4] = uint[4](
|
|
213
|
+
floatBitsToUint(tR.z), floatBitsToUint(tR.w),
|
|
214
|
+
floatBitsToUint(rW.x), floatBitsToUint(rW.y)
|
|
215
215
|
);
|
|
216
|
-
vec4
|
|
217
|
-
vec4
|
|
218
|
-
vec4
|
|
219
|
-
vec4
|
|
220
|
-
vec4
|
|
221
|
-
vec4
|
|
222
|
-
vec3
|
|
223
|
-
vec3 padding =
|
|
224
|
-
vec4 tx0 = (nodeMin.x +
|
|
225
|
-
vec4 tx1 = (nodeMin.x +
|
|
226
|
-
vec4 ty0 = (nodeMin.y +
|
|
227
|
-
vec4 ty1 = (nodeMin.y +
|
|
228
|
-
vec4 tz0 = (nodeMin.z +
|
|
229
|
-
vec4 tz1 = (nodeMin.z +
|
|
230
|
-
vec4
|
|
231
|
-
vec4
|
|
232
|
-
vec4 distance = mix(
|
|
233
|
-
distance = mix(distance, vec4(-1.0), greaterThan(
|
|
234
|
-
float
|
|
216
|
+
vec4 yV = fh(floatBitsToUint(rW.z));
|
|
217
|
+
vec4 yW = fh(floatBitsToUint(rW.w));
|
|
218
|
+
vec4 yX = fh(floatBitsToUint(pL.x));
|
|
219
|
+
vec4 yS = fh(floatBitsToUint(pL.y));
|
|
220
|
+
vec4 yT = fh(floatBitsToUint(pL.z));
|
|
221
|
+
vec4 yU = fh(floatBitsToUint(pL.w));
|
|
222
|
+
vec3 invD = traversalInverse(d);
|
|
223
|
+
vec3 padding = ff(invD, o);
|
|
224
|
+
vec4 tx0 = (nodeMin.x + yV * ej.x - o.x) * invD.x;
|
|
225
|
+
vec4 tx1 = (nodeMin.x + yS * ej.x - o.x) * invD.x;
|
|
226
|
+
vec4 ty0 = (nodeMin.y + yW * ej.y - o.y) * invD.y;
|
|
227
|
+
vec4 ty1 = (nodeMin.y + yT * ej.y - o.y) * invD.y;
|
|
228
|
+
vec4 tz0 = (nodeMin.z + yX * ej.z - o.z) * invD.z;
|
|
229
|
+
vec4 tz1 = (nodeMin.z + yU * ej.z - o.z) * invD.z;
|
|
230
|
+
vec4 ot = max(max((min(tx0, tx1) - vec4(padding.x)), (min(ty0, ty1) - vec4(padding.y))), (min(tz0, tz1) - vec4(padding.z)));
|
|
231
|
+
vec4 uA = min(min((max(tx0, tx1) + vec4(padding.x)), (max(ty0, ty1) + vec4(padding.y))), (max(tz0, tz1) + vec4(padding.z)));
|
|
232
|
+
vec4 distance = mix(uA, ot, greaterThan(ot, vec4(0.0)));
|
|
233
|
+
distance = mix(distance, vec4(-1.0), greaterThan(ot, min(uA, vec4(tMax))));
|
|
234
|
+
float fi[4] = float[4](distance.x, distance.y, distance.z, distance.w);
|
|
235
235
|
|
|
236
236
|
|
|
237
237
|
for (int order = 0; order < 4; order++) {
|
|
238
|
-
float
|
|
239
|
-
int
|
|
238
|
+
float ee = -1.0;
|
|
239
|
+
int eq = -1;
|
|
240
240
|
for (int child = 0; child < 4; child++) {
|
|
241
|
-
if (
|
|
242
|
-
|
|
243
|
-
|
|
241
|
+
if (nH[child] != 0u && fi[child] > ee) {
|
|
242
|
+
ee = fi[child];
|
|
243
|
+
eq = child;
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
|
-
if (
|
|
247
|
-
uint
|
|
248
|
-
int
|
|
249
|
-
if ((
|
|
250
|
-
|
|
246
|
+
if (eq >= 0 && ee > 0.0) {
|
|
247
|
+
uint ph = nH[eq];
|
|
248
|
+
int kv = int(ph);
|
|
249
|
+
if ((ph & 0x80000000u) == 0u) {
|
|
250
|
+
kv += fc;
|
|
251
251
|
}
|
|
252
|
-
stack[++top] = ivec2(
|
|
253
|
-
|
|
252
|
+
stack[++top] = ivec2(kv, bK);
|
|
253
|
+
fi[eq] = -1.0;
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
}
|
|
258
258
|
else {
|
|
259
|
-
int i = node.x +
|
|
260
|
-
vec4 r1 =
|
|
261
|
-
int
|
|
259
|
+
int i = node.x + bufferOff;
|
|
260
|
+
vec4 r1 = fetchBVH(i);
|
|
261
|
+
int bh = floatBitsToInt(r1.w);
|
|
262
262
|
|
|
263
|
-
if (
|
|
263
|
+
if (bh >= 0) {
|
|
264
264
|
int left = node.x + 2;
|
|
265
|
-
int right =
|
|
265
|
+
int right = bh + fc;
|
|
266
266
|
|
|
267
|
-
float d0 =
|
|
268
|
-
float d1 =
|
|
267
|
+
float d0 = bP(o, d, fetchBVH(left + bufferOff).xyz, fetchBVH(left + 1 + bufferOff).xyz, tMax);
|
|
268
|
+
float d1 = bP(o, d, fetchBVH(right + bufferOff).xyz, fetchBVH(right + 1 + bufferOff).xyz, tMax);
|
|
269
269
|
if (d0 > d1) {
|
|
270
270
|
if (d0 > 0.0) {
|
|
271
|
-
stack[++top] = ivec2(left,
|
|
271
|
+
stack[++top] = ivec2(left, bK);
|
|
272
272
|
}
|
|
273
273
|
if (d1 > 0.0) {
|
|
274
|
-
stack[++top] = ivec2(right,
|
|
274
|
+
stack[++top] = ivec2(right, bK);
|
|
275
275
|
}
|
|
276
276
|
}
|
|
277
277
|
else {
|
|
278
278
|
if (d1 > 0.0) {
|
|
279
|
-
stack[++top] = ivec2(right,
|
|
279
|
+
stack[++top] = ivec2(right, bK);
|
|
280
280
|
}
|
|
281
281
|
if (d0 > 0.0) {
|
|
282
|
-
stack[++top] = ivec2(left,
|
|
282
|
+
stack[++top] = ivec2(left, bK);
|
|
283
283
|
}
|
|
284
284
|
}
|
|
285
285
|
}
|
|
286
286
|
else {
|
|
287
|
-
if (
|
|
288
|
-
for (int k = 0; k < -
|
|
289
|
-
vec4 r3 =
|
|
287
|
+
if (bK < 0) {
|
|
288
|
+
for (int k = 0; k < -bh; k++) {
|
|
289
|
+
vec4 r3 = fetchBVH(i + 2 + k);
|
|
290
|
+
int box = floatBitsToInt(r3.w);
|
|
291
|
+
if (bP(ray.o, ray.d, fetchBVH(box).xyz, fetchBVH(box + 1).xyz, tMax) > 0.0) {
|
|
290
292
|
stack[++top] = ivec2(floatBitsToInt(r3.y), floatBitsToInt(r3.x));
|
|
291
293
|
}
|
|
292
294
|
}
|
|
295
|
+
}
|
|
293
296
|
else {
|
|
294
|
-
primitiveCount = -
|
|
297
|
+
primitiveCount = -bh;
|
|
295
298
|
primitiveOffset = i + 2;
|
|
296
299
|
}
|
|
297
300
|
}
|
|
@@ -303,31 +306,31 @@ ${intersectTriangles}
|
|
|
303
306
|
`;
|
|
304
307
|
}
|
|
305
308
|
export default createShaderMixin({
|
|
309
|
+
defines: {
|
|
310
|
+
VERTEX_ATTRIBUTE_STRIDE: 2
|
|
311
|
+
},
|
|
306
312
|
uniforms: {
|
|
307
313
|
positionBuffer: Shader.uniform('sampler2D'),
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
uv1Buffer: Shader.uniform('sampler2D'),
|
|
312
|
-
colorBuffer: Shader.uniform('sampler2D'),
|
|
313
|
-
materialIndexBuffer: Shader.uniform('sampler2D'),
|
|
314
|
+
// Interleaved shading attributes; layout in webglVertexAttributes.ts.
|
|
315
|
+
vertexAttributes: Shader.uniform('sampler2D'),
|
|
316
|
+
// TLAS, BLASes and then the instance records.
|
|
314
317
|
bvhBuffer: Shader.uniform('sampler2D'),
|
|
315
|
-
instancesBuffer: Shader.uniform('sampler2D'),
|
|
316
318
|
bvhColumns: Shader.uniform('int', 1),
|
|
317
319
|
vertexColumns: Shader.uniform('int', 1),
|
|
318
|
-
|
|
320
|
+
vertexAttributeColumns: Shader.uniform('int', 1),
|
|
321
|
+
instancesOffset: Shader.uniform('int', 0),
|
|
319
322
|
blasOffset: Shader.uniform('int'),
|
|
320
323
|
isEmptyScene: Shader.uniform('bool')
|
|
321
324
|
},
|
|
322
325
|
main: glsl `
|
|
323
326
|
|
|
324
|
-
struct
|
|
327
|
+
struct fL {
|
|
325
328
|
vec3 p0;
|
|
326
329
|
vec3 p1;
|
|
327
330
|
vec3 p2;
|
|
328
331
|
};
|
|
329
332
|
#ifdef NUM_LIGHTS
|
|
330
|
-
float
|
|
333
|
+
float hM(float rad, vec3 pos, Ray r) {
|
|
331
334
|
vec3 op = pos - r.o;
|
|
332
335
|
float eps = 0.001;
|
|
333
336
|
float b = dot(op, r.d);
|
|
@@ -347,7 +350,7 @@ return t2;
|
|
|
347
350
|
return INF;
|
|
348
351
|
}
|
|
349
352
|
|
|
350
|
-
float
|
|
353
|
+
float oU(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
|
|
351
354
|
float dt = dot(r.d, n);
|
|
352
355
|
float t = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
353
356
|
|
|
@@ -366,7 +369,17 @@ return t;
|
|
|
366
369
|
return INF;
|
|
367
370
|
}
|
|
368
371
|
|
|
369
|
-
float
|
|
372
|
+
float sphereSolidAnglePdf(vec3 origin, vec3 center, float radius) {
|
|
373
|
+
float ao = distance(origin, center);
|
|
374
|
+
if (ao <= radius) return INV4PI;
|
|
375
|
+
float sinThetaMaxSquared = min(1.0, radius * radius / (ao * ao));
|
|
376
|
+
float cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));
|
|
377
|
+
|
|
378
|
+
float oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
|
|
379
|
+
return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
float iB(Ray r, Light light, out LightSampleRec lightSample) {
|
|
370
383
|
|
|
371
384
|
|
|
372
385
|
|
|
@@ -383,15 +396,15 @@ vec3 normal = normalize(cross(u, v));
|
|
|
383
396
|
if (dot(normal, r.d) > 0.)
|
|
384
397
|
return INF;
|
|
385
398
|
|
|
386
|
-
d =
|
|
399
|
+
d = oU(pos, u, v, normal, r);
|
|
387
400
|
if (d < 0.) {
|
|
388
401
|
d = INF;
|
|
389
402
|
}
|
|
390
403
|
else {
|
|
391
|
-
float
|
|
404
|
+
float cv = dot(-r.d, normal);
|
|
392
405
|
float spread = light.spread;
|
|
393
|
-
if (
|
|
394
|
-
lightSample.pdf = (d * d) / (light.area *
|
|
406
|
+
if (cv >= cos(spread * PI / 2.0)) {
|
|
407
|
+
lightSample.pdf = (d * d) / (light.area * cv);
|
|
395
408
|
lightSample.emission = light.emission;
|
|
396
409
|
}
|
|
397
410
|
}
|
|
@@ -400,10 +413,10 @@ lightSample.emission = light.emission;
|
|
|
400
413
|
#ifdef HAS_SPHERE_LIGHTS
|
|
401
414
|
if (type == SPHERE_LIGHT) {
|
|
402
415
|
if (light.radius <= 0.0) {
|
|
403
|
-
vec3
|
|
404
|
-
float projection = dot(
|
|
405
|
-
vec3
|
|
406
|
-
if (projection <= EPS || dot(
|
|
416
|
+
vec3 lj = light.position - r.o;
|
|
417
|
+
float projection = dot(lj, r.d);
|
|
418
|
+
vec3 bf = lj - projection * r.d;
|
|
419
|
+
if (projection <= EPS || dot(bf, bf) > 1e-8) return INF;
|
|
407
420
|
d = projection;
|
|
408
421
|
lightSample.direction = r.d;
|
|
409
422
|
lightSample.normal = -r.d;
|
|
@@ -411,21 +424,15 @@ lightSample.dist = d;
|
|
|
411
424
|
lightSample.pdf = 1.0;
|
|
412
425
|
lightSample.isDelta = true;
|
|
413
426
|
} else {
|
|
414
|
-
d =
|
|
427
|
+
d = hM(light.radius, light.position, r);
|
|
415
428
|
lightSample.isDelta = false;
|
|
416
429
|
}
|
|
417
430
|
if (d < 0.) {
|
|
418
431
|
d = INF;
|
|
419
432
|
}
|
|
420
433
|
else {
|
|
421
|
-
float ak = distance(r.o, light.position);
|
|
422
|
-
float cosThetaMax = ak <= light.radius
|
|
423
|
-
? -1.0
|
|
424
|
-
: sqrt(max(0.0, 1.0 - light.radius * light.radius / (ak * ak)));
|
|
425
434
|
if (light.radius > 0.0) {
|
|
426
|
-
lightSample.pdf =
|
|
427
|
-
? INV4PI
|
|
428
|
-
: 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
|
|
435
|
+
lightSample.pdf = sphereSolidAnglePdf(r.o, light.position, light.radius);
|
|
429
436
|
}
|
|
430
437
|
lightSample.emission = light.radius <= 0.0
|
|
431
438
|
? light.emission / max(d * d, 1e-8)
|
|
@@ -436,10 +443,10 @@ lightSample.emission = light.radius <= 0.0
|
|
|
436
443
|
#ifdef HAS_SPOT_LIGHTS
|
|
437
444
|
if (type == SPOT_LIGHT) {
|
|
438
445
|
if (light.radius <= 0.0) {
|
|
439
|
-
vec3
|
|
440
|
-
float projection = dot(
|
|
441
|
-
vec3
|
|
442
|
-
if (projection <= EPS || dot(
|
|
446
|
+
vec3 lj = light.position - r.o;
|
|
447
|
+
float projection = dot(lj, r.d);
|
|
448
|
+
vec3 bf = lj - projection * r.d;
|
|
449
|
+
if (projection <= EPS || dot(bf, bf) > 1e-8) return INF;
|
|
443
450
|
d = projection;
|
|
444
451
|
lightSample.direction = r.d;
|
|
445
452
|
lightSample.normal = -r.d;
|
|
@@ -447,23 +454,17 @@ lightSample.dist = d;
|
|
|
447
454
|
lightSample.pdf = 1.0;
|
|
448
455
|
lightSample.isDelta = true;
|
|
449
456
|
} else {
|
|
450
|
-
d =
|
|
457
|
+
d = hM(light.radius, light.position, r);
|
|
451
458
|
lightSample.isDelta = false;
|
|
452
459
|
}
|
|
453
460
|
if (d != INF) {
|
|
454
|
-
vec3
|
|
455
|
-
float
|
|
456
|
-
if (
|
|
457
|
-
float ak = distance(r.o, light.position);
|
|
458
|
-
float cosThetaMax = ak <= light.radius
|
|
459
|
-
? -1.0
|
|
460
|
-
: sqrt(max(0.0, 1.0 - light.radius * light.radius / (ak * ak)));
|
|
461
|
+
vec3 zA = r.o + d * r.d;
|
|
462
|
+
float od = evaluateSpotEmissionMultiplier(light, normalize(r.o - zA));
|
|
463
|
+
if (od <= 0.0) return INF;
|
|
461
464
|
if (light.radius > 0.0) {
|
|
462
|
-
lightSample.pdf =
|
|
463
|
-
? INV4PI
|
|
464
|
-
: 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
|
|
465
|
+
lightSample.pdf = sphereSolidAnglePdf(r.o, light.position, light.radius);
|
|
465
466
|
}
|
|
466
|
-
lightSample.emission = light.emission *
|
|
467
|
+
lightSample.emission = light.emission * od * (light.radius <= 0.0
|
|
467
468
|
? 1.0 / max(d * d, 1e-8)
|
|
468
469
|
: 1.0);
|
|
469
470
|
}
|
|
@@ -474,106 +475,122 @@ return d;
|
|
|
474
475
|
}
|
|
475
476
|
#endif
|
|
476
477
|
|
|
477
|
-
int
|
|
478
|
-
vec2 m00 =
|
|
479
|
-
vec2 m01 =
|
|
480
|
-
vec2 m02 =
|
|
481
|
-
vec2 m10 =
|
|
482
|
-
vec2 m11 =
|
|
483
|
-
vec2 m12 =
|
|
484
|
-
vec2 m20 =
|
|
485
|
-
vec2 m21 =
|
|
486
|
-
vec2 m22 =
|
|
487
|
-
float w00 = m00.y *
|
|
488
|
-
float w01 = m01.y *
|
|
489
|
-
float w02 = m02.y *
|
|
490
|
-
float w10 = m10.y *
|
|
491
|
-
float w11 = m11.y *
|
|
492
|
-
float w12 = m12.y *
|
|
493
|
-
float w20 = m20.y *
|
|
494
|
-
float w21 = m21.y *
|
|
495
|
-
float w22 = m22.y *
|
|
496
|
-
|
|
497
|
-
float
|
|
498
|
-
|
|
499
|
-
w00 = w00 /
|
|
500
|
-
w01 = w01 /
|
|
501
|
-
w02 = w02 /
|
|
502
|
-
w10 = w10 /
|
|
503
|
-
w11 = w11 /
|
|
504
|
-
w12 = w12 /
|
|
505
|
-
w20 = w20 /
|
|
506
|
-
w21 = w21 /
|
|
507
|
-
w22 = w22 /
|
|
508
|
-
|
|
509
|
-
float rand =
|
|
510
|
-
float
|
|
478
|
+
int fv(ivec4 m0, ivec4 m1, ivec4 m2, vec3 bary) {
|
|
479
|
+
vec2 m00 = af(m0.x);
|
|
480
|
+
vec2 m01 = af(m0.y);
|
|
481
|
+
vec2 m02 = af(m0.z);
|
|
482
|
+
vec2 m10 = af(m1.x);
|
|
483
|
+
vec2 m11 = af(m1.y);
|
|
484
|
+
vec2 m12 = af(m1.z);
|
|
485
|
+
vec2 m20 = af(m2.x);
|
|
486
|
+
vec2 m21 = af(m2.y);
|
|
487
|
+
vec2 m22 = af(m2.z);
|
|
488
|
+
float w00 = m00.y * bary.x;
|
|
489
|
+
float w01 = m01.y * bary.x;
|
|
490
|
+
float w02 = m02.y * bary.x;
|
|
491
|
+
float w10 = m10.y * bary.y;
|
|
492
|
+
float w11 = m11.y * bary.y;
|
|
493
|
+
float w12 = m12.y * bary.y;
|
|
494
|
+
float w20 = m20.y * bary.z;
|
|
495
|
+
float w21 = m21.y * bary.z;
|
|
496
|
+
float w22 = m22.y * bary.z;
|
|
497
|
+
|
|
498
|
+
float hB = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
499
|
+
|
|
500
|
+
w00 = w00 / hB;
|
|
501
|
+
w01 = w01 / hB + w00;
|
|
502
|
+
w02 = w02 / hB + w01;
|
|
503
|
+
w10 = w10 / hB + w02;
|
|
504
|
+
w11 = w11 / hB + w10;
|
|
505
|
+
w12 = w12 / hB + w11;
|
|
506
|
+
w20 = w20 / hB + w12;
|
|
507
|
+
w21 = w21 / hB + w20;
|
|
508
|
+
w22 = w22 / hB + w21;
|
|
509
|
+
|
|
510
|
+
float rand = cm(0u);
|
|
511
|
+
float oV;
|
|
511
512
|
if (rand < w00) {
|
|
512
|
-
|
|
513
|
+
oV = m00.x;
|
|
513
514
|
} else if (rand < w01) {
|
|
514
|
-
|
|
515
|
+
oV = m01.x;
|
|
515
516
|
} else if (rand < w02) {
|
|
516
|
-
|
|
517
|
+
oV = m02.x;
|
|
517
518
|
} else if (rand < w10) {
|
|
518
|
-
|
|
519
|
+
oV = m10.x;
|
|
519
520
|
} else if (rand < w11) {
|
|
520
|
-
|
|
521
|
+
oV = m11.x;
|
|
521
522
|
} else if (rand < w12) {
|
|
522
|
-
|
|
523
|
+
oV = m12.x;
|
|
523
524
|
} else if (rand < w20) {
|
|
524
|
-
|
|
525
|
+
oV = m20.x;
|
|
525
526
|
} else if (rand < w21) {
|
|
526
|
-
|
|
527
|
+
oV = m21.x;
|
|
527
528
|
} else {
|
|
528
|
-
|
|
529
|
+
oV = m22.x;
|
|
529
530
|
}
|
|
530
|
-
return int(
|
|
531
|
+
return int(oV);
|
|
531
532
|
}
|
|
532
533
|
|
|
533
534
|
|
|
534
|
-
vec4
|
|
535
|
+
vec4 fetchIns(int i);
|
|
536
|
+
|
|
537
|
+
vec4 bs(int vertex, int slot) {
|
|
538
|
+
return fetchData(vertexAttributes, vertex * VERTEX_ATTRIBUTE_STRIDE + slot, vertexAttributeColumns);
|
|
539
|
+
}
|
|
540
|
+
vec3 fetchVertexNormal(int vertex) { return bs(vertex, 0).xyz; }
|
|
541
|
+
vec2 er(int vertex) { return bs(vertex, 1).xy; }
|
|
542
|
+
ivec4 dT(int vertex) {
|
|
543
|
+
return ivec4(bs(vertex, 0).w, bs(vertex, 1).zw, 0.0);
|
|
544
|
+
}
|
|
545
|
+
vec2 dK(int vertex) {
|
|
546
|
+
#ifdef USE_UV1
|
|
547
|
+
return bs(vertex, VERTEX_UV1_SLOT).xy;
|
|
548
|
+
#else
|
|
549
|
+
return vec2(0.0);
|
|
550
|
+
#endif
|
|
551
|
+
}
|
|
552
|
+
#ifdef USE_TANGENT
|
|
553
|
+
vec4 ef(int vertex) { return bs(vertex, VERTEX_TANGENT_SLOT); }
|
|
554
|
+
#endif
|
|
535
555
|
|
|
536
556
|
|
|
537
|
-
mat2x3
|
|
538
|
-
float determinant =
|
|
539
|
-
vec3 t =
|
|
557
|
+
mat2x3 eI(vec3 normal, vec3 dp1, vec3 dp2, vec2 pU, vec2 pV, vec4 aT) {
|
|
558
|
+
float determinant = pU.x * pV.y - pU.y * pV.x;
|
|
559
|
+
vec3 t = aT.xyz;
|
|
540
560
|
vec3 b = vec3(0.0);
|
|
541
561
|
|
|
542
|
-
float
|
|
562
|
+
float sO = abs(aT.w) > 1.5 ? 0.0 : aT.w;
|
|
543
563
|
if (abs(determinant) > 1e-12) {
|
|
544
|
-
vec3 dt = (dp1 *
|
|
545
|
-
vec3 db = (dp2 *
|
|
564
|
+
vec3 dt = (dp1 * pV.y - dp2 * pU.y) / determinant;
|
|
565
|
+
vec3 db = (dp2 * pU.x - dp1 * pV.x) / determinant;
|
|
546
566
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
547
|
-
if (
|
|
567
|
+
if (sO == 0.0) { sO = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
|
|
548
568
|
}
|
|
549
569
|
t -= normal * dot(normal, t);
|
|
550
570
|
if (dot(t, t) < 1e-8) {
|
|
551
|
-
float
|
|
552
|
-
float
|
|
553
|
-
float xy = normal.x * normal.y *
|
|
554
|
-
t = vec3(1.0 +
|
|
555
|
-
b = vec3(xy,
|
|
571
|
+
float iP = (normal.z >= 0.0 ? 1.0 : -1.0);
|
|
572
|
+
float cA = -1.0 / (iP + normal.z);
|
|
573
|
+
float xy = normal.x * normal.y * cA;
|
|
574
|
+
t = vec3(1.0 + iP * normal.x * normal.x * cA, iP * xy, -iP * normal.x);
|
|
575
|
+
b = vec3(xy, iP + normal.y * normal.y * cA, -normal.y);
|
|
556
576
|
}
|
|
557
577
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
558
|
-
return mat2x3(t, b * (
|
|
578
|
+
return mat2x3(t, b * (sO < 0.0 ? -1.0 : 1.0));
|
|
559
579
|
}
|
|
560
580
|
|
|
561
|
-
void
|
|
581
|
+
void hI(inout SurfaceInteraction si, fL tri, vec3 barycentric, ivec3 index) {
|
|
562
582
|
si.hit = true;
|
|
563
583
|
si.position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
|
|
564
|
-
ivec2 i0 = hd(index.x, vertexColumns);
|
|
565
|
-
ivec2 i1 = hd(index.y, vertexColumns);
|
|
566
|
-
ivec2 i2 = hd(index.z, vertexColumns);
|
|
567
584
|
si.vertexColor = vec3(1.0);
|
|
568
585
|
#ifdef USE_VERTEX_COLOR
|
|
569
|
-
si.vertexColor = barycentric.x *
|
|
570
|
-
+ barycentric.y *
|
|
571
|
-
+ barycentric.z *
|
|
586
|
+
si.vertexColor = barycentric.x * bs(index.x, VERTEX_COLOR_SLOT).rgb
|
|
587
|
+
+ barycentric.y * bs(index.y, VERTEX_COLOR_SLOT).rgb
|
|
588
|
+
+ barycentric.z * bs(index.z, VERTEX_COLOR_SLOT).rgb;
|
|
572
589
|
#endif
|
|
573
590
|
|
|
574
|
-
vec3 n0 =
|
|
575
|
-
vec3 n1 =
|
|
576
|
-
vec3 n2 =
|
|
591
|
+
vec3 n0 = fetchVertexNormal(index.x);
|
|
592
|
+
vec3 n1 = fetchVertexNormal(index.y);
|
|
593
|
+
vec3 n2 = fetchVertexNormal(index.z);
|
|
577
594
|
vec3 normal = normalize(barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2);
|
|
578
595
|
si.vertexNormal = normal;
|
|
579
596
|
|
|
@@ -582,14 +599,14 @@ si.vertexNormal = normal;
|
|
|
582
599
|
|
|
583
600
|
|
|
584
601
|
vec3 geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
585
|
-
vec3
|
|
602
|
+
vec3 le = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
|
|
586
603
|
float a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
587
604
|
float b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
588
605
|
float c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
589
606
|
float h = a * barycentric.x * (barycentric.x - 1.0)
|
|
590
607
|
+ (a + b + c) * barycentric.x * barycentric.y
|
|
591
608
|
+ b * barycentric.y * (barycentric.y - 1.0);
|
|
592
|
-
if (dot(
|
|
609
|
+
if (dot(le, geometricNormal) > 0.0) {
|
|
593
610
|
float h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
594
611
|
float h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
595
612
|
float h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -607,155 +624,154 @@ h1 = max(dot(si.position - tri.p1, n1) + h1, 0.0);
|
|
|
607
624
|
h2 = max(dot(si.position - tri.p2, n2) + h2, 0.0);
|
|
608
625
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
609
626
|
}
|
|
610
|
-
si.shadowOffset =
|
|
611
|
-
|
|
627
|
+
si.shadowOffset = le * h;
|
|
612
628
|
|
|
613
|
-
ivec4 m0 =
|
|
614
|
-
ivec4 m1 =
|
|
615
|
-
ivec4 m2 =
|
|
629
|
+
ivec4 m0 = dT(index.x);
|
|
630
|
+
ivec4 m1 = dT(index.y);
|
|
631
|
+
ivec4 m2 = dT(index.z);
|
|
616
632
|
|
|
617
633
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
618
|
-
si.materialIndex =
|
|
634
|
+
si.materialIndex = fv(m0, m1, m2, barycentric);
|
|
619
635
|
}
|
|
620
636
|
|
|
621
|
-
vec2 uv0 =
|
|
622
|
-
vec2 uv1 =
|
|
623
|
-
vec2 uv2 =
|
|
637
|
+
vec2 uv0 = er(index.x);
|
|
638
|
+
vec2 uv1 = er(index.y);
|
|
639
|
+
vec2 uv2 = er(index.z);
|
|
624
640
|
#if defined(NUM_DIFFUSE_MAPS) || defined(NUM_NORMAL_MAPS) || defined(NUM_METALLIC_ROUGHNESS_MAPS) || defined(NUM_ROUGHNESS_MAPS) || defined(NUM_METALNESS_MAPS) || defined(NUM_EMISSIVE_MAPS) || defined(NUM_THIN_FILM_MAPS) || defined(NUM_ANISOTROPY_MAPS) || defined(NUM_COAT_NORMAL_MAPS)
|
|
625
641
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
626
|
-
vec2 secondaryUv0 =
|
|
627
|
-
vec2 secondaryUv1 =
|
|
628
|
-
vec2 secondaryUv2 =
|
|
629
|
-
vec2
|
|
642
|
+
vec2 secondaryUv0 = dK(index.x);
|
|
643
|
+
vec2 secondaryUv1 = dK(index.y);
|
|
644
|
+
vec2 secondaryUv2 = dK(index.z);
|
|
645
|
+
vec2 cT = barycentric.x * secondaryUv0
|
|
630
646
|
+ barycentric.y * secondaryUv1
|
|
631
647
|
+ barycentric.z * secondaryUv2;
|
|
632
648
|
|
|
633
|
-
vec4
|
|
634
|
-
int uvProjection = int(
|
|
649
|
+
vec4 mU = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
|
|
650
|
+
int uvProjection = int(mU.r);
|
|
635
651
|
if (uvProjection > 0) {
|
|
636
|
-
uv =
|
|
637
|
-
|
|
652
|
+
uv = gW(uvProjection, si.position, normal, mU.zw);
|
|
653
|
+
cT = uv;
|
|
638
654
|
} else {
|
|
639
|
-
uv *=
|
|
640
|
-
|
|
655
|
+
uv *= mU.zw;
|
|
656
|
+
cT *= mU.zw;
|
|
641
657
|
}
|
|
642
658
|
#else
|
|
643
659
|
vec2 uv = vec2(0.0);
|
|
644
|
-
vec2
|
|
660
|
+
vec2 cT = vec2(0.0);
|
|
645
661
|
#endif
|
|
646
662
|
|
|
647
663
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
648
664
|
si.coatNormal = normal;
|
|
649
665
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
650
|
-
float
|
|
666
|
+
float qK = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
|
|
651
667
|
#endif
|
|
652
668
|
#endif
|
|
653
669
|
vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);
|
|
654
|
-
float
|
|
655
|
-
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 ||
|
|
670
|
+
float wB = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
|
|
671
|
+
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || wB != 0.0
|
|
656
672
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
657
673
|
|| fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_COAT).w > 0.0
|
|
658
674
|
#endif
|
|
659
675
|
) {
|
|
660
676
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
661
677
|
vec3 dp2 = tri.p1 - tri.p2;
|
|
662
|
-
vec4
|
|
678
|
+
vec4 aT = vec4(0.0);
|
|
663
679
|
#ifdef USE_TANGENT
|
|
664
|
-
|
|
665
|
-
+ barycentric.y *
|
|
666
|
-
+ barycentric.z *
|
|
680
|
+
aT = barycentric.x * ef(index.x)
|
|
681
|
+
+ barycentric.y * ef(index.y)
|
|
682
|
+
+ barycentric.z * ef(index.z);
|
|
667
683
|
#endif
|
|
668
|
-
mat2x3
|
|
669
|
-
si.geometryTangent =
|
|
670
|
-
si.geometryBitangent =
|
|
671
|
-
mat2x3
|
|
684
|
+
mat2x3 eV = eI(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
|
|
685
|
+
si.geometryTangent = eV[0];
|
|
686
|
+
si.geometryBitangent = eV[1];
|
|
687
|
+
mat2x3 gp = eV;
|
|
672
688
|
#ifdef NUM_ANISOTROPY_MAPS
|
|
673
689
|
if (directionMaterial.x >= 0.0 && mapUvChannel[int(directionMaterial.x)] > 0.5) {
|
|
674
|
-
vec2 a =
|
|
675
|
-
vec2 b =
|
|
676
|
-
vec2 c =
|
|
677
|
-
|
|
690
|
+
vec2 a = dK(index.x);
|
|
691
|
+
vec2 b = dK(index.y);
|
|
692
|
+
vec2 c = dK(index.z);
|
|
693
|
+
gp = eI(normal, dp1, dp2, a-c, b-c, (aT.w == 0.0 ? vec4(0.0) : aT));
|
|
678
694
|
}
|
|
679
695
|
#endif
|
|
680
|
-
si.directionTangent =
|
|
681
|
-
si.directionBitangent =
|
|
696
|
+
si.directionTangent = gp[0];
|
|
697
|
+
si.directionBitangent = gp[1];
|
|
682
698
|
#if defined(USE_COAT_NORMAL_FRAMES) && defined(NUM_COAT_NORMAL_MAPS)
|
|
683
|
-
if (
|
|
684
|
-
int
|
|
685
|
-
mat2x3
|
|
686
|
-
if (mapUvChannel[
|
|
687
|
-
vec2 a =
|
|
688
|
-
vec2 b =
|
|
689
|
-
vec2 c =
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
}
|
|
693
|
-
vec3 decoded = sampleMap(
|
|
694
|
-
vec3 mapped =
|
|
695
|
-
+
|
|
699
|
+
if (qK >= 0.0) {
|
|
700
|
+
int lI = int(qK);
|
|
701
|
+
mat2x3 nI = eV;
|
|
702
|
+
if (mapUvChannel[lI] > 0.5) {
|
|
703
|
+
vec2 a = dK(index.x);
|
|
704
|
+
vec2 b = dK(index.y);
|
|
705
|
+
vec2 c = dK(index.z);
|
|
706
|
+
nI = eI(normal, dp1, dp2, a-c, b-c,
|
|
707
|
+
aT.w == 0.0 ? vec4(0.0) : aT);
|
|
708
|
+
}
|
|
709
|
+
vec3 decoded = sampleMap(lI, getMapUvSet(lI, uv, cT)).rgb * 2.0 - 1.0;
|
|
710
|
+
vec3 mapped = nI[0] * decoded.x * directionMaterial.z
|
|
711
|
+
+ nI[1] * decoded.y * directionMaterial.w + normal * decoded.z;
|
|
696
712
|
if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }
|
|
697
713
|
}
|
|
698
714
|
#endif
|
|
699
715
|
}
|
|
700
716
|
|
|
701
717
|
si.uv = uv;
|
|
702
|
-
si.uv1 =
|
|
718
|
+
si.uv1 = cT;
|
|
703
719
|
|
|
704
720
|
#ifdef USE_TANGENT
|
|
705
|
-
vec3 t0 =
|
|
706
|
-
vec3 t1 =
|
|
707
|
-
vec3 t2 =
|
|
721
|
+
vec3 t0 = ef(index.x).xyz;
|
|
722
|
+
vec3 t1 = ef(index.y).xyz;
|
|
723
|
+
vec3 t2 = ef(index.z).xyz;
|
|
708
724
|
si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z * t2);
|
|
709
725
|
#endif
|
|
710
726
|
#if defined(NUM_NORMAL_MAPS)
|
|
711
727
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
712
728
|
vec3 dp2 = tri.p1 - tri.p2;
|
|
713
|
-
vec2
|
|
714
|
-
vec2
|
|
715
|
-
si.normal =
|
|
716
|
-
si.materialIndex, uv, normal, dp1, dp2,
|
|
729
|
+
vec2 pU = uv0 - uv2;
|
|
730
|
+
vec2 pV = uv1 - uv2;
|
|
731
|
+
si.normal = qa(
|
|
732
|
+
si.materialIndex, uv, normal, dp1, dp2, pU, pV
|
|
717
733
|
);
|
|
718
734
|
#else
|
|
719
735
|
si.normal = normal;
|
|
720
736
|
#endif
|
|
721
737
|
}
|
|
722
738
|
|
|
723
|
-
struct
|
|
739
|
+
struct eF {
|
|
724
740
|
float t;
|
|
725
741
|
vec3 barycentric;
|
|
726
742
|
};
|
|
727
743
|
|
|
728
|
-
vec4
|
|
729
|
-
return
|
|
744
|
+
vec4 fetchBVH(int i) {
|
|
745
|
+
return fetchData(bvhBuffer, i, bvhColumns);
|
|
730
746
|
}
|
|
731
747
|
|
|
732
|
-
vec4
|
|
733
|
-
return
|
|
748
|
+
vec4 fetchIns(int i) {
|
|
749
|
+
return fetchData(bvhBuffer, instancesOffset + i, bvhColumns);
|
|
734
750
|
}
|
|
735
751
|
|
|
736
752
|
|
|
737
753
|
|
|
738
|
-
uint
|
|
754
|
+
uint tl(uint value) {
|
|
739
755
|
value -= (value >> 1u) & 0x55555555u;
|
|
740
756
|
value = (value & 0x33333333u) + ((value >> 2u) & 0x33333333u);
|
|
741
757
|
value = (value + (value >> 4u)) & 0x0f0f0f0fu;
|
|
742
758
|
return (value * 0x01010101u) >> 24u;
|
|
743
759
|
}
|
|
744
760
|
|
|
745
|
-
vec4
|
|
761
|
+
vec4 fh(uint nk) {
|
|
746
762
|
return vec4(
|
|
747
|
-
float(
|
|
748
|
-
float((
|
|
749
|
-
float((
|
|
750
|
-
float(
|
|
763
|
+
float(nk & 0xffu),
|
|
764
|
+
float((nk >> 8u) & 0xffu),
|
|
765
|
+
float((nk >> 16u) & 0xffu),
|
|
766
|
+
float(nk >> 24u)
|
|
751
767
|
) / 255.0;
|
|
752
768
|
}
|
|
753
769
|
|
|
754
770
|
|
|
755
771
|
|
|
756
772
|
|
|
757
|
-
|
|
758
|
-
|
|
773
|
+
eF fY(vec3 o, vec3 d, fL tri, int ei, vec3 gZ, float tMax) {
|
|
774
|
+
eF ti;
|
|
759
775
|
|
|
760
776
|
|
|
761
777
|
vec3 p0t = tri.p0 - o;
|
|
@@ -763,20 +779,20 @@ vec3 p1t = tri.p1 - o;
|
|
|
763
779
|
vec3 p2t = tri.p2 - o;
|
|
764
780
|
|
|
765
781
|
|
|
766
|
-
if (
|
|
782
|
+
if (ei == 0) {
|
|
767
783
|
p0t = p0t.yzx;
|
|
768
784
|
p1t = p1t.yzx;
|
|
769
785
|
p2t = p2t.yzx;
|
|
770
|
-
} else if (
|
|
786
|
+
} else if (ei == 1) {
|
|
771
787
|
p0t = p0t.zxy;
|
|
772
788
|
p1t = p1t.zxy;
|
|
773
789
|
p2t = p2t.zxy;
|
|
774
790
|
}
|
|
775
791
|
|
|
776
792
|
|
|
777
|
-
p0t.xy +=
|
|
778
|
-
p1t.xy +=
|
|
779
|
-
p2t.xy +=
|
|
793
|
+
p0t.xy += gZ.xy * p0t.z;
|
|
794
|
+
p1t.xy += gZ.xy * p1t.z;
|
|
795
|
+
p2t.xy += gZ.xy * p2t.z;
|
|
780
796
|
|
|
781
797
|
|
|
782
798
|
vec3 e = vec3(
|
|
@@ -786,9 +802,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
786
802
|
);
|
|
787
803
|
|
|
788
804
|
#ifdef DEPTH_QUERY_MODE
|
|
789
|
-
vec3
|
|
805
|
+
vec3 ua = abs(vec3(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
790
806
|
+ abs(vec3(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
791
|
-
e = mix(e, vec3(0.0), lessThanEqual(abs(e),
|
|
807
|
+
e = mix(e, vec3(0.0), lessThanEqual(abs(e), ua * 1e-6));
|
|
792
808
|
#endif
|
|
793
809
|
|
|
794
810
|
|
|
@@ -801,19 +817,19 @@ float det = e.x + e.y + e.z;
|
|
|
801
817
|
if (det == 0.0) return ti;
|
|
802
818
|
#endif
|
|
803
819
|
|
|
804
|
-
p0t.z *=
|
|
805
|
-
p1t.z *=
|
|
806
|
-
p2t.z *=
|
|
807
|
-
float
|
|
820
|
+
p0t.z *= gZ.z;
|
|
821
|
+
p1t.z *= gZ.z;
|
|
822
|
+
p2t.z *= gZ.z;
|
|
823
|
+
float tQ = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
808
824
|
|
|
809
825
|
|
|
810
|
-
if (abs(
|
|
826
|
+
if (abs(tQ) > abs(tMax * det)) {
|
|
811
827
|
return ti;
|
|
812
828
|
}
|
|
813
829
|
|
|
814
|
-
float
|
|
815
|
-
ti.t =
|
|
816
|
-
ti.barycentric = e *
|
|
830
|
+
float vu = 1. / det;
|
|
831
|
+
ti.t = tQ * vu;
|
|
832
|
+
ti.barycentric = e * vu;
|
|
817
833
|
|
|
818
834
|
return ti;
|
|
819
835
|
}
|
|
@@ -824,18 +840,18 @@ vec3 max;
|
|
|
824
840
|
};
|
|
825
841
|
|
|
826
842
|
|
|
827
|
-
vec3
|
|
843
|
+
vec3 traversalInverse(vec3 d) {
|
|
828
844
|
#ifdef DEPTH_QUERY_MODE
|
|
829
|
-
vec3
|
|
830
|
-
return 1.0 /
|
|
845
|
+
vec3 ah = mix(d, mix(vec3(1e-20), vec3(-1e-20), lessThan(d, vec3(0.0))), lessThan(abs(d), vec3(1e-20)));
|
|
846
|
+
return 1.0 / ah;
|
|
831
847
|
#else
|
|
832
848
|
return 1.0 / d;
|
|
833
849
|
#endif
|
|
834
850
|
}
|
|
835
851
|
|
|
836
|
-
vec3
|
|
852
|
+
vec3 ff(vec3 invD, vec3 o) {
|
|
837
853
|
#ifdef DEPTH_QUERY_MODE
|
|
838
|
-
return abs(
|
|
854
|
+
return abs(invD) * max(vec3(1.0), abs(o)) * 1e-6;
|
|
839
855
|
#else
|
|
840
856
|
return vec3(0.0);
|
|
841
857
|
#endif
|
|
@@ -843,21 +859,21 @@ return vec3(0.0);
|
|
|
843
859
|
|
|
844
860
|
|
|
845
861
|
|
|
846
|
-
float
|
|
862
|
+
float bP(vec3 o, vec3 d, vec3 zT, vec3 zS, float tMax) {
|
|
847
863
|
#ifdef DEPTH_QUERY_MODE
|
|
848
|
-
vec3
|
|
849
|
-
vec3
|
|
850
|
-
vec3
|
|
851
|
-
vec3 padding =
|
|
864
|
+
vec3 invD = traversalInverse(d);
|
|
865
|
+
vec3 zi = (zT - o) * invD;
|
|
866
|
+
vec3 zj = (zS - o) * invD;
|
|
867
|
+
vec3 padding = ff(invD, o);
|
|
852
868
|
#else
|
|
853
|
-
vec3
|
|
854
|
-
vec3
|
|
869
|
+
vec3 zi = (zT - o) / d;
|
|
870
|
+
vec3 zj = (zS - o) / d;
|
|
855
871
|
vec3 padding = vec3(0.0);
|
|
856
872
|
#endif
|
|
857
|
-
vec3
|
|
858
|
-
vec3
|
|
859
|
-
float t0 = max(
|
|
860
|
-
float t1 = min(
|
|
873
|
+
vec3 ot = min(zi, zj) - padding;
|
|
874
|
+
vec3 uA = max(zi, zj) + padding;
|
|
875
|
+
float t0 = max(ot.x, max(ot.y, ot.z));
|
|
876
|
+
float t1 = min(uA.x, min(uA.y, uA.z));
|
|
861
877
|
|
|
862
878
|
return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);
|
|
863
879
|
}
|
|
@@ -866,12 +882,12 @@ int maxDimension(vec3 v) {
|
|
|
866
882
|
return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);
|
|
867
883
|
}
|
|
868
884
|
|
|
869
|
-
vec3
|
|
885
|
+
vec3 nV(vec3 d, int ei) {
|
|
870
886
|
|
|
871
887
|
|
|
872
|
-
if (
|
|
888
|
+
if (ei == 0) {
|
|
873
889
|
return vec3(-d.y, -d.z, 1.0) / d.x;
|
|
874
|
-
} else if (
|
|
890
|
+
} else if (ei == 1) {
|
|
875
891
|
return vec3(-d.z, -d.x, 1.0) / d.y;
|
|
876
892
|
} else {
|
|
877
893
|
return vec3(-d.x, -d.y, 1.0) / d.z;
|
|
@@ -886,39 +902,39 @@ if (isEmptyScene) {
|
|
|
886
902
|
return;
|
|
887
903
|
}
|
|
888
904
|
|
|
889
|
-
int
|
|
890
|
-
vec3
|
|
891
|
-
int
|
|
905
|
+
int ei = maxDimension(abs(ray.d));
|
|
906
|
+
vec3 gZ = nV(ray.d, ei);
|
|
907
|
+
int am;
|
|
892
908
|
|
|
893
909
|
${getBVHTraverseCode(glsl `
|
|
894
910
|
si.triangleIndex = triangleIndex;
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
911
|
+
mL = tri;
|
|
912
|
+
hU = faceNormal;
|
|
913
|
+
aw = hit.barycentric;
|
|
914
|
+
hL = index;
|
|
915
|
+
tD = true;
|
|
916
|
+
am = bK;
|
|
901
917
|
`)}
|
|
902
918
|
|
|
903
|
-
if (
|
|
904
|
-
si.instanceIndex =
|
|
905
|
-
si.materialIndex = int(
|
|
919
|
+
if (tD) {
|
|
920
|
+
si.instanceIndex = am;
|
|
921
|
+
si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
906
922
|
|
|
907
|
-
|
|
923
|
+
hI(si, mL, aw, hL);
|
|
908
924
|
mat4 l2w = mat4(
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
925
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
926
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
927
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 7),
|
|
928
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 8)
|
|
913
929
|
);
|
|
914
930
|
mat4 w2l = mat4(
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
931
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 1),
|
|
932
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
|
|
933
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
934
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
919
935
|
);
|
|
920
936
|
mat3 aH = transpose(mat3(w2l));
|
|
921
|
-
si.faceNormal = normalize(aH *
|
|
937
|
+
si.faceNormal = normalize(aH * hU);
|
|
922
938
|
si.vertexNormal = normalize(aH * si.vertexNormal);
|
|
923
939
|
si.normal = normalize(aH * si.normal);
|
|
924
940
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
@@ -947,42 +963,42 @@ return;
|
|
|
947
963
|
}
|
|
948
964
|
|
|
949
965
|
bool doubleSided = true;
|
|
950
|
-
int
|
|
951
|
-
vec3
|
|
952
|
-
int
|
|
966
|
+
int ei = maxDimension(abs(ray.d));
|
|
967
|
+
vec3 gZ = nV(ray.d, ei);
|
|
968
|
+
int am;
|
|
953
969
|
|
|
954
970
|
${getBVHTraverseCode(glsl `
|
|
955
971
|
si.triangleIndex = triangleIndex;
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
972
|
+
mL = tri;
|
|
973
|
+
hU = faceNormal;
|
|
974
|
+
aw = hit.barycentric;
|
|
975
|
+
hL = index;
|
|
976
|
+
tD = true;
|
|
977
|
+
am = bK;
|
|
962
978
|
`, glsl `
|
|
963
|
-
if (
|
|
979
|
+
if (bK != instanceIndex) {
|
|
964
980
|
continue;
|
|
965
981
|
}
|
|
966
982
|
`, 'maxDistance')}
|
|
967
983
|
|
|
968
|
-
if (
|
|
969
|
-
si.instanceIndex =
|
|
970
|
-
si.materialIndex = int(
|
|
971
|
-
|
|
984
|
+
if (tD) {
|
|
985
|
+
si.instanceIndex = am;
|
|
986
|
+
si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
987
|
+
hI(si, mL, aw, hL);
|
|
972
988
|
mat4 l2w = mat4(
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
989
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
990
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
991
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 7),
|
|
992
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 8)
|
|
977
993
|
);
|
|
978
994
|
mat4 w2l = mat4(
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
995
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 1),
|
|
996
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
|
|
997
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
998
|
+
fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
983
999
|
);
|
|
984
1000
|
mat3 aH = transpose(mat3(w2l));
|
|
985
|
-
si.faceNormal = normalize(aH *
|
|
1001
|
+
si.faceNormal = normalize(aH * hU);
|
|
986
1002
|
si.vertexNormal = normalize(aH * si.vertexNormal);
|
|
987
1003
|
si.normal = normalize(aH * si.normal);
|
|
988
1004
|
#ifdef USE_COAT_NORMAL_FRAMES
|
|
@@ -1002,35 +1018,32 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
|
|
|
1002
1018
|
}
|
|
1003
1019
|
}
|
|
1004
1020
|
|
|
1005
|
-
bool intersectSceneShadow(in Ray ray, float lightDistance, int
|
|
1021
|
+
bool intersectSceneShadow(in Ray ray, float lightDistance, int kx) {
|
|
1006
1022
|
|
|
1007
1023
|
if (isEmptyScene) {
|
|
1008
1024
|
return false;
|
|
1009
1025
|
}
|
|
1010
1026
|
|
|
1011
1027
|
bool doubleSided = true;
|
|
1012
|
-
int
|
|
1013
|
-
vec3
|
|
1028
|
+
int ei = maxDimension(abs(ray.d));
|
|
1029
|
+
vec3 gZ = nV(ray.d, ei);
|
|
1014
1030
|
|
|
1015
1031
|
${getBVHTraverseCode(glsl `
|
|
1016
1032
|
|
|
1017
1033
|
|
|
1018
|
-
bool
|
|
1034
|
+
bool kc = true;
|
|
1019
1035
|
vec3 barycentric = hit.barycentric;
|
|
1020
1036
|
vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
|
|
1021
1037
|
|
|
1022
|
-
if (
|
|
1038
|
+
if (kc) {
|
|
1023
1039
|
#ifdef HAS_ALPHA
|
|
1024
|
-
int materialIndex = int(
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
|
|
1029
|
-
ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
|
|
1030
|
-
ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
|
|
1040
|
+
int materialIndex = int(af(floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
1041
|
+
ivec4 m0 = dT(index.x);
|
|
1042
|
+
ivec4 m1 = dT(index.y);
|
|
1043
|
+
ivec4 m2 = dT(index.z);
|
|
1031
1044
|
|
|
1032
1045
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
1033
|
-
materialIndex =
|
|
1046
|
+
materialIndex = fv(m0, m1, m2, barycentric);
|
|
1034
1047
|
}
|
|
1035
1048
|
|
|
1036
1049
|
int ii = materialIndex * MAT_DATA_SIZE;
|
|
@@ -1040,16 +1053,16 @@ float alpha = fetchMatData(ii + MAT_ROW_ALPHA_FILM).r;
|
|
|
1040
1053
|
if (mapAlphaUsage == ${mapAlphaUsageConstants.alpha + ''}) {
|
|
1041
1054
|
int diffuseMapIndex = int(fetchMatData(ii + MAT_ROW_METALLIC_MAPS).z);
|
|
1042
1055
|
if (diffuseMapIndex >= 0) {
|
|
1043
|
-
vec2 uv0 =
|
|
1044
|
-
vec2 uv1 =
|
|
1045
|
-
vec2 uv2 =
|
|
1056
|
+
vec2 uv0 = er(index.x);
|
|
1057
|
+
vec2 uv1 = er(index.y);
|
|
1058
|
+
vec2 uv2 = er(index.z);
|
|
1046
1059
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1047
|
-
vec4
|
|
1048
|
-
int uvProjection = int(
|
|
1060
|
+
vec4 mU = fetchMatData(ii + MAT_ROW_UV);
|
|
1061
|
+
int uvProjection = int(mU.r);
|
|
1049
1062
|
if (uvProjection > 0) {
|
|
1050
|
-
uv =
|
|
1063
|
+
uv = gW(uvProjection, position, hU, mU.zw);
|
|
1051
1064
|
} else {
|
|
1052
|
-
uv *=
|
|
1065
|
+
uv *= mU.zw;
|
|
1053
1066
|
}
|
|
1054
1067
|
|
|
1055
1068
|
alpha *= sampleMap(diffuseMapIndex, uv).a;
|
|
@@ -1059,36 +1072,36 @@ alpha *= sampleMap(diffuseMapIndex, uv).a;
|
|
|
1059
1072
|
#ifdef NUM_ALPHA_MAPS
|
|
1060
1073
|
int alphaMapIndex = int(fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).z);
|
|
1061
1074
|
if (alphaMapIndex >= 0) {
|
|
1062
|
-
vec2 uv0 =
|
|
1063
|
-
vec2 uv1 =
|
|
1064
|
-
vec2 uv2 =
|
|
1075
|
+
vec2 uv0 = er(index.x);
|
|
1076
|
+
vec2 uv1 = er(index.y);
|
|
1077
|
+
vec2 uv2 = er(index.z);
|
|
1065
1078
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1066
|
-
vec4
|
|
1067
|
-
int uvProjection = int(
|
|
1079
|
+
vec4 mU = fetchMatData(ii + MAT_ROW_UV);
|
|
1080
|
+
int uvProjection = int(mU.r);
|
|
1068
1081
|
if (uvProjection > 0) {
|
|
1069
|
-
uv =
|
|
1082
|
+
uv = gW(uvProjection, position, hU, mU.zw);
|
|
1070
1083
|
} else {
|
|
1071
|
-
uv *=
|
|
1084
|
+
uv *= mU.zw;
|
|
1072
1085
|
}
|
|
1073
1086
|
alpha *= sampleMap(alphaMapIndex, uv).g;
|
|
1074
1087
|
}
|
|
1075
1088
|
#endif
|
|
1076
1089
|
float alphaCutoff = fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).a;
|
|
1077
|
-
alpha =
|
|
1090
|
+
alpha = mB(
|
|
1078
1091
|
alpha, int(fetchMatData(ii + MAT_ROW_ALPHA).w), alphaCutoff
|
|
1079
1092
|
);
|
|
1080
|
-
if (
|
|
1093
|
+
if (cm(0u) > alpha) {
|
|
1081
1094
|
|
|
1082
1095
|
tMax = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
1083
|
-
|
|
1096
|
+
kc = false;
|
|
1084
1097
|
}
|
|
1085
1098
|
#endif
|
|
1086
1099
|
}
|
|
1087
|
-
if (
|
|
1100
|
+
if (kc) {
|
|
1088
1101
|
return true;
|
|
1089
1102
|
}
|
|
1090
1103
|
`, glsl `
|
|
1091
|
-
if (triangleIndex ==
|
|
1104
|
+
if (triangleIndex == kx) {
|
|
1092
1105
|
continue;
|
|
1093
1106
|
}
|
|
1094
1107
|
`, 'min(max(lightDistance, 0.0), RAY_MAX_DISTANCE)')}
|