react-native-shine 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/lib/module/components/Content.js +112 -145
  2. package/lib/module/components/Content.js.map +1 -1
  3. package/lib/module/components/Shine.js +14 -5
  4. package/lib/module/components/Shine.js.map +1 -1
  5. package/lib/module/components/ShineGroup.js +0 -4
  6. package/lib/module/components/ShineGroup.js.map +1 -1
  7. package/lib/module/enums/colorPresets.js +192 -0
  8. package/lib/module/enums/colorPresets.js.map +1 -1
  9. package/lib/module/enums/effectDefaults.js +59 -0
  10. package/lib/module/enums/effectDefaults.js.map +1 -0
  11. package/lib/module/enums/effectPresets.js +67 -10
  12. package/lib/module/enums/effectPresets.js.map +1 -1
  13. package/lib/module/shaders/bindGroupLayouts.js +47 -29
  14. package/lib/module/shaders/bindGroupLayouts.js.map +1 -1
  15. package/lib/module/shaders/bindGroupUtils.js +30 -44
  16. package/lib/module/shaders/bindGroupUtils.js.map +1 -1
  17. package/lib/module/shaders/colorConversions.js +78 -0
  18. package/lib/module/shaders/colorConversions.js.map +1 -0
  19. package/lib/module/shaders/computeShaders/precomputeColorMask.js +5 -5
  20. package/lib/module/shaders/computeShaders/precomputeColorMask.js.map +1 -1
  21. package/lib/module/shaders/fragmentShaders/baseTextureFragment.js +4 -9
  22. package/lib/module/shaders/fragmentShaders/baseTextureFragment.js.map +1 -1
  23. package/lib/module/shaders/fragmentShaders/colorMaskFragment.js +28 -41
  24. package/lib/module/shaders/fragmentShaders/colorMaskFragment.js.map +1 -1
  25. package/lib/module/shaders/fragmentShaders/glareFlareFragment.js +84 -0
  26. package/lib/module/shaders/fragmentShaders/glareFlareFragment.js.map +1 -0
  27. package/lib/module/shaders/fragmentShaders/glareFragment.js +8 -88
  28. package/lib/module/shaders/fragmentShaders/glareFragment.js.map +1 -1
  29. package/lib/module/shaders/fragmentShaders/holoFragment.js +120 -11
  30. package/lib/module/shaders/fragmentShaders/holoFragment.js.map +1 -1
  31. package/lib/module/shaders/fragmentShaders/maskFragment.js +5 -4
  32. package/lib/module/shaders/fragmentShaders/maskFragment.js.map +1 -1
  33. package/lib/module/shaders/fragmentShaders/reverseHoloFragment.js +7 -7
  34. package/lib/module/shaders/fragmentShaders/reverseHoloFragment.js.map +1 -1
  35. package/lib/module/shaders/pipelineSetups.js +2 -61
  36. package/lib/module/shaders/pipelineSetups.js.map +1 -1
  37. package/lib/module/shaders/resourceManagement/buffersMap.js +41 -0
  38. package/lib/module/shaders/resourceManagement/buffersMap.js.map +1 -0
  39. package/lib/module/shaders/resourceManagement/pipelineMap.js +115 -0
  40. package/lib/module/shaders/resourceManagement/pipelineMap.js.map +1 -0
  41. package/lib/module/shaders/resourceManagement/textures.js +2 -2
  42. package/lib/module/shaders/resourceManagement/textures.js.map +1 -1
  43. package/lib/module/shaders/tgpuUtils.js +41 -0
  44. package/lib/module/shaders/tgpuUtils.js.map +1 -1
  45. package/lib/module/shaders/utils.js +21 -2
  46. package/lib/module/shaders/utils.js.map +1 -1
  47. package/lib/module/shaders/vertexShaders/mainRotationEffectVertex.js +4 -4
  48. package/lib/module/shaders/vertexShaders/mainRotationEffectVertex.js.map +1 -1
  49. package/lib/module/types/typeUtils.js +26 -155
  50. package/lib/module/types/typeUtils.js.map +1 -1
  51. package/lib/module/types/types.js +8 -1
  52. package/lib/module/types/types.js.map +1 -1
  53. package/lib/module/utils/size.js +4 -4
  54. package/lib/module/utils/vector.js +38 -38
  55. package/lib/typescript/src/components/Content.d.ts +6 -6
  56. package/lib/typescript/src/components/Content.d.ts.map +1 -1
  57. package/lib/typescript/src/components/Shine.d.ts.map +1 -1
  58. package/lib/typescript/src/components/ShineGroup.d.ts +1 -1
  59. package/lib/typescript/src/components/ShineGroup.d.ts.map +1 -1
  60. package/lib/typescript/src/enums/colorPresets.d.ts +152 -0
  61. package/lib/typescript/src/enums/colorPresets.d.ts.map +1 -1
  62. package/lib/typescript/src/enums/effectDefaults.d.ts +39 -0
  63. package/lib/typescript/src/enums/effectDefaults.d.ts.map +1 -0
  64. package/lib/typescript/src/enums/effectPresets.d.ts +284 -5
  65. package/lib/typescript/src/enums/effectPresets.d.ts.map +1 -1
  66. package/lib/typescript/src/shaders/bindGroupLayouts.d.ts +77 -41
  67. package/lib/typescript/src/shaders/bindGroupLayouts.d.ts.map +1 -1
  68. package/lib/typescript/src/shaders/bindGroupUtils.d.ts +86 -70
  69. package/lib/typescript/src/shaders/bindGroupUtils.d.ts.map +1 -1
  70. package/lib/typescript/src/shaders/colorConversions.d.ts +4 -0
  71. package/lib/typescript/src/shaders/colorConversions.d.ts.map +1 -0
  72. package/lib/typescript/src/shaders/fragmentShaders/baseTextureFragment.d.ts.map +1 -1
  73. package/lib/typescript/src/shaders/fragmentShaders/colorMaskFragment.d.ts.map +1 -1
  74. package/lib/typescript/src/shaders/fragmentShaders/glareFlareFragment.d.ts +5 -0
  75. package/lib/typescript/src/shaders/fragmentShaders/glareFlareFragment.d.ts.map +1 -0
  76. package/lib/typescript/src/shaders/fragmentShaders/glareFragment.d.ts +0 -3
  77. package/lib/typescript/src/shaders/fragmentShaders/glareFragment.d.ts.map +1 -1
  78. package/lib/typescript/src/shaders/fragmentShaders/holoFragment.d.ts +7 -0
  79. package/lib/typescript/src/shaders/fragmentShaders/holoFragment.d.ts.map +1 -1
  80. package/lib/typescript/src/shaders/fragmentShaders/maskFragment.d.ts.map +1 -1
  81. package/lib/typescript/src/shaders/fragmentShaders/reverseHoloFragment.d.ts.map +1 -1
  82. package/lib/typescript/src/shaders/pipelineSetups.d.ts +0 -6
  83. package/lib/typescript/src/shaders/pipelineSetups.d.ts.map +1 -1
  84. package/lib/typescript/src/shaders/resourceManagement/buffersMap.d.ts +10 -0
  85. package/lib/typescript/src/shaders/resourceManagement/buffersMap.d.ts.map +1 -0
  86. package/lib/typescript/src/shaders/resourceManagement/pipelineMap.d.ts +24 -0
  87. package/lib/typescript/src/shaders/resourceManagement/pipelineMap.d.ts.map +1 -0
  88. package/lib/typescript/src/shaders/resourceManagement/textures.d.ts +0 -1
  89. package/lib/typescript/src/shaders/resourceManagement/textures.d.ts.map +1 -1
  90. package/lib/typescript/src/shaders/tgpuUtils.d.ts +3 -0
  91. package/lib/typescript/src/shaders/tgpuUtils.d.ts.map +1 -1
  92. package/lib/typescript/src/shaders/utils.d.ts +1 -0
  93. package/lib/typescript/src/shaders/utils.d.ts.map +1 -1
  94. package/lib/typescript/src/types/typeUtils.d.ts +8 -47
  95. package/lib/typescript/src/types/typeUtils.d.ts.map +1 -1
  96. package/lib/typescript/src/types/types.d.ts +59 -54
  97. package/lib/typescript/src/types/types.d.ts.map +1 -1
  98. package/package.json +1 -1
  99. package/src/components/Content.tsx +126 -296
  100. package/src/components/Shine.tsx +22 -5
  101. package/src/components/ShineGroup.tsx +0 -4
  102. package/src/enums/colorPresets.ts +59 -1
  103. package/src/enums/effectDefaults.ts +57 -0
  104. package/src/enums/effectPresets.ts +142 -9
  105. package/src/shaders/bindGroupLayouts.ts +57 -28
  106. package/src/shaders/bindGroupUtils.ts +66 -69
  107. package/src/shaders/colorConversions.ts +88 -0
  108. package/src/shaders/computeShaders/precomputeColorMask.ts +4 -4
  109. package/src/shaders/fragmentShaders/baseTextureFragment.ts +2 -10
  110. package/src/shaders/fragmentShaders/colorMaskFragment.ts +34 -55
  111. package/src/shaders/fragmentShaders/glareFlareFragment.ts +79 -0
  112. package/src/shaders/fragmentShaders/glareFragment.ts +9 -84
  113. package/src/shaders/fragmentShaders/holoFragment.ts +139 -11
  114. package/src/shaders/fragmentShaders/maskFragment.ts +3 -9
  115. package/src/shaders/fragmentShaders/reverseHoloFragment.ts +4 -9
  116. package/src/shaders/pipelineSetups.ts +2 -120
  117. package/src/shaders/resourceManagement/buffersMap.ts +80 -0
  118. package/src/shaders/resourceManagement/pipelineMap.ts +169 -0
  119. package/src/shaders/resourceManagement/textures.ts +2 -2
  120. package/src/shaders/tgpuUtils.ts +29 -0
  121. package/src/shaders/utils.ts +29 -0
  122. package/src/shaders/vertexShaders/mainRotationEffectVertex.ts +2 -2
  123. package/src/types/typeUtils.ts +39 -159
  124. package/src/types/types.ts +111 -60
@@ -1,163 +1,70 @@
1
1
  import { vec2f, vec3f, vec4f } from 'typegpu/data';
2
2
  import * as d from 'typegpu/data';
3
3
  import type {
4
- GlareOptions,
5
4
  ColorMask,
6
- DeepPartiallyOptional,
7
5
  vec3,
8
6
  HoloOptions,
9
- ReverseHoloDetectionChannelFlags,
10
7
  vec2,
11
8
  vec4,
9
+ ColorMaskPreTypedSchema,
12
10
  } from './types';
13
- import { div } from 'typegpu/std';
14
11
  import { WAVE_CALLBACKS } from '../enums/waveCallback';
15
- import { colorMaskDebug } from '../config/debugMode';
16
12
  import {
17
13
  COLOR_MASK_MAX_COUNT,
18
14
  type ColorMaskSchema,
19
15
  } from '../shaders/bindGroupLayouts';
16
+ import { div } from 'typegpu/std';
17
+ import { deepMerge } from '../shaders/utils';
18
+ import { COLOR_MASK_DEFAULT_OPTIONS } from '../enums/effectDefaults';
20
19
 
21
- export const createGlareOptions = (
22
- options: Partial<GlareOptions>
23
- ): GlareOptions => {
24
- const { glowPower, glareColor, lightIntensity, glareIntensity } = options;
25
- const { hueBlendPower, hueShiftAngleMax, hueShiftAngleMin } =
26
- glareColor || {};
27
-
28
- const glareOp = {
29
- glowPower: glowPower ?? 1.0,
30
- lightIntensity: lightIntensity ?? 1.0,
31
- glareIntensity: glareIntensity ?? 1.0,
32
- glareColor: {
33
- hueShiftAngleMax: hueShiftAngleMax ?? 1.0,
34
- hueShiftAngleMin: hueShiftAngleMin ?? 0.0,
35
- hueBlendPower: hueBlendPower ?? 1.0,
36
- },
37
- };
38
-
39
- return glareOp;
40
- };
41
-
42
- export const glareOptionsToTyped = (glareOptions: GlareOptions) => {
43
- return {
44
- glowPower: glareOptions.glowPower,
45
- lightIntensity: glareOptions.lightIntensity,
46
- glareIntensity: glareOptions.glareIntensity,
47
- glareColor: {
48
- hueShiftAngleMax: glareOptions.glareColor.hueShiftAngleMax,
49
- hueShiftAngleMin: glareOptions.glareColor.hueShiftAngleMin,
50
- hueBlendPower: glareOptions.glareColor.hueBlendPower,
51
- },
52
- };
53
- };
20
+ const COLOR_MASK_PLACEHOLDER = new Array(COLOR_MASK_MAX_COUNT).fill(
21
+ COLOR_MASK_DEFAULT_OPTIONS
22
+ );
54
23
 
55
24
  export const createColorMasks = (
56
- colorMasks: DeepPartiallyOptional<ColorMask, 'baseColor'>[]
57
- ): ColorMask[] => {
58
- const newColorMasks: ColorMask[] = [];
59
- for (const i in colorMasks) {
60
- const {
61
- baseColor,
62
- rgbToleranceRange,
63
- useHSV,
64
- hueToleranceRange,
65
- brightnessTolerance,
66
- saturationTolerance,
67
- lowBrightnessThreshold,
68
- lowSaturationThreshold,
69
- } = colorMasks[i]!;
70
- const baseTolerance = {
71
- upper: [20, 20, 20] as vec3,
72
- lower: [20, 20, 20] as vec3,
73
- };
74
- const baseHueTolerance = {
75
- upper: 20,
76
- lower: 20,
77
- };
78
- const tolerance = { ...baseTolerance, ...rgbToleranceRange };
79
- const hueTolerance = { ...baseHueTolerance, ...hueToleranceRange };
80
- const newColorMask: ColorMask = {
81
- baseColor: baseColor,
82
- rgbToleranceRange: tolerance,
83
- useHSV: useHSV!!,
84
- hueToleranceRange: hueTolerance,
85
- brightnessTolerance: brightnessTolerance ?? 1.0,
86
- saturationTolerance: saturationTolerance ?? 1.0,
87
- lowBrightnessThreshold: lowBrightnessThreshold ?? 0.0,
88
- lowSaturationThreshold: lowSaturationThreshold ?? 0.0,
89
- debugMode: colorMaskDebug,
90
- };
91
-
92
- newColorMasks[i] = newColorMask;
93
- }
94
-
95
- // TODO: add radian and degree angle handling
96
- // '123deg' <- interpret as a numeric angle value
97
- // 2 <- interpret as a radian value
98
-
99
- return newColorMasks;
100
- };
101
-
102
- const fillColorMaskBufferWithDummies = (
103
- colorMasks: ColorMask[]
104
- ): ColorMask[] => {
105
- const dummyFilledColorMasks = new Array(COLOR_MASK_MAX_COUNT);
106
- for (let i = 0; i < dummyFilledColorMasks.length; i++) {
107
- if (i < colorMasks.length) {
108
- dummyFilledColorMasks[i] = colorMasks[i];
109
- } else {
110
- dummyFilledColorMasks[i] = {
111
- baseColor: [0, 0, 0],
112
- useHSV: false,
113
- rgbToleranceRange: {
114
- upper: [0, 0, 0],
115
- lower: [0, 0, 0],
116
- },
117
- hueToleranceRange: {
118
- upper: 0,
119
- lower: 0,
120
- },
121
- };
122
- }
123
- }
124
- return dummyFilledColorMasks;
125
- };
126
-
127
- export const colorMasksToTyped = (
128
25
  colorMasks: ColorMask[],
129
26
  reverseHighlight: boolean
130
27
  ) => {
131
- const typedColorMasks = fillColorMaskBufferWithDummies(colorMasks).map(
132
- (mask) => colorMaskToTyped(mask)
133
- );
28
+ const dummyFilledArray = [
29
+ ...colorMasks.map((mask) => {
30
+ const merged = deepMerge(COLOR_MASK_DEFAULT_OPTIONS, mask);
31
+ if ('hueMin' in mask || 'hueMax' in mask) {
32
+ merged.useHSV = 1;
33
+ }
34
+ return merged;
35
+ }),
36
+ ...COLOR_MASK_PLACEHOLDER.slice(
37
+ 0,
38
+ COLOR_MASK_MAX_COUNT - colorMasks.length
39
+ ),
40
+ ] as ColorMaskPreTypedSchema[];
41
+
134
42
  return {
135
- masks: typedColorMasks,
43
+ masks: dummyFilledArray.map(colorMaskToTyped),
136
44
  usedMaskCount: colorMasks.length,
137
45
  reverseHighlight: reverseHighlight ? 1 : 0,
138
46
  };
139
47
  };
140
48
 
141
- export const colorMaskToTyped = (colorMask: ColorMask) => {
142
- const result = {
49
+ export const colorMaskToTyped = ({
50
+ hueMin,
51
+ hueMax,
52
+ ...colorMask
53
+ }: ColorMaskPreTypedSchema): ColorMaskSchema => {
54
+ const hueRange = (hueMax - hueMin + 360) % 360;
55
+ return {
56
+ ...colorMask,
143
57
  baseColor: div(numberArrToTyped(colorMask.baseColor), 255),
144
58
  rgbToleranceRange: {
145
59
  upper: div(numberArrToTyped(colorMask.rgbToleranceRange.upper), 255),
146
60
  lower: div(numberArrToTyped(colorMask.rgbToleranceRange.lower), 255),
147
61
  },
148
- useHSV: colorMask.useHSV ? 1 : 0,
149
- hueToleranceRange: {
150
- lower: div(colorMask.hueToleranceRange.lower, 360),
151
- upper: div(colorMask.hueToleranceRange.upper, 360),
152
- },
153
- brightnessTolerance: colorMask.brightnessTolerance,
154
- saturationTolerance: colorMask.saturationTolerance,
155
- lowSaturationThreshold: colorMask.lowSaturationThreshold,
156
- lowBrightnessThreshold: colorMask.lowBrightnessThreshold,
62
+ hueStart: hueMin,
63
+ hueRange: hueRange === 0 && hueMin !== hueMax ? 360 : hueRange,
64
+ minLimits: d.vec2f(colorMask.saturationMin, colorMask.lightnessMin),
65
+ maxLimits: d.vec2f(colorMask.saturationMax, colorMask.lightnessMax),
157
66
  debugMode: colorMask.debugMode ? 1 : 0,
158
- } as d.Infer<ColorMaskSchema>;
159
-
160
- return result;
67
+ };
161
68
  };
162
69
 
163
70
  export const createHoloOptions = (
@@ -172,36 +79,6 @@ export const createHoloOptions = (
172
79
  return holoOpt;
173
80
  };
174
81
 
175
- export const createReverseHoloDetectionChannelFlags = (
176
- options?: Partial<ReverseHoloDetectionChannelFlags>
177
- ) => {
178
- let channelFlags;
179
- if (options) {
180
- const { redChannel, greenChannel, blueChannel, hue, saturation, value } =
181
- options;
182
-
183
- channelFlags = {
184
- redChannel: redChannel ?? 0.0,
185
- greenChannel: greenChannel ?? 0.0,
186
- blueChannel: blueChannel ?? 0.0,
187
- hue: hue ?? 0.0,
188
- saturation: saturation ?? 0.0,
189
- value: value ?? 0.0,
190
- };
191
- } else {
192
- channelFlags = {
193
- redChannel: 1.0,
194
- greenChannel: 0.0,
195
- blueChannel: 0.0,
196
- hue: 0.0,
197
- saturation: 0.0,
198
- value: 0.0,
199
- };
200
- }
201
-
202
- return channelFlags;
203
- };
204
-
205
82
  export function numberArrToTyped(vec: vec2): d.v2f;
206
83
  export function numberArrToTyped(vec: vec3): d.v3f;
207
84
  export function numberArrToTyped(vec: vec4): d.v4f;
@@ -219,7 +96,10 @@ export function numberArrToTyped(vec: number[]) {
219
96
  convFn = vec4f;
220
97
  break;
221
98
  default:
222
- throw new Error('numberArrToTyped: Vector must be of length [2-4]');
99
+ throw new Error(
100
+ 'numberArrToTyped: Vector must be of length [2-4] but it was ' +
101
+ vec.length
102
+ );
223
103
  }
224
104
 
225
105
  const typed = convFn(...vec);
@@ -1,80 +1,48 @@
1
1
  import type {
2
2
  TgpuBindGroup,
3
3
  TgpuBindGroupLayout,
4
+ TgpuFragmentFn,
4
5
  TgpuRenderPipeline,
6
+ TgpuRoot,
7
+ TgpuUniform,
8
+ ValidateBufferSchema,
5
9
  } from 'typegpu';
6
10
  import type { WaveCallbackFn } from '../enums/waveCallback';
11
+ import type { AnyWgslData, Infer, Vec2f, Vec4f } from 'typegpu/data';
12
+ import type {
13
+ ColorMaskSchema,
14
+ maskTextureBindGroupLayout,
15
+ } from '../shaders/bindGroupLayouts';
7
16
 
8
17
  export type vec2 = [number, number];
9
18
  export type vec3 = [number, number, number];
10
19
  export type vec4 = [number, number, number, number];
11
20
  export type quaternion = vec4;
12
-
13
- export type GlareOptions = {
14
- glowPower: number;
15
- lightIntensity: number;
16
- glareIntensity: number;
17
- glareColor: {
18
- hueBlendPower: number;
19
- hueShiftAngleMax: number;
20
- hueShiftAngleMin: number;
21
- };
22
- };
23
-
24
- export type ColorMask = {
21
+ type BaseColorMask = { debugMode: boolean };
22
+ export type RGBColorMask = BaseColorMask & {
25
23
  baseColor: vec3;
26
- useHSV?: boolean;
27
- hueToleranceRange: { upper: number; lower: number };
28
- brightnessTolerance?: number;
29
- saturationTolerance?: number;
30
- lowBrightnessThreshold?: number;
31
- lowSaturationThreshold?: number;
32
24
  rgbToleranceRange: {
33
25
  upper: vec3;
34
26
  lower: vec3;
35
27
  };
36
- debugMode?: boolean;
37
28
  };
38
-
39
- //TODO: figure out how to tell compiler that im sure that it's long enough ;-;
40
- export type ColorMaskArrayShaderAssert = [
41
- any,
42
- any,
43
- any,
44
- any,
45
- any,
46
- any,
47
- any,
48
- any,
49
- any,
50
- any,
51
- any,
52
- any,
53
- any,
54
- any,
55
- any,
56
- any,
57
- ];
58
-
59
- export type Effect =
60
- | {
61
- name: 'reverseHolo';
62
- options: Partial<ReverseHoloDetectionChannelFlags>;
63
- }
64
- | {
65
- name: 'holo';
66
- options?: HoloOptions;
67
- };
68
-
69
- export type ReverseHoloDetectionChannelFlags = {
70
- redChannel: number;
71
- greenChannel: number;
72
- blueChannel: number;
73
- hue: number;
74
- saturation: number;
75
- value: number;
29
+ export type HSLColorMask = BaseColorMask & {
30
+ hueMin: number;
31
+ hueMax: number;
32
+ saturationMin: number;
33
+ saturationMax: number;
34
+ lightnessMin: number;
35
+ lightnessMax: number;
76
36
  };
77
37
 
38
+ export type ColorMask =
39
+ | DeepPartiallyOptional<RGBColorMask, 'baseColor'>
40
+ | DeepPartial<HSLColorMask>;
41
+
42
+ export type ColorMaskPreTypedSchema = HSLColorMask &
43
+ RGBColorMask &
44
+ Pick<ColorMaskSchema, 'useHSV'>;
45
+
78
46
  export type HoloOptions = {
79
47
  intensity: number;
80
48
  waveCallback: WaveCallbackFn;
@@ -100,8 +68,15 @@ export type DeepPartial<T> = {
100
68
  [P in keyof T]?: T[P] extends Primitive | any[] ? T[P] : DeepPartial<T[P]>;
101
69
  };
102
70
 
103
- export type DeepPartiallyOptional<T, K extends keyof T> = Required<Pick<T, K>> &
104
- DeepPartial<Omit<T, K>>;
71
+ export type DeepPartiallyOptional<T, K extends keyof T> = T extends any
72
+ ? Required<Pick<T, K>> & DeepPartial<Omit<T, K>>
73
+ : never;
74
+
75
+ export type UnionToIntersection<U> = (
76
+ U extends any ? (k: U) => void : never
77
+ ) extends (k: infer I) => void
78
+ ? I
79
+ : never;
105
80
 
106
81
  export type BindGroupPair = {
107
82
  layout: TgpuBindGroupLayout;
@@ -113,3 +88,79 @@ export type ColorAttachment = Parameters<
113
88
  >[0];
114
89
 
115
90
  export type PipelineAttachmentPair = [TgpuRenderPipeline, ColorAttachment];
91
+
92
+ export type FragmentShaderReturnType = Vec4f;
93
+ export type FragmentType = TgpuFragmentFn<
94
+ {
95
+ uv: Vec2f;
96
+ },
97
+ FragmentShaderReturnType
98
+ >;
99
+
100
+ export type AnySchema = ValidateBufferSchema<AnyWgslData>;
101
+
102
+ export type BufferConfig<S extends AnySchema> = {
103
+ schema: S;
104
+ defaultOptions: Infer<S>;
105
+ };
106
+
107
+ export type TgpuUniformBuffer<S extends AnySchema> = TgpuUniform<S>['buffer'];
108
+
109
+ export type TgpuUniformBufferTuple<
110
+ T extends readonly BufferConfig<AnySchema>[],
111
+ > = {
112
+ [K in keyof T]: T[K] extends BufferConfig<infer S>
113
+ ? TgpuUniformBuffer<S>
114
+ : never;
115
+ };
116
+ export type BindGroupCreatorArgument = {
117
+ root: TgpuRoot;
118
+ maskBindGroup: TgpuBindGroup<UnwrapLayout<typeof maskTextureBindGroupLayout>>;
119
+ };
120
+
121
+ export type EffectDefinition<
122
+ TConfig extends readonly BufferConfig<AnySchema>[],
123
+ > = {
124
+ buffers: TConfig;
125
+ fragment: FragmentType;
126
+ bindGroupCreator: (
127
+ argument: BindGroupCreatorArgument,
128
+ buffers: TgpuUniformBufferTuple<TConfig>
129
+ ) => TgpuBindGroup[];
130
+ blend?: GPUBlendState;
131
+ };
132
+
133
+ type ValidateBuffers<T> = {
134
+ [K in keyof T]: T[K] extends { schema: infer S }
135
+ ? S extends AnySchema
136
+ ? {
137
+ schema: S;
138
+ defaultOptions: Infer<S>;
139
+ }
140
+ : never
141
+ : never;
142
+ };
143
+
144
+ export function createEffect<
145
+ const TConfig extends readonly BufferConfig<AnySchema>[],
146
+ >(
147
+ definition: EffectDefinition<TConfig> & {
148
+ buffers: ValidateBuffers<TConfig>;
149
+ }
150
+ ) {
151
+ return definition;
152
+ }
153
+
154
+ export type UnwrapLayout<T> =
155
+ T extends TgpuBindGroupLayout<infer U> ? U : never;
156
+
157
+ type GetInferredFromConfig<T> = T extends { schema: infer S }
158
+ ? S extends AnySchema
159
+ ? Infer<S>
160
+ : never
161
+ : never;
162
+
163
+ export type ExtractEffectOptions<TDef> =
164
+ TDef extends EffectDefinition<infer TConfig>
165
+ ? UnionToIntersection<GetInferredFromConfig<TConfig[number]>>
166
+ : never;