generate method
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]!;
}