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
@@ -2,50 +2,37 @@ import tgpu from 'typegpu';
2
2
  import * as d from 'typegpu/data';
3
3
  import * as std from 'typegpu/std';
4
4
  import {
5
- textureBindGroupLayout,
5
+ COLOR_MASK_MAX_COUNT,
6
6
  colorMaskBindGroupLayout,
7
+ type ColorMaskSchema,
8
+ // sharedBindGroupLayout,
9
+ // precomputeColorMaskOutputBindGroupLayout,
7
10
  } from '../bindGroupLayouts';
8
- import { rgbToHSV } from '../tgpuUtils';
9
- import type { ColorMaskArrayShaderAssert } from '../../types/types';
11
+ import { getPixelColorFromNonReversedVector } from '../tgpuUtils';
12
+ import { RGBToHSL } from '../colorConversions';
10
13
 
11
14
  const colorMaskFragment = tgpu['~unstable'].fragmentFn({
12
15
  in: { uv: d.vec2f },
13
16
  out: d.vec4f,
14
17
  })((input) => {
15
- const texcoord = d.vec2f(input.uv.x, 1.0 - input.uv.y);
18
+ let color = getPixelColorFromNonReversedVector(input.uv);
16
19
 
17
- let color = std.textureSample(
18
- textureBindGroupLayout.$.texture,
19
- textureBindGroupLayout.$.sampler,
20
- texcoord
21
- );
22
- const masks = colorMaskBindGroupLayout.$.colorMasks
23
- .masks as ColorMaskArrayShaderAssert;
20
+ const masks = colorMaskBindGroupLayout.$.colorMasks.masks;
24
21
  const usedMaskCount = colorMaskBindGroupLayout.$.colorMasks.usedMaskCount;
25
22
  const reverseHighlight =
26
23
  colorMaskBindGroupLayout.$.colorMasks.reverseHighlight;
27
24
 
28
25
  let colorMaskDebug = d.u32(0);
29
26
  let cumulativeMaskCheck = d.u32(0);
30
- const colorHSV = rgbToHSV(color.xyz);
27
+ const colorHSL = RGBToHSL(color.xyz);
31
28
 
32
29
  //TODO: optimize this more
33
- for (let i = 0; i < 16; i++) {
30
+ for (let i = 0; i < COLOR_MASK_MAX_COUNT; i++) {
34
31
  if (usedMaskCount <= i) break;
35
32
 
36
- const mask = masks[i];
33
+ const mask = masks[i] as ColorMaskSchema;
37
34
  const maskedColor = mask.baseColor;
38
35
  const rgbToleranceRange = mask.rgbToleranceRange;
39
- const useHSV = mask.useHSV;
40
-
41
- const hueToleranceRange = mask.hueToleranceRange;
42
- const hueUpper = hueToleranceRange.upper;
43
- const hueLower = hueToleranceRange.lower;
44
-
45
- const brightnessTolerance = mask.brightnessTolerance;
46
- const saturationTolerance = mask.saturationTolerance;
47
- const lowSaturationThreshold = mask.lowSaturationThreshold;
48
- const lowBrightnessThreshold = mask.lowBrightnessThreshold;
49
36
 
50
37
  const maskedColorLower = std.sub(maskedColor, rgbToleranceRange.lower);
51
38
  const maskedColorUpper = std.add(maskedColor, rgbToleranceRange.upper);
@@ -53,37 +40,29 @@ const colorMaskFragment = tgpu['~unstable'].fragmentFn({
53
40
  const lowerCheck = std.all(std.ge(color.xyz, maskedColorLower));
54
41
  const rgbCheck = upperCheck && lowerCheck;
55
42
 
56
- const maskedHSV = rgbToHSV(maskedColor);
57
-
58
- let hueDiff = std.sub(colorHSV.x, maskedHSV.x);
59
- hueDiff = std.select(hueDiff, std.sub(hueDiff, 1.0), hueDiff > d.f32(0.5));
60
- hueDiff = std.select(hueDiff, std.add(hueDiff, 1.0), hueDiff < d.f32(-0.5));
61
- const lowerHueCheck = hueDiff >= -hueLower;
62
- const upperHueCheck = hueDiff <= hueUpper;
63
- let hueCheck = lowerHueCheck && upperHueCheck;
64
-
65
- const saturationDiff = std.abs(std.sub(colorHSV.y, maskedHSV.y));
66
- const saturationCheck = saturationDiff <= saturationTolerance;
67
-
68
- const brightnessDiff = std.abs(std.sub(colorHSV.z, maskedHSV.z));
69
- const brightnessCheck = brightnessDiff <= brightnessTolerance;
70
-
71
- const pixelIsGray = colorHSV.y < lowSaturationThreshold;
72
- const targetIsGray = maskedHSV.y < lowSaturationThreshold;
73
-
74
- const pixelIsBlack = colorHSV.z < lowBrightnessThreshold;
75
- const targetIsBlack = maskedHSV.z < lowBrightnessThreshold;
76
-
77
- //hue is unstable when either color is gray or black (low saturation or low brightness)
78
- //TODO: investigate the '||' operator usage, it seems to severely slow down the shader?
79
- const hueIsUnstable =
80
- pixelIsGray || targetIsGray || pixelIsBlack || targetIsBlack;
81
-
82
- hueCheck = std.select(hueCheck, d.bool(true), hueIsUnstable);
83
-
84
- const hsvCheck = hueCheck && saturationCheck && brightnessCheck;
85
- const maskCheck = std.select(rgbCheck, hsvCheck, useHSV === d.u32(1));
86
- cumulativeMaskCheck = cumulativeMaskCheck + d.u32(maskCheck);
43
+ const saturationAndLightness = colorHSL.yz;
44
+ const hueStart = mask.hueStart;
45
+ const hueDiff = colorHSL.x - hueStart;
46
+ const distance = std.mod(std.add(hueDiff, 360), 360);
47
+ const hueCheck = std.step(distance, mask.hueRange);
48
+
49
+ // step(min, val) -> returns 1.0, if val >= min
50
+ // step(val, max) -> returns 1.0, if max >= val
51
+ const checkVec = std.mul(
52
+ std.step(mask.minLimits, saturationAndLightness),
53
+ std.step(saturationAndLightness, mask.maxLimits)
54
+ );
55
+
56
+ const saturationAndLightnessMask = std.mul(checkVec.x, checkVec.y);
57
+
58
+ const hslCheck = std.mul(hueCheck, saturationAndLightnessMask);
59
+
60
+ const maskCheck = std.select(
61
+ d.u32(rgbCheck),
62
+ hslCheck,
63
+ mask.useHSV === d.u32(1)
64
+ );
65
+ cumulativeMaskCheck = cumulativeMaskCheck + maskCheck;
87
66
  colorMaskDebug = colorMaskDebug + mask.debugMode;
88
67
  }
89
68
 
@@ -0,0 +1,79 @@
1
+ import tgpu from 'typegpu';
2
+ import * as d from 'typegpu/data';
3
+ import * as std from 'typegpu/std';
4
+ import {
5
+ glareFlareBindGroupLayout,
6
+ sharedBindGroupLayout,
7
+ } from '../bindGroupLayouts';
8
+ import { getPixelColorFromVector } from '../tgpuUtils';
9
+ import { HSLToRGB, RGBToHSL } from '../colorConversions';
10
+
11
+ export const glareFlareFragment = tgpu['~unstable'].fragmentFn({
12
+ in: { uv: d.vec2f },
13
+ out: d.vec4f,
14
+ })((input) => {
15
+ const uv = d.vec2f(input.uv.x, 1.0 - input.uv.y);
16
+ const centeredCoords = std.sub(std.mul(uv, 2.0), 1.0);
17
+
18
+ let color = getPixelColorFromVector(uv);
19
+
20
+ const rot = sharedBindGroupLayout.$.rot;
21
+ const center = std.add(d.vec2f(0.0), d.vec2f(rot.x, rot.y)); // do not change
22
+ let dist = std.distance(center, centeredCoords);
23
+
24
+ // Normalize UV coordinates to be between -1 and 1
25
+ let uv_norm = std.sub(std.mul(input.uv, 2.0), 1.0);
26
+
27
+ // Calculate distance from center and ensure it does not exceed 1
28
+ let angle = std.atan2(std.add(rot.y, uv_norm.y), std.sub(rot.x, uv_norm.x));
29
+
30
+ dist = std.clamp(dist, 0.0, 1.0);
31
+ // Parameters for flare components
32
+ let flare_intensity = glareFlareBindGroupLayout.$.glareFlare.flareIntensity;
33
+ let spot_intensity = glareFlareBindGroupLayout.$.glareFlare.flareIntensity;
34
+ let ring_intensity = glareFlareBindGroupLayout.$.glareFlare.ringIntensity;
35
+ let ray_intensity = glareFlareBindGroupLayout.$.glareFlare.rayIntensity;
36
+ let falloff = glareFlareBindGroupLayout.$.glareFlare.falloff;
37
+ let ray_count = glareFlareBindGroupLayout.$.glareFlare.rayCount;
38
+
39
+ // Central bright spot with distance-based falloff
40
+ let spot = spot_intensity / (dist * falloff + 0.1);
41
+
42
+ // Rings calculation, also respecting the texture boundary
43
+ let ring1 = (std.sin(dist * 10.0) * ring_intensity) / (dist * falloff + 0.5);
44
+ let ring2 = (std.sin(dist * 20.0) * ring_intensity) / (dist * falloff + 0.3);
45
+
46
+ const noise = std.abs(std.sin(rot.x)) + std.abs(std.cos(rot.y));
47
+ // Ray calculation: create a series of sharp radial spikes
48
+ let ray_angle = angle * ray_count + noise;
49
+
50
+ // Enhanced variability in ray length and size
51
+ let ray_length_factor =
52
+ 0.25 + 0.95 * std.abs(std.sin(angle * 3.0 * noise)) * noise;
53
+ let ray_size_factor =
54
+ 0.05 + 1.15 * std.abs(std.cos(angle * 13.0 * noise)) + noise;
55
+
56
+ // Apply variability to rays
57
+ let ray =
58
+ std.pow(std.abs(std.sin(ray_angle)), 15.0 * ray_size_factor) *
59
+ ray_intensity *
60
+ (1.0 - dist * ray_length_factor) *
61
+ noise;
62
+
63
+ // Combine all flare components
64
+ let flare = spot + ring1 + ring2 + ray;
65
+
66
+ // Calculate fade factor to black based on distance to the edge
67
+ let edge_fade = 1.0 - dist;
68
+
69
+ // Apply edge fade
70
+ const flareFaded = flare * edge_fade;
71
+ const flareFinal = std.clamp(flareFaded * flare_intensity, 0.0, 1.0);
72
+
73
+ const hslColor = RGBToHSL(color.xyz);
74
+ const lightness = std.clamp(hslColor.z + flareFinal, 0.0, 1.0);
75
+ const combined = HSLToRGB(d.vec3f(hslColor.xy, lightness));
76
+ // Final color with flare intensity, clamped to prevent oversaturation
77
+ // color = d.vec4f(std.mix(color.xyz, combined, glow), color.w);
78
+ return d.vec4f(combined, color.w);
79
+ });
@@ -2,95 +2,24 @@ import tgpu from 'typegpu';
2
2
  import * as d from 'typegpu/data';
3
3
  import * as std from 'typegpu/std';
4
4
  import {
5
- rotationBindGroupLayout,
6
- textureBindGroupLayout,
5
+ sharedBindGroupLayout,
7
6
  glareBindGroupLayout,
8
- // colorMaskBindGroupLayout,
9
7
  } from '../bindGroupLayouts';
10
- import { glareColorShift, hueShift, overlayChannels } from '../tgpuUtils';
8
+ import {
9
+ getPixelColorFromVector,
10
+ glareColorShift,
11
+ hueShift,
12
+ overlayChannels,
13
+ } from '../tgpuUtils';
11
14
 
12
15
  export const glareFragment = tgpu['~unstable'].fragmentFn({
13
16
  in: { uv: d.vec2f },
14
17
  out: d.vec4f,
15
18
  })((input) => {
16
- const texcoord = d.vec2f(input.uv.x, 1.0 - input.uv.y);
17
- const uv = d.vec2f(input.uv.x, 1.0 - input.uv.y);
18
- const centeredCoords = std.sub(std.mul(uv, 2.0), 1); //-1 to 1
19
-
20
- const rot = rotationBindGroupLayout.$.vec;
21
- const center = std.add(d.vec2f(0.0), d.vec2f(rot.x, rot.y));
22
-
23
- const glareOptions = glareBindGroupLayout.$.glareOptions;
24
- const glareIntensity = glareOptions.glareIntensity;
25
- const glowPower = glareOptions.glowPower;
26
- const lightIntensity = glareOptions.lightIntensity;
27
-
28
- const glareColor = glareOptions.glareColor;
29
- const hueBlendPower = glareColor.hueBlendPower;
30
- const hueShiftAngleMax = glareColor.hueShiftAngleMax;
31
- const hueShiftAngleMin = glareColor.hueShiftAngleMin;
32
-
33
- // const mask = colorMaskBindGroupLayout.$.mask;
34
- // const maskedColor = mask.baseColor;
35
- // const rgbToleranceRange = mask.rgbToleranceRange;
36
-
37
- let color = std.textureSample(
38
- textureBindGroupLayout.$.texture,
39
- textureBindGroupLayout.$.sampler,
40
- texcoord
41
- );
42
-
43
- // const maskedColorLower = std.sub(maskedColor, rgbToleranceRange.lower);
44
- // const maskedColorUpper = std.add(maskedColor, rgbToleranceRange.upper);
45
- // const upperCheck = std.all(std.le(color.xyz, maskedColorUpper));
46
- // const lowerCheck = std.all(std.ge(color.xyz, maskedColorLower));
47
- // if (upperCheck && lowerCheck) {
48
- // return color;
49
- // }
50
-
51
- //glareIntensity
52
- const dst = std.exp(-std.distance(center, centeredCoords));
53
- const distToCenter = std.smoothstep(0.0, 1 / glareIntensity, dst);
54
-
55
- //glowPower
56
- let glow = d.vec3f(distToCenter);
57
- glow = std.mul(glow, glowPower * color.w);
58
-
59
- //hueBlend
60
- const hueBlend = (d.f32(hueBlendPower) * dst) / 10.0;
61
-
62
- //lightIntensity
63
- glow = std.add(glow, lightIntensity / 10.0);
64
- let shiftedRGB = glareColorShift(color.xyz, dst / (lightIntensity * 2));
65
-
66
- //hueShiftAngleMin/Max
67
- const hueShiftAngle = std.smoothstep(
68
- hueShiftAngleMin,
69
- hueShiftAngleMax,
70
- distToCenter
71
- );
72
- const shiftedHue = hueShift(shiftedRGB, hueShiftAngle);
73
- shiftedRGB = overlayChannels(shiftedRGB, shiftedHue);
74
-
75
- color = d.vec4f(std.mix(color.xyz, shiftedRGB, hueBlend), color.w);
76
- const baseColor = color;
77
- const blendColor = glow;
78
-
79
- const combined = overlayChannels(baseColor.xyz, blendColor);
80
- color = d.vec4f(std.mix(color.xyz, combined, glow), color.w);
81
-
82
- return color;
83
- });
84
-
85
- export const newGlareFragment = tgpu['~unstable'].fragmentFn({
86
- in: { uv: d.vec2f },
87
- out: d.vec4f,
88
- })((input) => {
89
- const texcoord = d.vec2f(input.uv.x, 1.0 - input.uv.y);
90
19
  const uv = d.vec2f(input.uv.x, 1.0 - input.uv.y);
91
20
  const centeredCoords = std.sub(std.mul(uv, 2.0), 1.0);
92
21
 
93
- const rot = rotationBindGroupLayout.$.vec;
22
+ const rot = sharedBindGroupLayout.$.rot;
94
23
  const center = std.add(d.vec2f(0.0), d.vec2f(rot.x, rot.y)); // do not change
95
24
 
96
25
  const opts = glareBindGroupLayout.$.glareOptions;
@@ -103,11 +32,7 @@ export const newGlareFragment = tgpu['~unstable'].fragmentFn({
103
32
  const hueShiftAngleMin = glareColor.hueShiftAngleMin; // degrees
104
33
  const hueShiftAngleMax = glareColor.hueShiftAngleMax; // degrees
105
34
 
106
- let color = std.textureSample(
107
- textureBindGroupLayout.$.texture,
108
- textureBindGroupLayout.$.sampler,
109
- texcoord
110
- );
35
+ let color = getPixelColorFromVector(uv);
111
36
 
112
37
  const dist = std.distance(center, centeredCoords);
113
38
  const radial = std.exp(-dist); // (0,1], steeper near center
@@ -2,24 +2,152 @@ import tgpu from 'typegpu';
2
2
  import * as d from 'typegpu/data';
3
3
  import * as std from 'typegpu/std';
4
4
  import {
5
- rotationBindGroupLayout,
6
- textureBindGroupLayout,
5
+ holoBindGroupLayout,
6
+ sharedBindGroupLayout,
7
7
  } from '../bindGroupLayouts';
8
- import { hueShift } from '../tgpuUtils';
8
+ import {
9
+ getPixelColorFromVector,
10
+ hsvToRGB,
11
+ hueShift,
12
+ overlayChannels,
13
+ random,
14
+ } from '../tgpuUtils';
9
15
  import { waveCallbackSlot } from '../../enums/waveCallback';
10
16
 
17
+ export const holo = tgpu.fn(
18
+ [d.vec2f, d.f32, d.f32, d.f32],
19
+ d.vec4f
20
+ )((uv, directionDegreeModifier, shiftModifier, rotationShiftPowerModifier) => {
21
+ const rot = sharedBindGroupLayout.$.rot;
22
+
23
+ const textureColor = getPixelColorFromVector(uv);
24
+
25
+ const directionDegree = std.add(
26
+ holoBindGroupLayout.$.holoOptions.directionDegree,
27
+ directionDegreeModifier
28
+ );
29
+ const shift = std.add(holoBindGroupLayout.$.holoOptions.shift, shiftModifier);
30
+ const rotationShiftPower = std.mul(
31
+ holoBindGroupLayout.$.holoOptions.rotationShiftPower,
32
+ rotationShiftPowerModifier
33
+ );
34
+ const holoSize = holoBindGroupLayout.$.holoOptions.holoSize;
35
+ const holoMultiplier = holoBindGroupLayout.$.holoOptions.holoMultiplier;
36
+
37
+ //todo: need to redo logic of this, it should base on the calcualted diff size not add additional width
38
+ const holoEaseSize = holoBindGroupLayout.$.holoOptions.holoEaseSize;
39
+ const holoVisibility = holoBindGroupLayout.$.holoOptions.holoVisibility;
40
+ const holoSaturation = holoBindGroupLayout.$.holoOptions.holoSaturation;
41
+
42
+ const angelDegrees = std.radians(
43
+ std.add(
44
+ holoBindGroupLayout.$.holoOptions.directionDegree,
45
+ directionDegreeModifier
46
+ )
47
+ );
48
+
49
+ const yMultiplier = std.abs(std.cos(angelDegrees));
50
+ const xMultiplier = std.abs(std.sin(angelDegrees));
51
+ const range = std.add(xMultiplier, yMultiplier);
52
+
53
+ const intervalSize = std.div(range, holoMultiplier);
54
+ const x =
55
+ std.add(std.mul(uv.x, xMultiplier), std.mul(uv.y, yMultiplier)) + shift + 1; //scale to [0,2)
56
+
57
+ const rotationShift = std.add(
58
+ std.mul(rot.x, xMultiplier),
59
+ std.mul(rot.y, yMultiplier)
60
+ );
61
+ const shiftMultiplied = std.mul(rotationShift, rotationShiftPower);
62
+ const offset = shiftMultiplied + shift; //why is shitft here?
63
+
64
+ const xOffseted = (x + offset) % intervalSize;
65
+ const diffractionSizeCalculated = std.mul(holoSize, intervalSize);
66
+ const diffractionNoiseSizeCalcualted = std.mul(
67
+ diffractionSizeCalculated,
68
+ holoEaseSize
69
+ );
70
+ const diffractionStart = diffractionNoiseSizeCalcualted;
71
+ const diffractionEnd = std.add(diffractionSizeCalculated, diffractionStart);
72
+
73
+ const t =
74
+ (xOffseted - diffractionStart) / (diffractionEnd - diffractionStart);
75
+ const holoRotated = std.select(0, Math.PI, directionDegree > 179);
76
+ const ft = (1 - std.cos(Math.PI * t - holoRotated)) / 2;
77
+ const hue = -0.06 + ft * 0.85;
78
+ const hueWithNoise = std.add(std.div(random(uv.xy) - 0.5, 180) * 40, hue); //check with normal distribution
79
+ const missingRedHue = hueWithNoise + 1.0; // maps negative values to red from the end of hue
80
+ const rainbowAccurateHue = std.select(
81
+ missingRedHue,
82
+ hueWithNoise,
83
+ hueWithNoise > 0
84
+ );
85
+
86
+ const boundaryCheck = std.any(
87
+ d.vec2b(xOffseted < diffractionStart, xOffseted > diffractionEnd)
88
+ );
89
+ const xBoundary = std.select(
90
+ diffractionStart - xOffseted,
91
+ xOffseted - diffractionEnd,
92
+ xOffseted > diffractionStart
93
+ );
94
+ const xBoundaryScalled = std.div(xBoundary, diffractionNoiseSizeCalcualted);
95
+ const boundaryVisibilityScalled = std.pow(xBoundaryScalled, 2);
96
+ const calculatedVisibility = std.clamp(
97
+ std.mix(
98
+ holoVisibility,
99
+ 1,
100
+ boundaryVisibilityScalled * d.f32(boundaryCheck)
101
+ ),
102
+ 0,
103
+ 1
104
+ );
105
+
106
+ const shiftedRGB = hsvToRGB(d.vec3f(rainbowAccurateHue, holoSaturation, 1));
107
+ const vsibilityAdjustsed = std.mul(calculatedVisibility, textureColor.w);
108
+ return d.vec4f(shiftedRGB, vsibilityAdjustsed);
109
+ });
110
+
111
+ export const doubleHoloFragment = tgpu['~unstable'].fragmentFn({
112
+ in: { uv: d.vec2f },
113
+ out: d.vec4f,
114
+ })((input) => {
115
+ const uv = d.vec2f(input.uv.x, 1.0 - input.uv.y);
116
+ const firstHolo = holo(uv, 0, 0, 1);
117
+ const secondHolo = holo(uv, 178, 0.59, -1);
118
+ const aa = std.add(firstHolo.w, secondHolo.w);
119
+ const vis = std.sub(2.0, aa);
120
+ const test = std.sub(1, vis);
121
+ const visibility = std.clamp(test, 0.9, 1);
122
+ const singleColor = std.select(firstHolo, secondHolo, secondHolo.w !== 1);
123
+ const addedColor = d.vec4f(
124
+ overlayChannels(firstHolo.xyz, secondHolo.xyz),
125
+ visibility
126
+ );
127
+ const finalColor = std.select(
128
+ singleColor,
129
+ addedColor,
130
+ std.all(d.vec2b(secondHolo.w !== 1, firstHolo.w !== 1))
131
+ );
132
+
133
+ return finalColor;
134
+ });
135
+
11
136
  export const holoFragment = tgpu['~unstable'].fragmentFn({
12
137
  in: { uv: d.vec2f },
13
138
  out: d.vec4f,
14
139
  })((input) => {
15
- const texcoord = d.vec2f(input.uv.x, 1.0 - input.uv.y);
16
- const uv = texcoord;
17
- const textureColor = std.textureSample(
18
- textureBindGroupLayout.$.texture,
19
- textureBindGroupLayout.$.sampler,
20
- texcoord
21
- );
22
- const rot = rotationBindGroupLayout.$.vec;
140
+ const uv = d.vec2f(input.uv.x, 1.0 - input.uv.y);
141
+ return holo(uv, 0, 0, 1);
142
+ });
143
+
144
+ export const oldHoloFragment = tgpu['~unstable'].fragmentFn({
145
+ in: { uv: d.vec2f },
146
+ out: d.vec4f,
147
+ })((input) => {
148
+ const uv = d.vec2f(input.uv.x, 1.0 - input.uv.y);
149
+ const textureColor = getPixelColorFromVector(uv);
150
+ const rot = sharedBindGroupLayout.$.rot;
23
151
 
24
152
  const wave = waveCallbackSlot.$(rot.xy);
25
153
  const waveX = wave.x;
@@ -1,10 +1,8 @@
1
1
  import tgpu from 'typegpu';
2
2
  import * as d from 'typegpu/data';
3
3
  import * as std from 'typegpu/std';
4
- import {
5
- textureBindGroupLayout,
6
- maskTextureBindGroupLayout,
7
- } from '../bindGroupLayouts';
4
+ import { maskTextureBindGroupLayout } from '../bindGroupLayouts';
5
+ import { getPixelColorFromVector } from '../tgpuUtils';
8
6
 
9
7
  const maskFragment = tgpu['~unstable'].fragmentFn({
10
8
  in: { uv: d.vec2f },
@@ -19,11 +17,7 @@ const maskFragment = tgpu['~unstable'].fragmentFn({
19
17
  );
20
18
  const reversedMask = d.vec4f(std.sub(1.0, mask.xyz), mask.w);
21
19
 
22
- let color = std.textureSample(
23
- textureBindGroupLayout.$.texture,
24
- textureBindGroupLayout.$.sampler,
25
- texcoord
26
- );
20
+ let color = getPixelColorFromVector(texcoord);
27
21
 
28
22
  return d.vec4f(color.xyz, reversedMask.x);
29
23
  });
@@ -2,12 +2,11 @@ import tgpu from 'typegpu';
2
2
  import * as d from 'typegpu/data';
3
3
  import * as std from 'typegpu/std';
4
4
  import {
5
- textureBindGroupLayout,
6
5
  maskTextureBindGroupLayout,
7
- rotationBindGroupLayout,
8
6
  reverseHoloDetectionChannelFlagsBindGroupLayout,
7
+ sharedBindGroupLayout,
9
8
  } from '../bindGroupLayouts';
10
- import { hueShift, rgbToHSV } from '../tgpuUtils';
9
+ import { getPixelColorFromVector, hueShift, rgbToHSV } from '../tgpuUtils';
11
10
 
12
11
  export const reverseHoloFragment = tgpu['~unstable'].fragmentFn({
13
12
  in: { uv: d.vec2f },
@@ -17,7 +16,7 @@ export const reverseHoloFragment = tgpu['~unstable'].fragmentFn({
17
16
  const uv = texcoord;
18
17
  const centeredCoords = std.sub(std.mul(uv, 2.0), 1.0);
19
18
 
20
- const rot = rotationBindGroupLayout.$.vec;
19
+ const rot = sharedBindGroupLayout.$.rot;
21
20
  const center = std.add(d.vec2f(0.0), d.vec2f(rot.x, rot.y)); // center from device orientation/touch
22
21
 
23
22
  // glare options---------------------------------
@@ -43,11 +42,7 @@ export const reverseHoloFragment = tgpu['~unstable'].fragmentFn({
43
42
  const valueFlag = detectionChannelFlags.value;
44
43
  //------------------------------------------------
45
44
 
46
- const cardColor = std.textureSample(
47
- textureBindGroupLayout.$.texture,
48
- textureBindGroupLayout.$.sampler,
49
- texcoord
50
- );
45
+ const cardColor = getPixelColorFromVector(texcoord);
51
46
 
52
47
  const holoMaskColor = std.textureSample(
53
48
  maskTextureBindGroupLayout.$.texture,