feat: Add GLSL effects toggle and enhance shader for CRT-like post-processing

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-20 11:03:33 +01:00
parent cbbcd3223a
commit abca679a99
4 changed files with 90 additions and 5 deletions

View File

@@ -11,12 +11,16 @@ import 'package:wolf_3d_renderer/wolf_3d_asset_painter.dart';
/// Displays software-rendered frames through a GLSL post-processing pass.
class WolfGlslRenderer extends BaseWolfRenderer {
/// Whether CRT-like post effects are enabled in the shader pass.
final bool effectsEnabled;
/// Callback when shader loading fails and software fallback should be used.
final VoidCallback? onUnavailable;
/// Creates a GLSL renderer bound to [engine].
const WolfGlslRenderer({
required super.engine,
this.effectsEnabled = false,
super.onKeyEvent,
this.onUnavailable,
super.key,
@@ -113,6 +117,8 @@ class _WolfGlslRendererState extends BaseWolfRendererState<WolfGlslRenderer> {
painter: _GlslFramePainter(
frame: _renderedFrame!,
shader: _shader!,
effectsEnabled: widget.effectsEnabled,
elapsedSeconds: widget.engine.timeAliveMs / 1000.0,
),
child: const SizedBox.expand(),
),
@@ -152,10 +158,14 @@ class _WolfGlslRendererState extends BaseWolfRendererState<WolfGlslRenderer> {
class _GlslFramePainter extends CustomPainter {
final ui.Image frame;
final ui.FragmentShader shader;
final bool effectsEnabled;
final double elapsedSeconds;
_GlslFramePainter({
required this.frame,
required this.shader,
required this.effectsEnabled,
required this.elapsedSeconds,
});
@override
@@ -167,6 +177,8 @@ class _GlslFramePainter extends CustomPainter {
..setFloat(1, size.height)
..setFloat(2, texelX)
..setFloat(3, texelY)
..setFloat(4, effectsEnabled ? 1.0 : 0.0)
..setFloat(5, elapsedSeconds)
..setImageSampler(0, frame);
final Paint paint = Paint()
@@ -178,6 +190,9 @@ class _GlslFramePainter extends CustomPainter {
@override
bool shouldRepaint(covariant _GlslFramePainter oldDelegate) {
return oldDelegate.frame != frame || oldDelegate.shader != shader;
return oldDelegate.frame != frame ||
oldDelegate.shader != shader ||
oldDelegate.effectsEnabled != effectsEnabled ||
oldDelegate.elapsedSeconds != elapsedSeconds;
}
}