@luma.gl/shaders 0.0.0-stage → 10.0.0-alpha.5
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/README.md +25 -2
- package/dist/dist.dev.js +19686 -0
- package/dist/dist.min.js +12180 -0
- package/dist/glsl.cjs +33 -0
- package/dist/glsl.cjs.map +6 -0
- package/dist/glsl.d.ts +6 -0
- package/dist/glsl.d.ts.map +1 -0
- package/dist/glsl.js +7 -0
- package/dist/glsl.js.map +1 -0
- package/dist/index.cjs +243 -0
- package/dist/index.cjs.map +6 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/color/normalize-byte-colors.cjs +50 -0
- package/dist/lib/color/normalize-byte-colors.d.ts +23 -0
- package/dist/lib/color/normalize-byte-colors.d.ts.map +1 -0
- package/dist/lib/color/normalize-byte-colors.js +42 -0
- package/dist/lib/color/normalize-byte-colors.js.map +1 -0
- package/dist/lib/filters/prop-types.cjs +90 -0
- package/dist/lib/filters/prop-types.d.ts +44 -0
- package/dist/lib/filters/prop-types.d.ts.map +1 -0
- package/dist/lib/filters/prop-types.js +96 -0
- package/dist/lib/filters/prop-types.js.map +1 -0
- package/dist/lib/glsl-shader-assembler.cjs +50 -0
- package/dist/lib/glsl-shader-assembler.d.ts +19 -0
- package/dist/lib/glsl-shader-assembler.d.ts.map +1 -0
- package/dist/lib/glsl-shader-assembler.js +29 -0
- package/dist/lib/glsl-shader-assembler.js.map +1 -0
- package/dist/lib/glsl-utils/get-shader-info.cjs +52 -0
- package/dist/lib/glsl-utils/get-shader-info.d.ts +9 -0
- package/dist/lib/glsl-utils/get-shader-info.d.ts.map +1 -0
- package/dist/lib/glsl-utils/get-shader-info.js +33 -0
- package/dist/lib/glsl-utils/get-shader-info.js.map +1 -0
- package/dist/lib/glsl-utils/shader-utils.cjs +126 -0
- package/dist/lib/glsl-utils/shader-utils.d.ts +23 -0
- package/dist/lib/glsl-utils/shader-utils.d.ts.map +1 -0
- package/dist/lib/glsl-utils/shader-utils.js +92 -0
- package/dist/lib/glsl-utils/shader-utils.js.map +1 -0
- package/dist/lib/preprocessor/preprocessor.cjs +107 -0
- package/dist/lib/preprocessor/preprocessor.d.ts +15 -0
- package/dist/lib/preprocessor/preprocessor.d.ts.map +1 -0
- package/dist/lib/preprocessor/preprocessor.js +99 -0
- package/dist/lib/preprocessor/preprocessor.js.map +1 -0
- package/dist/lib/shader-assembler-base.cjs +133 -0
- package/dist/lib/shader-assembler-base.d.ts +52 -0
- package/dist/lib/shader-assembler-base.d.ts.map +1 -0
- package/dist/lib/shader-assembler-base.js +128 -0
- package/dist/lib/shader-assembler-base.js.map +1 -0
- package/dist/lib/shader-assembler.cjs +33 -0
- package/dist/lib/shader-assembler.d.ts +4 -0
- package/dist/lib/shader-assembler.d.ts.map +1 -0
- package/dist/lib/shader-assembler.js +7 -0
- package/dist/lib/shader-assembler.js.map +1 -0
- package/dist/lib/shader-assembly/assemble-glsl-shaders.cjs +200 -0
- package/dist/lib/shader-assembly/assemble-glsl-shaders.d.ts +69 -0
- package/dist/lib/shader-assembly/assemble-glsl-shaders.d.ts.map +1 -0
- package/dist/lib/shader-assembly/assemble-glsl-shaders.js +221 -0
- package/dist/lib/shader-assembly/assemble-glsl-shaders.js.map +1 -0
- package/dist/lib/shader-assembly/assemble-shaders.cjs +42 -0
- package/dist/lib/shader-assembly/assemble-shaders.d.ts +10 -0
- package/dist/lib/shader-assembly/assemble-shaders.d.ts.map +1 -0
- package/dist/lib/shader-assembly/assemble-shaders.js +10 -0
- package/dist/lib/shader-assembly/assemble-shaders.js.map +1 -0
- package/dist/lib/shader-assembly/assemble-wgsl-shaders.cjs +501 -0
- package/dist/lib/shader-assembly/assemble-wgsl-shaders.d.ts +71 -0
- package/dist/lib/shader-assembly/assemble-wgsl-shaders.d.ts.map +1 -0
- package/dist/lib/shader-assembly/assemble-wgsl-shaders.js +473 -0
- package/dist/lib/shader-assembly/assemble-wgsl-shaders.js.map +1 -0
- package/dist/lib/shader-assembly/platform-defines.cjs +79 -0
- package/dist/lib/shader-assembly/platform-defines.d.ts +4 -0
- package/dist/lib/shader-assembly/platform-defines.d.ts.map +1 -0
- package/dist/lib/shader-assembly/platform-defines.js +52 -0
- package/dist/lib/shader-assembly/platform-defines.js.map +1 -0
- package/dist/lib/shader-assembly/platform-info.cjs +15 -0
- package/dist/lib/shader-assembly/platform-info.d.ts +20 -0
- package/dist/lib/shader-assembly/platform-info.d.ts.map +1 -0
- package/dist/lib/shader-assembly/platform-info.js +5 -0
- package/dist/lib/shader-assembly/platform-info.js.map +1 -0
- package/dist/lib/shader-assembly/shader-assembly-shared.cjs +96 -0
- package/dist/lib/shader-assembly/shader-assembly-shared.d.ts +16 -0
- package/dist/lib/shader-assembly/shader-assembly-shared.d.ts.map +1 -0
- package/dist/lib/shader-assembly/shader-assembly-shared.js +79 -0
- package/dist/lib/shader-assembly/shader-assembly-shared.js.map +1 -0
- package/dist/lib/shader-assembly/shader-assembly-types.cjs +15 -0
- package/dist/lib/shader-assembly/shader-assembly-types.d.ts +128 -0
- package/dist/lib/shader-assembly/shader-assembly-types.d.ts.map +1 -0
- package/dist/lib/shader-assembly/shader-assembly-types.js +5 -0
- package/dist/lib/shader-assembly/shader-assembly-types.js.map +1 -0
- package/dist/lib/shader-assembly/shader-hooks.cjs +103 -0
- package/dist/lib/shader-assembly/shader-hooks.d.ts +45 -0
- package/dist/lib/shader-assembly/shader-hooks.d.ts.map +1 -0
- package/dist/lib/shader-assembly/shader-hooks.js +84 -0
- package/dist/lib/shader-assembly/shader-hooks.js.map +1 -0
- package/dist/lib/shader-assembly/shader-injections.cjs +180 -0
- package/dist/lib/shader-assembly/shader-injections.d.ts +34 -0
- package/dist/lib/shader-assembly/shader-injections.d.ts.map +1 -0
- package/dist/lib/shader-assembly/shader-injections.js +183 -0
- package/dist/lib/shader-assembly/shader-injections.js.map +1 -0
- package/dist/lib/shader-assembly/shader-plugin-varyings.cjs +417 -0
- package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts +15 -0
- package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts.map +1 -0
- package/dist/lib/shader-assembly/shader-plugin-varyings.js +412 -0
- package/dist/lib/shader-assembly/shader-plugin-varyings.js.map +1 -0
- package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.cjs +254 -0
- package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts +12 -0
- package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts.map +1 -0
- package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js +237 -0
- package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js.map +1 -0
- package/dist/lib/shader-assembly/wgsl-binding-debug.cjs +166 -0
- package/dist/lib/shader-assembly/wgsl-binding-debug.d.ts +37 -0
- package/dist/lib/shader-assembly/wgsl-binding-debug.d.ts.map +1 -0
- package/dist/lib/shader-assembly/wgsl-binding-debug.js +144 -0
- package/dist/lib/shader-assembly/wgsl-binding-debug.js.map +1 -0
- package/dist/lib/shader-assembly/wgsl-binding-scan.cjs +184 -0
- package/dist/lib/shader-assembly/wgsl-binding-scan.d.ts +19 -0
- package/dist/lib/shader-assembly/wgsl-binding-scan.d.ts.map +1 -0
- package/dist/lib/shader-assembly/wgsl-binding-scan.js +151 -0
- package/dist/lib/shader-assembly/wgsl-binding-scan.js.map +1 -0
- package/dist/lib/shader-assembly/wgsl-interface-scan.cjs +502 -0
- package/dist/lib/shader-assembly/wgsl-interface-scan.d.ts +14 -0
- package/dist/lib/shader-assembly/wgsl-interface-scan.d.ts.map +1 -0
- package/dist/lib/shader-assembly/wgsl-interface-scan.js +498 -0
- package/dist/lib/shader-assembly/wgsl-interface-scan.js.map +1 -0
- package/dist/lib/shader-generator/generate-shader.cjs +36 -0
- package/dist/lib/shader-generator/generate-shader.d.ts +8 -0
- package/dist/lib/shader-generator/generate-shader.d.ts.map +1 -0
- package/dist/lib/shader-generator/generate-shader.js +15 -0
- package/dist/lib/shader-generator/generate-shader.js.map +1 -0
- package/dist/lib/shader-generator/glsl/generate-glsl.cjs +94 -0
- package/dist/lib/shader-generator/glsl/generate-glsl.d.ts +7 -0
- package/dist/lib/shader-generator/glsl/generate-glsl.d.ts.map +1 -0
- package/dist/lib/shader-generator/glsl/generate-glsl.js +79 -0
- package/dist/lib/shader-generator/glsl/generate-glsl.js.map +1 -0
- package/dist/lib/shader-generator/utils/capitalize.cjs +29 -0
- package/dist/lib/shader-generator/utils/capitalize.d.ts +7 -0
- package/dist/lib/shader-generator/utils/capitalize.d.ts.map +1 -0
- package/dist/lib/shader-generator/utils/capitalize.js +12 -0
- package/dist/lib/shader-generator/utils/capitalize.js.map +1 -0
- package/dist/lib/shader-generator/wgsl/generate-wgsl.cjs +46 -0
- package/dist/lib/shader-generator/wgsl/generate-wgsl.d.ts +7 -0
- package/dist/lib/shader-generator/wgsl/generate-wgsl.d.ts.map +1 -0
- package/dist/lib/shader-generator/wgsl/generate-wgsl.js +23 -0
- package/dist/lib/shader-generator/wgsl/generate-wgsl.js.map +1 -0
- package/dist/lib/shader-module/composite-shader-pass.cjs +15 -0
- package/dist/lib/shader-module/composite-shader-pass.d.ts +41 -0
- package/dist/lib/shader-module/composite-shader-pass.d.ts.map +1 -0
- package/dist/lib/shader-module/composite-shader-pass.js +5 -0
- package/dist/lib/shader-module/composite-shader-pass.js.map +1 -0
- package/dist/lib/shader-module/shader-module-dependencies.cjs +83 -0
- package/dist/lib/shader-module/shader-module-dependencies.d.ts +39 -0
- package/dist/lib/shader-module/shader-module-dependencies.d.ts.map +1 -0
- package/dist/lib/shader-module/shader-module-dependencies.js +103 -0
- package/dist/lib/shader-module/shader-module-dependencies.js.map +1 -0
- package/dist/lib/shader-module/shader-module-uniform-layout.cjs +224 -0
- package/dist/lib/shader-module/shader-module-uniform-layout.d.ts +91 -0
- package/dist/lib/shader-module/shader-module-uniform-layout.d.ts.map +1 -0
- package/dist/lib/shader-module/shader-module-uniform-layout.js +253 -0
- package/dist/lib/shader-module/shader-module-uniform-layout.js.map +1 -0
- package/dist/lib/shader-module/shader-module.cjs +105 -0
- package/dist/lib/shader-module/shader-module.d.ts +98 -0
- package/dist/lib/shader-module/shader-module.d.ts.map +1 -0
- package/dist/lib/shader-module/shader-module.js +104 -0
- package/dist/lib/shader-module/shader-module.js.map +1 -0
- package/dist/lib/shader-module/shader-pass.cjs +15 -0
- package/dist/lib/shader-module/shader-pass.d.ts +48 -0
- package/dist/lib/shader-module/shader-pass.d.ts.map +1 -0
- package/dist/lib/shader-module/shader-pass.js +5 -0
- package/dist/lib/shader-module/shader-pass.js.map +1 -0
- package/dist/lib/shader-plugin.cjs +117 -0
- package/dist/lib/shader-plugin.d.ts +68 -0
- package/dist/lib/shader-plugin.d.ts.map +1 -0
- package/dist/lib/shader-plugin.js +98 -0
- package/dist/lib/shader-plugin.js.map +1 -0
- package/dist/lib/shader-transpiler/shader-transpiler.cjs +15 -0
- package/dist/lib/shader-transpiler/shader-transpiler.d.ts +27 -0
- package/dist/lib/shader-transpiler/shader-transpiler.d.ts.map +1 -0
- package/dist/lib/shader-transpiler/shader-transpiler.js +5 -0
- package/dist/lib/shader-transpiler/shader-transpiler.js.map +1 -0
- package/dist/lib/shader-transpiler/transpile-glsl-shader.cjs +71 -0
- package/dist/lib/shader-transpiler/transpile-glsl-shader.d.ts +9 -0
- package/dist/lib/shader-transpiler/transpile-glsl-shader.d.ts.map +1 -0
- package/dist/lib/shader-transpiler/transpile-glsl-shader.js +69 -0
- package/dist/lib/shader-transpiler/transpile-glsl-shader.js.map +1 -0
- package/dist/lib/utils/assert.cjs +34 -0
- package/dist/lib/utils/assert.d.ts +2 -0
- package/dist/lib/utils/assert.d.ts.map +1 -0
- package/dist/lib/utils/assert.js +13 -0
- package/dist/lib/utils/assert.js.map +1 -0
- package/dist/lib/utils/uniform-types.cjs +15 -0
- package/dist/lib/utils/uniform-types.d.ts +18 -0
- package/dist/lib/utils/uniform-types.d.ts.map +1 -0
- package/dist/lib/utils/uniform-types.js +5 -0
- package/dist/lib/utils/uniform-types.js.map +1 -0
- package/dist/lib/wgsl-shader-assembler.cjs +99 -0
- package/dist/lib/wgsl-shader-assembler.d.ts +34 -0
- package/dist/lib/wgsl-shader-assembler.d.ts.map +1 -0
- package/dist/lib/wgsl-shader-assembler.js +84 -0
- package/dist/lib/wgsl-shader-assembler.js.map +1 -0
- package/dist/module-injectors.cjs +59 -0
- package/dist/module-injectors.d.ts +3 -0
- package/dist/module-injectors.d.ts.map +1 -0
- package/dist/module-injectors.js +31 -0
- package/dist/module-injectors.js.map +1 -0
- package/dist/modules/color/float-colors.cjs +275 -0
- package/dist/modules/color/float-colors.d.ts +132 -0
- package/dist/modules/color/float-colors.d.ts.map +1 -0
- package/dist/modules/color/float-colors.js +248 -0
- package/dist/modules/color/float-colors.js.map +1 -0
- package/dist/modules/engine/clip/clip.cjs +152 -0
- package/dist/modules/engine/clip/clip.d.ts +12 -0
- package/dist/modules/engine/clip/clip.d.ts.map +1 -0
- package/dist/modules/engine/clip/clip.js +129 -0
- package/dist/modules/engine/clip/clip.js.map +1 -0
- package/dist/modules/engine/filter/filter.cjs +111 -0
- package/dist/modules/engine/filter/filter.d.ts +12 -0
- package/dist/modules/engine/filter/filter.d.ts.map +1 -0
- package/dist/modules/engine/filter/filter.js +88 -0
- package/dist/modules/engine/filter/filter.js.map +1 -0
- package/dist/modules/engine/geometry/geometry.cjs +63 -0
- package/dist/modules/engine/geometry/geometry.d.ts +9 -0
- package/dist/modules/engine/geometry/geometry.d.ts.map +1 -0
- package/dist/modules/engine/geometry/geometry.js +42 -0
- package/dist/modules/engine/geometry/geometry.js.map +1 -0
- package/dist/modules/engine/gpu-animation/gpu-animation.cjs +255 -0
- package/dist/modules/engine/gpu-animation/gpu-animation.d.ts +34 -0
- package/dist/modules/engine/gpu-animation/gpu-animation.d.ts.map +1 -0
- package/dist/modules/engine/gpu-animation/gpu-animation.js +228 -0
- package/dist/modules/engine/gpu-animation/gpu-animation.js.map +1 -0
- package/dist/modules/engine/picking/picking.cjs +210 -0
- package/dist/modules/engine/picking/picking.d.ts +77 -0
- package/dist/modules/engine/picking/picking.d.ts.map +1 -0
- package/dist/modules/engine/picking/picking.js +198 -0
- package/dist/modules/engine/picking/picking.js.map +1 -0
- package/dist/modules/engine/project/project.cjs +138 -0
- package/dist/modules/engine/project/project.d.ts +39 -0
- package/dist/modules/engine/project/project.d.ts.map +1 -0
- package/dist/modules/engine/project/project.js +129 -0
- package/dist/modules/engine/project/project.js.map +1 -0
- package/dist/modules/engine/skin/skin.cjs +212 -0
- package/dist/modules/engine/skin/skin.d.ts +52 -0
- package/dist/modules/engine/skin/skin.d.ts.map +1 -0
- package/dist/modules/engine/skin/skin.js +179 -0
- package/dist/modules/engine/skin/skin.js.map +1 -0
- package/dist/modules/engine/transform/transform.cjs +72 -0
- package/dist/modules/engine/transform/transform.d.ts +6 -0
- package/dist/modules/engine/transform/transform.d.ts.map +1 -0
- package/dist/modules/engine/transform/transform.js +49 -0
- package/dist/modules/engine/transform/transform.js.map +1 -0
- package/dist/modules/geometry/path-dash/path-dash.cjs +93 -0
- package/dist/modules/geometry/path-dash/path-dash.d.ts +10 -0
- package/dist/modules/geometry/path-dash/path-dash.d.ts.map +1 -0
- package/dist/modules/geometry/path-dash/path-dash.js +66 -0
- package/dist/modules/geometry/path-dash/path-dash.js.map +1 -0
- package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.cjs +117 -0
- package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.d.ts +3 -0
- package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.d.ts.map +1 -0
- package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.js +87 -0
- package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.js.map +1 -0
- package/dist/modules/geometry/pattern-fill/pattern-fill.cjs +64 -0
- package/dist/modules/geometry/pattern-fill/pattern-fill.d.ts +14 -0
- package/dist/modules/geometry/pattern-fill/pattern-fill.d.ts.map +1 -0
- package/dist/modules/geometry/pattern-fill/pattern-fill.js +43 -0
- package/dist/modules/geometry/pattern-fill/pattern-fill.js.map +1 -0
- package/dist/modules/geometry/point-glow/point-glow.cjs +104 -0
- package/dist/modules/geometry/point-glow/point-glow.d.ts +11 -0
- package/dist/modules/geometry/point-glow/point-glow.d.ts.map +1 -0
- package/dist/modules/geometry/point-glow/point-glow.js +77 -0
- package/dist/modules/geometry/point-glow/point-glow.js.map +1 -0
- package/dist/modules/geometry/precipitation/precipitation.cjs +122 -0
- package/dist/modules/geometry/precipitation/precipitation.d.ts +40 -0
- package/dist/modules/geometry/precipitation/precipitation.d.ts.map +1 -0
- package/dist/modules/geometry/precipitation/precipitation.js +95 -0
- package/dist/modules/geometry/precipitation/precipitation.js.map +1 -0
- package/dist/modules/geometry/sketch-stroke/sketch-stroke.cjs +158 -0
- package/dist/modules/geometry/sketch-stroke/sketch-stroke.d.ts +60 -0
- package/dist/modules/geometry/sketch-stroke/sketch-stroke.d.ts.map +1 -0
- package/dist/modules/geometry/sketch-stroke/sketch-stroke.js +137 -0
- package/dist/modules/geometry/sketch-stroke/sketch-stroke.js.map +1 -0
- package/dist/modules/geospatial/dggs/dggs-wgsl.cjs +2304 -0
- package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts +3 -0
- package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts.map +1 -0
- package/dist/modules/geospatial/dggs/dggs-wgsl.js +2283 -0
- package/dist/modules/geospatial/dggs/dggs-wgsl.js.map +1 -0
- package/dist/modules/geospatial/dggs/dggs.cjs +31 -0
- package/dist/modules/geospatial/dggs/dggs.d.ts +6 -0
- package/dist/modules/geospatial/dggs/dggs.d.ts.map +1 -0
- package/dist/modules/geospatial/dggs/dggs.js +10 -0
- package/dist/modules/geospatial/dggs/dggs.js.map +1 -0
- package/dist/modules/lighting/area-lighting/area-light-types.cjs +68 -0
- package/dist/modules/lighting/area-lighting/area-light-types.d.ts +34 -0
- package/dist/modules/lighting/area-lighting/area-light-types.d.ts.map +1 -0
- package/dist/modules/lighting/area-lighting/area-light-types.js +40 -0
- package/dist/modules/lighting/area-lighting/area-light-types.js.map +1 -0
- package/dist/modules/lighting/area-lighting/area-lighting-shaders.cjs +101 -0
- package/dist/modules/lighting/area-lighting/area-lighting-shaders.d.ts +3 -0
- package/dist/modules/lighting/area-lighting/area-lighting-shaders.d.ts.map +1 -0
- package/dist/modules/lighting/area-lighting/area-lighting-shaders.js +71 -0
- package/dist/modules/lighting/area-lighting/area-lighting-shaders.js.map +1 -0
- package/dist/modules/lighting/area-lighting/area-lighting.cjs +62 -0
- package/dist/modules/lighting/area-lighting/area-lighting.d.ts +89 -0
- package/dist/modules/lighting/area-lighting/area-lighting.d.ts.map +1 -0
- package/dist/modules/lighting/area-lighting/area-lighting.js +41 -0
- package/dist/modules/lighting/area-lighting/area-lighting.js.map +1 -0
- package/dist/modules/lighting/area-lighting/ltc-shaders.cjs +192 -0
- package/dist/modules/lighting/area-lighting/ltc-shaders.d.ts +3 -0
- package/dist/modules/lighting/area-lighting/ltc-shaders.d.ts.map +1 -0
- package/dist/modules/lighting/area-lighting/ltc-shaders.js +162 -0
- package/dist/modules/lighting/area-lighting/ltc-shaders.js.map +1 -0
- package/dist/modules/lighting/atmosphere/atmosphere.cjs +253 -0
- package/dist/modules/lighting/atmosphere/atmosphere.d.ts +45 -0
- package/dist/modules/lighting/atmosphere/atmosphere.d.ts.map +1 -0
- package/dist/modules/lighting/atmosphere/atmosphere.js +228 -0
- package/dist/modules/lighting/atmosphere/atmosphere.js.map +1 -0
- package/dist/modules/lighting/clouds/clouds.cjs +216 -0
- package/dist/modules/lighting/clouds/clouds.d.ts +58 -0
- package/dist/modules/lighting/clouds/clouds.d.ts.map +1 -0
- package/dist/modules/lighting/clouds/clouds.js +192 -0
- package/dist/modules/lighting/clouds/clouds.js.map +1 -0
- package/dist/modules/lighting/firefly/firefly.cjs +74 -0
- package/dist/modules/lighting/firefly/firefly.d.ts +36 -0
- package/dist/modules/lighting/firefly/firefly.d.ts.map +1 -0
- package/dist/modules/lighting/firefly/firefly.js +53 -0
- package/dist/modules/lighting/firefly/firefly.js.map +1 -0
- package/dist/modules/lighting/globe-clouds/globe-clouds.cjs +143 -0
- package/dist/modules/lighting/globe-clouds/globe-clouds.d.ts +53 -0
- package/dist/modules/lighting/globe-clouds/globe-clouds.d.ts.map +1 -0
- package/dist/modules/lighting/globe-clouds/globe-clouds.js +119 -0
- package/dist/modules/lighting/globe-clouds/globe-clouds.js.map +1 -0
- package/dist/modules/lighting/gouraud-material/gouraud-material.cjs +61 -0
- package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts +12 -0
- package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts.map +1 -0
- package/dist/modules/lighting/gouraud-material/gouraud-material.js +40 -0
- package/dist/modules/lighting/gouraud-material/gouraud-material.js.map +1 -0
- package/dist/modules/lighting/height-fog/height-fog-functions.cjs +139 -0
- package/dist/modules/lighting/height-fog/height-fog-functions.d.ts +14 -0
- package/dist/modules/lighting/height-fog/height-fog-functions.d.ts.map +1 -0
- package/dist/modules/lighting/height-fog/height-fog-functions.js +114 -0
- package/dist/modules/lighting/height-fog/height-fog-functions.js.map +1 -0
- package/dist/modules/lighting/height-fog/height-fog.cjs +104 -0
- package/dist/modules/lighting/height-fog/height-fog.d.ts +60 -0
- package/dist/modules/lighting/height-fog/height-fog.d.ts.map +1 -0
- package/dist/modules/lighting/height-fog/height-fog.js +77 -0
- package/dist/modules/lighting/height-fog/height-fog.js.map +1 -0
- package/dist/modules/lighting/ibl/ibl.cjs +63 -0
- package/dist/modules/lighting/ibl/ibl.d.ts +25 -0
- package/dist/modules/lighting/ibl/ibl.d.ts.map +1 -0
- package/dist/modules/lighting/ibl/ibl.js +33 -0
- package/dist/modules/lighting/ibl/ibl.js.map +1 -0
- package/dist/modules/lighting/lambert-material/lambert-material.cjs +54 -0
- package/dist/modules/lighting/lambert-material/lambert-material.d.ts +10 -0
- package/dist/modules/lighting/lambert-material/lambert-material.d.ts.map +1 -0
- package/dist/modules/lighting/lambert-material/lambert-material.js +33 -0
- package/dist/modules/lighting/lambert-material/lambert-material.js.map +1 -0
- package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.cjs +88 -0
- package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.d.ts +3 -0
- package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.d.ts.map +1 -0
- package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.js +60 -0
- package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.js.map +1 -0
- package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.cjs +97 -0
- package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.d.ts +2 -0
- package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.d.ts.map +1 -0
- package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.js +73 -0
- package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.js.map +1 -0
- package/dist/modules/lighting/lights/lighting-glsl.cjs +116 -0
- package/dist/modules/lighting/lights/lighting-glsl.d.ts +2 -0
- package/dist/modules/lighting/lights/lighting-glsl.d.ts.map +1 -0
- package/dist/modules/lighting/lights/lighting-glsl.js +92 -0
- package/dist/modules/lighting/lights/lighting-glsl.js.map +1 -0
- package/dist/modules/lighting/lights/lighting-wgsl.cjs +115 -0
- package/dist/modules/lighting/lights/lighting-wgsl.d.ts +2 -0
- package/dist/modules/lighting/lights/lighting-wgsl.d.ts.map +1 -0
- package/dist/modules/lighting/lights/lighting-wgsl.js +91 -0
- package/dist/modules/lighting/lights/lighting-wgsl.js.map +1 -0
- package/dist/modules/lighting/lights/lighting.cjs +210 -0
- package/dist/modules/lighting/lights/lighting.d.ts +163 -0
- package/dist/modules/lighting/lights/lighting.d.ts.map +1 -0
- package/dist/modules/lighting/lights/lighting.js +208 -0
- package/dist/modules/lighting/lights/lighting.js.map +1 -0
- package/dist/modules/lighting/no-material/dirlight.cjs +112 -0
- package/dist/modules/lighting/no-material/dirlight.d.ts +33 -0
- package/dist/modules/lighting/no-material/dirlight.d.ts.map +1 -0
- package/dist/modules/lighting/no-material/dirlight.js +86 -0
- package/dist/modules/lighting/no-material/dirlight.js.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-material-glsl.cjs +1767 -0
- package/dist/modules/lighting/pbr-material/pbr-material-glsl.d.ts +3 -0
- package/dist/modules/lighting/pbr-material/pbr-material-glsl.d.ts.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-material-glsl.js +1745 -0
- package/dist/modules/lighting/pbr-material/pbr-material-glsl.js.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-material-wgsl.cjs +2062 -0
- package/dist/modules/lighting/pbr-material/pbr-material-wgsl.d.ts +3 -0
- package/dist/modules/lighting/pbr-material/pbr-material-wgsl.d.ts.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-material-wgsl.js +2040 -0
- package/dist/modules/lighting/pbr-material/pbr-material-wgsl.js.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-material.cjs +315 -0
- package/dist/modules/lighting/pbr-material/pbr-material.d.ts +516 -0
- package/dist/modules/lighting/pbr-material/pbr-material.d.ts.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-material.js +292 -0
- package/dist/modules/lighting/pbr-material/pbr-material.js.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-projection.cjs +63 -0
- package/dist/modules/lighting/pbr-material/pbr-projection.d.ts +10 -0
- package/dist/modules/lighting/pbr-material/pbr-projection.d.ts.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-projection.js +37 -0
- package/dist/modules/lighting/pbr-material/pbr-projection.js.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-scene.cjs +109 -0
- package/dist/modules/lighting/pbr-material/pbr-scene.d.ts +52 -0
- package/dist/modules/lighting/pbr-material/pbr-scene.d.ts.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-scene.js +83 -0
- package/dist/modules/lighting/pbr-material/pbr-scene.js.map +1 -0
- package/dist/modules/lighting/phong-material/phong-material.cjs +61 -0
- package/dist/modules/lighting/phong-material/phong-material.d.ts +13 -0
- package/dist/modules/lighting/phong-material/phong-material.d.ts.map +1 -0
- package/dist/modules/lighting/phong-material/phong-material.js +40 -0
- package/dist/modules/lighting/phong-material/phong-material.js.map +1 -0
- package/dist/modules/lighting/phong-material/phong-shaders-glsl.cjs +100 -0
- package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts +3 -0
- package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts.map +1 -0
- package/dist/modules/lighting/phong-material/phong-shaders-glsl.js +72 -0
- package/dist/modules/lighting/phong-material/phong-shaders-glsl.js.map +1 -0
- package/dist/modules/lighting/phong-material/phong-shaders-wgsl.cjs +153 -0
- package/dist/modules/lighting/phong-material/phong-shaders-wgsl.d.ts +2 -0
- package/dist/modules/lighting/phong-material/phong-shaders-wgsl.d.ts.map +1 -0
- package/dist/modules/lighting/phong-material/phong-shaders-wgsl.js +129 -0
- package/dist/modules/lighting/phong-material/phong-shaders-wgsl.js.map +1 -0
- package/dist/modules/lighting/surface-weather/surface-weather.cjs +199 -0
- package/dist/modules/lighting/surface-weather/surface-weather.d.ts +54 -0
- package/dist/modules/lighting/surface-weather/surface-weather.d.ts.map +1 -0
- package/dist/modules/lighting/surface-weather/surface-weather.js +175 -0
- package/dist/modules/lighting/surface-weather/surface-weather.js.map +1 -0
- package/dist/modules/lighting/water-material/river-water-material.cjs +56 -0
- package/dist/modules/lighting/water-material/river-water-material.d.ts +21 -0
- package/dist/modules/lighting/water-material/river-water-material.d.ts.map +1 -0
- package/dist/modules/lighting/water-material/river-water-material.js +36 -0
- package/dist/modules/lighting/water-material/river-water-material.js.map +1 -0
- package/dist/modules/lighting/water-material/river-water-shaders.cjs +261 -0
- package/dist/modules/lighting/water-material/river-water-shaders.d.ts +3 -0
- package/dist/modules/lighting/water-material/river-water-shaders.d.ts.map +1 -0
- package/dist/modules/lighting/water-material/river-water-shaders.js +233 -0
- package/dist/modules/lighting/water-material/river-water-shaders.js.map +1 -0
- package/dist/modules/lighting/water-material/water-material.cjs +188 -0
- package/dist/modules/lighting/water-material/water-material.d.ts +28 -0
- package/dist/modules/lighting/water-material/water-material.d.ts.map +1 -0
- package/dist/modules/lighting/water-material/water-material.js +179 -0
- package/dist/modules/lighting/water-material/water-material.js.map +1 -0
- package/dist/modules/lighting/water-material/water-shaders-glsl.cjs +260 -0
- package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts +3 -0
- package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts.map +1 -0
- package/dist/modules/lighting/water-material/water-shaders-glsl.js +232 -0
- package/dist/modules/lighting/water-material/water-shaders-glsl.js.map +1 -0
- package/dist/modules/lighting/water-material/water-shaders-wgsl.cjs +254 -0
- package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts +2 -0
- package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts.map +1 -0
- package/dist/modules/lighting/water-material/water-shaders-wgsl.js +230 -0
- package/dist/modules/lighting/water-material/water-shaders-wgsl.js.map +1 -0
- package/dist/modules/math/fp16/fp16-utils.cjs +112 -0
- package/dist/modules/math/fp16/fp16-utils.d.ts +13 -0
- package/dist/modules/math/fp16/fp16-utils.d.ts.map +1 -0
- package/dist/modules/math/fp16/fp16-utils.js +118 -0
- package/dist/modules/math/fp16/fp16-utils.js.map +1 -0
- package/dist/modules/math/fp32/fp32.cjs +310 -0
- package/dist/modules/math/fp32/fp32.d.ts +9 -0
- package/dist/modules/math/fp32/fp32.d.ts.map +1 -0
- package/dist/modules/math/fp32/fp32.js +288 -0
- package/dist/modules/math/fp32/fp32.js.map +1 -0
- package/dist/modules/math/fp64/fp64-arithmetic-glsl.cjs +229 -0
- package/dist/modules/math/fp64/fp64-arithmetic-glsl.d.ts +2 -0
- package/dist/modules/math/fp64/fp64-arithmetic-glsl.d.ts.map +1 -0
- package/dist/modules/math/fp64/fp64-arithmetic-glsl.js +205 -0
- package/dist/modules/math/fp64/fp64-arithmetic-glsl.js.map +1 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.cjs +144 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.d.ts +10 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.d.ts.map +1 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.js +128 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.js.map +1 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.cjs +583 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.d.ts +11 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.d.ts.map +1 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.js +563 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.js.map +1 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl.cjs +946 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts +3 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts.map +1 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js +923 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js.map +1 -0
- package/dist/modules/math/fp64/fp64-functions-glsl.cjs +699 -0
- package/dist/modules/math/fp64/fp64-functions-glsl.d.ts +2 -0
- package/dist/modules/math/fp64/fp64-functions-glsl.d.ts.map +1 -0
- package/dist/modules/math/fp64/fp64-functions-glsl.js +675 -0
- package/dist/modules/math/fp64/fp64-functions-glsl.js.map +1 -0
- package/dist/modules/math/fp64/fp64-functions-wgsl.cjs +180 -0
- package/dist/modules/math/fp64/fp64-functions-wgsl.d.ts +3 -0
- package/dist/modules/math/fp64/fp64-functions-wgsl.d.ts.map +1 -0
- package/dist/modules/math/fp64/fp64-functions-wgsl.js +157 -0
- package/dist/modules/math/fp64/fp64-functions-wgsl.js.map +1 -0
- package/dist/modules/math/fp64/fp64-utils.cjs +50 -0
- package/dist/modules/math/fp64/fp64-utils.d.ts +22 -0
- package/dist/modules/math/fp64/fp64-utils.d.ts.map +1 -0
- package/dist/modules/math/fp64/fp64-utils.js +42 -0
- package/dist/modules/math/fp64/fp64-utils.js.map +1 -0
- package/dist/modules/math/fp64/fp64.cjs +68 -0
- package/dist/modules/math/fp64/fp64.d.ts +24 -0
- package/dist/modules/math/fp64/fp64.d.ts.map +1 -0
- package/dist/modules/math/fp64/fp64.js +46 -0
- package/dist/modules/math/fp64/fp64.js.map +1 -0
- package/dist/modules/math/random/random.cjs +46 -0
- package/dist/modules/math/random/random.d.ts +7 -0
- package/dist/modules/math/random/random.d.ts.map +1 -0
- package/dist/modules/math/random/random.js +21 -0
- package/dist/modules/math/random/random.js.map +1 -0
- package/dist/modules/math/value-noise/value-noise.cjs +95 -0
- package/dist/modules/math/value-noise/value-noise.d.ts +7 -0
- package/dist/modules/math/value-noise/value-noise.d.ts.map +1 -0
- package/dist/modules/math/value-noise/value-noise.js +68 -0
- package/dist/modules/math/value-noise/value-noise.js.map +1 -0
- package/dist/modules/volume/volume-raymarch.cjs +107 -0
- package/dist/modules/volume/volume-raymarch.d.ts +6 -0
- package/dist/modules/volume/volume-raymarch.d.ts.map +1 -0
- package/dist/modules/volume/volume-raymarch.js +84 -0
- package/dist/modules/volume/volume-raymarch.js.map +1 -0
- package/dist/types/align-to.cjs +38 -0
- package/dist/types/align-to.d.ts +3 -0
- package/dist/types/align-to.d.ts.map +1 -0
- package/dist/types/align-to.js +13 -0
- package/dist/types/align-to.js.map +1 -0
- package/dist/types/primitive-data-types.cjs +15 -0
- package/dist/types/primitive-data-types.d.ts +7 -0
- package/dist/types/primitive-data-types.d.ts.map +1 -0
- package/dist/types/primitive-data-types.js +5 -0
- package/dist/types/primitive-data-types.js.map +1 -0
- package/dist/types/sampler-props.cjs +15 -0
- package/dist/types/sampler-props.d.ts +26 -0
- package/dist/types/sampler-props.d.ts.map +1 -0
- package/dist/types/sampler-props.js +5 -0
- package/dist/types/sampler-props.js.map +1 -0
- package/dist/types/shader-block-layout.cjs +184 -0
- package/dist/types/shader-block-layout.d.ts +72 -0
- package/dist/types/shader-block-layout.d.ts.map +1 -0
- package/dist/types/shader-block-layout.js +209 -0
- package/dist/types/shader-block-layout.js.map +1 -0
- package/dist/types/shader-layout.cjs +15 -0
- package/dist/types/shader-layout.d.ts +178 -0
- package/dist/types/shader-layout.d.ts.map +1 -0
- package/dist/types/shader-layout.js +5 -0
- package/dist/types/shader-layout.js.map +1 -0
- package/dist/types/shader-type-decoder.cjs +240 -0
- package/dist/types/shader-type-decoder.d.ts +41 -0
- package/dist/types/shader-type-decoder.d.ts.map +1 -0
- package/dist/types/shader-type-decoder.js +210 -0
- package/dist/types/shader-type-decoder.js.map +1 -0
- package/dist/types/shader-types.cjs +15 -0
- package/dist/types/shader-types.d.ts +101 -0
- package/dist/types/shader-types.d.ts.map +1 -0
- package/dist/types/shader-types.js +30 -0
- package/dist/types/shader-types.js.map +1 -0
- package/dist/types/texture-formats.cjs +15 -0
- package/dist/types/texture-formats.d.ts +24 -0
- package/dist/types/texture-formats.d.ts.map +1 -0
- package/dist/types/texture-formats.js +5 -0
- package/dist/types/texture-formats.js.map +1 -0
- package/dist/types.cjs +42 -0
- package/dist/types.cjs.map +6 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/wgsl.cjs +39 -0
- package/dist/wgsl.cjs.map +6 -0
- package/dist/wgsl.d.ts +8 -0
- package/dist/wgsl.d.ts.map +1 -0
- package/dist/wgsl.js +9 -0
- package/dist/wgsl.js.map +1 -0
- package/package.json +65 -4
- package/src/glsl.ts +13 -0
- package/src/index.ts +259 -0
- package/src/lib/color/normalize-byte-colors.ts +57 -0
- package/src/lib/filters/prop-types.ts +150 -0
- package/src/lib/glsl-shader-assembler.ts +39 -0
- package/src/lib/glsl-utils/get-shader-info.ts +42 -0
- package/src/lib/glsl-utils/shader-utils.ts +110 -0
- package/src/lib/preprocessor/preprocessor.ts +132 -0
- package/src/lib/shader-assembler-base.ts +170 -0
- package/src/lib/shader-assembler.ts +7 -0
- package/src/lib/shader-assembly/assemble-glsl-shaders.ts +305 -0
- package/src/lib/shader-assembly/assemble-shaders.ts +13 -0
- package/src/lib/shader-assembly/assemble-wgsl-shaders.ts +801 -0
- package/src/lib/shader-assembly/platform-defines.ts +58 -0
- package/src/lib/shader-assembly/platform-info.ts +23 -0
- package/src/lib/shader-assembly/shader-assembly-shared.ts +95 -0
- package/src/lib/shader-assembly/shader-assembly-types.ts +142 -0
- package/src/lib/shader-assembly/shader-hooks.ts +141 -0
- package/src/lib/shader-assembly/shader-injections.ts +250 -0
- package/src/lib/shader-assembly/shader-plugin-varyings.ts +524 -0
- package/src/lib/shader-assembly/shader-plugin-vertex-inputs.ts +279 -0
- package/src/lib/shader-assembly/wgsl-binding-debug.ts +227 -0
- package/src/lib/shader-assembly/wgsl-binding-scan.ts +228 -0
- package/src/lib/shader-assembly/wgsl-interface-scan.ts +676 -0
- package/src/lib/shader-generator/generate-shader.ts +27 -0
- package/src/lib/shader-generator/glsl/generate-glsl.ts +101 -0
- package/src/lib/shader-generator/utils/capitalize.ts +12 -0
- package/src/lib/shader-generator/wgsl/generate-wgsl.ts +40 -0
- package/src/lib/shader-module/composite-shader-pass.ts +47 -0
- package/src/lib/shader-module/shader-module-dependencies.ts +128 -0
- package/src/lib/shader-module/shader-module-uniform-layout.ts +420 -0
- package/src/lib/shader-module/shader-module.ts +244 -0
- package/src/lib/shader-module/shader-pass.ts +69 -0
- package/src/lib/shader-plugin.ts +214 -0
- package/src/lib/shader-transpiler/shader-transpiler.ts +34 -0
- package/src/lib/shader-transpiler/transpile-glsl-shader.ts +78 -0
- package/src/lib/utils/assert.ts +13 -0
- package/src/lib/utils/uniform-types.ts +89 -0
- package/src/lib/wgsl-shader-assembler.ts +122 -0
- package/src/module-injectors.ts +32 -0
- package/src/modules/color/float-colors.ts +334 -0
- package/src/modules/engine/clip/clip.ts +149 -0
- package/src/modules/engine/filter/filter.ts +107 -0
- package/src/modules/engine/geometry/geometry.ts +45 -0
- package/src/modules/engine/gpu-animation/gpu-animation.ts +244 -0
- package/src/modules/engine/picking/README.md +88 -0
- package/src/modules/engine/picking/picking.ts +252 -0
- package/src/modules/engine/project/project.ts +166 -0
- package/src/modules/engine/skin/skin.ts +233 -0
- package/src/modules/engine/transform/transform.ts +50 -0
- package/src/modules/geometry/path-dash/path-dash.ts +68 -0
- package/src/modules/geometry/pattern-fill/pattern-fill-shaders.ts +88 -0
- package/src/modules/geometry/pattern-fill/pattern-fill.ts +54 -0
- package/src/modules/geometry/point-glow/point-glow.ts +87 -0
- package/src/modules/geometry/precipitation/README.md +19 -0
- package/src/modules/geometry/precipitation/precipitation.ts +108 -0
- package/src/modules/geometry/sketch-stroke/sketch-stroke.ts +160 -0
- package/src/modules/geospatial/dggs/dggs-wgsl.ts +2284 -0
- package/src/modules/geospatial/dggs/dggs.ts +12 -0
- package/src/modules/lighting/area-lighting/area-light-types.ts +71 -0
- package/src/modules/lighting/area-lighting/area-lighting-shaders.ts +72 -0
- package/src/modules/lighting/area-lighting/area-lighting.ts +63 -0
- package/src/modules/lighting/area-lighting/ltc-shaders.ts +163 -0
- package/src/modules/lighting/atmosphere/README.md +25 -0
- package/src/modules/lighting/atmosphere/atmosphere.ts +246 -0
- package/src/modules/lighting/clouds/README.md +24 -0
- package/src/modules/lighting/clouds/clouds.ts +216 -0
- package/src/modules/lighting/firefly/firefly.ts +64 -0
- package/src/modules/lighting/globe-clouds/globe-clouds.ts +124 -0
- package/src/modules/lighting/gouraud-material/gouraud-material.ts +55 -0
- package/src/modules/lighting/height-fog/README.md +36 -0
- package/src/modules/lighting/height-fog/height-fog-functions.ts +116 -0
- package/src/modules/lighting/height-fog/height-fog.ts +96 -0
- package/src/modules/lighting/ibl/ibl.ts +43 -0
- package/src/modules/lighting/lambert-material/lambert-material.ts +42 -0
- package/src/modules/lighting/lambert-material/lambert-shaders-glsl.ts +61 -0
- package/src/modules/lighting/lambert-material/lambert-shaders-wgsl.ts +73 -0
- package/src/modules/lighting/lights/lighting-glsl.ts +92 -0
- package/src/modules/lighting/lights/lighting-wgsl.ts +91 -0
- package/src/modules/lighting/lights/lighting.ts +385 -0
- package/src/modules/lighting/no-material/dirlight.ts +101 -0
- package/src/modules/lighting/pbr-material/pbr-material-glsl.ts +1748 -0
- package/src/modules/lighting/pbr-material/pbr-material-wgsl.ts +2043 -0
- package/src/modules/lighting/pbr-material/pbr-material.ts +517 -0
- package/src/modules/lighting/pbr-material/pbr-projection.ts +50 -0
- package/src/modules/lighting/pbr-material/pbr-scene.ts +112 -0
- package/src/modules/lighting/phong-material/phong-material.ts +53 -0
- package/src/modules/lighting/phong-material/phong-shaders-glsl.ts +73 -0
- package/src/modules/lighting/phong-material/phong-shaders-wgsl.ts +129 -0
- package/src/modules/lighting/surface-weather/README.md +28 -0
- package/src/modules/lighting/surface-weather/surface-weather.ts +198 -0
- package/src/modules/lighting/water-material/river-water-material.ts +58 -0
- package/src/modules/lighting/water-material/river-water-shaders.ts +234 -0
- package/src/modules/lighting/water-material/water-material.ts +234 -0
- package/src/modules/lighting/water-material/water-shaders-glsl.ts +233 -0
- package/src/modules/lighting/water-material/water-shaders-wgsl.ts +230 -0
- package/src/modules/math/fp16/fp16-utils.ts +156 -0
- package/src/modules/math/fp32/fp32.ts +291 -0
- package/src/modules/math/fp64/fp64-arithmetic-glsl.ts +205 -0
- package/src/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.ts +129 -0
- package/src/modules/math/fp64/fp64-arithmetic-wgsl-integer.ts +564 -0
- package/src/modules/math/fp64/fp64-arithmetic-wgsl.ts +924 -0
- package/src/modules/math/fp64/fp64-functions-glsl.ts +675 -0
- package/src/modules/math/fp64/fp64-functions-wgsl.ts +157 -0
- package/src/modules/math/fp64/fp64-utils.ts +46 -0
- package/src/modules/math/fp64/fp64.ts +64 -0
- package/src/modules/math/random/random.ts +25 -0
- package/src/modules/math/value-noise/value-noise.ts +70 -0
- package/src/modules/volume/volume-raymarch.ts +87 -0
- package/src/types/align-to.ts +13 -0
- package/src/types/primitive-data-types.ts +10 -0
- package/src/types/sampler-props.ts +39 -0
- package/src/types/shader-block-layout.ts +340 -0
- package/src/types/shader-layout.ts +208 -0
- package/src/types/shader-type-decoder.ts +285 -0
- package/src/types/shader-types.ts +207 -0
- package/src/types/texture-formats.ts +155 -0
- package/src/types.ts +48 -0
- package/src/wgsl.ts +23 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimizer-independent double-single arithmetic for WGSL implementations that
|
|
3
|
+
* cannot preserve the rounding points required by the classic floating-point
|
|
4
|
+
* error-free transforms.
|
|
5
|
+
*
|
|
6
|
+
* This source is interpolated into fp64-arithmetic-wgsl.ts after the shared
|
|
7
|
+
* integer helpers. It intentionally keeps the public vec2<f32> API unchanged.
|
|
8
|
+
*/
|
|
9
|
+
export declare const fp64arithmeticWGSLIntegerPrimitives = "struct Fp64F32Bits {\n sign: u32,\n baseExponent: i32,\n significand: u32,\n isZero: bool,\n isInf: bool,\n isNan: bool,\n};\n\n// Decode an f32 as (-1)^sign * significand * 2^baseExponent.\nfn fp64_decode_f32_bits(bits: u32) -> Fp64F32Bits {\n let sign = bits >> 31u;\n let exponentBits = (bits >> 23u) & 0xffu;\n let fraction = bits & 0x7fffffu;\n\n if (exponentBits == 0xffu) {\n return Fp64F32Bits(sign, 0, 0u, false, fraction == 0u, fraction != 0u);\n }\n if (exponentBits == 0u) {\n return Fp64F32Bits(sign, -149, fraction, fraction == 0u, false, false);\n }\n return Fp64F32Bits(sign, i32(exponentBits) - 150, 0x800000u | fraction, false, false, false);\n}\n\nfn fp64_f32_magnitude_compare(aBits: u32, bBits: u32) -> i32 {\n let aMagnitude = aBits & 0x7fffffffu;\n let bMagnitude = bBits & 0x7fffffffu;\n if (aMagnitude == bMagnitude) {\n return 0;\n }\n return select(-1, 1, aMagnitude > bMagnitude);\n}\n\nfn fp64_make_residual_f32_bits(\n exactSign: u32,\n exactMagnitude: vec2u,\n exactBaseExponent: i32,\n highBits: u32\n) -> u32 {\n if (fp64_u64_is_zero(exactMagnitude)) {\n return 0u;\n }\n\n let high = fp64_decode_f32_bits(highBits);\n if (high.isInf || high.isNan) {\n return exactSign << 31u;\n }\n if (high.isZero) {\n return fp64_make_f32_bits_from_u64(exactSign, exactMagnitude, exactBaseExponent);\n }\n\n let commonBaseExponent = min(exactBaseExponent, high.baseExponent);\n let exactShift = exactBaseExponent - commonBaseExponent;\n let highShift = high.baseExponent - commonBaseExponent;\n\n // A normal two-sum/two-product residual never needs a shift this large.\n // This guard gives deterministic underflow behavior outside that contract.\n if (exactShift >= 64 || highShift >= 64) {\n return exactSign << 31u;\n }\n\n let exactAligned = fp64_u64_shift_left(exactMagnitude, u32(exactShift));\n let highAligned = fp64_u64_shift_left(vec2u(0u, high.significand), u32(highShift));\n let comparison = fp64_u64_compare(exactAligned, highAligned);\n if (comparison == 0) {\n return 0u;\n }\n\n var residualSign = exactSign;\n var residualMagnitude: vec2u;\n if (comparison > 0) {\n residualMagnitude = fp64_u64_sub(exactAligned, highAligned);\n } else {\n residualSign = exactSign ^ 1u;\n residualMagnitude = fp64_u64_sub(highAligned, exactAligned);\n }\n return fp64_make_f32_bits_from_u64(\n residualSign,\n residualMagnitude,\n commonBaseExponent\n );\n}\n\nfn fp64_split_accumulator_bits(\n sign: u32,\n magnitude: vec2u,\n baseExponent: i32\n) -> vec2u {\n let highBits = fp64_make_f32_bits_from_u64(sign, magnitude, baseExponent);\n let lowBits = fp64_make_residual_f32_bits(sign, magnitude, baseExponent, highBits);\n return vec2u(highBits, lowBits);\n}\n\nfn fp64_two_sum_integer_bits(aBits: u32, bBits: u32) -> vec2u {\n let a = fp64_decode_f32_bits(aBits);\n let b = fp64_decode_f32_bits(bBits);\n\n if (a.isNan || b.isNan) {\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf || b.isInf) {\n if (a.isInf && b.isInf && a.sign != b.sign) {\n return vec2u(0x7fc00000u, 0u);\n }\n return select(vec2u(bBits, 0u), vec2u(aBits, 0u), a.isInf);\n }\n if (a.isZero && b.isZero) {\n return vec2u((a.sign & b.sign) << 31u, 0u);\n }\n if (a.isZero) {\n return vec2u(bBits, 0u);\n }\n if (b.isZero) {\n return vec2u(aBits, 0u);\n }\n\n let exponentDifference = select(\n b.baseExponent - a.baseExponent,\n a.baseExponent - b.baseExponent,\n a.baseExponent >= b.baseExponent\n );\n\n // Beyond half an ulp, rounding cannot change the larger operand. Returning\n // the smaller operand intact also avoids an unbounded integer alignment.\n // At a power-of-two boundary the spacing below the larger operand is half\n // the spacing above it, so an opposite-sign gap-25 operand can still change\n // the rounded high limb. Gap 26 is the first universally safe early-out.\n if (exponentDifference > 25) {\n if (fp64_f32_magnitude_compare(aBits, bBits) >= 0) {\n return vec2u(aBits, bBits);\n }\n return vec2u(bBits, aBits);\n }\n\n let commonBaseExponent = min(a.baseExponent, b.baseExponent);\n let aMagnitude = fp64_u64_shift_left(\n vec2u(0u, a.significand),\n u32(a.baseExponent - commonBaseExponent)\n );\n let bMagnitude = fp64_u64_shift_left(\n vec2u(0u, b.significand),\n u32(b.baseExponent - commonBaseExponent)\n );\n\n var resultSign = a.sign;\n var resultMagnitude: vec2u;\n if (a.sign == b.sign) {\n resultMagnitude = fp64_u64_add(aMagnitude, bMagnitude);\n } else {\n let comparison = fp64_u64_compare(aMagnitude, bMagnitude);\n if (comparison == 0) {\n return vec2u(0u, 0u);\n }\n if (comparison > 0) {\n resultMagnitude = fp64_u64_sub(aMagnitude, bMagnitude);\n } else {\n resultSign = b.sign;\n resultMagnitude = fp64_u64_sub(bMagnitude, aMagnitude);\n }\n }\n\n return fp64_split_accumulator_bits(resultSign, resultMagnitude, commonBaseExponent);\n}\n\nfn fp64_two_sum_integer(a: f32, b: f32) -> vec2f {\n let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bitcast<u32>(b));\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn fp64_multiply_significands(a: u32, b: u32) -> vec2u {\n let aLow = a & 0xffffu;\n let aHigh = a >> 16u;\n let bLow = b & 0xffffu;\n let bHigh = b >> 16u;\n let lowProduct = aLow * bLow;\n let crossProduct = aLow * bHigh + aHigh * bLow;\n let highProduct = aHigh * bHigh;\n\n var result = vec2u(0u, lowProduct);\n result = fp64_u64_add(\n result,\n fp64_u64_shift_left(vec2u(0u, crossProduct), 16u)\n );\n result = fp64_u64_add(result, vec2u(highProduct, 0u));\n return result;\n}\n\nfn fp64_two_prod_integer_bits(aBits: u32, bBits: u32) -> vec2u {\n let a = fp64_decode_f32_bits(aBits);\n let b = fp64_decode_f32_bits(bBits);\n let resultSign = a.sign ^ b.sign;\n\n if (a.isNan || b.isNan || ((a.isZero || b.isZero) && (a.isInf || b.isInf))) {\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf || b.isInf) {\n return vec2u((resultSign << 31u) | 0x7f800000u, resultSign << 31u);\n }\n if (a.isZero || b.isZero) {\n return vec2u(resultSign << 31u, resultSign << 31u);\n }\n\n let magnitude = fp64_multiply_significands(a.significand, b.significand);\n return fp64_split_accumulator_bits(\n resultSign,\n magnitude,\n a.baseExponent + b.baseExponent\n );\n}\n\nfn fp64_two_prod_integer(a: f32, b: f32) -> vec2f {\n let resultBits = fp64_two_prod_integer_bits(bitcast<u32>(a), bitcast<u32>(b));\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn fp64_round_add_integer(a: f32, b: f32) -> f32 {\n return fp64_two_sum_integer(a, b).x;\n}\n\nfn fp64_round_mul_integer(a: f32, b: f32) -> f32 {\n return fp64_two_prod_integer(a, b).x;\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn fp64_f32_finite_exponent(value: Fp64F32Bits) -> i32 {\n let mostSignificantBit = 31u - countLeadingZeros(value.significand);\n return value.baseExponent + i32(mostSignificantBit);\n}\n\nfn fp64_scale_f32_integer(value: f32, exponent: i32) -> f32 {\n let decoded = fp64_decode_f32_bits(bitcast<u32>(value));\n if (decoded.isZero || decoded.isInf || decoded.isNan) {\n return value;\n }\n let resultBits = fp64_make_f32_bits_from_u64(\n decoded.sign,\n vec2u(0u, decoded.significand),\n decoded.baseExponent + exponent\n );\n return bitcast<f32>(resultBits);\n}\n\n// Divide normalized significands so the hardware operation cannot overflow,\n// underflow, or flush a subnormal result. Reapply the exponent with integer\n// packing, which also produces subnormal correction limbs without relying on\n// floating-point arithmetic to preserve them.\nfn fp64_divide_f32_integer(aValue: f32, bValue: f32) -> f32 {\n let a = fp64_decode_f32_bits(bitcast<u32>(aValue));\n let b = fp64_decode_f32_bits(bitcast<u32>(bValue));\n if (a.isZero || b.isZero || a.isInf || b.isInf || a.isNan || b.isNan) {\n return aValue / bValue;\n }\n\n let aMostSignificantBit = 31u - countLeadingZeros(a.significand);\n let bMostSignificantBit = 31u - countLeadingZeros(b.significand);\n let normalizedABits = fp64_make_f32_bits_from_u64(\n a.sign,\n vec2u(0u, a.significand),\n -i32(aMostSignificantBit)\n );\n let normalizedBBits = fp64_make_f32_bits_from_u64(\n b.sign,\n vec2u(0u, b.significand),\n -i32(bMostSignificantBit)\n );\n let normalizedQuotient = bitcast<f32>(normalizedABits) / bitcast<f32>(normalizedBBits);\n let quotient = fp64_decode_f32_bits(bitcast<u32>(normalizedQuotient));\n let exponentShift =\n a.baseExponent + i32(aMostSignificantBit) -\n b.baseExponent - i32(bMostSignificantBit);\n let quotientBits = fp64_make_f32_bits_from_u64(\n quotient.sign,\n vec2u(0u, quotient.significand),\n quotient.baseExponent + exponentShift\n );\n return bitcast<f32>(quotientBits);\n}\n#endif\n\n";
|
|
10
|
+
export declare const fp64arithmeticWGSLInteger = "struct Fp64F32Bits {\n sign: u32,\n baseExponent: i32,\n significand: u32,\n isZero: bool,\n isInf: bool,\n isNan: bool,\n};\n\n// Decode an f32 as (-1)^sign * significand * 2^baseExponent.\nfn fp64_decode_f32_bits(bits: u32) -> Fp64F32Bits {\n let sign = bits >> 31u;\n let exponentBits = (bits >> 23u) & 0xffu;\n let fraction = bits & 0x7fffffu;\n\n if (exponentBits == 0xffu) {\n return Fp64F32Bits(sign, 0, 0u, false, fraction == 0u, fraction != 0u);\n }\n if (exponentBits == 0u) {\n return Fp64F32Bits(sign, -149, fraction, fraction == 0u, false, false);\n }\n return Fp64F32Bits(sign, i32(exponentBits) - 150, 0x800000u | fraction, false, false, false);\n}\n\nfn fp64_f32_magnitude_compare(aBits: u32, bBits: u32) -> i32 {\n let aMagnitude = aBits & 0x7fffffffu;\n let bMagnitude = bBits & 0x7fffffffu;\n if (aMagnitude == bMagnitude) {\n return 0;\n }\n return select(-1, 1, aMagnitude > bMagnitude);\n}\n\nfn fp64_make_residual_f32_bits(\n exactSign: u32,\n exactMagnitude: vec2u,\n exactBaseExponent: i32,\n highBits: u32\n) -> u32 {\n if (fp64_u64_is_zero(exactMagnitude)) {\n return 0u;\n }\n\n let high = fp64_decode_f32_bits(highBits);\n if (high.isInf || high.isNan) {\n return exactSign << 31u;\n }\n if (high.isZero) {\n return fp64_make_f32_bits_from_u64(exactSign, exactMagnitude, exactBaseExponent);\n }\n\n let commonBaseExponent = min(exactBaseExponent, high.baseExponent);\n let exactShift = exactBaseExponent - commonBaseExponent;\n let highShift = high.baseExponent - commonBaseExponent;\n\n // A normal two-sum/two-product residual never needs a shift this large.\n // This guard gives deterministic underflow behavior outside that contract.\n if (exactShift >= 64 || highShift >= 64) {\n return exactSign << 31u;\n }\n\n let exactAligned = fp64_u64_shift_left(exactMagnitude, u32(exactShift));\n let highAligned = fp64_u64_shift_left(vec2u(0u, high.significand), u32(highShift));\n let comparison = fp64_u64_compare(exactAligned, highAligned);\n if (comparison == 0) {\n return 0u;\n }\n\n var residualSign = exactSign;\n var residualMagnitude: vec2u;\n if (comparison > 0) {\n residualMagnitude = fp64_u64_sub(exactAligned, highAligned);\n } else {\n residualSign = exactSign ^ 1u;\n residualMagnitude = fp64_u64_sub(highAligned, exactAligned);\n }\n return fp64_make_f32_bits_from_u64(\n residualSign,\n residualMagnitude,\n commonBaseExponent\n );\n}\n\nfn fp64_split_accumulator_bits(\n sign: u32,\n magnitude: vec2u,\n baseExponent: i32\n) -> vec2u {\n let highBits = fp64_make_f32_bits_from_u64(sign, magnitude, baseExponent);\n let lowBits = fp64_make_residual_f32_bits(sign, magnitude, baseExponent, highBits);\n return vec2u(highBits, lowBits);\n}\n\nfn fp64_two_sum_integer_bits(aBits: u32, bBits: u32) -> vec2u {\n let a = fp64_decode_f32_bits(aBits);\n let b = fp64_decode_f32_bits(bBits);\n\n if (a.isNan || b.isNan) {\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf || b.isInf) {\n if (a.isInf && b.isInf && a.sign != b.sign) {\n return vec2u(0x7fc00000u, 0u);\n }\n return select(vec2u(bBits, 0u), vec2u(aBits, 0u), a.isInf);\n }\n if (a.isZero && b.isZero) {\n return vec2u((a.sign & b.sign) << 31u, 0u);\n }\n if (a.isZero) {\n return vec2u(bBits, 0u);\n }\n if (b.isZero) {\n return vec2u(aBits, 0u);\n }\n\n let exponentDifference = select(\n b.baseExponent - a.baseExponent,\n a.baseExponent - b.baseExponent,\n a.baseExponent >= b.baseExponent\n );\n\n // Beyond half an ulp, rounding cannot change the larger operand. Returning\n // the smaller operand intact also avoids an unbounded integer alignment.\n // At a power-of-two boundary the spacing below the larger operand is half\n // the spacing above it, so an opposite-sign gap-25 operand can still change\n // the rounded high limb. Gap 26 is the first universally safe early-out.\n if (exponentDifference > 25) {\n if (fp64_f32_magnitude_compare(aBits, bBits) >= 0) {\n return vec2u(aBits, bBits);\n }\n return vec2u(bBits, aBits);\n }\n\n let commonBaseExponent = min(a.baseExponent, b.baseExponent);\n let aMagnitude = fp64_u64_shift_left(\n vec2u(0u, a.significand),\n u32(a.baseExponent - commonBaseExponent)\n );\n let bMagnitude = fp64_u64_shift_left(\n vec2u(0u, b.significand),\n u32(b.baseExponent - commonBaseExponent)\n );\n\n var resultSign = a.sign;\n var resultMagnitude: vec2u;\n if (a.sign == b.sign) {\n resultMagnitude = fp64_u64_add(aMagnitude, bMagnitude);\n } else {\n let comparison = fp64_u64_compare(aMagnitude, bMagnitude);\n if (comparison == 0) {\n return vec2u(0u, 0u);\n }\n if (comparison > 0) {\n resultMagnitude = fp64_u64_sub(aMagnitude, bMagnitude);\n } else {\n resultSign = b.sign;\n resultMagnitude = fp64_u64_sub(bMagnitude, aMagnitude);\n }\n }\n\n return fp64_split_accumulator_bits(resultSign, resultMagnitude, commonBaseExponent);\n}\n\nfn fp64_two_sum_integer(a: f32, b: f32) -> vec2f {\n let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bitcast<u32>(b));\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn fp64_multiply_significands(a: u32, b: u32) -> vec2u {\n let aLow = a & 0xffffu;\n let aHigh = a >> 16u;\n let bLow = b & 0xffffu;\n let bHigh = b >> 16u;\n let lowProduct = aLow * bLow;\n let crossProduct = aLow * bHigh + aHigh * bLow;\n let highProduct = aHigh * bHigh;\n\n var result = vec2u(0u, lowProduct);\n result = fp64_u64_add(\n result,\n fp64_u64_shift_left(vec2u(0u, crossProduct), 16u)\n );\n result = fp64_u64_add(result, vec2u(highProduct, 0u));\n return result;\n}\n\nfn fp64_two_prod_integer_bits(aBits: u32, bBits: u32) -> vec2u {\n let a = fp64_decode_f32_bits(aBits);\n let b = fp64_decode_f32_bits(bBits);\n let resultSign = a.sign ^ b.sign;\n\n if (a.isNan || b.isNan || ((a.isZero || b.isZero) && (a.isInf || b.isInf))) {\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf || b.isInf) {\n return vec2u((resultSign << 31u) | 0x7f800000u, resultSign << 31u);\n }\n if (a.isZero || b.isZero) {\n return vec2u(resultSign << 31u, resultSign << 31u);\n }\n\n let magnitude = fp64_multiply_significands(a.significand, b.significand);\n return fp64_split_accumulator_bits(\n resultSign,\n magnitude,\n a.baseExponent + b.baseExponent\n );\n}\n\nfn fp64_two_prod_integer(a: f32, b: f32) -> vec2f {\n let resultBits = fp64_two_prod_integer_bits(bitcast<u32>(a), bitcast<u32>(b));\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn fp64_round_add_integer(a: f32, b: f32) -> f32 {\n return fp64_two_sum_integer(a, b).x;\n}\n\nfn fp64_round_mul_integer(a: f32, b: f32) -> f32 {\n return fp64_two_prod_integer(a, b).x;\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn fp64_f32_finite_exponent(value: Fp64F32Bits) -> i32 {\n let mostSignificantBit = 31u - countLeadingZeros(value.significand);\n return value.baseExponent + i32(mostSignificantBit);\n}\n\nfn fp64_scale_f32_integer(value: f32, exponent: i32) -> f32 {\n let decoded = fp64_decode_f32_bits(bitcast<u32>(value));\n if (decoded.isZero || decoded.isInf || decoded.isNan) {\n return value;\n }\n let resultBits = fp64_make_f32_bits_from_u64(\n decoded.sign,\n vec2u(0u, decoded.significand),\n decoded.baseExponent + exponent\n );\n return bitcast<f32>(resultBits);\n}\n\n// Divide normalized significands so the hardware operation cannot overflow,\n// underflow, or flush a subnormal result. Reapply the exponent with integer\n// packing, which also produces subnormal correction limbs without relying on\n// floating-point arithmetic to preserve them.\nfn fp64_divide_f32_integer(aValue: f32, bValue: f32) -> f32 {\n let a = fp64_decode_f32_bits(bitcast<u32>(aValue));\n let b = fp64_decode_f32_bits(bitcast<u32>(bValue));\n if (a.isZero || b.isZero || a.isInf || b.isInf || a.isNan || b.isNan) {\n return aValue / bValue;\n }\n\n let aMostSignificantBit = 31u - countLeadingZeros(a.significand);\n let bMostSignificantBit = 31u - countLeadingZeros(b.significand);\n let normalizedABits = fp64_make_f32_bits_from_u64(\n a.sign,\n vec2u(0u, a.significand),\n -i32(aMostSignificantBit)\n );\n let normalizedBBits = fp64_make_f32_bits_from_u64(\n b.sign,\n vec2u(0u, b.significand),\n -i32(bMostSignificantBit)\n );\n let normalizedQuotient = bitcast<f32>(normalizedABits) / bitcast<f32>(normalizedBBits);\n let quotient = fp64_decode_f32_bits(bitcast<u32>(normalizedQuotient));\n let exponentShift =\n a.baseExponent + i32(aMostSignificantBit) -\n b.baseExponent - i32(bMostSignificantBit);\n let quotientBits = fp64_make_f32_bits_from_u64(\n quotient.sign,\n vec2u(0u, quotient.significand),\n quotient.baseExponent + exponentShift\n );\n return bitcast<f32>(quotientBits);\n}\n#endif\n\n\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn split(a: f32) -> vec2f {\n let aBits = bitcast<u32>(a);\n let decoded = fp64_decode_f32_bits(aBits);\n if (decoded.isZero || decoded.isInf || decoded.isNan) {\n return vec2f(a, 0.0);\n }\n\n var roundedHigh = decoded.significand >> 12u;\n let remainder = decoded.significand & 0xfffu;\n if (remainder > 0x800u || (remainder == 0x800u && (roundedHigh & 1u) == 1u)) {\n roundedHigh = roundedHigh + 1u;\n }\n var highMagnitude = vec2u(0u, roundedHigh << 12u);\n var highBits = fp64_make_f32_bits_from_u64(\n decoded.sign,\n highMagnitude,\n decoded.baseExponent\n );\n // Rounding the high limb of a maximum-exponent value can overflow even\n // though the original value is finite. Truncate only in that boundary case\n // so split remains an exact finite decomposition.\n if (fp64_decode_f32_bits(highBits).isInf) {\n roundedHigh = decoded.significand >> 12u;\n highMagnitude = vec2u(0u, roundedHigh << 12u);\n highBits = fp64_make_f32_bits_from_u64(\n decoded.sign,\n highMagnitude,\n decoded.baseExponent\n );\n }\n let lowBits = fp64_make_residual_f32_bits(\n decoded.sign,\n vec2u(0u, decoded.significand),\n decoded.baseExponent,\n highBits\n );\n return vec2f(bitcast<f32>(highBits), bitcast<f32>(lowBits));\n}\n\nfn split2(a: vec2f) -> vec2f {\n var result = split(a.x);\n result.y = fp64_round_add_integer(result.y, a.y);\n return result;\n}\n#endif\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn quickTwoSum(a: f32, b: f32) -> vec2f {\n return fp64_two_sum_integer(a, b);\n}\n#endif\n\nfn twoSum(a: f32, b: f32) -> vec2f {\n return fp64_two_sum_integer(a, b);\n}\n\nfn twoSub(a: f32, b: f32) -> vec2f {\n let bBits = bitcast<u32>(b) ^ 0x80000000u;\n let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bBits);\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn twoSqr(a: f32) -> vec2f {\n return fp64_two_prod_integer(a, a);\n}\n\nfn twoProd(a: f32, b: f32) -> vec2f {\n return fp64_two_prod_integer(a, b);\n}\n#endif\n\nstruct Fp64IntegerAccumulator {\n sign: u32,\n magnitude: vec2u,\n};\n\nfn fp64_accumulate_f32_integer(\n accumulator: Fp64IntegerAccumulator,\n value: Fp64F32Bits,\n commonBaseExponent: i32\n) -> Fp64IntegerAccumulator {\n if (value.isZero) {\n return accumulator;\n }\n\n let magnitude = fp64_u64_shift_left(\n vec2u(0u, value.significand),\n u32(value.baseExponent - commonBaseExponent)\n );\n if (fp64_u64_is_zero(accumulator.magnitude)) {\n return Fp64IntegerAccumulator(value.sign, magnitude);\n }\n if (accumulator.sign == value.sign) {\n return Fp64IntegerAccumulator(\n accumulator.sign,\n fp64_u64_add(accumulator.magnitude, magnitude)\n );\n }\n\n let comparison = fp64_u64_compare(accumulator.magnitude, magnitude);\n if (comparison == 0) {\n return Fp64IntegerAccumulator(0u, vec2u(0u));\n }\n if (comparison > 0) {\n return Fp64IntegerAccumulator(\n accumulator.sign,\n fp64_u64_sub(accumulator.magnitude, magnitude)\n );\n }\n return Fp64IntegerAccumulator(\n value.sign,\n fp64_u64_sub(magnitude, accumulator.magnitude)\n );\n}\n\nfn fp64_sum_integer_unfused(a: vec2f, b: vec2f) -> vec2f {\n var sum = fp64_two_sum_integer(a.x, b.x);\n let lowSum = fp64_two_sum_integer(a.y, b.y);\n sum.y = fp64_round_add_integer(sum.y, lowSum.x);\n sum = fp64_two_sum_integer(sum.x, sum.y);\n sum.y = fp64_round_add_integer(sum.y, lowSum.y);\n return fp64_two_sum_integer(sum.x, sum.y);\n}\n\nfn sum_fp64(a: vec2f, b: vec2f) -> vec2f {\n let aHigh = fp64_decode_f32_bits(bitcast<u32>(a.x));\n let aLow = fp64_decode_f32_bits(bitcast<u32>(a.y));\n let bHigh = fp64_decode_f32_bits(bitcast<u32>(b.x));\n let bLow = fp64_decode_f32_bits(bitcast<u32>(b.y));\n if (\n aHigh.isInf || aHigh.isNan || aLow.isInf || aLow.isNan ||\n bHigh.isInf || bHigh.isNan || bLow.isInf || bLow.isNan\n ) {\n return fp64_sum_integer_unfused(a, b);\n }\n\n var minimumBaseExponent = 2147483647;\n var maximumBaseExponent = -2147483647;\n if (!aHigh.isZero) {\n minimumBaseExponent = min(minimumBaseExponent, aHigh.baseExponent);\n maximumBaseExponent = max(maximumBaseExponent, aHigh.baseExponent);\n }\n if (!aLow.isZero) {\n minimumBaseExponent = min(minimumBaseExponent, aLow.baseExponent);\n maximumBaseExponent = max(maximumBaseExponent, aLow.baseExponent);\n }\n if (!bHigh.isZero) {\n minimumBaseExponent = min(minimumBaseExponent, bHigh.baseExponent);\n maximumBaseExponent = max(maximumBaseExponent, bHigh.baseExponent);\n }\n if (!bLow.isZero) {\n minimumBaseExponent = min(minimumBaseExponent, bLow.baseExponent);\n maximumBaseExponent = max(maximumBaseExponent, bLow.baseExponent);\n }\n if (maximumBaseExponent < minimumBaseExponent) {\n return vec2f(0.0, 0.0);\n }\n\n // Four 24-bit significands spanning at most 38 bits fit in the 64-bit\n // accumulator, including the two extra carry bits needed by their sum.\n if (maximumBaseExponent - minimumBaseExponent > 38) {\n return fp64_sum_integer_unfused(a, b);\n }\n\n var accumulator = Fp64IntegerAccumulator(0u, vec2u(0u));\n accumulator = fp64_accumulate_f32_integer(accumulator, aHigh, minimumBaseExponent);\n accumulator = fp64_accumulate_f32_integer(accumulator, aLow, minimumBaseExponent);\n accumulator = fp64_accumulate_f32_integer(accumulator, bHigh, minimumBaseExponent);\n accumulator = fp64_accumulate_f32_integer(accumulator, bLow, minimumBaseExponent);\n let resultBits = fp64_split_accumulator_bits(\n accumulator.sign,\n accumulator.magnitude,\n minimumBaseExponent\n );\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn sub_fp64(a: vec2f, b: vec2f) -> vec2f {\n let negatedB = vec2f(\n bitcast<f32>(bitcast<u32>(b.x) ^ 0x80000000u),\n bitcast<f32>(bitcast<u32>(b.y) ^ 0x80000000u)\n );\n return sum_fp64(a, negatedB);\n}\n\nfn mul_fp64(a: vec2f, b: vec2f) -> vec2f {\n var product = fp64_two_prod_integer(a.x, b.x);\n let crossProduct1 = fp64_round_mul_integer(a.x, b.y);\n product = sum_fp64(product, vec2f(crossProduct1, 0.0));\n let crossProduct2 = fp64_round_mul_integer(a.y, b.x);\n return sum_fp64(product, vec2f(crossProduct2, 0.0));\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn fp64_scale_fp64_integer(value: vec2f, exponent: i32) -> vec2f {\n let high = fp64_scale_f32_integer(value.x, exponent);\n let low = fp64_scale_f32_integer(value.y, exponent);\n return sum_fp64(vec2f(high, 0.0), vec2f(low, 0.0));\n}\n\nfn fp64_div_fp64_normalized(a: vec2f, b: vec2f) -> vec2f {\n let quotientHigh = fp64_divide_f32_integer(a.x, b.x);\n var quotient = vec2f(quotientHigh, 0.0);\n\n let remainder = sub_fp64(a, mul_fp64(b, quotient));\n let quotientLow = fp64_divide_f32_integer(remainder.x, b.x);\n quotient = sum_fp64(quotient, vec2f(quotientLow, 0.0));\n\n let secondRemainder = sub_fp64(a, mul_fp64(b, quotient));\n let correction = fp64_divide_f32_integer(secondRemainder.x, b.x);\n return sum_fp64(quotient, vec2f(correction, 0.0));\n}\n\nfn div_fp64(a: vec2f, b: vec2f) -> vec2f {\n let decodedA = fp64_decode_f32_bits(bitcast<u32>(a.x));\n let decodedB = fp64_decode_f32_bits(bitcast<u32>(b.x));\n if (\n decodedA.isZero || decodedB.isZero ||\n decodedA.isInf || decodedB.isInf ||\n decodedA.isNan || decodedB.isNan\n ) {\n return fp64_div_fp64_normalized(a, b);\n }\n\n let exponentA = fp64_f32_finite_exponent(decodedA);\n let exponentB = fp64_f32_finite_exponent(decodedB);\n // Correct the quotient near unity so b * q and the remainder stay clear of\n // both f32 underflow and overflow. The exponent difference is applied once.\n let normalizedA = fp64_scale_fp64_integer(a, -exponentA);\n let normalizedB = fp64_scale_fp64_integer(b, -exponentB);\n let normalizedQuotient = fp64_div_fp64_normalized(normalizedA, normalizedB);\n return fp64_scale_fp64_integer(normalizedQuotient, exponentA - exponentB);\n}\n\nfn fp64_sqrt_fp64_normalized(a: vec2f) -> vec2f {\n let estimate = sqrt(a.x);\n let difference = sub_fp64(a, fp64_two_prod_integer(estimate, estimate)).x;\n let denominator = fp64_round_add_integer(estimate, estimate);\n let correction = fp64_divide_f32_integer(difference, denominator);\n return sum_fp64(vec2f(estimate, 0.0), vec2f(correction, 0.0));\n}\n\nfn sqrt_fp64(a: vec2f) -> vec2f {\n let decoded = fp64_decode_f32_bits(bitcast<u32>(a.x));\n let decodedLow = fp64_decode_f32_bits(bitcast<u32>(a.y));\n if (decoded.isZero && decodedLow.isZero) {\n return vec2f(0.0, 0.0);\n }\n if (decoded.sign == 1u) {\n let nanValue = fp64_nan(a.x);\n return vec2f(nanValue, nanValue);\n }\n\n if (decoded.isInf || decoded.isNan) {\n return fp64_sqrt_fp64_normalized(a);\n }\n let exponent = fp64_f32_finite_exponent(decoded);\n // An even scale lets the final square-root rescale use an integer exponent.\n let evenExponent = exponent - (exponent & 1);\n let normalizedA = fp64_scale_fp64_integer(a, -evenExponent);\n let normalizedRoot = fp64_sqrt_fp64_normalized(normalizedA);\n return fp64_scale_fp64_integer(normalizedRoot, evenExponent / 2);\n}\n#endif\n";
|
|
11
|
+
//# sourceMappingURL=fp64-arithmetic-wgsl-integer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fp64-arithmetic-wgsl-integer.d.ts","sourceRoot":"","sources":["../../../../src/modules/math/fp64/fp64-arithmetic-wgsl-integer.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,eAAO,MAAM,mCAAmC,6uRAwR/C,CAAC;AAEF,eAAO,MAAM,yBAAyB,qvjBA6QrC,CAAC"}
|
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// SPDX-FileCopyrightText: Copyright (c) vis.gl contributors
|
|
4
|
+
/**
|
|
5
|
+
* Optimizer-independent double-single arithmetic for WGSL implementations that
|
|
6
|
+
* cannot preserve the rounding points required by the classic floating-point
|
|
7
|
+
* error-free transforms.
|
|
8
|
+
*
|
|
9
|
+
* This source is interpolated into fp64-arithmetic-wgsl.ts after the shared
|
|
10
|
+
* integer helpers. It intentionally keeps the public vec2<f32> API unchanged.
|
|
11
|
+
*/
|
|
12
|
+
export const fp64arithmeticWGSLIntegerPrimitives = /* wgsl */ `\
|
|
13
|
+
struct Fp64F32Bits {
|
|
14
|
+
sign: u32,
|
|
15
|
+
baseExponent: i32,
|
|
16
|
+
significand: u32,
|
|
17
|
+
isZero: bool,
|
|
18
|
+
isInf: bool,
|
|
19
|
+
isNan: bool,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// Decode an f32 as (-1)^sign * significand * 2^baseExponent.
|
|
23
|
+
fn fp64_decode_f32_bits(bits: u32) -> Fp64F32Bits {
|
|
24
|
+
let sign = bits >> 31u;
|
|
25
|
+
let exponentBits = (bits >> 23u) & 0xffu;
|
|
26
|
+
let fraction = bits & 0x7fffffu;
|
|
27
|
+
|
|
28
|
+
if (exponentBits == 0xffu) {
|
|
29
|
+
return Fp64F32Bits(sign, 0, 0u, false, fraction == 0u, fraction != 0u);
|
|
30
|
+
}
|
|
31
|
+
if (exponentBits == 0u) {
|
|
32
|
+
return Fp64F32Bits(sign, -149, fraction, fraction == 0u, false, false);
|
|
33
|
+
}
|
|
34
|
+
return Fp64F32Bits(sign, i32(exponentBits) - 150, 0x800000u | fraction, false, false, false);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
fn fp64_f32_magnitude_compare(aBits: u32, bBits: u32) -> i32 {
|
|
38
|
+
let aMagnitude = aBits & 0x7fffffffu;
|
|
39
|
+
let bMagnitude = bBits & 0x7fffffffu;
|
|
40
|
+
if (aMagnitude == bMagnitude) {
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
return select(-1, 1, aMagnitude > bMagnitude);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
fn fp64_make_residual_f32_bits(
|
|
47
|
+
exactSign: u32,
|
|
48
|
+
exactMagnitude: vec2u,
|
|
49
|
+
exactBaseExponent: i32,
|
|
50
|
+
highBits: u32
|
|
51
|
+
) -> u32 {
|
|
52
|
+
if (fp64_u64_is_zero(exactMagnitude)) {
|
|
53
|
+
return 0u;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let high = fp64_decode_f32_bits(highBits);
|
|
57
|
+
if (high.isInf || high.isNan) {
|
|
58
|
+
return exactSign << 31u;
|
|
59
|
+
}
|
|
60
|
+
if (high.isZero) {
|
|
61
|
+
return fp64_make_f32_bits_from_u64(exactSign, exactMagnitude, exactBaseExponent);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let commonBaseExponent = min(exactBaseExponent, high.baseExponent);
|
|
65
|
+
let exactShift = exactBaseExponent - commonBaseExponent;
|
|
66
|
+
let highShift = high.baseExponent - commonBaseExponent;
|
|
67
|
+
|
|
68
|
+
// A normal two-sum/two-product residual never needs a shift this large.
|
|
69
|
+
// This guard gives deterministic underflow behavior outside that contract.
|
|
70
|
+
if (exactShift >= 64 || highShift >= 64) {
|
|
71
|
+
return exactSign << 31u;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let exactAligned = fp64_u64_shift_left(exactMagnitude, u32(exactShift));
|
|
75
|
+
let highAligned = fp64_u64_shift_left(vec2u(0u, high.significand), u32(highShift));
|
|
76
|
+
let comparison = fp64_u64_compare(exactAligned, highAligned);
|
|
77
|
+
if (comparison == 0) {
|
|
78
|
+
return 0u;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
var residualSign = exactSign;
|
|
82
|
+
var residualMagnitude: vec2u;
|
|
83
|
+
if (comparison > 0) {
|
|
84
|
+
residualMagnitude = fp64_u64_sub(exactAligned, highAligned);
|
|
85
|
+
} else {
|
|
86
|
+
residualSign = exactSign ^ 1u;
|
|
87
|
+
residualMagnitude = fp64_u64_sub(highAligned, exactAligned);
|
|
88
|
+
}
|
|
89
|
+
return fp64_make_f32_bits_from_u64(
|
|
90
|
+
residualSign,
|
|
91
|
+
residualMagnitude,
|
|
92
|
+
commonBaseExponent
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
fn fp64_split_accumulator_bits(
|
|
97
|
+
sign: u32,
|
|
98
|
+
magnitude: vec2u,
|
|
99
|
+
baseExponent: i32
|
|
100
|
+
) -> vec2u {
|
|
101
|
+
let highBits = fp64_make_f32_bits_from_u64(sign, magnitude, baseExponent);
|
|
102
|
+
let lowBits = fp64_make_residual_f32_bits(sign, magnitude, baseExponent, highBits);
|
|
103
|
+
return vec2u(highBits, lowBits);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
fn fp64_two_sum_integer_bits(aBits: u32, bBits: u32) -> vec2u {
|
|
107
|
+
let a = fp64_decode_f32_bits(aBits);
|
|
108
|
+
let b = fp64_decode_f32_bits(bBits);
|
|
109
|
+
|
|
110
|
+
if (a.isNan || b.isNan) {
|
|
111
|
+
return vec2u(0x7fc00000u, 0u);
|
|
112
|
+
}
|
|
113
|
+
if (a.isInf || b.isInf) {
|
|
114
|
+
if (a.isInf && b.isInf && a.sign != b.sign) {
|
|
115
|
+
return vec2u(0x7fc00000u, 0u);
|
|
116
|
+
}
|
|
117
|
+
return select(vec2u(bBits, 0u), vec2u(aBits, 0u), a.isInf);
|
|
118
|
+
}
|
|
119
|
+
if (a.isZero && b.isZero) {
|
|
120
|
+
return vec2u((a.sign & b.sign) << 31u, 0u);
|
|
121
|
+
}
|
|
122
|
+
if (a.isZero) {
|
|
123
|
+
return vec2u(bBits, 0u);
|
|
124
|
+
}
|
|
125
|
+
if (b.isZero) {
|
|
126
|
+
return vec2u(aBits, 0u);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
let exponentDifference = select(
|
|
130
|
+
b.baseExponent - a.baseExponent,
|
|
131
|
+
a.baseExponent - b.baseExponent,
|
|
132
|
+
a.baseExponent >= b.baseExponent
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
// Beyond half an ulp, rounding cannot change the larger operand. Returning
|
|
136
|
+
// the smaller operand intact also avoids an unbounded integer alignment.
|
|
137
|
+
// At a power-of-two boundary the spacing below the larger operand is half
|
|
138
|
+
// the spacing above it, so an opposite-sign gap-25 operand can still change
|
|
139
|
+
// the rounded high limb. Gap 26 is the first universally safe early-out.
|
|
140
|
+
if (exponentDifference > 25) {
|
|
141
|
+
if (fp64_f32_magnitude_compare(aBits, bBits) >= 0) {
|
|
142
|
+
return vec2u(aBits, bBits);
|
|
143
|
+
}
|
|
144
|
+
return vec2u(bBits, aBits);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let commonBaseExponent = min(a.baseExponent, b.baseExponent);
|
|
148
|
+
let aMagnitude = fp64_u64_shift_left(
|
|
149
|
+
vec2u(0u, a.significand),
|
|
150
|
+
u32(a.baseExponent - commonBaseExponent)
|
|
151
|
+
);
|
|
152
|
+
let bMagnitude = fp64_u64_shift_left(
|
|
153
|
+
vec2u(0u, b.significand),
|
|
154
|
+
u32(b.baseExponent - commonBaseExponent)
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
var resultSign = a.sign;
|
|
158
|
+
var resultMagnitude: vec2u;
|
|
159
|
+
if (a.sign == b.sign) {
|
|
160
|
+
resultMagnitude = fp64_u64_add(aMagnitude, bMagnitude);
|
|
161
|
+
} else {
|
|
162
|
+
let comparison = fp64_u64_compare(aMagnitude, bMagnitude);
|
|
163
|
+
if (comparison == 0) {
|
|
164
|
+
return vec2u(0u, 0u);
|
|
165
|
+
}
|
|
166
|
+
if (comparison > 0) {
|
|
167
|
+
resultMagnitude = fp64_u64_sub(aMagnitude, bMagnitude);
|
|
168
|
+
} else {
|
|
169
|
+
resultSign = b.sign;
|
|
170
|
+
resultMagnitude = fp64_u64_sub(bMagnitude, aMagnitude);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return fp64_split_accumulator_bits(resultSign, resultMagnitude, commonBaseExponent);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
fn fp64_two_sum_integer(a: f32, b: f32) -> vec2f {
|
|
178
|
+
let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bitcast<u32>(b));
|
|
179
|
+
return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
fn fp64_multiply_significands(a: u32, b: u32) -> vec2u {
|
|
183
|
+
let aLow = a & 0xffffu;
|
|
184
|
+
let aHigh = a >> 16u;
|
|
185
|
+
let bLow = b & 0xffffu;
|
|
186
|
+
let bHigh = b >> 16u;
|
|
187
|
+
let lowProduct = aLow * bLow;
|
|
188
|
+
let crossProduct = aLow * bHigh + aHigh * bLow;
|
|
189
|
+
let highProduct = aHigh * bHigh;
|
|
190
|
+
|
|
191
|
+
var result = vec2u(0u, lowProduct);
|
|
192
|
+
result = fp64_u64_add(
|
|
193
|
+
result,
|
|
194
|
+
fp64_u64_shift_left(vec2u(0u, crossProduct), 16u)
|
|
195
|
+
);
|
|
196
|
+
result = fp64_u64_add(result, vec2u(highProduct, 0u));
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
fn fp64_two_prod_integer_bits(aBits: u32, bBits: u32) -> vec2u {
|
|
201
|
+
let a = fp64_decode_f32_bits(aBits);
|
|
202
|
+
let b = fp64_decode_f32_bits(bBits);
|
|
203
|
+
let resultSign = a.sign ^ b.sign;
|
|
204
|
+
|
|
205
|
+
if (a.isNan || b.isNan || ((a.isZero || b.isZero) && (a.isInf || b.isInf))) {
|
|
206
|
+
return vec2u(0x7fc00000u, 0u);
|
|
207
|
+
}
|
|
208
|
+
if (a.isInf || b.isInf) {
|
|
209
|
+
return vec2u((resultSign << 31u) | 0x7f800000u, resultSign << 31u);
|
|
210
|
+
}
|
|
211
|
+
if (a.isZero || b.isZero) {
|
|
212
|
+
return vec2u(resultSign << 31u, resultSign << 31u);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
let magnitude = fp64_multiply_significands(a.significand, b.significand);
|
|
216
|
+
return fp64_split_accumulator_bits(
|
|
217
|
+
resultSign,
|
|
218
|
+
magnitude,
|
|
219
|
+
a.baseExponent + b.baseExponent
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
fn fp64_two_prod_integer(a: f32, b: f32) -> vec2f {
|
|
224
|
+
let resultBits = fp64_two_prod_integer_bits(bitcast<u32>(a), bitcast<u32>(b));
|
|
225
|
+
return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
fn fp64_round_add_integer(a: f32, b: f32) -> f32 {
|
|
229
|
+
return fp64_two_sum_integer(a, b).x;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
fn fp64_round_mul_integer(a: f32, b: f32) -> f32 {
|
|
233
|
+
return fp64_two_prod_integer(a, b).x;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
#ifndef LUMA_FP64_PREDICATE_ONLY
|
|
237
|
+
fn fp64_f32_finite_exponent(value: Fp64F32Bits) -> i32 {
|
|
238
|
+
let mostSignificantBit = 31u - countLeadingZeros(value.significand);
|
|
239
|
+
return value.baseExponent + i32(mostSignificantBit);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
fn fp64_scale_f32_integer(value: f32, exponent: i32) -> f32 {
|
|
243
|
+
let decoded = fp64_decode_f32_bits(bitcast<u32>(value));
|
|
244
|
+
if (decoded.isZero || decoded.isInf || decoded.isNan) {
|
|
245
|
+
return value;
|
|
246
|
+
}
|
|
247
|
+
let resultBits = fp64_make_f32_bits_from_u64(
|
|
248
|
+
decoded.sign,
|
|
249
|
+
vec2u(0u, decoded.significand),
|
|
250
|
+
decoded.baseExponent + exponent
|
|
251
|
+
);
|
|
252
|
+
return bitcast<f32>(resultBits);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Divide normalized significands so the hardware operation cannot overflow,
|
|
256
|
+
// underflow, or flush a subnormal result. Reapply the exponent with integer
|
|
257
|
+
// packing, which also produces subnormal correction limbs without relying on
|
|
258
|
+
// floating-point arithmetic to preserve them.
|
|
259
|
+
fn fp64_divide_f32_integer(aValue: f32, bValue: f32) -> f32 {
|
|
260
|
+
let a = fp64_decode_f32_bits(bitcast<u32>(aValue));
|
|
261
|
+
let b = fp64_decode_f32_bits(bitcast<u32>(bValue));
|
|
262
|
+
if (a.isZero || b.isZero || a.isInf || b.isInf || a.isNan || b.isNan) {
|
|
263
|
+
return aValue / bValue;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
let aMostSignificantBit = 31u - countLeadingZeros(a.significand);
|
|
267
|
+
let bMostSignificantBit = 31u - countLeadingZeros(b.significand);
|
|
268
|
+
let normalizedABits = fp64_make_f32_bits_from_u64(
|
|
269
|
+
a.sign,
|
|
270
|
+
vec2u(0u, a.significand),
|
|
271
|
+
-i32(aMostSignificantBit)
|
|
272
|
+
);
|
|
273
|
+
let normalizedBBits = fp64_make_f32_bits_from_u64(
|
|
274
|
+
b.sign,
|
|
275
|
+
vec2u(0u, b.significand),
|
|
276
|
+
-i32(bMostSignificantBit)
|
|
277
|
+
);
|
|
278
|
+
let normalizedQuotient = bitcast<f32>(normalizedABits) / bitcast<f32>(normalizedBBits);
|
|
279
|
+
let quotient = fp64_decode_f32_bits(bitcast<u32>(normalizedQuotient));
|
|
280
|
+
let exponentShift =
|
|
281
|
+
a.baseExponent + i32(aMostSignificantBit) -
|
|
282
|
+
b.baseExponent - i32(bMostSignificantBit);
|
|
283
|
+
let quotientBits = fp64_make_f32_bits_from_u64(
|
|
284
|
+
quotient.sign,
|
|
285
|
+
vec2u(0u, quotient.significand),
|
|
286
|
+
quotient.baseExponent + exponentShift
|
|
287
|
+
);
|
|
288
|
+
return bitcast<f32>(quotientBits);
|
|
289
|
+
}
|
|
290
|
+
#endif
|
|
291
|
+
|
|
292
|
+
`;
|
|
293
|
+
export const fp64arithmeticWGSLInteger = /* wgsl */ `\
|
|
294
|
+
${fp64arithmeticWGSLIntegerPrimitives}
|
|
295
|
+
|
|
296
|
+
#ifndef LUMA_FP64_PREDICATE_ONLY
|
|
297
|
+
fn split(a: f32) -> vec2f {
|
|
298
|
+
let aBits = bitcast<u32>(a);
|
|
299
|
+
let decoded = fp64_decode_f32_bits(aBits);
|
|
300
|
+
if (decoded.isZero || decoded.isInf || decoded.isNan) {
|
|
301
|
+
return vec2f(a, 0.0);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
var roundedHigh = decoded.significand >> 12u;
|
|
305
|
+
let remainder = decoded.significand & 0xfffu;
|
|
306
|
+
if (remainder > 0x800u || (remainder == 0x800u && (roundedHigh & 1u) == 1u)) {
|
|
307
|
+
roundedHigh = roundedHigh + 1u;
|
|
308
|
+
}
|
|
309
|
+
var highMagnitude = vec2u(0u, roundedHigh << 12u);
|
|
310
|
+
var highBits = fp64_make_f32_bits_from_u64(
|
|
311
|
+
decoded.sign,
|
|
312
|
+
highMagnitude,
|
|
313
|
+
decoded.baseExponent
|
|
314
|
+
);
|
|
315
|
+
// Rounding the high limb of a maximum-exponent value can overflow even
|
|
316
|
+
// though the original value is finite. Truncate only in that boundary case
|
|
317
|
+
// so split remains an exact finite decomposition.
|
|
318
|
+
if (fp64_decode_f32_bits(highBits).isInf) {
|
|
319
|
+
roundedHigh = decoded.significand >> 12u;
|
|
320
|
+
highMagnitude = vec2u(0u, roundedHigh << 12u);
|
|
321
|
+
highBits = fp64_make_f32_bits_from_u64(
|
|
322
|
+
decoded.sign,
|
|
323
|
+
highMagnitude,
|
|
324
|
+
decoded.baseExponent
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
let lowBits = fp64_make_residual_f32_bits(
|
|
328
|
+
decoded.sign,
|
|
329
|
+
vec2u(0u, decoded.significand),
|
|
330
|
+
decoded.baseExponent,
|
|
331
|
+
highBits
|
|
332
|
+
);
|
|
333
|
+
return vec2f(bitcast<f32>(highBits), bitcast<f32>(lowBits));
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
fn split2(a: vec2f) -> vec2f {
|
|
337
|
+
var result = split(a.x);
|
|
338
|
+
result.y = fp64_round_add_integer(result.y, a.y);
|
|
339
|
+
return result;
|
|
340
|
+
}
|
|
341
|
+
#endif
|
|
342
|
+
|
|
343
|
+
#ifndef LUMA_FP64_PREDICATE_ONLY
|
|
344
|
+
fn quickTwoSum(a: f32, b: f32) -> vec2f {
|
|
345
|
+
return fp64_two_sum_integer(a, b);
|
|
346
|
+
}
|
|
347
|
+
#endif
|
|
348
|
+
|
|
349
|
+
fn twoSum(a: f32, b: f32) -> vec2f {
|
|
350
|
+
return fp64_two_sum_integer(a, b);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
fn twoSub(a: f32, b: f32) -> vec2f {
|
|
354
|
+
let bBits = bitcast<u32>(b) ^ 0x80000000u;
|
|
355
|
+
let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bBits);
|
|
356
|
+
return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
#ifndef LUMA_FP64_PREDICATE_ONLY
|
|
360
|
+
fn twoSqr(a: f32) -> vec2f {
|
|
361
|
+
return fp64_two_prod_integer(a, a);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
fn twoProd(a: f32, b: f32) -> vec2f {
|
|
365
|
+
return fp64_two_prod_integer(a, b);
|
|
366
|
+
}
|
|
367
|
+
#endif
|
|
368
|
+
|
|
369
|
+
struct Fp64IntegerAccumulator {
|
|
370
|
+
sign: u32,
|
|
371
|
+
magnitude: vec2u,
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
fn fp64_accumulate_f32_integer(
|
|
375
|
+
accumulator: Fp64IntegerAccumulator,
|
|
376
|
+
value: Fp64F32Bits,
|
|
377
|
+
commonBaseExponent: i32
|
|
378
|
+
) -> Fp64IntegerAccumulator {
|
|
379
|
+
if (value.isZero) {
|
|
380
|
+
return accumulator;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
let magnitude = fp64_u64_shift_left(
|
|
384
|
+
vec2u(0u, value.significand),
|
|
385
|
+
u32(value.baseExponent - commonBaseExponent)
|
|
386
|
+
);
|
|
387
|
+
if (fp64_u64_is_zero(accumulator.magnitude)) {
|
|
388
|
+
return Fp64IntegerAccumulator(value.sign, magnitude);
|
|
389
|
+
}
|
|
390
|
+
if (accumulator.sign == value.sign) {
|
|
391
|
+
return Fp64IntegerAccumulator(
|
|
392
|
+
accumulator.sign,
|
|
393
|
+
fp64_u64_add(accumulator.magnitude, magnitude)
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
let comparison = fp64_u64_compare(accumulator.magnitude, magnitude);
|
|
398
|
+
if (comparison == 0) {
|
|
399
|
+
return Fp64IntegerAccumulator(0u, vec2u(0u));
|
|
400
|
+
}
|
|
401
|
+
if (comparison > 0) {
|
|
402
|
+
return Fp64IntegerAccumulator(
|
|
403
|
+
accumulator.sign,
|
|
404
|
+
fp64_u64_sub(accumulator.magnitude, magnitude)
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
return Fp64IntegerAccumulator(
|
|
408
|
+
value.sign,
|
|
409
|
+
fp64_u64_sub(magnitude, accumulator.magnitude)
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
fn fp64_sum_integer_unfused(a: vec2f, b: vec2f) -> vec2f {
|
|
414
|
+
var sum = fp64_two_sum_integer(a.x, b.x);
|
|
415
|
+
let lowSum = fp64_two_sum_integer(a.y, b.y);
|
|
416
|
+
sum.y = fp64_round_add_integer(sum.y, lowSum.x);
|
|
417
|
+
sum = fp64_two_sum_integer(sum.x, sum.y);
|
|
418
|
+
sum.y = fp64_round_add_integer(sum.y, lowSum.y);
|
|
419
|
+
return fp64_two_sum_integer(sum.x, sum.y);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
fn sum_fp64(a: vec2f, b: vec2f) -> vec2f {
|
|
423
|
+
let aHigh = fp64_decode_f32_bits(bitcast<u32>(a.x));
|
|
424
|
+
let aLow = fp64_decode_f32_bits(bitcast<u32>(a.y));
|
|
425
|
+
let bHigh = fp64_decode_f32_bits(bitcast<u32>(b.x));
|
|
426
|
+
let bLow = fp64_decode_f32_bits(bitcast<u32>(b.y));
|
|
427
|
+
if (
|
|
428
|
+
aHigh.isInf || aHigh.isNan || aLow.isInf || aLow.isNan ||
|
|
429
|
+
bHigh.isInf || bHigh.isNan || bLow.isInf || bLow.isNan
|
|
430
|
+
) {
|
|
431
|
+
return fp64_sum_integer_unfused(a, b);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
var minimumBaseExponent = 2147483647;
|
|
435
|
+
var maximumBaseExponent = -2147483647;
|
|
436
|
+
if (!aHigh.isZero) {
|
|
437
|
+
minimumBaseExponent = min(minimumBaseExponent, aHigh.baseExponent);
|
|
438
|
+
maximumBaseExponent = max(maximumBaseExponent, aHigh.baseExponent);
|
|
439
|
+
}
|
|
440
|
+
if (!aLow.isZero) {
|
|
441
|
+
minimumBaseExponent = min(minimumBaseExponent, aLow.baseExponent);
|
|
442
|
+
maximumBaseExponent = max(maximumBaseExponent, aLow.baseExponent);
|
|
443
|
+
}
|
|
444
|
+
if (!bHigh.isZero) {
|
|
445
|
+
minimumBaseExponent = min(minimumBaseExponent, bHigh.baseExponent);
|
|
446
|
+
maximumBaseExponent = max(maximumBaseExponent, bHigh.baseExponent);
|
|
447
|
+
}
|
|
448
|
+
if (!bLow.isZero) {
|
|
449
|
+
minimumBaseExponent = min(minimumBaseExponent, bLow.baseExponent);
|
|
450
|
+
maximumBaseExponent = max(maximumBaseExponent, bLow.baseExponent);
|
|
451
|
+
}
|
|
452
|
+
if (maximumBaseExponent < minimumBaseExponent) {
|
|
453
|
+
return vec2f(0.0, 0.0);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// Four 24-bit significands spanning at most 38 bits fit in the 64-bit
|
|
457
|
+
// accumulator, including the two extra carry bits needed by their sum.
|
|
458
|
+
if (maximumBaseExponent - minimumBaseExponent > 38) {
|
|
459
|
+
return fp64_sum_integer_unfused(a, b);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
var accumulator = Fp64IntegerAccumulator(0u, vec2u(0u));
|
|
463
|
+
accumulator = fp64_accumulate_f32_integer(accumulator, aHigh, minimumBaseExponent);
|
|
464
|
+
accumulator = fp64_accumulate_f32_integer(accumulator, aLow, minimumBaseExponent);
|
|
465
|
+
accumulator = fp64_accumulate_f32_integer(accumulator, bHigh, minimumBaseExponent);
|
|
466
|
+
accumulator = fp64_accumulate_f32_integer(accumulator, bLow, minimumBaseExponent);
|
|
467
|
+
let resultBits = fp64_split_accumulator_bits(
|
|
468
|
+
accumulator.sign,
|
|
469
|
+
accumulator.magnitude,
|
|
470
|
+
minimumBaseExponent
|
|
471
|
+
);
|
|
472
|
+
return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
fn sub_fp64(a: vec2f, b: vec2f) -> vec2f {
|
|
476
|
+
let negatedB = vec2f(
|
|
477
|
+
bitcast<f32>(bitcast<u32>(b.x) ^ 0x80000000u),
|
|
478
|
+
bitcast<f32>(bitcast<u32>(b.y) ^ 0x80000000u)
|
|
479
|
+
);
|
|
480
|
+
return sum_fp64(a, negatedB);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
fn mul_fp64(a: vec2f, b: vec2f) -> vec2f {
|
|
484
|
+
var product = fp64_two_prod_integer(a.x, b.x);
|
|
485
|
+
let crossProduct1 = fp64_round_mul_integer(a.x, b.y);
|
|
486
|
+
product = sum_fp64(product, vec2f(crossProduct1, 0.0));
|
|
487
|
+
let crossProduct2 = fp64_round_mul_integer(a.y, b.x);
|
|
488
|
+
return sum_fp64(product, vec2f(crossProduct2, 0.0));
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
#ifndef LUMA_FP64_PREDICATE_ONLY
|
|
492
|
+
fn fp64_scale_fp64_integer(value: vec2f, exponent: i32) -> vec2f {
|
|
493
|
+
let high = fp64_scale_f32_integer(value.x, exponent);
|
|
494
|
+
let low = fp64_scale_f32_integer(value.y, exponent);
|
|
495
|
+
return sum_fp64(vec2f(high, 0.0), vec2f(low, 0.0));
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
fn fp64_div_fp64_normalized(a: vec2f, b: vec2f) -> vec2f {
|
|
499
|
+
let quotientHigh = fp64_divide_f32_integer(a.x, b.x);
|
|
500
|
+
var quotient = vec2f(quotientHigh, 0.0);
|
|
501
|
+
|
|
502
|
+
let remainder = sub_fp64(a, mul_fp64(b, quotient));
|
|
503
|
+
let quotientLow = fp64_divide_f32_integer(remainder.x, b.x);
|
|
504
|
+
quotient = sum_fp64(quotient, vec2f(quotientLow, 0.0));
|
|
505
|
+
|
|
506
|
+
let secondRemainder = sub_fp64(a, mul_fp64(b, quotient));
|
|
507
|
+
let correction = fp64_divide_f32_integer(secondRemainder.x, b.x);
|
|
508
|
+
return sum_fp64(quotient, vec2f(correction, 0.0));
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
fn div_fp64(a: vec2f, b: vec2f) -> vec2f {
|
|
512
|
+
let decodedA = fp64_decode_f32_bits(bitcast<u32>(a.x));
|
|
513
|
+
let decodedB = fp64_decode_f32_bits(bitcast<u32>(b.x));
|
|
514
|
+
if (
|
|
515
|
+
decodedA.isZero || decodedB.isZero ||
|
|
516
|
+
decodedA.isInf || decodedB.isInf ||
|
|
517
|
+
decodedA.isNan || decodedB.isNan
|
|
518
|
+
) {
|
|
519
|
+
return fp64_div_fp64_normalized(a, b);
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
let exponentA = fp64_f32_finite_exponent(decodedA);
|
|
523
|
+
let exponentB = fp64_f32_finite_exponent(decodedB);
|
|
524
|
+
// Correct the quotient near unity so b * q and the remainder stay clear of
|
|
525
|
+
// both f32 underflow and overflow. The exponent difference is applied once.
|
|
526
|
+
let normalizedA = fp64_scale_fp64_integer(a, -exponentA);
|
|
527
|
+
let normalizedB = fp64_scale_fp64_integer(b, -exponentB);
|
|
528
|
+
let normalizedQuotient = fp64_div_fp64_normalized(normalizedA, normalizedB);
|
|
529
|
+
return fp64_scale_fp64_integer(normalizedQuotient, exponentA - exponentB);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
fn fp64_sqrt_fp64_normalized(a: vec2f) -> vec2f {
|
|
533
|
+
let estimate = sqrt(a.x);
|
|
534
|
+
let difference = sub_fp64(a, fp64_two_prod_integer(estimate, estimate)).x;
|
|
535
|
+
let denominator = fp64_round_add_integer(estimate, estimate);
|
|
536
|
+
let correction = fp64_divide_f32_integer(difference, denominator);
|
|
537
|
+
return sum_fp64(vec2f(estimate, 0.0), vec2f(correction, 0.0));
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
fn sqrt_fp64(a: vec2f) -> vec2f {
|
|
541
|
+
let decoded = fp64_decode_f32_bits(bitcast<u32>(a.x));
|
|
542
|
+
let decodedLow = fp64_decode_f32_bits(bitcast<u32>(a.y));
|
|
543
|
+
if (decoded.isZero && decodedLow.isZero) {
|
|
544
|
+
return vec2f(0.0, 0.0);
|
|
545
|
+
}
|
|
546
|
+
if (decoded.sign == 1u) {
|
|
547
|
+
let nanValue = fp64_nan(a.x);
|
|
548
|
+
return vec2f(nanValue, nanValue);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
if (decoded.isInf || decoded.isNan) {
|
|
552
|
+
return fp64_sqrt_fp64_normalized(a);
|
|
553
|
+
}
|
|
554
|
+
let exponent = fp64_f32_finite_exponent(decoded);
|
|
555
|
+
// An even scale lets the final square-root rescale use an integer exponent.
|
|
556
|
+
let evenExponent = exponent - (exponent & 1);
|
|
557
|
+
let normalizedA = fp64_scale_fp64_integer(a, -evenExponent);
|
|
558
|
+
let normalizedRoot = fp64_sqrt_fp64_normalized(normalizedA);
|
|
559
|
+
return fp64_scale_fp64_integer(normalizedRoot, evenExponent / 2);
|
|
560
|
+
}
|
|
561
|
+
#endif
|
|
562
|
+
`;
|
|
563
|
+
//# sourceMappingURL=fp64-arithmetic-wgsl-integer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fp64-arithmetic-wgsl-integer.js","sourceRoot":"","sources":["../../../../src/modules/math/fp64/fp64-arithmetic-wgsl-integer.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,4DAA4D;AAE5D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwR7D,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;EAClD,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4QpC,CAAC"}
|