generate method

  1. @override
Future<List<int>> generate()
override

Generates the Dart Shader file.

Implementation

@override
Future<List<int>> generate() async {
  final generator = await MasonGenerator.fromBundle(dartShaderFileBundle);

  final parameters = <Map<String, String>>[];
  final arguments = <Map<String, String>>[];
  final samplers = <Map<String, String>>[];

  for (final uniform in specification.uniforms) {
    if (['resolution'].contains(uniform.name.toLowerCase())) {
      continue;
    }
    switch (uniform.type) {
      case UniformType.float:
        parameters.add({'type': 'double', 'name': uniform.name});
        arguments.add({'name': uniform.name, 'extension': ''});
        break;
      case UniformType.vec2:
        parameters.add({'type': 'Vector2', 'name': uniform.name});
        arguments.add({'name': uniform.name, 'extension': '.x'});
        arguments.add({'name': uniform.name, 'extension': '.y'});
        break;
      case UniformType.vec3:
        parameters.add({'type': 'Vector3', 'name': uniform.name});
        arguments.add({'name': uniform.name, 'extension': '.x'});
        arguments.add({'name': uniform.name, 'extension': '.y'});
        arguments.add({'name': uniform.name, 'extension': '.z'});
        break;
      case UniformType.vec4:
        parameters.add({'type': 'Vector4', 'name': uniform.name});
        arguments.add({'name': uniform.name, 'extension': '.x'});
        arguments.add({'name': uniform.name, 'extension': '.y'});
        arguments.add({'name': uniform.name, 'extension': '.z'});
        arguments.add({'name': uniform.name, 'extension': '.w'});
        break;
      case UniformType.sampler2D:
        parameters.add({'type': 'Image', 'name': uniform.name});
        samplers.add({'name': uniform.name});
        break;
      case UniformType.mat4:
        parameters.add({'type': 'Matrix4', 'name': uniform.name});
        arguments.add({'name': uniform.name, 'extension': '.storage[0]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[1]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[2]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[3]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[4]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[5]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[6]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[7]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[8]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[9]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[10]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[11]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[12]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[13]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[14]'});
        arguments.add({'name': uniform.name, 'extension': '.storage[15]'});
        break;
    }
  }

  final vars = <String, dynamic>{
    'name': specification.name,
    'parameters': parameters,
    'hasParameters': parameters.isNotEmpty,
    'arguments': arguments,
    'hasArguments': arguments.isNotEmpty,
    'samplers': samplers,
    'hasSamplers': samplers.isNotEmpty,
    'spirvBytes': "'${base64Encode(_spirvBytes)}'",
  };

  final target = InMemoryGeneratorTarget();
  final files = await generator.generate(
    target,
    vars: vars,
  );

  return target.generatedFiles[files.first.path]!;
}