1
0
mirror of https://github.com/flutter/samples.git synced 2026-07-17 22:42:53 +00:00

Tidyup varfont_shader_puzzle (#1629)

* Tidyup `varfont_shader_puzzle`

* Add a rebuild script and a test

* Simplify fragment shaders

* Drop web

* Enable `beta` CI

* make it `beta` inclusive

* Pull out the program loading code
This commit is contained in:
Brett Morgan
2023-02-07 13:59:06 +10:00
committed by GitHub
parent 44f2356073
commit 54950c4284
52 changed files with 244 additions and 702 deletions

View File

@@ -7,24 +7,30 @@ import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
enum Shader {
nothing('nothing'),
bwSplit('bw_split'),
colorSplit('color_split'),
rowOffset('row_offset'),
wavyCirc('wavy_circ'),
wavy('wavy'),
wavy2('wavy2');
const Shader(this.name);
final String name;
Future<ui.FragmentProgram> get program =>
ui.FragmentProgram.fromAsset('shaders/$name.frag');
}
class FragmentShaded extends StatefulWidget {
final Widget child;
final String shaderName;
final Shader shader;
final int shaderDuration;
static const int dampenDuration = 1000;
static final Map<String, ui.FragmentProgram> fragmentPrograms = {};
static const List<String> fragmentProgramNames = [
'nothing',
'bw_split',
'color_split',
'row_offset',
'wavy_circ',
'wavy',
'wavy2'
];
static final Map<Shader, ui.FragmentProgram> _programCache = {};
const FragmentShaded({
required this.shaderName,
required this.shader,
required this.shaderDuration,
required this.child,
super.key,
@@ -63,15 +69,16 @@ class FragmentShadedState extends State<FragmentShaded>
}
Future<void> initializeFragmentProgramsAndBuilder() async {
if (FragmentShaded.fragmentPrograms.isEmpty) {
for (String s in FragmentShaded.fragmentProgramNames) {
FragmentShaded.fragmentPrograms[s] =
await ui.FragmentProgram.fromAsset('shaders/$s.frag');
if (FragmentShaded._programCache.isEmpty) {
for (final shader in Shader.values) {
FragmentShaded._programCache[shader] = await shader.program;
}
}
builder = AnimatingSamplerBuilder(_controller, _dampenAnimation,
FragmentShaded.fragmentPrograms[widget.shaderName]!.fragmentShader());
setState(() {});
setState(() {
builder = AnimatingSamplerBuilder(_controller, _dampenAnimation,
FragmentShaded._programCache[widget.shader]!.fragmentShader());
});
}
@override
@@ -83,7 +90,7 @@ class FragmentShadedState extends State<FragmentShaded>
@override
Widget build(BuildContext context) {
if (null == FragmentShaded.fragmentPrograms[widget.shaderName]) {
if (null == FragmentShaded._programCache[widget.shader]) {
setState(() {});
return const SizedBox(
width: 0,