Refactor rendering architecture and replace rasterizer with renderer

- Introduced SoftwareRenderer as a pixel-accurate software rendering backend.
- Removed the obsolete wolf_3d_rasterizer.dart file.
- Created a new wolf_3d_renderer.dart file to centralize rendering exports.
- Updated tests to accommodate the new rendering structure, including pushwall and projection sampling tests.
- Modified the WolfAsciiRenderer and WolfFlutterRenderer to utilize the new SoftwareRenderer.
- Enhanced enemy spawn tests to include new enemy states.

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-19 11:38:07 +01:00
parent ac6edb030e
commit 786ba4b450
22 changed files with 952 additions and 684 deletions

View File

@@ -1,8 +1,8 @@
/// Flutter widget that renders Wolf3D frames using the ASCII rasterizer.
/// Flutter widget that renders Wolf3D frames using the ASCII renderer.
library;
import 'package:flutter/material.dart';
import 'package:wolf_3d_dart/wolf_3d_rasterizer.dart';
import 'package:wolf_3d_dart/wolf_3d_renderer.dart';
import 'package:wolf_3d_renderer/base_renderer.dart';
/// Displays the game using a text-mode approximation of the original renderer.
@@ -22,8 +22,8 @@ class _WolfAsciiRendererState extends BaseWolfRendererState<WolfAsciiRenderer> {
static const int _renderHeight = 100;
List<List<ColoredChar>> _asciiFrame = [];
final AsciiRasterizer _asciiRasterizer = AsciiRasterizer(
mode: AsciiRasterizerMode.terminalGrid,
final AsciiRenderer _asciiRenderer = AsciiRenderer(
mode: AsciiRendererMode.terminalGrid,
);
@override
@@ -45,7 +45,7 @@ class _WolfAsciiRendererState extends BaseWolfRendererState<WolfAsciiRenderer> {
@override
void performRender() {
setState(() {
_asciiFrame = _asciiRasterizer.render(widget.engine);
_asciiFrame = _asciiRenderer.render(widget.engine);
});
}
@@ -63,7 +63,7 @@ class _WolfAsciiRendererState extends BaseWolfRendererState<WolfAsciiRenderer> {
/// Paints a pre-rasterized ASCII frame using grouped text spans per color run.
class AsciiFrameWidget extends StatelessWidget {
/// Two-dimensional text grid generated by [AsciiRasterizer.render].
/// Two-dimensional text grid generated by [AsciiRenderer.render].
final List<List<ColoredChar>> frameData;
/// Creates a widget that displays [frameData].

View File

@@ -5,11 +5,11 @@ import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:wolf_3d_dart/wolf_3d_data_types.dart';
import 'package:wolf_3d_dart/wolf_3d_rasterizer.dart';
import 'package:wolf_3d_dart/wolf_3d_renderer.dart';
import 'package:wolf_3d_renderer/base_renderer.dart';
import 'package:wolf_3d_renderer/wolf_3d_asset_painter.dart';
/// Presents the software rasterizer output by decoding the shared framebuffer.
/// Presents the software renderer output by decoding the shared framebuffer.
class WolfFlutterRenderer extends BaseWolfRenderer {
/// Creates a pixel renderer bound to [engine].
const WolfFlutterRenderer({
@@ -25,7 +25,7 @@ class _WolfFlutterRendererState
extends BaseWolfRendererState<WolfFlutterRenderer> {
static const int _renderWidth = 320;
static const int _renderHeight = 200;
final SoftwareRasterizer _rasterizer = SoftwareRasterizer();
final SoftwareRenderer _renderer = SoftwareRenderer();
ui.Image? _renderedFrame;
bool _isRendering = false;
@@ -51,7 +51,7 @@ class _WolfFlutterRendererState
_isRendering = true;
final FrameBuffer frameBuffer = widget.engine.frameBuffer;
_rasterizer.render(widget.engine);
_renderer.render(widget.engine);
// Convert the engine-owned framebuffer into a GPU-friendly ui.Image on
// the Flutter side while preserving nearest-neighbor pixel fidelity.