@luma.gl/shadertools 9.3.5 → 9.4.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/dist.dev.js +6555 -2373
  2. package/dist/dist.min.js +2984 -237
  3. package/dist/index.cjs +4356 -268
  4. package/dist/index.cjs.map +4 -4
  5. package/dist/index.d.ts +13 -3
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +6 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/preprocessor/preprocessor.d.ts +11 -1
  10. package/dist/lib/preprocessor/preprocessor.d.ts.map +1 -1
  11. package/dist/lib/preprocessor/preprocessor.js +47 -2
  12. package/dist/lib/preprocessor/preprocessor.js.map +1 -1
  13. package/dist/lib/shader-assembler.d.ts +10 -10
  14. package/dist/lib/shader-assembler.d.ts.map +1 -1
  15. package/dist/lib/shader-assembler.js +36 -20
  16. package/dist/lib/shader-assembler.js.map +1 -1
  17. package/dist/lib/shader-assembly/assemble-shaders.d.ts +28 -7
  18. package/dist/lib/shader-assembly/assemble-shaders.d.ts.map +1 -1
  19. package/dist/lib/shader-assembly/assemble-shaders.js +133 -15
  20. package/dist/lib/shader-assembly/assemble-shaders.js.map +1 -1
  21. package/dist/lib/shader-assembly/platform-info.d.ts +2 -0
  22. package/dist/lib/shader-assembly/platform-info.d.ts.map +1 -1
  23. package/dist/lib/shader-assembly/shader-hooks.d.ts +1 -1
  24. package/dist/lib/shader-assembly/shader-hooks.d.ts.map +1 -1
  25. package/dist/lib/shader-assembly/shader-hooks.js +6 -3
  26. package/dist/lib/shader-assembly/shader-hooks.js.map +1 -1
  27. package/dist/lib/shader-assembly/shader-injections.d.ts +4 -1
  28. package/dist/lib/shader-assembly/shader-injections.d.ts.map +1 -1
  29. package/dist/lib/shader-assembly/shader-injections.js +68 -11
  30. package/dist/lib/shader-assembly/shader-injections.js.map +1 -1
  31. package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts +15 -0
  32. package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts.map +1 -0
  33. package/dist/lib/shader-assembly/shader-plugin-varyings.js +412 -0
  34. package/dist/lib/shader-assembly/shader-plugin-varyings.js.map +1 -0
  35. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts +12 -0
  36. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts.map +1 -0
  37. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js +237 -0
  38. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js.map +1 -0
  39. package/dist/lib/shader-module/shader-module.d.ts +3 -0
  40. package/dist/lib/shader-module/shader-module.d.ts.map +1 -1
  41. package/dist/lib/shader-module/shader-module.js.map +1 -1
  42. package/dist/lib/shader-module/shader-pass-pipeline.d.ts +14 -0
  43. package/dist/lib/shader-module/shader-pass-pipeline.d.ts.map +1 -0
  44. package/dist/lib/shader-module/shader-pass-pipeline.js +5 -0
  45. package/dist/lib/shader-module/shader-pass-pipeline.js.map +1 -0
  46. package/dist/lib/shader-module/shader-pass.d.ts +21 -4
  47. package/dist/lib/shader-module/shader-pass.d.ts.map +1 -1
  48. package/dist/lib/shader-plugin.d.ts +68 -0
  49. package/dist/lib/shader-plugin.d.ts.map +1 -0
  50. package/dist/lib/shader-plugin.js +98 -0
  51. package/dist/lib/shader-plugin.js.map +1 -0
  52. package/dist/lib/utils/assert.js +1 -1
  53. package/dist/lib/utils/assert.js.map +1 -1
  54. package/dist/modules/color/float-colors.d.ts +111 -5
  55. package/dist/modules/color/float-colors.d.ts.map +1 -1
  56. package/dist/modules/color/float-colors.js +200 -34
  57. package/dist/modules/color/float-colors.js.map +1 -1
  58. package/dist/modules/engine/clip/clip.d.ts +12 -0
  59. package/dist/modules/engine/clip/clip.d.ts.map +1 -0
  60. package/dist/modules/engine/clip/clip.js +129 -0
  61. package/dist/modules/engine/clip/clip.js.map +1 -0
  62. package/dist/modules/engine/filter/filter.d.ts +12 -0
  63. package/dist/modules/engine/filter/filter.d.ts.map +1 -0
  64. package/dist/modules/engine/filter/filter.js +88 -0
  65. package/dist/modules/engine/filter/filter.js.map +1 -0
  66. package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts +3 -0
  67. package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts.map +1 -0
  68. package/dist/modules/geospatial/dggs/dggs-wgsl.js +1892 -0
  69. package/dist/modules/geospatial/dggs/dggs-wgsl.js.map +1 -0
  70. package/dist/modules/geospatial/dggs/dggs.d.ts +6 -0
  71. package/dist/modules/geospatial/dggs/dggs.d.ts.map +1 -0
  72. package/dist/modules/geospatial/dggs/dggs.js +10 -0
  73. package/dist/modules/geospatial/dggs/dggs.js.map +1 -0
  74. package/dist/modules/lighting/water-material/water-material.d.ts +28 -0
  75. package/dist/modules/lighting/water-material/water-material.d.ts.map +1 -0
  76. package/dist/modules/lighting/water-material/water-material.js +179 -0
  77. package/dist/modules/lighting/water-material/water-material.js.map +1 -0
  78. package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts +3 -0
  79. package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts.map +1 -0
  80. package/dist/modules/lighting/water-material/water-shaders-glsl.js +232 -0
  81. package/dist/modules/lighting/water-material/water-shaders-glsl.js.map +1 -0
  82. package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts +2 -0
  83. package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts.map +1 -0
  84. package/dist/modules/lighting/water-material/water-shaders-wgsl.js +230 -0
  85. package/dist/modules/lighting/water-material/water-shaders-wgsl.js.map +1 -0
  86. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts +2 -1
  87. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts.map +1 -1
  88. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js +268 -0
  89. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js.map +1 -1
  90. package/package.json +2 -2
  91. package/src/index.ts +50 -3
  92. package/src/lib/preprocessor/preprocessor.ts +68 -3
  93. package/src/lib/shader-assembler.ts +49 -20
  94. package/src/lib/shader-assembly/assemble-shaders.ts +242 -30
  95. package/src/lib/shader-assembly/platform-info.ts +2 -0
  96. package/src/lib/shader-assembly/shader-hooks.ts +7 -3
  97. package/src/lib/shader-assembly/shader-injections.ts +96 -11
  98. package/src/lib/shader-assembly/shader-plugin-varyings.ts +524 -0
  99. package/src/lib/shader-assembly/shader-plugin-vertex-inputs.ts +279 -0
  100. package/src/lib/shader-module/shader-module.ts +3 -0
  101. package/src/lib/shader-module/shader-pass-pipeline.ts +19 -0
  102. package/src/lib/shader-module/shader-pass.ts +29 -4
  103. package/src/lib/shader-plugin.ts +214 -0
  104. package/src/lib/utils/assert.ts +1 -1
  105. package/src/modules/color/float-colors.ts +272 -37
  106. package/src/modules/engine/clip/clip.ts +149 -0
  107. package/src/modules/engine/filter/filter.ts +107 -0
  108. package/src/modules/geospatial/dggs/dggs-wgsl.ts +1892 -0
  109. package/src/modules/geospatial/dggs/dggs.ts +12 -0
  110. package/src/modules/lighting/water-material/water-material.ts +234 -0
  111. package/src/modules/lighting/water-material/water-shaders-glsl.ts +233 -0
  112. package/src/modules/lighting/water-material/water-shaders-wgsl.ts +230 -0
  113. package/src/modules/math/fp64/fp64-arithmetic-wgsl.ts +268 -0
@@ -1,21 +1,85 @@
1
- export type FloatColorsProps = {
1
+ import type { Binding } from '@luma.gl/core';
2
+ /** Props for semantic color normalization helpers. */
3
+ export type ColorsProps = {
2
4
  /**
3
5
  * When true, semantic colors are interpreted as 0-255 byte-style values and normalized in shader code.
4
6
  * When false, semantic colors are interpreted directly as floats.
5
7
  */
6
8
  useByteColors?: boolean;
7
9
  };
8
- export type FloatColorsUniforms = {
10
+ /** Uniforms consumed by semantic color normalization helpers. */
11
+ export type ColorsUniforms = {
9
12
  /** Controls whether shader helpers normalize semantic colors from byte space. */
10
13
  useByteColors: boolean;
11
14
  };
15
+ /** Backward-compatible props alias for shaders that import `floatColors`. */
16
+ export type FloatColorsProps = ColorsProps;
17
+ /** Backward-compatible uniform alias for shaders that import `floatColors`. */
18
+ export type FloatColorsUniforms = ColorsUniforms;
19
+ /** Packed storage color formats decoded by `storageColors`. */
20
+ export type StorageColorFormat = 'rgba8unorm' | 'rgba16float' | 'rgba32float';
21
+ /** Numeric WGSL tags written to `storageColors.format`. */
22
+ export declare const STORAGE_COLOR_FORMAT: {
23
+ readonly RGBA8UNORM: 0;
24
+ readonly RGBA16FLOAT: 1;
25
+ readonly RGBA32FLOAT: 2;
26
+ };
27
+ /** Numeric WGSL tag for one packed storage color format. */
28
+ export type StorageColorFormatValue = (typeof STORAGE_COLOR_FORMAT)[keyof typeof STORAGE_COLOR_FORMAT];
29
+ /** Bytes occupied by one tightly packed storage color row. */
30
+ export declare const STORAGE_COLOR_FORMAT_BYTE_LENGTHS: Record<StorageColorFormat, number>;
31
+ /** Default byte stride for one tightly packed storage color row. */
32
+ export declare const STORAGE_COLOR_DEFAULT_BYTE_STRIDES: Record<StorageColorFormat, number>;
33
+ /** Props for reading packed color rows from a read-only storage buffer. */
34
+ export type StorageColorsProps = {
35
+ /** Storage buffer containing raw packed color words. */
36
+ colorBuffer?: Binding;
37
+ /** Per-row storage color representation. Defaults to `rgba8unorm`. */
38
+ format?: StorageColorFormat | StorageColorFormatValue;
39
+ /** Byte offset to the first color. Must be 4-byte aligned. Defaults to `0`. */
40
+ byteOffset?: number;
41
+ /** Bytes between color rows. Must be 4-byte aligned. Defaults to the packed format size. */
42
+ byteStride?: number;
43
+ };
44
+ /** Uniforms consumed by the packed storage color reader. */
45
+ export type StorageColorsUniforms = {
46
+ /** Numeric `STORAGE_COLOR_FORMAT` tag used by WGSL. */
47
+ format: StorageColorFormatValue;
48
+ /** Uint32 words between storage color rows. */
49
+ wordStride: number;
50
+ /** Uint32 word offset to the first storage color row. */
51
+ wordOffset: number;
52
+ /** Reserved field retaining a 16-byte uniform block. */
53
+ _padding: number;
54
+ };
55
+ /** Bindings consumed by the packed storage color reader. */
56
+ export type StorageColorsBindings = {
57
+ /** Raw packed storage color buffer exposed as `array<u32>`. */
58
+ storageColorsBuffer?: Binding;
59
+ };
60
+ /** Semantic color normalization helpers named `colors_*`. */
61
+ export declare const colors: {
62
+ readonly name: "colors";
63
+ readonly props: ColorsProps;
64
+ readonly uniforms: ColorsUniforms;
65
+ readonly vs: string;
66
+ readonly fs: string;
67
+ readonly source: string;
68
+ readonly uniformTypes: {
69
+ readonly useByteColors: "f32";
70
+ };
71
+ readonly defaultUniforms: {
72
+ readonly useByteColors: true;
73
+ };
74
+ };
75
+ /** Legacy semantic color normalization helpers named `floatColors_*`. */
12
76
  export declare const floatColors: {
13
77
  readonly name: "floatColors";
14
78
  readonly props: FloatColorsProps;
15
79
  readonly uniforms: FloatColorsUniforms;
16
- readonly vs: "layout(std140) uniform floatColorsUniforms {\n float useByteColors;\n} floatColors;\n\nvec3 floatColors_normalize(vec3 inputColor) {\n return floatColors.useByteColors > 0.5 ? inputColor / 255.0 : inputColor;\n}\n\nvec4 floatColors_normalize(vec4 inputColor) {\n return floatColors.useByteColors > 0.5 ? inputColor / 255.0 : inputColor;\n}\n\nvec4 floatColors_premultiplyAlpha(vec4 inputColor) {\n return vec4(inputColor.rgb * inputColor.a, inputColor.a);\n}\n\nvec4 floatColors_unpremultiplyAlpha(vec4 inputColor) {\n return inputColor.a > 0.0 ? vec4(inputColor.rgb / inputColor.a, inputColor.a) : vec4(0.0);\n}\n\nvec4 floatColors_premultiply_alpha(vec4 inputColor) {\n return floatColors_premultiplyAlpha(inputColor);\n}\n\nvec4 floatColors_unpremultiply_alpha(vec4 inputColor) {\n return floatColors_unpremultiplyAlpha(inputColor);\n}\n";
17
- readonly fs: "layout(std140) uniform floatColorsUniforms {\n float useByteColors;\n} floatColors;\n\nvec3 floatColors_normalize(vec3 inputColor) {\n return floatColors.useByteColors > 0.5 ? inputColor / 255.0 : inputColor;\n}\n\nvec4 floatColors_normalize(vec4 inputColor) {\n return floatColors.useByteColors > 0.5 ? inputColor / 255.0 : inputColor;\n}\n\nvec4 floatColors_premultiplyAlpha(vec4 inputColor) {\n return vec4(inputColor.rgb * inputColor.a, inputColor.a);\n}\n\nvec4 floatColors_unpremultiplyAlpha(vec4 inputColor) {\n return inputColor.a > 0.0 ? vec4(inputColor.rgb / inputColor.a, inputColor.a) : vec4(0.0);\n}\n\nvec4 floatColors_premultiply_alpha(vec4 inputColor) {\n return floatColors_premultiplyAlpha(inputColor);\n}\n\nvec4 floatColors_unpremultiply_alpha(vec4 inputColor) {\n return floatColors_unpremultiplyAlpha(inputColor);\n}\n";
18
- readonly source: "struct floatColorsUniforms {\n useByteColors: f32\n};\n\n@group(0) @binding(auto) var<uniform> floatColors : floatColorsUniforms;\n\nfn floatColors_normalize(inputColor: vec3<f32>) -> vec3<f32> {\n return select(inputColor, inputColor / 255.0, floatColors.useByteColors > 0.5);\n}\n\nfn floatColors_normalize4(inputColor: vec4<f32>) -> vec4<f32> {\n return select(inputColor, inputColor / 255.0, floatColors.useByteColors > 0.5);\n}\n\nfn floatColors_premultiplyAlpha(inputColor: vec4<f32>) -> vec4<f32> {\n return vec4<f32>(inputColor.rgb * inputColor.a, inputColor.a);\n}\n\nfn floatColors_unpremultiplyAlpha(inputColor: vec4<f32>) -> vec4<f32> {\n return select(\n vec4<f32>(0.0),\n vec4<f32>(inputColor.rgb / inputColor.a, inputColor.a),\n inputColor.a > 0.0\n );\n}\n\nfn floatColors_premultiply_alpha(inputColor: vec4<f32>) -> vec4<f32> {\n return floatColors_premultiplyAlpha(inputColor);\n}\n\nfn floatColors_unpremultiply_alpha(inputColor: vec4<f32>) -> vec4<f32> {\n return floatColors_unpremultiplyAlpha(inputColor);\n}\n";
80
+ readonly vs: string;
81
+ readonly fs: string;
82
+ readonly source: string;
19
83
  readonly uniformTypes: {
20
84
  readonly useByteColors: "f32";
21
85
  };
@@ -23,4 +87,46 @@ export declare const floatColors: {
23
87
  readonly useByteColors: true;
24
88
  };
25
89
  };
90
+ /**
91
+ * WGSL reader for packed RGBA storage rows.
92
+ *
93
+ * Include {@link colors} separately when semantic color normalization helpers are also needed.
94
+ */
95
+ export declare const storageColors: {
96
+ readonly name: "storageColors";
97
+ readonly props: StorageColorsProps;
98
+ readonly uniforms: StorageColorsUniforms;
99
+ readonly bindings: StorageColorsBindings;
100
+ readonly source: string;
101
+ readonly uniformTypes: {
102
+ readonly format: "u32";
103
+ readonly wordStride: "u32";
104
+ readonly wordOffset: "u32";
105
+ readonly _padding: "u32";
106
+ };
107
+ readonly defaultUniforms: {
108
+ readonly format: 0;
109
+ readonly wordStride: number;
110
+ readonly wordOffset: 0;
111
+ readonly _padding: 0;
112
+ };
113
+ readonly bindingLayout: readonly [{
114
+ readonly name: "storageColors";
115
+ readonly group: 0;
116
+ }, {
117
+ readonly name: "storageColorsBuffer";
118
+ readonly group: 0;
119
+ }];
120
+ readonly getUniforms: (props?: StorageColorsProps) => {
121
+ storageColorsBuffer?: Binding | undefined;
122
+ /** Numeric `STORAGE_COLOR_FORMAT` tag used by WGSL. */
123
+ format: StorageColorFormatValue;
124
+ /** Uint32 words between storage color rows. */
125
+ wordStride: number;
126
+ /** Uint32 word offset to the first storage color row. */
127
+ wordOffset: number;
128
+ /** Reserved field retaining a 16-byte uniform block. */
129
+ _padding: number;
130
+ };
131
+ };
26
132
  //# sourceMappingURL=float-colors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"float-colors.d.ts","sourceRoot":"","sources":["../../../src/modules/color/float-colors.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,iFAAiF;IACjF,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAoEF,eAAO,MAAM,WAAW;;oBAET,gBAAgB;uBACb,mBAAmB;;;;;;;;;;CAUmC,CAAC"}
1
+ {"version":3,"file":"float-colors.d.ts","sourceRoot":"","sources":["../../../src/modules/color/float-colors.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAG3C,sDAAsD;AACtD,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,cAAc,GAAG;IAC3B,iFAAiF;IACjF,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAC3C,+EAA+E;AAC/E,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAEjD,+DAA+D;AAC/D,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,aAAa,GAAG,aAAa,CAAC;AAE9E,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX,4DAA4D;AAC5D,MAAM,MAAM,uBAAuB,GACjC,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEnE,8DAA8D;AAC9D,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAIhF,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,kCAAkC,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAEjF,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sEAAsE;IACtE,MAAM,CAAC,EAAE,kBAAkB,GAAG,uBAAuB,CAAC;IACtD,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,4DAA4D;AAC5D,MAAM,MAAM,qBAAqB,GAAG;IAClC,uDAAuD;IACvD,MAAM,EAAE,uBAAuB,CAAC;IAChC,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,4DAA4D;AAC5D,MAAM,MAAM,qBAAqB,GAAG;IAClC,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AA6MF,6DAA6D;AAC7D,eAAO,MAAM,MAAM;;oBAEJ,WAAW;uBACR,cAAc;;;;;;;;;;CAM8B,CAAC;AAE/D,yEAAyE;AACzE,eAAO,MAAM,WAAW;;oBAET,gBAAgB;uBACb,mBAAmB;;;;;;;;;;CAMmC,CAAC;AAEzE;;;;GAIG;AACH,eAAO,MAAM,aAAa;;oBAEX,kBAAkB;uBACf,qBAAqB;uBACrB,qBAAqB;;;;;;;;;;;;;;;;;;;;;mCAQlB,kBAAkB;;QApQrC,uDAAuD;gBAC/C,uBAAuB;QAC/B,+CAA+C;oBACnC,MAAM;QAClB,yDAAyD;oBAC7C,MAAM;QAClB,wDAAwD;kBAC9C,MAAM;;CAmQiF,CAAC"}
@@ -1,55 +1,154 @@
1
1
  // luma.gl
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
- const GLSL_UNIFORMS = /* glsl */ `\
5
- layout(std140) uniform floatColorsUniforms {
4
+ /** Numeric WGSL tags written to `storageColors.format`. */
5
+ export const STORAGE_COLOR_FORMAT = {
6
+ RGBA8UNORM: 0,
7
+ RGBA16FLOAT: 1,
8
+ RGBA32FLOAT: 2
9
+ };
10
+ /** Bytes occupied by one tightly packed storage color row. */
11
+ export const STORAGE_COLOR_FORMAT_BYTE_LENGTHS = {
12
+ rgba8unorm: 4,
13
+ rgba16float: 8,
14
+ rgba32float: 16
15
+ };
16
+ /** Default byte stride for one tightly packed storage color row. */
17
+ export const STORAGE_COLOR_DEFAULT_BYTE_STRIDES = {
18
+ ...STORAGE_COLOR_FORMAT_BYTE_LENGTHS
19
+ };
20
+ const STORAGE_COLOR_FORMAT_BY_NAME = {
21
+ rgba8unorm: STORAGE_COLOR_FORMAT.RGBA8UNORM,
22
+ rgba16float: STORAGE_COLOR_FORMAT.RGBA16FLOAT,
23
+ rgba32float: STORAGE_COLOR_FORMAT.RGBA32FLOAT
24
+ };
25
+ const STORAGE_COLOR_FORMAT_NAME_BY_VALUE = {
26
+ [STORAGE_COLOR_FORMAT.RGBA8UNORM]: 'rgba8unorm',
27
+ [STORAGE_COLOR_FORMAT.RGBA16FLOAT]: 'rgba16float',
28
+ [STORAGE_COLOR_FORMAT.RGBA32FLOAT]: 'rgba32float'
29
+ };
30
+ const COLORS_UNIFORM_TYPES = {
31
+ useByteColors: 'f32'
32
+ };
33
+ const COLORS_DEFAULT_UNIFORMS = {
34
+ useByteColors: true
35
+ };
36
+ const STORAGE_COLORS_UNIFORM_TYPES = {
37
+ format: 'u32',
38
+ wordStride: 'u32',
39
+ wordOffset: 'u32',
40
+ _padding: 'u32'
41
+ };
42
+ const STORAGE_COLORS_DEFAULT_UNIFORMS = {
43
+ format: STORAGE_COLOR_FORMAT.RGBA8UNORM,
44
+ wordStride: STORAGE_COLOR_DEFAULT_BYTE_STRIDES.rgba8unorm / Uint32Array.BYTES_PER_ELEMENT,
45
+ wordOffset: 0,
46
+ _padding: 0
47
+ };
48
+ const COLORS_GLSL = buildGLSLColorModuleSource('colors');
49
+ const FLOAT_COLORS_GLSL = buildGLSLColorModuleSource('floatColors');
50
+ const COLORS_WGSL = buildWGSLColorModuleSource('colors');
51
+ const FLOAT_COLORS_WGSL = buildWGSLColorModuleSource('floatColors');
52
+ const STORAGE_COLORS_WGSL = /* wgsl */ `\
53
+ struct storageColorsUniforms {
54
+ format: u32,
55
+ wordStride: u32,
56
+ wordOffset: u32,
57
+ _padding: u32
58
+ };
59
+
60
+ @group(0) @binding(auto) var<uniform> storageColors : storageColorsUniforms;
61
+ @group(0) @binding(auto) var<storage, read> storageColorsBuffer : array<u32>;
62
+
63
+ const STORAGE_COLOR_FORMAT_RGBA8UNORM : u32 = ${STORAGE_COLOR_FORMAT.RGBA8UNORM}u;
64
+ const STORAGE_COLOR_FORMAT_RGBA16FLOAT : u32 = ${STORAGE_COLOR_FORMAT.RGBA16FLOAT}u;
65
+
66
+ fn storageColors_getWordIndex(rowIndex: u32) -> u32 {
67
+ return storageColors.wordOffset + rowIndex * storageColors.wordStride;
68
+ }
69
+
70
+ fn storageColors_readRgba8UnormColor(wordIndex: u32) -> vec4<f32> {
71
+ return unpack4x8unorm(storageColorsBuffer[wordIndex]);
72
+ }
73
+
74
+ fn storageColors_readRgba16FloatColor(wordIndex: u32) -> vec4<f32> {
75
+ let redGreen = unpack2x16float(storageColorsBuffer[wordIndex]);
76
+ let blueAlpha = unpack2x16float(storageColorsBuffer[wordIndex + 1u]);
77
+ return vec4<f32>(redGreen.x, redGreen.y, blueAlpha.x, blueAlpha.y);
78
+ }
79
+
80
+ fn storageColors_readRgba32FloatColor(wordIndex: u32) -> vec4<f32> {
81
+ return vec4<f32>(
82
+ bitcast<f32>(storageColorsBuffer[wordIndex]),
83
+ bitcast<f32>(storageColorsBuffer[wordIndex + 1u]),
84
+ bitcast<f32>(storageColorsBuffer[wordIndex + 2u]),
85
+ bitcast<f32>(storageColorsBuffer[wordIndex + 3u])
86
+ );
87
+ }
88
+
89
+ fn storageColors_readColor(rowIndex: u32) -> vec4<f32> {
90
+ let wordIndex = storageColors_getWordIndex(rowIndex);
91
+ if (storageColors.format == STORAGE_COLOR_FORMAT_RGBA8UNORM) {
92
+ return storageColors_readRgba8UnormColor(wordIndex);
93
+ }
94
+ if (storageColors.format == STORAGE_COLOR_FORMAT_RGBA16FLOAT) {
95
+ return storageColors_readRgba16FloatColor(wordIndex);
96
+ }
97
+ return storageColors_readRgba32FloatColor(wordIndex);
98
+ }
99
+ `;
100
+ function buildGLSLColorModuleSource(primaryPrefix) {
101
+ return /* glsl */ `\
102
+ layout(std140) uniform ${primaryPrefix}Uniforms {
6
103
  float useByteColors;
7
- } floatColors;
104
+ } ${primaryPrefix};
8
105
 
9
- vec3 floatColors_normalize(vec3 inputColor) {
10
- return floatColors.useByteColors > 0.5 ? inputColor / 255.0 : inputColor;
106
+ vec3 ${primaryPrefix}_normalize(vec3 inputColor) {
107
+ return ${primaryPrefix}.useByteColors > 0.5 ? inputColor / 255.0 : inputColor;
11
108
  }
12
109
 
13
- vec4 floatColors_normalize(vec4 inputColor) {
14
- return floatColors.useByteColors > 0.5 ? inputColor / 255.0 : inputColor;
110
+ vec4 ${primaryPrefix}_normalize(vec4 inputColor) {
111
+ return ${primaryPrefix}.useByteColors > 0.5 ? inputColor / 255.0 : inputColor;
15
112
  }
16
113
 
17
- vec4 floatColors_premultiplyAlpha(vec4 inputColor) {
114
+ vec4 ${primaryPrefix}_premultiplyAlpha(vec4 inputColor) {
18
115
  return vec4(inputColor.rgb * inputColor.a, inputColor.a);
19
116
  }
20
117
 
21
- vec4 floatColors_unpremultiplyAlpha(vec4 inputColor) {
118
+ vec4 ${primaryPrefix}_unpremultiplyAlpha(vec4 inputColor) {
22
119
  return inputColor.a > 0.0 ? vec4(inputColor.rgb / inputColor.a, inputColor.a) : vec4(0.0);
23
120
  }
24
121
 
25
- vec4 floatColors_premultiply_alpha(vec4 inputColor) {
26
- return floatColors_premultiplyAlpha(inputColor);
122
+ vec4 ${primaryPrefix}_premultiply_alpha(vec4 inputColor) {
123
+ return ${primaryPrefix}_premultiplyAlpha(inputColor);
27
124
  }
28
125
 
29
- vec4 floatColors_unpremultiply_alpha(vec4 inputColor) {
30
- return floatColors_unpremultiplyAlpha(inputColor);
126
+ vec4 ${primaryPrefix}_unpremultiply_alpha(vec4 inputColor) {
127
+ return ${primaryPrefix}_unpremultiplyAlpha(inputColor);
31
128
  }
32
129
  `;
33
- const WGSL_UNIFORMS = /* wgsl */ `\
34
- struct floatColorsUniforms {
130
+ }
131
+ function buildWGSLColorModuleSource(primaryPrefix) {
132
+ return /* wgsl */ `\
133
+ struct ${primaryPrefix}Uniforms {
35
134
  useByteColors: f32
36
135
  };
37
136
 
38
- @group(0) @binding(auto) var<uniform> floatColors : floatColorsUniforms;
137
+ @group(0) @binding(auto) var<uniform> ${primaryPrefix} : ${primaryPrefix}Uniforms;
39
138
 
40
- fn floatColors_normalize(inputColor: vec3<f32>) -> vec3<f32> {
41
- return select(inputColor, inputColor / 255.0, floatColors.useByteColors > 0.5);
139
+ fn ${primaryPrefix}_normalize(inputColor: vec3<f32>) -> vec3<f32> {
140
+ return select(inputColor, inputColor / 255.0, ${primaryPrefix}.useByteColors > 0.5);
42
141
  }
43
142
 
44
- fn floatColors_normalize4(inputColor: vec4<f32>) -> vec4<f32> {
45
- return select(inputColor, inputColor / 255.0, floatColors.useByteColors > 0.5);
143
+ fn ${primaryPrefix}_normalize4(inputColor: vec4<f32>) -> vec4<f32> {
144
+ return select(inputColor, inputColor / 255.0, ${primaryPrefix}.useByteColors > 0.5);
46
145
  }
47
146
 
48
- fn floatColors_premultiplyAlpha(inputColor: vec4<f32>) -> vec4<f32> {
147
+ fn ${primaryPrefix}_premultiplyAlpha(inputColor: vec4<f32>) -> vec4<f32> {
49
148
  return vec4<f32>(inputColor.rgb * inputColor.a, inputColor.a);
50
149
  }
51
150
 
52
- fn floatColors_unpremultiplyAlpha(inputColor: vec4<f32>) -> vec4<f32> {
151
+ fn ${primaryPrefix}_unpremultiplyAlpha(inputColor: vec4<f32>) -> vec4<f32> {
53
152
  return select(
54
153
  vec4<f32>(0.0),
55
154
  vec4<f32>(inputColor.rgb / inputColor.a, inputColor.a),
@@ -57,26 +156,93 @@ fn floatColors_unpremultiplyAlpha(inputColor: vec4<f32>) -> vec4<f32> {
57
156
  );
58
157
  }
59
158
 
60
- fn floatColors_premultiply_alpha(inputColor: vec4<f32>) -> vec4<f32> {
61
- return floatColors_premultiplyAlpha(inputColor);
159
+ fn ${primaryPrefix}_premultiply_alpha(inputColor: vec4<f32>) -> vec4<f32> {
160
+ return ${primaryPrefix}_premultiplyAlpha(inputColor);
62
161
  }
63
162
 
64
- fn floatColors_unpremultiply_alpha(inputColor: vec4<f32>) -> vec4<f32> {
65
- return floatColors_unpremultiplyAlpha(inputColor);
163
+ fn ${primaryPrefix}_unpremultiply_alpha(inputColor: vec4<f32>) -> vec4<f32> {
164
+ return ${primaryPrefix}_unpremultiplyAlpha(inputColor);
66
165
  }
67
166
  `;
167
+ }
168
+ function getStorageColorsUniforms(props = {}) {
169
+ const format = resolveStorageColorFormat(props.format);
170
+ const formatName = STORAGE_COLOR_FORMAT_NAME_BY_VALUE[format];
171
+ const byteStride = props.byteStride ?? STORAGE_COLOR_DEFAULT_BYTE_STRIDES[formatName];
172
+ const byteOffset = props.byteOffset ?? 0;
173
+ const minimumByteStride = STORAGE_COLOR_FORMAT_BYTE_LENGTHS[formatName];
174
+ validateStorageColorByteAlignment('byteStride', byteStride);
175
+ validateStorageColorByteAlignment('byteOffset', byteOffset);
176
+ if (byteStride < minimumByteStride) {
177
+ throw new Error(`storageColors byteStride must be at least ${minimumByteStride} for ${formatName}`);
178
+ }
179
+ return {
180
+ format,
181
+ wordStride: byteStride / Uint32Array.BYTES_PER_ELEMENT,
182
+ wordOffset: byteOffset / Uint32Array.BYTES_PER_ELEMENT,
183
+ _padding: 0
184
+ };
185
+ }
186
+ function resolveStorageColorFormat(format = 'rgba8unorm') {
187
+ if (typeof format === 'number') {
188
+ if (format in STORAGE_COLOR_FORMAT_NAME_BY_VALUE) {
189
+ return format;
190
+ }
191
+ }
192
+ else if (format in STORAGE_COLOR_FORMAT_BY_NAME) {
193
+ return STORAGE_COLOR_FORMAT_BY_NAME[format];
194
+ }
195
+ throw new Error(`storageColors format must be one of ${Object.keys(STORAGE_COLOR_FORMAT_BY_NAME).join(', ')}`);
196
+ }
197
+ function validateStorageColorByteAlignment(name, value) {
198
+ if (!Number.isInteger(value) || value < 0 || value % Uint32Array.BYTES_PER_ELEMENT !== 0) {
199
+ throw new Error(`storageColors ${name} must be a non-negative 4-byte aligned integer`);
200
+ }
201
+ }
202
+ /** Semantic color normalization helpers named `colors_*`. */
203
+ export const colors = {
204
+ name: 'colors',
205
+ props: {},
206
+ uniforms: {},
207
+ vs: COLORS_GLSL,
208
+ fs: COLORS_GLSL,
209
+ source: COLORS_WGSL,
210
+ uniformTypes: COLORS_UNIFORM_TYPES,
211
+ defaultUniforms: COLORS_DEFAULT_UNIFORMS
212
+ };
213
+ /** Legacy semantic color normalization helpers named `floatColors_*`. */
68
214
  export const floatColors = {
69
215
  name: 'floatColors',
70
216
  props: {},
71
217
  uniforms: {},
72
- vs: GLSL_UNIFORMS,
73
- fs: GLSL_UNIFORMS,
74
- source: WGSL_UNIFORMS,
75
- uniformTypes: {
76
- useByteColors: 'f32'
77
- },
78
- defaultUniforms: {
79
- useByteColors: true
218
+ vs: FLOAT_COLORS_GLSL,
219
+ fs: FLOAT_COLORS_GLSL,
220
+ source: FLOAT_COLORS_WGSL,
221
+ uniformTypes: COLORS_UNIFORM_TYPES,
222
+ defaultUniforms: COLORS_DEFAULT_UNIFORMS
223
+ };
224
+ /**
225
+ * WGSL reader for packed RGBA storage rows.
226
+ *
227
+ * Include {@link colors} separately when semantic color normalization helpers are also needed.
228
+ */
229
+ export const storageColors = {
230
+ name: 'storageColors',
231
+ props: {},
232
+ uniforms: {},
233
+ bindings: {},
234
+ source: STORAGE_COLORS_WGSL,
235
+ uniformTypes: STORAGE_COLORS_UNIFORM_TYPES,
236
+ defaultUniforms: STORAGE_COLORS_DEFAULT_UNIFORMS,
237
+ bindingLayout: [
238
+ { name: 'storageColors', group: 0 },
239
+ { name: 'storageColorsBuffer', group: 0 }
240
+ ],
241
+ getUniforms(props = {}) {
242
+ return {
243
+ ...getStorageColorsUniforms(props),
244
+ ...(props.colorBuffer ? { storageColorsBuffer: props.colorBuffer } : {})
245
+ };
80
246
  }
81
247
  };
82
248
  //# sourceMappingURL=float-colors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"float-colors.js","sourceRoot":"","sources":["../../../src/modules/color/float-colors.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAiBpC,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BhC,CAAC;AAEF,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkChC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,EAAsB;IAC7B,QAAQ,EAAE,EAAyB;IACnC,EAAE,EAAE,aAAa;IACjB,EAAE,EAAE,aAAa;IACjB,MAAM,EAAE,aAAa;IACrB,YAAY,EAAE;QACZ,aAAa,EAAE,KAAK;KACrB;IACD,eAAe,EAAE;QACf,aAAa,EAAE,IAAI;KACpB;CACqE,CAAC"}
1
+ {"version":3,"file":"float-colors.js","sourceRoot":"","sources":["../../../src/modules/color/float-colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ShaderPlugin } from "../../../lib/shader-plugin.js";
2
+ export type ClipShaderPluginProps = {
3
+ /** Enables clipping. Defaults to true. */
4
+ enabled?: boolean;
5
+ /** Inclusive lower and exclusive upper bounds. Defaults to [0, 0, 1, 1]. */
6
+ bounds?: readonly [number, number, number, number];
7
+ /** Clips whole instances by their anchor or individual fragments. Defaults to geometry. */
8
+ mode?: 'instance' | 'geometry';
9
+ };
10
+ /** Coordinate-system-neutral instance and geometry clipping. */
11
+ export declare const clipShaderPlugin: ShaderPlugin;
12
+ //# sourceMappingURL=clip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clip.d.ts","sourceRoot":"","sources":["../../../../src/modules/engine/clip/clip.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,YAAY,EAAC,sCAAmC;AAE7D,MAAM,MAAM,qBAAqB,GAAG;IAClC,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,2FAA2F;IAC3F,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CAChC,CAAC;AAqFF,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,EAAE,YAgD9B,CAAC"}
@@ -0,0 +1,129 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ const CLIP_MODE_GEOMETRY = 0;
5
+ const CLIP_MODE_INSTANCE = 1;
6
+ const clipShaderModule = {
7
+ name: 'clip',
8
+ props: {},
9
+ uniforms: {},
10
+ bindingLayout: [{ name: 'clip', group: 2 }],
11
+ uniformTypes: {
12
+ enabled: 'i32',
13
+ mode: 'i32',
14
+ bounds: 'vec4<f32>'
15
+ },
16
+ defaultUniforms: {
17
+ enabled: 1,
18
+ mode: CLIP_MODE_GEOMETRY,
19
+ bounds: [0, 0, 1, 1]
20
+ },
21
+ vs: /* glsl */ `\
22
+ layout(std140) uniform clipUniforms {
23
+ highp int enabled;
24
+ highp int mode;
25
+ highp vec4 bounds;
26
+ } clipState;
27
+
28
+ bool clip_isInBounds(vec2 coordinates) {
29
+ return coordinates.x >= clipState.bounds.x &&
30
+ coordinates.y >= clipState.bounds.y &&
31
+ coordinates.x < clipState.bounds.z &&
32
+ coordinates.y < clipState.bounds.w;
33
+ }
34
+ `,
35
+ fs: /* glsl */ `\
36
+ layout(std140) uniform clipUniforms {
37
+ highp int enabled;
38
+ highp int mode;
39
+ highp vec4 bounds;
40
+ } clipState;
41
+
42
+ bool clip_isInBounds(vec2 coordinates) {
43
+ return coordinates.x >= clipState.bounds.x &&
44
+ coordinates.y >= clipState.bounds.y &&
45
+ coordinates.x < clipState.bounds.z &&
46
+ coordinates.y < clipState.bounds.w;
47
+ }
48
+ `,
49
+ source: /* wgsl */ `\
50
+ struct ClipUniforms {
51
+ enabled: i32,
52
+ mode: i32,
53
+ bounds: vec4<f32>,
54
+ };
55
+
56
+ @group(2) @binding(auto) var<uniform> clipUniforms: ClipUniforms;
57
+
58
+ fn clip_isInBounds(coordinates: vec2<f32>) -> bool {
59
+ return coordinates.x >= clipUniforms.bounds.x &&
60
+ coordinates.y >= clipUniforms.bounds.y &&
61
+ coordinates.x < clipUniforms.bounds.z &&
62
+ coordinates.y < clipUniforms.bounds.w;
63
+ }
64
+ `,
65
+ getUniforms(props = {}) {
66
+ const uniforms = {};
67
+ if (props.enabled !== undefined) {
68
+ uniforms.enabled = Number(props.enabled);
69
+ }
70
+ if (props.mode !== undefined) {
71
+ uniforms.mode = props.mode === 'instance' ? CLIP_MODE_INSTANCE : CLIP_MODE_GEOMETRY;
72
+ }
73
+ if (props.bounds !== undefined) {
74
+ uniforms.bounds = props.bounds;
75
+ }
76
+ return uniforms;
77
+ }
78
+ };
79
+ /** Coordinate-system-neutral instance and geometry clipping. */
80
+ export const clipShaderPlugin = {
81
+ name: 'clip',
82
+ modules: [clipShaderModule],
83
+ varyings: {
84
+ clipCoordinates: { type: 'vec2<f32>', interpolation: 'smooth' }
85
+ },
86
+ glsl: {
87
+ injections: [
88
+ {
89
+ target: 'vs:CLIP_POSITION',
90
+ injection: `\
91
+ clipCoordinates = geometryCoordinates;
92
+ if (clipState.enabled != 0 && clipState.mode == ${CLIP_MODE_INSTANCE} &&
93
+ !clip_isInBounds(instanceCoordinates)) {
94
+ position = vec4(2.0, 2.0, 2.0, 1.0);
95
+ }`
96
+ },
97
+ {
98
+ target: 'fs:CLIP_COLOR',
99
+ injection: `\
100
+ if (clipState.enabled != 0 && clipState.mode == ${CLIP_MODE_GEOMETRY} &&
101
+ !clip_isInBounds(clipCoordinates)) {
102
+ discard;
103
+ }`
104
+ }
105
+ ]
106
+ },
107
+ wgsl: {
108
+ injections: [
109
+ {
110
+ target: 'vs:CLIP_POSITION',
111
+ injection: `\
112
+ clipCoordinates = geometryCoordinates;
113
+ if (clipUniforms.enabled != 0 && clipUniforms.mode == ${CLIP_MODE_INSTANCE} &&
114
+ !clip_isInBounds(instanceCoordinates)) {
115
+ *position = vec4<f32>(2.0, 2.0, 2.0, 1.0);
116
+ }`
117
+ },
118
+ {
119
+ target: 'fs:CLIP_COLOR',
120
+ injection: `\
121
+ if (clipUniforms.enabled != 0 && clipUniforms.mode == ${CLIP_MODE_GEOMETRY} &&
122
+ !clip_isInBounds(clipCoordinates)) {
123
+ discard;
124
+ }`
125
+ }
126
+ ]
127
+ }
128
+ };
129
+ //# sourceMappingURL=clip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clip.js","sourceRoot":"","sources":["../../../../src/modules/engine/clip/clip.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAoBpC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,gBAAgB,GAAG;IACvB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,EAA2B;IAClC,QAAQ,EAAE,EAAkB;IAC5B,aAAa,EAAE,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAC,CAAC;IACzC,YAAY,EAAE;QACZ,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,WAAW;KACpB;IACD,eAAe,EAAE;QACf,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KACrB;IACD,EAAE,EAAE,UAAU,CAAC;;;;;;;;;;;;;CAahB;IACC,EAAE,EAAE,UAAU,CAAC;;;;;;;;;;;;;CAahB;IACC,MAAM,EAAE,UAAU,CAAC;;;;;;;;;;;;;;;CAepB;IACC,WAAW,CAAC,QAA+B,EAAE;QAC3C,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACtF,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACjC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACuE,CAAC;AAE3E,gEAAgE;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,CAAC,gBAAgB,CAAC;IAC3B,QAAQ,EAAE;QACR,eAAe,EAAE,EAAC,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAC;KAC9D;IACD,IAAI,EAAE;QACJ,UAAU,EAAE;YACV;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE;;kDAE+B,kBAAkB;;;EAGlE;aACK;YACD;gBACE,MAAM,EAAE,eAAe;gBACvB,SAAS,EAAE;kDAC+B,kBAAkB;;;EAGlE;aACK;SACF;KACF;IACD,IAAI,EAAE;QACJ,UAAU,EAAE;YACV;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE;;wDAEqC,kBAAkB;;;EAGxE;aACK;YACD;gBACE,MAAM,EAAE,eAAe;gBACvB,SAAS,EAAE;wDACqC,kBAAkB;;;EAGxE;aACK;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ShaderPlugin } from "../../../lib/shader-plugin.js";
2
+ export type FilterShaderPluginProps = {
3
+ /** Enables range filtering. Defaults to true. */
4
+ enabled?: boolean;
5
+ /** Inclusive minimum accepted value. Defaults to 0. */
6
+ min?: number;
7
+ /** Inclusive maximum accepted value. Defaults to 1. */
8
+ max?: number;
9
+ };
10
+ /** Scalar inclusive-range filtering for shaders that expose the `FILTER_POSITION` vertex hook. */
11
+ export declare const filterShaderPlugin: ShaderPlugin;
12
+ //# sourceMappingURL=filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../../src/modules/engine/filter/filter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,YAAY,EAAC,sCAAmC;AAE7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,iDAAiD;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AA+DF,kGAAkG;AAClG,eAAO,MAAM,kBAAkB,EAAE,YA4BhC,CAAC"}