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,69 +1,31 @@
1
- import type { TgpuBindGroup, TgpuBindGroupLayout, TgpuRenderPipeline } from 'typegpu';
1
+ import type { TgpuBindGroup, TgpuBindGroupLayout, TgpuFragmentFn, TgpuRenderPipeline, TgpuRoot, TgpuUniform, ValidateBufferSchema } from 'typegpu';
2
2
  import type { WaveCallbackFn } from '../enums/waveCallback';
3
+ import type { AnyWgslData, Infer, Vec2f, Vec4f } from 'typegpu/data';
4
+ import type { ColorMaskSchema, maskTextureBindGroupLayout } from '../shaders/bindGroupLayouts';
3
5
  export type vec2 = [number, number];
4
6
  export type vec3 = [number, number, number];
5
7
  export type vec4 = [number, number, number, number];
6
8
  export type quaternion = vec4;
7
- export type GlareOptions = {
8
- glowPower: number;
9
- lightIntensity: number;
10
- glareIntensity: number;
11
- glareColor: {
12
- hueBlendPower: number;
13
- hueShiftAngleMax: number;
14
- hueShiftAngleMin: number;
15
- };
9
+ type BaseColorMask = {
10
+ debugMode: boolean;
16
11
  };
17
- export type ColorMask = {
12
+ export type RGBColorMask = BaseColorMask & {
18
13
  baseColor: vec3;
19
- useHSV?: boolean;
20
- hueToleranceRange: {
21
- upper: number;
22
- lower: number;
23
- };
24
- brightnessTolerance?: number;
25
- saturationTolerance?: number;
26
- lowBrightnessThreshold?: number;
27
- lowSaturationThreshold?: number;
28
14
  rgbToleranceRange: {
29
15
  upper: vec3;
30
16
  lower: vec3;
31
17
  };
32
- debugMode?: boolean;
33
- };
34
- export type ColorMaskArrayShaderAssert = [
35
- any,
36
- any,
37
- any,
38
- any,
39
- any,
40
- any,
41
- any,
42
- any,
43
- any,
44
- any,
45
- any,
46
- any,
47
- any,
48
- any,
49
- any,
50
- any
51
- ];
52
- export type Effect = {
53
- name: 'reverseHolo';
54
- options: Partial<ReverseHoloDetectionChannelFlags>;
55
- } | {
56
- name: 'holo';
57
- options?: HoloOptions;
58
18
  };
59
- export type ReverseHoloDetectionChannelFlags = {
60
- redChannel: number;
61
- greenChannel: number;
62
- blueChannel: number;
63
- hue: number;
64
- saturation: number;
65
- value: number;
19
+ export type HSLColorMask = BaseColorMask & {
20
+ hueMin: number;
21
+ hueMax: number;
22
+ saturationMin: number;
23
+ saturationMax: number;
24
+ lightnessMin: number;
25
+ lightnessMax: number;
66
26
  };
27
+ export type ColorMask = DeepPartiallyOptional<RGBColorMask, 'baseColor'> | DeepPartial<HSLColorMask>;
28
+ export type ColorMaskPreTypedSchema = HSLColorMask & RGBColorMask & Pick<ColorMaskSchema, 'useHSV'>;
67
29
  export type HoloOptions = {
68
30
  intensity: number;
69
31
  waveCallback: WaveCallbackFn;
@@ -75,11 +37,54 @@ export type Primitive = string | number | boolean | bigint | symbol | null | und
75
37
  export type DeepPartial<T> = {
76
38
  [P in keyof T]?: T[P] extends Primitive | any[] ? T[P] : DeepPartial<T[P]>;
77
39
  };
78
- export type DeepPartiallyOptional<T, K extends keyof T> = Required<Pick<T, K>> & DeepPartial<Omit<T, K>>;
40
+ export type DeepPartiallyOptional<T, K extends keyof T> = T extends any ? Required<Pick<T, K>> & DeepPartial<Omit<T, K>> : never;
41
+ export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
79
42
  export type BindGroupPair = {
80
43
  layout: TgpuBindGroupLayout;
81
44
  group: TgpuBindGroup;
82
45
  };
83
46
  export type ColorAttachment = Parameters<TgpuRenderPipeline['withColorAttachment']>[0];
84
47
  export type PipelineAttachmentPair = [TgpuRenderPipeline, ColorAttachment];
48
+ export type FragmentShaderReturnType = Vec4f;
49
+ export type FragmentType = TgpuFragmentFn<{
50
+ uv: Vec2f;
51
+ }, FragmentShaderReturnType>;
52
+ export type AnySchema = ValidateBufferSchema<AnyWgslData>;
53
+ export type BufferConfig<S extends AnySchema> = {
54
+ schema: S;
55
+ defaultOptions: Infer<S>;
56
+ };
57
+ export type TgpuUniformBuffer<S extends AnySchema> = TgpuUniform<S>['buffer'];
58
+ export type TgpuUniformBufferTuple<T extends readonly BufferConfig<AnySchema>[]> = {
59
+ [K in keyof T]: T[K] extends BufferConfig<infer S> ? TgpuUniformBuffer<S> : never;
60
+ };
61
+ export type BindGroupCreatorArgument = {
62
+ root: TgpuRoot;
63
+ maskBindGroup: TgpuBindGroup<UnwrapLayout<typeof maskTextureBindGroupLayout>>;
64
+ };
65
+ export type EffectDefinition<TConfig extends readonly BufferConfig<AnySchema>[]> = {
66
+ buffers: TConfig;
67
+ fragment: FragmentType;
68
+ bindGroupCreator: (argument: BindGroupCreatorArgument, buffers: TgpuUniformBufferTuple<TConfig>) => TgpuBindGroup[];
69
+ blend?: GPUBlendState;
70
+ };
71
+ type ValidateBuffers<T> = {
72
+ [K in keyof T]: T[K] extends {
73
+ schema: infer S;
74
+ } ? S extends AnySchema ? {
75
+ schema: S;
76
+ defaultOptions: Infer<S>;
77
+ } : never : never;
78
+ };
79
+ export declare function createEffect<const TConfig extends readonly BufferConfig<AnySchema>[]>(definition: EffectDefinition<TConfig> & {
80
+ buffers: ValidateBuffers<TConfig>;
81
+ }): EffectDefinition<TConfig> & {
82
+ buffers: ValidateBuffers<TConfig>;
83
+ };
84
+ export type UnwrapLayout<T> = T extends TgpuBindGroupLayout<infer U> ? U : never;
85
+ type GetInferredFromConfig<T> = T extends {
86
+ schema: infer S;
87
+ } ? S extends AnySchema ? Infer<S> : never : never;
88
+ export type ExtractEffectOptions<TDef> = TDef extends EffectDefinition<infer TConfig> ? UnionToIntersection<GetInferredFromConfig<TConfig[number]>> : never;
89
+ export {};
85
90
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-shine",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Fast and efficient way of adding interactive effects that are run entirely on shaders using typeGPU.",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -1,4 +1,4 @@
1
- import { useEffect, useMemo, useRef, useState } from 'react';
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
2
  import { PixelRatio, View, type ViewStyle } from 'react-native';
3
3
  import Animated, {
4
4
  SensorType,
@@ -15,50 +15,22 @@ import {
15
15
  } from 'react-native-wgpu';
16
16
  import * as d from 'typegpu/data';
17
17
  import type {
18
+ SampledFlag,
19
+ StorageFlag,
18
20
  TextureProps,
19
- TgpuRenderPipeline,
20
21
  TgpuRoot,
21
22
  TgpuTexture,
22
23
  } from 'typegpu';
24
+ import { scheduleOnUI } from 'react-native-worklets';
23
25
  import {
24
- bufferData,
25
- type BufferData,
26
- textureBindGroupLayout,
26
+ colorMaskArraySchema,
27
+ precomputeColorMaskBindGroupLayout,
28
+ precomputeColorMaskOutputBindGroupLayout,
29
+ rotationSchema,
27
30
  } from '../shaders/bindGroupLayouts';
28
31
  import useAnimationFrame from '../hooks/useAnimationFrame';
29
- import { TypedBufferMap } from '../shaders/resourceManagement/bufferManager';
30
- import {
31
- createColorMaskBindGroup,
32
- createGlareBindGroup,
33
- createReverseHoloDetectionChannelFlagsBindGroup,
34
- createRotationValuesBindGroup,
35
- } from '../shaders/bindGroupUtils';
36
- import colorMaskFragment from '../shaders/fragmentShaders/colorMaskFragment';
37
- import { newGlareFragment } from '../shaders/fragmentShaders/glareFragment';
38
- import {
39
- attachBindGroups,
40
- blend,
41
- createMaskPipeline,
42
- createRainbowHoloPipeline as createHoloPipeline,
43
- createReverseHoloPipeline,
44
- getDefaultTarget,
45
- } from '../shaders/pipelineSetups';
46
- import mainVertex from '../shaders/vertexShaders/mainVertex';
47
32
  import { subscribeToOrientationChange } from '../shaders/utils';
48
- import type {
49
- ColorAttachment,
50
- ColorMask,
51
- DeepPartiallyOptional,
52
- Effect,
53
- GlareOptions,
54
- PipelineAttachmentPair,
55
- } from '../types/types';
56
- import {
57
- colorMasksToTyped,
58
- createColorMasks,
59
- createGlareOptions,
60
- createReverseHoloDetectionChannelFlags,
61
- } from '../types/typeUtils';
33
+ import type { ColorMask } from '../types/types';
62
34
  import type { V2d, V3d } from '../types/vector';
63
35
  import {
64
36
  addV3d,
@@ -75,18 +47,19 @@ import {
75
47
  zeroV3d,
76
48
  } from '../utils/vector';
77
49
  import { baseTextureFragment } from '../shaders/fragmentShaders/baseTextureFragment';
50
+ import { PipelineManager } from '../shaders/resourceManagement/pipelineMap';
51
+ import { blend, type Effect } from '../enums/effectPresets';
52
+ import { createColorMasks } from '../types/typeUtils';
53
+ import { createColorMaskBindGroup } from '../shaders/bindGroupUtils';
54
+ import colorMaskFragment from '../shaders/fragmentShaders/colorMaskFragment';
55
+ import { precomputeColorMask } from '../shaders/computeShaders/precomputeColorMask';
78
56
 
79
57
  export interface SharedProps {
80
58
  width: number;
81
59
  height: number;
82
- glareOptions?: Partial<GlareOptions>;
83
- enableGlare?: boolean;
84
- highlightColors?: DeepPartiallyOptional<ColorMask, 'baseColor'>[];
60
+ highlightColors?: ColorMask[];
85
61
  isHighlightInclusive?: boolean;
86
62
  lightPosition?: SharedValue<V2d>;
87
- // addReverseHolo?: boolean;
88
- // reverseHoloDetectionChannelOptions?: Partial<ReverseHoloDetectionChannelFlags>;
89
- // addHolo?: boolean;
90
63
  translateViewIn3d?:
91
64
  | boolean
92
65
  | {
@@ -102,55 +75,35 @@ interface ContentProps extends SharedProps {
102
75
  root: TgpuRoot;
103
76
  imageTexture: TgpuTexture<TextureProps>;
104
77
  maskTexture?: TgpuTexture<TextureProps>;
105
- }
106
-
107
- interface PipelineMap {
108
- baseTexture: TgpuRenderPipeline;
109
- glare: TgpuRenderPipeline | void;
110
- colorMask: TgpuRenderPipeline | void;
111
- mask: TgpuRenderPipeline | void;
112
- reverseHolo: TgpuRenderPipeline | void;
113
- holo: TgpuRenderPipeline | void;
78
+ colorMaskStorageTexture?: TgpuTexture<any> & StorageFlag;
114
79
  }
115
80
 
116
81
  export default function Content({
117
- // addHolo,
118
- // addReverseHolo,
119
- // reverseHoloDetectionChannelOptions,
120
- effects,
82
+ effects = [{ name: 'glare' }],
121
83
  highlightColors,
122
84
  isHighlightInclusive = true,
123
- glareOptions,
124
- enableGlare = true,
125
85
  height,
126
86
  imageTexture,
127
87
  maskTexture,
128
88
  root,
129
- lightPosition: touchPosition,
89
+ lightPosition,
130
90
  width,
131
91
  translateViewIn3d = false,
132
92
  style,
133
93
  containerStyle,
94
+ colorMaskStorageTexture,
134
95
  }: ContentProps) {
135
96
  const { device } = root;
136
97
  // const { ref, context } = useGPUContext();
137
98
  const ref = useRef<CanvasRef>(null);
138
99
  const [context, setContext] = useState<RNCanvasContext | null>(null);
139
- // const context = ref.current!.getContext('webgpu')!;
140
100
 
141
101
  useEffect(() => {
142
102
  if (ref) setContext(ref.current?.getContext('webgpu')!);
143
103
  }, [ref]);
144
104
 
145
105
  const presentationFormat = navigator.gpu.getPreferredCanvasFormat();
146
- const renderRef = useRef<() => void>(null);
147
-
148
- //changing canvas size to prevent blur
149
- const pixelRatio = PixelRatio.get();
150
- const size = { x: width, y: height };
151
- const pixelSize = transformV2d(scaleV2d(size, pixelRatio), (v) =>
152
- Math.max(1, Math.round(v))
153
- );
106
+ const isCanvasReady = useSharedValue(true);
154
107
 
155
108
  const landscape = useSharedValue<boolean>(false);
156
109
  const rotation = useSharedValue<V3d>(zeroV3d); // final GPU offsets
@@ -162,9 +115,10 @@ export default function Content({
162
115
  const calibrated = useSharedValue<boolean>(false);
163
116
  const gravitySensor = useAnimatedSensor(SensorType.GRAVITY, { interval: 20 });
164
117
 
165
- const bufferMap = useMemo(
166
- () => new TypedBufferMap<BufferData>(bufferData),
167
- []
118
+ const pipelineCache = useMemo(
119
+ () =>
120
+ new PipelineManager(root, presentationFormat, imageTexture, maskTexture),
121
+ [imageTexture, maskTexture, presentationFormat, root]
168
122
  );
169
123
 
170
124
  const animatedStyle = useAnimatedStyle(() => {
@@ -200,9 +154,9 @@ export default function Content({
200
154
  useDerivedValue(() => {
201
155
  'worklet';
202
156
 
203
- if (touchPosition) {
204
- rotation.value = touchPosition
205
- ? { x: touchPosition.value.x, y: touchPosition.value.y, z: 0 }
157
+ if (lightPosition) {
158
+ rotation.value = lightPosition
159
+ ? { x: lightPosition.value.x, y: lightPosition.value.y, z: 0 }
206
160
  : zeroV3d;
207
161
 
208
162
  return;
@@ -251,11 +205,88 @@ export default function Content({
251
205
  );
252
206
  });
253
207
 
254
- // Render loop
208
+ //TODO: is this needed here?
209
+ const effectsCache =
210
+ JSON.stringify(effects) + JSON.stringify(highlightColors);
211
+
255
212
  useEffect(() => {
256
- if (!context) return;
213
+ const initPipelines = async () => {
214
+ pipelineCache.pipelinesMap.clear();
215
+
216
+ pipelineCache.addPipeline(baseTextureFragment);
217
+
218
+ effects.forEach(({ name, options }) => {
219
+ pipelineCache.addPipelineWithBuffer(name, options);
220
+ });
221
+
222
+ //TODO: move to effect definition
223
+ if (highlightColors) {
224
+ const colorMaskBuffer = pipelineCache.buffersMap.syncUniformBuffer(
225
+ colorMaskArraySchema,
226
+ createColorMasks(highlightColors, isHighlightInclusive)
227
+ );
228
+ const colorMaskBindGroup = createColorMaskBindGroup(
229
+ root,
230
+ colorMaskBuffer
231
+ );
232
+
233
+ if (colorMaskStorageTexture) {
234
+ const precomputeColorMaskBindGroup = root.createBindGroup(
235
+ precomputeColorMaskBindGroupLayout,
236
+ {
237
+ colorMaskStorage: colorMaskStorageTexture as TgpuTexture<{
238
+ size: readonly number[];
239
+ format: 'rgba8unorm';
240
+ }> &
241
+ StorageFlag,
242
+ }
243
+ );
244
+ const precomputeColorMaskOutputBindGroup = root.createBindGroup(
245
+ precomputeColorMaskOutputBindGroupLayout,
246
+ {
247
+ colorMaskOutput: colorMaskStorageTexture as TgpuTexture<{
248
+ size: readonly number[];
249
+ format: 'rgba8unorm';
250
+ }> &
251
+ SampledFlag,
252
+ }
253
+ );
254
+ pipelineCache.addComputePipeline(precomputeColorMask, [
255
+ colorMaskBindGroup,
256
+ precomputeColorMaskBindGroup,
257
+ ]);
258
+ await pipelineCache.runComputePipeline(precomputeColorMask);
259
+ // colorMaskOutputTexture.write(colorMaskStorageTexture);
260
+
261
+ pipelineCache.addPipeline(
262
+ colorMaskFragment,
263
+ [colorMaskBindGroup, precomputeColorMaskOutputBindGroup],
264
+ blend
265
+ );
266
+ }
267
+ }
268
+ };
269
+ initPipelines();
270
+ // eslint-disable-next-line react-hooks/exhaustive-deps
271
+ }, [
272
+ effectsCache,
273
+ isHighlightInclusive,
274
+ pipelineCache,
275
+ root,
276
+ colorMaskStorageTexture,
277
+ ]);
278
+
279
+ useEffect(() => {
280
+ if (!context) {
281
+ return;
282
+ }
283
+ // changing canvas size to prevent blur
284
+ const pixelRatio = PixelRatio.get();
285
+ const size = { x: width, y: height };
286
+ const pixelSize = transformV2d(scaleV2d(size, pixelRatio), (v) =>
287
+ Math.max(1, Math.round(v))
288
+ );
257
289
 
258
- //this sets the underlying resolution of the canvas to prevent blurriness
259
290
  const canvasElement = context.canvas;
260
291
 
261
292
  if (
@@ -265,203 +296,33 @@ export default function Content({
265
296
  canvasElement.width = pixelSize.x;
266
297
  canvasElement.height = pixelSize.y;
267
298
  }
268
-
269
- context.configure({
270
- device,
271
- format: presentationFormat,
272
- alphaMode: 'premultiplied',
273
- });
274
-
275
- // const sampler = device.createSampler({
276
- // magFilter: 'linear',
277
- // minFilter: 'linear',
278
- // mipmapFilter: 'linear',
279
- // });
280
-
281
- const sampler = root['~unstable'].createSampler({
282
- magFilter: 'linear',
283
- minFilter: 'linear',
284
- mipmapFilter: 'linear',
285
- }) as any as GPUSampler; //TODO: delete this cast when TgpuFixedSampler gets exposed
286
-
287
- const imageTextureBindGroup = root.createBindGroup(textureBindGroupLayout, {
288
- texture: root.unwrap(imageTexture).createView(),
289
- sampler,
299
+ //this is a workaround to prevent error logs but it should be handled by webgpu
300
+ scheduleOnUI(() => {
301
+ 'worklet';
302
+ context.configure({
303
+ device,
304
+ format: presentationFormat,
305
+ alphaMode: 'premultiplied',
306
+ });
307
+ isCanvasReady.value = true;
290
308
  });
309
+ }, [context, device, height, presentationFormat, width, isCanvasReady]);
291
310
 
292
- const rotationBuffer = bufferMap.addBuffer(root, 'rotation', d.vec3f(0.0));
293
-
294
- const rotationBindGroup = createRotationValuesBindGroup(
295
- root,
296
- rotationBuffer
297
- );
298
-
299
- const glareBuffer = bufferMap.addBuffer(
300
- root,
301
- 'glare',
302
- createGlareOptions(glareOptions ?? {})
303
- );
304
- const glareBindGroup = createGlareBindGroup(root, glareBuffer);
305
-
306
- const colorMaskBuffer = bufferMap.addBuffer(
307
- root,
308
- 'colorMask',
309
- colorMasksToTyped(
310
- createColorMasks(
311
- highlightColors ?? [{ baseColor: [-20, -20, -20], useHSV: false }]
312
- ),
313
- isHighlightInclusive
314
- )
315
- );
316
- const colorMaskBindGroup = createColorMaskBindGroup(root, colorMaskBuffer);
317
-
318
- const reverseHoloEffect = effects
319
- ? effects.find((e) => e.name === 'reverseHolo')
320
- : undefined;
321
- const reverseHoloDetectionChannelFlagsBuffer = bufferMap.addBuffer(
322
- root,
323
- 'reverseHoloDetectionChannelFlags',
324
- createReverseHoloDetectionChannelFlags(reverseHoloEffect?.options)
325
- );
326
- const reverseHoloDetectionChannelFlagsBindGroup =
327
- createReverseHoloDetectionChannelFlagsBindGroup(
328
- root,
329
- reverseHoloDetectionChannelFlagsBuffer,
330
- glareBuffer
331
- );
332
-
333
- const holoEffect = effects
334
- ? effects.find((e) => e.name === 'holo')
335
- : undefined;
336
-
337
- const pipelineMap: PipelineMap = {
338
- baseTexture: attachBindGroups(
339
- root['~unstable']
340
- .withVertex(mainVertex, {})
341
- .withFragment(
342
- baseTextureFragment,
343
- getDefaultTarget(presentationFormat)
344
- )
345
- .createPipeline(),
346
- [imageTextureBindGroup, rotationBindGroup]
347
- ),
348
- glare: attachBindGroups(
349
- root['~unstable']
350
- .withVertex(mainVertex, {})
351
- .withFragment(newGlareFragment, getDefaultTarget(presentationFormat))
352
- .createPipeline(),
353
- [
354
- imageTextureBindGroup,
355
- rotationBindGroup,
356
- glareBindGroup,
357
- colorMaskBindGroup,
358
- ]
359
- ),
360
- colorMask: attachBindGroups(
361
- root['~unstable']
362
- .withVertex(mainVertex, {})
363
- .withFragment(
364
- colorMaskFragment,
365
- getDefaultTarget(presentationFormat, blend)
366
- )
367
- .createPipeline(),
368
- [imageTextureBindGroup, colorMaskBindGroup, rotationBindGroup]
369
- ),
370
- mask: createMaskPipeline(
371
- root,
372
- maskTexture,
373
- [imageTextureBindGroup, rotationBindGroup],
374
- sampler,
375
- presentationFormat
376
- ),
377
- reverseHolo: createReverseHoloPipeline(
378
- root,
379
- maskTexture,
380
- [
381
- imageTextureBindGroup,
382
- rotationBindGroup,
383
- reverseHoloDetectionChannelFlagsBindGroup,
384
- ],
385
- sampler,
386
- presentationFormat
387
- ),
388
- holo: createHoloPipeline(
389
- root,
390
- imageTexture,
391
- [rotationBindGroup],
392
- sampler,
393
- presentationFormat
394
- ),
395
- };
396
-
397
- const modifyBuffers = () => {
398
- rotationBuffer.write(d.vec3f(...componentsFromV3d(rotation.value)));
399
- };
400
-
401
- const renderPipelines = () => {
402
- const view = context.getCurrentTexture().createView();
403
- const initialAttachment: ColorAttachment = {
404
- view,
405
- clearValue: [0, 0, 0, 0],
406
- loadOp: 'clear',
407
- storeOp: 'store',
408
- };
409
- const loadingAttachment: ColorAttachment = {
410
- view,
411
- clearValue: [0, 0, 0, 0],
412
- loadOp: 'load',
413
- storeOp: 'store',
414
- };
415
-
416
- const { baseTexture, glare, mask, colorMask, holo, reverseHolo } =
417
- pipelineMap;
418
-
419
- const pairs: PipelineAttachmentPair[] = [
420
- [baseTexture, initialAttachment],
421
- ];
422
-
423
- if ((glareOptions || !enableGlare) && glare) {
424
- pairs.push([glare, loadingAttachment]);
425
- }
426
- if (mask) pairs.push([mask, loadingAttachment]);
427
- if (reverseHoloEffect && reverseHolo)
428
- pairs.push([reverseHolo, loadingAttachment]);
429
- if (holoEffect && holo) pairs.push([holo, loadingAttachment]);
430
- if (colorMask) pairs.push([colorMask, loadingAttachment]);
431
-
432
- pairs.forEach(([pipeline, attachment]) =>
433
- pipeline.withColorAttachment(attachment).draw(6)
434
- );
435
- };
436
-
437
- const presentContext = () => context.present();
311
+ const frameCallback = useCallback(() => {
312
+ if (!context || !isCanvasReady.value) {
313
+ return;
314
+ }
438
315
 
439
- renderRef.current = () => {
440
- modifyBuffers();
441
- renderPipelines();
442
- presentContext();
443
- };
316
+ pipelineCache.buffersMap
317
+ .get(rotationSchema)
318
+ ?.write(d.vec3f(...componentsFromV3d(rotation.value)));
444
319
 
445
- // const res = tgpu.resolve({ externals: { reverseHoloFragment } });
446
- // console.log('reverseHoloFragment resolve:', res);
447
- }, [
448
- device,
449
- context,
450
- root,
451
- presentationFormat,
452
- imageTexture,
453
- maskTexture,
454
- rotation,
455
- bufferMap,
456
- glareOptions,
457
- enableGlare,
458
- highlightColors,
459
- pixelSize,
460
- effects,
461
- isHighlightInclusive,
462
- ]);
320
+ const view = context.getCurrentTexture().createView();
321
+ pipelineCache.renderPipelines(view);
322
+ context.present();
323
+ }, [context, pipelineCache, rotation, isCanvasReady]);
463
324
 
464
- useAnimationFrame(() => renderRef.current?.());
325
+ useAnimationFrame(frameCallback);
465
326
 
466
327
  return (
467
328
  <View