run method

  1. @override
Vector4? run(
  1. Float32List v,
  2. ShaderBindings bindings,
  3. FragmentContext c
)
override

Returns linear RGBA for attachment zero. Null discards the fragment.

Implementation

@override
Vector4? run(Float32List v, ShaderBindings bindings, FragmentContext c) {
  final mask = bindings.vec4('PredrawInfo', 'mask', Vector4(-1, 1, 1, 0));
  final cutoff = mask.x;
  double alpha() {
    final texture = bindings.textures['base_color_texture'];
    if (texture == null) return mask.y * v[kVColour + 3];
    final uv = uvFootprint(c, bias: mask.w);
    final texel = texture.sample(
      v[kVUv],
      v[kVUv + 1],
      du: uv.du,
      dv: uv.dv,
      dudx: uv.dudx,
      dvdx: uv.dvdx,
      dudy: uv.dudy,
      dvdy: uv.dvdy,
    );
    return texel.w * mask.y * v[kVColour + 3];
  }

  if (cutoff >= 0.0 && cutoff <= 1.0) {
    if (alpha() < cutoff) return null;
  } else if (cutoff < -1.5) {
    final noise = hashedAlphaNoise(
      v[kVWorld],
      v[kVWorld + 1],
      v[kVWorld + 2],
      cutoff,
    );
    if (alpha() < noise) return null;
  }

  final share = mask.z;
  if (share < 1.0) {
    double fract(double x) => x - x.floorToDouble();
    final pattern = fract(
      52.9829189 * fract(c.coord.x * 0.06711056 + c.coord.y * 0.00583715),
    );
    final kept = share >= 0.0 ? pattern < share : pattern >= 1.0 + share;
    if (!kept) return null;
  }
  return Vector4.zero();
}