glre 0.41.0 → 0.42.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 (138) hide show
  1. package/dist/addons.cjs +1 -1
  2. package/dist/addons.cjs.map +1 -1
  3. package/dist/addons.d.ts +378 -7
  4. package/dist/addons.js +1 -1
  5. package/dist/addons.js.map +1 -1
  6. package/dist/index.cjs +2 -2
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.js +2 -2
  9. package/dist/index.js.map +1 -1
  10. package/dist/node.cjs +12 -12
  11. package/dist/node.cjs.map +1 -1
  12. package/dist/node.d.ts +1 -1
  13. package/dist/node.js +12 -12
  14. package/dist/node.js.map +1 -1
  15. package/package.json +1 -1
  16. package/src/addons/color/blend/add.ts +35 -0
  17. package/src/addons/color/blend/average.ts +35 -0
  18. package/src/addons/color/blend/color.ts +28 -0
  19. package/src/addons/color/blend/colorBurn.ts +35 -0
  20. package/src/addons/color/blend/colorDodge.ts +39 -0
  21. package/src/addons/color/blend/darken.ts +35 -0
  22. package/src/addons/color/blend/difference.ts +35 -0
  23. package/src/addons/color/blend/exclusion.ts +35 -0
  24. package/src/addons/color/blend/glow.ts +36 -0
  25. package/src/addons/color/blend/hardLight.ts +36 -0
  26. package/src/addons/color/blend/hardMix.ts +39 -0
  27. package/src/addons/color/blend/hue.ts +29 -0
  28. package/src/addons/color/blend/index.ts +28 -0
  29. package/src/addons/color/blend/lighten.ts +35 -0
  30. package/src/addons/color/blend/linearBurn.ts +39 -0
  31. package/src/addons/color/blend/linearDodge.ts +39 -0
  32. package/src/addons/color/blend/linearLight.ts +44 -0
  33. package/src/addons/color/blend/luminosity.ts +28 -0
  34. package/src/addons/color/blend/multiply.ts +35 -0
  35. package/src/addons/color/blend/negation.ts +35 -0
  36. package/src/addons/color/blend/overlay.ts +38 -0
  37. package/src/addons/color/blend/phoenix.ts +35 -0
  38. package/src/addons/color/blend/pinLight.ts +40 -0
  39. package/src/addons/color/blend/reflect.ts +35 -0
  40. package/src/addons/color/blend/saturation.ts +28 -0
  41. package/src/addons/color/blend/screen.ts +39 -0
  42. package/src/addons/color/blend/softLight.ts +63 -0
  43. package/src/addons/color/blend/subtract.ts +37 -0
  44. package/src/addons/color/blend/vividLight.ts +44 -0
  45. package/src/addons/color/composite/compositeXor.ts +40 -0
  46. package/src/addons/color/composite/destinationAtop.ts +42 -0
  47. package/src/addons/color/composite/destinationIn.ts +42 -0
  48. package/src/addons/color/composite/destinationOut.ts +42 -0
  49. package/src/addons/color/composite/destinationOver.ts +42 -0
  50. package/src/addons/color/composite/index.ts +9 -0
  51. package/src/addons/color/composite/sourceAtop.ts +42 -0
  52. package/src/addons/color/composite/sourceIn.ts +40 -0
  53. package/src/addons/color/composite/sourceOut.ts +40 -0
  54. package/src/addons/color/composite/sourceOver.ts +40 -0
  55. package/src/addons/color/palette/macbeth.ts +31 -33
  56. package/src/addons/draw/arrows.ts +34 -48
  57. package/src/addons/draw/axis.ts +24 -42
  58. package/src/addons/draw/bridge.ts +4 -4
  59. package/src/addons/draw/char.ts +235 -18
  60. package/src/addons/draw/circle.ts +22 -1
  61. package/src/addons/draw/colorChecker.ts +42 -0
  62. package/src/addons/draw/colorPicker.ts +66 -0
  63. package/src/addons/draw/digits.ts +334 -0
  64. package/src/addons/draw/index.ts +4 -0
  65. package/src/addons/draw/matrix.ts +26 -0
  66. package/src/addons/draw/point.ts +24 -11
  67. package/src/addons/geometry/triangle/closestPoint.ts +7 -7
  68. package/src/addons/index.ts +3 -0
  69. package/src/addons/math/const.ts +4 -4
  70. package/src/addons/math/mod289.ts +1 -6
  71. package/src/addons/math/powFast.ts +4 -10
  72. package/src/addons/math/quartic.ts +6 -11
  73. package/src/addons/math/quat/quatLerp.ts +3 -3
  74. package/src/addons/math/quintic.ts +7 -12
  75. package/src/addons/math/rotate2d.ts +1 -6
  76. package/src/addons/math/rotate3d.ts +4 -10
  77. package/src/addons/math/rotate3dX.ts +3 -12
  78. package/src/addons/math/rotate3dY.ts +3 -12
  79. package/src/addons/math/rotate3dZ.ts +3 -12
  80. package/src/addons/math/rotate4d.ts +4 -10
  81. package/src/addons/math/rotate4dX.ts +3 -13
  82. package/src/addons/math/rotate4dY.ts +1 -6
  83. package/src/addons/math/rotate4dZ.ts +3 -13
  84. package/src/addons/math/scale2d.ts +16 -32
  85. package/src/addons/math/toMat3.ts +1 -6
  86. package/src/addons/math/toMat4.ts +1 -6
  87. package/src/addons/sdf/arrowSDF.ts +61 -0
  88. package/src/addons/sdf/boxFrameSDF.ts +31 -0
  89. package/src/addons/sdf/boxSDF.ts +4 -6
  90. package/src/addons/sdf/capsuleSDF.ts +17 -0
  91. package/src/addons/sdf/coneSDF.ts +60 -0
  92. package/src/addons/sdf/crossSDF.ts +4 -7
  93. package/src/addons/sdf/cubeSDF.ts +13 -0
  94. package/src/addons/sdf/cylinderSDF.ts +65 -0
  95. package/src/addons/sdf/dodecahedronSDF.ts +32 -0
  96. package/src/addons/sdf/ellipsoidSDF.ts +14 -0
  97. package/src/addons/sdf/flowerSDF.ts +16 -0
  98. package/src/addons/sdf/gearSDF.ts +22 -0
  99. package/src/addons/sdf/heartSDF.ts +17 -0
  100. package/src/addons/sdf/hexPrismSDF.ts +15 -0
  101. package/src/addons/sdf/hexSDF.ts +8 -15
  102. package/src/addons/sdf/icosahedronSDF.ts +23 -0
  103. package/src/addons/sdf/index.ts +41 -0
  104. package/src/addons/sdf/juliaSDF.ts +39 -0
  105. package/src/addons/sdf/kochSDF.ts +49 -0
  106. package/src/addons/sdf/linkSDF.ts +15 -0
  107. package/src/addons/sdf/mandelbulbSDF.ts +41 -0
  108. package/src/addons/sdf/octahedronSDF.ts +30 -0
  109. package/src/addons/sdf/octogonPrismSDF.ts +19 -0
  110. package/src/addons/sdf/opElongate.ts +35 -0
  111. package/src/addons/sdf/opExtrude.ts +14 -0
  112. package/src/addons/sdf/opIntersection.ts +25 -0
  113. package/src/addons/sdf/opOnion.ts +12 -0
  114. package/src/addons/sdf/opRepeat.ts +49 -0
  115. package/src/addons/sdf/opRevolve.ts +12 -0
  116. package/src/addons/sdf/opRound.ts +12 -0
  117. package/src/addons/sdf/opSubtraction.ts +50 -0
  118. package/src/addons/sdf/opUnion.ts +39 -0
  119. package/src/addons/sdf/planeSDF.ts +21 -0
  120. package/src/addons/sdf/polySDF.ts +32 -0
  121. package/src/addons/sdf/pyramidSDF.ts +29 -0
  122. package/src/addons/sdf/raysSDF.ts +14 -0
  123. package/src/addons/sdf/rhombSDF.ts +10 -0
  124. package/src/addons/sdf/spiralSDF.ts +15 -0
  125. package/src/addons/sdf/starSDF.ts +47 -0
  126. package/src/addons/sdf/superShapeSDF.ts +73 -0
  127. package/src/addons/sdf/tetrahedronSDF.ts +21 -0
  128. package/src/addons/sdf/torusSDF.ts +27 -0
  129. package/src/addons/sdf/triPrismSDF.ts +13 -0
  130. package/src/addons/sdf/triSDF.ts +19 -11
  131. package/src/addons/sdf/vesicaSDF.ts +23 -0
  132. package/src/addons/space/bracketing.ts +1 -2
  133. package/src/addons/space/kaleidoscope.ts +1 -2
  134. package/src/addons/space/scale.ts +42 -7
  135. package/src/addons/space/windmillTile.ts +2 -1
  136. package/src/node/create.ts +2 -3
  137. package/src/node/utils/index.ts +2 -2
  138. package/src/utils/webgl.ts +2 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glre",
3
- "version": "0.41.0",
3
+ "version": "0.42.0",
4
4
  "author": "tseijp",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -0,0 +1,35 @@
1
+ import { Fn, Float, Vec3, min, vec3 } from '../../../node'
2
+
3
+ export const blendAdd = Fn(([base, blend]: [Float, Float]): Float => {
4
+ return min(base.add(blend), 1)
5
+ }).setLayout({
6
+ name: 'blendAdd',
7
+ type: 'float',
8
+ inputs: [
9
+ { name: 'base', type: 'float' },
10
+ { name: 'blend', type: 'float' },
11
+ ],
12
+ })
13
+
14
+ export const blendAddVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
15
+ return min(base.add(blend), vec3(1))
16
+ }).setLayout({
17
+ name: 'blendAddVec3',
18
+ type: 'vec3',
19
+ inputs: [
20
+ { name: 'base', type: 'vec3' },
21
+ { name: 'blend', type: 'vec3' },
22
+ ],
23
+ })
24
+
25
+ export const blendAddVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
26
+ return blendAddVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
27
+ }).setLayout({
28
+ name: 'blendAddVec3Opacity',
29
+ type: 'vec3',
30
+ inputs: [
31
+ { name: 'base', type: 'vec3' },
32
+ { name: 'blend', type: 'vec3' },
33
+ { name: 'opacity', type: 'float' },
34
+ ],
35
+ })
@@ -0,0 +1,35 @@
1
+ import { Fn, Float, Vec3 } from '../../../node'
2
+
3
+ export const blendAverage = Fn(([base, blend]: [Float, Float]): Float => {
4
+ return base.add(blend).mul(0.5)
5
+ }).setLayout({
6
+ name: 'blendAverage',
7
+ type: 'float',
8
+ inputs: [
9
+ { name: 'base', type: 'float' },
10
+ { name: 'blend', type: 'float' },
11
+ ],
12
+ })
13
+
14
+ export const blendAverageVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
15
+ return base.add(blend).mul(0.5)
16
+ }).setLayout({
17
+ name: 'blendAverageVec3',
18
+ type: 'vec3',
19
+ inputs: [
20
+ { name: 'base', type: 'vec3' },
21
+ { name: 'blend', type: 'vec3' },
22
+ ],
23
+ })
24
+
25
+ export const blendAverageVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
26
+ return blendAverageVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
27
+ }).setLayout({
28
+ name: 'blendAverageVec3Opacity',
29
+ type: 'vec3',
30
+ inputs: [
31
+ { name: 'base', type: 'vec3' },
32
+ { name: 'blend', type: 'vec3' },
33
+ { name: 'opacity', type: 'float' },
34
+ ],
35
+ })
@@ -0,0 +1,28 @@
1
+ import { Fn, Float, Vec3, vec3 } from '../../../node'
2
+ import { rgb2hsv } from '../space/rgb2hsv'
3
+ import { hsv2rgb } from '../space/hsv2rgb'
4
+
5
+ export const blendColor = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
6
+ const baseHSV = rgb2hsv(base).toVar('baseHSV')
7
+ const blendHSV = rgb2hsv(blend).toVar('blendHSV')
8
+ return hsv2rgb(vec3(blendHSV.x, blendHSV.y, baseHSV.z))
9
+ }).setLayout({
10
+ name: 'blendColor',
11
+ type: 'vec3',
12
+ inputs: [
13
+ { name: 'base', type: 'vec3' },
14
+ { name: 'blend', type: 'vec3' },
15
+ ],
16
+ })
17
+
18
+ export const blendColorOpacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
19
+ return blendColor(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
20
+ }).setLayout({
21
+ name: 'blendColorOpacity',
22
+ type: 'vec3',
23
+ inputs: [
24
+ { name: 'base', type: 'vec3' },
25
+ { name: 'blend', type: 'vec3' },
26
+ { name: 'opacity', type: 'float' },
27
+ ],
28
+ })
@@ -0,0 +1,35 @@
1
+ import { Fn, Float, Vec3, vec3, max, select } from '../../../node'
2
+
3
+ export const blendColorBurn = Fn(([base, blend]: [Float, Float]): Float => {
4
+ return select(blend, max(base.div(blend.oneMinus()).oneMinus(), 0), blend.equal(0))
5
+ }).setLayout({
6
+ name: 'blendColorBurn',
7
+ type: 'float',
8
+ inputs: [
9
+ { name: 'base', type: 'float' },
10
+ { name: 'blend', type: 'float' },
11
+ ],
12
+ })
13
+
14
+ export const blendColorBurnVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
15
+ return vec3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b))
16
+ }).setLayout({
17
+ name: 'blendColorBurnVec3',
18
+ type: 'vec3',
19
+ inputs: [
20
+ { name: 'base', type: 'vec3' },
21
+ { name: 'blend', type: 'vec3' },
22
+ ],
23
+ })
24
+
25
+ export const blendColorBurnVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
26
+ return blendColorBurnVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
27
+ }).setLayout({
28
+ name: 'blendColorBurnVec3Opacity',
29
+ type: 'vec3',
30
+ inputs: [
31
+ { name: 'base', type: 'vec3' },
32
+ { name: 'blend', type: 'vec3' },
33
+ { name: 'opacity', type: 'float' },
34
+ ],
35
+ })
@@ -0,0 +1,39 @@
1
+ import { Fn, Float, Vec3, vec3, min, select } from '../../../node'
2
+
3
+ export const blendColorDodge = Fn(([base, blend]: [Float, Float]): Float => {
4
+ return select(blend, min(base.div(blend.oneMinus()), 1), blend.equal(1))
5
+ }).setLayout({
6
+ name: 'blendColorDodge',
7
+ type: 'float',
8
+ inputs: [
9
+ { name: 'base', type: 'float' },
10
+ { name: 'blend', type: 'float' },
11
+ ],
12
+ })
13
+
14
+ export const blendColorDodgeVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
15
+ return vec3(
16
+ blendColorDodge(base.r, blend.r),
17
+ blendColorDodge(base.g, blend.g),
18
+ blendColorDodge(base.b, blend.b)
19
+ )
20
+ }).setLayout({
21
+ name: 'blendColorDodgeVec3',
22
+ type: 'vec3',
23
+ inputs: [
24
+ { name: 'base', type: 'vec3' },
25
+ { name: 'blend', type: 'vec3' },
26
+ ],
27
+ })
28
+
29
+ export const blendColorDodgeVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
30
+ return blendColorDodgeVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
31
+ }).setLayout({
32
+ name: 'blendColorDodgeVec3Opacity',
33
+ type: 'vec3',
34
+ inputs: [
35
+ { name: 'base', type: 'vec3' },
36
+ { name: 'blend', type: 'vec3' },
37
+ { name: 'opacity', type: 'float' },
38
+ ],
39
+ })
@@ -0,0 +1,35 @@
1
+ import { Fn, Float, Vec3, vec3, min } from '../../../node'
2
+
3
+ export const blendDarken = Fn(([base, blend]: [Float, Float]): Float => {
4
+ return min(blend, base)
5
+ }).setLayout({
6
+ name: 'blendDarken',
7
+ type: 'float',
8
+ inputs: [
9
+ { name: 'base', type: 'float' },
10
+ { name: 'blend', type: 'float' },
11
+ ],
12
+ })
13
+
14
+ export const blendDarkenVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
15
+ return vec3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b))
16
+ }).setLayout({
17
+ name: 'blendDarkenVec3',
18
+ type: 'vec3',
19
+ inputs: [
20
+ { name: 'base', type: 'vec3' },
21
+ { name: 'blend', type: 'vec3' },
22
+ ],
23
+ })
24
+
25
+ export const blendDarkenVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
26
+ return blendDarkenVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
27
+ }).setLayout({
28
+ name: 'blendDarkenVec3Opacity',
29
+ type: 'vec3',
30
+ inputs: [
31
+ { name: 'base', type: 'vec3' },
32
+ { name: 'blend', type: 'vec3' },
33
+ { name: 'opacity', type: 'float' },
34
+ ],
35
+ })
@@ -0,0 +1,35 @@
1
+ import { Fn, Float, Vec3, abs } from '../../../node'
2
+
3
+ export const blendDifference = Fn(([base, blend]: [Float, Float]): Float => {
4
+ return abs(base.sub(blend))
5
+ }).setLayout({
6
+ name: 'blendDifference',
7
+ type: 'float',
8
+ inputs: [
9
+ { name: 'base', type: 'float' },
10
+ { name: 'blend', type: 'float' },
11
+ ],
12
+ })
13
+
14
+ export const blendDifferenceVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
15
+ return abs(base.sub(blend))
16
+ }).setLayout({
17
+ name: 'blendDifferenceVec3',
18
+ type: 'vec3',
19
+ inputs: [
20
+ { name: 'base', type: 'vec3' },
21
+ { name: 'blend', type: 'vec3' },
22
+ ],
23
+ })
24
+
25
+ export const blendDifferenceVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
26
+ return blendDifferenceVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
27
+ }).setLayout({
28
+ name: 'blendDifferenceVec3Opacity',
29
+ type: 'vec3',
30
+ inputs: [
31
+ { name: 'base', type: 'vec3' },
32
+ { name: 'blend', type: 'vec3' },
33
+ { name: 'opacity', type: 'float' },
34
+ ],
35
+ })
@@ -0,0 +1,35 @@
1
+ import { Fn, Float, Vec3 } from '../../../node'
2
+
3
+ export const blendExclusion = Fn(([base, blend]: [Float, Float]): Float => {
4
+ return base.add(blend).sub(base.mul(blend).mul(2))
5
+ }).setLayout({
6
+ name: 'blendExclusion',
7
+ type: 'float',
8
+ inputs: [
9
+ { name: 'base', type: 'float' },
10
+ { name: 'blend', type: 'float' }
11
+ ]
12
+ })
13
+
14
+ export const blendExclusionVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
15
+ return base.add(blend).sub(base.mul(blend).mul(2))
16
+ }).setLayout({
17
+ name: 'blendExclusionVec3',
18
+ type: 'vec3',
19
+ inputs: [
20
+ { name: 'base', type: 'vec3' },
21
+ { name: 'blend', type: 'vec3' }
22
+ ]
23
+ })
24
+
25
+ export const blendExclusionVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
26
+ return blendExclusionVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
27
+ }).setLayout({
28
+ name: 'blendExclusionVec3Opacity',
29
+ type: 'vec3',
30
+ inputs: [
31
+ { name: 'base', type: 'vec3' },
32
+ { name: 'blend', type: 'vec3' },
33
+ { name: 'opacity', type: 'float' }
34
+ ]
35
+ })
@@ -0,0 +1,36 @@
1
+ import { Fn, Float, Vec3 } from '../../../node'
2
+ import { blendReflect, blendReflectVec3 } from './reflect'
3
+
4
+ export const blendGlow = Fn(([base, blend]: [Float, Float]): Float => {
5
+ return blendReflect(blend, base)
6
+ }).setLayout({
7
+ name: 'blendGlow',
8
+ type: 'float',
9
+ inputs: [
10
+ { name: 'base', type: 'float' },
11
+ { name: 'blend', type: 'float' },
12
+ ],
13
+ })
14
+
15
+ export const blendGlowVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
16
+ return blendReflectVec3(blend, base)
17
+ }).setLayout({
18
+ name: 'blendGlowVec3',
19
+ type: 'vec3',
20
+ inputs: [
21
+ { name: 'base', type: 'vec3' },
22
+ { name: 'blend', type: 'vec3' },
23
+ ],
24
+ })
25
+
26
+ export const blendGlowVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
27
+ return blendGlowVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
28
+ }).setLayout({
29
+ name: 'blendGlowVec3Opacity',
30
+ type: 'vec3',
31
+ inputs: [
32
+ { name: 'base', type: 'vec3' },
33
+ { name: 'blend', type: 'vec3' },
34
+ { name: 'opacity', type: 'float' },
35
+ ],
36
+ })
@@ -0,0 +1,36 @@
1
+ import { Fn, Float, Vec3 } from '../../../node'
2
+ import { blendOverlay, blendOverlayVec3 } from './overlay'
3
+
4
+ export const blendHardLight = Fn(([base, blend]: [Float, Float]): Float => {
5
+ return blendOverlay(blend, base)
6
+ }).setLayout({
7
+ name: 'blendHardLight',
8
+ type: 'float',
9
+ inputs: [
10
+ { name: 'base', type: 'float' },
11
+ { name: 'blend', type: 'float' },
12
+ ],
13
+ })
14
+
15
+ export const blendHardLightVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
16
+ return blendOverlayVec3(blend, base)
17
+ }).setLayout({
18
+ name: 'blendHardLightVec3',
19
+ type: 'vec3',
20
+ inputs: [
21
+ { name: 'base', type: 'vec3' },
22
+ { name: 'blend', type: 'vec3' },
23
+ ],
24
+ })
25
+
26
+ export const blendHardLightVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
27
+ return blendHardLightVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
28
+ }).setLayout({
29
+ name: 'blendHardLightVec3Opacity',
30
+ type: 'vec3',
31
+ inputs: [
32
+ { name: 'base', type: 'vec3' },
33
+ { name: 'blend', type: 'vec3' },
34
+ { name: 'opacity', type: 'float' },
35
+ ],
36
+ })
@@ -0,0 +1,39 @@
1
+ import { Fn, Float, Vec3, vec3, If, float } from '../../../node'
2
+ import { blendVividLight } from './vividLight'
3
+
4
+ export const blendHardMix = Fn(([base, blend]: [Float, Float]): Float => {
5
+ If(blendVividLight(base, blend).lessThan(0.5), () => {
6
+ return float(0)
7
+ })
8
+ return float(1)
9
+ }).setLayout({
10
+ name: 'blendHardMix',
11
+ type: 'float',
12
+ inputs: [
13
+ { name: 'base', type: 'float' },
14
+ { name: 'blend', type: 'float' },
15
+ ],
16
+ })
17
+
18
+ export const blendHardMixVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
19
+ return vec3(blendHardMix(base.r, blend.r), blendHardMix(base.g, blend.g), blendHardMix(base.b, blend.b))
20
+ }).setLayout({
21
+ name: 'blendHardMixVec3',
22
+ type: 'vec3',
23
+ inputs: [
24
+ { name: 'base', type: 'vec3' },
25
+ { name: 'blend', type: 'vec3' },
26
+ ],
27
+ })
28
+
29
+ export const blendHardMixVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
30
+ return blendHardMixVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
31
+ }).setLayout({
32
+ name: 'blendHardMixVec3Opacity',
33
+ type: 'vec3',
34
+ inputs: [
35
+ { name: 'base', type: 'vec3' },
36
+ { name: 'blend', type: 'vec3' },
37
+ { name: 'opacity', type: 'float' },
38
+ ],
39
+ })
@@ -0,0 +1,29 @@
1
+ import { Fn, Vec3, Float, vec3, clamp } from '../../../node'
2
+ import { rgb2hsv } from '../space/rgb2hsv'
3
+ import { hsv2rgb } from '../space/hsv2rgb'
4
+
5
+ export const blendHue = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
6
+ const baseHSV = rgb2hsv(base)
7
+ const blendHSV = rgb2hsv(blend)
8
+ const result = vec3(blendHSV.x, baseHSV.y, baseHSV.z)
9
+ return hsv2rgb(result)
10
+ }).setLayout({
11
+ name: 'blendHue',
12
+ type: 'vec3',
13
+ inputs: [
14
+ { name: 'base', type: 'vec3' },
15
+ { name: 'blend', type: 'vec3' },
16
+ ],
17
+ })
18
+
19
+ export const blendHueVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
20
+ return blendHue(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
21
+ }).setLayout({
22
+ name: 'blendHueVec3Opacity',
23
+ type: 'vec3',
24
+ inputs: [
25
+ { name: 'base', type: 'vec3' },
26
+ { name: 'blend', type: 'vec3' },
27
+ { name: 'opacity', type: 'float' },
28
+ ],
29
+ })
@@ -0,0 +1,28 @@
1
+ export * from './add'
2
+ export * from './average'
3
+ export * from './color'
4
+ export * from './colorBurn'
5
+ export * from './colorDodge'
6
+ export * from './darken'
7
+ export * from './difference'
8
+ export * from './exclusion'
9
+ export * from './glow'
10
+ export * from './hardLight'
11
+ export * from './hardMix'
12
+ export * from './hue'
13
+ export * from './lighten'
14
+ export * from './linearBurn'
15
+ export * from './luminosity'
16
+ export * from './multiply'
17
+ export * from './linearDodge'
18
+ export * from './linearLight'
19
+ export * from './negation'
20
+ export * from './phoenix'
21
+ export * from './pinLight'
22
+ export * from './vividLight'
23
+ export * from './overlay'
24
+ export * from './reflect'
25
+ export * from './saturation'
26
+ export * from './screen'
27
+ export * from './softLight'
28
+ export * from './subtract'
@@ -0,0 +1,35 @@
1
+ import { Fn, Float, Vec3, vec3, max } from '../../../node'
2
+
3
+ export const blendLighten = Fn(([base, blend]: [Float, Float]): Float => {
4
+ return max(blend, base)
5
+ }).setLayout({
6
+ name: 'blendLighten',
7
+ type: 'float',
8
+ inputs: [
9
+ { name: 'base', type: 'float' },
10
+ { name: 'blend', type: 'float' },
11
+ ],
12
+ })
13
+
14
+ export const blendLightenVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
15
+ return vec3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b))
16
+ }).setLayout({
17
+ name: 'blendLightenVec3',
18
+ type: 'vec3',
19
+ inputs: [
20
+ { name: 'base', type: 'vec3' },
21
+ { name: 'blend', type: 'vec3' },
22
+ ],
23
+ })
24
+
25
+ export const blendLightenVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
26
+ return blendLightenVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
27
+ }).setLayout({
28
+ name: 'blendLightenVec3Opacity',
29
+ type: 'vec3',
30
+ inputs: [
31
+ { name: 'base', type: 'vec3' },
32
+ { name: 'blend', type: 'vec3' },
33
+ { name: 'opacity', type: 'float' },
34
+ ],
35
+ })
@@ -0,0 +1,39 @@
1
+ import { Fn, Float, Vec3, vec3, max } from '../../../node'
2
+
3
+ export const blendLinearBurn = Fn(([base, blend]: [Float, Float]): Float => {
4
+ return max(base.add(blend).sub(1), 0)
5
+ }).setLayout({
6
+ name: 'blendLinearBurn',
7
+ type: 'float',
8
+ inputs: [
9
+ { name: 'base', type: 'float' },
10
+ { name: 'blend', type: 'float' },
11
+ ],
12
+ })
13
+
14
+ export const blendLinearBurnVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
15
+ return vec3(
16
+ blendLinearBurn(base.r, blend.r),
17
+ blendLinearBurn(base.g, blend.g),
18
+ blendLinearBurn(base.b, blend.b)
19
+ )
20
+ }).setLayout({
21
+ name: 'blendLinearBurnVec3',
22
+ type: 'vec3',
23
+ inputs: [
24
+ { name: 'base', type: 'vec3' },
25
+ { name: 'blend', type: 'vec3' },
26
+ ],
27
+ })
28
+
29
+ export const blendLinearBurnVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
30
+ return blendLinearBurnVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
31
+ }).setLayout({
32
+ name: 'blendLinearBurnVec3Opacity',
33
+ type: 'vec3',
34
+ inputs: [
35
+ { name: 'base', type: 'vec3' },
36
+ { name: 'blend', type: 'vec3' },
37
+ { name: 'opacity', type: 'float' },
38
+ ],
39
+ })
@@ -0,0 +1,39 @@
1
+ import { Fn, Float, Vec3, vec3, min } from '../../../node'
2
+
3
+ export const blendLinearDodge = Fn(([base, blend]: [Float, Float]): Float => {
4
+ return min(base.add(blend), 1)
5
+ }).setLayout({
6
+ name: 'blendLinearDodge',
7
+ type: 'float',
8
+ inputs: [
9
+ { name: 'base', type: 'float' },
10
+ { name: 'blend', type: 'float' },
11
+ ],
12
+ })
13
+
14
+ export const blendLinearDodgeVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
15
+ return vec3(
16
+ blendLinearDodge(base.r, blend.r),
17
+ blendLinearDodge(base.g, blend.g),
18
+ blendLinearDodge(base.b, blend.b)
19
+ )
20
+ }).setLayout({
21
+ name: 'blendLinearDodgeVec3',
22
+ type: 'vec3',
23
+ inputs: [
24
+ { name: 'base', type: 'vec3' },
25
+ { name: 'blend', type: 'vec3' },
26
+ ],
27
+ })
28
+
29
+ export const blendLinearDodgeVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
30
+ return blendLinearDodgeVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
31
+ }).setLayout({
32
+ name: 'blendLinearDodgeVec3Opacity',
33
+ type: 'vec3',
34
+ inputs: [
35
+ { name: 'base', type: 'vec3' },
36
+ { name: 'blend', type: 'vec3' },
37
+ { name: 'opacity', type: 'float' },
38
+ ],
39
+ })
@@ -0,0 +1,44 @@
1
+ import { Fn, Float, Vec3, vec3, If } from '../../../node'
2
+ import { blendLinearBurn } from './linearBurn'
3
+ import { blendLinearDodge } from './linearDodge'
4
+
5
+ export const blendLinearLight = Fn(([base, blend]: [Float, Float]): Float => {
6
+ If(blend.lessThan(0.5), () => {
7
+ return blendLinearBurn(base, blend.mul(2))
8
+ })
9
+ return blendLinearDodge(base, blend.sub(0.5).mul(2))
10
+ }).setLayout({
11
+ name: 'blendLinearLight',
12
+ type: 'float',
13
+ inputs: [
14
+ { name: 'base', type: 'float' },
15
+ { name: 'blend', type: 'float' },
16
+ ],
17
+ })
18
+
19
+ export const blendLinearLightVec3 = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
20
+ return vec3(
21
+ blendLinearLight(base.r, blend.r),
22
+ blendLinearLight(base.g, blend.g),
23
+ blendLinearLight(base.b, blend.b)
24
+ )
25
+ }).setLayout({
26
+ name: 'blendLinearLightVec3',
27
+ type: 'vec3',
28
+ inputs: [
29
+ { name: 'base', type: 'vec3' },
30
+ { name: 'blend', type: 'vec3' },
31
+ ],
32
+ })
33
+
34
+ export const blendLinearLightVec3Opacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
35
+ return blendLinearLightVec3(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
36
+ }).setLayout({
37
+ name: 'blendLinearLightVec3Opacity',
38
+ type: 'vec3',
39
+ inputs: [
40
+ { name: 'base', type: 'vec3' },
41
+ { name: 'blend', type: 'vec3' },
42
+ { name: 'opacity', type: 'float' },
43
+ ],
44
+ })
@@ -0,0 +1,28 @@
1
+ import { Fn, Vec3, Float, vec3 } from '../../../node'
2
+ import { rgb2hsv } from '../space/rgb2hsv'
3
+ import { hsv2rgb } from '../space/hsv2rgb'
4
+
5
+ export const blendLuminosity = Fn(([base, blend]: [Vec3, Vec3]): Vec3 => {
6
+ const baseHSV = rgb2hsv(base)
7
+ const blendHSV = rgb2hsv(blend)
8
+ return hsv2rgb(vec3(baseHSV.x, baseHSV.y, blendHSV.z))
9
+ }).setLayout({
10
+ name: 'blendLuminosity',
11
+ type: 'vec3',
12
+ inputs: [
13
+ { name: 'base', type: 'vec3' },
14
+ { name: 'blend', type: 'vec3' },
15
+ ],
16
+ })
17
+
18
+ export const blendLuminosityOpacity = Fn(([base, blend, opacity]: [Vec3, Vec3, Float]): Vec3 => {
19
+ return blendLuminosity(base, blend).mul(opacity).add(base.mul(opacity.oneMinus()))
20
+ }).setLayout({
21
+ name: 'blendLuminosityOpacity',
22
+ type: 'vec3',
23
+ inputs: [
24
+ { name: 'base', type: 'vec3' },
25
+ { name: 'blend', type: 'vec3' },
26
+ { name: 'opacity', type: 'float' },
27
+ ],
28
+ })