Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add support for mat4 uniforms #49

Merged
merged 2 commits into from Jul 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 19 additions & 0 deletions packages/umbra/lib/src/generators/dart_shader_generator.dart
Expand Up @@ -57,6 +57,25 @@ class DartShaderGenerator extends Generator {
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;
}
}

Expand Down
19 changes: 19 additions & 0 deletions packages/umbra/lib/src/generators/flutter_widget_generator.dart
Expand Up @@ -57,6 +57,25 @@ class FlutterWidgetGenerator extends Generator {
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;
}
}

Expand Down
5 changes: 5 additions & 0 deletions packages/umbra/lib/src/models/uniform.dart
Expand Up @@ -16,6 +16,9 @@ enum UniformType {

/// A sampler2D uniform.
sampler2D,

/// A square float-matrix uniform.
mat4,
}

/// {@template uniform}
Expand All @@ -40,6 +43,8 @@ class Uniform extends Equatable {
return Uniform(name, UniformType.vec4);
case 'sampler2D':
return Uniform(name, UniformType.sampler2D);
case 'mat4':
return Uniform(name, UniformType.mat4);
}
throw Exception('Unsupported uniform type');
}
Expand Down
17 changes: 17 additions & 0 deletions packages/umbra/test/fixtures/dart/with_uniforms
Expand Up @@ -30,6 +30,7 @@ class WithUniforms extends UmbraShader {
required Vector4 color,
required double mixValue,
required Image image,
required Matrix4 matrix,
}) {
return program.shader(
floatUniforms: Float32List.fromList([
Expand All @@ -43,6 +44,22 @@ class WithUniforms extends UmbraShader {
color.z,
color.w,
mixValue,
matrix.storage[0],
matrix.storage[1],
matrix.storage[2],
matrix.storage[3],
matrix.storage[4],
matrix.storage[5],
matrix.storage[6],
matrix.storage[7],
matrix.storage[8],
matrix.storage[9],
matrix.storage[10],
matrix.storage[11],
matrix.storage[12],
matrix.storage[13],
matrix.storage[14],
matrix.storage[15],
resolution.width,
resolution.height,
]),
Expand Down
20 changes: 20 additions & 0 deletions packages/umbra/test/fixtures/flutter/with_uniforms
Expand Up @@ -20,11 +20,13 @@ class WithUniforms extends UmbraWidget {
required Vector4 color,
required double mixValue,
required Image image,
required Matrix4 matrix,
}) : _position = position,
_coordinates = coordinates,
_color = color,
_mixValue = mixValue,
_image = image,
_matrix = matrix,
super();

static Future<FragmentProgram>? _cachedProgram;
Expand All @@ -39,6 +41,8 @@ class WithUniforms extends UmbraWidget {

final Image _image;

final Matrix4 _matrix;

@override
List<double> getFloatUniforms() {
return [
Expand All @@ -52,6 +56,22 @@ class WithUniforms extends UmbraWidget {
_color.z,
_color.w,
_mixValue,
_matrix.storage[0],
_matrix.storage[1],
_matrix.storage[2],
_matrix.storage[3],
_matrix.storage[4],
_matrix.storage[5],
_matrix.storage[6],
_matrix.storage[7],
_matrix.storage[8],
_matrix.storage[9],
_matrix.storage[10],
_matrix.storage[11],
_matrix.storage[12],
_matrix.storage[13],
_matrix.storage[14],
_matrix.storage[15],
];
}

Expand Down
3 changes: 2 additions & 1 deletion packages/umbra/test/fixtures/raw/with_uniforms
Expand Up @@ -9,7 +9,8 @@ layout (location = 1) uniform vec3 coordinates;
layout (location = 2) uniform vec4 color;
layout (location = 3) uniform float mix_value;
layout (location = 4) uniform sampler2D image;
layout (location = 5) uniform vec2 resolution;
layout (location = 5) uniform mat4 matrix;
layout (location = 6) uniform vec2 resolution;

vec4 fragment(in vec2 uv, in vec2 fragCoord) {
return vec4(uv.x, uv.y, 0.0, 1.0);
Expand Down
1 change: 1 addition & 0 deletions packages/umbra/test/helpers/shaders.dart
Expand Up @@ -25,6 +25,7 @@ uniform vec3 coordinates;
uniform vec4 color;
uniform float mix_value;
uniform sampler2D image;
uniform mat4 matrix;

vec4 fragment(in vec2 uv, in vec2 fragCoord) {
return vec4(uv.x, uv.y, 0.0, 1.0);
Expand Down
Expand Up @@ -96,6 +96,7 @@ void main() {
Uniform('color', UniformType.vec4),
Uniform('mix_value', UniformType.float),
Uniform('image', UniformType.sampler2D),
Uniform('matrix', UniformType.mat4),
Uniform('resolution', UniformType.vec2),
]),
);
Expand Down
3 changes: 2 additions & 1 deletion packages/umbra_flutter/lib/umbra_flutter.dart
@@ -1,6 +1,7 @@
library umbra_flutter;

export 'package:vector_math/vector_math_64.dart' show Vector2, Vector3, Vector4;
export 'package:vector_math/vector_math_64.dart'
show Vector2, Vector3, Vector4, Matrix4;

export 'src/umbra_shader.dart';
export 'src/umbra_widget.dart';