run method

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

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

Implementation

@override
Vector4? run(Float32List v, ShaderBindings bindings, FragmentContext c) {
  final u = v[0];
  final w = v[1];
  final inputs = <String, List<double>>{
    'uv': <double>[u, w],
    if (program.inputsUsed.contains('sceneDepth'))
      'sceneDepth': <double>[
        switch (bindings.textures['surface_texture']) {
          null => _nothingBehind,
          final surface => switch (surface.sample(u, w).w) {
            final stored when stored > 0.0 => stored,
            _ => _nothingBehind,
          },
        },
      ],
  };
  final result = evaluateMaterial(
    program,
    MaterialSurfaceValues(
      inputs: inputs,
      uniforms: <String, List<double>>{
        for (final parameter in program.parameters)
          if (parameter.uniform)
            parameter.name: ?bindings.read(parameter.block!, parameter.name),
      },
      sample: (slot, u, w) {
        final texture = bindings.textures[slot.bindingName];
        if (texture == null) return const <double>[0, 0, 0, 0];
        final texel = texture.sample(u, w);
        return <double>[texel.x, texel.y, texel.z, texel.w];
      },
    ),
  );
  return Vector4(result[0], result[1], result[2], result[3]);
}