add FADE
This commit is contained in:
parent
8e65ff65c5
commit
da63ac1886
@ -136,6 +136,17 @@ impl Machine {
|
|||||||
self.gfx.layers[3].map.set_tile(11, 4, crate::model::Tile { id: 1, ..Default::default() });
|
self.gfx.layers[3].map.set_tile(11, 4, crate::model::Tile { id: 1, ..Default::default() });
|
||||||
self.gfx.layers[3].map.set_tile(11, 5, crate::model::Tile { id: 1, ..Default::default() });
|
self.gfx.layers[3].map.set_tile(11, 5, crate::model::Tile { id: 1, ..Default::default() });
|
||||||
|
|
||||||
|
// Faz a cena pulsar entre claro e escuro a cada 2 segundos
|
||||||
|
// Usamos uma conta matemática simples para gerar um valor de 0 a 31
|
||||||
|
let pulse = (self.frame_index / 4) % 64;
|
||||||
|
let level = if pulse > 31 { 63 - pulse } else { pulse };
|
||||||
|
|
||||||
|
self.gfx.scene_fade_level = level as u8;
|
||||||
|
self.gfx.scene_fade_color = Color::BLACK;
|
||||||
|
|
||||||
|
// O HUD continuará 100% visível enquanto o resto escurece!
|
||||||
|
self.gfx.hud_fade_level = 31;
|
||||||
|
|
||||||
for i in 0..512 {
|
for i in 0..512 {
|
||||||
let s = &mut self.gfx.sprites[i];
|
let s = &mut self.gfx.sprites[i];
|
||||||
s.active = true;
|
s.active = true;
|
||||||
|
|||||||
@ -24,7 +24,12 @@ pub struct Gfx {
|
|||||||
pub layers: [ScrollableTileLayer; 4],
|
pub layers: [ScrollableTileLayer; 4],
|
||||||
pub hud: HudTileLayer,
|
pub hud: HudTileLayer,
|
||||||
pub banks: [Option<TileBank>; 16],
|
pub banks: [Option<TileBank>; 16],
|
||||||
pub sprites: [Sprite; 512], // Nossa "OAM"
|
pub sprites: [Sprite; 512],
|
||||||
|
|
||||||
|
pub scene_fade_level: u8, // 0..31
|
||||||
|
pub scene_fade_color: Color,
|
||||||
|
pub hud_fade_level: u8, // 0..31
|
||||||
|
pub hud_fade_color: Color,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Gfx {
|
impl Gfx {
|
||||||
@ -56,6 +61,10 @@ impl Gfx {
|
|||||||
hud: HudTileLayer::new(64, 32),
|
hud: HudTileLayer::new(64, 32),
|
||||||
banks: [EMPTY_BANK; 16],
|
banks: [EMPTY_BANK; 16],
|
||||||
sprites: [EMPTY_SPRITE; 512],
|
sprites: [EMPTY_SPRITE; 512],
|
||||||
|
scene_fade_level: 31,
|
||||||
|
scene_fade_color: Color::BLACK,
|
||||||
|
hud_fade_level: 31,
|
||||||
|
hud_fade_color: Color::BLACK,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,8 +138,14 @@ impl Gfx {
|
|||||||
self.render_sprites_by_priority((i + 1) as u8);
|
self.render_sprites_by_priority((i + 1) as u8);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. HUD (Sempre por cima)
|
// 4. Aplica Scene Fade (Afeta tudo desenhado até agora)
|
||||||
|
Self::apply_fade_to_buffer(&mut self.back, self.scene_fade_level, self.scene_fade_color);
|
||||||
|
|
||||||
|
// 5. HUD (Sempre por cima)
|
||||||
self.render_hud();
|
self.render_hud();
|
||||||
|
|
||||||
|
// 6. Aplica HUD Fade (Opcional, apenas para o HUD)
|
||||||
|
Self::apply_fade_to_buffer(&mut self.back, self.hud_fade_level, self.hud_fade_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render_layer(&mut self, layer_idx: usize) {
|
pub fn render_layer(&mut self, layer_idx: usize) {
|
||||||
@ -261,6 +276,27 @@ impl Gfx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Aplica o efeito de fade em todo o back buffer.
|
||||||
|
/// level: 0 (cor total) até 31 (visível)
|
||||||
|
fn apply_fade_to_buffer(back: &mut [u16], level: u8, fade_color: Color) {
|
||||||
|
if level >= 31 { return; } // Totalmente visível, pula processamento
|
||||||
|
|
||||||
|
let weight = level as u16;
|
||||||
|
let inv_weight = 31 - weight;
|
||||||
|
let (fr, fg, fb) = Color::unpack_to_native(fade_color.0);
|
||||||
|
|
||||||
|
for px in back.iter_mut() {
|
||||||
|
let (sr, sg, sb) = Color::unpack_to_native(*px);
|
||||||
|
|
||||||
|
// Fórmula: (src * weight + fade * inv_weight) / 31
|
||||||
|
let r = ((sr as u16 * weight + fr as u16 * inv_weight) / 31) as u8;
|
||||||
|
let g = ((sg as u16 * weight + fg as u16 * inv_weight) / 31) as u8;
|
||||||
|
let b = ((sb as u16 * weight + fb as u16 * inv_weight) / 31) as u8;
|
||||||
|
|
||||||
|
*px = Color::pack_from_native(r, g, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Retorna o uso estimado de memória das estruturas gráficas em bytes.
|
/// Retorna o uso estimado de memória das estruturas gráficas em bytes.
|
||||||
/// Isso ajuda a monitorar o "custo" do hardware simulado.
|
/// Isso ajuda a monitorar o "custo" do hardware simulado.
|
||||||
pub fn memory_usage_bytes(&self) -> usize {
|
pub fn memory_usage_bytes(&self) -> usize {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user