refactor: Update renderer mode enum and input key handling for improved clarity

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-20 10:54:10 +01:00
parent e060aef3f1
commit cbbcd3223a
2 changed files with 55 additions and 32 deletions

View File

@@ -10,10 +10,10 @@ import 'package:wolf_3d_renderer/wolf_3d_ascii_renderer.dart';
import 'package:wolf_3d_renderer/wolf_3d_flutter_renderer.dart'; import 'package:wolf_3d_renderer/wolf_3d_flutter_renderer.dart';
import 'package:wolf_3d_renderer/wolf_3d_glsl_renderer.dart'; import 'package:wolf_3d_renderer/wolf_3d_glsl_renderer.dart';
enum _RendererMode { enum RendererMode {
software, software,
ascii, ascii,
glsl, hardware,
} }
/// Launches a [WolfEngine] via [Wolf3d] and exposes renderer/input integrations. /// Launches a [WolfEngine] via [Wolf3d] and exposes renderer/input integrations.
@@ -33,7 +33,7 @@ class GameScreen extends StatefulWidget {
class _GameScreenState extends State<GameScreen> { class _GameScreenState extends State<GameScreen> {
late final WolfEngine _engine; late final WolfEngine _engine;
_RendererMode _rendererMode = _RendererMode.software; RendererMode _rendererMode = RendererMode.hardware;
AsciiTheme _asciiTheme = AsciiThemes.blocks; AsciiTheme _asciiTheme = AsciiThemes.blocks;
@override @override
@@ -109,7 +109,7 @@ class _GameScreenState extends State<GameScreen> {
top: 16, top: 16,
right: 16, right: 16,
child: Text( child: Text(
'TAB: ${_modeLabel(_rendererMode)} T: ${_asciiTheme.name} `: FPS ${_engine.showFpsCounter ? 'On' : 'Off'}', '<${widget.wolf3d.input.rendererToggleKeyLabel}> ${_rendererMode.name}${_rendererMode == RendererMode.ascii ? ' <${widget.wolf3d.input.asciiThemeCycleKeyLabel}> ${_asciiTheme.name}' : ''} <${widget.wolf3d.input.fpsToggleKeyLabel}> FPS ${_engine.showFpsCounter ? 'On' : 'Off'}',
style: TextStyle( style: TextStyle(
color: Colors.white.withValues(alpha: 0.5), color: Colors.white.withValues(alpha: 0.5),
), ),
@@ -128,18 +128,18 @@ class _GameScreenState extends State<GameScreen> {
// Keep all renderers behind the same engine so mode switching does not // Keep all renderers behind the same engine so mode switching does not
// reset level state or audio playback. // reset level state or audio playback.
switch (_rendererMode) { switch (_rendererMode) {
case _RendererMode.software: case RendererMode.software:
return WolfFlutterRenderer( return WolfFlutterRenderer(
engine: _engine, engine: _engine,
onKeyEvent: _handleRendererKeyEvent, onKeyEvent: _handleRendererKeyEvent,
); );
case _RendererMode.ascii: case RendererMode.ascii:
return WolfAsciiRenderer( return WolfAsciiRenderer(
engine: _engine, engine: _engine,
theme: _asciiTheme, theme: _asciiTheme,
onKeyEvent: _handleRendererKeyEvent, onKeyEvent: _handleRendererKeyEvent,
); );
case _RendererMode.glsl: case RendererMode.hardware:
return WolfGlslRenderer( return WolfGlslRenderer(
engine: _engine, engine: _engine,
onKeyEvent: _handleRendererKeyEvent, onKeyEvent: _handleRendererKeyEvent,
@@ -153,44 +153,41 @@ class _GameScreenState extends State<GameScreen> {
return; return;
} }
if (event.logicalKey == LogicalKeyboardKey.tab) { if (event.logicalKey == widget.wolf3d.input.rendererToggleKey) {
setState(_cycleRendererMode); setState(_cycleRendererMode);
return; return;
} }
if (event.logicalKey == LogicalKeyboardKey.backquote || if (event.logicalKey == widget.wolf3d.input.fpsToggleKey) {
event.character == '`') {
setState(_toggleFpsCounter); setState(_toggleFpsCounter);
return; return;
} }
if (event.logicalKey == LogicalKeyboardKey.keyT || if (event.logicalKey == widget.wolf3d.input.asciiThemeCycleKey) {
event.character == 't' ||
event.character == 'T') {
setState(_cycleAsciiTheme); setState(_cycleAsciiTheme);
} }
} }
void _cycleRendererMode() { void _cycleRendererMode() {
switch (_rendererMode) { switch (_rendererMode) {
case _RendererMode.software: case RendererMode.hardware:
_rendererMode = _RendererMode.ascii; _rendererMode = RendererMode.software;
break; break;
case _RendererMode.ascii: case RendererMode.software:
_rendererMode = _RendererMode.glsl; _rendererMode = RendererMode.ascii;
break; break;
case _RendererMode.glsl: case RendererMode.ascii:
_rendererMode = _RendererMode.software; _rendererMode = RendererMode.hardware;
break; break;
} }
} }
void _onGlslUnavailable() { void _onGlslUnavailable() {
if (!mounted || _rendererMode != _RendererMode.glsl) { if (!mounted || _rendererMode != RendererMode.hardware) {
return; return;
} }
setState(() { setState(() {
_rendererMode = _RendererMode.software; _rendererMode = RendererMode.software;
}); });
} }
@@ -201,15 +198,4 @@ class _GameScreenState extends State<GameScreen> {
void _cycleAsciiTheme() { void _cycleAsciiTheme() {
_asciiTheme = AsciiThemes.nextOf(_asciiTheme); _asciiTheme = AsciiThemes.nextOf(_asciiTheme);
} }
String _modeLabel(_RendererMode mode) {
switch (mode) {
case _RendererMode.software:
return 'Software';
case _RendererMode.ascii:
return 'ASCII';
case _RendererMode.glsl:
return 'GLSL';
}
}
} }

View File

@@ -12,6 +12,43 @@ import 'package:wolf_3d_dart/wolf_3d_input.dart';
/// Translates Flutter keyboard and mouse state into engine-friendly actions. /// Translates Flutter keyboard and mouse state into engine-friendly actions.
class Wolf3dFlutterInput extends Wolf3dInput { class Wolf3dFlutterInput extends Wolf3dInput {
/// Keyboard shortcut used by the Flutter host to cycle renderer modes.
LogicalKeyboardKey rendererToggleKey = LogicalKeyboardKey.keyR;
/// Keyboard shortcut used by the Flutter host to cycle ASCII themes.
LogicalKeyboardKey asciiThemeCycleKey = LogicalKeyboardKey.keyT;
/// Keyboard shortcut used by the Flutter host to toggle the FPS counter.
LogicalKeyboardKey fpsToggleKey = LogicalKeyboardKey.backquote;
/// Human-friendly label for [rendererToggleKey] shown in on-screen hints.
String get rendererToggleKeyLabel => _formatShortcutLabel(rendererToggleKey);
/// Human-friendly label for [asciiThemeCycleKey] shown in on-screen hints.
String get asciiThemeCycleKeyLabel =>
_formatShortcutLabel(asciiThemeCycleKey);
/// Human-friendly label for [fpsToggleKey] shown in on-screen hints.
String get fpsToggleKeyLabel => _formatShortcutLabel(fpsToggleKey);
String _formatShortcutLabel(LogicalKeyboardKey key) {
if (key == LogicalKeyboardKey.space) {
return 'SPACE';
}
if (key == LogicalKeyboardKey.tab) {
return 'TAB';
}
final label = key.keyLabel;
if (label.isNotEmpty) {
return label.toUpperCase();
}
final debugName = key.debugName;
if (debugName == null || debugName.isEmpty) {
return 'KEY';
}
return debugName.replaceFirst('Logical Keyboard Key ', '').toUpperCase();
}
/// Mapping from logical game actions to one or more keyboard bindings. /// Mapping from logical game actions to one or more keyboard bindings.
/// ///
/// Each action can be rebound by replacing the matching set. The defaults /// Each action can be rebound by replacing the matching set. The defaults