@meimu/mutracer 0.0.0-stage → 0.1.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/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 +195 -2
- package/THIRD_PARTY_NOTICES.md +160 -0
- package/dist/assets/bvh.worker.js +1 -0
- package/dist/mutracer.umd.js +14352 -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 +144 -0
- package/docs/sampling.md +40 -0
- package/docs/threejs.md +273 -0
- package/docs/todo.md +61 -0
- package/docs/updates.md +208 -0
- package/lib/Display.d.ts +72 -0
- package/lib/Display.js +121 -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 +256 -0
- package/lib/Render.js +671 -0
- package/lib/Render.js.map +1 -0
- package/lib/RenderLoop.d.ts +76 -0
- package/lib/RenderLoop.js +204 -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 +1446 -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 +121 -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 +619 -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 +923 -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 +100 -0
- package/lib/util/fromTHREE.js +1063 -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,219 @@
|
|
|
1
|
+
import { MATERIAL_TEXTURE_NAMES } from '../scene/materialTextureNames.js';
|
|
2
|
+
export { MATERIAL_TEXTURE_NAMES };
|
|
3
|
+
import { MATERIAL_LAYOUT, materialLayoutFields } from './materialLayout.js';
|
|
4
|
+
// Internal slots only. Order is the legacy atlas/index contract. Color spaces
|
|
5
|
+
// describe decoding at the sample site; textures share the same stored atlas.
|
|
6
|
+
const slots = [
|
|
7
|
+
{
|
|
8
|
+
property: 'map', index: 'diffuseMapIndex',
|
|
9
|
+
target: 'baseColor/alpha/transmissionWeight', channel: 'rgb/a',
|
|
10
|
+
colorSpace: 'srgb', operation: 'custom',
|
|
11
|
+
define: 'NUM_DIFFUSE_MAPS', feature: 'USE_DIFFUSE_MAPS', featureBit: 2 ** 1,
|
|
12
|
+
sampling: 'manual'
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
property: 'alphaMap', index: 'alphaMapIndex',
|
|
16
|
+
target: 'alpha', channel: 'g',
|
|
17
|
+
colorSpace: 'linear', operation: 'multiply',
|
|
18
|
+
define: 'NUM_ALPHA_MAPS', feature: 'USE_ALPHA_MAPS', featureBit: 2 ** 2,
|
|
19
|
+
sampling: 'multiply'
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
property: 'normalMap', index: 'normalMapIndex',
|
|
23
|
+
target: 'normal', channel: 'rgb',
|
|
24
|
+
colorSpace: 'linear', operation: 'custom',
|
|
25
|
+
define: 'NUM_NORMAL_MAPS', feature: 'USE_NORMAL_MAPS', featureBit: 2 ** 9,
|
|
26
|
+
sampling: 'manual'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
property: 'emissiveMap', index: 'emissiveMapIndex',
|
|
30
|
+
target: 'emission', channel: 'rgb',
|
|
31
|
+
colorSpace: 'srgb', operation: 'custom',
|
|
32
|
+
define: 'NUM_EMISSIVE_MAPS', feature: 'USE_EMISSIVE_MAPS', featureBit: 2 ** 7,
|
|
33
|
+
sampling: 'manual'
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
property: 'metallicRoughnessMap', index: 'metallicRoughnessMapIndex',
|
|
37
|
+
target: 'baseMetalness/specularRoughness', channel: 'b/g',
|
|
38
|
+
colorSpace: 'linear', operation: 'custom',
|
|
39
|
+
define: 'NUM_METALLIC_ROUGHNESS_MAPS', feature: 'USE_METALLIC_ROUGHNESS_MAPS', featureBit: 2 ** 3,
|
|
40
|
+
sampling: 'manual'
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
property: 'roughnessMap', index: 'roughnessMapIndex',
|
|
44
|
+
target: 'specularRoughness', channel: 'g',
|
|
45
|
+
colorSpace: 'linear', operation: 'multiply',
|
|
46
|
+
define: 'NUM_ROUGHNESS_MAPS', feature: 'USE_ROUGHNESS_MAPS', featureBit: 2 ** 4,
|
|
47
|
+
sampling: 'multiply'
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
property: 'metalnessMap', index: 'metalnessMapIndex',
|
|
51
|
+
target: 'baseMetalness', channel: 'b',
|
|
52
|
+
colorSpace: 'linear', operation: 'multiply',
|
|
53
|
+
define: 'NUM_METALNESS_MAPS', feature: 'USE_METALNESS_MAPS', featureBit: 2 ** 5,
|
|
54
|
+
sampling: 'multiply'
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
property: 'transmissionMap', index: 'transmissionMapIndex',
|
|
58
|
+
target: 'transmissionWeight', channel: 'r',
|
|
59
|
+
colorSpace: 'linear', operation: 'multiply',
|
|
60
|
+
define: 'NUM_TRANSMISSION_MAPS', feature: 'USE_TRANSMISSION_MAPS', featureBit: 2 ** 6,
|
|
61
|
+
sampling: 'multiply'
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
property: 'thinFilmMap', index: 'thinFilmMapIndex',
|
|
65
|
+
target: 'thinFilmThickness', channel: 'per-material',
|
|
66
|
+
colorSpace: 'linear', operation: 'custom',
|
|
67
|
+
define: 'NUM_THIN_FILM_MAPS', feature: 'USE_THIN_FILM_MAPS', featureBit: 2 ** 8,
|
|
68
|
+
sampling: 'manual'
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
property: 'displacementMap', index: 'displacementMapIndex',
|
|
72
|
+
target: 'displacement', channel: 'r',
|
|
73
|
+
colorSpace: 'linear', operation: 'custom',
|
|
74
|
+
define: null, feature: null, featureBit: 0,
|
|
75
|
+
sampling: 'manual'
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
property: 'coatWeightMap', index: 'coatWeightMapIndex',
|
|
79
|
+
target: 'coatWeight', channel: 'r',
|
|
80
|
+
colorSpace: 'linear', operation: 'multiply',
|
|
81
|
+
define: 'NUM_COAT_WEIGHT_MAPS', feature: 'USE_COAT_WEIGHT_MAPS', featureBit: 2 ** 15,
|
|
82
|
+
sampling: 'multiply'
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
property: 'coatRoughnessMap', index: 'coatRoughnessMapIndex',
|
|
86
|
+
target: 'coatRoughness', channel: 'g',
|
|
87
|
+
colorSpace: 'linear', operation: 'multiply',
|
|
88
|
+
define: 'NUM_COAT_ROUGHNESS_MAPS', feature: 'USE_COAT_ROUGHNESS_MAPS', featureBit: 2 ** 16,
|
|
89
|
+
sampling: 'multiply'
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
property: 'fuzzColorMap', index: 'fuzzColorMapIndex',
|
|
93
|
+
target: 'fuzzColor', channel: 'rgb',
|
|
94
|
+
colorSpace: 'srgb', operation: 'multiply',
|
|
95
|
+
define: 'NUM_FUZZ_COLOR_MAPS', feature: 'USE_FUZZ_COLOR_MAPS', featureBit: 2 ** 18,
|
|
96
|
+
sampling: 'multiply'
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
property: 'fuzzRoughnessMap', index: 'fuzzRoughnessMapIndex',
|
|
100
|
+
target: 'fuzzRoughness', channel: 'a',
|
|
101
|
+
colorSpace: 'linear', operation: 'multiply',
|
|
102
|
+
define: 'NUM_FUZZ_ROUGHNESS_MAPS', feature: 'USE_FUZZ_ROUGHNESS_MAPS', featureBit: 2 ** 19,
|
|
103
|
+
sampling: 'multiply'
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
property: 'specularWeightMap', index: 'specularWeightMapIndex',
|
|
107
|
+
target: 'specularWeight', channel: 'a',
|
|
108
|
+
colorSpace: 'linear', operation: 'multiply',
|
|
109
|
+
define: 'NUM_SPECULAR_WEIGHT_MAPS', feature: 'USE_SPECULAR_WEIGHT_MAPS', featureBit: 2 ** 20,
|
|
110
|
+
sampling: 'multiply'
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
property: 'specularColorMap', index: 'specularColorMapIndex',
|
|
114
|
+
target: 'specularColor', channel: 'rgb',
|
|
115
|
+
colorSpace: 'srgb', operation: 'multiply',
|
|
116
|
+
define: 'NUM_SPECULAR_COLOR_MAPS', feature: 'USE_SPECULAR_COLOR_MAPS', featureBit: 2 ** 21,
|
|
117
|
+
sampling: 'multiply'
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
property: 'anisotropyMap', index: 'anisotropyMapIndex',
|
|
121
|
+
target: 'specularAnisotropy/direction', channel: 'rg/b',
|
|
122
|
+
colorSpace: 'linear', operation: 'custom',
|
|
123
|
+
define: 'NUM_ANISOTROPY_MAPS', feature: 'USE_ANISOTROPY_MAPS', featureBit: 2 ** 22,
|
|
124
|
+
sampling: 'manual'
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
property: 'coatNormalMap', index: 'coatNormalMapIndex',
|
|
128
|
+
target: 'coatNormal', channel: 'rgb',
|
|
129
|
+
colorSpace: 'linear', operation: 'custom',
|
|
130
|
+
define: 'NUM_COAT_NORMAL_MAPS', feature: 'USE_COAT_NORMAL_MAPS', featureBit: 2 ** 17,
|
|
131
|
+
sampling: 'manual'
|
|
132
|
+
},
|
|
133
|
+
];
|
|
134
|
+
const textureNamesMatch = true;
|
|
135
|
+
void textureNamesMatch;
|
|
136
|
+
export const MATERIAL_TEXTURE_SLOTS = slots.map(slot => {
|
|
137
|
+
const field = materialLayoutFields().find(field => field.source === slot.index);
|
|
138
|
+
if (!field)
|
|
139
|
+
throw new Error(`Missing packed texture index: ${slot.property}`);
|
|
140
|
+
return { ...slot, packed: {
|
|
141
|
+
row: field.row, component: field.component, wgslField: field.name,
|
|
142
|
+
glslRow: `MAT_ROW_${MATERIAL_LAYOUT[field.row].name}`,
|
|
143
|
+
glslComponent: 'xyzw'[field.component]
|
|
144
|
+
} };
|
|
145
|
+
});
|
|
146
|
+
export const MATERIAL_TEXTURE_FEATURE_BITS = Object.fromEntries(slots.flatMap(slot => slot.feature
|
|
147
|
+
? [[slot.feature, slot.featureBit]] : []));
|
|
148
|
+
export const MATERIAL_TEXTURE_DEFINES = slots.flatMap(slot => slot.define ? [slot.define] : []);
|
|
149
|
+
export function materialTextureFeatures(defines) {
|
|
150
|
+
return Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.feature && slot.define
|
|
151
|
+
? [[slot.feature, +defines[slot.define] > 0]] : []));
|
|
152
|
+
}
|
|
153
|
+
// Call at each original sample site: alpha resolution and combined maps must
|
|
154
|
+
// keep their existing order. The scalar factors use raw linear channels; film ranges resolve explicitly.
|
|
155
|
+
export function simpleTextureSample(property, backend) {
|
|
156
|
+
const slot = MATERIAL_TEXTURE_SLOTS.find(slot => slot.property === property);
|
|
157
|
+
if (!slot || slot.sampling !== 'multiply')
|
|
158
|
+
throw new Error(`Handwritten texture slot: ${property}`);
|
|
159
|
+
const index = slot.index;
|
|
160
|
+
const sample = (expression) => slot.colorSpace === 'srgb' ? `decodeMapColor(${index}, ${expression})` : expression;
|
|
161
|
+
if (backend === 'wgsl') {
|
|
162
|
+
return `
|
|
163
|
+
if (${slot.feature}) {
|
|
164
|
+
let ${index} = i32(matData.${slot.packed.wgslField});
|
|
165
|
+
if (${index} >= 0) {
|
|
166
|
+
(*ma).${slot.target} *= ${sample(`sampleMap(
|
|
167
|
+
${index}, getMapUvSet(${index}, uv, uv1)
|
|
168
|
+
).${slot.channel}`)};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
`;
|
|
172
|
+
}
|
|
173
|
+
return `
|
|
174
|
+
#ifdef ${slot.define}
|
|
175
|
+
int ${index} = int(fetchMatData(i + ${slot.packed.glslRow}).${slot.packed.glslComponent});
|
|
176
|
+
if (${index} >= 0) {
|
|
177
|
+
mat.${slot.target} *= ${sample(`sampleMap(
|
|
178
|
+
${index}, getMapUvSet(${index}, uv, uv1)
|
|
179
|
+
).${slot.channel}`)};
|
|
180
|
+
}
|
|
181
|
+
#endif
|
|
182
|
+
`;
|
|
183
|
+
}
|
|
184
|
+
// Multi-parameter slots retain explicit resolution and their original sample site.
|
|
185
|
+
export function thinFilmTextureSample(backend) {
|
|
186
|
+
const slot = MATERIAL_TEXTURE_SLOTS.find(slot => slot.property === 'thinFilmMap');
|
|
187
|
+
if (backend === 'wgsl')
|
|
188
|
+
return `
|
|
189
|
+
if (${slot.feature}) {
|
|
190
|
+
let thinFilmMapIndex = i32(matData.${slot.packed.wgslField});
|
|
191
|
+
if (thinFilmMapIndex >= 0) {
|
|
192
|
+
let filmTexel = sampleMap(thinFilmMapIndex, getMapUvSet(thinFilmMapIndex, uv, uv1));
|
|
193
|
+
// Preserve the legacy nm conversion followed by R multiplication exactly.
|
|
194
|
+
if (matData.thinFilmThicknessMinimum == 0.0 && matData.thinFilmMapChannel == 0.0) {
|
|
195
|
+
(*ma).thinFilmThickness *= filmTexel.r;
|
|
196
|
+
} else {
|
|
197
|
+
(*ma).thinFilmThickness = mix(matData.thinFilmThicknessMinimum,
|
|
198
|
+
matData.thinFilmThickness, filmTexel[i32(matData.thinFilmMapChannel)]) * 1000.0;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
`;
|
|
203
|
+
return `
|
|
204
|
+
#ifdef ${slot.define}
|
|
205
|
+
int thinFilmMapIndex = int(fetchMatData(i + ${slot.packed.glslRow}).${slot.packed.glslComponent});
|
|
206
|
+
if (thinFilmMapIndex >= 0) {
|
|
207
|
+
vec4 filmTexel = sampleMap(thinFilmMapIndex, getMapUvSet(thinFilmMapIndex, uv, uv1));
|
|
208
|
+
vec4 filmTextureParams = fetchMatData(i + MAT_ROW_FILM_TEXTURE);
|
|
209
|
+
if (filmTextureParams.z == 0.0 && filmTextureParams.w == 0.0) {
|
|
210
|
+
mat.thinFilmThickness *= filmTexel.r;
|
|
211
|
+
} else {
|
|
212
|
+
mat.thinFilmThickness = mix(filmTextureParams.z, misc.b,
|
|
213
|
+
filmTexel[int(filmTextureParams.w)]) * 1000.0;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
#endif
|
|
217
|
+
`;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=materialTextureSlots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materialTextureSlots.js","sourceRoot":"","sources":["../../src/renderer/materialTextureSlots.ts"],"names":[],"mappings":"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","sourcesContent":["import { MATERIAL_TEXTURE_NAMES, type MaterialTextureName } from '../scene/materialTextureNames.js';\nexport { MATERIAL_TEXTURE_NAMES };\nexport type { MaterialTextureName };\nimport { MATERIAL_LAYOUT, materialLayoutFields } from './materialLayout.js';\n\n// Internal slots only. Order is the legacy atlas/index contract. Color spaces\n// describe decoding at the sample site; textures share the same stored atlas.\nconst slots = [\n {\n property: 'map', index: 'diffuseMapIndex',\n target: 'baseColor/alpha/transmissionWeight', channel: 'rgb/a',\n colorSpace: 'srgb', operation: 'custom',\n define: 'NUM_DIFFUSE_MAPS', feature: 'USE_DIFFUSE_MAPS', featureBit: 2 ** 1,\n sampling: 'manual'\n },\n {\n property: 'alphaMap', index: 'alphaMapIndex',\n target: 'alpha', channel: 'g',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_ALPHA_MAPS', feature: 'USE_ALPHA_MAPS', featureBit: 2 ** 2,\n sampling: 'multiply'\n },\n {\n property: 'normalMap', index: 'normalMapIndex',\n target: 'normal', channel: 'rgb',\n colorSpace: 'linear', operation: 'custom',\n define: 'NUM_NORMAL_MAPS', feature: 'USE_NORMAL_MAPS', featureBit: 2 ** 9,\n sampling: 'manual'\n },\n {\n property: 'emissiveMap', index: 'emissiveMapIndex',\n target: 'emission', channel: 'rgb',\n colorSpace: 'srgb', operation: 'custom',\n define: 'NUM_EMISSIVE_MAPS', feature: 'USE_EMISSIVE_MAPS', featureBit: 2 ** 7,\n sampling: 'manual'\n },\n {\n property: 'metallicRoughnessMap', index: 'metallicRoughnessMapIndex',\n target: 'baseMetalness/specularRoughness', channel: 'b/g',\n colorSpace: 'linear', operation: 'custom',\n define: 'NUM_METALLIC_ROUGHNESS_MAPS', feature: 'USE_METALLIC_ROUGHNESS_MAPS', featureBit: 2 ** 3,\n sampling: 'manual'\n },\n {\n property: 'roughnessMap', index: 'roughnessMapIndex',\n target: 'specularRoughness', channel: 'g',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_ROUGHNESS_MAPS', feature: 'USE_ROUGHNESS_MAPS', featureBit: 2 ** 4,\n sampling: 'multiply'\n },\n {\n property: 'metalnessMap', index: 'metalnessMapIndex',\n target: 'baseMetalness', channel: 'b',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_METALNESS_MAPS', feature: 'USE_METALNESS_MAPS', featureBit: 2 ** 5,\n sampling: 'multiply'\n },\n {\n property: 'transmissionMap', index: 'transmissionMapIndex',\n target: 'transmissionWeight', channel: 'r',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_TRANSMISSION_MAPS', feature: 'USE_TRANSMISSION_MAPS', featureBit: 2 ** 6,\n sampling: 'multiply'\n },\n {\n property: 'thinFilmMap', index: 'thinFilmMapIndex',\n target: 'thinFilmThickness', channel: 'per-material',\n colorSpace: 'linear', operation: 'custom',\n define: 'NUM_THIN_FILM_MAPS', feature: 'USE_THIN_FILM_MAPS', featureBit: 2 ** 8,\n sampling: 'manual'\n },\n {\n property: 'displacementMap', index: 'displacementMapIndex',\n target: 'displacement', channel: 'r',\n colorSpace: 'linear', operation: 'custom',\n define: null, feature: null, featureBit: 0,\n sampling: 'manual'\n },\n {\n property: 'coatWeightMap', index: 'coatWeightMapIndex',\n target: 'coatWeight', channel: 'r',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_COAT_WEIGHT_MAPS', feature: 'USE_COAT_WEIGHT_MAPS', featureBit: 2 ** 15,\n sampling: 'multiply'\n },\n {\n property: 'coatRoughnessMap', index: 'coatRoughnessMapIndex',\n target: 'coatRoughness', channel: 'g',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_COAT_ROUGHNESS_MAPS', feature: 'USE_COAT_ROUGHNESS_MAPS', featureBit: 2 ** 16,\n sampling: 'multiply'\n },\n {\n property: 'fuzzColorMap', index: 'fuzzColorMapIndex',\n target: 'fuzzColor', channel: 'rgb',\n colorSpace: 'srgb', operation: 'multiply',\n define: 'NUM_FUZZ_COLOR_MAPS', feature: 'USE_FUZZ_COLOR_MAPS', featureBit: 2 ** 18,\n sampling: 'multiply'\n },\n {\n property: 'fuzzRoughnessMap', index: 'fuzzRoughnessMapIndex',\n target: 'fuzzRoughness', channel: 'a',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_FUZZ_ROUGHNESS_MAPS', feature: 'USE_FUZZ_ROUGHNESS_MAPS', featureBit: 2 ** 19,\n sampling: 'multiply'\n },\n {\n property: 'specularWeightMap', index: 'specularWeightMapIndex',\n target: 'specularWeight', channel: 'a',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_SPECULAR_WEIGHT_MAPS', feature: 'USE_SPECULAR_WEIGHT_MAPS', featureBit: 2 ** 20,\n sampling: 'multiply'\n },\n {\n property: 'specularColorMap', index: 'specularColorMapIndex',\n target: 'specularColor', channel: 'rgb',\n colorSpace: 'srgb', operation: 'multiply',\n define: 'NUM_SPECULAR_COLOR_MAPS', feature: 'USE_SPECULAR_COLOR_MAPS', featureBit: 2 ** 21,\n sampling: 'multiply'\n },\n {\n property: 'anisotropyMap', index: 'anisotropyMapIndex',\n target: 'specularAnisotropy/direction', channel: 'rg/b',\n colorSpace: 'linear', operation: 'custom',\n define: 'NUM_ANISOTROPY_MAPS', feature: 'USE_ANISOTROPY_MAPS', featureBit: 2 ** 22,\n sampling: 'manual'\n },\n {\n property: 'coatNormalMap', index: 'coatNormalMapIndex',\n target: 'coatNormal', channel: 'rgb',\n colorSpace: 'linear', operation: 'custom',\n define: 'NUM_COAT_NORMAL_MAPS', feature: 'USE_COAT_NORMAL_MAPS', featureBit: 2 ** 17,\n sampling: 'manual'\n },\n] as const;\n\n// A missing or extra descriptor fails type checking in both directions.\ntype SlotName = typeof slots[number]['property'];\nconst textureNamesMatch: [Exclude<MaterialTextureName, SlotName> | Exclude<SlotName, MaterialTextureName>] extends [never] ? true : never = true;\nvoid textureNamesMatch;\nexport type MaterialTextureIndex = typeof slots[number]['index'];\n\nexport const MATERIAL_TEXTURE_SLOTS = slots.map(slot => {\n const field = materialLayoutFields().find(field => field.source === slot.index);\n if (!field) throw new Error(`Missing packed texture index: ${slot.property}`);\n return { ...slot, packed: {\n row: field.row, component: field.component, wgslField: field.name,\n glslRow: `MAT_ROW_${MATERIAL_LAYOUT[field.row].name}`,\n glslComponent: 'xyzw'[field.component]\n } };\n});\n\nexport const MATERIAL_TEXTURE_FEATURE_BITS = Object.fromEntries(slots.flatMap(slot => slot.feature\n ? [[slot.feature, slot.featureBit]] : []));\nexport const MATERIAL_TEXTURE_DEFINES = slots.flatMap(slot => slot.define ? [slot.define] : []);\n\nexport function materialTextureFeatures(defines: Record<string, string | number>) {\n return Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.feature && slot.define\n ? [[slot.feature, +defines[slot.define] > 0]] : []));\n}\n\n// Call at each original sample site: alpha resolution and combined maps must\n// keep their existing order. The scalar factors use raw linear channels; film ranges resolve explicitly.\nexport function simpleTextureSample(property: MaterialTextureName, backend: 'wgsl' | 'glsl'): string {\n const slot = MATERIAL_TEXTURE_SLOTS.find(slot => slot.property === property);\n if (!slot || slot.sampling !== 'multiply') throw new Error(`Handwritten texture slot: ${property}`);\n const index = slot.index;\n const sample = (expression: string) => slot.colorSpace === 'srgb' ? `decodeMapColor(${index}, ${expression})` : expression;\n if (backend === 'wgsl') {\n return `\n if (${slot.feature}) {\n let ${index} = i32(matData.${slot.packed.wgslField});\n if (${index} >= 0) {\n (*ma).${slot.target} *= ${sample(`sampleMap(\n ${index}, getMapUvSet(${index}, uv, uv1)\n ).${slot.channel}`)};\n }\n }\n`;\n }\n return `\n #ifdef ${slot.define}\n int ${index} = int(fetchMatData(i + ${slot.packed.glslRow}).${slot.packed.glslComponent});\n if (${index} >= 0) {\n mat.${slot.target} *= ${sample(`sampleMap(\n ${index}, getMapUvSet(${index}, uv, uv1)\n ).${slot.channel}`)};\n }\n #endif\n`;\n}\n\n// Multi-parameter slots retain explicit resolution and their original sample site.\nexport function thinFilmTextureSample(backend: 'wgsl' | 'glsl'): string {\n const slot = MATERIAL_TEXTURE_SLOTS.find(slot => slot.property === 'thinFilmMap')!;\n if (backend === 'wgsl') return `\n if (${slot.feature}) {\n let thinFilmMapIndex = i32(matData.${slot.packed.wgslField});\n if (thinFilmMapIndex >= 0) {\n let filmTexel = sampleMap(thinFilmMapIndex, getMapUvSet(thinFilmMapIndex, uv, uv1));\n // Preserve the legacy nm conversion followed by R multiplication exactly.\n if (matData.thinFilmThicknessMinimum == 0.0 && matData.thinFilmMapChannel == 0.0) {\n (*ma).thinFilmThickness *= filmTexel.r;\n } else {\n (*ma).thinFilmThickness = mix(matData.thinFilmThicknessMinimum,\n matData.thinFilmThickness, filmTexel[i32(matData.thinFilmMapChannel)]) * 1000.0;\n }\n }\n }\n`;\n return `\n #ifdef ${slot.define}\n int thinFilmMapIndex = int(fetchMatData(i + ${slot.packed.glslRow}).${slot.packed.glslComponent});\n if (thinFilmMapIndex >= 0) {\n vec4 filmTexel = sampleMap(thinFilmMapIndex, getMapUvSet(thinFilmMapIndex, uv, uv1));\n vec4 filmTextureParams = fetchMatData(i + MAT_ROW_FILM_TEXTURE);\n if (filmTextureParams.z == 0.0 && filmTextureParams.w == 0.0) {\n mat.thinFilmThickness *= filmTexel.r;\n } else {\n mat.thinFilmThickness = mix(filmTextureParams.z, misc.b,\n filmTexel[int(filmTextureParams.w)]) * 1000.0;\n }\n }\n #endif\n`;\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Geometry from '../scene/Geometry.js';
|
|
2
|
+
import Mesh from '../scene/Mesh.js';
|
|
3
|
+
import OpenPBRMaterial from '../scene/OpenPBRMaterial.js';
|
|
4
|
+
export interface InternalMergedMesh {
|
|
5
|
+
geometry: Geometry;
|
|
6
|
+
materials: OpenPBRMaterial[];
|
|
7
|
+
}
|
|
8
|
+
export declare function mergeMeshesToGeometry(meshes: Mesh[]): InternalMergedMesh;
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';
|
|
2
|
+
import { writeMaterialIndices } from './materialIndices.js';
|
|
3
|
+
// Portions adapted from ray-tracing-renderer@0.10.15
|
|
4
|
+
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
5
|
+
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
6
|
+
import { mat3, vec3 } from '../math.js';
|
|
7
|
+
import Geometry, { Attribute } from '../scene/Geometry.js';
|
|
8
|
+
import { getMaterialHashKey, resetMaterialTextureId } from '../scene/OpenPBRMaterial.js';
|
|
9
|
+
export function mergeMeshesToGeometry(meshes) {
|
|
10
|
+
let vertexCount = 0;
|
|
11
|
+
let indexCount = 0;
|
|
12
|
+
const geometryAndMaterialIndex = [];
|
|
13
|
+
const materialIndexMap = new Map();
|
|
14
|
+
const materials = [];
|
|
15
|
+
resetMaterialTextureId();
|
|
16
|
+
for (const mesh of meshes) {
|
|
17
|
+
for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {
|
|
18
|
+
let geometry = mesh.geometry;
|
|
19
|
+
const index = geometry.indices;
|
|
20
|
+
if (!index) {
|
|
21
|
+
addFlatGeometryIndices(geometry);
|
|
22
|
+
}
|
|
23
|
+
geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, Array(16).fill(0)));
|
|
24
|
+
if (!geometry.normal) {
|
|
25
|
+
computeGeometryNormals(geometry);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
vec3.forEach(geometry.normal.array, 3, 0, undefined, vec3.normalize, undefined);
|
|
29
|
+
}
|
|
30
|
+
vertexCount += Attribute.getCount(geometry.position);
|
|
31
|
+
indexCount += Attribute.getCount(geometry.indices);
|
|
32
|
+
const materialIndices = mesh.materials.map((material) => {
|
|
33
|
+
const key = getMaterialHashKey(material);
|
|
34
|
+
let materialIndex = materialIndexMap.get(key);
|
|
35
|
+
if (materialIndex === undefined) {
|
|
36
|
+
materialIndex = materialIndexMap.size;
|
|
37
|
+
materialIndexMap.set(key, materialIndex);
|
|
38
|
+
materials.push(material);
|
|
39
|
+
}
|
|
40
|
+
return materialIndex;
|
|
41
|
+
});
|
|
42
|
+
geometryAndMaterialIndex.push({
|
|
43
|
+
geometry,
|
|
44
|
+
materialIndex: materialIndices
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const geometry = mergeGeometry(geometryAndMaterialIndex, vertexCount, indexCount);
|
|
49
|
+
return {
|
|
50
|
+
geometry,
|
|
51
|
+
// TODO compress materials. Reuse materials with same props.
|
|
52
|
+
materials
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function mergeGeometry(geometryAndMaterialIndex, totalVertexCount, totalIndexCount) {
|
|
56
|
+
const positionAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
57
|
+
const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
58
|
+
const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
|
|
59
|
+
const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
|
|
60
|
+
const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);
|
|
61
|
+
const materialIndexAttrib = new Attribute(new Int32Array(4 * totalVertexCount), 4);
|
|
62
|
+
const mergedGeometry = new Geometry({
|
|
63
|
+
position: positionAttrib,
|
|
64
|
+
normal: normalAttrib,
|
|
65
|
+
uv: uvAttrib,
|
|
66
|
+
uv1: uv1Attrib,
|
|
67
|
+
materialIndex: materialIndexAttrib,
|
|
68
|
+
// color: colorAttrib,
|
|
69
|
+
indices: indexAttrib
|
|
70
|
+
});
|
|
71
|
+
let currentVertex = 0;
|
|
72
|
+
let currentIndex = 0;
|
|
73
|
+
let currentMesh = 1;
|
|
74
|
+
for (const { geometry } of geometryAndMaterialIndex) {
|
|
75
|
+
if (geometry.color) {
|
|
76
|
+
mergedGeometry.color = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
if (geometry.tangent) {
|
|
80
|
+
mergedGeometry.tangent = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (const { geometry, materialIndex: globalMaterialIndex } of geometryAndMaterialIndex) {
|
|
85
|
+
const vertexCount = Attribute.getCount(geometry.position);
|
|
86
|
+
['position', 'normal', 'uv'].forEach((attr) => {
|
|
87
|
+
if (!geometry[attr]) {
|
|
88
|
+
if (attr == 'normal' || attr === 'position') {
|
|
89
|
+
console.error('Geometry must have at least position and normal attributes.');
|
|
90
|
+
}
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
mergedGeometry[attr].array.set(geometry[attr].array, currentVertex * geometry[attr].itemSize);
|
|
94
|
+
});
|
|
95
|
+
uv1Attrib.array.set((geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2), currentVertex * 2);
|
|
96
|
+
if (mergedGeometry.color) {
|
|
97
|
+
const itemSize = 3;
|
|
98
|
+
if (geometry.color) {
|
|
99
|
+
mergedGeometry.color.array.set(geometry.color.array, currentVertex * itemSize);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Set to white
|
|
103
|
+
for (let i = 0; i < vertexCount * itemSize; i++) {
|
|
104
|
+
mergedGeometry.color.array[currentVertex * itemSize + i] = 1;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (mergedGeometry.tangent) {
|
|
109
|
+
const itemSize = 3;
|
|
110
|
+
if (geometry.tangent) {
|
|
111
|
+
mergedGeometry.tangent.array.set(geometry.tangent.array, currentVertex * itemSize);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
for (let i = 0; i < vertexCount * itemSize; i++) {
|
|
115
|
+
mergedGeometry.tangent.array[currentVertex * itemSize + i] = 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const meshIndices = geometry.indices.array;
|
|
120
|
+
for (let i = 0; i < meshIndices.length; i++) {
|
|
121
|
+
indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];
|
|
122
|
+
}
|
|
123
|
+
writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, true);
|
|
124
|
+
currentVertex += vertexCount;
|
|
125
|
+
currentIndex += meshIndices.length;
|
|
126
|
+
currentMesh++;
|
|
127
|
+
}
|
|
128
|
+
return mergedGeometry;
|
|
129
|
+
}
|
|
130
|
+
function addFlatGeometryIndices(geometry) {
|
|
131
|
+
const position = geometry.position;
|
|
132
|
+
if (!position) {
|
|
133
|
+
console.warn('No position attribute');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const index = new Uint32Array(Attribute.getCount(position));
|
|
137
|
+
for (let i = 0; i < index.length; i++) {
|
|
138
|
+
index[i] = i;
|
|
139
|
+
}
|
|
140
|
+
geometry.indices = new Attribute(index, 1);
|
|
141
|
+
return geometry;
|
|
142
|
+
}
|
|
143
|
+
function transformGeometry(geometry, matrix) {
|
|
144
|
+
const { position, normal, uv, uv1, color, tangent, materialIndex, indices } = {
|
|
145
|
+
position: geometry.position.array,
|
|
146
|
+
normal: geometry.normal.array,
|
|
147
|
+
uv: geometry.uv && geometry.uv.array,
|
|
148
|
+
uv1: geometry.uv1 && geometry.uv1.array,
|
|
149
|
+
color: geometry.color && geometry.color.array,
|
|
150
|
+
tangent: geometry.tangent && geometry.tangent.array,
|
|
151
|
+
materialIndex: geometry.materialIndex && geometry.materialIndex.array,
|
|
152
|
+
indices: geometry.indices.array
|
|
153
|
+
};
|
|
154
|
+
const newGeometry = new Geometry({
|
|
155
|
+
position: new Attribute(
|
|
156
|
+
// TODO only copy when necessary
|
|
157
|
+
new Float32Array(position), geometry.position.itemSize),
|
|
158
|
+
normal: new Attribute(new Float32Array(normal), geometry.normal.itemSize),
|
|
159
|
+
// No need to clone uv
|
|
160
|
+
uv: uv && new Attribute(uv, geometry.uv.itemSize),
|
|
161
|
+
uv1: uv1 && new Attribute(uv1, geometry.uv1.itemSize),
|
|
162
|
+
color: color && new Attribute(color, geometry.color.itemSize),
|
|
163
|
+
tangent: tangent &&
|
|
164
|
+
new Attribute(new Float32Array(tangent), geometry.tangent.itemSize),
|
|
165
|
+
materialIndex: materialIndex && new Attribute(materialIndex, geometry.materialIndex.itemSize),
|
|
166
|
+
indices: indices && new Attribute(indices, geometry.indices.itemSize)
|
|
167
|
+
});
|
|
168
|
+
// Normal Matrix
|
|
169
|
+
let normalMatrix = mat3.normalFromMat4(mat3.create(), matrix);
|
|
170
|
+
if (normalMatrix == null) {
|
|
171
|
+
// If matrix has NaN value. normalMatrix may be null.
|
|
172
|
+
// Create an identity one.
|
|
173
|
+
// TODO remove scale information
|
|
174
|
+
normalMatrix = mat3.create();
|
|
175
|
+
}
|
|
176
|
+
vec3.forEach(newGeometry.position.array, 3, 0, undefined, vec3.transformMat4, matrix);
|
|
177
|
+
if (newGeometry.normal) {
|
|
178
|
+
vec3.forEach(newGeometry.normal.array, 3, 0, undefined, vec3.transformMat3, normalMatrix);
|
|
179
|
+
vec3.forEach(newGeometry.normal.array, 3, 0, undefined, vec3.normalize);
|
|
180
|
+
}
|
|
181
|
+
if (newGeometry.tangent) {
|
|
182
|
+
vec3.forEach(newGeometry.tangent.array, 3, 0, undefined, vec3.transformMat3, normalMatrix);
|
|
183
|
+
// Try not to normalize the tangent.
|
|
184
|
+
// The anisotropic needs radial tangent. The interpolation inside the triangle will be wrong if we normalize it.
|
|
185
|
+
// vec3.forEach(newGeometry.tangent.array, 3, 0, undefined, vec3.normalize);
|
|
186
|
+
}
|
|
187
|
+
return newGeometry;
|
|
188
|
+
}
|
|
189
|
+
function computeGeometryNormals(geometry) {
|
|
190
|
+
const indices = geometry.indices;
|
|
191
|
+
const positions = geometry.position.array;
|
|
192
|
+
geometry.normal = new Attribute(new Float32Array(positions.length), 3);
|
|
193
|
+
const normals = geometry.normal.array;
|
|
194
|
+
const p1 = vec3.create();
|
|
195
|
+
const p2 = vec3.create();
|
|
196
|
+
const p3 = vec3.create();
|
|
197
|
+
const v21 = vec3.create();
|
|
198
|
+
const v32 = vec3.create();
|
|
199
|
+
const n = vec3.create();
|
|
200
|
+
const len = indices
|
|
201
|
+
? indices.array.length
|
|
202
|
+
: geometry.vertexCount;
|
|
203
|
+
let i1, i2, i3;
|
|
204
|
+
for (let f = 0; f < len;) {
|
|
205
|
+
if (indices) {
|
|
206
|
+
i1 = indices.array[f++];
|
|
207
|
+
i2 = indices.array[f++];
|
|
208
|
+
i3 = indices.array[f++];
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
i1 = f++;
|
|
212
|
+
i2 = f++;
|
|
213
|
+
i3 = f++;
|
|
214
|
+
}
|
|
215
|
+
vec3.set(p1, positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);
|
|
216
|
+
vec3.set(p2, positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);
|
|
217
|
+
vec3.set(p3, positions[i3 * 3], positions[i3 * 3 + 1], positions[i3 * 3 + 2]);
|
|
218
|
+
vec3.sub(v21, p1, p2);
|
|
219
|
+
vec3.sub(v32, p2, p3);
|
|
220
|
+
vec3.cross(n, v21, v32);
|
|
221
|
+
// Already be weighted by the triangle area
|
|
222
|
+
for (let i = 0; i < 3; i++) {
|
|
223
|
+
normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];
|
|
224
|
+
normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];
|
|
225
|
+
normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
for (let i = 0; i < normals.length;) {
|
|
229
|
+
vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);
|
|
230
|
+
vec3.normalize(n, n);
|
|
231
|
+
normals[i++] = n[0];
|
|
232
|
+
normals[i++] = n[1];
|
|
233
|
+
normals[i++] = n[2];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=mergeMeshesToGeometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeMeshesToGeometry.js","sourceRoot":"","sources":["../../src/renderer/mergeMeshesToGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["import { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';\nimport { writeMaterialIndices } from './materialIndices.js';\n// 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 { mat3, mat4, vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial, {\n getMaterialHashKey,\n resetMaterialTextureId\n} from '../scene/OpenPBRMaterial.js';\n\nexport interface InternalMergedMesh {\n geometry: Geometry;\n materials: OpenPBRMaterial[];\n}\n\nexport function mergeMeshesToGeometry(meshes: Mesh[]): InternalMergedMesh {\n let vertexCount = 0;\n let indexCount = 0;\n\n const geometryAndMaterialIndex = [];\n const materialIndexMap = new Map<string, number>();\n const materials: OpenPBRMaterial[] = [];\n\n resetMaterialTextureId();\n\n for (const mesh of meshes) {\n for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {\n let geometry = mesh.geometry;\n\n const index = geometry.indices;\n if (!index) {\n addFlatGeometryIndices(geometry);\n }\n\n geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, Array(16).fill(0)));\n\n if (!geometry.normal) {\n computeGeometryNormals(geometry);\n } else {\n vec3.forEach(\n geometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.normalize,\n undefined\n );\n }\n\n vertexCount += Attribute.getCount(geometry.position);\n indexCount += Attribute.getCount(geometry.indices);\n\n const materialIndices = mesh.materials.map((material) => {\n const key = getMaterialHashKey(material);\n let materialIndex = materialIndexMap.get(key);\n if (materialIndex === undefined) {\n materialIndex = materialIndexMap.size;\n materialIndexMap.set(key, materialIndex);\n materials.push(material);\n }\n return materialIndex;\n });\n\n geometryAndMaterialIndex.push({\n geometry,\n materialIndex: materialIndices\n });\n }\n }\n\n const geometry = mergeGeometry(\n geometryAndMaterialIndex,\n vertexCount,\n indexCount\n );\n\n return {\n geometry,\n // TODO compress materials. Reuse materials with same props.\n materials\n };\n}\n\nfunction mergeGeometry(\n geometryAndMaterialIndex: {\n geometry: Geometry;\n materialIndex: number[];\n }[],\n totalVertexCount: number,\n totalIndexCount: number\n) {\n const positionAttrib = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);\n const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);\n\n const materialIndexAttrib = new Attribute(\n new Int32Array(4 * totalVertexCount),\n 4\n );\n\n const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n // color: colorAttrib,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n let currentMesh = 1;\n\n for (const { geometry } of geometryAndMaterialIndex) {\n if (geometry.color) {\n mergedGeometry.color = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n break;\n }\n if (geometry.tangent) {\n mergedGeometry.tangent = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n break;\n }\n }\n\n for (const {\n geometry,\n materialIndex: globalMaterialIndex\n } of geometryAndMaterialIndex) {\n const vertexCount = Attribute.getCount(geometry.position);\n\n (['position', 'normal', 'uv'] as const).forEach((attr) => {\n if (!geometry[attr]) {\n if (attr == 'normal' || attr === 'position') {\n console.error(\n 'Geometry must have at least position and normal attributes.'\n );\n }\n return;\n }\n mergedGeometry[attr]!.array.set(\n geometry[attr]!.array,\n currentVertex * geometry[attr]!.itemSize\n );\n });\n\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n\n if (mergedGeometry.color) {\n const itemSize = 3;\n if (geometry.color) {\n mergedGeometry.color.array.set(\n geometry.color.array,\n currentVertex * itemSize\n );\n } else {\n // Set to white\n for (let i = 0; i < vertexCount * itemSize; i++) {\n mergedGeometry.color.array[currentVertex * itemSize + i] = 1;\n }\n }\n }\n if (mergedGeometry.tangent) {\n const itemSize = 3;\n if (geometry.tangent) {\n mergedGeometry.tangent.array.set(\n geometry.tangent.array,\n currentVertex * itemSize\n );\n } else {\n for (let i = 0; i < vertexCount * itemSize; i++) {\n mergedGeometry.tangent.array[currentVertex * itemSize + i] = 0;\n }\n }\n }\n\n const meshIndices = geometry.indices.array;\n for (let i = 0; i < meshIndices.length; i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, true);\n\n currentVertex += vertexCount;\n currentIndex += meshIndices.length;\n currentMesh++;\n }\n\n return mergedGeometry;\n}\n\nfunction addFlatGeometryIndices(geometry: Geometry) {\n const position = geometry.position;\n\n if (!position) {\n console.warn('No position attribute');\n return;\n }\n\n const index = new Uint32Array(Attribute.getCount(position));\n\n for (let i = 0; i < index.length; i++) {\n index[i] = i;\n }\n\n geometry.indices = new Attribute(index, 1);\n\n return geometry;\n}\n\nfunction transformGeometry(geometry: Geometry, matrix: mat4.Mat4Array) {\n const { position, normal, uv, uv1, color, tangent, materialIndex, indices } = {\n position: geometry.position.array,\n normal: geometry.normal.array,\n uv: geometry.uv && geometry.uv.array,\n uv1: geometry.uv1 && geometry.uv1.array,\n color: geometry.color && geometry.color.array,\n tangent: geometry.tangent && geometry.tangent.array,\n materialIndex: geometry.materialIndex && geometry.materialIndex.array,\n indices: geometry.indices.array\n };\n const newGeometry = new Geometry({\n position: new Attribute(\n // TODO only copy when necessary\n new Float32Array(position),\n geometry.position.itemSize\n ),\n normal: new Attribute(new Float32Array(normal), geometry.normal.itemSize),\n // No need to clone uv\n uv: uv && new Attribute(uv, geometry.uv!.itemSize),\n uv1: uv1 && new Attribute(uv1, geometry.uv1!.itemSize),\n color: color && new Attribute(color, geometry.color!.itemSize),\n tangent:\n tangent &&\n new Attribute(new Float32Array(tangent), geometry.tangent!.itemSize),\n materialIndex: materialIndex && new Attribute(materialIndex, geometry.materialIndex!.itemSize),\n indices: indices && new Attribute(indices, geometry.indices.itemSize)\n });\n\n // Normal Matrix\n let normalMatrix = mat3.normalFromMat4(mat3.create(), matrix);\n if (normalMatrix == null) {\n // If matrix has NaN value. normalMatrix may be null.\n // Create an identity one.\n // TODO remove scale information\n normalMatrix = mat3.create();\n }\n\n vec3.forEach(\n newGeometry.position.array,\n 3,\n 0,\n undefined,\n vec3.transformMat4,\n matrix\n );\n\n if (newGeometry.normal) {\n vec3.forEach(\n newGeometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n vec3.forEach(newGeometry.normal.array, 3, 0, undefined, vec3.normalize);\n }\n if (newGeometry.tangent) {\n vec3.forEach(\n newGeometry.tangent.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n // Try not to normalize the tangent.\n // The anisotropic needs radial tangent. The interpolation inside the triangle will be wrong if we normalize it.\n // vec3.forEach(newGeometry.tangent.array, 3, 0, undefined, vec3.normalize);\n }\n return newGeometry;\n}\n\nfunction computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indices;\n const positions = geometry.position.array;\n geometry.normal = new Attribute(new Float32Array(positions.length), 3);\n const normals = geometry.normal.array;\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\n ? indices.array.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = indices.array[f++];\n i2 = indices.array[f++];\n i3 = indices.array[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"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import Mesh from '../scene/Mesh.js';
|
|
2
|
+
import { mat4 } from '../math.js';
|
|
3
|
+
import type { TLASInstance } from './bvhAccel.js';
|
|
4
|
+
export declare function meshInstanceCount(mesh: Mesh): number;
|
|
5
|
+
/** Writes a world matrix without allocating per-instance Mesh objects or views. */
|
|
6
|
+
export declare function meshInstanceTransform(mesh: Mesh, index: number, out: mat4.Mat4Array): mat4.Mat4Array;
|
|
7
|
+
/** CPU instance records in numeric storage; one reusable synchronous read view. */
|
|
8
|
+
export declare class PackedMeshInstances {
|
|
9
|
+
length: number;
|
|
10
|
+
readonly transforms: Float64Array;
|
|
11
|
+
readonly colors: Float32Array;
|
|
12
|
+
readonly bounds: Float32Array;
|
|
13
|
+
readonly blasIndices: Uint32Array;
|
|
14
|
+
readonly materials: Int32Array;
|
|
15
|
+
readonly displacement: Float64Array;
|
|
16
|
+
readonly sourceIndices: Uint32Array;
|
|
17
|
+
private readonly view;
|
|
18
|
+
constructor(capacity: number);
|
|
19
|
+
read(index: number): TLASInstance;
|
|
20
|
+
}
|
|
21
|
+
export type MeshInstances = TLASInstance[] | PackedMeshInstances;
|
|
22
|
+
export declare function readMeshInstance(instances: MeshInstances, index: number): TLASInstance;
|
|
23
|
+
export declare function sameInstanceMembership(a: MeshInstances, b: MeshInstances): boolean;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import InstancedMesh from '../scene/InstancedMesh.js';
|
|
2
|
+
import { mat4 } from '../math.js';
|
|
3
|
+
export function meshInstanceCount(mesh) { return mesh instanceof InstancedMesh ? mesh.count : 1; }
|
|
4
|
+
/** Writes a world matrix without allocating per-instance Mesh objects or views. */
|
|
5
|
+
export function meshInstanceTransform(mesh, index, out) {
|
|
6
|
+
if (!(mesh instanceof InstancedMesh))
|
|
7
|
+
return mat4.copy(out, mesh.transform);
|
|
8
|
+
const local = mesh.transforms, offset = index * 16, parent = mesh.transform;
|
|
9
|
+
for (let column = 0; column < 4; column++) {
|
|
10
|
+
const o = offset + column * 4;
|
|
11
|
+
const x = local[o], y = local[o + 1], z = local[o + 2], w = local[o + 3];
|
|
12
|
+
for (let row = 0; row < 4; row++)
|
|
13
|
+
out[column * 4 + row] = parent[row] * x + parent[row + 4] * y + parent[row + 8] * z + parent[row + 12] * w;
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
/** CPU instance records in numeric storage; one reusable synchronous read view. */
|
|
18
|
+
export class PackedMeshInstances {
|
|
19
|
+
length = 0;
|
|
20
|
+
transforms;
|
|
21
|
+
colors;
|
|
22
|
+
bounds;
|
|
23
|
+
blasIndices;
|
|
24
|
+
materials;
|
|
25
|
+
displacement;
|
|
26
|
+
sourceIndices;
|
|
27
|
+
view = { blasIndex: 0, bounds: { min: [0, 0, 0], max: [0, 0, 0] }, transform: Array(16).fill(0), materialsIndices: [0], color: [1, 1, 1] };
|
|
28
|
+
constructor(capacity) {
|
|
29
|
+
this.colors = new Float32Array(capacity * 3);
|
|
30
|
+
this.transforms = new Float64Array(capacity * 16);
|
|
31
|
+
this.bounds = new Float32Array(capacity * 6);
|
|
32
|
+
this.blasIndices = new Uint32Array(capacity);
|
|
33
|
+
this.materials = new Int32Array(capacity);
|
|
34
|
+
this.displacement = new Float64Array(capacity);
|
|
35
|
+
this.sourceIndices = new Uint32Array(capacity);
|
|
36
|
+
}
|
|
37
|
+
read(index) {
|
|
38
|
+
const v = this.view;
|
|
39
|
+
v.blasIndex = this.blasIndices[index];
|
|
40
|
+
v.materialsIndices[0] = this.materials[index];
|
|
41
|
+
v.displacementScale = this.displacement[index];
|
|
42
|
+
for (let i = 0; i < 16; i++)
|
|
43
|
+
v.transform[i] = this.transforms[index * 16 + i];
|
|
44
|
+
for (let i = 0; i < 3; i++)
|
|
45
|
+
v.color[i] = this.colors[index * 3 + i];
|
|
46
|
+
for (let i = 0; i < 3; i++) {
|
|
47
|
+
v.bounds.min[i] = this.bounds[index * 6 + i];
|
|
48
|
+
v.bounds.max[i] = this.bounds[index * 6 + i + 3];
|
|
49
|
+
}
|
|
50
|
+
return v;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function readMeshInstance(instances, index) {
|
|
54
|
+
return instances instanceof PackedMeshInstances ? instances.read(index) : instances[index];
|
|
55
|
+
}
|
|
56
|
+
export function sameInstanceMembership(a, b) {
|
|
57
|
+
if (a.length !== b.length)
|
|
58
|
+
return false;
|
|
59
|
+
if (a instanceof PackedMeshInstances && b instanceof PackedMeshInstances) {
|
|
60
|
+
for (let i = 0; i < a.length; i++)
|
|
61
|
+
if (a.sourceIndices[i] !== b.sourceIndices[i])
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=meshInstances.js.map
|