diff --git a/apps/wolf_3d_gui/lib/screens/game_screen.dart b/apps/wolf_3d_gui/lib/screens/game_screen.dart index f7ffeda..4744c2d 100644 --- a/apps/wolf_3d_gui/lib/screens/game_screen.dart +++ b/apps/wolf_3d_gui/lib/screens/game_screen.dart @@ -90,25 +90,6 @@ class _GameScreenState extends State { ), ), - // Tab toggles the renderer implementation for quick visual debugging. - Focus( - autofocus: true, - onKeyEvent: (node, event) { - if (event is KeyDownEvent) { - if (event.logicalKey == LogicalKeyboardKey.tab) { - setState(_cycleRendererMode); - return KeyEventResult.handled; - } - if (event.logicalKey == LogicalKeyboardKey.backquote) { - setState(_toggleFpsCounter); - return KeyEventResult.handled; - } - } - return KeyEventResult.ignored; - }, - child: const SizedBox.shrink(), - ), - // A second full-screen overlay keeps the presentation simple while // the engine is still warming up or decoding the first frame. if (!_engine.isInitialized) @@ -143,17 +124,40 @@ class _GameScreenState extends State { // reset level state or audio playback. switch (_rendererMode) { case _RendererMode.software: - return WolfFlutterRenderer(engine: _engine); + return WolfFlutterRenderer( + engine: _engine, + onKeyEvent: _handleRendererKeyEvent, + ); case _RendererMode.ascii: - return WolfAsciiRenderer(engine: _engine); + return WolfAsciiRenderer( + engine: _engine, + onKeyEvent: _handleRendererKeyEvent, + ); case _RendererMode.glsl: return WolfGlslRenderer( engine: _engine, + onKeyEvent: _handleRendererKeyEvent, onUnavailable: _onGlslUnavailable, ); } } + void _handleRendererKeyEvent(KeyEvent event) { + if (event is! KeyDownEvent) { + return; + } + + if (event.logicalKey == LogicalKeyboardKey.tab) { + setState(_cycleRendererMode); + return; + } + + if (event.logicalKey == LogicalKeyboardKey.backquote || + event.character == '`') { + setState(_toggleFpsCounter); + } + } + void _cycleRendererMode() { switch (_rendererMode) { case _RendererMode.software: diff --git a/packages/wolf_3d_dart/lib/src/engine/wolf_3d_engine_base.dart b/packages/wolf_3d_dart/lib/src/engine/wolf_3d_engine_base.dart index 869456e..c344644 100644 --- a/packages/wolf_3d_dart/lib/src/engine/wolf_3d_engine_base.dart +++ b/packages/wolf_3d_dart/lib/src/engine/wolf_3d_engine_base.dart @@ -81,7 +81,7 @@ class WolfEngine { double get fps => _smoothedFps; /// Whether renderers should draw the FPS counter overlay. - bool showFpsCounter = true; + bool showFpsCounter = false; /// The episode index where the game session begins. final int? startingEpisode; diff --git a/packages/wolf_3d_renderer/lib/base_renderer.dart b/packages/wolf_3d_renderer/lib/base_renderer.dart index 0a86aa5..93a67fb 100644 --- a/packages/wolf_3d_renderer/lib/base_renderer.dart +++ b/packages/wolf_3d_renderer/lib/base_renderer.dart @@ -10,9 +10,13 @@ abstract class BaseWolfRenderer extends StatefulWidget { /// Engine instance that owns world state and the shared framebuffer. final WolfEngine engine; + /// Optional key handler invoked by the focused renderer shell. + final void Function(KeyEvent event)? onKeyEvent; + /// Creates a renderer bound to [engine]. const BaseWolfRenderer({ required this.engine, + this.onKeyEvent, super.key, }); } @@ -75,7 +79,9 @@ abstract class BaseWolfRendererState body: KeyboardListener( focusNode: focusNode, autofocus: true, - onKeyEvent: (_) {}, + onKeyEvent: (event) { + widget.onKeyEvent?.call(event); + }, child: Center( child: buildViewport(context), ), diff --git a/packages/wolf_3d_renderer/lib/wolf_3d_ascii_renderer.dart b/packages/wolf_3d_renderer/lib/wolf_3d_ascii_renderer.dart index d086ffa..06e3cb6 100644 --- a/packages/wolf_3d_renderer/lib/wolf_3d_ascii_renderer.dart +++ b/packages/wolf_3d_renderer/lib/wolf_3d_ascii_renderer.dart @@ -10,6 +10,7 @@ class WolfAsciiRenderer extends BaseWolfRenderer { /// Creates an ASCII renderer bound to [engine]. const WolfAsciiRenderer({ required super.engine, + super.onKeyEvent, super.key, }); diff --git a/packages/wolf_3d_renderer/lib/wolf_3d_flutter_renderer.dart b/packages/wolf_3d_renderer/lib/wolf_3d_flutter_renderer.dart index cd5b1a3..9711c73 100644 --- a/packages/wolf_3d_renderer/lib/wolf_3d_flutter_renderer.dart +++ b/packages/wolf_3d_renderer/lib/wolf_3d_flutter_renderer.dart @@ -14,6 +14,7 @@ class WolfFlutterRenderer extends BaseWolfRenderer { /// Creates a pixel renderer bound to [engine]. const WolfFlutterRenderer({ required super.engine, + super.onKeyEvent, super.key, }); diff --git a/packages/wolf_3d_renderer/lib/wolf_3d_glsl_renderer.dart b/packages/wolf_3d_renderer/lib/wolf_3d_glsl_renderer.dart index 3da0f16..0f9b418 100644 --- a/packages/wolf_3d_renderer/lib/wolf_3d_glsl_renderer.dart +++ b/packages/wolf_3d_renderer/lib/wolf_3d_glsl_renderer.dart @@ -17,6 +17,7 @@ class WolfGlslRenderer extends BaseWolfRenderer { /// Creates a GLSL renderer bound to [engine]. const WolfGlslRenderer({ required super.engine, + super.onKeyEvent, this.onUnavailable, super.key, });