updateFragmentShader static method

void updateFragmentShader({
  1. required FragmentShader shader,
  2. required Color color,
  3. required double alpha,
  4. required double rippleScale,
  5. required double rippleAlpha,
  6. required Offset center,
  7. required double radius,
  8. required double blurRatio,
  9. required Size size,
})

implementation from the following classes about InkSparkle.

Implementation

static void updateFragmentShader({
  required ui.FragmentShader shader,
  required Color color,
  required double alpha,
  required double rippleScale,
  required double rippleAlpha,
  required Offset center,
  required double radius,
  required double blurRatio,
  required Size size,
}) {
  final double turbulenceSeed = math.Random().nextDouble() * 1000.0;
  const double turbulenceScale = 1.5;
  final double turbulencePhase = turbulenceSeed + rippleScale;
  final double noisePhase = turbulencePhase;
  final double rotation1 = turbulencePhase * _rotateRight + 1.7 * math.pi;
  final double rotation2 = turbulencePhase * _rotateLeft + 2.0 * math.pi;
  final double rotation3 = turbulencePhase * _rotateRight + 2.75 * math.pi;

  shader
    // uColor
    ..setFloat(0, color.r)
    ..setFloat(1, color.g)
    ..setFloat(2, color.b)
    ..setFloat(3, color.a)
    // Composite 1 (u_alpha, u_sparkle_alpha, u_blur, u_radius_scale)
    ..setFloat(4, rippleAlpha)
    ..setFloat(5, alpha)
    ..setFloat(6, blurRatio)
    ..setFloat(7, rippleScale)
    // uCenter
    ..setFloat(8, center.dx)
    ..setFloat(9, center.dy)
    // uMaxRadius
    ..setFloat(10, radius)
    // uResolutionScale
    ..setFloat(11, 1.0 / size.width)
    ..setFloat(12, 1.0 / size.height)
    // uNoiseScale
    ..setFloat(13, _noiseDensity / size.width)
    ..setFloat(14, _noiseDensity / size.height)
    // uNoisePhase
    ..setFloat(15, noisePhase / 1000.0)
    // uCircle1
    ..setFloat(16, turbulenceScale * 0.5 + (turbulencePhase * 0.01 * math.cos(turbulenceScale * 0.55)))
    ..setFloat(17, turbulenceScale * 0.5 + (turbulencePhase * 0.01 * math.sin(turbulenceScale * 0.55)))
    // uCircle2
    ..setFloat(18, turbulenceScale * 0.2 + (turbulencePhase * -0.0066 * math.cos(turbulenceScale * 0.45)))
    ..setFloat(19, turbulenceScale * 0.2 + (turbulencePhase * -0.0066 * math.sin(turbulenceScale * 0.45)))
    // uCircle3
    ..setFloat(20, turbulenceScale + (turbulencePhase * -0.0066 * math.cos(turbulenceScale * 0.35)))
    ..setFloat(21, turbulenceScale + (turbulencePhase * -0.0066 * math.sin(turbulenceScale * 0.35)))
    // uRotation1
    ..setFloat(22, math.cos(rotation1))
    ..setFloat(23, math.sin(rotation1))
    // uRotation2
    ..setFloat(24, math.cos(rotation2))
    ..setFloat(25, math.sin(rotation2))
    // uRotation3
    ..setFloat(26, math.cos(rotation3))
    ..setFloat(27, math.sin(rotation3));
}