@meimu/mutracer 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/LICENSES/Apache-2.0.txt +202 -0
- package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
- package/LICENSES/GlMatrix-MIT.txt +19 -0
- package/LICENSES/KinoBloom-MIT.txt +21 -0
- package/LICENSES/OIDNWeb-MIT.txt +21 -0
- package/LICENSES/Octicons-MIT.txt +21 -0
- package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
- package/LICENSES/TinyBVH-MIT.txt +21 -0
- package/LICENSES/WebGPUUtils-MIT.txt +21 -0
- package/LICENSES/ZetaRay-MIT.txt +21 -0
- package/README.md +240 -2
- package/THIRD_PARTY_NOTICES.md +160 -0
- package/dist/assets/bvh.worker.js +1 -0
- package/dist/mutracer.umd.js +14360 -0
- package/docs/api.md +394 -0
- package/docs/bvh.md +141 -0
- package/docs/denoising.md +301 -0
- package/docs/getting-started.md +308 -0
- package/docs/materials.md +281 -0
- package/docs/performance.md +85 -0
- package/docs/post-processing.md +87 -0
- package/docs/progressive-rendering.md +160 -0
- package/docs/sampling.md +40 -0
- package/docs/threejs.md +274 -0
- package/docs/todo.md +61 -0
- package/docs/updates.md +208 -0
- package/lib/Display.d.ts +72 -0
- package/lib/Display.js +123 -0
- package/lib/Display.js.map +1 -0
- package/lib/Engine.d.ts +161 -0
- package/lib/Engine.js +681 -0
- package/lib/Engine.js.map +1 -0
- package/lib/Render.d.ts +265 -0
- package/lib/Render.js +742 -0
- package/lib/Render.js.map +1 -0
- package/lib/RenderLoop.d.ts +79 -0
- package/lib/RenderLoop.js +236 -0
- package/lib/RenderLoop.js.map +1 -0
- package/lib/Sync.d.ts +19 -0
- package/lib/Sync.js +19 -0
- package/lib/Sync.js.map +1 -0
- package/lib/constants.d.ts +2 -0
- package/lib/constants.js +3 -0
- package/lib/constants.js.map +1 -0
- package/lib/main.d.ts +56 -0
- package/lib/main.js +43 -0
- package/lib/main.js.map +1 -0
- package/lib/math.d.ts +23 -0
- package/lib/math.js +56 -0
- package/lib/math.js.map +1 -0
- package/lib/oidn.d.ts +45 -0
- package/lib/oidn.js +42 -0
- package/lib/oidn.js.map +1 -0
- package/lib/oidnBundledWeights.cdn.d.ts +2 -0
- package/lib/oidnBundledWeights.cdn.js +5 -0
- package/lib/oidnBundledWeights.cdn.js.map +1 -0
- package/lib/oidnBundledWeights.d.ts +2 -0
- package/lib/oidnBundledWeights.js +4 -0
- package/lib/oidnBundledWeights.js.map +1 -0
- package/lib/renderer/DisplayPostProcess.d.ts +14 -0
- package/lib/renderer/DisplayPostProcess.js +41 -0
- package/lib/renderer/DisplayPostProcess.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +119 -0
- package/lib/renderer/MaterialTable.js +550 -0
- package/lib/renderer/MaterialTable.js.map +1 -0
- package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
- package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
- package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
- package/lib/renderer/RenderingPipeline.d.ts +232 -0
- package/lib/renderer/RenderingPipeline.js +18 -0
- package/lib/renderer/RenderingPipeline.js.map +1 -0
- package/lib/renderer/ScratchPool.d.ts +13 -0
- package/lib/renderer/ScratchPool.js +21 -0
- package/lib/renderer/ScratchPool.js.map +1 -0
- package/lib/renderer/TileRender.d.ts +44 -0
- package/lib/renderer/TileRender.js +283 -0
- package/lib/renderer/TileRender.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.d.ts +17 -0
- package/lib/renderer/WGPUBloomPass.js +243 -0
- package/lib/renderer/WGPUBloomPass.js.map +1 -0
- package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
- package/lib/renderer/WGPUCanvasSurface.js +48 -0
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
- package/lib/renderer/WGPUComputePass.d.ts +73 -0
- package/lib/renderer/WGPUComputePass.js +317 -0
- package/lib/renderer/WGPUComputePass.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
- package/lib/renderer/WGPUFullQuadPass.js +389 -0
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
- package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
- package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
- package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
- package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
- package/lib/renderer/WGPURayTraceOutput.js +368 -0
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
- package/lib/renderer/WGPURayTracePass.d.ts +284 -0
- package/lib/renderer/WGPURayTracePass.js +2323 -0
- package/lib/renderer/WGPURayTracePass.js.map +1 -0
- package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
- package/lib/renderer/WGPURenderingPipeline.js +1448 -0
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
- package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
- package/lib/renderer/WGPUSceneFeatures.js +20 -0
- package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
- package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
- package/lib/renderer/WGPUScratchBuffer.js +21 -0
- package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
- package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
- package/lib/renderer/WGPUScratchTexture.js +27 -0
- package/lib/renderer/WGPUScratchTexture.js.map +1 -0
- package/lib/renderer/WGPUShaderCache.d.ts +26 -0
- package/lib/renderer/WGPUShaderCache.js +103 -0
- package/lib/renderer/WGPUShaderCache.js.map +1 -0
- package/lib/renderer/WebGLBloomPass.d.ts +18 -0
- package/lib/renderer/WebGLBloomPass.js +113 -0
- package/lib/renderer/WebGLBloomPass.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
- package/lib/renderer/WebGLFullQuadPass.js +208 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
- package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
- package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
- package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
- package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
- package/lib/renderer/WebGLRayTracePass.js +845 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -0
- package/lib/renderer/WebGLReadback.d.ts +4 -0
- package/lib/renderer/WebGLReadback.js +75 -0
- package/lib/renderer/WebGLReadback.js.map +1 -0
- package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
- package/lib/renderer/WebGLRenderingPipeline.js +510 -0
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
- package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
- package/lib/renderer/WebGLScratchCopy.js +27 -0
- package/lib/renderer/WebGLScratchCopy.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +26 -0
- package/lib/renderer/accumulationTarget.js +2 -0
- package/lib/renderer/accumulationTarget.js.map +1 -0
- package/lib/renderer/binnedSahBvh.d.ts +31 -0
- package/lib/renderer/binnedSahBvh.js +263 -0
- package/lib/renderer/binnedSahBvh.js.map +1 -0
- package/lib/renderer/bvh.worker.d.ts +1 -0
- package/lib/renderer/bvh.worker.js +16 -0
- package/lib/renderer/bvh.worker.js.map +1 -0
- package/lib/renderer/bvhAccel.d.ts +81 -0
- package/lib/renderer/bvhAccel.js +621 -0
- package/lib/renderer/bvhAccel.js.map +1 -0
- package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
- package/lib/renderer/bvhWorkerBuild.js +17 -0
- package/lib/renderer/bvhWorkerBuild.js.map +1 -0
- package/lib/renderer/bvhWorkerClient.d.ts +57 -0
- package/lib/renderer/bvhWorkerClient.js +166 -0
- package/lib/renderer/bvhWorkerClient.js.map +1 -0
- package/lib/renderer/cameraLens.d.ts +5 -0
- package/lib/renderer/cameraLens.js +15 -0
- package/lib/renderer/cameraLens.js.map +1 -0
- package/lib/renderer/cameraSnapshot.d.ts +3 -0
- package/lib/renderer/cameraSnapshot.js +7 -0
- package/lib/renderer/cameraSnapshot.js.map +1 -0
- package/lib/renderer/committedScene.d.ts +13 -0
- package/lib/renderer/committedScene.js +126 -0
- package/lib/renderer/committedScene.js.map +1 -0
- package/lib/renderer/dataTextureUtil.d.ts +32 -0
- package/lib/renderer/dataTextureUtil.js +46 -0
- package/lib/renderer/dataTextureUtil.js.map +1 -0
- package/lib/renderer/denoiser.d.ts +65 -0
- package/lib/renderer/denoiser.js +2 -0
- package/lib/renderer/denoiser.js.map +1 -0
- package/lib/renderer/depthQuery.d.ts +14 -0
- package/lib/renderer/depthQuery.js +14 -0
- package/lib/renderer/depthQuery.js.map +1 -0
- package/lib/renderer/deviceRequirements.d.ts +23 -0
- package/lib/renderer/deviceRequirements.js +50 -0
- package/lib/renderer/deviceRequirements.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +10 -0
- package/lib/renderer/envMapCreation.js +96 -0
- package/lib/renderer/envMapCreation.js.map +1 -0
- package/lib/renderer/envMapDistribution.d.ts +9 -0
- package/lib/renderer/envMapDistribution.js +107 -0
- package/lib/renderer/envMapDistribution.js.map +1 -0
- package/lib/renderer/float16.d.ts +1 -0
- package/lib/renderer/float16.js +19 -0
- package/lib/renderer/float16.js.map +1 -0
- package/lib/renderer/geometryBvh.d.ts +11 -0
- package/lib/renderer/geometryBvh.js +24 -0
- package/lib/renderer/geometryBvh.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +28 -0
- package/lib/renderer/geometryUpdates.js +131 -0
- package/lib/renderer/geometryUpdates.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
- package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
- package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
- package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
- package/lib/renderer/glsl/depthQuery.frag.js +55 -0
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
- package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/rayTrace.frag.js +623 -0
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
- package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
- package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
- package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
- package/lib/renderer/gpuMemory.d.ts +2 -0
- package/lib/renderer/gpuMemory.js +10 -0
- package/lib/renderer/gpuMemory.js.map +1 -0
- package/lib/renderer/halton.d.ts +1 -0
- package/lib/renderer/halton.js +15 -0
- package/lib/renderer/halton.js.map +1 -0
- package/lib/renderer/jnlm.d.ts +85 -0
- package/lib/renderer/jnlm.js +87 -0
- package/lib/renderer/jnlm.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +75 -0
- package/lib/renderer/lightSampling.js +305 -0
- package/lib/renderer/lightSampling.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +26 -0
- package/lib/renderer/lightsUtil.js +154 -0
- package/lib/renderer/lightsUtil.js.map +1 -0
- package/lib/renderer/materialChanges.d.ts +13 -0
- package/lib/renderer/materialChanges.js +59 -0
- package/lib/renderer/materialChanges.js.map +1 -0
- package/lib/renderer/materialComparison.generated.d.ts +5 -0
- package/lib/renderer/materialComparison.generated.js +655 -0
- package/lib/renderer/materialComparison.generated.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +6 -0
- package/lib/renderer/materialConstants.js +3 -0
- package/lib/renderer/materialConstants.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +9 -0
- package/lib/renderer/materialEmission.js +21 -0
- package/lib/renderer/materialEmission.js.map +1 -0
- package/lib/renderer/materialIndices.d.ts +7 -0
- package/lib/renderer/materialIndices.js +34 -0
- package/lib/renderer/materialIndices.js.map +1 -0
- package/lib/renderer/materialLayout.d.ts +102 -0
- package/lib/renderer/materialLayout.js +189 -0
- package/lib/renderer/materialLayout.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +537 -0
- package/lib/renderer/materialTextureSlots.js +219 -0
- package/lib/renderer/materialTextureSlots.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
- package/lib/renderer/mergeMeshesToGeometry.js +236 -0
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
- package/lib/renderer/meshInstances.d.ts +23 -0
- package/lib/renderer/meshInstances.js +66 -0
- package/lib/renderer/meshInstances.js.map +1 -0
- package/lib/renderer/meshMembership.d.ts +10 -0
- package/lib/renderer/meshMembership.js +72 -0
- package/lib/renderer/meshMembership.js.map +1 -0
- package/lib/renderer/oidnNetwork.d.ts +20 -0
- package/lib/renderer/oidnNetwork.js +123 -0
- package/lib/renderer/oidnNetwork.js.map +1 -0
- package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
- package/lib/renderer/openPbrEnergyLut.js +965 -0
- package/lib/renderer/openPbrEnergyLut.js.map +1 -0
- package/lib/renderer/pathLimits.d.ts +4 -0
- package/lib/renderer/pathLimits.js +7 -0
- package/lib/renderer/pathLimits.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +110 -0
- package/lib/renderer/prepareMeshBVH.js +857 -0
- package/lib/renderer/prepareMeshBVH.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +11 -0
- package/lib/renderer/progressiveScheduler.js +19 -0
- package/lib/renderer/progressiveScheduler.js.map +1 -0
- package/lib/renderer/renderPipeline.d.ts +57 -0
- package/lib/renderer/renderPipeline.js +49 -0
- package/lib/renderer/renderPipeline.js.map +1 -0
- package/lib/renderer/sampling.d.ts +10 -0
- package/lib/renderer/sampling.js +28 -0
- package/lib/renderer/sampling.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +29 -0
- package/lib/renderer/sceneChangeDetector.js +232 -0
- package/lib/renderer/sceneChangeDetector.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +14 -0
- package/lib/renderer/sceneLightChanges.js +34 -0
- package/lib/renderer/sceneLightChanges.js.map +1 -0
- package/lib/renderer/scratchSampling.d.ts +3 -0
- package/lib/renderer/scratchSampling.js +39 -0
- package/lib/renderer/scratchSampling.js.map +1 -0
- package/lib/renderer/shader.d.ts +37 -0
- package/lib/renderer/shader.js +41 -0
- package/lib/renderer/shader.js.map +1 -0
- package/lib/renderer/staticBvhPreparation.d.ts +24 -0
- package/lib/renderer/staticBvhPreparation.js +116 -0
- package/lib/renderer/staticBvhPreparation.js.map +1 -0
- package/lib/renderer/textureRegion.d.ts +8 -0
- package/lib/renderer/textureRegion.js +9 -0
- package/lib/renderer/textureRegion.js.map +1 -0
- package/lib/renderer/texturesFromMaterials.d.ts +6 -0
- package/lib/renderer/texturesFromMaterials.js +37 -0
- package/lib/renderer/texturesFromMaterials.js.map +1 -0
- package/lib/renderer/util.d.ts +17 -0
- package/lib/renderer/util.js +56 -0
- package/lib/renderer/util.js.map +1 -0
- package/lib/renderer/webgl.d.ts +131 -0
- package/lib/renderer/webgl.js +586 -0
- package/lib/renderer/webgl.js.map +1 -0
- package/lib/renderer/webglShaders.d.ts +4 -0
- package/lib/renderer/webglShaders.js +41 -0
- package/lib/renderer/webglShaders.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +927 -0
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
- package/lib/scene/AmbientLight.d.ts +17 -0
- package/lib/scene/AmbientLight.js +15 -0
- package/lib/scene/AmbientLight.js.map +1 -0
- package/lib/scene/Camera.d.ts +78 -0
- package/lib/scene/Camera.js +111 -0
- package/lib/scene/Camera.js.map +1 -0
- package/lib/scene/DirectionalLight.d.ts +18 -0
- package/lib/scene/DirectionalLight.js +17 -0
- package/lib/scene/DirectionalLight.js.map +1 -0
- package/lib/scene/EnvironmentLight.d.ts +14 -0
- package/lib/scene/EnvironmentLight.js +14 -0
- package/lib/scene/EnvironmentLight.js.map +1 -0
- package/lib/scene/Geometry.d.ts +87 -0
- package/lib/scene/Geometry.js +108 -0
- package/lib/scene/Geometry.js.map +1 -0
- package/lib/scene/IESProfile.d.ts +19 -0
- package/lib/scene/IESProfile.js +165 -0
- package/lib/scene/IESProfile.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +43 -0
- package/lib/scene/InstancedMesh.js +79 -0
- package/lib/scene/InstancedMesh.js.map +1 -0
- package/lib/scene/Mesh.d.ts +14 -0
- package/lib/scene/Mesh.js +17 -0
- package/lib/scene/Mesh.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +224 -0
- package/lib/scene/OpenPBRMaterial.js +240 -0
- package/lib/scene/OpenPBRMaterial.js.map +1 -0
- package/lib/scene/RectLight.d.ts +31 -0
- package/lib/scene/RectLight.js +26 -0
- package/lib/scene/RectLight.js.map +1 -0
- package/lib/scene/Scene.d.ts +55 -0
- package/lib/scene/Scene.js +2 -0
- package/lib/scene/Scene.js.map +1 -0
- package/lib/scene/SceneNode.d.ts +16 -0
- package/lib/scene/SceneNode.js +33 -0
- package/lib/scene/SceneNode.js.map +1 -0
- package/lib/scene/SphereLight.d.ts +22 -0
- package/lib/scene/SphereLight.js +20 -0
- package/lib/scene/SphereLight.js.map +1 -0
- package/lib/scene/SpotLight.d.ts +35 -0
- package/lib/scene/SpotLight.js +29 -0
- package/lib/scene/SpotLight.js.map +1 -0
- package/lib/scene/Texture.d.ts +38 -0
- package/lib/scene/Texture.js +37 -0
- package/lib/scene/Texture.js.map +1 -0
- package/lib/scene/anisotropyParameters.d.ts +1 -0
- package/lib/scene/anisotropyParameters.js +13 -0
- package/lib/scene/anisotropyParameters.js.map +1 -0
- package/lib/scene/geometryChanges.d.ts +5 -0
- package/lib/scene/geometryChanges.js +18 -0
- package/lib/scene/geometryChanges.js.map +1 -0
- package/lib/scene/materialTextureNames.d.ts +2 -0
- package/lib/scene/materialTextureNames.js +9 -0
- package/lib/scene/materialTextureNames.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +400 -0
- package/lib/scene/openPbrSchema.js +149 -0
- package/lib/scene/openPbrSchema.js.map +1 -0
- package/lib/scene/thinFilmParameters.d.ts +4 -0
- package/lib/scene/thinFilmParameters.js +12 -0
- package/lib/scene/thinFilmParameters.js.map +1 -0
- package/lib/settings/display.d.ts +118 -0
- package/lib/settings/display.js +34 -0
- package/lib/settings/display.js.map +1 -0
- package/lib/settings/engine.d.ts +37 -0
- package/lib/settings/engine.js +26 -0
- package/lib/settings/engine.js.map +1 -0
- package/lib/settings/render.d.ts +178 -0
- package/lib/settings/render.js +36 -0
- package/lib/settings/render.js.map +1 -0
- package/lib/tinybvh/LICENSE +21 -0
- package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
- package/lib/tinybvh/TinyBvhBuilder.js +211 -0
- package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/types.d.ts +13 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/util/canvas.d.ts +2 -0
- package/lib/util/canvas.js +13 -0
- package/lib/util/canvas.js.map +1 -0
- package/lib/util/commonGeometry.d.ts +15 -0
- package/lib/util/commonGeometry.js +240 -0
- package/lib/util/commonGeometry.js.map +1 -0
- package/lib/util/events.d.ts +7 -0
- package/lib/util/events.js +23 -0
- package/lib/util/events.js.map +1 -0
- package/lib/util/frame.d.ts +2 -0
- package/lib/util/frame.js +10 -0
- package/lib/util/frame.js.map +1 -0
- package/lib/util/fromTHREE.d.ts +105 -0
- package/lib/util/fromTHREE.js +1111 -0
- package/lib/util/fromTHREE.js.map +1 -0
- package/lib/util/geometry.d.ts +13 -0
- package/lib/util/geometry.js +292 -0
- package/lib/util/geometry.js.map +1 -0
- package/lib/util/loadRGBE.d.ts +7 -0
- package/lib/util/loadRGBE.js +168 -0
- package/lib/util/loadRGBE.js.map +1 -0
- package/lib/util/math.d.ts +8 -0
- package/lib/util/math.js +64 -0
- package/lib/util/math.js.map +1 -0
- package/lib/util/mesh.d.ts +7 -0
- package/lib/util/mesh.js +20 -0
- package/lib/util/mesh.js.map +1 -0
- package/lib/util/threeDeformation.d.ts +20 -0
- package/lib/util/threeDeformation.js +218 -0
- package/lib/util/threeDeformation.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.js +3 -0
- package/lib/version.js.map +1 -0
- package/llms.txt +62 -0
- package/oidn/weights/LICENSE.txt +202 -0
- package/oidn/weights/README.md +43 -0
- package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
- package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
- package/package.json +124 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Geometry.js","sourceRoot":"","sources":["../../src/scene/Geometry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Vec3 } from '../types.js';\nimport { generateVertexNormals } from '../util/geometry.js';\nimport { vec3 } from '../math.js';\n\ntype AttributeData = Float32Array | Uint16Array | Uint32Array | Int32Array;\nexport class Attribute<T extends AttributeData = AttributeData> {\n array: T;\n itemSize: number;\n constructor(array: T, itemSize: number) {\n this.array = array;\n this.itemSize = itemSize;\n }\n\n static getItem(attr: Attribute, out: number[], vertexIndex: number) {\n const array = attr.array;\n const itemSize = attr.itemSize;\n const offset = vertexIndex * itemSize;\n for (let i = 0; i < itemSize; i++) {\n out[i] = array[offset + i];\n }\n }\n\n static getCount(attr: Attribute) {\n return attr.array.length / attr.itemSize;\n }\n}\n\nexport type AttributeName =\n | 'position'\n | 'normal'\n | 'tangent'\n | 'uv'\n | 'uv1'\n | 'color';\nexport const AVAILABLE_ATTRIBUTES: AttributeName[] = [\n 'position',\n 'normal',\n 'tangent',\n 'uv',\n 'uv1',\n 'color'\n];\n\n/** Triangle geometry construction data. */\nexport interface GeometryInit {\n /** Required vertex positions in scene units, itemSize 3. */\n position: Attribute<Float32Array>;\n /** Triangle vertex indices, itemSize 1. Default: sequential indices 0..vertexCount-1. */\n indices?: Attribute<Uint16Array | Uint32Array>;\n /** Vertex normals, itemSize 3. Default: generated smooth area-weighted normals. */\n normal?: Attribute<Float32Array>;\n /** Vertex tangents (XYZ, optional W handedness). Default undefined. */\n tangent?: Attribute<Float32Array>;\n /** Primary UV coordinates. Default undefined. */\n uv?: Attribute<Float32Array>;\n /** Secondary UV coordinates. Default undefined. */\n uv1?: Attribute<Float32Array>;\n /** Vertex RGB colors. Default undefined. */\n color?: Attribute<Float32Array>;\n /** Raw per-vertex material indices, itemSize 1. Default undefined selects material 0. */\n materialIndex?: Attribute<Int32Array>;\n}\n\n/** Triangle mesh data. Only position is required; missing indices and normals are generated at construction. */\nexport default class Geometry {\n /** Incremented by either update method. Default `0`. */\n version = 0;\n private _topologyVersion = 0;\n /** Index/material-index revision, advanced by markUpdated(). Default `0`. */\n get topologyVersion() { return this._topologyVersion; }\n /**\n * Hint that vertices change often (skinning, morph targets). Keeps a built-in\n * BVH2 layout that can be refit in place. Default `false`.\n */\n dynamic = false;\n /** Required vertex positions in scene units; provided by the constructor. */\n position: Attribute<Float32Array>;\n /** Vertex normals; supplied or generated at construction. */\n normal: Attribute<Float32Array>;\n /** Optional vertex tangents (XYZ, optional W handedness). Default undefined. */\n tangent?: Attribute<Float32Array>;\n /** Optional primary texture coordinates. Default undefined. */\n uv?: Attribute<Float32Array>;\n /** Optional secondary UV set (glTF TEXCOORD_1 / Three.js uv1). Default undefined. */\n uv1?: Attribute<Float32Array>;\n /** Optional vertex RGB colors. Default undefined. */\n color?: Attribute<Float32Array>;\n /** Required triangle vertex indices; three entries per triangle. */\n indices: Attribute<Uint16Array | Uint32Array>;\n /** Optional per-vertex raw material indices, itemSize 1. All three triangle corners must match. Default undefined selects material 0. */\n materialIndex?: Attribute<Int32Array>;\n\n /** Local-space bounds in scene units; initial min/max are `[0, 0, 0]`. */\n boundingBox: { min: Vec3; max: Vec3 } = {\n min: vec3.create(),\n max: vec3.create()\n };\n constructor(data: GeometryInit) {\n this.position = data.position;\n this.indices = data.indices ?? new Attribute(Uint32Array.from({ length: this.vertexCount }, (_, index) => index), 1);\n this.normal = data.normal ?? new Attribute(new Float32Array(this.vertexCount * 3), 3);\n if (!data.normal) generateVertexNormals(this);\n\n this.tangent = data.tangent;\n this.uv = data.uv;\n this.uv1 = data.uv1;\n this.color = data.color;\n this.materialIndex = data.materialIndex;\n }\n\n /**\n * Call after index/material-index edits or a general geometry update.\n * Advances version and topologyVersion to request topology processing and\n * BVH rebuilding. For vertex-only edits with unchanged indices\n * and materialIndex, use markVerticesUpdated() to allow refitting instead.\n * Neither notification recalculates normals or tangents.\n * Replacing a mesh's Geometry object is detected without this call.\n */\n markUpdated() {\n this._topologyVersion++;\n this.version++;\n return this;\n }\n\n /**\n * Call after editing vertex attributes without changing indices or materialIndex.\n * Advances version while preserving topologyVersion, allowing vertex-only uploads.\n * With stable arrays, lengths and item sizes, the next render refits supported\n * BVHs or rebuilds when needed. Changed storage or displacement still requires\n * full scene data preparation. Does not recalculate normals or tangents.\n */\n markVerticesUpdated() {\n this.version++;\n return this;\n }\n\n /** Returns the number of vertices in the position attribute. */\n get vertexCount() {\n return this.position.array.length / this.position.itemSize;\n }\n\n /** Number of triangles in the index attribute. */\n get triangleCount() {\n return this.indices.array.length / 3;\n }\n\n\n\n\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare class IESParseError extends Error {
|
|
2
|
+
constructor(message: string, profileName?: string);
|
|
3
|
+
}
|
|
4
|
+
export default class IESProfile {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly verticalAngles: number[];
|
|
7
|
+
readonly horizontalAngles: number[];
|
|
8
|
+
readonly candelaValues: number[];
|
|
9
|
+
readonly peakCandela: number;
|
|
10
|
+
readonly data: Float32Array;
|
|
11
|
+
readonly type: "IESProfile";
|
|
12
|
+
readonly size = 128;
|
|
13
|
+
constructor(name: string, verticalAngles: number[], horizontalAngles: number[], candelaValues: number[], peakCandela: number, data: Float32Array);
|
|
14
|
+
/** Bilinear LM-63 candela lookup, normalized so the source peak is exactly 1. */
|
|
15
|
+
evaluateAngles(verticalDegrees: number, horizontalDegrees: number): number;
|
|
16
|
+
/** CPU reference for the manual bilinear lookup used by the WebGL/WGSL paths. */
|
|
17
|
+
sampleBaked(verticalRadians: number, horizontalRadians: number, rotationRadians?: number): number;
|
|
18
|
+
}
|
|
19
|
+
export declare function parseIESProfile(source: string, profileName?: string): IESProfile;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
const BAKED_SIZE = 128;
|
|
2
|
+
export class IESParseError extends Error {
|
|
3
|
+
constructor(message, profileName = 'IES profile') {
|
|
4
|
+
super(`${profileName}: ${message}`);
|
|
5
|
+
this.name = 'IESParseError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
function angleIndex(angle, angles) {
|
|
9
|
+
if (angles.length === 1 || angle <= angles[0])
|
|
10
|
+
return 0;
|
|
11
|
+
const last = angles.length - 1;
|
|
12
|
+
if (angle >= angles[last])
|
|
13
|
+
return last;
|
|
14
|
+
for (let i = 1; i <= last; i++) {
|
|
15
|
+
if (angle <= angles[i]) {
|
|
16
|
+
return i - 1 + (angle - angles[i - 1]) / (angles[i] - angles[i - 1]);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return last;
|
|
20
|
+
}
|
|
21
|
+
function lerp(a, b, t) {
|
|
22
|
+
return a + (b - a) * t;
|
|
23
|
+
}
|
|
24
|
+
export default class IESProfile {
|
|
25
|
+
name;
|
|
26
|
+
verticalAngles;
|
|
27
|
+
horizontalAngles;
|
|
28
|
+
candelaValues;
|
|
29
|
+
peakCandela;
|
|
30
|
+
data;
|
|
31
|
+
type = 'IESProfile';
|
|
32
|
+
size = BAKED_SIZE;
|
|
33
|
+
constructor(name, verticalAngles, horizontalAngles, candelaValues, peakCandela, data) {
|
|
34
|
+
this.name = name;
|
|
35
|
+
this.verticalAngles = verticalAngles;
|
|
36
|
+
this.horizontalAngles = horizontalAngles;
|
|
37
|
+
this.candelaValues = candelaValues;
|
|
38
|
+
this.peakCandela = peakCandela;
|
|
39
|
+
this.data = data;
|
|
40
|
+
}
|
|
41
|
+
/** Bilinear LM-63 candela lookup, normalized so the source peak is exactly 1. */
|
|
42
|
+
evaluateAngles(verticalDegrees, horizontalDegrees) {
|
|
43
|
+
if (verticalDegrees > this.verticalAngles[this.verticalAngles.length - 1]) {
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
let horizontal = horizontalDegrees;
|
|
47
|
+
const lastHorizontal = this.horizontalAngles[this.horizontalAngles.length - 1];
|
|
48
|
+
if (lastHorizontal <= 180) {
|
|
49
|
+
horizontal = Math.abs(horizontal);
|
|
50
|
+
if (lastHorizontal === 90 && horizontal > 90) {
|
|
51
|
+
horizontal = 180 - horizontal;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (horizontal < 0) {
|
|
55
|
+
horizontal += 360;
|
|
56
|
+
}
|
|
57
|
+
const v = angleIndex(verticalDegrees, this.verticalAngles);
|
|
58
|
+
const h = angleIndex(horizontal, this.horizontalAngles);
|
|
59
|
+
const v0 = Math.floor(v);
|
|
60
|
+
const v1 = Math.ceil(v);
|
|
61
|
+
const h0 = Math.floor(h);
|
|
62
|
+
const h1 = Math.ceil(h);
|
|
63
|
+
const vf = v - v0;
|
|
64
|
+
const hf = h - h0;
|
|
65
|
+
const n = this.verticalAngles.length;
|
|
66
|
+
const a = this.candelaValues[h0 * n + v0];
|
|
67
|
+
const b = this.candelaValues[h0 * n + v1];
|
|
68
|
+
const c = this.candelaValues[h1 * n + v0];
|
|
69
|
+
const d = this.candelaValues[h1 * n + v1];
|
|
70
|
+
return lerp(lerp(a, b, vf), lerp(c, d, vf), hf) / this.peakCandela;
|
|
71
|
+
}
|
|
72
|
+
/** CPU reference for the manual bilinear lookup used by the WebGL/WGSL paths. */
|
|
73
|
+
sampleBaked(verticalRadians, horizontalRadians, rotationRadians = 0) {
|
|
74
|
+
const u = verticalRadians / Math.PI;
|
|
75
|
+
const v = (horizontalRadians - rotationRadians) / (2 * Math.PI) + 0.5;
|
|
76
|
+
const px = u * BAKED_SIZE - 0.5;
|
|
77
|
+
const py = v * BAKED_SIZE - 0.5;
|
|
78
|
+
const x0 = Math.floor(px);
|
|
79
|
+
const y0 = Math.floor(py);
|
|
80
|
+
const fx = px - x0;
|
|
81
|
+
const fy = py - y0;
|
|
82
|
+
const wrap = (value) => ((value % BAKED_SIZE) + BAKED_SIZE) % BAKED_SIZE;
|
|
83
|
+
const at = (x, y) => this.data[wrap(y) * BAKED_SIZE + wrap(x)];
|
|
84
|
+
return lerp(lerp(at(x0, y0), at(x0 + 1, y0), fx), lerp(at(x0, y0 + 1), at(x0 + 1, y0 + 1), fx), fy);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const SUPPORTED_HEADERS = [
|
|
88
|
+
'IESNA:LM-63-1986',
|
|
89
|
+
'IESNA:LM-63-1991',
|
|
90
|
+
'IESNA91',
|
|
91
|
+
'IESNA:LM-63-1995',
|
|
92
|
+
'IESNA:LM-63-2002',
|
|
93
|
+
'ERCO Leuchten'
|
|
94
|
+
];
|
|
95
|
+
export function parseIESProfile(source, profileName = 'IES profile') {
|
|
96
|
+
const lines = source.replace(/\r/g, '').split('\n');
|
|
97
|
+
const header = lines[0]?.trim();
|
|
98
|
+
if (!SUPPORTED_HEADERS.includes(header)) {
|
|
99
|
+
throw new IESParseError(`unsupported LM-63 header "${header || '<empty>'}"`, profileName);
|
|
100
|
+
}
|
|
101
|
+
const tiltIndex = lines.findIndex((line) => line.trim().startsWith('TILT='));
|
|
102
|
+
if (tiltIndex < 0)
|
|
103
|
+
throw new IESParseError('missing TILT record', profileName);
|
|
104
|
+
if (lines[tiltIndex].trim() !== 'TILT=NONE') {
|
|
105
|
+
throw new IESParseError('only TILT=NONE is supported', profileName);
|
|
106
|
+
}
|
|
107
|
+
const tokens = lines
|
|
108
|
+
.slice(tiltIndex + 1)
|
|
109
|
+
.join(' ')
|
|
110
|
+
.trim()
|
|
111
|
+
.split(/[\s,]+/)
|
|
112
|
+
.filter(Boolean);
|
|
113
|
+
const values = tokens.map((token) => Number(token));
|
|
114
|
+
const invalid = values.findIndex((value) => !Number.isFinite(value));
|
|
115
|
+
if (invalid >= 0) {
|
|
116
|
+
throw new IESParseError(`invalid numeric token "${tokens[invalid]}"`, profileName);
|
|
117
|
+
}
|
|
118
|
+
if (values.length < 13) {
|
|
119
|
+
throw new IESParseError('incomplete numeric header', profileName);
|
|
120
|
+
}
|
|
121
|
+
const verticalCount = values[3];
|
|
122
|
+
const horizontalCount = values[4];
|
|
123
|
+
if (!Number.isInteger(verticalCount) ||
|
|
124
|
+
verticalCount < 1 ||
|
|
125
|
+
!Number.isInteger(horizontalCount) ||
|
|
126
|
+
horizontalCount < 1) {
|
|
127
|
+
throw new IESParseError('angle counts must be positive integers', profileName);
|
|
128
|
+
}
|
|
129
|
+
if (values[5] !== 1) {
|
|
130
|
+
throw new IESParseError('only Type C photometry is supported', profileName);
|
|
131
|
+
}
|
|
132
|
+
const expected = 13 + verticalCount + horizontalCount + verticalCount * horizontalCount;
|
|
133
|
+
if (values.length !== expected) {
|
|
134
|
+
throw new IESParseError(`numeric data size is ${values.length}, expected ${expected}`, profileName);
|
|
135
|
+
}
|
|
136
|
+
const verticalAngles = values.slice(13, 13 + verticalCount);
|
|
137
|
+
const horizontalAngles = values.slice(13 + verticalCount, 13 + verticalCount + horizontalCount);
|
|
138
|
+
const candelaValues = values.slice(13 + verticalCount + horizontalCount);
|
|
139
|
+
const validateAngles = (angles, label, max) => {
|
|
140
|
+
if (angles.some((v, i) => v < 0 || v > max || (i > 0 && v <= angles[i - 1]))) {
|
|
141
|
+
throw new IESParseError(`${label} angles must be finite, strictly increasing, and within 0..${max}`, profileName);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
validateAngles(verticalAngles, 'vertical', 180);
|
|
145
|
+
validateAngles(horizontalAngles, 'horizontal', 360);
|
|
146
|
+
if (verticalAngles[0] !== 0 || horizontalAngles[0] !== 0) {
|
|
147
|
+
throw new IESParseError('Type C angle tables must begin at 0 degrees', profileName);
|
|
148
|
+
}
|
|
149
|
+
if (candelaValues.some((v) => v < 0)) {
|
|
150
|
+
throw new IESParseError('candela values must be non-negative', profileName);
|
|
151
|
+
}
|
|
152
|
+
const peakCandela = Math.max(...candelaValues);
|
|
153
|
+
if (!(peakCandela > 0)) {
|
|
154
|
+
throw new IESParseError('candela peak must be greater than zero', profileName);
|
|
155
|
+
}
|
|
156
|
+
const profile = new IESProfile(profileName, verticalAngles, horizontalAngles, candelaValues, peakCandela, new Float32Array(BAKED_SIZE * BAKED_SIZE));
|
|
157
|
+
for (let y = 0; y < BAKED_SIZE; y++) {
|
|
158
|
+
const horizontal = (y * 360) / BAKED_SIZE - 180;
|
|
159
|
+
for (let x = 0; x < BAKED_SIZE; x++) {
|
|
160
|
+
profile.data[y * BAKED_SIZE + x] = profile.evaluateAngles((x * 180) / BAKED_SIZE, horizontal);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return profile;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=IESProfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IESProfile.js","sourceRoot":"","sources":["../../src/scene/IESProfile.ts"],"names":[],"mappings":"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","sourcesContent":["const BAKED_SIZE = 128;\n\nexport class IESParseError extends Error {\n constructor(message: string, profileName = 'IES profile') {\n super(`${profileName}: ${message}`);\n this.name = 'IESParseError';\n }\n}\n\nfunction angleIndex(angle: number, angles: number[]) {\n if (angles.length === 1 || angle <= angles[0]) return 0;\n const last = angles.length - 1;\n if (angle >= angles[last]) return last;\n for (let i = 1; i <= last; i++) {\n if (angle <= angles[i]) {\n return i - 1 + (angle - angles[i - 1]) / (angles[i] - angles[i - 1]);\n }\n }\n return last;\n}\n\nfunction lerp(a: number, b: number, t: number) {\n return a + (b - a) * t;\n}\n\nexport default class IESProfile {\n readonly type = 'IESProfile' as const;\n readonly size = BAKED_SIZE;\n\n constructor(\n readonly name: string,\n readonly verticalAngles: number[],\n readonly horizontalAngles: number[],\n readonly candelaValues: number[],\n readonly peakCandela: number,\n readonly data: Float32Array\n ) {}\n\n /** Bilinear LM-63 candela lookup, normalized so the source peak is exactly 1. */\n evaluateAngles(verticalDegrees: number, horizontalDegrees: number) {\n if (verticalDegrees > this.verticalAngles[this.verticalAngles.length - 1]) {\n return 0;\n }\n let horizontal = horizontalDegrees;\n const lastHorizontal =\n this.horizontalAngles[this.horizontalAngles.length - 1];\n if (lastHorizontal <= 180) {\n horizontal = Math.abs(horizontal);\n if (lastHorizontal === 90 && horizontal > 90) {\n horizontal = 180 - horizontal;\n }\n } else if (horizontal < 0) {\n horizontal += 360;\n }\n const v = angleIndex(verticalDegrees, this.verticalAngles);\n const h = angleIndex(horizontal, this.horizontalAngles);\n const v0 = Math.floor(v);\n const v1 = Math.ceil(v);\n const h0 = Math.floor(h);\n const h1 = Math.ceil(h);\n const vf = v - v0;\n const hf = h - h0;\n const n = this.verticalAngles.length;\n const a = this.candelaValues[h0 * n + v0];\n const b = this.candelaValues[h0 * n + v1];\n const c = this.candelaValues[h1 * n + v0];\n const d = this.candelaValues[h1 * n + v1];\n return lerp(lerp(a, b, vf), lerp(c, d, vf), hf) / this.peakCandela;\n }\n\n /** CPU reference for the manual bilinear lookup used by the WebGL/WGSL paths. */\n sampleBaked(\n verticalRadians: number,\n horizontalRadians: number,\n rotationRadians = 0\n ) {\n const u = verticalRadians / Math.PI;\n const v = (horizontalRadians - rotationRadians) / (2 * Math.PI) + 0.5;\n const px = u * BAKED_SIZE - 0.5;\n const py = v * BAKED_SIZE - 0.5;\n const x0 = Math.floor(px);\n const y0 = Math.floor(py);\n const fx = px - x0;\n const fy = py - y0;\n const wrap = (value: number) =>\n ((value % BAKED_SIZE) + BAKED_SIZE) % BAKED_SIZE;\n const at = (x: number, y: number) =>\n this.data[wrap(y) * BAKED_SIZE + wrap(x)];\n return lerp(\n lerp(at(x0, y0), at(x0 + 1, y0), fx),\n lerp(at(x0, y0 + 1), at(x0 + 1, y0 + 1), fx),\n fy\n );\n }\n}\n\nconst SUPPORTED_HEADERS = [\n 'IESNA:LM-63-1986',\n 'IESNA:LM-63-1991',\n 'IESNA91',\n 'IESNA:LM-63-1995',\n 'IESNA:LM-63-2002',\n 'ERCO Leuchten'\n];\n\nexport function parseIESProfile(source: string, profileName = 'IES profile') {\n const lines = source.replace(/\\r/g, '').split('\\n');\n const header = lines[0]?.trim();\n if (!SUPPORTED_HEADERS.includes(header)) {\n throw new IESParseError(\n `unsupported LM-63 header \"${header || '<empty>'}\"`,\n profileName\n );\n }\n const tiltIndex = lines.findIndex((line) => line.trim().startsWith('TILT='));\n if (tiltIndex < 0) throw new IESParseError('missing TILT record', profileName);\n if (lines[tiltIndex].trim() !== 'TILT=NONE') {\n throw new IESParseError('only TILT=NONE is supported', profileName);\n }\n const tokens = lines\n .slice(tiltIndex + 1)\n .join(' ')\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n const values = tokens.map((token) => Number(token));\n const invalid = values.findIndex((value) => !Number.isFinite(value));\n if (invalid >= 0) {\n throw new IESParseError(\n `invalid numeric token \"${tokens[invalid]}\"`,\n profileName\n );\n }\n if (values.length < 13) {\n throw new IESParseError('incomplete numeric header', profileName);\n }\n const verticalCount = values[3];\n const horizontalCount = values[4];\n if (\n !Number.isInteger(verticalCount) ||\n verticalCount < 1 ||\n !Number.isInteger(horizontalCount) ||\n horizontalCount < 1\n ) {\n throw new IESParseError('angle counts must be positive integers', profileName);\n }\n if (values[5] !== 1) {\n throw new IESParseError('only Type C photometry is supported', profileName);\n }\n const expected =\n 13 + verticalCount + horizontalCount + verticalCount * horizontalCount;\n if (values.length !== expected) {\n throw new IESParseError(\n `numeric data size is ${values.length}, expected ${expected}`,\n profileName\n );\n }\n const verticalAngles = values.slice(13, 13 + verticalCount);\n const horizontalAngles = values.slice(\n 13 + verticalCount,\n 13 + verticalCount + horizontalCount\n );\n const candelaValues = values.slice(13 + verticalCount + horizontalCount);\n const validateAngles = (angles: number[], label: string, max: number) => {\n if (\n angles.some(\n (v, i) => v < 0 || v > max || (i > 0 && v <= angles[i - 1])\n )\n ) {\n throw new IESParseError(\n `${label} angles must be finite, strictly increasing, and within 0..${max}`,\n profileName\n );\n }\n };\n validateAngles(verticalAngles, 'vertical', 180);\n validateAngles(horizontalAngles, 'horizontal', 360);\n if (verticalAngles[0] !== 0 || horizontalAngles[0] !== 0) {\n throw new IESParseError(\n 'Type C angle tables must begin at 0 degrees',\n profileName\n );\n }\n if (candelaValues.some((v) => v < 0)) {\n throw new IESParseError('candela values must be non-negative', profileName);\n }\n const peakCandela = Math.max(...candelaValues);\n if (!(peakCandela > 0)) {\n throw new IESParseError(\n 'candela peak must be greater than zero',\n profileName\n );\n }\n\n const profile = new IESProfile(\n profileName,\n verticalAngles,\n horizontalAngles,\n candelaValues,\n peakCandela,\n new Float32Array(BAKED_SIZE * BAKED_SIZE)\n );\n for (let y = 0; y < BAKED_SIZE; y++) {\n const horizontal = (y * 360) / BAKED_SIZE - 180;\n for (let x = 0; x < BAKED_SIZE; x++) {\n profile.data[y * BAKED_SIZE + x] = profile.evaluateAngles(\n (x * 180) / BAKED_SIZE,\n horizontal\n );\n }\n }\n return profile;\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import Mesh from './Mesh.js';
|
|
2
|
+
import Geometry from './Geometry.js';
|
|
3
|
+
import OpenPBRMaterial from './OpenPBRMaterial.js';
|
|
4
|
+
/** Options for a batch sharing geometry and materials. */
|
|
5
|
+
export interface InstancedMeshOptions {
|
|
6
|
+
/** Required active instance count; a nonnegative integer. */
|
|
7
|
+
count: number;
|
|
8
|
+
/** Column-major local matrices, at least 16 * count floats. Default: count identity matrices. The array is retained. */
|
|
9
|
+
transforms?: Float32Array;
|
|
10
|
+
/** Linear RGB multipliers, at least 3 * count floats. Default undefined (white). The array is retained. */
|
|
11
|
+
colors?: Float32Array;
|
|
12
|
+
}
|
|
13
|
+
/** A batch of instances. World matrices are transform * transforms[i]. */
|
|
14
|
+
export default class InstancedMesh extends Mesh {
|
|
15
|
+
/** Local column-major matrices. Default: count identities. Call markTransformsUpdated after element edits. */
|
|
16
|
+
transforms: Float32Array;
|
|
17
|
+
/** Active prefix length. Default: constructor count; must fit transforms and colors. Changes are detected by engine.update. */
|
|
18
|
+
count: number;
|
|
19
|
+
/** Linear RGB multipliers, 3 floats per instance. Default undefined (white). Call markColorsUpdated after element edits. */
|
|
20
|
+
colors: Float32Array | undefined;
|
|
21
|
+
/** Advanced by any update notification. Default 0. */
|
|
22
|
+
get version(): number;
|
|
23
|
+
private _version;
|
|
24
|
+
private _transformVersion;
|
|
25
|
+
private _colorVersion;
|
|
26
|
+
constructor(geometry: Geometry, material: OpenPBRMaterial | OpenPBRMaterial[], options: InstancedMeshOptions);
|
|
27
|
+
/**
|
|
28
|
+
* Notify edits to both local matrices and colors for all active instances.
|
|
29
|
+
* Advances version once. Does not notify geometry or material edits. Returns this.
|
|
30
|
+
* Use the dedicated methods for single-property edits to avoid unnecessary work.
|
|
31
|
+
*/
|
|
32
|
+
markUpdated(): this;
|
|
33
|
+
/**
|
|
34
|
+
* Notify edited local matrices, avoiding copies of unchanged colors.
|
|
35
|
+
* Defaults: start 0, count all active matrices from start. Returns this.
|
|
36
|
+
*/
|
|
37
|
+
markTransformsUpdated(start?: number, count?: number): this;
|
|
38
|
+
/**
|
|
39
|
+
* Notify edited colors without copying matrices or updating BVHs.
|
|
40
|
+
* Defaults: start 0, count all active instances from start. Returns this.
|
|
41
|
+
*/
|
|
42
|
+
markColorsUpdated(start?: number, count?: number): this;
|
|
43
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import Mesh from './Mesh.js';
|
|
2
|
+
/** A batch of instances. World matrices are transform * transforms[i]. */
|
|
3
|
+
export default class InstancedMesh extends Mesh {
|
|
4
|
+
/** Local column-major matrices. Default: count identities. Call markTransformsUpdated after element edits. */
|
|
5
|
+
transforms;
|
|
6
|
+
/** Active prefix length. Default: constructor count; must fit transforms and colors. Changes are detected by engine.update. */
|
|
7
|
+
count;
|
|
8
|
+
/** Linear RGB multipliers, 3 floats per instance. Default undefined (white). Call markColorsUpdated after element edits. */
|
|
9
|
+
colors;
|
|
10
|
+
/** Advanced by any update notification. Default 0. */
|
|
11
|
+
get version() { return this._version; }
|
|
12
|
+
_version = 0;
|
|
13
|
+
_transformVersion = 0;
|
|
14
|
+
_colorVersion = 0;
|
|
15
|
+
/** @internal */
|
|
16
|
+
get transformsVersion() { return this._transformVersion; }
|
|
17
|
+
/** @internal */
|
|
18
|
+
get colorsVersion() { return this._colorVersion; }
|
|
19
|
+
constructor(geometry, material, options) {
|
|
20
|
+
super(geometry, material);
|
|
21
|
+
this.count = options.count;
|
|
22
|
+
this.transforms = options.transforms ?? new Float32Array(this.count * 16);
|
|
23
|
+
this.colors = options.colors;
|
|
24
|
+
this.validate();
|
|
25
|
+
if (!options.transforms)
|
|
26
|
+
for (let i = 0; i < this.count; i++) {
|
|
27
|
+
const offset = i * 16;
|
|
28
|
+
this.transforms[offset] = this.transforms[offset + 5] = this.transforms[offset + 10] = this.transforms[offset + 15] = 1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Notify edits to both local matrices and colors for all active instances.
|
|
33
|
+
* Advances version once. Does not notify geometry or material edits. Returns this.
|
|
34
|
+
* Use the dedicated methods for single-property edits to avoid unnecessary work.
|
|
35
|
+
*/
|
|
36
|
+
markUpdated() {
|
|
37
|
+
this.validate();
|
|
38
|
+
this._transformVersion++;
|
|
39
|
+
this._colorVersion++;
|
|
40
|
+
this._version++;
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Notify edited local matrices, avoiding copies of unchanged colors.
|
|
45
|
+
* Defaults: start 0, count all active matrices from start. Returns this.
|
|
46
|
+
*/
|
|
47
|
+
markTransformsUpdated(start = 0, count = this.count - start) {
|
|
48
|
+
this.validate();
|
|
49
|
+
if (!Number.isInteger(start) || !Number.isInteger(count) || start < 0 || count < 0 || start + count > this.count) {
|
|
50
|
+
throw new RangeError('Instance transform range must fit the active count.');
|
|
51
|
+
}
|
|
52
|
+
this._transformVersion++;
|
|
53
|
+
this._version++;
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Notify edited colors without copying matrices or updating BVHs.
|
|
58
|
+
* Defaults: start 0, count all active instances from start. Returns this.
|
|
59
|
+
*/
|
|
60
|
+
markColorsUpdated(start = 0, count = this.count - start) {
|
|
61
|
+
this.validate();
|
|
62
|
+
if (!Number.isInteger(start) || !Number.isInteger(count) || start < 0 || count < 0 || start + count > this.count) {
|
|
63
|
+
throw new RangeError('Instance color range must fit the active count.');
|
|
64
|
+
}
|
|
65
|
+
this._colorVersion++;
|
|
66
|
+
this._version++;
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
/** @internal */
|
|
70
|
+
validate() {
|
|
71
|
+
if (!Number.isInteger(this.count) || this.count < 0 || !(this.transforms instanceof Float32Array) || this.transforms.length < this.count * 16) {
|
|
72
|
+
throw new RangeError('InstancedMesh requires a nonnegative count and at least 16 * count Float32 transforms.');
|
|
73
|
+
}
|
|
74
|
+
if (this.colors !== undefined && (!(this.colors instanceof Float32Array) || this.colors.length < this.count * 3)) {
|
|
75
|
+
throw new RangeError('InstancedMesh colors must contain at least 3 * count Float32 values.');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=InstancedMesh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstancedMesh.js","sourceRoot":"","sources":["../../src/scene/InstancedMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import Mesh from './Mesh.js';\nimport Geometry from './Geometry.js';\nimport OpenPBRMaterial from './OpenPBRMaterial.js';\n\n/** Options for a batch sharing geometry and materials. */\nexport interface InstancedMeshOptions {\n /** Required active instance count; a nonnegative integer. */\n count: number;\n /** Column-major local matrices, at least 16 * count floats. Default: count identity matrices. The array is retained. */\n transforms?: Float32Array;\n /** Linear RGB multipliers, at least 3 * count floats. Default undefined (white). The array is retained. */\n colors?: Float32Array;\n}\n\n/** A batch of instances. World matrices are transform * transforms[i]. */\nexport default class InstancedMesh extends Mesh {\n /** Local column-major matrices. Default: count identities. Call markTransformsUpdated after element edits. */\n transforms: Float32Array;\n /** Active prefix length. Default: constructor count; must fit transforms and colors. Changes are detected by engine.update. */\n count: number;\n /** Linear RGB multipliers, 3 floats per instance. Default undefined (white). Call markColorsUpdated after element edits. */\n colors: Float32Array | undefined;\n /** Advanced by any update notification. Default 0. */\n get version(): number { return this._version; }\n private _version = 0;\n private _transformVersion = 0;\n private _colorVersion = 0;\n /** @internal */\n get transformsVersion(): number { return this._transformVersion; }\n /** @internal */\n get colorsVersion(): number { return this._colorVersion; }\n\n constructor(geometry: Geometry, material: OpenPBRMaterial | OpenPBRMaterial[], options: InstancedMeshOptions) {\n super(geometry, material);\n this.count = options.count;\n this.transforms = options.transforms ?? new Float32Array(this.count * 16);\n this.colors = options.colors;\n this.validate();\n if (!options.transforms) for (let i = 0; i < this.count; i++) {\n const offset = i * 16;\n this.transforms[offset] = this.transforms[offset + 5] = this.transforms[offset + 10] = this.transforms[offset + 15] = 1;\n }\n }\n /**\n * Notify edits to both local matrices and colors for all active instances.\n * Advances version once. Does not notify geometry or material edits. Returns this.\n * Use the dedicated methods for single-property edits to avoid unnecessary work.\n */\n markUpdated(): this {\n this.validate();\n this._transformVersion++; this._colorVersion++; this._version++;\n return this;\n }\n /**\n * Notify edited local matrices, avoiding copies of unchanged colors.\n * Defaults: start 0, count all active matrices from start. Returns this.\n */\n markTransformsUpdated(start = 0, count = this.count - start): this {\n this.validate();\n if (!Number.isInteger(start) || !Number.isInteger(count) || start < 0 || count < 0 || start + count > this.count) {\n throw new RangeError('Instance transform range must fit the active count.');\n }\n this._transformVersion++; this._version++;\n return this;\n }\n /**\n * Notify edited colors without copying matrices or updating BVHs.\n * Defaults: start 0, count all active instances from start. Returns this.\n */\n markColorsUpdated(start = 0, count = this.count - start): this {\n this.validate();\n if (!Number.isInteger(start) || !Number.isInteger(count) || start < 0 || count < 0 || start + count > this.count) {\n throw new RangeError('Instance color range must fit the active count.');\n }\n this._colorVersion++; this._version++;\n return this;\n }\n /** @internal */\n validate() {\n if (!Number.isInteger(this.count) || this.count < 0 || !(this.transforms instanceof Float32Array) || this.transforms.length < this.count * 16) {\n throw new RangeError('InstancedMesh requires a nonnegative count and at least 16 * count Float32 transforms.');\n }\n if (this.colors !== undefined && (!(this.colors instanceof Float32Array) || this.colors.length < this.count * 3)) {\n throw new RangeError('InstancedMesh colors must contain at least 3 * count Float32 values.');\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Geometry from './Geometry.js';
|
|
2
|
+
import SceneNode from './SceneNode.js';
|
|
3
|
+
import OpenPBRMaterial from './OpenPBRMaterial.js';
|
|
4
|
+
/**
|
|
5
|
+
* A geometry rendered with one or more materials. With several materials,
|
|
6
|
+
* `geometry.materialIndex` selects the material of each triangle.
|
|
7
|
+
*/
|
|
8
|
+
export default class Mesh extends SceneNode {
|
|
9
|
+
/** Materials supplied to the constructor, indexed by per-vertex materialIndex. */
|
|
10
|
+
materials: OpenPBRMaterial[];
|
|
11
|
+
/** Indexed triangle geometry supplied to the constructor; no default. */
|
|
12
|
+
geometry: Geometry;
|
|
13
|
+
constructor(geometry: Geometry, material: OpenPBRMaterial[] | OpenPBRMaterial);
|
|
14
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import SceneNode from './SceneNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* A geometry rendered with one or more materials. With several materials,
|
|
4
|
+
* `geometry.materialIndex` selects the material of each triangle.
|
|
5
|
+
*/
|
|
6
|
+
export default class Mesh extends SceneNode {
|
|
7
|
+
/** Materials supplied to the constructor, indexed by per-vertex materialIndex. */
|
|
8
|
+
materials;
|
|
9
|
+
/** Indexed triangle geometry supplied to the constructor; no default. */
|
|
10
|
+
geometry;
|
|
11
|
+
constructor(geometry, material) {
|
|
12
|
+
super();
|
|
13
|
+
this.geometry = geometry;
|
|
14
|
+
this.materials = Array.isArray(material) ? material : [material];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=Mesh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Mesh.js","sourceRoot":"","sources":["../../src/scene/Mesh.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAGvC;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,SAAS;IACzC,kFAAkF;IAClF,SAAS,CAAoB;IAC7B,yEAAyE;IACzE,QAAQ,CAAW;IAEnB,YACE,QAAkB,EAClB,QAA6C;QAE7C,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnE,CAAC;CAEF","sourcesContent":["import Geometry from './Geometry.js';\nimport SceneNode from './SceneNode.js';\nimport OpenPBRMaterial from './OpenPBRMaterial.js';\n\n/**\n * A geometry rendered with one or more materials. With several materials,\n * `geometry.materialIndex` selects the material of each triangle.\n */\nexport default class Mesh extends SceneNode {\n /** Materials supplied to the constructor, indexed by per-vertex materialIndex. */\n materials: OpenPBRMaterial[];\n /** Indexed triangle geometry supplied to the constructor; no default. */\n geometry: Geometry;\n\n constructor(\n geometry: Geometry,\n material: OpenPBRMaterial[] | OpenPBRMaterial\n ) {\n super();\n\n this.geometry = geometry;\n this.materials = Array.isArray(material) ? material : [material];\n }\n\n}\n"]}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import type { Vec2 } from '../types.js';
|
|
2
|
+
import { ColorRGB } from '../types.js';
|
|
3
|
+
import type Texture from './Texture.js';
|
|
4
|
+
import type { ThinFilmMapChannel } from './thinFilmParameters.js';
|
|
5
|
+
export type UVProjection = 'none' | 'triplanar' | 'spherical' | 'cylindrical';
|
|
6
|
+
export type MaterialAlphaMode = 'auto' | 'opaque' | 'mask' | 'blend';
|
|
7
|
+
export type { MaterialTextureName } from './materialTextureNames.js';
|
|
8
|
+
/**
|
|
9
|
+
* OpenPBR 1.1 surface material.
|
|
10
|
+
*
|
|
11
|
+
* Property names are camelCase OpenPBR inputs plus documented compatibility names
|
|
12
|
+
* (https://academysoftwarefoundation.github.io/OpenPBR/). Colors are linear
|
|
13
|
+
* RGB. Length-valued inputs (`transmissionDepth`, `subsurfaceRadius`) use
|
|
14
|
+
* scene units; `thinFilmThickness` is in micrometres as in OpenPBR.
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* const gold = new OpenPBRMaterial({
|
|
18
|
+
* baseColor: [1.0, 0.78, 0.34], baseMetalness: 1, specularRoughness: 0.2
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* Edit parameters in place; the next `engine.update()` detects the changes.
|
|
23
|
+
*/
|
|
24
|
+
export default class OpenPBRMaterial {
|
|
25
|
+
/** Creates a material. Omitted properties use their documented defaults. */
|
|
26
|
+
constructor(params?: OpenPBRMaterialParams);
|
|
27
|
+
/** Multiplier of diffuse reflection and metallic normal-incidence color; does not scale dielectric specular, transmission or subsurface. Default `1`. */
|
|
28
|
+
baseWeight: number;
|
|
29
|
+
/** Diffuse/metal color. Default `[0.8, 0.8, 0.8]`. */
|
|
30
|
+
baseColor: ColorRGB;
|
|
31
|
+
/** Oren-Nayar style roughness of the diffuse lobe. Default `0`. */
|
|
32
|
+
baseDiffuseRoughness: number;
|
|
33
|
+
/** `0` dielectric, `1` metal. Default `0`. */
|
|
34
|
+
baseMetalness: number;
|
|
35
|
+
/** Dielectric specular strength (via IOR) and overall metallic Fresnel multiplier. Default `1`. */
|
|
36
|
+
specularWeight: number;
|
|
37
|
+
/** Dielectric specular tint and metallic F82 near-grazing tint. Default `[1, 1, 1]`. */
|
|
38
|
+
specularColor: ColorRGB;
|
|
39
|
+
/** Microfacet roughness, `0` mirror to `1` rough; retains source perceptual roughness in `gltf` anisotropy mode. Default `0.3`. */
|
|
40
|
+
specularRoughness: number;
|
|
41
|
+
/** Index of refraction. Default `1.5`. */
|
|
42
|
+
specularIor: number;
|
|
43
|
+
/**
|
|
44
|
+
* GGX anisotropy strength, 0 to 1 (requires tangents); native OpenPBR or source glTF strength according to specularAnisotropyModel. Default `0`.
|
|
45
|
+
* @deprecated Use specularRoughnessAnisotropy.
|
|
46
|
+
*/
|
|
47
|
+
specularAnisotropy: number;
|
|
48
|
+
/** `1` makes the dielectric base fully transmissive (glass). Default `0`. */
|
|
49
|
+
transmissionWeight: number;
|
|
50
|
+
/** Transmission tint, or the medium color at `transmissionDepth`. Default `[1, 1, 1]`. */
|
|
51
|
+
transmissionColor: ColorRGB;
|
|
52
|
+
/** Depth at which `transmissionColor` is reached; `0` tints at the surface. Default `0`. */
|
|
53
|
+
transmissionDepth: number;
|
|
54
|
+
/** Volume scattering color of the transmissive medium. Default `[0, 0, 0]`. */
|
|
55
|
+
transmissionScatter: ColorRGB;
|
|
56
|
+
/** Henyey-Greenstein anisotropy of the medium, -1 to 1. Default `0`. */
|
|
57
|
+
transmissionScatterAnisotropy: number;
|
|
58
|
+
/** Dispersion strength; `> 0` enables spectral rendering. Default `0`. */
|
|
59
|
+
transmissionDispersionScale: number;
|
|
60
|
+
/** Abbe number controlling dispersion. Default `20`. */
|
|
61
|
+
transmissionDispersionAbbeNumber: number;
|
|
62
|
+
/** Subsurface scattering weight. Default `0`. */
|
|
63
|
+
subsurfaceWeight: number;
|
|
64
|
+
/** Subsurface color. Default `[0.8, 0.8, 0.8]`. */
|
|
65
|
+
subsurfaceColor: ColorRGB;
|
|
66
|
+
/** Mean free path in scene units. Default `1`. */
|
|
67
|
+
subsurfaceRadius: number;
|
|
68
|
+
/** Per-channel multiplier of `subsurfaceRadius`. Default `[1, 0.5, 0.25]`. */
|
|
69
|
+
subsurfaceRadiusScale: ColorRGB;
|
|
70
|
+
/**
|
|
71
|
+
* Scattering anisotropy, -1 to 1. Default `0`.
|
|
72
|
+
* @deprecated Use subsurfaceScatterAnisotropy.
|
|
73
|
+
*/
|
|
74
|
+
subsurfaceAnisotropy: number;
|
|
75
|
+
/** Fuzz (sheen) layer weight. Default `0`. */
|
|
76
|
+
fuzzWeight: number;
|
|
77
|
+
/** Fuzz reflection color; substrate attenuation uses white fuzz albedo. Default `[1, 1, 1]`. */
|
|
78
|
+
fuzzColor: ColorRGB;
|
|
79
|
+
/** Fuzz roughness; imported from Three.js `sheenRoughness`. Default `0.5`. */
|
|
80
|
+
fuzzRoughness: number;
|
|
81
|
+
/** Clear coat weight. Default `0`. */
|
|
82
|
+
coatWeight: number;
|
|
83
|
+
/** Squared coat transmittance at normal incidence; colors the base and emission, not coat reflection. Default `[1, 1, 1]`. */
|
|
84
|
+
coatColor: ColorRGB;
|
|
85
|
+
/** Coat roughness. Default `0`. */
|
|
86
|
+
coatRoughness: number;
|
|
87
|
+
/**
|
|
88
|
+
* OpenPBR GGX coat anisotropy, 0 to 1; uses the base geometry tangent. Default `0`.
|
|
89
|
+
* @deprecated Use coatRoughnessAnisotropy.
|
|
90
|
+
*/
|
|
91
|
+
coatAnisotropy: number;
|
|
92
|
+
/** Coat index of refraction. Default `1.6`. */
|
|
93
|
+
coatIor: number;
|
|
94
|
+
/** Internal-reflection darkening: 0 compensates darkening, 1 is physical; absorption remains at 0. Default `1`. */
|
|
95
|
+
coatDarkening: number;
|
|
96
|
+
/** Thin-film interference weight (iridescence). Default `0`. */
|
|
97
|
+
thinFilmWeight: number;
|
|
98
|
+
/** Film thickness in micrometres; maximum endpoint when thinFilmMap is present. Default `0.5`. */
|
|
99
|
+
thinFilmThickness: number;
|
|
100
|
+
/** Film index of refraction. Default `1.4`. */
|
|
101
|
+
thinFilmIor: number;
|
|
102
|
+
/** Thickness at a thinFilmMap sample of zero, in micrometres; ignored without a map. May exceed thinFilmThickness. Default `0`. */
|
|
103
|
+
thinFilmThicknessMinimum: number;
|
|
104
|
+
/** Linear channel sampled by thinFilmMap. Default `r`. */
|
|
105
|
+
thinFilmMapChannel: ThinFilmMapChannel;
|
|
106
|
+
/** Emission color. Default `[1, 1, 1]`. */
|
|
107
|
+
emissionColor: ColorRGB;
|
|
108
|
+
/** Emitted radiance scale; `0` disables emission. Default `0`. */
|
|
109
|
+
emissionLuminance: number;
|
|
110
|
+
/**
|
|
111
|
+
* Coverage, `1` opaque. See `alphaMode`. Default `1`.
|
|
112
|
+
* @deprecated Use geometryOpacity.
|
|
113
|
+
*/
|
|
114
|
+
opacity: number;
|
|
115
|
+
/**
|
|
116
|
+
* Treat the surface as an infinitely thin shell (leaves, paper). Default `false`.
|
|
117
|
+
* @deprecated Use geometryThinWalled.
|
|
118
|
+
*/
|
|
119
|
+
thinWalled: boolean;
|
|
120
|
+
/** Disables geometric back-face culling for this material. Default `false`. */
|
|
121
|
+
doubleSided: boolean;
|
|
122
|
+
/** Base color texture, multiplied with `baseColor` using Texture color encoding. Default `undefined`. */
|
|
123
|
+
map?: Texture;
|
|
124
|
+
/** Standalone opacity texture sampled from its green channel, matching Three.js. Default `undefined`. */
|
|
125
|
+
alphaMap?: Texture;
|
|
126
|
+
/**
|
|
127
|
+
* Coverage for surface and shadow rays: `opaque` ignores alpha inputs,
|
|
128
|
+
* `mask` uses binary alpha testing, `blend` retains fractional coverage.
|
|
129
|
+
* `auto` derives the mode from the alpha inputs. Default `auto`.
|
|
130
|
+
*/
|
|
131
|
+
alphaMode: MaterialAlphaMode;
|
|
132
|
+
/** Alpha-test threshold for `mask` mode; equality is fully covered. Default `0`. */
|
|
133
|
+
alphaCutoff: number;
|
|
134
|
+
/** Emission texture multiplied with `emissionColor`. Default `undefined`. */
|
|
135
|
+
emissiveMap?: Texture;
|
|
136
|
+
/** Tangent-space normal map. */
|
|
137
|
+
normalMap?: Texture;
|
|
138
|
+
/** Normal map strength per axis. Default `[1, 1]`. */
|
|
139
|
+
normalScale: Vec2;
|
|
140
|
+
/** glTF-compatible B=metalness, G=specular roughness texture. Default `undefined`. */
|
|
141
|
+
metallicRoughnessMap?: Texture;
|
|
142
|
+
/** Standalone roughness texture sampled from its green channel. Default `undefined`. */
|
|
143
|
+
roughnessMap?: Texture;
|
|
144
|
+
/** Standalone metalness texture sampled from its blue channel. Default `undefined`. */
|
|
145
|
+
metalnessMap?: Texture;
|
|
146
|
+
/** Multiplies transmission weight using the texture's red channel. Default `undefined`. */
|
|
147
|
+
transmissionMap?: Texture;
|
|
148
|
+
/** Linear thickness-range texture; R and zero minimum preserve multiplication semantics. Default `undefined`. */
|
|
149
|
+
thinFilmMap?: Texture;
|
|
150
|
+
/** Multiplies coatWeight by the linear red channel. Default `undefined`. */
|
|
151
|
+
coatWeightMap?: Texture;
|
|
152
|
+
/** Multiplies coatRoughness by the linear green channel. Default `undefined`. */
|
|
153
|
+
coatRoughnessMap?: Texture;
|
|
154
|
+
/** Multiplies fuzzColor by RGB channels using Texture color encoding. Default `undefined`. */
|
|
155
|
+
fuzzColorMap?: Texture;
|
|
156
|
+
/** Multiplies fuzzRoughness by the linear alpha channel. Default `undefined`. */
|
|
157
|
+
fuzzRoughnessMap?: Texture;
|
|
158
|
+
/** Multiplies specularWeight by the linear alpha channel. Default `undefined`. */
|
|
159
|
+
specularWeightMap?: Texture;
|
|
160
|
+
/** Multiplies specularColor by RGB channels using Texture color encoding. Default `undefined`. */
|
|
161
|
+
specularColorMap?: Texture;
|
|
162
|
+
/** Source convention for base specular anisotropy. `gltf` converts textured roughness and strength before coat roughening; `openpbr` uses native parameters. Default `openpbr`. */
|
|
163
|
+
specularAnisotropyModel: 'openpbr' | 'gltf';
|
|
164
|
+
/** Linear RG tangent direction and B strength multiplier for the base specular layer. Default `undefined`. */
|
|
165
|
+
anisotropyMap?: Texture;
|
|
166
|
+
/** Independent tangent-space coat normal in linear RGB. Without a map, coat shares the existing shading normal. Default `undefined`. */
|
|
167
|
+
coatNormalMap?: Texture;
|
|
168
|
+
/** XY strength of coatNormalMap; independent of normalScale. Default `[1, 1]`. */
|
|
169
|
+
coatNormalScale: Vec2;
|
|
170
|
+
/** Base direction rotation in radians, counter-clockwise in tangent/bitangent space after RG decoding. Default `0`. */
|
|
171
|
+
specularAnisotropyRotation: number;
|
|
172
|
+
/** Coat direction rotation in radians relative to the geometry tangent. Default `0`. */
|
|
173
|
+
coatAnisotropyRotation: number;
|
|
174
|
+
/** GGX roughness anisotropy in [0, 1]; native OpenPBR or source glTF strength according to specularAnisotropyModel. Requires tangents. Default `0`. */
|
|
175
|
+
get specularRoughnessAnisotropy(): number;
|
|
176
|
+
set specularRoughnessAnisotropy(value: number);
|
|
177
|
+
/** OpenPBR coat GGX roughness anisotropy in [0, 1]. Default `0`. */
|
|
178
|
+
get coatRoughnessAnisotropy(): number;
|
|
179
|
+
set coatRoughnessAnisotropy(value: number);
|
|
180
|
+
/** Subsurface scattering anisotropy in [-1, 1]. Default `0`. */
|
|
181
|
+
get subsurfaceScatterAnisotropy(): number;
|
|
182
|
+
set subsurfaceScatterAnisotropy(value: number);
|
|
183
|
+
/** Surface coverage; alphaMode controls testing and blending. Default `1`. */
|
|
184
|
+
get geometryOpacity(): number;
|
|
185
|
+
set geometryOpacity(value: number);
|
|
186
|
+
/** Treat the surface as an infinitely thin shell. Default `false`. */
|
|
187
|
+
get geometryThinWalled(): boolean;
|
|
188
|
+
set geometryThinWalled(value: boolean);
|
|
189
|
+
/**
|
|
190
|
+
* Invisible ground that only receives shadows, composited over the
|
|
191
|
+
* background. Default `false`.
|
|
192
|
+
*/
|
|
193
|
+
shadowCatcher: boolean;
|
|
194
|
+
/** Displays emission without scattering or illuminating other surfaces. Default `false`. */
|
|
195
|
+
unlit: boolean;
|
|
196
|
+
/** Radius of rounded-edge shading (shader bevel) in scene units. `0` disables it. Default `0`. */
|
|
197
|
+
bevelSize: number;
|
|
198
|
+
/** How map alpha is used: ignored, opacity or transmission. Default `opaque`. */
|
|
199
|
+
mapAlphaUsage: 'opaque' | 'alpha' | 'transmission';
|
|
200
|
+
/** Procedural UV projection for textures without (good) UVs. Default `none`. */
|
|
201
|
+
uvProjection: UVProjection;
|
|
202
|
+
/** UV scale used with `uvProjection`. Default `[1, 1]`. */
|
|
203
|
+
uvProjectionScale: Vec2;
|
|
204
|
+
/** Height texture (red channel) for displacement. Default `undefined`. */
|
|
205
|
+
displacementMap?: Texture;
|
|
206
|
+
/** Procedural UV projection for the displacement map. Default `none`. */
|
|
207
|
+
displacementUvProjection: UVProjection;
|
|
208
|
+
/** UV scale used with `displacementUvProjection`. Default `1`. */
|
|
209
|
+
displacementUvProjectionScale: number;
|
|
210
|
+
/** Height multiplier in mesh-local coordinate units. Default `0.1`. */
|
|
211
|
+
displacementScale: number;
|
|
212
|
+
/** Ray-marching step for projective displacement. Default `0.01`. */
|
|
213
|
+
displacementStepSize: number;
|
|
214
|
+
}
|
|
215
|
+
export declare const materialAlphaModeConstants: {
|
|
216
|
+
readonly opaque: 0;
|
|
217
|
+
readonly mask: 1;
|
|
218
|
+
readonly blend: 2;
|
|
219
|
+
};
|
|
220
|
+
export type ResolvedMaterialAlphaMode = Exclude<MaterialAlphaMode, 'auto'>;
|
|
221
|
+
export declare function resolveMaterialAlphaMode(material: OpenPBRMaterial): ResolvedMaterialAlphaMode;
|
|
222
|
+
export { materialKeys, materialTextureKeys, materialGeometryKeys, materialParamKeys, getMaterialHashKey, resetMaterialTextureId } from './openPbrSchema.js';
|
|
223
|
+
/** Optional material properties; defaults are documented on OpenPBRMaterial. */
|
|
224
|
+
export type OpenPBRMaterialParams = Partial<OpenPBRMaterial>;
|