@meimu/mutracer 0.1.5 → 0.3.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 +10 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +12316 -9228
- package/docs/api.md +232 -21
- package/docs/caustics.md +80 -0
- package/docs/denoising.md +30 -15
- package/docs/materials.md +6 -5
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +73 -1
- package/docs/technical/continuous-spectrum.md +93 -0
- package/docs/threejs.md +14 -5
- package/docs/updates.md +46 -2
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +15 -8
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +28 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +4 -0
- package/lib/Engine.js +99 -37
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +98 -15
- package/lib/Render.js +275 -27
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +11 -1
- package/lib/RenderLoop.js +120 -15
- 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 +11 -0
- package/lib/renderer/GPUTraceQueue.js +33 -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 +36 -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/WGPUCausticLightPass.d.ts +48 -0
- package/lib/renderer/WGPUCausticLightPass.js +217 -0
- package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
- 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/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 +132 -29
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +83 -56
- package/lib/renderer/WGPURayTracePass.js +884 -837
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +297 -82
- 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 +7 -4
- package/lib/renderer/WebGLFullQuadPass.js +22 -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 +18 -3
- package/lib/renderer/WebGLRayTracePass.js +121 -9
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +126 -22
- 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 +6 -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/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/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/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 -67
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
- 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 +160 -157
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
- 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 +72 -67
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
- 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 +143 -120
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
- 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/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.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +271 -248
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
- 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 +22 -18
- package/lib/renderer/lightSampling.js +135 -62
- 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 +7 -3
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -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/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 +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 +119 -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/spectrum.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.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/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- 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 +22 -0
- package/lib/renderer/wgpuShaderSource.js +33 -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/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +537 -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.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
- 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 +747 -704
- 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 +4 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
- 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 +137 -137
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -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 -144
- 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 +269 -245
- 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 +27 -14
- 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 +91 -95
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- 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/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.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 +25 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
- 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 +6 -168
- 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 +36 -3
- package/lib/settings/render.js +4 -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 +20 -7
- 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 +5 -0
- package/package.json +33 -7
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.js.map +0 -1
package/lib/util/geometry.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { attributeLength, attributeValue, indexStorage } from '../scene/attributeData.js';
|
|
2
|
+
import { read, write } from '../math/access.js';
|
|
1
3
|
import { vec3 } from '../math.js';
|
|
2
4
|
import { Attribute } from '../scene/Geometry.js';
|
|
3
5
|
/** Computes smooth, area-weighted vertex normals into `geometry.normal`. */
|
|
@@ -5,7 +7,9 @@ export function generateVertexNormals(geometry) {
|
|
|
5
7
|
if (!geometry.vertexCount) {
|
|
6
8
|
return;
|
|
7
9
|
}
|
|
8
|
-
|
|
10
|
+
// Explicit geometry helpers may run before the renderer is notified of edits.
|
|
11
|
+
// Normalize their current input rather than consulting a revision cache.
|
|
12
|
+
const indices = indexStorage(geometry.indices.array);
|
|
9
13
|
const positions = geometry.position.array;
|
|
10
14
|
const normals = new Float32Array(positions.length);
|
|
11
15
|
geometry.normal = new Attribute(normals, 3);
|
|
@@ -15,13 +19,13 @@ export function generateVertexNormals(geometry) {
|
|
|
15
19
|
const v21 = vec3.create();
|
|
16
20
|
const v32 = vec3.create();
|
|
17
21
|
const n = vec3.create();
|
|
18
|
-
const len = indices ? indices
|
|
22
|
+
const len = indices ? attributeLength(indices) : geometry.vertexCount;
|
|
19
23
|
let i1, i2, i3;
|
|
20
24
|
for (let f = 0; f < len;) {
|
|
21
25
|
if (indices) {
|
|
22
|
-
i1 = indices
|
|
23
|
-
i2 = indices
|
|
24
|
-
i3 = indices
|
|
26
|
+
i1 = attributeValue(indices, f++);
|
|
27
|
+
i2 = attributeValue(indices, f++);
|
|
28
|
+
i3 = attributeValue(indices, f++);
|
|
25
29
|
}
|
|
26
30
|
else {
|
|
27
31
|
i1 = f++;
|
|
@@ -56,9 +60,11 @@ export function generateVertexNormals(geometry) {
|
|
|
56
60
|
* both sides of a hard edge with different normals.
|
|
57
61
|
*/
|
|
58
62
|
export function generateCreasedVertexNormals(geometry, creaseAngleDegrees = 180) {
|
|
59
|
-
|
|
63
|
+
// Explicit geometry helpers may run before the renderer is notified of edits.
|
|
64
|
+
// Normalize their current input rather than consulting a revision cache.
|
|
65
|
+
const indices = indexStorage(geometry.indices.array);
|
|
60
66
|
const positions = geometry.position?.array;
|
|
61
|
-
if (!indices || !positions || !indices
|
|
67
|
+
if (!indices || !positions || !attributeLength(indices) || !positions.length) {
|
|
62
68
|
generateVertexNormals(geometry);
|
|
63
69
|
return;
|
|
64
70
|
}
|
|
@@ -69,7 +75,7 @@ export function generateCreasedVertexNormals(geometry, creaseAngleDegrees = 180)
|
|
|
69
75
|
}
|
|
70
76
|
const originalVertexCount = geometry.vertexCount;
|
|
71
77
|
const groups = Array.from({ length: originalVertexCount }, () => []);
|
|
72
|
-
const generatedIndices = new Uint32Array(indices
|
|
78
|
+
const generatedIndices = new Uint32Array(attributeLength(indices));
|
|
73
79
|
const generatedPositions = Array.from(positions);
|
|
74
80
|
const generatedUvs = geometry.uv ? Array.from(geometry.uv.array) : undefined;
|
|
75
81
|
const generatedColors = geometry.color
|
|
@@ -88,10 +94,10 @@ export function generateCreasedVertexNormals(geometry, creaseAngleDegrees = 180)
|
|
|
88
94
|
target.push(target[offset + component]);
|
|
89
95
|
}
|
|
90
96
|
};
|
|
91
|
-
for (let offset = 0; offset + 2 < indices
|
|
92
|
-
const i0 = indices
|
|
93
|
-
const i1 = indices
|
|
94
|
-
const i2 = indices
|
|
97
|
+
for (let offset = 0; offset + 2 < attributeLength(indices); offset += 3) {
|
|
98
|
+
const i0 = attributeValue(indices, offset);
|
|
99
|
+
const i1 = attributeValue(indices, offset + 1);
|
|
100
|
+
const i2 = attributeValue(indices, offset + 2);
|
|
95
101
|
const ax = positions[i1 * 3] - positions[i0 * 3];
|
|
96
102
|
const ay = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];
|
|
97
103
|
const az = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];
|
|
@@ -163,6 +169,11 @@ const generatedVertexTangents = new WeakSet();
|
|
|
163
169
|
export function hasGeneratedVertexTangents(geometry) {
|
|
164
170
|
return !!geometry.tangent && generatedVertexTangents.has(geometry.tangent);
|
|
165
171
|
}
|
|
172
|
+
/** @internal Installs the byte-equivalent result of a native tangent kernel. */
|
|
173
|
+
export function installGeneratedVertexTangents(geometry, tangents) {
|
|
174
|
+
geometry.tangent = new Attribute(tangents, 3);
|
|
175
|
+
generatedVertexTangents.add(geometry.tangent);
|
|
176
|
+
}
|
|
166
177
|
/** Generate a UV-aligned tangent for meshes that do not provide one. */
|
|
167
178
|
export function generateVertexTangents(geometry) {
|
|
168
179
|
if (!geometry.position || !geometry.uv || !geometry.normal)
|
|
@@ -202,12 +213,14 @@ function computeVertexTangents(geometry, accumulated, tangents) {
|
|
|
202
213
|
}
|
|
203
214
|
const vertexCount = geometry.vertexCount;
|
|
204
215
|
accumulated.fill(0);
|
|
205
|
-
|
|
206
|
-
|
|
216
|
+
// Explicit geometry helpers may run before the renderer is notified of edits.
|
|
217
|
+
// Normalize their current input rather than consulting a revision cache.
|
|
218
|
+
const indices = indexStorage(geometry.indices.array);
|
|
219
|
+
const count = indices ? attributeLength(indices) : vertexCount;
|
|
207
220
|
for (let offset = 0; offset + 2 < count; offset += 3) {
|
|
208
|
-
const i0 = indices ? indices
|
|
209
|
-
const i1 = indices ? indices
|
|
210
|
-
const i2 = indices ? indices
|
|
221
|
+
const i0 = indices ? attributeValue(indices, offset) : offset;
|
|
222
|
+
const i1 = indices ? attributeValue(indices, offset + 1) : offset + 1;
|
|
223
|
+
const i2 = indices ? attributeValue(indices, offset + 2) : offset + 2;
|
|
211
224
|
const x1 = positions[i1 * 3] - positions[i0 * 3];
|
|
212
225
|
const y1 = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];
|
|
213
226
|
const z1 = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];
|
|
@@ -268,23 +281,23 @@ export function updateBoundingBox(geometry) {
|
|
|
268
281
|
const x = posArr[i++];
|
|
269
282
|
const y = posArr[i++];
|
|
270
283
|
const z = posArr[i++];
|
|
271
|
-
if (x < min
|
|
272
|
-
min
|
|
284
|
+
if (x < read(min, 0)) {
|
|
285
|
+
write(min, 0, x);
|
|
273
286
|
}
|
|
274
|
-
if (y < min
|
|
275
|
-
min
|
|
287
|
+
if (y < read(min, 1)) {
|
|
288
|
+
write(min, 1, y);
|
|
276
289
|
}
|
|
277
|
-
if (z < min
|
|
278
|
-
min
|
|
290
|
+
if (z < read(min, 2)) {
|
|
291
|
+
write(min, 2, z);
|
|
279
292
|
}
|
|
280
|
-
if (x > max
|
|
281
|
-
max
|
|
293
|
+
if (x > read(max, 0)) {
|
|
294
|
+
write(max, 0, x);
|
|
282
295
|
}
|
|
283
|
-
if (y > max
|
|
284
|
-
max
|
|
296
|
+
if (y > read(max, 1)) {
|
|
297
|
+
write(max, 1, y);
|
|
285
298
|
}
|
|
286
|
-
if (z > max
|
|
287
|
-
max
|
|
299
|
+
if (z > read(max, 2)) {
|
|
300
|
+
write(max, 2, z);
|
|
288
301
|
}
|
|
289
302
|
}
|
|
290
303
|
}
|
package/lib/util/geometry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/util/geometry.ts"],"names":[],"mappings":"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","sourcesContent":["import { vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\n\n/** Computes smooth, area-weighted vertex normals into `geometry.normal`. */\nexport function generateVertexNormals(geometry: Geometry) {\n if (!geometry.vertexCount) {\n return;\n }\n\n const indices = geometry.indices?.array;\n const positions = geometry.position.array!;\n const normals = new Float32Array(positions.length);\n geometry.normal = new Attribute(normals, 3);\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices ? indices.length : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = indices[f++];\n i2 = indices[f++];\n i3 = indices[f++];\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n/**\n * Splits indexed vertices where incident faces exceed the requested dihedral\n * angle, then generates normals for the resulting smoothing groups. This is\n * useful after displacement because a single indexed vertex cannot represent\n * both sides of a hard edge with different normals.\n */\nexport function generateCreasedVertexNormals(\n geometry: Geometry,\n creaseAngleDegrees = 180\n) {\n const indices = geometry.indices?.array;\n const positions = geometry.position?.array;\n if (!indices || !positions || !indices.length || !positions.length) {\n generateVertexNormals(geometry);\n return;\n }\n const creaseAngle = Math.min(Math.max(creaseAngleDegrees, 0), 180);\n if (creaseAngle >= 179.999) {\n generateVertexNormals(geometry);\n return;\n }\n\n interface NormalGroup {\n vertexIndex: number;\n sumX: number;\n sumY: number;\n sumZ: number;\n }\n const originalVertexCount = geometry.vertexCount;\n const groups = Array.from(\n { length: originalVertexCount },\n () => [] as NormalGroup[]\n );\n const generatedIndices = new Uint32Array(indices.length);\n const generatedPositions = Array.from(positions);\n const generatedUvs = geometry.uv ? Array.from(geometry.uv.array) : undefined;\n const generatedColors = geometry.color\n ? Array.from(geometry.color.array)\n : undefined;\n const generatedMaterialIndices = geometry.materialIndex\n ? Array.from(geometry.materialIndex.array)\n : undefined;\n let generatedVertexCount = originalVertexCount;\n const cosineThreshold = Math.cos((creaseAngle * Math.PI) / 180);\n\n const duplicateAttribute = (\n target: number[] | undefined,\n sourceIndex: number,\n itemSize: number\n ) => {\n if (!target) return;\n const offset = sourceIndex * itemSize;\n for (let component = 0; component < itemSize; component++) {\n target.push(target[offset + component]);\n }\n };\n\n for (let offset = 0; offset + 2 < indices.length; offset += 3) {\n const i0 = indices[offset];\n const i1 = indices[offset + 1];\n const i2 = indices[offset + 2];\n const ax = positions[i1 * 3] - positions[i0 * 3];\n const ay = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];\n const az = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];\n const bx = positions[i2 * 3] - positions[i0 * 3];\n const by = positions[i2 * 3 + 1] - positions[i0 * 3 + 1];\n const bz = positions[i2 * 3 + 2] - positions[i0 * 3 + 2];\n const faceX = ay * bz - az * by;\n const faceY = az * bx - ax * bz;\n const faceZ = ax * by - ay * bx;\n const faceLength = Math.hypot(faceX, faceY, faceZ);\n const unitX = faceLength > 1e-12 ? faceX / faceLength : 0;\n const unitY = faceLength > 1e-12 ? faceY / faceLength : 0;\n const unitZ = faceLength > 1e-12 ? faceZ / faceLength : 1;\n\n [i0, i1, i2].forEach((sourceIndex, corner) => {\n const vertexGroups = groups[sourceIndex];\n let selected: NormalGroup | undefined;\n let selectedDot = -Infinity;\n for (const group of vertexGroups) {\n const groupLength = Math.hypot(group.sumX, group.sumY, group.sumZ);\n const dot = groupLength > 1e-12\n ? (unitX * group.sumX + unitY * group.sumY + unitZ * group.sumZ) /\n groupLength\n : 1;\n if (dot >= cosineThreshold && dot > selectedDot) {\n selected = group;\n selectedDot = dot;\n }\n }\n if (!selected) {\n const vertexIndex = vertexGroups.length === 0\n ? sourceIndex\n : generatedVertexCount++;\n if (vertexIndex !== sourceIndex) {\n duplicateAttribute(generatedPositions, sourceIndex, 3);\n duplicateAttribute(\n generatedUvs,\n sourceIndex,\n geometry.uv?.itemSize ?? 2\n );\n duplicateAttribute(\n generatedColors,\n sourceIndex,\n geometry.color?.itemSize ?? 3\n );\n duplicateAttribute(\n generatedMaterialIndices,\n sourceIndex,\n geometry.materialIndex?.itemSize ?? 1\n );\n }\n selected = {\n vertexIndex,\n sumX: 0,\n sumY: 0,\n sumZ: 0\n };\n vertexGroups.push(selected);\n }\n selected.sumX += faceX;\n selected.sumY += faceY;\n selected.sumZ += faceZ;\n generatedIndices[offset + corner] = selected.vertexIndex;\n });\n }\n\n geometry.position = new Attribute(new Float32Array(generatedPositions), 3);\n geometry.indices = new Attribute(generatedIndices, 1);\n geometry.uv = generatedUvs\n ? new Attribute(new Float32Array(generatedUvs), geometry.uv!.itemSize)\n : undefined;\n geometry.color = generatedColors\n ? new Attribute(new Float32Array(generatedColors), geometry.color!.itemSize)\n : undefined;\n geometry.materialIndex = generatedMaterialIndices\n ? new Attribute(\n new Int32Array(generatedMaterialIndices),\n geometry.materialIndex!.itemSize\n )\n : undefined;\n geometry.tangent = undefined;\n generateVertexNormals(geometry);\n}\n\nconst generatedVertexTangents = new WeakSet<Attribute<Float32Array>>();\n/** @internal Distinguishes derivative fallback from an authored XYZ tangent. */\nexport function hasGeneratedVertexTangents(geometry: Geometry) {\n return !!geometry.tangent && generatedVertexTangents.has(geometry.tangent);\n}\n\n/** Generate a UV-aligned tangent for meshes that do not provide one. */\nexport function generateVertexTangents(geometry: Geometry) {\n if (!geometry.position || !geometry.uv || !geometry.normal) return;\n const count = geometry.vertexCount;\n if (!count) return;\n const tangents = new Float32Array(count * 3);\n computeVertexTangents(geometry, new Float32Array(count * 3), tangents);\n geometry.tangent = new Attribute(tangents, 3);\n generatedVertexTangents.add(geometry.tangent);\n}\n\nconst dynamicTangentScratch = new WeakMap<Geometry, Float32Array>();\n/** @internal Refreshes generated tangents while retaining the attribute and scratch arrays. */\nexport function updateDynamicTangents(geometry: Geometry) {\n if (!geometry.position || !geometry.uv || !geometry.normal) return;\n const count = geometry.vertexCount;\n if (!count) return;\n let accumulated = dynamicTangentScratch.get(geometry);\n if (accumulated?.length !== count * 3) {\n accumulated = new Float32Array(count * 3); dynamicTangentScratch.set(geometry, accumulated);\n }\n if (geometry.tangent?.array.length !== count * 3) geometry.tangent = new Attribute(new Float32Array(count * 3), 3);\n computeVertexTangents(geometry, accumulated, geometry.tangent.array);\n generatedVertexTangents.add(geometry.tangent);\n}\n\nfunction computeVertexTangents(geometry: Geometry, accumulated: Float32Array, tangents: Float32Array) {\n const uvs = geometry.uv?.array;\n const normals = geometry.normal?.array;\n const positions = geometry.position?.array;\n if (!uvs || !normals || !positions || !geometry.vertexCount) {\n return;\n }\n\n const vertexCount = geometry.vertexCount;\n accumulated.fill(0);\n const indices = geometry.indices?.array;\n const count = indices?.length ?? vertexCount;\n\n for (let offset = 0; offset + 2 < count; offset += 3) {\n const i0 = indices ? indices[offset] : offset;\n const i1 = indices ? indices[offset + 1] : offset + 1;\n const i2 = indices ? indices[offset + 2] : offset + 2;\n const x1 = positions[i1 * 3] - positions[i0 * 3];\n const y1 = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];\n const z1 = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];\n const x2 = positions[i2 * 3] - positions[i0 * 3];\n const y2 = positions[i2 * 3 + 1] - positions[i0 * 3 + 1];\n const z2 = positions[i2 * 3 + 2] - positions[i0 * 3 + 2];\n const s1 = uvs[i1 * 2] - uvs[i0 * 2];\n const t1 = uvs[i1 * 2 + 1] - uvs[i0 * 2 + 1];\n const s2 = uvs[i2 * 2] - uvs[i0 * 2];\n const t2 = uvs[i2 * 2 + 1] - uvs[i0 * 2 + 1];\n const determinant = s1 * t2 - s2 * t1;\n if (Math.abs(determinant) < 1e-12) continue;\n const inverse = 1 / determinant;\n const tx = (x1 * t2 - x2 * t1) * inverse;\n const ty = (y1 * t2 - y2 * t1) * inverse;\n const tz = (z1 * t2 - z2 * t1) * inverse;\n for (let corner = 0; corner < 3; corner++) {\n const index = corner === 0 ? i0 : corner === 1 ? i1 : i2;\n accumulated[index * 3] += tx;\n accumulated[index * 3 + 1] += ty;\n accumulated[index * 3 + 2] += tz;\n }\n }\n\n\n for (let index = 0; index < vertexCount; index++) {\n const base = index * 3;\n const nx = normals[base];\n const ny = normals[base + 1];\n const nz = normals[base + 2];\n const projection = accumulated[base] * nx\n + accumulated[base + 1] * ny\n + accumulated[base + 2] * nz;\n let tx = accumulated[base] - nx * projection;\n let ty = accumulated[base + 1] - ny * projection;\n let tz = accumulated[base + 2] - nz * projection;\n const length = Math.hypot(tx, ty, tz);\n if (length > 1e-8) {\n tx /= length;\n ty /= length;\n tz /= length;\n } else {\n tx = ty = tz = 0;\n }\n tangents[base] = tx;\n tangents[base + 1] = ty;\n tangents[base + 2] = tz;\n }\n\n}\n\nexport function updateBoundingBox(geometry: Geometry) {\n const posArr = geometry.position.array;\n const min = geometry.boundingBox.min;\n const max = geometry.boundingBox.max;\n if (posArr && posArr.length) {\n vec3.set(min, posArr[0], posArr[1], posArr[2]);\n vec3.set(max, posArr[0], posArr[1], posArr[2]);\n for (let i = 3; i < posArr.length; ) {\n const x = posArr[i++];\n const y = posArr[i++];\n const z = posArr[i++];\n if (x < min[0]) {\n min[0] = x;\n }\n if (y < min[1]) {\n min[1] = y;\n }\n if (z < min[2]) {\n min[2] = z;\n }\n\n if (x > max[0]) {\n max[0] = x;\n }\n if (y > max[1]) {\n max[1] = y;\n }\n if (z > max[2]) {\n max[2] = z;\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/util/geometry.ts"],"names":[],"mappings":"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","sourcesContent":["import { attributeLength, attributeValue, indexStorage } from '../scene/attributeData.js';\nimport { read, write } from '../math/access.js';\nimport { vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\n\n/** Computes smooth, area-weighted vertex normals into `geometry.normal`. */\nexport function generateVertexNormals(geometry: Geometry) {\n if (!geometry.vertexCount) {\n return;\n }\n\n // Explicit geometry helpers may run before the renderer is notified of edits.\n // Normalize their current input rather than consulting a revision cache.\n const indices = indexStorage(geometry.indices.array);\n const positions = geometry.position.array!;\n const normals = new Float32Array(positions.length);\n geometry.normal = new Attribute(normals, 3);\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices ? attributeLength(indices) : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = attributeValue(indices, f++);\n i2 = attributeValue(indices, f++);\n i3 = attributeValue(indices, f++);\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n/**\n * Splits indexed vertices where incident faces exceed the requested dihedral\n * angle, then generates normals for the resulting smoothing groups. This is\n * useful after displacement because a single indexed vertex cannot represent\n * both sides of a hard edge with different normals.\n */\nexport function generateCreasedVertexNormals(\n geometry: Geometry,\n creaseAngleDegrees = 180\n) {\n // Explicit geometry helpers may run before the renderer is notified of edits.\n // Normalize their current input rather than consulting a revision cache.\n const indices = indexStorage(geometry.indices.array);\n const positions = geometry.position?.array;\n if (!indices || !positions || !attributeLength(indices) || !positions.length) {\n generateVertexNormals(geometry);\n return;\n }\n const creaseAngle = Math.min(Math.max(creaseAngleDegrees, 0), 180);\n if (creaseAngle >= 179.999) {\n generateVertexNormals(geometry);\n return;\n }\n\n interface NormalGroup {\n vertexIndex: number;\n sumX: number;\n sumY: number;\n sumZ: number;\n }\n const originalVertexCount = geometry.vertexCount;\n const groups = Array.from(\n { length: originalVertexCount },\n () => [] as NormalGroup[]\n );\n const generatedIndices = new Uint32Array(attributeLength(indices));\n const generatedPositions = Array.from(positions);\n const generatedUvs = geometry.uv ? Array.from(geometry.uv.array) : undefined;\n const generatedColors = geometry.color\n ? Array.from(geometry.color.array)\n : undefined;\n const generatedMaterialIndices = geometry.materialIndex\n ? Array.from(geometry.materialIndex.array)\n : undefined;\n let generatedVertexCount = originalVertexCount;\n const cosineThreshold = Math.cos((creaseAngle * Math.PI) / 180);\n\n const duplicateAttribute = (\n target: number[] | undefined,\n sourceIndex: number,\n itemSize: number\n ) => {\n if (!target) return;\n const offset = sourceIndex * itemSize;\n for (let component = 0; component < itemSize; component++) {\n target.push(target[offset + component]);\n }\n };\n\n for (let offset = 0; offset + 2 < attributeLength(indices); offset += 3) {\n const i0 = attributeValue(indices, offset);\n const i1 = attributeValue(indices, offset + 1);\n const i2 = attributeValue(indices, offset + 2);\n const ax = positions[i1 * 3] - positions[i0 * 3];\n const ay = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];\n const az = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];\n const bx = positions[i2 * 3] - positions[i0 * 3];\n const by = positions[i2 * 3 + 1] - positions[i0 * 3 + 1];\n const bz = positions[i2 * 3 + 2] - positions[i0 * 3 + 2];\n const faceX = ay * bz - az * by;\n const faceY = az * bx - ax * bz;\n const faceZ = ax * by - ay * bx;\n const faceLength = Math.hypot(faceX, faceY, faceZ);\n const unitX = faceLength > 1e-12 ? faceX / faceLength : 0;\n const unitY = faceLength > 1e-12 ? faceY / faceLength : 0;\n const unitZ = faceLength > 1e-12 ? faceZ / faceLength : 1;\n\n [i0, i1, i2].forEach((sourceIndex, corner) => {\n const vertexGroups = groups[sourceIndex];\n let selected: NormalGroup | undefined;\n let selectedDot = -Infinity;\n for (const group of vertexGroups) {\n const groupLength = Math.hypot(group.sumX, group.sumY, group.sumZ);\n const dot = groupLength > 1e-12\n ? (unitX * group.sumX + unitY * group.sumY + unitZ * group.sumZ) /\n groupLength\n : 1;\n if (dot >= cosineThreshold && dot > selectedDot) {\n selected = group;\n selectedDot = dot;\n }\n }\n if (!selected) {\n const vertexIndex = vertexGroups.length === 0\n ? sourceIndex\n : generatedVertexCount++;\n if (vertexIndex !== sourceIndex) {\n duplicateAttribute(generatedPositions, sourceIndex, 3);\n duplicateAttribute(\n generatedUvs,\n sourceIndex,\n geometry.uv?.itemSize ?? 2\n );\n duplicateAttribute(\n generatedColors,\n sourceIndex,\n geometry.color?.itemSize ?? 3\n );\n duplicateAttribute(\n generatedMaterialIndices,\n sourceIndex,\n geometry.materialIndex?.itemSize ?? 1\n );\n }\n selected = {\n vertexIndex,\n sumX: 0,\n sumY: 0,\n sumZ: 0\n };\n vertexGroups.push(selected);\n }\n selected.sumX += faceX;\n selected.sumY += faceY;\n selected.sumZ += faceZ;\n generatedIndices[offset + corner] = selected.vertexIndex;\n });\n }\n\n geometry.position = new Attribute(new Float32Array(generatedPositions), 3);\n geometry.indices = new Attribute(generatedIndices, 1);\n geometry.uv = generatedUvs\n ? new Attribute(new Float32Array(generatedUvs), geometry.uv!.itemSize)\n : undefined;\n geometry.color = generatedColors\n ? new Attribute(new Float32Array(generatedColors), geometry.color!.itemSize)\n : undefined;\n geometry.materialIndex = generatedMaterialIndices\n ? new Attribute(\n new Int32Array(generatedMaterialIndices),\n geometry.materialIndex!.itemSize\n )\n : undefined;\n geometry.tangent = undefined;\n generateVertexNormals(geometry);\n}\n\nconst generatedVertexTangents = new WeakSet<Attribute<Float32Array>>();\n/** @internal Distinguishes derivative fallback from an authored XYZ tangent. */\nexport function hasGeneratedVertexTangents(geometry: Geometry) {\n return !!geometry.tangent && generatedVertexTangents.has(geometry.tangent);\n}\n\n/** @internal Installs the byte-equivalent result of a native tangent kernel. */\nexport function installGeneratedVertexTangents(geometry: Geometry, tangents: Float32Array) {\n geometry.tangent = new Attribute(tangents, 3);\n generatedVertexTangents.add(geometry.tangent);\n}\n\n/** Generate a UV-aligned tangent for meshes that do not provide one. */\nexport function generateVertexTangents(geometry: Geometry) {\n if (!geometry.position || !geometry.uv || !geometry.normal) return;\n const count = geometry.vertexCount;\n if (!count) return;\n const tangents = new Float32Array(count * 3);\n computeVertexTangents(geometry, new Float32Array(count * 3), tangents);\n geometry.tangent = new Attribute(tangents, 3);\n generatedVertexTangents.add(geometry.tangent);\n}\n\nconst dynamicTangentScratch = new WeakMap<Geometry, Float32Array>();\n/** @internal Refreshes generated tangents while retaining the attribute and scratch arrays. */\nexport function updateDynamicTangents(geometry: Geometry) {\n if (!geometry.position || !geometry.uv || !geometry.normal) return;\n const count = geometry.vertexCount;\n if (!count) return;\n let accumulated = dynamicTangentScratch.get(geometry);\n if (accumulated?.length !== count * 3) {\n accumulated = new Float32Array(count * 3); dynamicTangentScratch.set(geometry, accumulated);\n }\n if (geometry.tangent?.array.length !== count * 3) geometry.tangent = new Attribute(new Float32Array(count * 3), 3);\n computeVertexTangents(geometry, accumulated, geometry.tangent.array);\n generatedVertexTangents.add(geometry.tangent);\n}\n\nfunction computeVertexTangents(geometry: Geometry, accumulated: Float32Array, tangents: Float32Array) {\n const uvs = geometry.uv?.array;\n const normals = geometry.normal?.array;\n const positions = geometry.position?.array;\n if (!uvs || !normals || !positions || !geometry.vertexCount) {\n return;\n }\n\n const vertexCount = geometry.vertexCount;\n accumulated.fill(0);\n // Explicit geometry helpers may run before the renderer is notified of edits.\n // Normalize their current input rather than consulting a revision cache.\n const indices = indexStorage(geometry.indices.array);\n const count = indices ? attributeLength(indices) : vertexCount;\n\n for (let offset = 0; offset + 2 < count; offset += 3) {\n const i0 = indices ? attributeValue(indices, offset) : offset;\n const i1 = indices ? attributeValue(indices, offset + 1) : offset + 1;\n const i2 = indices ? attributeValue(indices, offset + 2) : offset + 2;\n const x1 = positions[i1 * 3] - positions[i0 * 3];\n const y1 = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];\n const z1 = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];\n const x2 = positions[i2 * 3] - positions[i0 * 3];\n const y2 = positions[i2 * 3 + 1] - positions[i0 * 3 + 1];\n const z2 = positions[i2 * 3 + 2] - positions[i0 * 3 + 2];\n const s1 = uvs[i1 * 2] - uvs[i0 * 2];\n const t1 = uvs[i1 * 2 + 1] - uvs[i0 * 2 + 1];\n const s2 = uvs[i2 * 2] - uvs[i0 * 2];\n const t2 = uvs[i2 * 2 + 1] - uvs[i0 * 2 + 1];\n const determinant = s1 * t2 - s2 * t1;\n if (Math.abs(determinant) < 1e-12) continue;\n const inverse = 1 / determinant;\n const tx = (x1 * t2 - x2 * t1) * inverse;\n const ty = (y1 * t2 - y2 * t1) * inverse;\n const tz = (z1 * t2 - z2 * t1) * inverse;\n for (let corner = 0; corner < 3; corner++) {\n const index = corner === 0 ? i0 : corner === 1 ? i1 : i2;\n accumulated[index * 3] += tx;\n accumulated[index * 3 + 1] += ty;\n accumulated[index * 3 + 2] += tz;\n }\n }\n\n\n for (let index = 0; index < vertexCount; index++) {\n const base = index * 3;\n const nx = normals[base];\n const ny = normals[base + 1];\n const nz = normals[base + 2];\n const projection = accumulated[base] * nx\n + accumulated[base + 1] * ny\n + accumulated[base + 2] * nz;\n let tx = accumulated[base] - nx * projection;\n let ty = accumulated[base + 1] - ny * projection;\n let tz = accumulated[base + 2] - nz * projection;\n const length = Math.hypot(tx, ty, tz);\n if (length > 1e-8) {\n tx /= length;\n ty /= length;\n tz /= length;\n } else {\n tx = ty = tz = 0;\n }\n tangents[base] = tx;\n tangents[base + 1] = ty;\n tangents[base + 2] = tz;\n }\n\n}\n\nexport function updateBoundingBox(geometry: Geometry) {\n const posArr = geometry.position.array;\n const min = geometry.boundingBox.min;\n const max = geometry.boundingBox.max;\n if (posArr && posArr.length) {\n vec3.set(min, posArr[0], posArr[1], posArr[2]);\n vec3.set(max, posArr[0], posArr[1], posArr[2]);\n for (let i = 3; i < posArr.length; ) {\n const x = posArr[i++];\n const y = posArr[i++];\n const z = posArr[i++];\n if (x < read(min, 0)) {\n write(min, 0, x);\n }\n if (y < read(min, 1)) {\n write(min, 1, y);\n }\n if (z < read(min, 2)) {\n write(min, 2, z);\n }\n\n if (x > read(max, 0)) {\n write(max, 0, x);\n }\n if (y > read(max, 1)) {\n write(max, 1, y);\n }\n if (z > read(max, 2)) {\n write(max, 2, z);\n }\n }\n }\n}\n"]}
|
package/lib/util/loadRGBE.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import Texture from '../scene/Texture.js';
|
|
2
|
-
const toChar = String.fromCharCode;
|
|
3
2
|
const MINELEN = 8;
|
|
4
3
|
const MAXELEN = 0x7fff;
|
|
5
4
|
function setToPixels(rgbe, buffer, offset, exposure) {
|
|
@@ -20,7 +19,7 @@ function setToPixels(rgbe, buffer, offset, exposure) {
|
|
|
20
19
|
function uint82string(array, offset, size) {
|
|
21
20
|
let str = '';
|
|
22
21
|
for (let i = offset; i < size; i++) {
|
|
23
|
-
str +=
|
|
22
|
+
str += String.fromCharCode(array[i]);
|
|
24
23
|
}
|
|
25
24
|
return str;
|
|
26
25
|
}
|
|
@@ -99,7 +98,7 @@ export function parseRGBE(arrayBuffer, exposure = 0) {
|
|
|
99
98
|
let i;
|
|
100
99
|
// find empty line, next line is resolution info
|
|
101
100
|
for (i = 2; i < size; i++) {
|
|
102
|
-
if (
|
|
101
|
+
if (String.fromCharCode(data[i]) === '\n' && String.fromCharCode(data[i + 1]) === '\n') {
|
|
103
102
|
break;
|
|
104
103
|
}
|
|
105
104
|
}
|
|
@@ -111,7 +110,7 @@ export function parseRGBE(arrayBuffer, exposure = 0) {
|
|
|
111
110
|
i += 2;
|
|
112
111
|
let str = '';
|
|
113
112
|
for (; i < size; i++) {
|
|
114
|
-
const _char =
|
|
113
|
+
const _char = String.fromCharCode(data[i]);
|
|
115
114
|
if (_char === '\n') {
|
|
116
115
|
break;
|
|
117
116
|
}
|
package/lib/util/loadRGBE.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadRGBE.js","sourceRoot":"","sources":["../../src/util/loadRGBE.ts"],"names":[],"mappings":"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","sourcesContent":["import Texture from '../scene/Texture.js';\n\nconst toChar = String.fromCharCode;\n\nconst MINELEN = 8;\nconst MAXELEN = 0x7fff;\n\nfunction setToPixels(\n rgbe: number[],\n buffer: Float32Array,\n offset: number,\n exposure: number\n) {\n if (rgbe[3] > 0) {\n const f = Math.pow(2.0, rgbe[3] - 128 - 8 + exposure);\n buffer[offset + 0] = rgbe[0] * f;\n buffer[offset + 1] = rgbe[1] * f;\n buffer[offset + 2] = rgbe[2] * f;\n } else {\n buffer[offset + 0] = 0;\n buffer[offset + 1] = 0;\n buffer[offset + 2] = 0;\n }\n buffer[offset + 3] = 1.0;\n return buffer;\n}\nfunction uint82string(array: Uint8Array, offset: number, size: number) {\n let str = '';\n for (let i = offset; i < size; i++) {\n str += toChar(array[i]);\n }\n return str;\n}\n\nfunction copyrgbe(s: number[], t: number[]) {\n t[0] = s[0];\n t[1] = s[1];\n t[2] = s[2];\n t[3] = s[3];\n}\n\nfunction oldReadColors(\n scan: number[][],\n buffer: Uint8Array,\n offset: number,\n xmax: number\n) {\n let rshift = 0,\n x = 0,\n len = xmax;\n while (len > 0) {\n scan[x][0] = buffer[offset++];\n scan[x][1] = buffer[offset++];\n scan[x][2] = buffer[offset++];\n scan[x][3] = buffer[offset++];\n if (scan[x][0] === 1 && scan[x][1] === 1 && scan[x][2] === 1) {\n // exp is count of repeated pixels\n for (let i = (scan[x][3] << rshift) >>> 0; i > 0; i--) {\n copyrgbe(scan[x - 1], scan[x]);\n x++;\n len--;\n }\n rshift += 8;\n } else {\n x++;\n len--;\n rshift = 0;\n }\n }\n return offset;\n}\n\nfunction readColors(\n scan: number[][],\n buffer: Uint8Array,\n offset: number,\n xmax: number\n) {\n if (xmax < MINELEN || xmax > MAXELEN) {\n return oldReadColors(scan, buffer, offset, xmax);\n }\n let i = buffer[offset++];\n if (i != 2) {\n return oldReadColors(scan, buffer, offset - 1, xmax);\n }\n scan[0][1] = buffer[offset++];\n scan[0][2] = buffer[offset++];\n\n i = buffer[offset++];\n if ((((scan[0][2] << 8) >>> 0) | i) >>> 0 !== xmax) {\n return null;\n }\n for (let i = 0; i < 4; i++) {\n for (let x = 0; x < xmax; ) {\n let code = buffer[offset++];\n if (code > 128) {\n code = (code & 127) >>> 0;\n const val = buffer[offset++];\n while (code--) {\n scan[x++][i] = val;\n }\n } else {\n while (code--) {\n scan[x++][i] = buffer[offset++];\n }\n }\n }\n }\n return offset;\n}\n\n// http://www.graphics.cornell.edu/~bjw/rgbe.html\n// Blender source\n// http://radsite.lbl.gov/radiance/refer/Notes/picture_format.html\nexport function parseRGBE(\n arrayBuffer: ArrayBuffer,\n exposure = 0\n): Texture | undefined {\n const data = new Uint8Array(arrayBuffer);\n const size = data.length;\n if (uint82string(data, 0, 2) !== '#?') {\n return;\n }\n let i;\n // find empty line, next line is resolution info\n for (i = 2; i < size; i++) {\n if (toChar(data[i]) === '\\n' && toChar(data[i + 1]) === '\\n') {\n break;\n }\n }\n if (i >= size) {\n // not found\n return;\n }\n // find resolution info line\n i += 2;\n let str = '';\n for (; i < size; i++) {\n const _char = toChar(data[i]);\n if (_char === '\\n') {\n break;\n }\n str += _char;\n }\n // -Y M +X N\n const tmp = str.split(' ');\n const height = parseInt(tmp[1]);\n const width = parseInt(tmp[3]);\n if (!width || !height) {\n return;\n }\n\n // read and decode actual data\n let offset: number | null = i + 1;\n const scanline: number[][] = [];\n // memzero\n for (let x = 0; x < width; x++) {\n scanline[x] = [];\n for (let j = 0; j < 4; j++) {\n scanline[x][j] = 0;\n }\n }\n const pixels = new Float32Array(width * height * 4);\n let offset2 = 0;\n for (let y = 0; y < height; y++) {\n offset = readColors(scanline, data, offset, width);\n if (!offset) {\n return;\n }\n for (let x = 0; x < width; x++) {\n setToPixels(scanline[x], pixels, offset2, exposure);\n offset2 += 4;\n }\n }\n\n // HALF_FLOAT can't use Float32Array\n // texture.type = constants.FLOAT;\n return new Texture({\n data: pixels,\n width,\n height\n });\n}\n\n/**\n * Loads a Radiance `.hdr` (RGBE) image as a linear float {@link Texture},\n * e.g. for an {@link EnvironmentLight}. `exposure` scales the values.\n */\nexport function loadRGBE(url: string, exposure?: number) {\n return fetch(url)\n .then((res) => res.arrayBuffer())\n .then((ab) => {\n return parseRGBE(ab, exposure);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"loadRGBE.js","sourceRoot":"","sources":["../../src/util/loadRGBE.ts"],"names":[],"mappings":"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","sourcesContent":["import Texture from '../scene/Texture.js';\n\nconst MINELEN = 8;\nconst MAXELEN = 0x7fff;\n\nfunction setToPixels(\n rgbe: number[],\n buffer: Float32Array,\n offset: number,\n exposure: number\n) {\n if (rgbe[3] > 0) {\n const f = Math.pow(2.0, rgbe[3] - 128 - 8 + exposure);\n buffer[offset + 0] = rgbe[0] * f;\n buffer[offset + 1] = rgbe[1] * f;\n buffer[offset + 2] = rgbe[2] * f;\n } else {\n buffer[offset + 0] = 0;\n buffer[offset + 1] = 0;\n buffer[offset + 2] = 0;\n }\n buffer[offset + 3] = 1.0;\n return buffer;\n}\nfunction uint82string(array: Uint8Array, offset: number, size: number) {\n let str = '';\n for (let i = offset; i < size; i++) {\n str += String.fromCharCode(array[i]);\n }\n return str;\n}\n\nfunction copyrgbe(s: number[], t: number[]) {\n t[0] = s[0];\n t[1] = s[1];\n t[2] = s[2];\n t[3] = s[3];\n}\n\nfunction oldReadColors(\n scan: number[][],\n buffer: Uint8Array,\n offset: number,\n xmax: number\n) {\n let rshift = 0,\n x = 0,\n len = xmax;\n while (len > 0) {\n scan[x][0] = buffer[offset++];\n scan[x][1] = buffer[offset++];\n scan[x][2] = buffer[offset++];\n scan[x][3] = buffer[offset++];\n if (scan[x][0] === 1 && scan[x][1] === 1 && scan[x][2] === 1) {\n // exp is count of repeated pixels\n for (let i = (scan[x][3] << rshift) >>> 0; i > 0; i--) {\n copyrgbe(scan[x - 1], scan[x]);\n x++;\n len--;\n }\n rshift += 8;\n } else {\n x++;\n len--;\n rshift = 0;\n }\n }\n return offset;\n}\n\nfunction readColors(\n scan: number[][],\n buffer: Uint8Array,\n offset: number,\n xmax: number\n) {\n if (xmax < MINELEN || xmax > MAXELEN) {\n return oldReadColors(scan, buffer, offset, xmax);\n }\n let i = buffer[offset++];\n if (i != 2) {\n return oldReadColors(scan, buffer, offset - 1, xmax);\n }\n scan[0][1] = buffer[offset++];\n scan[0][2] = buffer[offset++];\n\n i = buffer[offset++];\n if ((((scan[0][2] << 8) >>> 0) | i) >>> 0 !== xmax) {\n return null;\n }\n for (let i = 0; i < 4; i++) {\n for (let x = 0; x < xmax; ) {\n let code = buffer[offset++];\n if (code > 128) {\n code = (code & 127) >>> 0;\n const val = buffer[offset++];\n while (code--) {\n scan[x++][i] = val;\n }\n } else {\n while (code--) {\n scan[x++][i] = buffer[offset++];\n }\n }\n }\n }\n return offset;\n}\n\n// http://www.graphics.cornell.edu/~bjw/rgbe.html\n// Blender source\n// http://radsite.lbl.gov/radiance/refer/Notes/picture_format.html\nexport function parseRGBE(\n arrayBuffer: ArrayBuffer,\n exposure = 0\n): Texture | undefined {\n const data = new Uint8Array(arrayBuffer);\n const size = data.length;\n if (uint82string(data, 0, 2) !== '#?') {\n return;\n }\n let i;\n // find empty line, next line is resolution info\n for (i = 2; i < size; i++) {\n if (String.fromCharCode(data[i]) === '\\n' && String.fromCharCode(data[i + 1]) === '\\n') {\n break;\n }\n }\n if (i >= size) {\n // not found\n return;\n }\n // find resolution info line\n i += 2;\n let str = '';\n for (; i < size; i++) {\n const _char = String.fromCharCode(data[i]);\n if (_char === '\\n') {\n break;\n }\n str += _char;\n }\n // -Y M +X N\n const tmp = str.split(' ');\n const height = parseInt(tmp[1]);\n const width = parseInt(tmp[3]);\n if (!width || !height) {\n return;\n }\n\n // read and decode actual data\n let offset: number | null = i + 1;\n const scanline: number[][] = [];\n // memzero\n for (let x = 0; x < width; x++) {\n scanline[x] = [];\n for (let j = 0; j < 4; j++) {\n scanline[x][j] = 0;\n }\n }\n const pixels = new Float32Array(width * height * 4);\n let offset2 = 0;\n for (let y = 0; y < height; y++) {\n offset = readColors(scanline, data, offset, width);\n if (!offset) {\n return;\n }\n for (let x = 0; x < width; x++) {\n setToPixels(scanline[x], pixels, offset2, exposure);\n offset2 += 4;\n }\n }\n\n // HALF_FLOAT can't use Float32Array\n // texture.type = constants.FLOAT;\n return new Texture({\n data: pixels,\n width,\n height\n });\n}\n\n/**\n * Loads a Radiance `.hdr` (RGBE) image as a linear float {@link Texture},\n * e.g. for an {@link EnvironmentLight}. `exposure` scales the values.\n */\nexport function loadRGBE(url: string, exposure?: number) {\n return fetch(url)\n .then((res) => res.arrayBuffer())\n .then((ab) => {\n return parseRGBE(ab, exposure);\n });\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function studioPanel(cx: number, cy: number, cz: number, radius: number, azimuthDegrees: number, elevationDegrees: number, panelDistance: number, panelWidth: number, panelHeight: number, power: number, intensity: number, rotation: number, size: number, ground: number): [
|
|
2
|
+
number,
|
|
3
|
+
number,
|
|
4
|
+
number,
|
|
5
|
+
number,
|
|
6
|
+
number,
|
|
7
|
+
number,
|
|
8
|
+
number,
|
|
9
|
+
number,
|
|
10
|
+
number,
|
|
11
|
+
number,
|
|
12
|
+
number,
|
|
13
|
+
number,
|
|
14
|
+
number,
|
|
15
|
+
number,
|
|
16
|
+
number
|
|
17
|
+
];
|
|
18
|
+
export declare function studioAmbientValue(row: number, height: number): number;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Shared studio placement and ambient gradient, independent of Three.js.
|
|
2
|
+
export function studioPanel(cx, cy, cz, radius, azimuthDegrees, elevationDegrees, panelDistance, panelWidth, panelHeight, power, intensity, rotation, size, ground) {
|
|
3
|
+
const r = Math.max(radius, 1e-3);
|
|
4
|
+
const azimuth = (azimuthDegrees + rotation) * (Math.PI / 180);
|
|
5
|
+
const width = panelWidth * size * r;
|
|
6
|
+
const height = panelHeight * size * r;
|
|
7
|
+
const distance = panelDistance * r;
|
|
8
|
+
const xx = Math.cos(azimuth);
|
|
9
|
+
const xz = -Math.sin(azimuth);
|
|
10
|
+
let elevation = elevationDegrees * (Math.PI / 180);
|
|
11
|
+
let zx = Math.sin(azimuth) * Math.cos(elevation);
|
|
12
|
+
let zy = Math.sin(elevation);
|
|
13
|
+
let zz = Math.cos(azimuth) * Math.cos(elevation);
|
|
14
|
+
let yy = zz * xx - zx * xz;
|
|
15
|
+
let py = cy + zy * distance;
|
|
16
|
+
for (let i = 0; i < 16; i++) {
|
|
17
|
+
if (py - Math.abs(yy) * height / 2 >= ground + 0.02 * r) {
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
elevation += 2 * (Math.PI / 180);
|
|
21
|
+
zx = Math.sin(azimuth) * Math.cos(elevation);
|
|
22
|
+
zy = Math.sin(elevation);
|
|
23
|
+
zz = Math.cos(azimuth) * Math.cos(elevation);
|
|
24
|
+
yy = zz * xx - zx * xz;
|
|
25
|
+
py = cy + zy * distance;
|
|
26
|
+
}
|
|
27
|
+
const radiance = (Math.PI * 2 * intensity * power * panelDistance ** 2)
|
|
28
|
+
/ (panelWidth * panelHeight * size * size);
|
|
29
|
+
return [width, height, radiance, xx, 0, xz, zy * xz, yy, -zy * xx,
|
|
30
|
+
zx, zy, zz, cx + zx * distance, py, cz + zz * distance];
|
|
31
|
+
}
|
|
32
|
+
export function studioAmbientValue(row, height) {
|
|
33
|
+
const y = Math.cos(((row + 0.5) / height) * Math.PI);
|
|
34
|
+
return y >= 0 ? 0.6 + 0.4 * y : 0.6 + 0.35 * y;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=studioLighting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studioLighting.js","sourceRoot":"","sources":["../../src/util/studioLighting.ts"],"names":[],"mappings":"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","sourcesContent":["// Shared studio placement and ambient gradient, independent of Three.js.\nexport function studioPanel(cx: number, cy: number, cz: number, radius: number,\n azimuthDegrees: number, elevationDegrees: number, panelDistance: number,\n panelWidth: number, panelHeight: number, power: number, intensity: number,\n rotation: number, size: number, ground: number): [number, number, number,\n number, number, number, number, number, number, number, number, number, number, number, number] {\n const r = Math.max(radius, 1e-3);\n const azimuth = (azimuthDegrees + rotation) * (Math.PI / 180);\n const width = panelWidth * size * r;\n const height = panelHeight * size * r;\n const distance = panelDistance * r;\n const xx = Math.cos(azimuth);\n const xz = -Math.sin(azimuth);\n let elevation = elevationDegrees * (Math.PI / 180);\n let zx = Math.sin(azimuth) * Math.cos(elevation);\n let zy = Math.sin(elevation);\n let zz = Math.cos(azimuth) * Math.cos(elevation);\n let yy = zz * xx - zx * xz;\n let py = cy + zy * distance;\n for (let i = 0; i < 16; i++) {\n if (py - Math.abs(yy) * height / 2 >= ground + 0.02 * r) { break; }\n elevation += 2 * (Math.PI / 180);\n zx = Math.sin(azimuth) * Math.cos(elevation);\n zy = Math.sin(elevation);\n zz = Math.cos(azimuth) * Math.cos(elevation);\n yy = zz * xx - zx * xz;\n py = cy + zy * distance;\n }\n const radiance = (Math.PI * 2 * intensity * power * panelDistance ** 2)\n / (panelWidth * panelHeight * size * size);\n return [width, height, radiance, xx, 0, xz, zy * xz, yy, -zy * xx,\n zx, zy, zz, cx + zx * distance, py, cz + zz * distance];\n}\nexport function studioAmbientValue(row: number, height: number): number {\n const y = Math.cos(((row + 0.5) / height) * Math.PI);\n return y >= 0 ? 0.6 + 0.4 * y : 0.6 + 0.35 * y;\n}\n"]}
|
package/lib/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Library version. Kept in sync with package.json by a unit test. */
|
|
2
|
-
export declare const VERSION = "0.
|
|
2
|
+
export declare const VERSION = "0.3.0";
|
package/lib/version.js
CHANGED
package/lib/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC","sourcesContent":["/** Library version. Kept in sync with package.json by a unit test. */\nexport const VERSION = '0.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC","sourcesContent":["/** Library version. Kept in sync with package.json by a unit test. */\nexport const VERSION = '0.3.0';\n"]}
|
package/llms.txt
CHANGED
|
@@ -10,9 +10,12 @@
|
|
|
10
10
|
- Install: `npm install @meimu/mutracer` (+ `three` for Three.js integration). ESM and TypeScript; [quick start](docs/getting-started.md).
|
|
11
11
|
- First layer: `new Engine({canvas})`, set `engine.scene` / `engine.camera`, then create `new Render(engine, options?)`; [independent renders](docs/progressive-rendering.md).
|
|
12
12
|
- Frame: update controls/source adapters, call `engine.update()` once, `current.refine()`, then `engine.display.present(current)`. Only update detects/commits external edits; rendering compares revisions.
|
|
13
|
+
- Sample batching: `batchSamples` (default false) lets one refine submit several samples; with `final: {batchSamples: true}`, RenderLoop also refines between display frames. Custom loops use `render.refineUntil(deadline, {signal})` before `present()`. [Two levels](docs/progressive-rendering.md#sample-batching).
|
|
14
|
+
- Caustics: `render.caustics = {lightTracing:true, photonMapping:true}`; experimental, off by default and WebGPU only. [Guide](docs/caustics.md), [options](docs/api.md#caustics).
|
|
13
15
|
- Batch settings: `Object.assign(render, settings)` / `Object.assign(engine.display, settings)` with `RenderSettings` / `DisplaySettings`; constructor options configure Render. [Defaults](docs/api.md).
|
|
14
16
|
- Ownership: Engine owns shared scene/device/BVH/atlas; Display owns tone mapping, bloom, HDR and channel; Render owns resolution, quality, samples, fallback and denoiser. `transmissiveOutputAlphaMin` is a Render option; [API](docs/api.md).
|
|
15
17
|
- Initialization: optional `await engine.init()` gives backend, adapter and limits; `backend: 'auto'` defaults to WebGPU with WebGL fallback. `webgpu` requires WebGPU and `webgl` forces WebGL 2.
|
|
18
|
+
- Texture bindings: `new Engine({textureBinding:'auto'})` tries experimental WebGPU bindless textures with atlas fallback; default `'atlas'`. [Requirements and budget](docs/api.md#texture-bindings).
|
|
16
19
|
- Status: each render exposes `status`, `samples` and `converged`; statuses are preparing, compiling, converging, denoising, finished and error. The first layer leaves frame selection/UI status to the application.
|
|
17
20
|
- Scene: plain `{meshes, lights, background?}`; meshes use world `transform`. `engine.update()` detects assignments, materials and lights; in-place array/pixel edits need `markUpdated()` or dedicated geometry/instance notifications; [updates](docs/updates.md).
|
|
18
21
|
- Conversion hooks: `convertMaterial` / `convertLight` on `FromTHREESceneOptions` and `THREESyncOptions`; undefined uses defaults, null skips; sync caches by source identity/version. [Ownership and light revisions](docs/threejs.md#custom-conversion).
|
|
@@ -25,7 +28,9 @@
|
|
|
25
28
|
- Concurrency: converge blocks refine only on that render, copies its camera override, and rejects when engine input revisions change. readPixels and present always select the requested result.
|
|
26
29
|
- BVH: automatic CPU preparation; optional `await engine.prepare(nextScene,{onProgress?,signal?})` leaves current GPU scene unchanged. Engine BVH options rebuild at the next update; [BVH](docs/bvh.md).
|
|
27
30
|
- Events: `engine.on('progress'|'error'|'devicelost',listener)` returns unsubscribe; per-render samples/status are polled. Async errors use error events; [API](docs/api.md).
|
|
31
|
+
- AOVs: `Render.aovs` + `aovSamples` (16); independent surface outputs, integer IDs and per-render motion; [formats and costs](docs/api.md#surface-outputs). Custom filters request `aovs` separately. `Display.channel` visualizes explicitly enabled kinds with [display-only mappings](docs/api.md#aov-visualization).
|
|
28
32
|
- Depth: `await engine.readDepthSamples({x,y,size})` uses the committed engine camera; [depth sampling](docs/api.md#depth-sampling).
|
|
33
|
+
- Procedural sky: `new ProceduralSky({resolution:[2048,1024],time:15})` for `EnvironmentLight.map` or backgrounds; Three.js uses the sync's `environment` option. [Options and limits](docs/api.md#proceduralsky).
|
|
29
34
|
- Materials, lights, geometry: OpenPBR constructor parameters, rigid analytic-light transforms and itemSize=1 raw materialIndex; [materials](docs/materials.md), [getting started](docs/getting-started.md).
|
|
30
35
|
- Release resources with `render.dispose()` or `engine.dispose()` for everything; `sync.dispose()` releases adapter caches.
|
|
31
36
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meimu/mutracer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "MuTracer: a physically based WebGPU path tracer with WebGL 2 fallback, OpenPBR materials, TinyBVH and OIDN denoising.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"path tracing",
|
|
@@ -61,12 +61,17 @@
|
|
|
61
61
|
"llms.txt"
|
|
62
62
|
],
|
|
63
63
|
"scripts": {
|
|
64
|
+
"native:modules": "npm run build:lib && node native/validation/module-check.mjs",
|
|
65
|
+
"native:browser-reference": "node native/validation/reference-server.mjs",
|
|
66
|
+
"native:check": "node native/validation/compiler/check.mjs",
|
|
64
67
|
"dev": "vite",
|
|
65
|
-
"build": "npm run typecheck && vite build",
|
|
66
|
-
"typecheck": "npm run check:material-comparison && tsc --noEmit",
|
|
68
|
+
"build": "npm run typecheck && vite build && node scripts/check-research-artifacts.mjs dist",
|
|
69
|
+
"typecheck": "node scripts/generate-aov-reflectance-samples.mjs --check && node native/scripts/generate-layout-schema.mjs --check && node native/scripts/generate-display.mjs --check && node native/scripts/generate-sky.mjs --check && node native/scripts/generate-viewer-spheres.mjs --check && npm run check:material-comparison && tsc --noEmit",
|
|
67
70
|
"test": "vitest run",
|
|
68
71
|
"test:watch": "vitest",
|
|
72
|
+
"test:related": "vitest related --run --passWithNoTests=false",
|
|
69
73
|
"build:tinybvh": "./scripts/build-tinybvh.sh",
|
|
74
|
+
"fetch:tinybvh": "node scripts/fetch-tinybvh.mjs",
|
|
70
75
|
"build:tinybvh:windows": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/build-tinybvh.ps1",
|
|
71
76
|
"typecheck:examples": "tsc --noEmit -p tsconfig.examples.json",
|
|
72
77
|
"watch": "vite build -w",
|
|
@@ -76,22 +81,42 @@
|
|
|
76
81
|
"build:lib": "npm run check:material-comparison && node scripts/build-lib.mjs",
|
|
77
82
|
"watch:lib": "tsc --watch",
|
|
78
83
|
"viewer": "vite --config viewer/vite.config.ts",
|
|
79
|
-
"build:viewer": "vite build --config viewer/vite.config.ts",
|
|
84
|
+
"build:viewer": "vite build --config viewer/vite.config.ts && node scripts/check-research-artifacts.mjs dist-viewer",
|
|
80
85
|
"typecheck:viewer": "tsc --noEmit -p viewer/tsconfig.json",
|
|
81
86
|
"site": "vite --config site/vite.config.ts",
|
|
82
87
|
"build:site": "node scripts/build-site.mjs",
|
|
83
88
|
"typecheck:site": "tsc --noEmit -p site/tsconfig.json",
|
|
84
89
|
"deploy": "wrangler deploy",
|
|
90
|
+
"deploy:dev": "wrangler deploy --env dev",
|
|
85
91
|
"pack:oidn-weights": "node scripts/pack-oidn-weights.mjs",
|
|
86
92
|
"check:lib-esm": "node scripts/check-lib-esm.mjs",
|
|
87
93
|
"test:viewer": "vitest run --config viewer/vitest.config.ts",
|
|
94
|
+
"test:viewer:related": "vitest related --run --config viewer/vitest.config.ts --passWithNoTests=false",
|
|
88
95
|
"generate:material-comparison": "node scripts/generate-material-comparison.mjs",
|
|
89
|
-
"check:material-comparison": "node scripts/generate-material-comparison.mjs --check"
|
|
96
|
+
"check:material-comparison": "node scripts/generate-material-comparison.mjs --check",
|
|
97
|
+
"native:modules:verify": "node native/validation/module-verify.mjs",
|
|
98
|
+
"native:storage:verify": "node native/validation/storage-verify.mjs",
|
|
99
|
+
"native:camera": "node native/validation/camera-render.mjs",
|
|
100
|
+
"native:jobs": "node native/validation/job-render.mjs",
|
|
101
|
+
"native:context": "node native/validation/context-render.mjs",
|
|
102
|
+
"native:scene": "node native/validation/scene-render.mjs",
|
|
103
|
+
"native:scene:static": "node native/validation/scene-render.mjs --static",
|
|
104
|
+
"native:scene:verify": "node native/validation/scene-verify.mjs",
|
|
105
|
+
"native:viewer": "node native/scripts/viewer-build.mjs",
|
|
106
|
+
"native:viewer:dev": "node native/scripts/viewer-dev.mjs",
|
|
107
|
+
"native:viewer:build": "node native/scripts/viewer-build.mjs --build-only",
|
|
108
|
+
"native:viewer:package": "node native/scripts/viewer-package.mjs",
|
|
109
|
+
"native:sdk:package": "node native/scripts/sdk-package.mjs",
|
|
110
|
+
"native:settings": "node native/validation/settings-render.mjs",
|
|
111
|
+
"native:engine": "node native/validation/engine-render.mjs",
|
|
112
|
+
"native:ci": "node native/scripts/ci.mjs",
|
|
113
|
+
"native:ci:gpu": "node native/scripts/ci.mjs --gpu",
|
|
114
|
+
"native:ci:hosts": "node native/scripts/ci.mjs --gpu --hosts",
|
|
115
|
+
"test:parity": "node scripts/test-parity.mjs"
|
|
90
116
|
},
|
|
91
117
|
"dependencies": {
|
|
92
118
|
"@webgpu/types": "^0.1.40",
|
|
93
|
-
"
|
|
94
|
-
"oidn-web": "^0.5.0"
|
|
119
|
+
"oidn-webgpu": "^0.6.0"
|
|
95
120
|
},
|
|
96
121
|
"peerDependencies": {
|
|
97
122
|
"@types/three": ">=0.150.0",
|
|
@@ -112,6 +137,7 @@
|
|
|
112
137
|
"@types/three": "^0.185.4",
|
|
113
138
|
"@vitejs/plugin-react": "^4.7.0",
|
|
114
139
|
"fflate": "^0.8.3",
|
|
140
|
+
"gl-matrix": "^3.4.4",
|
|
115
141
|
"lucide-react": "^1.54.0",
|
|
116
142
|
"react": "^18.3.1",
|
|
117
143
|
"react-aria-components": "^1.22.0",
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import OpenPBRMaterial, { MaterialTextureName } from '../scene/OpenPBRMaterial.js';
|
|
2
|
-
import Texture from '../scene/Texture.js';
|
|
3
|
-
export declare function mergeTexturesFromMaterials<T extends MaterialTextureName>(materials: OpenPBRMaterial[], textureNames: readonly T[]): {
|
|
4
|
-
textures: Texture[];
|
|
5
|
-
indices: Record<T, number[]>;
|
|
6
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"texturesFromMaterials.js","sourceRoot":"","sources":["../../src/renderer/texturesFromMaterials.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAOlF,sGAAsG;AACtG,MAAM,UAAU,0BAA0B,CACxC,SAA4B,EAC5B,YAA0B;IAE1B,MAAM,UAAU,GAGZ;QACF,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAyB;KACnC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAC9C,SAAS,EACT,IAAI,EACJ,UAAU,CAAC,QAAQ,CACpB,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,qBAAqB,CAC5B,SAA4B,EAC5B,WAAgC,EAChC,QAAmB;IAEnB,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,eAAe,GACnB,QAAQ,CAAC,WAAW,CAAC;YACrB,QAAQ,CAAC,WAAW,CAAE,CAAC,KAAK,CAAC;QAE/B,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAE,CAAC,CAAC;YAC3D,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,oCAAoC;gBACpC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport OpenPBRMaterial, {\n MaterialTextureName\n} from '../scene/OpenPBRMaterial.js';\nimport Texture from '../scene/Texture.js';\n\n// retrieve textures used by meshes, grouping textures from meshes shared *across all* mesh properties\nexport function mergeTexturesFromMaterials<T extends MaterialTextureName>(\n materials: OpenPBRMaterial[],\n textureNames: readonly T[]\n) {\n const textureMap: {\n textures: Texture[];\n indices: Record<T, number[]>;\n } = {\n textures: [],\n indices: {} as Record<T, number[]>\n };\n\n for (const name of textureNames) {\n textureMap.indices[name] = texturesFromMaterials(\n materials,\n name,\n textureMap.textures\n );\n }\n\n return textureMap;\n}\n\nfunction texturesFromMaterials(\n materials: OpenPBRMaterial[],\n textureName: MaterialTextureName,\n textures: Texture[]\n) {\n const indices = [];\n\n for (const material of materials) {\n const isTextureLoaded =\n material[textureName] &&\n material[textureName]!.image;\n\n if (!isTextureLoaded) {\n indices.push(-1);\n } else {\n let existsIndex = textures.indexOf(material[textureName]!);\n if (existsIndex >= 0) {\n // Reuse existing duplicate texture.\n indices.push(existsIndex);\n } else {\n indices.push(textures.length);\n textures.push(material[textureName]!);\n }\n }\n }\n\n return indices;\n}\n"]}
|