From c83b0402ffde1a547e123e238f83897ca2c3d9ec Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Thu, 9 Apr 2026 07:59:55 +0100 Subject: [PATCH] implements Glyph and update Tile to use active (dsc16: done) --- crates/console/prometeu-drivers/src/gfx.rs | 19 +++++++++++++------ crates/console/prometeu-hal/src/glyph.rs | 5 +++++ crates/console/prometeu-hal/src/lib.rs | 1 + crates/console/prometeu-hal/src/sprite.rs | 4 ++-- crates/console/prometeu-hal/src/tile.rs | 6 ++++-- .../src/virtual_machine_runtime/dispatch.rs | 9 ++++++--- discussion/index.ndjson | 2 +- 7 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 crates/console/prometeu-hal/src/glyph.rs diff --git a/crates/console/prometeu-drivers/src/gfx.rs b/crates/console/prometeu-drivers/src/gfx.rs index 3c98bdea..b9b9d4dc 100644 --- a/crates/console/prometeu-drivers/src/gfx.rs +++ b/crates/console/prometeu-drivers/src/gfx.rs @@ -6,6 +6,7 @@ use prometeu_hal::tile::Tile; use prometeu_hal::tile_bank::{TileBank, TileSize}; use prometeu_hal::tile_layer::{HudTileLayer, ScrollableTileLayer, TileMap}; use std::sync::Arc; +use prometeu_hal::glyph::Glyph; /// Blending modes inspired by classic 16-bit hardware. /// Defines how source pixels are combined with existing pixels in the framebuffer. @@ -274,8 +275,14 @@ impl GfxBridge for Gfx { impl Gfx { /// Initializes the graphics system with a specific resolution and shared memory banks. pub fn new(w: usize, h: usize, tile_banks: Arc) -> Self { + + const EMPTY_GLYPH: Glyph = Glyph { + glyph_id: 0, + palette_id: 0, + }; + const EMPTY_SPRITE: Sprite = Sprite { - tile: Tile { id: 0, flip_x: false, flip_y: false, palette_id: 0 }, + glyph: EMPTY_GLYPH, x: 0, y: 0, bank_id: 0, @@ -706,7 +713,7 @@ impl Gfx { let tile = map.tiles[map_y * map.width + map_x]; // Optimized skip for empty (ID 0) tiles. - if tile.id == 0 { + if !tile.active { continue; } @@ -757,7 +764,7 @@ impl Gfx { let fetch_y = if tile.flip_y { size - 1 - local_y } else { local_y }; // 1. Get the pixel color index (0-15) from the bank. - let px_index = bank.get_pixel_index(tile.id, fetch_x, fetch_y); + let px_index = bank.get_pixel_index(tile.glyph.glyph_id, fetch_x, fetch_y); // 2. Hardware rule: Color index 0 is always fully transparent. if px_index == 0 { @@ -765,7 +772,7 @@ impl Gfx { } // 3. Resolve the virtual index to a real RGB565 color using the tile's assigned palette. - let color = bank.resolve_color(tile.palette_id, px_index); + let color = bank.resolve_color(tile.glyph.palette_id, px_index); back[world_y as usize * screen_w + world_x as usize] = color.raw(); } @@ -812,7 +819,7 @@ impl Gfx { let fetch_y = if sprite.flip_y { size - 1 - local_y } else { local_y }; // 1. Get index - let px_index = bank.get_pixel_index(sprite.tile.id, fetch_x, fetch_y); + let px_index = bank.get_pixel_index(sprite.glyph.glyph_id, fetch_x, fetch_y); // 2. Transparency if px_index == 0 { @@ -820,7 +827,7 @@ impl Gfx { } // 3. Resolve color via palette (from the tile inside the sprite) - let color = bank.resolve_color(sprite.tile.palette_id, px_index); + let color = bank.resolve_color(sprite.glyph.palette_id, px_index); back[world_y as usize * screen_w + world_x as usize] = color.raw(); } diff --git a/crates/console/prometeu-hal/src/glyph.rs b/crates/console/prometeu-hal/src/glyph.rs new file mode 100644 index 00000000..e6d41e3a --- /dev/null +++ b/crates/console/prometeu-hal/src/glyph.rs @@ -0,0 +1,5 @@ +#[derive(Clone, Copy, Debug, Default)] +pub struct Glyph { + pub glyph_id: u16, + pub palette_id: u8, +} \ No newline at end of file diff --git a/crates/console/prometeu-hal/src/lib.rs b/crates/console/prometeu-hal/src/lib.rs index b9c9681d..0495586e 100644 --- a/crates/console/prometeu-hal/src/lib.rs +++ b/crates/console/prometeu-hal/src/lib.rs @@ -26,6 +26,7 @@ pub mod tile_layer; pub mod touch_bridge; pub mod vm_fault; pub mod window; +pub mod glyph; pub use asset_bridge::AssetBridge; pub use audio_bridge::{AudioBridge, AudioOpStatus, LoopMode}; diff --git a/crates/console/prometeu-hal/src/sprite.rs b/crates/console/prometeu-hal/src/sprite.rs index ba56e23b..e0da7397 100644 --- a/crates/console/prometeu-hal/src/sprite.rs +++ b/crates/console/prometeu-hal/src/sprite.rs @@ -1,8 +1,8 @@ -use crate::tile::Tile; +use crate::glyph::Glyph; #[derive(Clone, Copy, Debug, Default)] pub struct Sprite { - pub tile: Tile, + pub glyph: Glyph, pub x: i32, pub y: i32, pub bank_id: u8, diff --git a/crates/console/prometeu-hal/src/tile.rs b/crates/console/prometeu-hal/src/tile.rs index 07216fc2..50012691 100644 --- a/crates/console/prometeu-hal/src/tile.rs +++ b/crates/console/prometeu-hal/src/tile.rs @@ -1,7 +1,9 @@ +use crate::glyph::Glyph; + #[derive(Clone, Copy, Debug, Default)] pub struct Tile { - pub id: u16, + pub glyph: Glyph, + pub active: bool, pub flip_x: bool, pub flip_y: bool, - pub palette_id: u8, } diff --git a/crates/console/prometeu-system/src/virtual_machine_runtime/dispatch.rs b/crates/console/prometeu-system/src/virtual_machine_runtime/dispatch.rs index 5b597bd8..f4ec871a 100644 --- a/crates/console/prometeu-system/src/virtual_machine_runtime/dispatch.rs +++ b/crates/console/prometeu-system/src/virtual_machine_runtime/dispatch.rs @@ -7,12 +7,12 @@ use prometeu_hal::color::Color; use prometeu_hal::log::{LogLevel, LogSource}; use prometeu_hal::sprite::Sprite; use prometeu_hal::syscalls::Syscall; -use prometeu_hal::tile::Tile; use prometeu_hal::vm_fault::VmFault; use prometeu_hal::{ AudioOpStatus, GfxOpStatus, HostContext, HostReturn, NativeInterface, SyscallId, expect_bool, expect_int, }; +use prometeu_hal::glyph::Glyph; impl VirtualMachineRuntime { fn syscall_log_write(&mut self, level_val: i64, tag: u16, msg: String) -> Result<(), VmFault> { @@ -139,7 +139,7 @@ impl NativeInterface for VirtualMachineRuntime { let index = expect_int(args, 1)? as usize; let x = expect_int(args, 2)? as i32; let y = expect_int(args, 3)? as i32; - let tile_id = expect_int(args, 4)? as u16; + let glyph_id = expect_int(args, 4)? as u16; let palette_id = expect_int(args, 5)? as u8; let active = expect_bool(args, 6)?; let flip_x = expect_bool(args, 7)?; @@ -162,7 +162,10 @@ impl NativeInterface for VirtualMachineRuntime { } *hw.gfx_mut().sprite_mut(index) = Sprite { - tile: Tile { id: tile_id, flip_x: false, flip_y: false, palette_id }, + glyph: Glyph { + glyph_id, + palette_id, + }, x, y, bank_id, diff --git a/discussion/index.ndjson b/discussion/index.ndjson index 1904b150..fea171ee 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -16,7 +16,7 @@ {"type":"discussion","id":"DSC-0013","status":"open","ticket":"perf-host-debug-overlay-isolation","title":"Agenda - [PERF] Host Debug Overlay Isolation","created_at":"2026-03-27","updated_at":"2026-03-27","tags":[],"agendas":[{"id":"AGD-0012","file":"AGD-0012-perf-host-debug-overlay-isolation.md","status":"open","created_at":"2026-03-27","updated_at":"2026-03-27"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0014","status":"open","ticket":"perf-vm-allocation-and-copy-pressure","title":"Agenda - [PERF] VM Allocation and Copy Pressure","created_at":"2026-03-27","updated_at":"2026-03-27","tags":[],"agendas":[{"id":"AGD-0013","file":"AGD-0013-perf-vm-allocation-and-copy-pressure.md","status":"open","created_at":"2026-03-27","updated_at":"2026-03-27"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0015","status":"open","ticket":"perf-cartridge-boot-and-program-ownership","title":"Agenda - [PERF] Cartridge Boot and Program Ownership","created_at":"2026-03-27","updated_at":"2026-03-27","tags":[],"agendas":[{"id":"AGD-0014","file":"AGD-0014-perf-cartridge-boot-and-program-ownership.md","status":"open","created_at":"2026-03-27","updated_at":"2026-03-27"}],"decisions":[],"plans":[],"lessons":[]} -{"type":"discussion","id":"DSC-0016","status":"open","ticket":"tilemap-empty-cell-vs-tile-id-zero","title":"Tilemap Empty Cell vs Tile ID Zero","created_at":"2026-03-27","updated_at":"2026-03-27","tags":[],"agendas":[{"id":"AGD-0015","file":"AGD-0015-tilemap-empty-cell-vs-tile-id-zero.md","status":"open","created_at":"2026-03-27","updated_at":"2026-03-27"}],"decisions":[],"plans":[],"lessons":[]} +{"type":"discussion","id":"DSC-0016","status":"done","ticket":"tilemap-empty-cell-vs-tile-id-zero","title":"Tilemap Empty Cell vs Tile ID Zero","created_at":"2026-03-27","updated_at":"2026-03-27","tags":[],"agendas":[{"id":"AGD-0015","file":"AGD-0015-tilemap-empty-cell-vs-tile-id-zero.md","status":"open","created_at":"2026-03-27","updated_at":"2026-03-27"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0017","status":"open","ticket":"asset-entry-metadata-normalization-contract","title":"Asset Entry Metadata Normalization Contract","created_at":"2026-03-27","updated_at":"2026-03-27","tags":[],"agendas":[{"id":"AGD-0016","file":"AGD-0016-asset-entry-metadata-normalization-contract.md","status":"open","created_at":"2026-03-27","updated_at":"2026-03-27"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0018","status":"done","ticket":"asset-load-asset-id-int-contract","title":"Asset Load Asset ID Int Contract","created_at":"2026-03-27","updated_at":"2026-03-27","tags":["asset","runtime","abi"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0019","file":"lessons/DSC-0018-asset-load-asset-id-int-contract/LSN-0019-asset-load-id-abi-convergence.md","status":"done","created_at":"2026-03-27","updated_at":"2026-03-27"}]} {"type":"discussion","id":"DSC-0019","status":"done","ticket":"jenkinsfile-correction","title":"Jenkinsfile Correction and Relocation","created_at":"2026-04-07","updated_at":"2026-04-07","tags":["ci","jenkins"],"agendas":[{"id":"AGD-0017","file":"AGD-0017-jenkinsfile-correction.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}],"decisions":[{"id":"DEC-0002","file":"DEC-0002-jenkinsfile-strategy.md","status":"accepted","created_at":"2026-04-07","updated_at":"2026-04-07"}],"plans":[{"id":"PLN-0002","file":"PLN-0002-jenkinsfile-execution.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}],"lessons":[{"id":"LSN-0020","file":"lessons/DSC-0019-jenkins-ci-standardization/LSN-0020-jenkins-standard-relocation.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}]}