react-native-shine 0.7.0 → 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 (130) hide show
  1. package/lib/module/components/Content.js +126 -135
  2. package/lib/module/components/Content.js.map +1 -1
  3. package/lib/module/components/Shine.js +22 -3
  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 +50 -27
  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 +34 -0
  20. package/lib/module/shaders/computeShaders/precomputeColorMask.js.map +1 -0
  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 +5 -62
  36. package/lib/module/shaders/pipelineSetups.js.map +1 -1
  37. package/lib/module/shaders/resourceManagement/bufferManager.js.map +1 -1
  38. package/lib/module/shaders/resourceManagement/buffersMap.js +41 -0
  39. package/lib/module/shaders/resourceManagement/buffersMap.js.map +1 -0
  40. package/lib/module/shaders/resourceManagement/pipelineMap.js +115 -0
  41. package/lib/module/shaders/resourceManagement/pipelineMap.js.map +1 -0
  42. package/lib/module/shaders/resourceManagement/textures.js +2 -2
  43. package/lib/module/shaders/resourceManagement/textures.js.map +1 -1
  44. package/lib/module/shaders/tgpuUtils.js +41 -0
  45. package/lib/module/shaders/tgpuUtils.js.map +1 -1
  46. package/lib/module/shaders/utils.js +21 -2
  47. package/lib/module/shaders/utils.js.map +1 -1
  48. package/lib/module/shaders/vertexShaders/mainRotationEffectVertex.js +4 -4
  49. package/lib/module/shaders/vertexShaders/mainRotationEffectVertex.js.map +1 -1
  50. package/lib/module/types/typeUtils.js +29 -159
  51. package/lib/module/types/typeUtils.js.map +1 -1
  52. package/lib/module/types/types.js +8 -1
  53. package/lib/module/types/types.js.map +1 -1
  54. package/lib/module/utils/size.js +4 -4
  55. package/lib/module/utils/vector.js +38 -38
  56. package/lib/typescript/src/components/Content.d.ts +6 -6
  57. package/lib/typescript/src/components/Content.d.ts.map +1 -1
  58. package/lib/typescript/src/components/Shine.d.ts.map +1 -1
  59. package/lib/typescript/src/components/ShineGroup.d.ts +1 -1
  60. package/lib/typescript/src/components/ShineGroup.d.ts.map +1 -1
  61. package/lib/typescript/src/enums/colorPresets.d.ts +152 -0
  62. package/lib/typescript/src/enums/colorPresets.d.ts.map +1 -1
  63. package/lib/typescript/src/enums/effectDefaults.d.ts +39 -0
  64. package/lib/typescript/src/enums/effectDefaults.d.ts.map +1 -0
  65. package/lib/typescript/src/enums/effectPresets.d.ts +284 -5
  66. package/lib/typescript/src/enums/effectPresets.d.ts.map +1 -1
  67. package/lib/typescript/src/shaders/bindGroupLayouts.d.ts +82 -41
  68. package/lib/typescript/src/shaders/bindGroupLayouts.d.ts.map +1 -1
  69. package/lib/typescript/src/shaders/bindGroupUtils.d.ts +86 -70
  70. package/lib/typescript/src/shaders/bindGroupUtils.d.ts.map +1 -1
  71. package/lib/typescript/src/shaders/colorConversions.d.ts +4 -0
  72. package/lib/typescript/src/shaders/colorConversions.d.ts.map +1 -0
  73. package/lib/typescript/src/shaders/computeShaders/precomputeColorMask.d.ts +5 -0
  74. package/lib/typescript/src/shaders/computeShaders/precomputeColorMask.d.ts.map +1 -0
  75. package/lib/typescript/src/shaders/fragmentShaders/baseTextureFragment.d.ts.map +1 -1
  76. package/lib/typescript/src/shaders/fragmentShaders/colorMaskFragment.d.ts.map +1 -1
  77. package/lib/typescript/src/shaders/fragmentShaders/glareFlareFragment.d.ts +5 -0
  78. package/lib/typescript/src/shaders/fragmentShaders/glareFlareFragment.d.ts.map +1 -0
  79. package/lib/typescript/src/shaders/fragmentShaders/glareFragment.d.ts +0 -3
  80. package/lib/typescript/src/shaders/fragmentShaders/glareFragment.d.ts.map +1 -1
  81. package/lib/typescript/src/shaders/fragmentShaders/holoFragment.d.ts +7 -0
  82. package/lib/typescript/src/shaders/fragmentShaders/holoFragment.d.ts.map +1 -1
  83. package/lib/typescript/src/shaders/fragmentShaders/maskFragment.d.ts.map +1 -1
  84. package/lib/typescript/src/shaders/fragmentShaders/reverseHoloFragment.d.ts.map +1 -1
  85. package/lib/typescript/src/shaders/pipelineSetups.d.ts +3 -10
  86. package/lib/typescript/src/shaders/pipelineSetups.d.ts.map +1 -1
  87. package/lib/typescript/src/shaders/resourceManagement/bufferManager.d.ts +5 -3
  88. package/lib/typescript/src/shaders/resourceManagement/bufferManager.d.ts.map +1 -1
  89. package/lib/typescript/src/shaders/resourceManagement/buffersMap.d.ts +10 -0
  90. package/lib/typescript/src/shaders/resourceManagement/buffersMap.d.ts.map +1 -0
  91. package/lib/typescript/src/shaders/resourceManagement/pipelineMap.d.ts +24 -0
  92. package/lib/typescript/src/shaders/resourceManagement/pipelineMap.d.ts.map +1 -0
  93. package/lib/typescript/src/shaders/resourceManagement/textures.d.ts +0 -1
  94. package/lib/typescript/src/shaders/resourceManagement/textures.d.ts.map +1 -1
  95. package/lib/typescript/src/shaders/tgpuUtils.d.ts +3 -0
  96. package/lib/typescript/src/shaders/tgpuUtils.d.ts.map +1 -1
  97. package/lib/typescript/src/shaders/utils.d.ts +1 -0
  98. package/lib/typescript/src/shaders/utils.d.ts.map +1 -1
  99. package/lib/typescript/src/types/typeUtils.d.ts +16 -51
  100. package/lib/typescript/src/types/typeUtils.d.ts.map +1 -1
  101. package/lib/typescript/src/types/types.d.ts +59 -54
  102. package/lib/typescript/src/types/types.d.ts.map +1 -1
  103. package/package.json +1 -1
  104. package/src/components/Content.tsx +130 -269
  105. package/src/components/Shine.tsx +28 -3
  106. package/src/components/ShineGroup.tsx +0 -4
  107. package/src/enums/colorPresets.ts +59 -1
  108. package/src/enums/effectDefaults.ts +57 -0
  109. package/src/enums/effectPresets.ts +142 -9
  110. package/src/shaders/bindGroupLayouts.ts +64 -28
  111. package/src/shaders/bindGroupUtils.ts +66 -69
  112. package/src/shaders/colorConversions.ts +88 -0
  113. package/src/shaders/computeShaders/precomputeColorMask.ts +29 -0
  114. package/src/shaders/fragmentShaders/baseTextureFragment.ts +2 -10
  115. package/src/shaders/fragmentShaders/colorMaskFragment.ts +34 -55
  116. package/src/shaders/fragmentShaders/glareFlareFragment.ts +79 -0
  117. package/src/shaders/fragmentShaders/glareFragment.ts +9 -84
  118. package/src/shaders/fragmentShaders/holoFragment.ts +139 -11
  119. package/src/shaders/fragmentShaders/maskFragment.ts +3 -9
  120. package/src/shaders/fragmentShaders/reverseHoloFragment.ts +4 -9
  121. package/src/shaders/pipelineSetups.ts +16 -125
  122. package/src/shaders/resourceManagement/bufferManager.ts +8 -3
  123. package/src/shaders/resourceManagement/buffersMap.ts +80 -0
  124. package/src/shaders/resourceManagement/pipelineMap.ts +169 -0
  125. package/src/shaders/resourceManagement/textures.ts +2 -2
  126. package/src/shaders/tgpuUtils.ts +29 -0
  127. package/src/shaders/utils.ts +29 -0
  128. package/src/shaders/vertexShaders/mainRotationEffectVertex.ts +2 -2
  129. package/src/types/typeUtils.ts +53 -164
  130. package/src/types/types.ts +111 -60
@@ -1,158 +1,70 @@
1
- import { f32, vec2f, vec3f, vec4f } from 'typegpu/data';
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,
7
+ vec2,
8
+ vec4,
9
+ ColorMaskPreTypedSchema,
10
10
  } from './types';
11
- import { div } from 'typegpu/std';
12
11
  import { WAVE_CALLBACKS } from '../enums/waveCallback';
13
- import { colorMaskDebug } from '../config/debugMode';
14
- import { COLOR_MASK_MAX_COUNT } from '../shaders/bindGroupLayouts';
15
-
16
- export const createGlareOptions = (
17
- options: Partial<GlareOptions>
18
- ): GlareOptions => {
19
- const { glowPower, glareColor, lightIntensity, glareIntensity } = options;
20
- const { hueBlendPower, hueShiftAngleMax, hueShiftAngleMin } =
21
- glareColor || {};
22
-
23
- const glareOp = {
24
- glowPower: glowPower ?? 1.0,
25
- lightIntensity: lightIntensity ?? 1.0,
26
- glareIntensity: glareIntensity ?? 1.0,
27
- glareColor: {
28
- hueShiftAngleMax: hueShiftAngleMax ?? 1.0,
29
- hueShiftAngleMin: hueShiftAngleMin ?? 0.0,
30
- hueBlendPower: hueBlendPower ?? 1.0,
31
- },
32
- };
33
-
34
- return glareOp;
35
- };
12
+ import {
13
+ COLOR_MASK_MAX_COUNT,
14
+ type ColorMaskSchema,
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';
36
19
 
37
- export const glareOptionsToTyped = (glareOptions: GlareOptions) => {
38
- return {
39
- glowPower: f32(glareOptions.glowPower),
40
- lightIntensity: f32(glareOptions.lightIntensity),
41
- glareIntensity: f32(glareOptions.glareIntensity),
42
- glareColor: {
43
- hueShiftAngleMax: f32(glareOptions.glareColor.hueShiftAngleMax),
44
- hueShiftAngleMin: f32(glareOptions.glareColor.hueShiftAngleMin),
45
- hueBlendPower: f32(glareOptions.glareColor.hueBlendPower),
46
- },
47
- };
48
- };
20
+ const COLOR_MASK_PLACEHOLDER = new Array(COLOR_MASK_MAX_COUNT).fill(
21
+ COLOR_MASK_DEFAULT_OPTIONS
22
+ );
49
23
 
50
24
  export const createColorMasks = (
51
- colorMasks: DeepPartiallyOptional<ColorMask, 'baseColor'>[]
52
- ): ColorMask[] => {
53
- const newColorMasks: ColorMask[] = [];
54
- for (const i in colorMasks) {
55
- const {
56
- baseColor,
57
- rgbToleranceRange,
58
- useHSV,
59
- hueToleranceRange,
60
- brightnessTolerance,
61
- saturationTolerance,
62
- lowBrightnessThreshold,
63
- lowSaturationThreshold,
64
- } = colorMasks[i]!;
65
- const baseTolerance = {
66
- upper: [20, 20, 20] as vec3,
67
- lower: [20, 20, 20] as vec3,
68
- };
69
- const baseHueTolerance = {
70
- upper: 20,
71
- lower: 20,
72
- };
73
- const tolerance = { ...baseTolerance, ...rgbToleranceRange };
74
- const hueTolerance = { ...baseHueTolerance, ...hueToleranceRange };
75
- const newColorMask: ColorMask = {
76
- baseColor: baseColor,
77
- rgbToleranceRange: tolerance,
78
- useHSV: useHSV!!,
79
- hueToleranceRange: hueTolerance,
80
- brightnessTolerance: brightnessTolerance ?? 1.0,
81
- saturationTolerance: saturationTolerance ?? 1.0,
82
- lowBrightnessThreshold: lowBrightnessThreshold ?? 0.0,
83
- lowSaturationThreshold: lowSaturationThreshold ?? 0.0,
84
- debugMode: colorMaskDebug,
85
- };
86
-
87
- newColorMasks[i] = newColorMask;
88
- }
89
-
90
- // TODO: add radian and degree angle handling
91
- // '123deg' <- interpret as a numeric angle value
92
- // 2 <- interpret as a radian value
93
-
94
- return newColorMasks;
95
- };
96
-
97
- const fillColorMaskBufferWithDummies = (
98
- colorMasks: ColorMask[]
99
- ): ColorMask[] => {
100
- const dummyFilledColorMasks = new Array(COLOR_MASK_MAX_COUNT);
101
- for (let i = 0; i < dummyFilledColorMasks.length; i++) {
102
- if (i < colorMasks.length) {
103
- dummyFilledColorMasks[i] = colorMasks[i];
104
- } else {
105
- dummyFilledColorMasks[i] = {
106
- baseColor: [0, 0, 0],
107
- useHSV: false,
108
- rgbToleranceRange: {
109
- upper: [0, 0, 0],
110
- lower: [0, 0, 0],
111
- },
112
- hueToleranceRange: {
113
- upper: 0,
114
- lower: 0,
115
- },
116
- };
117
- }
118
- }
119
- return dummyFilledColorMasks;
120
- };
121
-
122
- export const colorMasksToTyped = (
123
25
  colorMasks: ColorMask[],
124
26
  reverseHighlight: boolean
125
27
  ) => {
126
- const typedColorMasks = fillColorMaskBufferWithDummies(colorMasks).map(
127
- (mask) => colorMaskToTyped(mask)
128
- );
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
+
129
42
  return {
130
- masks: typedColorMasks,
43
+ masks: dummyFilledArray.map(colorMaskToTyped),
131
44
  usedMaskCount: colorMasks.length,
132
45
  reverseHighlight: reverseHighlight ? 1 : 0,
133
46
  };
134
47
  };
135
48
 
136
- export const colorMaskToTyped = (colorMask: ColorMask) => {
137
- 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,
138
57
  baseColor: div(numberArrToTyped(colorMask.baseColor), 255),
139
58
  rgbToleranceRange: {
140
59
  upper: div(numberArrToTyped(colorMask.rgbToleranceRange.upper), 255),
141
60
  lower: div(numberArrToTyped(colorMask.rgbToleranceRange.lower), 255),
142
61
  },
143
- useHSV: d.u32(colorMask.useHSV ? 1 : 0),
144
- hueToleranceRange: {
145
- lower: div(f32(colorMask.hueToleranceRange.lower), 360),
146
- upper: div(f32(colorMask.hueToleranceRange.upper), 360),
147
- },
148
- brightnessTolerance: f32(colorMask.brightnessTolerance),
149
- saturationTolerance: f32(colorMask.saturationTolerance),
150
- lowSaturationThreshold: f32(colorMask.lowSaturationThreshold),
151
- lowBrightnessThreshold: f32(colorMask.lowBrightnessThreshold),
152
- debugMode: d.u32(colorMask.debugMode ? d.u32(1) : d.u32(0)),
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),
66
+ debugMode: colorMask.debugMode ? 1 : 0,
153
67
  };
154
-
155
- return result;
156
68
  };
157
69
 
158
70
  export const createHoloOptions = (
@@ -167,38 +79,12 @@ export const createHoloOptions = (
167
79
  return holoOpt;
168
80
  };
169
81
 
170
- export const createReverseHoloDetectionChannelFlags = (
171
- options?: Partial<ReverseHoloDetectionChannelFlags>
172
- ) => {
173
- let channelFlags;
174
- if (options) {
175
- const { redChannel, greenChannel, blueChannel, hue, saturation, value } =
176
- options;
177
-
178
- channelFlags = {
179
- redChannel: redChannel ?? d.f32(0.0),
180
- greenChannel: greenChannel ?? d.f32(0.0),
181
- blueChannel: blueChannel ?? d.f32(0.0),
182
- hue: hue ?? d.f32(0.0),
183
- saturation: saturation ?? d.f32(0.0),
184
- value: value ?? d.f32(0.0),
185
- };
186
- } else {
187
- channelFlags = {
188
- redChannel: d.f32(1.0),
189
- greenChannel: d.f32(0.0),
190
- blueChannel: d.f32(0.0),
191
- hue: d.f32(0.0),
192
- saturation: d.f32(0.0),
193
- value: d.f32(0.0),
194
- };
195
- }
196
-
197
- return channelFlags;
198
- };
199
-
200
- export const numberArrToTyped = (vec: number[]) => {
201
- let convFn: ((...args: number[]) => any) | null = null;
82
+ export function numberArrToTyped(vec: vec2): d.v2f;
83
+ export function numberArrToTyped(vec: vec3): d.v3f;
84
+ export function numberArrToTyped(vec: vec4): d.v4f;
85
+ export function numberArrToTyped(vec: number[]): d.v2f | d.v3f | d.v4f;
86
+ export function numberArrToTyped(vec: number[]) {
87
+ let convFn: ((...args: number[]) => d.v2f | d.v3f | d.v4f) | null = null;
202
88
  switch (vec.length) {
203
89
  case 2:
204
90
  convFn = vec2f;
@@ -210,9 +96,12 @@ export const numberArrToTyped = (vec: number[]) => {
210
96
  convFn = vec4f;
211
97
  break;
212
98
  default:
213
- 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
+ );
214
103
  }
215
104
 
216
105
  const typed = convFn(...vec);
217
106
  return typed;
218
- };
107
+ }
@@ -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;