run method
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();
}