Improves ASCII rasterization speed and simplifies API

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-18 01:37:04 +01:00
parent 309bf5c699
commit d7692ea325
11 changed files with 120 additions and 47 deletions

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:wolf_3d_dart/wolf_3d_data_types.dart';
import 'package:wolf_3d_dart/wolf_3d_engine.dart';
import 'package:wolf_3d_renderer/base_renderer.dart';
@@ -14,19 +13,28 @@ class WolfAsciiRenderer extends BaseWolfRenderer {
}
class _WolfAsciiRendererState extends BaseWolfRendererState<WolfAsciiRenderer> {
static const int _renderWidth = 160;
static const int _renderHeight = 100;
List<List<ColoredChar>> _asciiFrame = [];
final AsciiRasterizer _asciiRasterizer = AsciiRasterizer();
@override
void initState() {
super.initState();
if (widget.engine.frameBuffer.width != _renderWidth ||
widget.engine.frameBuffer.height != _renderHeight) {
widget.engine.setFrameBuffer(_renderWidth, _renderHeight);
}
}
@override
Color get scaffoldColor => const Color.fromARGB(255, 4, 64, 64);
@override
void performRender() {
setState(() {
_asciiFrame = _asciiRasterizer.render(
widget.engine,
FrameBuffer(160, 100),
);
_asciiFrame = _asciiRasterizer.render(widget.engine);
});
}

View File

@@ -18,12 +18,22 @@ class WolfFlutterRenderer extends BaseWolfRenderer {
class _WolfFlutterRendererState
extends BaseWolfRendererState<WolfFlutterRenderer> {
final FrameBuffer _frameBuffer = FrameBuffer(320, 200);
static const int _renderWidth = 320;
static const int _renderHeight = 200;
final SoftwareRasterizer _rasterizer = SoftwareRasterizer();
ui.Image? _renderedFrame;
bool _isRendering = false;
@override
void initState() {
super.initState();
if (widget.engine.frameBuffer.width != _renderWidth ||
widget.engine.frameBuffer.height != _renderHeight) {
widget.engine.setFrameBuffer(_renderWidth, _renderHeight);
}
}
@override
Color get scaffoldColor => const Color.fromARGB(255, 4, 64, 64);
@@ -32,12 +42,13 @@ class _WolfFlutterRendererState
if (_isRendering) return;
_isRendering = true;
_rasterizer.render(widget.engine, _frameBuffer);
final FrameBuffer frameBuffer = widget.engine.frameBuffer;
_rasterizer.render(widget.engine);
ui.decodeImageFromPixels(
_frameBuffer.pixels.buffer.asUint8List(),
_frameBuffer.width,
_frameBuffer.height,
frameBuffer.pixels.buffer.asUint8List(),
frameBuffer.width,
frameBuffer.height,
ui.PixelFormat.rgba8888,
(ui.Image image) {
if (mounted) {