@luma.gl/shaders 0.0.0-stage → 10.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +38 -0
- package/README.md +25 -2
- package/dist/dist.dev.js +19880 -0
- package/dist/dist.min.js +12192 -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 +128 -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 +120 -0
- package/dist/lib/preprocessor/preprocessor.js.map +1 -0
- package/dist/lib/shader-assembler-base.cjs +132 -0
- package/dist/lib/shader-assembler-base.d.ts +51 -0
- package/dist/lib/shader-assembler-base.d.ts.map +1 -0
- package/dist/lib/shader-assembler-base.js +127 -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 +181 -0
- package/dist/lib/shader-assembly/assemble-glsl-shaders.d.ts +70 -0
- package/dist/lib/shader-assembly/assemble-glsl-shaders.d.ts.map +1 -0
- package/dist/lib/shader-assembly/assemble-glsl-shaders.js +208 -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 +498 -0
- package/dist/lib/shader-assembly/assemble-wgsl-shaders.d.ts +70 -0
- package/dist/lib/shader-assembly/assemble-wgsl-shaders.d.ts.map +1 -0
- package/dist/lib/shader-assembly/assemble-wgsl-shaders.js +480 -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 +132 -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-injection-targets.cjs +103 -0
- package/dist/lib/shader-assembly/shader-injection-targets.d.ts +46 -0
- package/dist/lib/shader-assembly/shader-injection-targets.d.ts.map +1 -0
- package/dist/lib/shader-assembly/shader-injection-targets.js +83 -0
- package/dist/lib/shader-assembly/shader-injection-targets.js.map +1 -0
- package/dist/lib/shader-assembly/shader-injections.cjs +204 -0
- package/dist/lib/shader-assembly/shader-injections.d.ts +49 -0
- package/dist/lib/shader-assembly/shader-injections.d.ts.map +1 -0
- package/dist/lib/shader-assembly/shader-injections.js +207 -0
- package/dist/lib/shader-assembly/shader-injections.js.map +1 -0
- package/dist/lib/shader-assembly/shader-plugin-varyings.cjs +434 -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 +438 -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-injection-target-names.cjs +163 -0
- package/dist/lib/shader-assembly/wgsl-injection-target-names.d.ts +8 -0
- package/dist/lib/shader-assembly/wgsl-injection-target-names.d.ts.map +1 -0
- package/dist/lib/shader-assembly/wgsl-injection-target-names.js +145 -0
- package/dist/lib/shader-assembly/wgsl-injection-target-names.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 +99 -0
- package/dist/lib/shader-module/shader-module.d.ts +94 -0
- package/dist/lib/shader-module/shader-module.d.ts.map +1 -0
- package/dist/lib/shader-module/shader-module.js +101 -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 +156 -0
- package/dist/lib/shader-plugin.d.ts +61 -0
- package/dist/lib/shader-plugin.d.ts.map +1 -0
- package/dist/lib/shader-plugin.js +147 -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 +142 -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 +119 -0
- package/dist/modules/engine/clip/clip.js.map +1 -0
- package/dist/modules/engine/filter/filter.cjs +103 -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 +80 -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 +53 -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 +7 -0
- package/dist/types.js.map +1 -0
- package/dist/wgsl.cjs +55 -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 +157 -0
- package/src/lib/shader-assembler-base.ts +169 -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 +830 -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 +146 -0
- package/src/lib/shader-assembly/shader-injection-targets.ts +148 -0
- package/src/lib/shader-assembly/shader-injections.ts +298 -0
- package/src/lib/shader-assembly/shader-plugin-varyings.ts +555 -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-injection-target-names.ts +180 -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 +237 -0
- package/src/lib/shader-module/shader-pass.ts +69 -0
- package/src/lib/shader-plugin.ts +236 -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 +139 -0
- package/src/modules/engine/filter/filter.ts +99 -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 +157 -0
- package/src/types.ts +116 -0
- package/src/wgsl.ts +34 -0
|
@@ -0,0 +1,2304 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var dggs_wgsl_exports = {};
|
|
19
|
+
__export(dggs_wgsl_exports, {
|
|
20
|
+
dggsWGSL: () => dggsWGSL
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(dggs_wgsl_exports);
|
|
23
|
+
const dggsWGSL = (
|
|
24
|
+
/* wgsl */
|
|
25
|
+
`const DGGS_H3_CELL_MODE: u32 = 1u;
|
|
26
|
+
const DGGS_H3_MAX_RESOLUTION: u32 = 15u;
|
|
27
|
+
const DGGS_H3_MAX_BASE_CELL: u32 = 121u;
|
|
28
|
+
const DGGS_H3_UNUSED_DIGIT: u32 = 7u;
|
|
29
|
+
const DGGS_H3_RES0_U_GNOMONIC: f32 = 0.381966011250105;
|
|
30
|
+
const DGGS_H3_RSQRT7: f32 = 0.3779644730092272;
|
|
31
|
+
const DGGS_H3_ONETHIRD: f32 = 0.3333333333333333;
|
|
32
|
+
const DGGS_H3_AP7_ROT_RADS: f32 = 0.3334731722518321;
|
|
33
|
+
const DGGS_H3_SQRT3_2: f32 = 0.8660254037844386;
|
|
34
|
+
const DGGS_S2_MAX_LEVEL: u32 = 30u;
|
|
35
|
+
const DGGS_GEOHASH_MAX_LENGTH: u32 = 12u;
|
|
36
|
+
const DGGS_GEOHASH_LENGTH_BIT_OFFSET: u32 = 60u;
|
|
37
|
+
const DGGS_QUADKEY_MAX_LENGTH: u32 = 29u;
|
|
38
|
+
const DGGS_QUADKEY_LENGTH_BIT_OFFSET: u32 = 58u;
|
|
39
|
+
const DGGS_A5_FIRST_HILBERT_RESOLUTION: u32 = 2u;
|
|
40
|
+
const DGGS_A5_MAX_RESOLUTION: u32 = 30u;
|
|
41
|
+
const DGGS_A5_HILBERT_START_BIT: u32 = 58u;
|
|
42
|
+
const DGGS_PI: f32 = 3.141592653589793;
|
|
43
|
+
const DGGS_TWO_PI: f32 = 6.283185307179586;
|
|
44
|
+
const DGGS_TWO_PI_OVER_5: f32 = 1.2566370614359172;
|
|
45
|
+
const DGGS_PI_OVER_5: f32 = 0.6283185307179586;
|
|
46
|
+
const DGGS_PI_OVER_2: f32 = 1.5707963267948966;
|
|
47
|
+
const DGGS_A5_DISTANCE_TO_EDGE: f32 = 0.6180339887498949;
|
|
48
|
+
const DGGS_A5_REFLECTED_TRIANGLE_SCALE: f32 = 3.23606797749979;
|
|
49
|
+
const DGGS_A5_LONGITUDE_OFFSET: f32 = 93.0;
|
|
50
|
+
const DGGS_RADIANS_TO_DEGREES: f32 = 57.29577951308232;
|
|
51
|
+
const DGGS_DEGREES_TO_RADIANS: f32 = 0.017453292519943295;
|
|
52
|
+
const DGGS_U64_HIGH_WORD_FLOAT_SCALE: f32 = 4294967296.0;
|
|
53
|
+
|
|
54
|
+
// DGGS 64-bit helper functions use canonical word order vec2u(high, low).
|
|
55
|
+
// Arrow BigInt64/BigUint64 buffers are read as little-endian vec2u(low, high),
|
|
56
|
+
// so storage-buffer reads should pass through dggs_u64_from_little_endian_words().
|
|
57
|
+
fn dggs_u64_make(high: u32, low: u32) -> vec2u {
|
|
58
|
+
return vec2u(high, low);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
fn dggs_u64_from_little_endian_words(words: vec2u) -> vec2u {
|
|
62
|
+
return words.yx;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
fn dggs_u64_to_little_endian_words(value: vec2u) -> vec2u {
|
|
66
|
+
return value.yx;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
fn dggs_u64_high(value: vec2u) -> u32 {
|
|
70
|
+
return value.x;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
fn dggs_u64_low(value: vec2u) -> u32 {
|
|
74
|
+
return value.y;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
fn dggs_u64_is_zero(value: vec2u) -> bool {
|
|
78
|
+
return value.x == 0u && value.y == 0u;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
fn dggs_u64_equal(a: vec2u, b: vec2u) -> bool {
|
|
82
|
+
return a.x == b.x && a.y == b.y;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
fn dggs_u64_compare(a: vec2u, b: vec2u) -> i32 {
|
|
86
|
+
if (a.x != b.x) {
|
|
87
|
+
return select(-1, 1, a.x > b.x);
|
|
88
|
+
}
|
|
89
|
+
if (a.y != b.y) {
|
|
90
|
+
return select(-1, 1, a.y > b.y);
|
|
91
|
+
}
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
fn dggs_u64_less(a: vec2u, b: vec2u) -> bool {
|
|
96
|
+
return dggs_u64_compare(a, b) < 0;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
fn dggs_u64_add(a: vec2u, b: vec2u) -> vec2u {
|
|
100
|
+
let low = a.y + b.y;
|
|
101
|
+
let carry = select(0u, 1u, low < a.y);
|
|
102
|
+
return vec2u(a.x + b.x + carry, low);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
fn dggs_u64_subtract(a: vec2u, b: vec2u) -> vec2u {
|
|
106
|
+
let borrow = select(0u, 1u, a.y < b.y);
|
|
107
|
+
return vec2u(a.x - b.x - borrow, a.y - b.y);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
fn dggs_u64_to_f32(value: vec2u) -> f32 {
|
|
111
|
+
return f32(value.x) * DGGS_U64_HIGH_WORD_FLOAT_SCALE + f32(value.y);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
fn dggs_i64_from_little_endian_words(words: vec2u) -> vec2u {
|
|
115
|
+
return dggs_u64_from_little_endian_words(words);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
fn dggs_i64_to_little_endian_words(value: vec2u) -> vec2u {
|
|
119
|
+
return dggs_u64_to_little_endian_words(value);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
fn dggs_i64_is_negative(value: vec2u) -> bool {
|
|
123
|
+
return (value.x & 0x80000000u) != 0u;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
fn dggs_i64_negate(value: vec2u) -> vec2u {
|
|
127
|
+
return dggs_u64_add(vec2u(~value.x, ~value.y), vec2u(0u, 1u));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
fn dggs_i64_compare(a: vec2u, b: vec2u) -> i32 {
|
|
131
|
+
let highA = bitcast<i32>(a.x);
|
|
132
|
+
let highB = bitcast<i32>(b.x);
|
|
133
|
+
if (highA != highB) {
|
|
134
|
+
return select(-1, 1, highA > highB);
|
|
135
|
+
}
|
|
136
|
+
if (a.y != b.y) {
|
|
137
|
+
return select(-1, 1, a.y > b.y);
|
|
138
|
+
}
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
fn dggs_i64_less(a: vec2u, b: vec2u) -> bool {
|
|
143
|
+
return dggs_i64_compare(a, b) < 0;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
fn dggs_i64_subtract(a: vec2u, b: vec2u) -> vec2u {
|
|
147
|
+
return dggs_u64_subtract(a, b);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
fn dggs_i64_to_f32(value: vec2u) -> f32 {
|
|
151
|
+
if (dggs_i64_is_negative(value)) {
|
|
152
|
+
return -dggs_u64_to_f32(dggs_i64_negate(value));
|
|
153
|
+
}
|
|
154
|
+
return dggs_u64_to_f32(value);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
fn dggs_u32_mask_low(bitCount: u32) -> u32 {
|
|
158
|
+
if (bitCount == 0u) {
|
|
159
|
+
return 0u;
|
|
160
|
+
}
|
|
161
|
+
if (bitCount >= 32u) {
|
|
162
|
+
return 0xffffffffu;
|
|
163
|
+
}
|
|
164
|
+
return (1u << bitCount) - 1u;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
fn dggs_u64_shift_left(value: vec2u, shift: u32) -> vec2u {
|
|
168
|
+
if (shift == 0u) {
|
|
169
|
+
return value;
|
|
170
|
+
}
|
|
171
|
+
if (shift < 32u) {
|
|
172
|
+
return vec2u((value.x << shift) | (value.y >> (32u - shift)), value.y << shift);
|
|
173
|
+
}
|
|
174
|
+
if (shift == 32u) {
|
|
175
|
+
return vec2u(value.y, 0u);
|
|
176
|
+
}
|
|
177
|
+
if (shift < 64u) {
|
|
178
|
+
return vec2u(value.y << (shift - 32u), 0u);
|
|
179
|
+
}
|
|
180
|
+
return vec2u(0u);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
fn dggs_u64_shift_right(value: vec2u, shift: u32) -> vec2u {
|
|
184
|
+
if (shift == 0u) {
|
|
185
|
+
return value;
|
|
186
|
+
}
|
|
187
|
+
if (shift < 32u) {
|
|
188
|
+
return vec2u(value.x >> shift, (value.y >> shift) | (value.x << (32u - shift)));
|
|
189
|
+
}
|
|
190
|
+
if (shift == 32u) {
|
|
191
|
+
return vec2u(0u, value.x);
|
|
192
|
+
}
|
|
193
|
+
if (shift < 64u) {
|
|
194
|
+
return vec2u(0u, value.x >> (shift - 32u));
|
|
195
|
+
}
|
|
196
|
+
return vec2u(0u);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
fn dggs_u64_extract_bits(value: vec2u, bitOffset: u32, bitCount: u32) -> u32 {
|
|
200
|
+
if (bitCount == 0u || bitOffset >= 64u) {
|
|
201
|
+
return 0u;
|
|
202
|
+
}
|
|
203
|
+
let shifted = dggs_u64_shift_right(value, bitOffset);
|
|
204
|
+
return shifted.y & dggs_u32_mask_low(bitCount);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
fn dggs_u64_set_bits(value: vec2u, bitOffset: u32, bitCount: u32, bits: u32) -> vec2u {
|
|
208
|
+
if (bitCount == 0u || bitOffset >= 64u) {
|
|
209
|
+
return value;
|
|
210
|
+
}
|
|
211
|
+
let bitMask = dggs_u32_mask_low(bitCount);
|
|
212
|
+
let fieldMask = dggs_u64_shift_left(vec2u(0u, bitMask), bitOffset);
|
|
213
|
+
let fieldBits = dggs_u64_shift_left(vec2u(0u, bits & bitMask), bitOffset);
|
|
214
|
+
return (value & vec2u(~fieldMask.x, ~fieldMask.y)) | fieldBits;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
fn dggs_u64_count_trailing_zeros(value: vec2u) -> u32 {
|
|
218
|
+
if (value.y != 0u) {
|
|
219
|
+
return countTrailingZeros(value.y);
|
|
220
|
+
}
|
|
221
|
+
if (value.x != 0u) {
|
|
222
|
+
return 32u + countTrailingZeros(value.x);
|
|
223
|
+
}
|
|
224
|
+
return 64u;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
struct DggsA5Cell {
|
|
228
|
+
origin : u32,
|
|
229
|
+
segment : u32,
|
|
230
|
+
resolution : u32,
|
|
231
|
+
valid : u32,
|
|
232
|
+
quintantShift : u32,
|
|
233
|
+
hilbertResolution : u32,
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
struct DggsA5Anchor {
|
|
237
|
+
q : u32,
|
|
238
|
+
offset : vec2i,
|
|
239
|
+
flips : vec2i,
|
|
240
|
+
orientation : u32,
|
|
241
|
+
quintant : u32,
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
struct DggsA5FaceTriangle {
|
|
245
|
+
a : vec2f,
|
|
246
|
+
b : vec2f,
|
|
247
|
+
c : vec2f,
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
struct DggsA5SphericalTriangle {
|
|
251
|
+
a : vec3f,
|
|
252
|
+
b : vec3f,
|
|
253
|
+
c : vec3f,
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
struct DggsH3FaceIJK {
|
|
257
|
+
face : u32,
|
|
258
|
+
coord : vec3i,
|
|
259
|
+
valid : u32,
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
struct DggsH3FaceIJKOverage {
|
|
263
|
+
faceIJK : DggsH3FaceIJK,
|
|
264
|
+
overage : u32,
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
struct DggsH3BoundaryVertex {
|
|
268
|
+
face : u32,
|
|
269
|
+
coord : vec3i,
|
|
270
|
+
resolution : u32,
|
|
271
|
+
valid : u32,
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
fn dggs_boundary_point_to_fp64_split(point : vec2f) -> vec4f {
|
|
275
|
+
return vec4f(point.x, point.y, 0.0, 0.0);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
fn dggs_a5_positive_mod_i32(value : i32, modulus : i32) -> i32 {
|
|
279
|
+
return ((value % modulus) + modulus) % modulus;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
fn dggs_a5_has_bit(index : vec2u, bitOffset : u32) -> bool {
|
|
283
|
+
return dggs_u64_extract_bits(index, bitOffset, 1u) != 0u;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
fn dggs_a5_get_resolution(index : vec2u) -> u32 {
|
|
287
|
+
if (dggs_u64_is_zero(index)) {
|
|
288
|
+
return 0u;
|
|
289
|
+
}
|
|
290
|
+
if (
|
|
291
|
+
dggs_a5_has_bit(index, 0u) ||
|
|
292
|
+
dggs_u64_extract_bits(index, 0u, 3u) == 4u ||
|
|
293
|
+
dggs_u64_extract_bits(index, 0u, 5u) == 16u
|
|
294
|
+
) {
|
|
295
|
+
return DGGS_A5_MAX_RESOLUTION;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
var resolution = DGGS_A5_MAX_RESOLUTION - 1u;
|
|
299
|
+
var shifted = dggs_u64_shift_right(index, 1u);
|
|
300
|
+
if (dggs_u64_is_zero(shifted)) {
|
|
301
|
+
return 0u;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
var remaining = shifted.y;
|
|
305
|
+
if (remaining == 0u) {
|
|
306
|
+
shifted = dggs_u64_shift_right(shifted, 32u);
|
|
307
|
+
resolution -= 16u;
|
|
308
|
+
remaining = shifted.y;
|
|
309
|
+
}
|
|
310
|
+
if ((remaining & 0xffffu) == 0u) {
|
|
311
|
+
remaining >>= 16u;
|
|
312
|
+
resolution -= 8u;
|
|
313
|
+
}
|
|
314
|
+
if (resolution >= 6u && (remaining & 0xffu) == 0u) {
|
|
315
|
+
remaining >>= 8u;
|
|
316
|
+
resolution -= 4u;
|
|
317
|
+
}
|
|
318
|
+
if (resolution >= 4u && (remaining & 0xfu) == 0u) {
|
|
319
|
+
remaining >>= 4u;
|
|
320
|
+
resolution -= 2u;
|
|
321
|
+
}
|
|
322
|
+
loop {
|
|
323
|
+
if ((remaining & 1u) != 0u) {
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
if (resolution == 0u) {
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
resolution -= 1u;
|
|
330
|
+
remaining >>= select(2u, 1u, resolution < DGGS_A5_FIRST_HILBERT_RESOLUTION);
|
|
331
|
+
}
|
|
332
|
+
return resolution;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
fn dggs_a5_get_origin_first_quintant(origin : u32) -> u32 {
|
|
336
|
+
let values = array<u32, 12>(
|
|
337
|
+
4u, 2u, 3u, 0u, 2u, 4u, 2u, 2u, 3u, 0u, 3u, 0u
|
|
338
|
+
);
|
|
339
|
+
return values[min(origin, 11u)];
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
fn dggs_a5_get_origin_step(origin : u32) -> i32 {
|
|
343
|
+
let values = array<i32, 12>(
|
|
344
|
+
-1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1
|
|
345
|
+
);
|
|
346
|
+
return values[min(origin, 11u)];
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
fn dggs_a5_get_origin_orientation(origin : u32, faceRelativeQuintant : u32) -> u32 {
|
|
350
|
+
// Orientation codes: uv=0, vu=1, uw=2, wu=3, vw=4, wv=5.
|
|
351
|
+
let values = array<u32, 60>(
|
|
352
|
+
1u, 2u, 4u, 4u, 4u,
|
|
353
|
+
1u, 0u, 5u, 3u, 2u,
|
|
354
|
+
3u, 0u, 5u, 3u, 2u,
|
|
355
|
+
3u, 0u, 5u, 3u, 2u,
|
|
356
|
+
3u, 2u, 4u, 1u, 2u,
|
|
357
|
+
1u, 0u, 5u, 3u, 2u,
|
|
358
|
+
3u, 2u, 4u, 1u, 2u,
|
|
359
|
+
3u, 2u, 4u, 1u, 2u,
|
|
360
|
+
3u, 0u, 5u, 3u, 2u,
|
|
361
|
+
1u, 0u, 5u, 3u, 2u,
|
|
362
|
+
1u, 0u, 5u, 3u, 2u,
|
|
363
|
+
3u, 2u, 4u, 1u, 2u
|
|
364
|
+
);
|
|
365
|
+
return values[min(origin, 11u) * 5u + min(faceRelativeQuintant, 4u)];
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
fn dggs_a5_get_origin_angle(origin : u32) -> f32 {
|
|
369
|
+
if (origin == 0u || origin == 9u) {
|
|
370
|
+
return 0.0;
|
|
371
|
+
}
|
|
372
|
+
return DGGS_PI_OVER_5;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
fn dggs_a5_get_origin_quaternion(origin : u32) -> vec4f {
|
|
376
|
+
let values = array<vec4f, 12>(
|
|
377
|
+
vec4f(0.0, 0.0, 0.0, 1.0),
|
|
378
|
+
vec4f(0.0, 0.525731112119, 0.0, 0.850650808352),
|
|
379
|
+
vec4f(-0.5, 0.688190960236, 0.0, 0.525731112119),
|
|
380
|
+
vec4f(-0.809016994375, -0.262865556060, 0.0, 0.525731112119),
|
|
381
|
+
vec4f(-0.5, 0.162459848116, 0.0, 0.850650808352),
|
|
382
|
+
vec4f(-0.309016994375, -0.425325404176, 0.0, 0.850650808352),
|
|
383
|
+
vec4f(0.309016994375, -0.425325404176, 0.0, 0.850650808352),
|
|
384
|
+
vec4f(0.809016994375, -0.262865556060, 0.0, 0.525731112119),
|
|
385
|
+
vec4f(0.0, -0.850650808352, 0.0, 0.525731112119),
|
|
386
|
+
vec4f(0.0, -1.0, 0.0, 0.0),
|
|
387
|
+
vec4f(0.5, 0.688190960236, 0.0, 0.525731112119),
|
|
388
|
+
vec4f(0.5, 0.162459848116, 0.0, 0.850650808352)
|
|
389
|
+
);
|
|
390
|
+
return values[min(origin, 11u)];
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
fn dggs_a5_quaternion_rotate(point : vec3f, quaternion : vec4f) -> vec3f {
|
|
394
|
+
let q = quaternion.xyz;
|
|
395
|
+
let t = 2.0 * cross(q, point);
|
|
396
|
+
return point + quaternion.w * t + cross(q, t);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
fn dggs_a5_deserialize(index : vec2u) -> DggsA5Cell {
|
|
400
|
+
if (dggs_u64_is_zero(index)) {
|
|
401
|
+
return DggsA5Cell(0u, 0u, 0u, 0u, DGGS_A5_HILBERT_START_BIT, 0u);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
let resolution = dggs_a5_get_resolution(index);
|
|
405
|
+
var quintantShift = DGGS_A5_HILBERT_START_BIT;
|
|
406
|
+
var quintantOffset = 0u;
|
|
407
|
+
if (resolution == DGGS_A5_MAX_RESOLUTION) {
|
|
408
|
+
var markerBits = 5u;
|
|
409
|
+
if (dggs_a5_has_bit(index, 0u)) {
|
|
410
|
+
markerBits = 1u;
|
|
411
|
+
} else if (dggs_a5_has_bit(index, 2u)) {
|
|
412
|
+
markerBits = 3u;
|
|
413
|
+
}
|
|
414
|
+
quintantShift = DGGS_A5_HILBERT_START_BIT + markerBits;
|
|
415
|
+
quintantOffset = select(select(40u, 32u, markerBits == 3u), 0u, markerBits == 1u);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
let topBits = dggs_u64_shift_right(index, quintantShift).y + quintantOffset;
|
|
419
|
+
if (resolution == 0u) {
|
|
420
|
+
if (topBits >= 12u) {
|
|
421
|
+
return DggsA5Cell(0u, 0u, resolution, 0u, quintantShift, 0u);
|
|
422
|
+
}
|
|
423
|
+
return DggsA5Cell(topBits, 0u, resolution, 1u, quintantShift, 0u);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
let origin = topBits / 5u;
|
|
427
|
+
if (origin >= 12u) {
|
|
428
|
+
return DggsA5Cell(0u, 0u, resolution, 0u, quintantShift, 0u);
|
|
429
|
+
}
|
|
430
|
+
let segment = (topBits + dggs_a5_get_origin_first_quintant(origin)) % 5u;
|
|
431
|
+
let hilbertResolution = select(0u, resolution - 1u, resolution >= 2u);
|
|
432
|
+
return DggsA5Cell(origin, segment, resolution, 1u, quintantShift, hilbertResolution);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
fn dggs_a5_segment_to_anchor_info(cell : DggsA5Cell) -> DggsA5Anchor {
|
|
436
|
+
let firstQuintant = dggs_a5_get_origin_first_quintant(cell.origin);
|
|
437
|
+
let faceRelativeQuintant = (cell.segment + 5u - firstQuintant) % 5u;
|
|
438
|
+
let orientation = dggs_a5_get_origin_orientation(cell.origin, faceRelativeQuintant);
|
|
439
|
+
let step = dggs_a5_get_origin_step(cell.origin);
|
|
440
|
+
let quintant = u32(dggs_a5_positive_mod_i32(
|
|
441
|
+
i32(firstQuintant) + step * i32(faceRelativeQuintant),
|
|
442
|
+
5
|
|
443
|
+
));
|
|
444
|
+
return DggsA5Anchor(0u, vec2i(0), vec2i(1), orientation, quintant);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
fn dggs_a5_is_reverse_orientation(orientation : u32) -> bool {
|
|
448
|
+
return orientation == 1u || orientation == 3u || orientation == 4u;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
fn dggs_a5_is_invert_j_orientation(orientation : u32) -> bool {
|
|
452
|
+
return orientation == 5u || orientation == 4u;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
fn dggs_a5_is_flip_ij_orientation(orientation : u32) -> bool {
|
|
456
|
+
return orientation == 3u || orientation == 2u;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
fn dggs_a5_pattern_value(index : u32, flipIj : bool) -> u32 {
|
|
460
|
+
let pattern = array<u32, 8>(0u, 1u, 3u, 4u, 5u, 6u, 7u, 2u);
|
|
461
|
+
let flippedPattern = array<u32, 8>(0u, 1u, 2u, 7u, 3u, 4u, 5u, 6u);
|
|
462
|
+
return select(pattern[min(index, 7u)], flippedPattern[min(index, 7u)], flipIj);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
fn dggs_a5_quaternary_to_flips(digit : u32) -> vec2i {
|
|
466
|
+
if (digit == 1u) {
|
|
467
|
+
return vec2i(1, -1);
|
|
468
|
+
}
|
|
469
|
+
if (digit == 3u) {
|
|
470
|
+
return vec2i(-1, 1);
|
|
471
|
+
}
|
|
472
|
+
return vec2i(1, 1);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
fn dggs_a5_quaternary_to_kj(digit : u32, flips : vec2i) -> vec2i {
|
|
476
|
+
var p = vec2i(0);
|
|
477
|
+
var q = vec2i(0);
|
|
478
|
+
if (flips.x == 1 && flips.y == 1) {
|
|
479
|
+
p = vec2i(1, 0);
|
|
480
|
+
q = vec2i(0, 1);
|
|
481
|
+
} else if (flips.x == -1 && flips.y == 1) {
|
|
482
|
+
p = vec2i(0, -1);
|
|
483
|
+
q = vec2i(-1, 0);
|
|
484
|
+
} else if (flips.x == 1 && flips.y == -1) {
|
|
485
|
+
p = vec2i(0, 1);
|
|
486
|
+
q = vec2i(1, 0);
|
|
487
|
+
} else {
|
|
488
|
+
p = vec2i(-1, 0);
|
|
489
|
+
q = vec2i(0, -1);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
if (digit == 1u) {
|
|
493
|
+
return p;
|
|
494
|
+
}
|
|
495
|
+
if (digit == 2u) {
|
|
496
|
+
return p + q;
|
|
497
|
+
}
|
|
498
|
+
if (digit == 3u) {
|
|
499
|
+
return q + 2 * p;
|
|
500
|
+
}
|
|
501
|
+
return vec2i(0);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
fn dggs_a5_kj_to_ij(kj : vec2i) -> vec2i {
|
|
505
|
+
return vec2i(kj.x - kj.y, kj.y);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
fn dggs_a5_shift_digits(
|
|
509
|
+
digits : ptr<function, array<u32, 29>>,
|
|
510
|
+
digitIndex : u32,
|
|
511
|
+
flips : vec2i,
|
|
512
|
+
invertJ : bool,
|
|
513
|
+
flipIj : bool
|
|
514
|
+
) {
|
|
515
|
+
if (digitIndex == 0u) {
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
let parentK = (*digits)[digitIndex];
|
|
519
|
+
let childK = (*digits)[digitIndex - 1u];
|
|
520
|
+
let flipSum = flips.x + flips.y;
|
|
521
|
+
var needsShift = true;
|
|
522
|
+
var first = true;
|
|
523
|
+
if (invertJ != (flipSum == 0)) {
|
|
524
|
+
needsShift = parentK == 1u || parentK == 2u;
|
|
525
|
+
first = parentK == 1u;
|
|
526
|
+
} else {
|
|
527
|
+
needsShift = parentK < 2u;
|
|
528
|
+
first = parentK == 0u;
|
|
529
|
+
}
|
|
530
|
+
if (!needsShift) {
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
let source = select(childK + 4u, childK, first);
|
|
534
|
+
let destination = dggs_a5_pattern_value(source, flipIj);
|
|
535
|
+
(*digits)[digitIndex - 1u] = destination % 4u;
|
|
536
|
+
(*digits)[digitIndex] = u32(dggs_a5_positive_mod_i32(
|
|
537
|
+
i32(parentK) + 4 + i32(destination / 4u) - i32(source / 4u),
|
|
538
|
+
4
|
|
539
|
+
));
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
fn dggs_a5_make_anchor(index : vec2u, cell : DggsA5Cell, anchorInfo : DggsA5Anchor) -> DggsA5Anchor {
|
|
543
|
+
if (cell.hilbertResolution == 0u) {
|
|
544
|
+
return anchorInfo;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
let reverse = dggs_a5_is_reverse_orientation(anchorInfo.orientation);
|
|
548
|
+
let invertJ = dggs_a5_is_invert_j_orientation(anchorInfo.orientation);
|
|
549
|
+
let flipIj = dggs_a5_is_flip_ij_orientation(anchorInfo.orientation);
|
|
550
|
+
let hilbertBits = 2u * cell.hilbertResolution;
|
|
551
|
+
let sBitOffset = cell.quintantShift - hilbertBits;
|
|
552
|
+
var digits : array<u32, 29>;
|
|
553
|
+
var digitIndex = 0u;
|
|
554
|
+
loop {
|
|
555
|
+
if (digitIndex >= cell.hilbertResolution) {
|
|
556
|
+
break;
|
|
557
|
+
}
|
|
558
|
+
var digit = dggs_u64_extract_bits(index, sBitOffset + 2u * digitIndex, 2u);
|
|
559
|
+
if (reverse) {
|
|
560
|
+
digit = 3u - digit;
|
|
561
|
+
}
|
|
562
|
+
digits[digitIndex] = digit;
|
|
563
|
+
digitIndex += 1u;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
var flips = vec2i(1, 1);
|
|
567
|
+
digitIndex = cell.hilbertResolution;
|
|
568
|
+
loop {
|
|
569
|
+
if (digitIndex == 0u) {
|
|
570
|
+
break;
|
|
571
|
+
}
|
|
572
|
+
digitIndex -= 1u;
|
|
573
|
+
dggs_a5_shift_digits(&digits, digitIndex, flips, invertJ, flipIj);
|
|
574
|
+
flips *= dggs_a5_quaternary_to_flips(digits[digitIndex]);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
flips = vec2i(1, 1);
|
|
578
|
+
var offset = vec2i(0);
|
|
579
|
+
digitIndex = cell.hilbertResolution;
|
|
580
|
+
loop {
|
|
581
|
+
if (digitIndex == 0u) {
|
|
582
|
+
break;
|
|
583
|
+
}
|
|
584
|
+
digitIndex -= 1u;
|
|
585
|
+
offset *= 2;
|
|
586
|
+
offset += dggs_a5_quaternary_to_kj(digits[digitIndex], flips);
|
|
587
|
+
flips *= dggs_a5_quaternary_to_flips(digits[digitIndex]);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
var anchorOffset = dggs_a5_kj_to_ij(offset);
|
|
591
|
+
if (flipIj) {
|
|
592
|
+
let originalOffset = anchorOffset;
|
|
593
|
+
anchorOffset = originalOffset.yx;
|
|
594
|
+
if (flips.x == -1) {
|
|
595
|
+
anchorOffset += vec2i(-1, 1);
|
|
596
|
+
}
|
|
597
|
+
if (flips.y == -1) {
|
|
598
|
+
anchorOffset -= vec2i(-1, 1);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
if (invertJ) {
|
|
602
|
+
let i = anchorOffset.x;
|
|
603
|
+
let j = i32(1u << cell.hilbertResolution) - (i + anchorOffset.y);
|
|
604
|
+
flips.x = -flips.x;
|
|
605
|
+
anchorOffset.y = j;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
return DggsA5Anchor(
|
|
609
|
+
digits[0],
|
|
610
|
+
anchorOffset,
|
|
611
|
+
flips,
|
|
612
|
+
anchorInfo.orientation,
|
|
613
|
+
anchorInfo.quintant
|
|
614
|
+
);
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
fn dggs_a5_rotate_face_point(point : vec2f, quintant : u32) -> vec2f {
|
|
618
|
+
let angle = f32(quintant) * DGGS_TWO_PI_OVER_5;
|
|
619
|
+
let cosine = cos(angle);
|
|
620
|
+
let sine = sin(angle);
|
|
621
|
+
return vec2f(point.x * cosine - point.y * sine, point.x * sine + point.y * cosine);
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
fn dggs_a5_get_base_pentagon_vertex(vertexIndex : u32) -> vec2f {
|
|
625
|
+
let vertices = array<vec2f, 5>(
|
|
626
|
+
vec2f(0.0, 0.0),
|
|
627
|
+
vec2f(0.199381847431, 0.375413822391),
|
|
628
|
+
vec2f(0.618033988750, 0.449027976580),
|
|
629
|
+
vec2f(0.817415836181, 0.073614154188),
|
|
630
|
+
vec2f(0.418652141319, -0.073614154188)
|
|
631
|
+
);
|
|
632
|
+
return vertices[min(vertexIndex, 4u)];
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
fn dggs_a5_get_base_pentagon_center() -> vec2f {
|
|
636
|
+
return vec2f(0.4106967627362, 0.1648883597942);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
fn dggs_a5_get_base_triangle_vertex(vertexIndex : u32) -> vec2f {
|
|
640
|
+
let vertices = array<vec2f, 3>(
|
|
641
|
+
vec2f(0.0, 0.0),
|
|
642
|
+
vec2f(0.618033988750, 0.449027976580),
|
|
643
|
+
vec2f(0.618033988750, -0.449027976580)
|
|
644
|
+
);
|
|
645
|
+
return vertices[min(vertexIndex, 2u)];
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
fn dggs_a5_get_face_vertex(vertexIndex : u32) -> vec2f {
|
|
649
|
+
return dggs_a5_rotate_face_point(dggs_a5_get_base_triangle_vertex(1u), 4u - min(vertexIndex, 4u));
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
fn dggs_a5_get_triangle_vertex(quintant : u32, vertexIndex : u32) -> vec2f {
|
|
653
|
+
return dggs_a5_rotate_face_point(dggs_a5_get_base_triangle_vertex(vertexIndex), quintant);
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
fn dggs_a5_get_pentagon_vertex(
|
|
657
|
+
anchor : DggsA5Anchor,
|
|
658
|
+
hilbertResolution : u32,
|
|
659
|
+
vertexIndex : u32
|
|
660
|
+
) -> vec2f {
|
|
661
|
+
let flipSum = anchor.flips.x + anchor.flips.y;
|
|
662
|
+
let reflectsY = ((flipSum == -2 || flipSum == 2) && anchor.q > 1u) ||
|
|
663
|
+
(flipSum == 0 && (anchor.q == 0u || anchor.q == 3u));
|
|
664
|
+
let sourceIndex = select(vertexIndex, 4u - vertexIndex, reflectsY);
|
|
665
|
+
var point = dggs_a5_get_base_pentagon_vertex(sourceIndex);
|
|
666
|
+
|
|
667
|
+
if (anchor.flips.x == 1 && anchor.flips.y == -1) {
|
|
668
|
+
point = -point;
|
|
669
|
+
}
|
|
670
|
+
if (reflectsY) {
|
|
671
|
+
point.y = -point.y;
|
|
672
|
+
}
|
|
673
|
+
if (anchor.flips.x == -1 && anchor.flips.y == -1) {
|
|
674
|
+
point = -point;
|
|
675
|
+
} else if (anchor.flips.x == -1) {
|
|
676
|
+
point += vec2f(-0.618033988750, 0.449027976580);
|
|
677
|
+
} else if (anchor.flips.y == -1) {
|
|
678
|
+
point += vec2f(0.618033988750, -0.449027976580);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
let translation = vec2f(
|
|
682
|
+
f32(anchor.offset.x) * 0.618033988750 + f32(anchor.offset.y) * 0.618033988750,
|
|
683
|
+
f32(anchor.offset.x) * 0.449027976580 + f32(anchor.offset.y) * -0.449027976580
|
|
684
|
+
);
|
|
685
|
+
point = (point + translation) / f32(1u << hilbertResolution);
|
|
686
|
+
return dggs_a5_rotate_face_point(point, anchor.quintant);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
// Transforming the center directly preserves sub-cell precision when individual vertices collapse
|
|
690
|
+
// to the same f32 coordinate at the highest resolutions.
|
|
691
|
+
fn dggs_a5_get_pentagon_center(anchor : DggsA5Anchor, hilbertResolution : u32) -> vec2f {
|
|
692
|
+
let flipSum = anchor.flips.x + anchor.flips.y;
|
|
693
|
+
let reflectsY = ((flipSum == -2 || flipSum == 2) && anchor.q > 1u) ||
|
|
694
|
+
(flipSum == 0 && (anchor.q == 0u || anchor.q == 3u));
|
|
695
|
+
var point = dggs_a5_get_base_pentagon_center();
|
|
696
|
+
|
|
697
|
+
if (anchor.flips.x == 1 && anchor.flips.y == -1) {
|
|
698
|
+
point = -point;
|
|
699
|
+
}
|
|
700
|
+
if (reflectsY) {
|
|
701
|
+
point.y = -point.y;
|
|
702
|
+
}
|
|
703
|
+
if (anchor.flips.x == -1 && anchor.flips.y == -1) {
|
|
704
|
+
point = -point;
|
|
705
|
+
} else if (anchor.flips.x == -1) {
|
|
706
|
+
point += vec2f(-0.618033988750, 0.449027976580);
|
|
707
|
+
} else if (anchor.flips.y == -1) {
|
|
708
|
+
point += vec2f(0.618033988750, -0.449027976580);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
let translation = vec2f(
|
|
712
|
+
f32(anchor.offset.x) * 0.618033988750 + f32(anchor.offset.y) * 0.618033988750,
|
|
713
|
+
f32(anchor.offset.x) * 0.449027976580 + f32(anchor.offset.y) * -0.449027976580
|
|
714
|
+
);
|
|
715
|
+
point = (point + translation) / f32(1u << hilbertResolution);
|
|
716
|
+
return dggs_a5_rotate_face_point(point, anchor.quintant);
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
fn dggs_a5_get_shape_vertex_count(cell : DggsA5Cell) -> u32 {
|
|
720
|
+
return select(5u, 3u, cell.resolution == 1u);
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
fn dggs_a5_get_reversed_shape_index(vertexIndex : u32, shapeVertexCount : u32) -> u32 {
|
|
724
|
+
if (vertexIndex == 0u || vertexIndex >= shapeVertexCount) {
|
|
725
|
+
return 0u;
|
|
726
|
+
}
|
|
727
|
+
return shapeVertexCount - vertexIndex;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
fn dggs_a5_get_cell_shape_face_point(index : vec2u, cell : DggsA5Cell, shapeIndex : u32) -> vec2f {
|
|
731
|
+
let anchorInfo = dggs_a5_segment_to_anchor_info(cell);
|
|
732
|
+
if (cell.resolution == 0u) {
|
|
733
|
+
return dggs_a5_get_face_vertex(shapeIndex);
|
|
734
|
+
}
|
|
735
|
+
if (cell.resolution == 1u) {
|
|
736
|
+
return dggs_a5_get_triangle_vertex(anchorInfo.quintant, shapeIndex);
|
|
737
|
+
}
|
|
738
|
+
let anchor = dggs_a5_make_anchor(index, cell, anchorInfo);
|
|
739
|
+
return dggs_a5_get_pentagon_vertex(anchor, cell.hilbertResolution, shapeIndex);
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
fn dggs_a5_get_cell_center_face_point(index : vec2u, cell : DggsA5Cell) -> vec2f {
|
|
743
|
+
if (cell.resolution >= 2u) {
|
|
744
|
+
return dggs_a5_get_pentagon_center(
|
|
745
|
+
dggs_a5_make_anchor(index, cell, dggs_a5_segment_to_anchor_info(cell)),
|
|
746
|
+
cell.hilbertResolution
|
|
747
|
+
);
|
|
748
|
+
}
|
|
749
|
+
let shapeVertexCount = dggs_a5_get_shape_vertex_count(cell);
|
|
750
|
+
var center = vec2f(0.0);
|
|
751
|
+
var vertexIndex = 0u;
|
|
752
|
+
loop {
|
|
753
|
+
if (vertexIndex >= shapeVertexCount) {
|
|
754
|
+
break;
|
|
755
|
+
}
|
|
756
|
+
center += dggs_a5_get_cell_shape_face_point(index, cell, vertexIndex);
|
|
757
|
+
vertexIndex += 1u;
|
|
758
|
+
}
|
|
759
|
+
return center / f32(shapeVertexCount);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
fn dggs_a5_to_polar(point : vec2f) -> vec2f {
|
|
763
|
+
var angle = 0.0;
|
|
764
|
+
if (dot(point, point) > 1.0e-12) {
|
|
765
|
+
angle = atan2(point.y, point.x);
|
|
766
|
+
}
|
|
767
|
+
return vec2f(length(point), angle);
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
fn dggs_a5_to_cartesian(thetaPhi : vec2f) -> vec3f {
|
|
771
|
+
let sinPhi = sin(thetaPhi.y);
|
|
772
|
+
return vec3f(sinPhi * cos(thetaPhi.x), sinPhi * sin(thetaPhi.x), cos(thetaPhi.y));
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
fn dggs_a5_normalize_vec3(point : vec3f) -> vec3f {
|
|
776
|
+
let magnitude = length(point);
|
|
777
|
+
if (magnitude < 1.0e-12) {
|
|
778
|
+
return vec3f(0.0, 0.0, 1.0);
|
|
779
|
+
}
|
|
780
|
+
return point / magnitude;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
fn dggs_a5_get_face_triangle_index(polar : vec2f) -> u32 {
|
|
784
|
+
return u32(dggs_a5_positive_mod_i32(i32(floor(polar.y / DGGS_PI_OVER_5)), 10));
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
fn dggs_a5_normalize_gamma(gamma : f32) -> f32 {
|
|
788
|
+
let segment = gamma / DGGS_TWO_PI_OVER_5;
|
|
789
|
+
return (segment - round(segment)) * DGGS_TWO_PI_OVER_5;
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
fn dggs_a5_should_reflect(polar : vec2f) -> bool {
|
|
793
|
+
return polar.x * cos(dggs_a5_normalize_gamma(polar.y)) > DGGS_A5_DISTANCE_TO_EDGE;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
fn dggs_a5_get_base_face_triangle(faceTriangleIndex : u32) -> DggsA5FaceTriangle {
|
|
797
|
+
let quintant = ((faceTriangleIndex + 1u) / 2u) % 5u;
|
|
798
|
+
let center = dggs_a5_get_triangle_vertex(quintant, 0u);
|
|
799
|
+
let corner1 = dggs_a5_get_triangle_vertex(quintant, 1u);
|
|
800
|
+
let corner2 = dggs_a5_get_triangle_vertex(quintant, 2u);
|
|
801
|
+
let edgeMidpoint = (corner1 + corner2) * 0.5;
|
|
802
|
+
if ((faceTriangleIndex & 1u) == 0u) {
|
|
803
|
+
return DggsA5FaceTriangle(center, edgeMidpoint, corner1);
|
|
804
|
+
}
|
|
805
|
+
return DggsA5FaceTriangle(center, corner2, edgeMidpoint);
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
fn dggs_a5_get_face_triangle_vertex(triangle : DggsA5FaceTriangle, vertexIndex : u32) -> vec2f {
|
|
809
|
+
if (vertexIndex == 0u) {
|
|
810
|
+
return triangle.a;
|
|
811
|
+
}
|
|
812
|
+
if (vertexIndex == 1u) {
|
|
813
|
+
return triangle.b;
|
|
814
|
+
}
|
|
815
|
+
return triangle.c;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
fn dggs_a5_get_reflected_face_triangle(
|
|
819
|
+
faceTriangleIndex : u32,
|
|
820
|
+
squashed : bool
|
|
821
|
+
) -> DggsA5FaceTriangle {
|
|
822
|
+
let baseTriangle = dggs_a5_get_base_face_triangle(faceTriangleIndex);
|
|
823
|
+
let even = (faceTriangleIndex & 1u) == 0u;
|
|
824
|
+
let midpoint = select(baseTriangle.c, baseTriangle.b, even);
|
|
825
|
+
let scale = select(2.0, DGGS_A5_REFLECTED_TRIANGLE_SCALE, squashed);
|
|
826
|
+
let reflectedA = -baseTriangle.a + midpoint * scale;
|
|
827
|
+
return DggsA5FaceTriangle(reflectedA, baseTriangle.c, baseTriangle.b);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
fn dggs_a5_get_face_triangle(
|
|
831
|
+
faceTriangleIndex : u32,
|
|
832
|
+
reflected : bool,
|
|
833
|
+
squashed : bool
|
|
834
|
+
) -> DggsA5FaceTriangle {
|
|
835
|
+
if (reflected) {
|
|
836
|
+
return dggs_a5_get_reflected_face_triangle(faceTriangleIndex, squashed);
|
|
837
|
+
}
|
|
838
|
+
return dggs_a5_get_base_face_triangle(faceTriangleIndex);
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
fn dggs_a5_face_triangle_to_spherical_triangle(
|
|
842
|
+
faceTriangleIndex : u32,
|
|
843
|
+
origin : u32,
|
|
844
|
+
reflected : bool
|
|
845
|
+
) -> DggsA5SphericalTriangle {
|
|
846
|
+
let faceTriangle = dggs_a5_get_face_triangle(faceTriangleIndex, reflected, true);
|
|
847
|
+
let originAngle = dggs_a5_get_origin_angle(origin);
|
|
848
|
+
let quaternion = dggs_a5_get_origin_quaternion(origin);
|
|
849
|
+
|
|
850
|
+
let polarA = dggs_a5_to_polar(faceTriangle.a);
|
|
851
|
+
let polarB = dggs_a5_to_polar(faceTriangle.b);
|
|
852
|
+
let polarC = dggs_a5_to_polar(faceTriangle.c);
|
|
853
|
+
let sphericalA = dggs_a5_quaternion_rotate(
|
|
854
|
+
dggs_a5_to_cartesian(vec2f(polarA.y + originAngle, atan(polarA.x))),
|
|
855
|
+
quaternion
|
|
856
|
+
);
|
|
857
|
+
let sphericalB = dggs_a5_quaternion_rotate(
|
|
858
|
+
dggs_a5_to_cartesian(vec2f(polarB.y + originAngle, atan(polarB.x))),
|
|
859
|
+
quaternion
|
|
860
|
+
);
|
|
861
|
+
let sphericalC = dggs_a5_quaternion_rotate(
|
|
862
|
+
dggs_a5_to_cartesian(vec2f(polarC.y + originAngle, atan(polarC.x))),
|
|
863
|
+
quaternion
|
|
864
|
+
);
|
|
865
|
+
return DggsA5SphericalTriangle(
|
|
866
|
+
dggs_a5_normalize_vec3(sphericalA),
|
|
867
|
+
dggs_a5_normalize_vec3(sphericalB),
|
|
868
|
+
dggs_a5_normalize_vec3(sphericalC)
|
|
869
|
+
);
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
fn dggs_a5_face_to_barycentric(point : vec2f, triangle : DggsA5FaceTriangle) -> vec3f {
|
|
873
|
+
let d31 = triangle.a - triangle.c;
|
|
874
|
+
let d23 = triangle.c - triangle.b;
|
|
875
|
+
let d3p = point - triangle.c;
|
|
876
|
+
let determinant = d23.x * d31.y - d23.y * d31.x;
|
|
877
|
+
if (abs(determinant) < 1.0e-12) {
|
|
878
|
+
return vec3f(1.0, 0.0, 0.0);
|
|
879
|
+
}
|
|
880
|
+
let b0 = (d23.x * d3p.y - d23.y * d3p.x) / determinant;
|
|
881
|
+
let b1 = (d31.x * d3p.y - d31.y * d3p.x) / determinant;
|
|
882
|
+
return vec3f(b0, b1, 1.0 - (b0 + b1));
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
fn dggs_a5_triangle_area(a : vec3f, b : vec3f, c : vec3f) -> f32 {
|
|
886
|
+
let midA = dggs_a5_normalize_vec3((b + c) * 0.5);
|
|
887
|
+
let midB = dggs_a5_normalize_vec3((c + a) * 0.5);
|
|
888
|
+
let midC = dggs_a5_normalize_vec3((a + b) * 0.5);
|
|
889
|
+
let tripleProduct = dot(midA, cross(midB, midC));
|
|
890
|
+
let clamped = clamp(tripleProduct, -1.0, 1.0);
|
|
891
|
+
if (abs(clamped) < 1.0e-8) {
|
|
892
|
+
return 2.0 * clamped;
|
|
893
|
+
}
|
|
894
|
+
return asin(clamped) * 2.0;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
fn dggs_a5_spherical_triangle_area(triangle : DggsA5SphericalTriangle) -> f32 {
|
|
898
|
+
return dggs_a5_triangle_area(triangle.a, triangle.b, triangle.c);
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
fn dggs_a5_vector_difference(a : vec3f, b : vec3f) -> f32 {
|
|
902
|
+
let midpoint = dggs_a5_normalize_vec3((a + b) * 0.5);
|
|
903
|
+
let crossProduct = cross(a, midpoint);
|
|
904
|
+
let distance = length(crossProduct);
|
|
905
|
+
if (distance < 1.0e-8) {
|
|
906
|
+
return 0.5 * length(a - b);
|
|
907
|
+
}
|
|
908
|
+
return distance;
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
fn dggs_a5_slerp(a : vec3f, b : vec3f, t : f32) -> vec3f {
|
|
912
|
+
let cosineGamma = clamp(dot(a, b), -1.0, 1.0);
|
|
913
|
+
let gamma = acos(cosineGamma);
|
|
914
|
+
if (gamma < 1.0e-8) {
|
|
915
|
+
return dggs_a5_normalize_vec3(mix(a, b, t));
|
|
916
|
+
}
|
|
917
|
+
let sinGamma = sin(gamma);
|
|
918
|
+
if (abs(sinGamma) < 1.0e-8) {
|
|
919
|
+
return dggs_a5_normalize_vec3(mix(a, b, t));
|
|
920
|
+
}
|
|
921
|
+
let weightA = sin((1.0 - t) * gamma) / sinGamma;
|
|
922
|
+
let weightB = sin(t * gamma) / sinGamma;
|
|
923
|
+
return dggs_a5_normalize_vec3(weightA * a + weightB * b);
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
fn dggs_a5_safe_acos(value : f32) -> f32 {
|
|
927
|
+
if (value < 1.0e-3) {
|
|
928
|
+
return 2.0 * value + value * value * value / 3.0;
|
|
929
|
+
}
|
|
930
|
+
return acos(clamp(1.0 - 2.0 * value * value, -1.0, 1.0));
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
fn dggs_a5_polyhedral_inverse_edge(a : vec3f, b : vec3f, edgeHeight : f32) -> vec3f {
|
|
934
|
+
let difference = dggs_a5_vector_difference(a, b);
|
|
935
|
+
let denominator = max(dggs_a5_safe_acos(difference), 1.0e-8);
|
|
936
|
+
let interpolation = dggs_a5_safe_acos(clamp(edgeHeight, 0.0, 1.0) * difference) / denominator;
|
|
937
|
+
return dggs_a5_slerp(a, b, clamp(interpolation, 0.0, 1.0));
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
fn dggs_a5_polyhedral_inverse(
|
|
941
|
+
facePoint : vec2f,
|
|
942
|
+
faceTriangle : DggsA5FaceTriangle,
|
|
943
|
+
sphericalTriangle : DggsA5SphericalTriangle
|
|
944
|
+
) -> vec3f {
|
|
945
|
+
let barycentric = dggs_a5_face_to_barycentric(facePoint, faceTriangle);
|
|
946
|
+
if (barycentric.x > 0.9999999) {
|
|
947
|
+
return sphericalTriangle.a;
|
|
948
|
+
}
|
|
949
|
+
if (barycentric.y > 0.9999999) {
|
|
950
|
+
return sphericalTriangle.b;
|
|
951
|
+
}
|
|
952
|
+
if (barycentric.z > 0.9999999) {
|
|
953
|
+
return sphericalTriangle.c;
|
|
954
|
+
}
|
|
955
|
+
if (abs(barycentric.z) < 1.0e-6) {
|
|
956
|
+
return dggs_a5_polyhedral_inverse_edge(
|
|
957
|
+
sphericalTriangle.a,
|
|
958
|
+
sphericalTriangle.b,
|
|
959
|
+
1.0 - barycentric.x
|
|
960
|
+
);
|
|
961
|
+
}
|
|
962
|
+
if (abs(barycentric.y) < 1.0e-6) {
|
|
963
|
+
return dggs_a5_polyhedral_inverse_edge(
|
|
964
|
+
sphericalTriangle.a,
|
|
965
|
+
sphericalTriangle.c,
|
|
966
|
+
1.0 - barycentric.x
|
|
967
|
+
);
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
let crossBC = cross(sphericalTriangle.b, sphericalTriangle.c);
|
|
971
|
+
let areaABC = dggs_a5_spherical_triangle_area(sphericalTriangle);
|
|
972
|
+
let h = max(1.0 - barycentric.x, 1.0e-8);
|
|
973
|
+
let areaRatio = barycentric.z / h;
|
|
974
|
+
let alpha = areaRatio * areaABC;
|
|
975
|
+
let sineAlpha = sin(alpha);
|
|
976
|
+
let halfSineAlpha = sin(alpha * 0.5);
|
|
977
|
+
let chordCoefficient = 2.0 * halfSineAlpha * halfSineAlpha;
|
|
978
|
+
let dotAB = dot(sphericalTriangle.a, sphericalTriangle.b);
|
|
979
|
+
let dotBC = dot(sphericalTriangle.b, sphericalTriangle.c);
|
|
980
|
+
let dotCA = dot(sphericalTriangle.c, sphericalTriangle.a);
|
|
981
|
+
let lengthBC = length(crossBC);
|
|
982
|
+
let volume = dot(sphericalTriangle.a, crossBC);
|
|
983
|
+
let f = sineAlpha * volume + chordCoefficient * (dotAB * dotBC - dotCA);
|
|
984
|
+
let g = chordCoefficient * lengthBC * (1.0 + dotAB);
|
|
985
|
+
let edgeAngle = max(acos(clamp(dotBC, -1.0, 1.0)), 1.0e-8);
|
|
986
|
+
let q = 2.0 / edgeAngle * atan2(g, f);
|
|
987
|
+
let pointOnBC = dggs_a5_slerp(sphericalTriangle.b, sphericalTriangle.c, q);
|
|
988
|
+
let k = dggs_a5_vector_difference(sphericalTriangle.a, pointOnBC);
|
|
989
|
+
let denominator = max(dggs_a5_safe_acos(k), 1.0e-8);
|
|
990
|
+
let t = dggs_a5_safe_acos(h * k) / denominator;
|
|
991
|
+
return dggs_a5_slerp(sphericalTriangle.a, pointOnBC, t);
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
fn dggs_a5_authalic_inverse(phi : f32) -> f32 {
|
|
995
|
+
let sinPhi = sin(phi);
|
|
996
|
+
let cosPhi = cos(phi);
|
|
997
|
+
let coefficientX = 2.0 * (cosPhi - sinPhi) * (cosPhi + sinPhi);
|
|
998
|
+
var u0 = coefficientX * 4.92842354825238055e-17 + 2.19128723067677184e-14;
|
|
999
|
+
var u1 = coefficientX * u0 + 1.02018123778161003e-11;
|
|
1000
|
+
u0 = coefficientX * u1 - u0 + 5.08622073997266026e-9;
|
|
1001
|
+
u1 = coefficientX * u0 - u1 + 0.00000288319780486075558;
|
|
1002
|
+
u0 = coefficientX * u1 - u0 + 0.00223920899635416575;
|
|
1003
|
+
return phi + 2.0 * sinPhi * cosPhi * u0;
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
fn dggs_a5_normalize_longitude(longitude : f32) -> f32 {
|
|
1007
|
+
var result = longitude;
|
|
1008
|
+
loop {
|
|
1009
|
+
if (result < -180.0) {
|
|
1010
|
+
result += 360.0;
|
|
1011
|
+
} else {
|
|
1012
|
+
break;
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
loop {
|
|
1016
|
+
if (result >= 180.0) {
|
|
1017
|
+
result -= 360.0;
|
|
1018
|
+
} else {
|
|
1019
|
+
break;
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
return result;
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
fn dggs_a5_normalize_longitude_to_center(longitude : f32, centerLongitude : f32) -> f32 {
|
|
1026
|
+
var result = longitude;
|
|
1027
|
+
loop {
|
|
1028
|
+
if (result - centerLongitude > 180.0) {
|
|
1029
|
+
result -= 360.0;
|
|
1030
|
+
} else {
|
|
1031
|
+
break;
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
loop {
|
|
1035
|
+
if (result - centerLongitude < -180.0) {
|
|
1036
|
+
result += 360.0;
|
|
1037
|
+
} else {
|
|
1038
|
+
break;
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
return result;
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
fn dggs_a5_sphere_to_lnglat(cartesian : vec3f) -> vec2f {
|
|
1045
|
+
let point = dggs_a5_normalize_vec3(cartesian);
|
|
1046
|
+
var theta = 0.0;
|
|
1047
|
+
if (dot(point.xy, point.xy) > 1.0e-12) {
|
|
1048
|
+
theta = atan2(point.y, point.x);
|
|
1049
|
+
}
|
|
1050
|
+
let phi = acos(clamp(point.z, -1.0, 1.0));
|
|
1051
|
+
let longitude = dggs_a5_normalize_longitude(theta * DGGS_RADIANS_TO_DEGREES - DGGS_A5_LONGITUDE_OFFSET);
|
|
1052
|
+
let authalicLatitude = DGGS_PI_OVER_2 - phi;
|
|
1053
|
+
let latitude = dggs_a5_authalic_inverse(authalicLatitude) * DGGS_RADIANS_TO_DEGREES;
|
|
1054
|
+
return vec2f(longitude, latitude);
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
fn dggs_a5_face_to_lnglat(facePoint : vec2f, origin : u32) -> vec2f {
|
|
1058
|
+
let polar = dggs_a5_to_polar(facePoint);
|
|
1059
|
+
let faceTriangleIndex = dggs_a5_get_face_triangle_index(polar);
|
|
1060
|
+
let reflected = dggs_a5_should_reflect(polar);
|
|
1061
|
+
let faceTriangle = dggs_a5_get_face_triangle(faceTriangleIndex, reflected, false);
|
|
1062
|
+
let sphericalTriangle = dggs_a5_face_triangle_to_spherical_triangle(
|
|
1063
|
+
faceTriangleIndex,
|
|
1064
|
+
origin,
|
|
1065
|
+
reflected
|
|
1066
|
+
);
|
|
1067
|
+
return dggs_a5_sphere_to_lnglat(
|
|
1068
|
+
dggs_a5_polyhedral_inverse(facePoint, faceTriangle, sphericalTriangle)
|
|
1069
|
+
);
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
fn dggs_a5_get_center_lnglat(index : vec2u) -> vec2f {
|
|
1073
|
+
let cell = dggs_a5_deserialize(index);
|
|
1074
|
+
if (cell.valid == 0u || dggs_u64_is_zero(index)) {
|
|
1075
|
+
return vec2f(0.0);
|
|
1076
|
+
}
|
|
1077
|
+
if (cell.resolution == 0u) {
|
|
1078
|
+
return dggs_a5_sphere_to_lnglat(dggs_a5_quaternion_rotate(
|
|
1079
|
+
vec3f(0.0, 0.0, 1.0),
|
|
1080
|
+
dggs_a5_get_origin_quaternion(cell.origin)
|
|
1081
|
+
));
|
|
1082
|
+
}
|
|
1083
|
+
return dggs_a5_face_to_lnglat(
|
|
1084
|
+
dggs_a5_get_cell_center_face_point(index, cell),
|
|
1085
|
+
cell.origin
|
|
1086
|
+
);
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
fn dggs_a5_get_center_unit_vector(index : vec2u) -> vec3f {
|
|
1090
|
+
let longitudeLatitude = dggs_a5_get_center_lnglat(index) * DGGS_DEGREES_TO_RADIANS;
|
|
1091
|
+
let cosLatitude = cos(longitudeLatitude.y);
|
|
1092
|
+
return vec3f(
|
|
1093
|
+
cosLatitude * cos(longitudeLatitude.x),
|
|
1094
|
+
cosLatitude * sin(longitudeLatitude.x),
|
|
1095
|
+
sin(longitudeLatitude.y)
|
|
1096
|
+
);
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
fn dggs_a5_get_boundary_point(index : vec2u, vertexIndex : u32) -> vec2f {
|
|
1100
|
+
let cell = dggs_a5_deserialize(index);
|
|
1101
|
+
if (cell.valid == 0u || dggs_u64_is_zero(index)) {
|
|
1102
|
+
return vec2f(0.0);
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
let shapeVertexCount = dggs_a5_get_shape_vertex_count(cell);
|
|
1106
|
+
let shapeIndex = dggs_a5_get_reversed_shape_index(vertexIndex, shapeVertexCount);
|
|
1107
|
+
let facePoint = dggs_a5_get_cell_shape_face_point(index, cell, shapeIndex);
|
|
1108
|
+
let centerPoint = dggs_a5_get_cell_center_face_point(index, cell);
|
|
1109
|
+
var lngLat = dggs_a5_face_to_lnglat(facePoint, cell.origin);
|
|
1110
|
+
let centerLngLat = dggs_a5_face_to_lnglat(centerPoint, cell.origin);
|
|
1111
|
+
lngLat.x = dggs_a5_normalize_longitude_to_center(lngLat.x, centerLngLat.x);
|
|
1112
|
+
return lngLat;
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
fn dggs_a5_get_boundary_point_fp64_split(index : vec2u, vertexIndex : u32) -> vec4f {
|
|
1116
|
+
return dggs_boundary_point_to_fp64_split(dggs_a5_get_boundary_point(index, vertexIndex));
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
fn dggs_h3_get_mode(index: vec2u) -> u32 {
|
|
1120
|
+
return dggs_u64_extract_bits(index, 59u, 4u);
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
fn dggs_h3_is_cell_mode(index: vec2u) -> bool {
|
|
1124
|
+
return dggs_h3_get_mode(index) == DGGS_H3_CELL_MODE;
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
fn dggs_h3_get_resolution(index: vec2u) -> u32 {
|
|
1128
|
+
return dggs_u64_extract_bits(index, 52u, 4u);
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
fn dggs_h3_get_base_cell(index: vec2u) -> u32 {
|
|
1132
|
+
return dggs_u64_extract_bits(index, 45u, 7u);
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
fn dggs_h3_digit_bit_offset(resolution: u32) -> u32 {
|
|
1136
|
+
return 3u * (DGGS_H3_MAX_RESOLUTION - resolution);
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
fn dggs_h3_get_digit(index: vec2u, resolution: u32) -> u32 {
|
|
1140
|
+
if (resolution == 0u || resolution > DGGS_H3_MAX_RESOLUTION) {
|
|
1141
|
+
return DGGS_H3_UNUSED_DIGIT;
|
|
1142
|
+
}
|
|
1143
|
+
return dggs_u64_extract_bits(index, dggs_h3_digit_bit_offset(resolution), 3u);
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
fn dggs_h3_is_valid_cell_id(index: vec2u) -> bool {
|
|
1147
|
+
let cellResolution = dggs_h3_get_resolution(index);
|
|
1148
|
+
if (
|
|
1149
|
+
(dggs_u64_high(index) >> 24u) != 8u ||
|
|
1150
|
+
!dggs_h3_is_cell_mode(index) ||
|
|
1151
|
+
cellResolution > DGGS_H3_MAX_RESOLUTION ||
|
|
1152
|
+
dggs_h3_get_base_cell(index) > DGGS_H3_MAX_BASE_CELL
|
|
1153
|
+
) {
|
|
1154
|
+
return false;
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
var digitResolution = 1u;
|
|
1158
|
+
loop {
|
|
1159
|
+
if (digitResolution > DGGS_H3_MAX_RESOLUTION) {
|
|
1160
|
+
break;
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
let digit = dggs_h3_get_digit(index, digitResolution);
|
|
1164
|
+
if (digitResolution <= cellResolution) {
|
|
1165
|
+
if (digit == DGGS_H3_UNUSED_DIGIT) {
|
|
1166
|
+
return false;
|
|
1167
|
+
}
|
|
1168
|
+
} else if (digit != DGGS_H3_UNUSED_DIGIT) {
|
|
1169
|
+
return false;
|
|
1170
|
+
}
|
|
1171
|
+
digitResolution += 1u;
|
|
1172
|
+
}
|
|
1173
|
+
if (
|
|
1174
|
+
dggs_h3_is_base_cell_pentagon(dggs_h3_get_base_cell(index)) &&
|
|
1175
|
+
dggs_h3_get_leading_non_zero_digit(index) == 1u
|
|
1176
|
+
) {
|
|
1177
|
+
return false;
|
|
1178
|
+
}
|
|
1179
|
+
return true;
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
fn dggs_h3_get_parent(index: vec2u, parentResolution: u32) -> vec2u {
|
|
1183
|
+
let currentResolution = dggs_h3_get_resolution(index);
|
|
1184
|
+
let targetResolution = min(parentResolution, currentResolution);
|
|
1185
|
+
var parent = dggs_u64_set_bits(index, 52u, 4u, targetResolution);
|
|
1186
|
+
var resolution = targetResolution + 1u;
|
|
1187
|
+
loop {
|
|
1188
|
+
if (resolution > DGGS_H3_MAX_RESOLUTION) {
|
|
1189
|
+
break;
|
|
1190
|
+
}
|
|
1191
|
+
parent = dggs_u64_set_bits(
|
|
1192
|
+
parent,
|
|
1193
|
+
dggs_h3_digit_bit_offset(resolution),
|
|
1194
|
+
3u,
|
|
1195
|
+
DGGS_H3_UNUSED_DIGIT
|
|
1196
|
+
);
|
|
1197
|
+
resolution += 1u;
|
|
1198
|
+
}
|
|
1199
|
+
return parent;
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
fn dggs_h3_positive_angle_rads(angle: f32) -> f32 {
|
|
1203
|
+
var result = angle;
|
|
1204
|
+
if (result < 0.0) {
|
|
1205
|
+
result += DGGS_TWO_PI;
|
|
1206
|
+
}
|
|
1207
|
+
if (result >= DGGS_TWO_PI) {
|
|
1208
|
+
result -= DGGS_TWO_PI;
|
|
1209
|
+
}
|
|
1210
|
+
return result;
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
fn dggs_h3_constrain_longitude(longitude: f32) -> f32 {
|
|
1214
|
+
var result = longitude;
|
|
1215
|
+
loop {
|
|
1216
|
+
if (result <= DGGS_PI) {
|
|
1217
|
+
break;
|
|
1218
|
+
}
|
|
1219
|
+
result -= DGGS_TWO_PI;
|
|
1220
|
+
}
|
|
1221
|
+
loop {
|
|
1222
|
+
if (result >= -DGGS_PI) {
|
|
1223
|
+
break;
|
|
1224
|
+
}
|
|
1225
|
+
result += DGGS_TWO_PI;
|
|
1226
|
+
}
|
|
1227
|
+
return result;
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
fn dggs_h3_is_resolution_class_iii(resolution: u32) -> bool {
|
|
1231
|
+
return (resolution & 1u) != 0u;
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
fn dggs_h3_is_base_cell_pentagon(baseCell: u32) -> bool {
|
|
1235
|
+
return baseCell == 4u ||
|
|
1236
|
+
baseCell == 14u ||
|
|
1237
|
+
baseCell == 24u ||
|
|
1238
|
+
baseCell == 38u ||
|
|
1239
|
+
baseCell == 49u ||
|
|
1240
|
+
baseCell == 58u ||
|
|
1241
|
+
baseCell == 63u ||
|
|
1242
|
+
baseCell == 72u ||
|
|
1243
|
+
baseCell == 83u ||
|
|
1244
|
+
baseCell == 97u ||
|
|
1245
|
+
baseCell == 107u ||
|
|
1246
|
+
baseCell == 117u;
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
fn dggs_h3_get_leading_non_zero_digit(index: vec2u) -> u32 {
|
|
1250
|
+
let cellResolution = dggs_h3_get_resolution(index);
|
|
1251
|
+
var resolution = 1u;
|
|
1252
|
+
loop {
|
|
1253
|
+
if (resolution > cellResolution) {
|
|
1254
|
+
break;
|
|
1255
|
+
}
|
|
1256
|
+
let digit = dggs_h3_get_digit(index, resolution);
|
|
1257
|
+
if (digit != 0u) {
|
|
1258
|
+
return digit;
|
|
1259
|
+
}
|
|
1260
|
+
resolution += 1u;
|
|
1261
|
+
}
|
|
1262
|
+
return 0u;
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
fn dggs_h3_get_base_cell_home(baseCell: u32) -> DggsH3FaceIJK {
|
|
1266
|
+
let values = array<vec4i, 122>(
|
|
1267
|
+
vec4i(1, 1, 0, 0),
|
|
1268
|
+
vec4i(2, 1, 1, 0),
|
|
1269
|
+
vec4i(1, 0, 0, 0),
|
|
1270
|
+
vec4i(2, 1, 0, 0),
|
|
1271
|
+
vec4i(0, 2, 0, 0),
|
|
1272
|
+
vec4i(1, 1, 1, 0),
|
|
1273
|
+
vec4i(1, 0, 0, 1),
|
|
1274
|
+
vec4i(2, 0, 0, 0),
|
|
1275
|
+
vec4i(0, 1, 0, 0),
|
|
1276
|
+
vec4i(2, 0, 1, 0),
|
|
1277
|
+
vec4i(1, 0, 1, 0),
|
|
1278
|
+
vec4i(1, 0, 1, 1),
|
|
1279
|
+
vec4i(3, 1, 0, 0),
|
|
1280
|
+
vec4i(3, 1, 1, 0),
|
|
1281
|
+
vec4i(11, 2, 0, 0),
|
|
1282
|
+
vec4i(4, 1, 0, 0),
|
|
1283
|
+
vec4i(0, 0, 0, 0),
|
|
1284
|
+
vec4i(6, 0, 1, 0),
|
|
1285
|
+
vec4i(0, 0, 0, 1),
|
|
1286
|
+
vec4i(2, 0, 1, 1),
|
|
1287
|
+
vec4i(7, 0, 0, 1),
|
|
1288
|
+
vec4i(2, 0, 0, 1),
|
|
1289
|
+
vec4i(0, 1, 1, 0),
|
|
1290
|
+
vec4i(6, 0, 0, 1),
|
|
1291
|
+
vec4i(10, 2, 0, 0),
|
|
1292
|
+
vec4i(6, 0, 0, 0),
|
|
1293
|
+
vec4i(3, 0, 0, 0),
|
|
1294
|
+
vec4i(11, 1, 0, 0),
|
|
1295
|
+
vec4i(4, 1, 1, 0),
|
|
1296
|
+
vec4i(3, 0, 1, 0),
|
|
1297
|
+
vec4i(0, 0, 1, 1),
|
|
1298
|
+
vec4i(4, 0, 0, 0),
|
|
1299
|
+
vec4i(5, 0, 1, 0),
|
|
1300
|
+
vec4i(0, 0, 1, 0),
|
|
1301
|
+
vec4i(7, 0, 1, 0),
|
|
1302
|
+
vec4i(11, 1, 1, 0),
|
|
1303
|
+
vec4i(7, 0, 0, 0),
|
|
1304
|
+
vec4i(10, 1, 0, 0),
|
|
1305
|
+
vec4i(12, 2, 0, 0),
|
|
1306
|
+
vec4i(6, 1, 0, 1),
|
|
1307
|
+
vec4i(7, 1, 0, 1),
|
|
1308
|
+
vec4i(4, 0, 0, 1),
|
|
1309
|
+
vec4i(3, 0, 0, 1),
|
|
1310
|
+
vec4i(3, 0, 1, 1),
|
|
1311
|
+
vec4i(4, 0, 1, 0),
|
|
1312
|
+
vec4i(6, 1, 0, 0),
|
|
1313
|
+
vec4i(11, 0, 0, 0),
|
|
1314
|
+
vec4i(8, 0, 0, 1),
|
|
1315
|
+
vec4i(5, 0, 0, 1),
|
|
1316
|
+
vec4i(14, 2, 0, 0),
|
|
1317
|
+
vec4i(5, 0, 0, 0),
|
|
1318
|
+
vec4i(12, 1, 0, 0),
|
|
1319
|
+
vec4i(10, 1, 1, 0),
|
|
1320
|
+
vec4i(4, 0, 1, 1),
|
|
1321
|
+
vec4i(12, 1, 1, 0),
|
|
1322
|
+
vec4i(7, 1, 0, 0),
|
|
1323
|
+
vec4i(11, 0, 1, 0),
|
|
1324
|
+
vec4i(10, 0, 0, 0),
|
|
1325
|
+
vec4i(13, 2, 0, 0),
|
|
1326
|
+
vec4i(10, 0, 0, 1),
|
|
1327
|
+
vec4i(11, 0, 0, 1),
|
|
1328
|
+
vec4i(9, 0, 1, 0),
|
|
1329
|
+
vec4i(8, 0, 1, 0),
|
|
1330
|
+
vec4i(6, 2, 0, 0),
|
|
1331
|
+
vec4i(8, 0, 0, 0),
|
|
1332
|
+
vec4i(9, 0, 0, 1),
|
|
1333
|
+
vec4i(14, 1, 0, 0),
|
|
1334
|
+
vec4i(5, 1, 0, 1),
|
|
1335
|
+
vec4i(16, 0, 1, 1),
|
|
1336
|
+
vec4i(8, 1, 0, 1),
|
|
1337
|
+
vec4i(5, 1, 0, 0),
|
|
1338
|
+
vec4i(12, 0, 0, 0),
|
|
1339
|
+
vec4i(7, 2, 0, 0),
|
|
1340
|
+
vec4i(12, 0, 1, 0),
|
|
1341
|
+
vec4i(10, 0, 1, 0),
|
|
1342
|
+
vec4i(9, 0, 0, 0),
|
|
1343
|
+
vec4i(13, 1, 0, 0),
|
|
1344
|
+
vec4i(16, 0, 0, 1),
|
|
1345
|
+
vec4i(15, 0, 1, 1),
|
|
1346
|
+
vec4i(15, 0, 1, 0),
|
|
1347
|
+
vec4i(16, 0, 1, 0),
|
|
1348
|
+
vec4i(14, 1, 1, 0),
|
|
1349
|
+
vec4i(13, 1, 1, 0),
|
|
1350
|
+
vec4i(5, 2, 0, 0),
|
|
1351
|
+
vec4i(8, 1, 0, 0),
|
|
1352
|
+
vec4i(14, 0, 0, 0),
|
|
1353
|
+
vec4i(9, 1, 0, 1),
|
|
1354
|
+
vec4i(14, 0, 0, 1),
|
|
1355
|
+
vec4i(17, 0, 0, 1),
|
|
1356
|
+
vec4i(12, 0, 0, 1),
|
|
1357
|
+
vec4i(16, 0, 0, 0),
|
|
1358
|
+
vec4i(17, 0, 1, 1),
|
|
1359
|
+
vec4i(15, 0, 0, 1),
|
|
1360
|
+
vec4i(16, 1, 0, 1),
|
|
1361
|
+
vec4i(9, 1, 0, 0),
|
|
1362
|
+
vec4i(15, 0, 0, 0),
|
|
1363
|
+
vec4i(13, 0, 0, 0),
|
|
1364
|
+
vec4i(8, 2, 0, 0),
|
|
1365
|
+
vec4i(13, 0, 1, 0),
|
|
1366
|
+
vec4i(17, 1, 0, 1),
|
|
1367
|
+
vec4i(19, 0, 1, 0),
|
|
1368
|
+
vec4i(14, 0, 1, 0),
|
|
1369
|
+
vec4i(19, 0, 1, 1),
|
|
1370
|
+
vec4i(17, 0, 1, 0),
|
|
1371
|
+
vec4i(13, 0, 0, 1),
|
|
1372
|
+
vec4i(17, 0, 0, 0),
|
|
1373
|
+
vec4i(16, 1, 0, 0),
|
|
1374
|
+
vec4i(9, 2, 0, 0),
|
|
1375
|
+
vec4i(15, 1, 0, 1),
|
|
1376
|
+
vec4i(15, 1, 0, 0),
|
|
1377
|
+
vec4i(18, 0, 1, 1),
|
|
1378
|
+
vec4i(18, 0, 0, 1),
|
|
1379
|
+
vec4i(19, 0, 0, 1),
|
|
1380
|
+
vec4i(17, 1, 0, 0),
|
|
1381
|
+
vec4i(19, 0, 0, 0),
|
|
1382
|
+
vec4i(18, 0, 1, 0),
|
|
1383
|
+
vec4i(18, 1, 0, 1),
|
|
1384
|
+
vec4i(19, 2, 0, 0),
|
|
1385
|
+
vec4i(19, 1, 0, 0),
|
|
1386
|
+
vec4i(18, 0, 0, 0),
|
|
1387
|
+
vec4i(19, 1, 0, 1),
|
|
1388
|
+
vec4i(18, 1, 0, 0)
|
|
1389
|
+
);
|
|
1390
|
+
let value = values[min(baseCell, DGGS_H3_MAX_BASE_CELL)];
|
|
1391
|
+
return DggsH3FaceIJK(
|
|
1392
|
+
u32(value.x),
|
|
1393
|
+
value.yzw,
|
|
1394
|
+
select(1u, 0u, baseCell > DGGS_H3_MAX_BASE_CELL)
|
|
1395
|
+
);
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
fn dggs_h3_get_face_center_geo(face: u32) -> vec2f {
|
|
1399
|
+
let values = array<vec2f, 20>(
|
|
1400
|
+
vec2f(0.803582649718989942, 1.248397419617396099),
|
|
1401
|
+
vec2f(1.307747883455638156, 2.536945009877921159),
|
|
1402
|
+
vec2f(1.054751253523952054, -1.347517358900396623),
|
|
1403
|
+
vec2f(0.600191595538186799, -0.450603909469755746),
|
|
1404
|
+
vec2f(0.491715428198773866, 0.401988202911306943),
|
|
1405
|
+
vec2f(0.172745327415618701, 1.678146885280433686),
|
|
1406
|
+
vec2f(0.605929321571350690, 2.953923329812411617),
|
|
1407
|
+
vec2f(0.427370518328979641, -1.888876200336285401),
|
|
1408
|
+
vec2f(-0.079066118549212831, -0.733429513380867741),
|
|
1409
|
+
vec2f(-0.230961644455383637, 0.506495587332349035),
|
|
1410
|
+
vec2f(0.079066118549212831, 2.408163140208925497),
|
|
1411
|
+
vec2f(0.230961644455383637, -2.635097066257444203),
|
|
1412
|
+
vec2f(-0.172745327415618701, -1.463445768309359553),
|
|
1413
|
+
vec2f(-0.605929321571350690, -0.187669323777381622),
|
|
1414
|
+
vec2f(-0.427370518328979641, 1.252716453253507838),
|
|
1415
|
+
vec2f(-0.600191595538186799, 2.690988744120037492),
|
|
1416
|
+
vec2f(-0.491715428198773866, -2.739604450678486295),
|
|
1417
|
+
vec2f(-0.803582649718989942, -1.893195233972397139),
|
|
1418
|
+
vec2f(-1.307747883455638156, -0.604647643711872080),
|
|
1419
|
+
vec2f(-1.054751253523952054, 1.794075294689396615)
|
|
1420
|
+
);
|
|
1421
|
+
return values[min(face, 19u)];
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
fn dggs_h3_get_face_axis_azimuths(face: u32) -> vec3f {
|
|
1425
|
+
let values = array<vec3f, 20>(
|
|
1426
|
+
vec3f(5.619958268523939882, 3.525563166130744542, 1.431168063737548730),
|
|
1427
|
+
vec3f(5.760339081714187279, 3.665943979320991689, 1.571548876927796127),
|
|
1428
|
+
vec3f(0.780213654393430055, 4.969003859179821079, 2.874608756786625655),
|
|
1429
|
+
vec3f(0.430469363979999913, 4.619259568766391033, 2.524864466373195467),
|
|
1430
|
+
vec3f(6.130269123335111400, 4.035874020941915804, 1.941478918548720291),
|
|
1431
|
+
vec3f(2.692877706530642877, 0.598482604137447119, 4.787272808923838195),
|
|
1432
|
+
vec3f(2.982963003477243874, 0.888567901084048369, 5.077358105870439581),
|
|
1433
|
+
vec3f(3.532912002790141181, 1.438516900396945656, 5.627307105183336758),
|
|
1434
|
+
vec3f(3.494305004259568154, 1.399909901866372864, 5.588700106652763840),
|
|
1435
|
+
vec3f(3.003214169499538391, 0.908819067106342928, 5.097609271892733906),
|
|
1436
|
+
vec3f(5.930472956509811562, 3.836077854116615875, 1.741682751723420374),
|
|
1437
|
+
vec3f(0.138378484090254847, 4.327168688876645809, 2.232773586483450311),
|
|
1438
|
+
vec3f(0.448714947059150361, 4.637505151845541521, 2.543110049452346120),
|
|
1439
|
+
vec3f(0.158629650112549365, 4.347419854898940135, 2.253024752505744869),
|
|
1440
|
+
vec3f(5.891865957979238535, 3.797470855586042958, 1.703075753192847583),
|
|
1441
|
+
vec3f(2.711123289609793325, 0.616728187216597771, 4.805518392002988683),
|
|
1442
|
+
vec3f(3.294508837434268316, 1.200113735041072948, 5.388903939827463911),
|
|
1443
|
+
vec3f(3.804819692245439833, 1.710424589852244509, 5.899214794638635174),
|
|
1444
|
+
vec3f(3.664438879055192436, 1.570043776661997111, 5.758833981448388027),
|
|
1445
|
+
vec3f(2.361378999196363184, 0.266983896803167583, 4.455774101589558636)
|
|
1446
|
+
);
|
|
1447
|
+
return values[min(face, 19u)];
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1450
|
+
// Per face: unit-sphere center, Class II hex x axis, and Class II hex y axis.
|
|
1451
|
+
const DGGS_H3_FACE_UNIT_VECTOR_BASES = array<vec4f, 60>(
|
|
1452
|
+
vec4f(0.219930779140, 0.658369178027, 0.719847537893, 0.0),
|
|
1453
|
+
vec4f(0.404214808693, -0.733089476282, 0.546982822580, 0.0),
|
|
1454
|
+
vec4f(0.887829285854, 0.170674676471, -0.427351511044, 0.0),
|
|
1455
|
+
vec4f(-0.213923483450, 0.147817182955, 0.965601793521, 0.0),
|
|
1456
|
+
vec4f(0.972137411506, -0.064768238220, 0.225286325522, 0.0),
|
|
1457
|
+
vec4f(0.095841516985, 0.986891663629, -0.129843166477, 0.0),
|
|
1458
|
+
vec4f(0.109262527878, -0.481195157287, 0.869777512129, 0.0),
|
|
1459
|
+
vec4f(0.549081430333, 0.758619604829, 0.350721938339, 0.0),
|
|
1460
|
+
vec4f(-0.828595970824, 0.439257914866, 0.347104020954, 0.0),
|
|
1461
|
+
vec4f(0.742856730159, -0.359394167828, 0.564800593652, 0.0),
|
|
1462
|
+
vec4f(-0.280304147989, 0.599180039695, 0.749941907518, 0.0),
|
|
1463
|
+
vec4f(-0.607941989895, -0.715415342415, 0.344365249059, 0.0),
|
|
1464
|
+
vec4f(0.811253470914, 0.344895323764, 0.472138773641, 0.0),
|
|
1465
|
+
vec4f(-0.369836643998, -0.322746873758, 0.871237804641, 0.0),
|
|
1466
|
+
vec4f(0.452867157880, -0.881408912551, -0.134274592492, 0.0),
|
|
1467
|
+
vec4f(-0.105549814961, 0.979445729641, 0.171887461001, 0.0),
|
|
1468
|
+
vec4f(-0.447904449344, 0.107499848833, -0.887595283200, 0.0),
|
|
1469
|
+
vec4f(-0.887829285854, -0.170674676471, 0.427351511044, 0.0),
|
|
1470
|
+
vec4f(-0.807540757997, 0.153355248590, 0.569526199488, 0.0),
|
|
1471
|
+
vec4f(-0.581972789566, -0.050269394156, -0.811653041771, 0.0),
|
|
1472
|
+
vec4f(-0.095841516985, -0.986891663629, 0.129843166477, 0.0),
|
|
1473
|
+
vec4f(-0.284614806979, -0.864408097265, 0.414479255247, 0.0),
|
|
1474
|
+
vec4f(-0.482102819721, -0.244644896962, -0.841264373195, 0.0),
|
|
1475
|
+
vec4f(0.828595970824, -0.439257914866, -0.347104020954, 0.0),
|
|
1476
|
+
vec4f(0.740562147385, -0.667329956457, -0.078983764633, 0.0),
|
|
1477
|
+
vec4f(-0.286311443679, -0.207006321288, -0.935507423896, 0.0),
|
|
1478
|
+
vec4f(0.607941989895, 0.715415342415, -0.344365249059, 0.0),
|
|
1479
|
+
vec4f(0.851230398647, 0.472234378858, -0.228913738869, 0.0),
|
|
1480
|
+
vec4f(-0.265175688426, 0.010631100574, -0.964141501009, 0.0),
|
|
1481
|
+
vec4f(-0.452867157880, 0.881408912551, 0.134274592492, 0.0),
|
|
1482
|
+
vec4f(-0.740562147385, 0.667329956457, 0.078983764633, 0.0),
|
|
1483
|
+
vec4f(0.286311443679, 0.207006321288, 0.935507423896, 0.0),
|
|
1484
|
+
vec4f(0.607941989895, 0.715415342415, -0.344365249059, 0.0),
|
|
1485
|
+
vec4f(-0.851230398647, -0.472234378858, 0.228913738869, 0.0),
|
|
1486
|
+
vec4f(0.265175688426, -0.010631100574, 0.964141501009, 0.0),
|
|
1487
|
+
vec4f(-0.452867157880, 0.881408912551, 0.134274592492, 0.0),
|
|
1488
|
+
vec4f(0.105549814961, -0.979445729641, -0.171887461001, 0.0),
|
|
1489
|
+
vec4f(0.447904449344, -0.107499848833, 0.887595283200, 0.0),
|
|
1490
|
+
vec4f(-0.887829285854, -0.170674676471, 0.427351511044, 0.0),
|
|
1491
|
+
vec4f(0.807540757997, -0.153355248590, -0.569526199488, 0.0),
|
|
1492
|
+
vec4f(0.581972789566, 0.050269394156, 0.811653041771, 0.0),
|
|
1493
|
+
vec4f(-0.095841516985, -0.986891663629, 0.129843166477, 0.0),
|
|
1494
|
+
vec4f(0.284614806979, 0.864408097265, -0.414479255247, 0.0),
|
|
1495
|
+
vec4f(0.482102819721, 0.244644896962, 0.841264373195, 0.0),
|
|
1496
|
+
vec4f(0.828595970824, -0.439257914866, -0.347104020954, 0.0),
|
|
1497
|
+
vec4f(-0.742856730159, 0.359394167828, -0.564800593652, 0.0),
|
|
1498
|
+
vec4f(0.280304147989, -0.599180039695, -0.749941907518, 0.0),
|
|
1499
|
+
vec4f(-0.607941989895, -0.715415342415, 0.344365249059, 0.0),
|
|
1500
|
+
vec4f(-0.811253470914, -0.344895323764, -0.472138773641, 0.0),
|
|
1501
|
+
vec4f(0.369836643998, 0.322746873758, -0.871237804641, 0.0),
|
|
1502
|
+
vec4f(0.452867157880, -0.881408912551, -0.134274592492, 0.0),
|
|
1503
|
+
vec4f(-0.219930779140, -0.658369178027, -0.719847537893, 0.0),
|
|
1504
|
+
vec4f(-0.404214808693, 0.733089476282, -0.546982822580, 0.0),
|
|
1505
|
+
vec4f(0.887829285854, 0.170674676471, -0.427351511044, 0.0),
|
|
1506
|
+
vec4f(0.213923483450, -0.147817182955, -0.965601793521, 0.0),
|
|
1507
|
+
vec4f(-0.972137411506, 0.064768238220, -0.225286325522, 0.0),
|
|
1508
|
+
vec4f(0.095841516985, 0.986891663629, -0.129843166477, 0.0),
|
|
1509
|
+
vec4f(-0.109262527878, 0.481195157287, -0.869777512129, 0.0),
|
|
1510
|
+
vec4f(-0.549081430333, -0.758619604829, -0.350721938339, 0.0),
|
|
1511
|
+
vec4f(-0.828595970824, 0.439257914866, 0.347104020954, 0.0)
|
|
1512
|
+
);
|
|
1513
|
+
|
|
1514
|
+
fn dggs_h3_get_face_unit_vector_basis(face: u32, basisIndex: u32) -> vec3f {
|
|
1515
|
+
return DGGS_H3_FACE_UNIT_VECTOR_BASES[min(face, 19u) * 3u + min(basisIndex, 2u)].xyz;
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1518
|
+
fn dggs_h3_get_max_dim_by_cii_resolution(resolution: u32) -> i32 {
|
|
1519
|
+
let values = array<i32, 17>(
|
|
1520
|
+
2, -1, 14, -1, 98, -1, 686, -1, 4802, -1, 33614, -1, 235298, -1, 1647086, -1, 11529602
|
|
1521
|
+
);
|
|
1522
|
+
return values[min(resolution, 16u)];
|
|
1523
|
+
}
|
|
1524
|
+
|
|
1525
|
+
fn dggs_h3_get_unit_vector(digit: u32) -> vec3i {
|
|
1526
|
+
if (digit == 1u) {
|
|
1527
|
+
return vec3i(0, 0, 1);
|
|
1528
|
+
}
|
|
1529
|
+
if (digit == 2u) {
|
|
1530
|
+
return vec3i(0, 1, 0);
|
|
1531
|
+
}
|
|
1532
|
+
if (digit == 3u) {
|
|
1533
|
+
return vec3i(0, 1, 1);
|
|
1534
|
+
}
|
|
1535
|
+
if (digit == 4u) {
|
|
1536
|
+
return vec3i(1, 0, 0);
|
|
1537
|
+
}
|
|
1538
|
+
if (digit == 5u) {
|
|
1539
|
+
return vec3i(1, 0, 1);
|
|
1540
|
+
}
|
|
1541
|
+
if (digit == 6u) {
|
|
1542
|
+
return vec3i(1, 1, 0);
|
|
1543
|
+
}
|
|
1544
|
+
return vec3i(0);
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
fn dggs_h3_ijk_normalize(coord: vec3i) -> vec3i {
|
|
1548
|
+
var normalized = coord;
|
|
1549
|
+
if (normalized.x < 0) {
|
|
1550
|
+
normalized.y -= normalized.x;
|
|
1551
|
+
normalized.z -= normalized.x;
|
|
1552
|
+
normalized.x = 0;
|
|
1553
|
+
}
|
|
1554
|
+
if (normalized.y < 0) {
|
|
1555
|
+
normalized.x -= normalized.y;
|
|
1556
|
+
normalized.z -= normalized.y;
|
|
1557
|
+
normalized.y = 0;
|
|
1558
|
+
}
|
|
1559
|
+
if (normalized.z < 0) {
|
|
1560
|
+
normalized.x -= normalized.z;
|
|
1561
|
+
normalized.y -= normalized.z;
|
|
1562
|
+
normalized.z = 0;
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
let minimumValue = min(normalized.x, min(normalized.y, normalized.z));
|
|
1566
|
+
if (minimumValue > 0) {
|
|
1567
|
+
normalized -= vec3i(minimumValue);
|
|
1568
|
+
}
|
|
1569
|
+
return normalized;
|
|
1570
|
+
}
|
|
1571
|
+
|
|
1572
|
+
fn dggs_h3_neighbor(coord: vec3i, digit: u32) -> vec3i {
|
|
1573
|
+
if (digit > 0u && digit < DGGS_H3_UNUSED_DIGIT) {
|
|
1574
|
+
return dggs_h3_ijk_normalize(coord + dggs_h3_get_unit_vector(digit));
|
|
1575
|
+
}
|
|
1576
|
+
return coord;
|
|
1577
|
+
}
|
|
1578
|
+
|
|
1579
|
+
fn dggs_h3_down_ap3(coord: vec3i) -> vec3i {
|
|
1580
|
+
let iVector = vec3i(2, 0, 1) * coord.x;
|
|
1581
|
+
let jVector = vec3i(1, 2, 0) * coord.y;
|
|
1582
|
+
let kVector = vec3i(0, 1, 2) * coord.z;
|
|
1583
|
+
return dggs_h3_ijk_normalize(iVector + jVector + kVector);
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
fn dggs_h3_down_ap3r(coord: vec3i) -> vec3i {
|
|
1587
|
+
let iVector = vec3i(2, 1, 0) * coord.x;
|
|
1588
|
+
let jVector = vec3i(0, 2, 1) * coord.y;
|
|
1589
|
+
let kVector = vec3i(1, 0, 2) * coord.z;
|
|
1590
|
+
return dggs_h3_ijk_normalize(iVector + jVector + kVector);
|
|
1591
|
+
}
|
|
1592
|
+
|
|
1593
|
+
fn dggs_h3_down_ap7(coord: vec3i) -> vec3i {
|
|
1594
|
+
let iVector = vec3i(3, 0, 1) * coord.x;
|
|
1595
|
+
let jVector = vec3i(1, 3, 0) * coord.y;
|
|
1596
|
+
let kVector = vec3i(0, 1, 3) * coord.z;
|
|
1597
|
+
return dggs_h3_ijk_normalize(iVector + jVector + kVector);
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
fn dggs_h3_down_ap7r(coord: vec3i) -> vec3i {
|
|
1601
|
+
let iVector = vec3i(3, 1, 0) * coord.x;
|
|
1602
|
+
let jVector = vec3i(0, 3, 1) * coord.y;
|
|
1603
|
+
let kVector = vec3i(1, 0, 3) * coord.z;
|
|
1604
|
+
return dggs_h3_ijk_normalize(iVector + jVector + kVector);
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
fn dggs_h3_divide_round_nearest_seven(value: i32) -> i32 {
|
|
1608
|
+
return select((value - 3) / 7, (value + 3) / 7, value >= 0);
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
fn dggs_h3_up_ap7r(coord: vec3i) -> vec3i {
|
|
1612
|
+
let i = coord.x - coord.z;
|
|
1613
|
+
let j = coord.y - coord.z;
|
|
1614
|
+
return dggs_h3_ijk_normalize(vec3i(
|
|
1615
|
+
dggs_h3_divide_round_nearest_seven(2 * i + j),
|
|
1616
|
+
dggs_h3_divide_round_nearest_seven(3 * j - i),
|
|
1617
|
+
0
|
|
1618
|
+
));
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
fn dggs_h3_ijk_rotate_60_ccw(coord: vec3i) -> vec3i {
|
|
1622
|
+
let iVector = vec3i(1, 1, 0) * coord.x;
|
|
1623
|
+
let jVector = vec3i(0, 1, 1) * coord.y;
|
|
1624
|
+
let kVector = vec3i(1, 0, 1) * coord.z;
|
|
1625
|
+
return dggs_h3_ijk_normalize(iVector + jVector + kVector);
|
|
1626
|
+
}
|
|
1627
|
+
|
|
1628
|
+
fn dggs_h3_ijk_rotate_60_cw(coord: vec3i) -> vec3i {
|
|
1629
|
+
let iVector = vec3i(1, 0, 1) * coord.x;
|
|
1630
|
+
let jVector = vec3i(1, 1, 0) * coord.y;
|
|
1631
|
+
let kVector = vec3i(0, 1, 1) * coord.z;
|
|
1632
|
+
return dggs_h3_ijk_normalize(iVector + jVector + kVector);
|
|
1633
|
+
}
|
|
1634
|
+
|
|
1635
|
+
fn dggs_h3_rotate_digit_60_cw(digit: u32) -> u32 {
|
|
1636
|
+
let values = array<u32, 8>(0u, 3u, 6u, 2u, 5u, 1u, 4u, 7u);
|
|
1637
|
+
return values[min(digit, 7u)];
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1640
|
+
fn dggs_h3_get_face_neighbor(face: u32, quadrant: u32) -> DggsH3FaceIJK {
|
|
1641
|
+
let neighborFaces = array<vec3u, 20>(
|
|
1642
|
+
vec3u(4u, 1u, 5u),
|
|
1643
|
+
vec3u(0u, 2u, 6u),
|
|
1644
|
+
vec3u(1u, 3u, 7u),
|
|
1645
|
+
vec3u(2u, 4u, 8u),
|
|
1646
|
+
vec3u(3u, 0u, 9u),
|
|
1647
|
+
vec3u(10u, 14u, 0u),
|
|
1648
|
+
vec3u(11u, 10u, 1u),
|
|
1649
|
+
vec3u(12u, 11u, 2u),
|
|
1650
|
+
vec3u(13u, 12u, 3u),
|
|
1651
|
+
vec3u(14u, 13u, 4u),
|
|
1652
|
+
vec3u(5u, 6u, 15u),
|
|
1653
|
+
vec3u(6u, 7u, 16u),
|
|
1654
|
+
vec3u(7u, 8u, 17u),
|
|
1655
|
+
vec3u(8u, 9u, 18u),
|
|
1656
|
+
vec3u(9u, 5u, 19u),
|
|
1657
|
+
vec3u(16u, 19u, 10u),
|
|
1658
|
+
vec3u(17u, 15u, 11u),
|
|
1659
|
+
vec3u(18u, 16u, 12u),
|
|
1660
|
+
vec3u(19u, 17u, 13u),
|
|
1661
|
+
vec3u(15u, 18u, 14u)
|
|
1662
|
+
);
|
|
1663
|
+
let neighborFace = neighborFaces[min(face, 19u)][min(quadrant, 3u) - 1u];
|
|
1664
|
+
let isOuterBand = face < 5u || face >= 15u;
|
|
1665
|
+
var translate = vec3i(0, 2, 2);
|
|
1666
|
+
if (quadrant == 1u) {
|
|
1667
|
+
translate = select(vec3i(2, 2, 0), vec3i(2, 0, 2), isOuterBand);
|
|
1668
|
+
} else if (quadrant == 2u) {
|
|
1669
|
+
translate = select(vec3i(2, 0, 2), vec3i(2, 2, 0), isOuterBand);
|
|
1670
|
+
}
|
|
1671
|
+
var counterClockwiseRotations = 3u;
|
|
1672
|
+
if (isOuterBand && quadrant == 1u) {
|
|
1673
|
+
counterClockwiseRotations = 1u;
|
|
1674
|
+
} else if (isOuterBand && quadrant == 2u) {
|
|
1675
|
+
counterClockwiseRotations = 5u;
|
|
1676
|
+
}
|
|
1677
|
+
return DggsH3FaceIJK(neighborFace, translate, counterClockwiseRotations);
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1680
|
+
fn dggs_h3_adjust_overage_class_ii(
|
|
1681
|
+
input: DggsH3FaceIJK,
|
|
1682
|
+
resolution: u32,
|
|
1683
|
+
pentagonLeading4: bool
|
|
1684
|
+
) -> DggsH3FaceIJKOverage {
|
|
1685
|
+
var faceIJK = input;
|
|
1686
|
+
let maximumDimension = dggs_h3_get_max_dim_by_cii_resolution(resolution);
|
|
1687
|
+
if (faceIJK.coord.x + faceIJK.coord.y + faceIJK.coord.z <= maximumDimension) {
|
|
1688
|
+
return DggsH3FaceIJKOverage(faceIJK, 0u);
|
|
1689
|
+
}
|
|
1690
|
+
|
|
1691
|
+
var quadrant = 1u;
|
|
1692
|
+
if (faceIJK.coord.z > 0) {
|
|
1693
|
+
quadrant = select(2u, 3u, faceIJK.coord.y > 0);
|
|
1694
|
+
if (quadrant == 2u && pentagonLeading4) {
|
|
1695
|
+
let origin = vec3i(maximumDimension, 0, 0);
|
|
1696
|
+
faceIJK.coord = dggs_h3_ijk_rotate_60_cw(faceIJK.coord - origin) + origin;
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
|
|
1700
|
+
let neighbor = dggs_h3_get_face_neighbor(faceIJK.face, quadrant);
|
|
1701
|
+
faceIJK.face = neighbor.face;
|
|
1702
|
+
var rotation = 0u;
|
|
1703
|
+
loop {
|
|
1704
|
+
if (rotation >= neighbor.valid) {
|
|
1705
|
+
break;
|
|
1706
|
+
}
|
|
1707
|
+
faceIJK.coord = dggs_h3_ijk_rotate_60_ccw(faceIJK.coord);
|
|
1708
|
+
rotation += 1u;
|
|
1709
|
+
}
|
|
1710
|
+
faceIJK.coord = dggs_h3_ijk_normalize(
|
|
1711
|
+
faceIJK.coord + neighbor.coord * (maximumDimension / 2)
|
|
1712
|
+
);
|
|
1713
|
+
faceIJK.valid = 1u;
|
|
1714
|
+
return DggsH3FaceIJKOverage(faceIJK, 2u);
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
fn dggs_h3_get_center_face_ijk(index: vec2u) -> DggsH3FaceIJK {
|
|
1718
|
+
if (!dggs_h3_is_valid_cell_id(index)) {
|
|
1719
|
+
return DggsH3FaceIJK(0u, vec3i(0), 0u);
|
|
1720
|
+
}
|
|
1721
|
+
|
|
1722
|
+
let baseCell = dggs_h3_get_base_cell(index);
|
|
1723
|
+
var faceIJK = dggs_h3_get_base_cell_home(baseCell);
|
|
1724
|
+
let cellResolution = dggs_h3_get_resolution(index);
|
|
1725
|
+
let isPentagonBaseCell = dggs_h3_is_base_cell_pentagon(baseCell);
|
|
1726
|
+
let leadingDigit = dggs_h3_get_leading_non_zero_digit(index);
|
|
1727
|
+
let rotateDigits = isPentagonBaseCell && leadingDigit == 5u;
|
|
1728
|
+
var resolution = 1u;
|
|
1729
|
+
loop {
|
|
1730
|
+
if (resolution > cellResolution) {
|
|
1731
|
+
break;
|
|
1732
|
+
}
|
|
1733
|
+
|
|
1734
|
+
if (dggs_h3_is_resolution_class_iii(resolution)) {
|
|
1735
|
+
faceIJK.coord = dggs_h3_down_ap7(faceIJK.coord);
|
|
1736
|
+
} else {
|
|
1737
|
+
faceIJK.coord = dggs_h3_down_ap7r(faceIJK.coord);
|
|
1738
|
+
}
|
|
1739
|
+
var digit = dggs_h3_get_digit(index, resolution);
|
|
1740
|
+
if (rotateDigits) {
|
|
1741
|
+
digit = dggs_h3_rotate_digit_60_cw(digit);
|
|
1742
|
+
}
|
|
1743
|
+
faceIJK.coord = dggs_h3_neighbor(faceIJK.coord, digit);
|
|
1744
|
+
resolution += 1u;
|
|
1745
|
+
}
|
|
1746
|
+
|
|
1747
|
+
let originalCoord = faceIJK.coord;
|
|
1748
|
+
var adjustedResolution = cellResolution;
|
|
1749
|
+
if (dggs_h3_is_resolution_class_iii(cellResolution)) {
|
|
1750
|
+
faceIJK.coord = dggs_h3_down_ap7r(faceIJK.coord);
|
|
1751
|
+
adjustedResolution += 1u;
|
|
1752
|
+
}
|
|
1753
|
+
|
|
1754
|
+
var adjustment = dggs_h3_adjust_overage_class_ii(
|
|
1755
|
+
faceIJK,
|
|
1756
|
+
adjustedResolution,
|
|
1757
|
+
isPentagonBaseCell && leadingDigit == 4u
|
|
1758
|
+
);
|
|
1759
|
+
if (adjustment.overage != 0u) {
|
|
1760
|
+
faceIJK = adjustment.faceIJK;
|
|
1761
|
+
if (isPentagonBaseCell) {
|
|
1762
|
+
var adjustmentCount = 0u;
|
|
1763
|
+
loop {
|
|
1764
|
+
if (adjustmentCount >= 4u) {
|
|
1765
|
+
break;
|
|
1766
|
+
}
|
|
1767
|
+
adjustment = dggs_h3_adjust_overage_class_ii(faceIJK, adjustedResolution, false);
|
|
1768
|
+
if (adjustment.overage == 0u) {
|
|
1769
|
+
break;
|
|
1770
|
+
}
|
|
1771
|
+
faceIJK = adjustment.faceIJK;
|
|
1772
|
+
adjustmentCount += 1u;
|
|
1773
|
+
}
|
|
1774
|
+
}
|
|
1775
|
+
if (adjustedResolution != cellResolution) {
|
|
1776
|
+
faceIJK.coord = dggs_h3_up_ap7r(faceIJK.coord);
|
|
1777
|
+
}
|
|
1778
|
+
} else if (adjustedResolution != cellResolution) {
|
|
1779
|
+
faceIJK.coord = originalCoord;
|
|
1780
|
+
}
|
|
1781
|
+
return faceIJK;
|
|
1782
|
+
}
|
|
1783
|
+
|
|
1784
|
+
fn dggs_h3_get_vertex_offset(resolution: u32, vertexIndex: u32) -> vec3i {
|
|
1785
|
+
let pointIndex = vertexIndex % 6u;
|
|
1786
|
+
if (dggs_h3_is_resolution_class_iii(resolution)) {
|
|
1787
|
+
let vertices = array<vec3i, 6>(
|
|
1788
|
+
vec3i(5, 4, 0),
|
|
1789
|
+
vec3i(1, 5, 0),
|
|
1790
|
+
vec3i(0, 5, 4),
|
|
1791
|
+
vec3i(0, 1, 5),
|
|
1792
|
+
vec3i(4, 0, 5),
|
|
1793
|
+
vec3i(5, 0, 1)
|
|
1794
|
+
);
|
|
1795
|
+
return vertices[pointIndex];
|
|
1796
|
+
}
|
|
1797
|
+
|
|
1798
|
+
let vertices = array<vec3i, 6>(
|
|
1799
|
+
vec3i(2, 1, 0),
|
|
1800
|
+
vec3i(1, 2, 0),
|
|
1801
|
+
vec3i(0, 2, 1),
|
|
1802
|
+
vec3i(0, 1, 2),
|
|
1803
|
+
vec3i(1, 0, 2),
|
|
1804
|
+
vec3i(2, 0, 1)
|
|
1805
|
+
);
|
|
1806
|
+
return vertices[pointIndex];
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
// Boundary generation retains the original home-face coordinates. Center projection applies face
|
|
1810
|
+
// overage separately because rewriting the center face changes the substrate vertex construction.
|
|
1811
|
+
fn dggs_h3_get_boundary_center_face_ijk(index: vec2u) -> DggsH3FaceIJK {
|
|
1812
|
+
if (!dggs_h3_is_valid_cell_id(index)) {
|
|
1813
|
+
return DggsH3FaceIJK(0u, vec3i(0), 0u);
|
|
1814
|
+
}
|
|
1815
|
+
let baseCell = dggs_h3_get_base_cell(index);
|
|
1816
|
+
if (dggs_h3_is_base_cell_pentagon(baseCell)) {
|
|
1817
|
+
return DggsH3FaceIJK(0u, vec3i(0), 0u);
|
|
1818
|
+
}
|
|
1819
|
+
|
|
1820
|
+
var faceIJK = dggs_h3_get_base_cell_home(baseCell);
|
|
1821
|
+
let cellResolution = dggs_h3_get_resolution(index);
|
|
1822
|
+
var resolution = 1u;
|
|
1823
|
+
loop {
|
|
1824
|
+
if (resolution > cellResolution) {
|
|
1825
|
+
break;
|
|
1826
|
+
}
|
|
1827
|
+
if (dggs_h3_is_resolution_class_iii(resolution)) {
|
|
1828
|
+
faceIJK.coord = dggs_h3_down_ap7(faceIJK.coord);
|
|
1829
|
+
} else {
|
|
1830
|
+
faceIJK.coord = dggs_h3_down_ap7r(faceIJK.coord);
|
|
1831
|
+
}
|
|
1832
|
+
faceIJK.coord = dggs_h3_neighbor(faceIJK.coord, dggs_h3_get_digit(index, resolution));
|
|
1833
|
+
resolution += 1u;
|
|
1834
|
+
}
|
|
1835
|
+
return faceIJK;
|
|
1836
|
+
}
|
|
1837
|
+
|
|
1838
|
+
fn dggs_h3_get_boundary_vertex(index: vec2u, vertexIndex: u32) -> DggsH3BoundaryVertex {
|
|
1839
|
+
let center = dggs_h3_get_boundary_center_face_ijk(index);
|
|
1840
|
+
if (center.valid == 0u) {
|
|
1841
|
+
return DggsH3BoundaryVertex(0u, vec3i(0), 0u, 0u);
|
|
1842
|
+
}
|
|
1843
|
+
|
|
1844
|
+
let cellResolution = dggs_h3_get_resolution(index);
|
|
1845
|
+
var adjustedResolution = cellResolution;
|
|
1846
|
+
var centerCoord = dggs_h3_down_ap3r(dggs_h3_down_ap3(center.coord));
|
|
1847
|
+
if (dggs_h3_is_resolution_class_iii(cellResolution)) {
|
|
1848
|
+
centerCoord = dggs_h3_down_ap7r(centerCoord);
|
|
1849
|
+
adjustedResolution += 1u;
|
|
1850
|
+
}
|
|
1851
|
+
|
|
1852
|
+
let vertexCoord = dggs_h3_ijk_normalize(
|
|
1853
|
+
centerCoord + dggs_h3_get_vertex_offset(cellResolution, vertexIndex)
|
|
1854
|
+
);
|
|
1855
|
+
let maximumDimension = dggs_h3_get_max_dim_by_cii_resolution(adjustedResolution) * 3;
|
|
1856
|
+
let vertexDimension = vertexCoord.x + vertexCoord.y + vertexCoord.z;
|
|
1857
|
+
if (vertexDimension >= maximumDimension) {
|
|
1858
|
+
return DggsH3BoundaryVertex(center.face, vertexCoord, adjustedResolution, 0u);
|
|
1859
|
+
}
|
|
1860
|
+
|
|
1861
|
+
return DggsH3BoundaryVertex(center.face, vertexCoord, adjustedResolution, 1u);
|
|
1862
|
+
}
|
|
1863
|
+
|
|
1864
|
+
fn dggs_h3_is_single_face_boundary(index: vec2u) -> bool {
|
|
1865
|
+
var vertexIndex = 0u;
|
|
1866
|
+
loop {
|
|
1867
|
+
if (vertexIndex >= 6u) {
|
|
1868
|
+
break;
|
|
1869
|
+
}
|
|
1870
|
+
if (dggs_h3_get_boundary_vertex(index, vertexIndex).valid == 0u) {
|
|
1871
|
+
return false;
|
|
1872
|
+
}
|
|
1873
|
+
vertexIndex += 1u;
|
|
1874
|
+
}
|
|
1875
|
+
return true;
|
|
1876
|
+
}
|
|
1877
|
+
|
|
1878
|
+
fn dggs_h3_ijk_to_hex2d(coord: vec3i) -> vec2f {
|
|
1879
|
+
let i = f32(coord.x - coord.z);
|
|
1880
|
+
let j = f32(coord.y - coord.z);
|
|
1881
|
+
return vec2f(i - 0.5 * j, j * DGGS_H3_SQRT3_2);
|
|
1882
|
+
}
|
|
1883
|
+
|
|
1884
|
+
fn dggs_h3_get_center_unit_vector(index: vec2u) -> vec3f {
|
|
1885
|
+
let center = dggs_h3_get_center_face_ijk(index);
|
|
1886
|
+
if (center.valid == 0u) {
|
|
1887
|
+
return vec3f(0.0);
|
|
1888
|
+
}
|
|
1889
|
+
|
|
1890
|
+
var hexPoint = dggs_h3_ijk_to_hex2d(center.coord);
|
|
1891
|
+
let resolution = dggs_h3_get_resolution(index);
|
|
1892
|
+
if (dggs_h3_is_resolution_class_iii(resolution)) {
|
|
1893
|
+
hexPoint = vec2f(
|
|
1894
|
+
0.944911182523 * hexPoint.x - 0.327326835354 * hexPoint.y,
|
|
1895
|
+
0.327326835354 * hexPoint.x + 0.944911182523 * hexPoint.y
|
|
1896
|
+
);
|
|
1897
|
+
}
|
|
1898
|
+
var scale = DGGS_H3_RES0_U_GNOMONIC;
|
|
1899
|
+
var resolutionIndex = 0u;
|
|
1900
|
+
loop {
|
|
1901
|
+
if (resolutionIndex >= resolution) {
|
|
1902
|
+
break;
|
|
1903
|
+
}
|
|
1904
|
+
scale *= DGGS_H3_RSQRT7;
|
|
1905
|
+
resolutionIndex += 1u;
|
|
1906
|
+
}
|
|
1907
|
+
return normalize(
|
|
1908
|
+
dggs_h3_get_face_unit_vector_basis(center.face, 0u) +
|
|
1909
|
+
scale * (
|
|
1910
|
+
hexPoint.x * dggs_h3_get_face_unit_vector_basis(center.face, 1u) +
|
|
1911
|
+
hexPoint.y * dggs_h3_get_face_unit_vector_basis(center.face, 2u)
|
|
1912
|
+
)
|
|
1913
|
+
);
|
|
1914
|
+
}
|
|
1915
|
+
|
|
1916
|
+
fn dggs_h3_get_center_lnglat(index: vec2u) -> vec2f {
|
|
1917
|
+
let unitVector = dggs_h3_get_center_unit_vector(index);
|
|
1918
|
+
if (dot(unitVector, unitVector) < 0.5) {
|
|
1919
|
+
return vec2f(0.0);
|
|
1920
|
+
}
|
|
1921
|
+
return vec2f(
|
|
1922
|
+
atan2(unitVector.y, unitVector.x) * DGGS_RADIANS_TO_DEGREES,
|
|
1923
|
+
atan2(unitVector.z, length(unitVector.xy)) * DGGS_RADIANS_TO_DEGREES
|
|
1924
|
+
);
|
|
1925
|
+
}
|
|
1926
|
+
|
|
1927
|
+
fn dggs_h3_geo_az_distance_rads(center: vec2f, azimuth: f32, distance: f32) -> vec2f {
|
|
1928
|
+
if (distance < 1.0e-7) {
|
|
1929
|
+
return center;
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
let positiveAzimuth = dggs_h3_positive_angle_rads(azimuth);
|
|
1933
|
+
let latitude = asin(clamp(
|
|
1934
|
+
sin(center.x) * cos(distance) + cos(center.x) * sin(distance) * cos(positiveAzimuth),
|
|
1935
|
+
-1.0,
|
|
1936
|
+
1.0
|
|
1937
|
+
));
|
|
1938
|
+
var longitude = 0.0;
|
|
1939
|
+
if (abs(latitude - DGGS_PI_OVER_2) < 1.0e-7) {
|
|
1940
|
+
return vec2f(DGGS_PI_OVER_2, 0.0);
|
|
1941
|
+
}
|
|
1942
|
+
if (abs(latitude + DGGS_PI_OVER_2) < 1.0e-7) {
|
|
1943
|
+
return vec2f(-DGGS_PI_OVER_2, 0.0);
|
|
1944
|
+
}
|
|
1945
|
+
|
|
1946
|
+
let inverseCosLatitude = 1.0 / max(cos(latitude), 1.0e-8);
|
|
1947
|
+
let sinLongitude = clamp(
|
|
1948
|
+
sin(positiveAzimuth) * sin(distance) * inverseCosLatitude,
|
|
1949
|
+
-1.0,
|
|
1950
|
+
1.0
|
|
1951
|
+
);
|
|
1952
|
+
let cosLongitude = clamp(
|
|
1953
|
+
(cos(distance) - sin(center.x) * sin(latitude)) / max(cos(center.x), 1.0e-8) *
|
|
1954
|
+
inverseCosLatitude,
|
|
1955
|
+
-1.0,
|
|
1956
|
+
1.0
|
|
1957
|
+
);
|
|
1958
|
+
longitude = dggs_h3_constrain_longitude(center.y + atan2(sinLongitude, cosLongitude));
|
|
1959
|
+
return vec2f(latitude, longitude);
|
|
1960
|
+
}
|
|
1961
|
+
|
|
1962
|
+
fn dggs_h3_hex2d_to_lnglat(point: vec2f, face: u32, resolution: u32, substrate: bool) -> vec2f {
|
|
1963
|
+
var radius = length(point);
|
|
1964
|
+
let center = dggs_h3_get_face_center_geo(face);
|
|
1965
|
+
if (radius < 1.0e-7) {
|
|
1966
|
+
return vec2f(center.y * DGGS_RADIANS_TO_DEGREES, center.x * DGGS_RADIANS_TO_DEGREES);
|
|
1967
|
+
}
|
|
1968
|
+
|
|
1969
|
+
var theta = atan2(point.y, point.x);
|
|
1970
|
+
var resolutionIndex = 0u;
|
|
1971
|
+
loop {
|
|
1972
|
+
if (resolutionIndex >= resolution) {
|
|
1973
|
+
break;
|
|
1974
|
+
}
|
|
1975
|
+
radius *= DGGS_H3_RSQRT7;
|
|
1976
|
+
resolutionIndex += 1u;
|
|
1977
|
+
}
|
|
1978
|
+
|
|
1979
|
+
if (substrate) {
|
|
1980
|
+
radius *= DGGS_H3_ONETHIRD;
|
|
1981
|
+
if (dggs_h3_is_resolution_class_iii(resolution)) {
|
|
1982
|
+
radius *= DGGS_H3_RSQRT7;
|
|
1983
|
+
}
|
|
1984
|
+
} else if (dggs_h3_is_resolution_class_iii(resolution)) {
|
|
1985
|
+
theta = dggs_h3_positive_angle_rads(theta + DGGS_H3_AP7_ROT_RADS);
|
|
1986
|
+
}
|
|
1987
|
+
|
|
1988
|
+
radius = atan(radius * DGGS_H3_RES0_U_GNOMONIC);
|
|
1989
|
+
theta = dggs_h3_positive_angle_rads(dggs_h3_get_face_axis_azimuths(face).x - theta);
|
|
1990
|
+
let latitudeLongitude = dggs_h3_geo_az_distance_rads(center, theta, radius);
|
|
1991
|
+
return vec2f(
|
|
1992
|
+
latitudeLongitude.y * DGGS_RADIANS_TO_DEGREES,
|
|
1993
|
+
latitudeLongitude.x * DGGS_RADIANS_TO_DEGREES
|
|
1994
|
+
);
|
|
1995
|
+
}
|
|
1996
|
+
|
|
1997
|
+
fn dggs_h3_get_boundary_point(index: vec2u, vertexIndex: u32) -> vec2f {
|
|
1998
|
+
if (!dggs_h3_is_single_face_boundary(index)) {
|
|
1999
|
+
return vec2f(0.0);
|
|
2000
|
+
}
|
|
2001
|
+
|
|
2002
|
+
let vertex = dggs_h3_get_boundary_vertex(index, vertexIndex % 6u);
|
|
2003
|
+
let hexPoint = dggs_h3_ijk_to_hex2d(vertex.coord);
|
|
2004
|
+
return dggs_h3_hex2d_to_lnglat(hexPoint, vertex.face, vertex.resolution, true);
|
|
2005
|
+
}
|
|
2006
|
+
|
|
2007
|
+
fn dggs_h3_get_boundary_point_fp64_split(index: vec2u, vertexIndex: u32) -> vec4f {
|
|
2008
|
+
return dggs_boundary_point_to_fp64_split(dggs_h3_get_boundary_point(index, vertexIndex));
|
|
2009
|
+
}
|
|
2010
|
+
|
|
2011
|
+
fn dggs_s2_get_face(index: vec2u) -> u32 {
|
|
2012
|
+
return dggs_u64_extract_bits(index, 61u, 3u);
|
|
2013
|
+
}
|
|
2014
|
+
|
|
2015
|
+
fn dggs_s2_get_level(index: vec2u) -> u32 {
|
|
2016
|
+
let trailingZeros = dggs_u64_count_trailing_zeros(index);
|
|
2017
|
+
if (trailingZeros > 60u) {
|
|
2018
|
+
return 0u;
|
|
2019
|
+
}
|
|
2020
|
+
return DGGS_S2_MAX_LEVEL - trailingZeros / 2u;
|
|
2021
|
+
}
|
|
2022
|
+
|
|
2023
|
+
fn dggs_s2_is_valid_cell_id(index: vec2u) -> bool {
|
|
2024
|
+
let trailingZeros = dggs_u64_count_trailing_zeros(index);
|
|
2025
|
+
return !dggs_u64_is_zero(index) &&
|
|
2026
|
+
dggs_s2_get_face(index) <= 5u &&
|
|
2027
|
+
trailingZeros <= 60u &&
|
|
2028
|
+
trailingZeros % 2u == 0u;
|
|
2029
|
+
}
|
|
2030
|
+
|
|
2031
|
+
fn dggs_s2_get_child_position(index: vec2u, level: u32) -> u32 {
|
|
2032
|
+
if (level == 0u || level > DGGS_S2_MAX_LEVEL) {
|
|
2033
|
+
return 0u;
|
|
2034
|
+
}
|
|
2035
|
+
return dggs_u64_extract_bits(index, 2u * (DGGS_S2_MAX_LEVEL - level) + 1u, 2u);
|
|
2036
|
+
}
|
|
2037
|
+
|
|
2038
|
+
// Packed geohash keys store the geohash length in bits 60..63 and right-align
|
|
2039
|
+
// the base32 character codes in the lower 60 bits, first character first.
|
|
2040
|
+
fn dggs_geohash_get_length(index: vec2u) -> u32 {
|
|
2041
|
+
return min(
|
|
2042
|
+
dggs_u64_extract_bits(index, DGGS_GEOHASH_LENGTH_BIT_OFFSET, 4u),
|
|
2043
|
+
DGGS_GEOHASH_MAX_LENGTH
|
|
2044
|
+
);
|
|
2045
|
+
}
|
|
2046
|
+
|
|
2047
|
+
fn dggs_geohash_get_character(index: vec2u, characterIndex: u32) -> u32 {
|
|
2048
|
+
let length = dggs_geohash_get_length(index);
|
|
2049
|
+
if (characterIndex >= length) {
|
|
2050
|
+
return 0u;
|
|
2051
|
+
}
|
|
2052
|
+
return dggs_u64_extract_bits(index, 5u * (length - characterIndex - 1u), 5u);
|
|
2053
|
+
}
|
|
2054
|
+
|
|
2055
|
+
// Returns vec4(west, south, east, north) in longitude/latitude degrees.
|
|
2056
|
+
fn dggs_geohash_get_bounds(index: vec2u) -> vec4f {
|
|
2057
|
+
let length = dggs_geohash_get_length(index);
|
|
2058
|
+
var west = -180.0;
|
|
2059
|
+
var east = 180.0;
|
|
2060
|
+
var south = -90.0;
|
|
2061
|
+
var north = 90.0;
|
|
2062
|
+
var isLongitude = true;
|
|
2063
|
+
var characterIndex = 0u;
|
|
2064
|
+
loop {
|
|
2065
|
+
if (characterIndex >= length) {
|
|
2066
|
+
break;
|
|
2067
|
+
}
|
|
2068
|
+
|
|
2069
|
+
let character = dggs_geohash_get_character(index, characterIndex);
|
|
2070
|
+
var bitIndex = 0u;
|
|
2071
|
+
loop {
|
|
2072
|
+
if (bitIndex >= 5u) {
|
|
2073
|
+
break;
|
|
2074
|
+
}
|
|
2075
|
+
|
|
2076
|
+
let bit = (character >> (4u - bitIndex)) & 1u;
|
|
2077
|
+
if (isLongitude) {
|
|
2078
|
+
let midpoint = (west + east) * 0.5;
|
|
2079
|
+
if (bit == 0u) {
|
|
2080
|
+
east = midpoint;
|
|
2081
|
+
} else {
|
|
2082
|
+
west = midpoint;
|
|
2083
|
+
}
|
|
2084
|
+
} else {
|
|
2085
|
+
let midpoint = (south + north) * 0.5;
|
|
2086
|
+
if (bit == 0u) {
|
|
2087
|
+
north = midpoint;
|
|
2088
|
+
} else {
|
|
2089
|
+
south = midpoint;
|
|
2090
|
+
}
|
|
2091
|
+
}
|
|
2092
|
+
isLongitude = !isLongitude;
|
|
2093
|
+
bitIndex += 1u;
|
|
2094
|
+
}
|
|
2095
|
+
characterIndex += 1u;
|
|
2096
|
+
}
|
|
2097
|
+
|
|
2098
|
+
return vec4f(west, south, east, north);
|
|
2099
|
+
}
|
|
2100
|
+
|
|
2101
|
+
fn dggs_bounds_get_boundary_point(bounds: vec4f, vertexIndex: u32) -> vec2f {
|
|
2102
|
+
let pointIndex = vertexIndex % 4u;
|
|
2103
|
+
if (pointIndex == 0u) {
|
|
2104
|
+
return vec2f(bounds.x, bounds.w);
|
|
2105
|
+
}
|
|
2106
|
+
if (pointIndex == 1u) {
|
|
2107
|
+
return vec2f(bounds.z, bounds.w);
|
|
2108
|
+
}
|
|
2109
|
+
if (pointIndex == 2u) {
|
|
2110
|
+
return vec2f(bounds.z, bounds.y);
|
|
2111
|
+
}
|
|
2112
|
+
return vec2f(bounds.x, bounds.y);
|
|
2113
|
+
}
|
|
2114
|
+
|
|
2115
|
+
fn dggs_geohash_get_boundary_point(index: vec2u, vertexIndex: u32) -> vec2f {
|
|
2116
|
+
return dggs_bounds_get_boundary_point(dggs_geohash_get_bounds(index), vertexIndex);
|
|
2117
|
+
}
|
|
2118
|
+
|
|
2119
|
+
fn dggs_geohash_get_boundary_point_fp64_split(index: vec2u, vertexIndex: u32) -> vec4f {
|
|
2120
|
+
return dggs_boundary_point_to_fp64_split(dggs_geohash_get_boundary_point(index, vertexIndex));
|
|
2121
|
+
}
|
|
2122
|
+
|
|
2123
|
+
// Packed quadkey keys store the quadkey length in bits 58..63 and right-align
|
|
2124
|
+
// the base4 digits in the lower 58 bits, first digit first.
|
|
2125
|
+
fn dggs_quadkey_get_length(index: vec2u) -> u32 {
|
|
2126
|
+
return min(
|
|
2127
|
+
dggs_u64_extract_bits(index, DGGS_QUADKEY_LENGTH_BIT_OFFSET, 6u),
|
|
2128
|
+
DGGS_QUADKEY_MAX_LENGTH
|
|
2129
|
+
);
|
|
2130
|
+
}
|
|
2131
|
+
|
|
2132
|
+
fn dggs_quadkey_get_digit(index: vec2u, digitIndex: u32) -> u32 {
|
|
2133
|
+
let length = dggs_quadkey_get_length(index);
|
|
2134
|
+
if (digitIndex >= length) {
|
|
2135
|
+
return 0u;
|
|
2136
|
+
}
|
|
2137
|
+
return dggs_u64_extract_bits(index, 2u * (length - digitIndex - 1u), 2u);
|
|
2138
|
+
}
|
|
2139
|
+
|
|
2140
|
+
fn dggs_quadkey_get_tile(index: vec2u) -> vec3u {
|
|
2141
|
+
let length = dggs_quadkey_get_length(index);
|
|
2142
|
+
var tileX = 0u;
|
|
2143
|
+
var tileY = 0u;
|
|
2144
|
+
var digitIndex = 0u;
|
|
2145
|
+
loop {
|
|
2146
|
+
if (digitIndex >= length) {
|
|
2147
|
+
break;
|
|
2148
|
+
}
|
|
2149
|
+
|
|
2150
|
+
let digit = dggs_quadkey_get_digit(index, digitIndex);
|
|
2151
|
+
let mask = 1u << (length - digitIndex - 1u);
|
|
2152
|
+
if ((digit & 1u) != 0u) {
|
|
2153
|
+
tileX |= mask;
|
|
2154
|
+
}
|
|
2155
|
+
if ((digit & 2u) != 0u) {
|
|
2156
|
+
tileY |= mask;
|
|
2157
|
+
}
|
|
2158
|
+
digitIndex += 1u;
|
|
2159
|
+
}
|
|
2160
|
+
return vec3u(tileX, tileY, length);
|
|
2161
|
+
}
|
|
2162
|
+
|
|
2163
|
+
fn dggs_web_mercator_tile_y_to_latitude(tileY: f32, tileScale: f32) -> f32 {
|
|
2164
|
+
let mercatorY = DGGS_PI * (1.0 - 2.0 * tileY / tileScale);
|
|
2165
|
+
return (2.0 * atan(exp(mercatorY)) - DGGS_PI * 0.5) * DGGS_RADIANS_TO_DEGREES;
|
|
2166
|
+
}
|
|
2167
|
+
|
|
2168
|
+
// Returns vec4(west, south, east, north) in longitude/latitude degrees.
|
|
2169
|
+
fn dggs_quadkey_get_bounds(index: vec2u) -> vec4f {
|
|
2170
|
+
let tile = dggs_quadkey_get_tile(index);
|
|
2171
|
+
let tileScale = f32(1u << tile.z);
|
|
2172
|
+
let west = f32(tile.x) / tileScale * 360.0 - 180.0;
|
|
2173
|
+
let east = f32(tile.x + 1u) / tileScale * 360.0 - 180.0;
|
|
2174
|
+
let north = dggs_web_mercator_tile_y_to_latitude(f32(tile.y), tileScale);
|
|
2175
|
+
let south = dggs_web_mercator_tile_y_to_latitude(f32(tile.y + 1u), tileScale);
|
|
2176
|
+
return vec4f(west, south, east, north);
|
|
2177
|
+
}
|
|
2178
|
+
|
|
2179
|
+
fn dggs_quadkey_get_boundary_point(index: vec2u, vertexIndex: u32) -> vec2f {
|
|
2180
|
+
return dggs_bounds_get_boundary_point(dggs_quadkey_get_bounds(index), vertexIndex);
|
|
2181
|
+
}
|
|
2182
|
+
|
|
2183
|
+
fn dggs_quadkey_get_boundary_point_fp64_split(index: vec2u, vertexIndex: u32) -> vec4f {
|
|
2184
|
+
return dggs_boundary_point_to_fp64_split(dggs_quadkey_get_boundary_point(index, vertexIndex));
|
|
2185
|
+
}
|
|
2186
|
+
|
|
2187
|
+
fn dggs_s2_digit_to_xy(digit: u32) -> vec2u {
|
|
2188
|
+
if (digit == 1u) {
|
|
2189
|
+
return vec2u(0u, 1u);
|
|
2190
|
+
}
|
|
2191
|
+
if (digit == 2u) {
|
|
2192
|
+
return vec2u(1u, 1u);
|
|
2193
|
+
}
|
|
2194
|
+
if (digit == 3u) {
|
|
2195
|
+
return vec2u(1u, 0u);
|
|
2196
|
+
}
|
|
2197
|
+
return vec2u(0u, 0u);
|
|
2198
|
+
}
|
|
2199
|
+
|
|
2200
|
+
fn dggs_s2_rotate_and_flip_quadrant(size: u32, point: vec2u, digitXY: vec2u) -> vec2u {
|
|
2201
|
+
var result = point;
|
|
2202
|
+
if (digitXY.y == 0u) {
|
|
2203
|
+
if (digitXY.x == 1u) {
|
|
2204
|
+
result = vec2u(size - 1u - result.x, size - 1u - result.y);
|
|
2205
|
+
}
|
|
2206
|
+
result = result.yx;
|
|
2207
|
+
}
|
|
2208
|
+
return result;
|
|
2209
|
+
}
|
|
2210
|
+
|
|
2211
|
+
fn dggs_s2_get_ij(index: vec2u) -> vec2u {
|
|
2212
|
+
let level = dggs_s2_get_level(index);
|
|
2213
|
+
var point = vec2u(0u);
|
|
2214
|
+
var hilbertLevel = 1u;
|
|
2215
|
+
loop {
|
|
2216
|
+
if (hilbertLevel > level) {
|
|
2217
|
+
break;
|
|
2218
|
+
}
|
|
2219
|
+
let digitLevel = level - hilbertLevel + 1u;
|
|
2220
|
+
let digitXY = dggs_s2_digit_to_xy(dggs_s2_get_child_position(index, digitLevel));
|
|
2221
|
+
let size = 1u << (hilbertLevel - 1u);
|
|
2222
|
+
point = dggs_s2_rotate_and_flip_quadrant(size, point, digitXY);
|
|
2223
|
+
point += size * digitXY;
|
|
2224
|
+
hilbertLevel += 1u;
|
|
2225
|
+
}
|
|
2226
|
+
if ((dggs_s2_get_face(index) & 1u) != 0u) {
|
|
2227
|
+
point = point.yx;
|
|
2228
|
+
}
|
|
2229
|
+
return point;
|
|
2230
|
+
}
|
|
2231
|
+
|
|
2232
|
+
fn dggs_s2_single_st_to_uv(st: f32) -> f32 {
|
|
2233
|
+
if (st >= 0.5) {
|
|
2234
|
+
return (4.0 * st * st - 1.0) / 3.0;
|
|
2235
|
+
}
|
|
2236
|
+
return (1.0 - 4.0 * (1.0 - st) * (1.0 - st)) / 3.0;
|
|
2237
|
+
}
|
|
2238
|
+
|
|
2239
|
+
fn dggs_s2_ij_to_st(ij: vec2u, level: u32, offset: vec2f) -> vec2f {
|
|
2240
|
+
let maxSize = f32(1u << level);
|
|
2241
|
+
return (vec2f(f32(ij.x), f32(ij.y)) + offset) / maxSize;
|
|
2242
|
+
}
|
|
2243
|
+
|
|
2244
|
+
fn dggs_s2_st_to_uv(st: vec2f) -> vec2f {
|
|
2245
|
+
return vec2f(dggs_s2_single_st_to_uv(st.x), dggs_s2_single_st_to_uv(st.y));
|
|
2246
|
+
}
|
|
2247
|
+
|
|
2248
|
+
fn dggs_s2_face_uv_to_xyz(face: u32, uv: vec2f) -> vec3f {
|
|
2249
|
+
if (face == 0u) {
|
|
2250
|
+
return vec3f(1.0, uv.x, uv.y);
|
|
2251
|
+
}
|
|
2252
|
+
if (face == 1u) {
|
|
2253
|
+
return vec3f(-uv.x, 1.0, uv.y);
|
|
2254
|
+
}
|
|
2255
|
+
if (face == 2u) {
|
|
2256
|
+
return vec3f(-uv.x, -uv.y, 1.0);
|
|
2257
|
+
}
|
|
2258
|
+
if (face == 3u) {
|
|
2259
|
+
return vec3f(-1.0, -uv.y, -uv.x);
|
|
2260
|
+
}
|
|
2261
|
+
if (face == 4u) {
|
|
2262
|
+
return vec3f(uv.y, -1.0, -uv.x);
|
|
2263
|
+
}
|
|
2264
|
+
return vec3f(uv.y, uv.x, -1.0);
|
|
2265
|
+
}
|
|
2266
|
+
|
|
2267
|
+
fn dggs_s2_xyz_to_lnglat(xyz: vec3f) -> vec2f {
|
|
2268
|
+
let latitude = atan2(xyz.z, length(xyz.xy)) * DGGS_RADIANS_TO_DEGREES;
|
|
2269
|
+
let longitude = atan2(xyz.y, xyz.x) * DGGS_RADIANS_TO_DEGREES;
|
|
2270
|
+
return vec2f(longitude, latitude);
|
|
2271
|
+
}
|
|
2272
|
+
|
|
2273
|
+
fn dggs_s2_get_boundary_offset(vertexIndex: u32) -> vec2f {
|
|
2274
|
+
let pointIndex = vertexIndex % 4u;
|
|
2275
|
+
if (pointIndex == 1u) {
|
|
2276
|
+
return vec2f(0.0, 1.0);
|
|
2277
|
+
}
|
|
2278
|
+
if (pointIndex == 2u) {
|
|
2279
|
+
return vec2f(1.0, 1.0);
|
|
2280
|
+
}
|
|
2281
|
+
if (pointIndex == 3u) {
|
|
2282
|
+
return vec2f(1.0, 0.0);
|
|
2283
|
+
}
|
|
2284
|
+
return vec2f(0.0, 0.0);
|
|
2285
|
+
}
|
|
2286
|
+
|
|
2287
|
+
fn dggs_s2_get_boundary_point(index: vec2u, vertexIndex: u32) -> vec2f {
|
|
2288
|
+
let level = dggs_s2_get_level(index);
|
|
2289
|
+
let ij = dggs_s2_get_ij(index);
|
|
2290
|
+
let st = dggs_s2_ij_to_st(ij, level, dggs_s2_get_boundary_offset(vertexIndex));
|
|
2291
|
+
let uv = dggs_s2_st_to_uv(st);
|
|
2292
|
+
let xyz = dggs_s2_face_uv_to_xyz(dggs_s2_get_face(index), uv);
|
|
2293
|
+
return dggs_s2_xyz_to_lnglat(xyz);
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
fn dggs_s2_get_boundary_point_fp64_split(index: vec2u, vertexIndex: u32) -> vec4f {
|
|
2297
|
+
return dggs_boundary_point_to_fp64_split(dggs_s2_get_boundary_point(index, vertexIndex));
|
|
2298
|
+
}
|
|
2299
|
+
`
|
|
2300
|
+
);
|
|
2301
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
2302
|
+
0 && (module.exports = {
|
|
2303
|
+
dggsWGSL
|
|
2304
|
+
});
|