format scene glyph migration changes

This commit is contained in:
bQUARKz 2026-04-24 15:43:39 +01:00
parent 41801a8e7a
commit 92be3b90fb
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
8 changed files with 89 additions and 115 deletions

View File

@ -1186,8 +1186,7 @@ mod tests {
} }
fn test_scene() -> SceneBank { fn test_scene() -> SceneBank {
let make_layer = let make_layer = |glyph_asset_id: AssetId,
|glyph_asset_id: AssetId,
active: bool, active: bool,
parallax_x: f32, parallax_x: f32,
parallax_y: f32, parallax_y: f32,

View File

@ -252,7 +252,8 @@ impl FrameComposer {
let scene_bank_id = self.active_scene_id.expect("active scene id must exist"); let scene_bank_id = self.active_scene_id.expect("active scene id must exist");
let resolved_glyph_slots = let resolved_glyph_slots =
self.resolve_glyph_slots(scene, scene_bank_id, "render_frame"); self.resolve_glyph_slots(scene, scene_bank_id, "render_frame");
let (Some(cache), Some(resolver)) = (self.cache.as_mut(), self.resolver.as_mut()) else { let (Some(cache), Some(resolver)) = (self.cache.as_mut(), self.resolver.as_mut())
else {
panic!("SCENE runtime invariant broken: active scene without cache/resolver"); panic!("SCENE runtime invariant broken: active scene without cache/resolver");
}; };
let update = resolver.update(scene, self.camera_x_px, self.camera_y_px); let update = resolver.update(scene, self.camera_x_px, self.camera_y_px);
@ -342,8 +343,8 @@ mod tests {
use crate::memory_banks::{ use crate::memory_banks::{
GlyphBankPoolAccess, GlyphBankPoolInstaller, MemoryBanks, SceneBankPoolInstaller, GlyphBankPoolAccess, GlyphBankPoolInstaller, MemoryBanks, SceneBankPoolInstaller,
}; };
use prometeu_hal::color::Color;
use prometeu_hal::asset::AssetId; use prometeu_hal::asset::AssetId;
use prometeu_hal::color::Color;
use prometeu_hal::glyph_bank::{GlyphBank, TileSize}; use prometeu_hal::glyph_bank::{GlyphBank, TileSize};
use prometeu_hal::scene_layer::{ParallaxFactor, SceneLayer}; use prometeu_hal::scene_layer::{ParallaxFactor, SceneLayer};
use prometeu_hal::tile::Tile; use prometeu_hal::tile::Tile;
@ -404,12 +405,8 @@ mod tests {
#[test] #[test]
fn frame_composer_starts_unbound_with_empty_owned_state() { fn frame_composer_starts_unbound_with_empty_owned_state() {
let frame_composer = FrameComposer::new( let frame_composer =
320, FrameComposer::new(320, 180, Arc::new(MemoryBanks::new()), make_glyph_slot_index(&[]));
180,
Arc::new(MemoryBanks::new()),
make_glyph_slot_index(&[]),
);
assert_eq!(frame_composer.viewport_size(), (320, 180)); assert_eq!(frame_composer.viewport_size(), (320, 180));
assert_eq!(frame_composer.active_scene_id(), None); assert_eq!(frame_composer.active_scene_id(), None);
@ -479,12 +476,8 @@ mod tests {
#[test] #[test]
fn set_camera_stores_top_left_pixel_coordinates() { fn set_camera_stores_top_left_pixel_coordinates() {
let mut frame_composer = FrameComposer::new( let mut frame_composer =
320, FrameComposer::new(320, 180, Arc::new(MemoryBanks::new()), make_glyph_slot_index(&[]));
180,
Arc::new(MemoryBanks::new()),
make_glyph_slot_index(&[]),
);
frame_composer.set_camera(-12, 48); frame_composer.set_camera(-12, 48);
@ -506,12 +499,8 @@ mod tests {
#[test] #[test]
fn missing_scene_binding_falls_back_to_no_scene_state() { fn missing_scene_binding_falls_back_to_no_scene_state() {
let mut frame_composer = FrameComposer::new( let mut frame_composer =
320, FrameComposer::new(320, 180, Arc::new(MemoryBanks::new()), make_glyph_slot_index(&[]));
180,
Arc::new(MemoryBanks::new()),
make_glyph_slot_index(&[]),
);
assert!(!frame_composer.bind_scene(7)); assert!(!frame_composer.bind_scene(7));
@ -525,8 +514,7 @@ mod tests {
let banks = Arc::new(MemoryBanks::new()); let banks = Arc::new(MemoryBanks::new());
banks.install_scene_bank(0, Arc::new(make_scene())); banks.install_scene_bank(0, Arc::new(make_scene()));
let mut frame_composer = let mut frame_composer = FrameComposer::new(320, 180, banks, make_glyph_slot_index(&[]));
FrameComposer::new(320, 180, banks, make_glyph_slot_index(&[]));
let panic = catch_unwind(AssertUnwindSafe(|| frame_composer.bind_scene(0))) let panic = catch_unwind(AssertUnwindSafe(|| frame_composer.bind_scene(0)))
.expect_err("bind_scene should panic when dependency is missing"); .expect_err("bind_scene should panic when dependency is missing");
@ -661,12 +649,8 @@ mod tests {
#[test] #[test]
fn frame_composer_emits_ordered_sprites_for_rendering() { fn frame_composer_emits_ordered_sprites_for_rendering() {
let mut frame_composer = FrameComposer::new( let mut frame_composer =
320, FrameComposer::new(320, 180, Arc::new(MemoryBanks::new()), make_glyph_slot_index(&[]));
180,
Arc::new(MemoryBanks::new()),
make_glyph_slot_index(&[]),
);
frame_composer.begin_frame(); frame_composer.begin_frame();
assert!(frame_composer.emit_sprite(Sprite { assert!(frame_composer.emit_sprite(Sprite {
@ -704,8 +688,7 @@ mod tests {
let banks = Arc::new(MemoryBanks::new()); let banks = Arc::new(MemoryBanks::new());
banks.install_glyph_bank(1, Arc::new(make_glyph_bank(TileSize::Size8, 3, Color::WHITE))); banks.install_glyph_bank(1, Arc::new(make_glyph_bank(TileSize::Size8, 3, Color::WHITE)));
let mut frame_composer = let mut frame_composer = FrameComposer::new(
FrameComposer::new(
16, 16,
16, 16,
Arc::clone(&banks) as Arc<dyn SceneBankPoolAccess>, Arc::clone(&banks) as Arc<dyn SceneBankPoolAccess>,
@ -740,8 +723,7 @@ mod tests {
banks.install_glyph_bank(0, Arc::new(make_glyph_bank(TileSize::Size8, 2, Color::BLUE))); banks.install_glyph_bank(0, Arc::new(make_glyph_bank(TileSize::Size8, 2, Color::BLUE)));
banks.install_scene_bank(0, Arc::new(make_scene_with_palette(0, 2, TileSize::Size8))); banks.install_scene_bank(0, Arc::new(make_scene_with_palette(0, 2, TileSize::Size8)));
let mut frame_composer = let mut frame_composer = FrameComposer::new(
FrameComposer::new(
16, 16,
16, 16,
Arc::clone(&banks) as Arc<dyn SceneBankPoolAccess>, Arc::clone(&banks) as Arc<dyn SceneBankPoolAccess>,
@ -776,8 +758,7 @@ mod tests {
banks.install_scene_bank(0, Arc::new(make_scene_with_palette(0, 1, TileSize::Size8))); banks.install_scene_bank(0, Arc::new(make_scene_with_palette(0, 1, TileSize::Size8)));
banks.install_scene_bank(1, Arc::new(make_scene_with_palette(1, 2, TileSize::Size8))); banks.install_scene_bank(1, Arc::new(make_scene_with_palette(1, 2, TileSize::Size8)));
let mut frame_composer = let mut frame_composer = FrameComposer::new(
FrameComposer::new(
16, 16,
16, 16,
Arc::clone(&banks) as Arc<dyn SceneBankPoolAccess>, Arc::clone(&banks) as Arc<dyn SceneBankPoolAccess>,

View File

@ -909,8 +909,8 @@ impl Gfx {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use crate::asset::GlyphAssetSlotIndex;
use crate::FrameComposer; use crate::FrameComposer;
use crate::asset::GlyphAssetSlotIndex;
use crate::memory_banks::{GlyphBankPoolInstaller, MemoryBanks, SceneBankPoolAccess}; use crate::memory_banks::{GlyphBankPoolInstaller, MemoryBanks, SceneBankPoolAccess};
use prometeu_hal::asset::AssetId; use prometeu_hal::asset::AssetId;
use prometeu_hal::glyph_bank::TileSize; use prometeu_hal::glyph_bank::TileSize;
@ -1080,8 +1080,7 @@ mod tests {
fn overlay_state_is_separate_from_frame_composer_sprite_state() { fn overlay_state_is_separate_from_frame_composer_sprite_state() {
let banks = Arc::new(MemoryBanks::new()); let banks = Arc::new(MemoryBanks::new());
let mut gfx = Gfx::new(32, 18, Arc::clone(&banks) as Arc<dyn GlyphBankPoolAccess>); let mut gfx = Gfx::new(32, 18, Arc::clone(&banks) as Arc<dyn GlyphBankPoolAccess>);
let mut frame_composer = let mut frame_composer = FrameComposer::new(
FrameComposer::new(
32, 32,
18, 18,
Arc::clone(&banks) as Arc<dyn SceneBankPoolAccess>, Arc::clone(&banks) as Arc<dyn SceneBankPoolAccess>,

View File

@ -15,7 +15,12 @@ mod tests {
use crate::tile::Tile; use crate::tile::Tile;
use crate::tilemap::TileMap; use crate::tilemap::TileMap;
fn layer(glyph_asset_id: AssetId, parallax_x: f32, parallax_y: f32, glyph_id: u16) -> SceneLayer { fn layer(
glyph_asset_id: AssetId,
parallax_x: f32,
parallax_y: f32,
glyph_id: u16,
) -> SceneLayer {
SceneLayer { SceneLayer {
active: true, active: true,
glyph_asset_id, glyph_asset_id,

View File

@ -284,12 +284,7 @@ mod tests {
let mut tiles = Vec::new(); let mut tiles = Vec::new();
for y in 0..4 { for y in 0..4 {
for x in 0..4 { for x in 0..4 {
tiles.push(make_tile( tiles.push(make_tile(base_glyph + (y * 4 + x) as u16, 1, x % 2 == 0, y % 2 == 1));
base_glyph + (y * 4 + x) as u16,
1,
x % 2 == 0,
y % 2 == 1,
));
} }
} }

View File

@ -191,11 +191,8 @@ impl NativeInterface for VirtualMachineRuntime {
let bound = catch_unwind(AssertUnwindSafe(|| hw.bind_scene(scene_bank_id))) let bound = catch_unwind(AssertUnwindSafe(|| hw.bind_scene(scene_bank_id)))
.map_err(|payload| VmFault::Panic(Self::panic_payload_to_string(payload)))?; .map_err(|payload| VmFault::Panic(Self::panic_payload_to_string(payload)))?;
let status = if bound { let status =
ComposerOpStatus::Ok if bound { ComposerOpStatus::Ok } else { ComposerOpStatus::SceneUnavailable };
} else {
ComposerOpStatus::SceneUnavailable
};
ret.push_int(status as i64); ret.push_int(status as i64);
Ok(()) Ok(())
} }

View File

@ -180,8 +180,7 @@ impl VirtualMachineRuntime {
{ {
if let Err(payload) = catch_unwind(AssertUnwindSafe(|| hw.render_frame())) { if let Err(payload) = catch_unwind(AssertUnwindSafe(|| hw.render_frame())) {
let message = Self::host_panic_payload_to_string(payload); let message = Self::host_panic_payload_to_string(payload);
let report = let report = CrashReport::VmPanic { message, pc: Some(vm.pc() as u32) };
CrashReport::VmPanic { message, pc: Some(vm.pc() as u32) };
self.log( self.log(
LogLevel::Error, LogLevel::Error,
LogSource::Vm, LogSource::Vm,

View File

@ -4,9 +4,8 @@ use prometeu_bytecode::model::{
BytecodeModule, ConstantPoolEntry, DebugInfo, Export, FunctionMeta, SyscallDecl, BytecodeModule, ConstantPoolEntry, DebugInfo, Export, FunctionMeta, SyscallDecl,
}; };
use prometeu_hal::asset::{ use prometeu_hal::asset::{
AssetCodec, AssetEntry, AssetId, BankType, PreloadEntry, AssetCodec, AssetEntry, AssetId, BankType, PreloadEntry, SCENE_DECODED_LAYER_OVERHEAD_BYTES_V1,
SCENE_DECODED_LAYER_OVERHEAD_BYTES_V1, SCENE_LAYER_COUNT_V1, SCENE_PAYLOAD_MAGIC_V1, SCENE_LAYER_COUNT_V1, SCENE_PAYLOAD_MAGIC_V1, SCENE_PAYLOAD_VERSION_V1,
SCENE_PAYLOAD_VERSION_V1,
}; };
use prometeu_hal::cartridge::{ use prometeu_hal::cartridge::{
AssetsPackHeader, AssetsPackPrelude, ASSETS_PA_MAGIC, ASSETS_PA_PRELUDE_SIZE, AssetsPackHeader, AssetsPackPrelude, ASSETS_PA_MAGIC, ASSETS_PA_PRELUDE_SIZE,