Compare commits
No commits in common. "d4106253e8540cbef12f24322fff1f295909755f" and "983e4cfc29de39e00f50f024f0fba53fb8287087" have entirely different histories.
d4106253e8
...
983e4cfc29
@ -4,9 +4,7 @@ use prometeu_hal::GfxBridge;
|
|||||||
use prometeu_hal::glyph::Glyph;
|
use prometeu_hal::glyph::Glyph;
|
||||||
use prometeu_hal::scene_bank::SceneBank;
|
use prometeu_hal::scene_bank::SceneBank;
|
||||||
use prometeu_hal::scene_viewport_cache::SceneViewportCache;
|
use prometeu_hal::scene_viewport_cache::SceneViewportCache;
|
||||||
use prometeu_hal::scene_viewport_resolver::{
|
use prometeu_hal::scene_viewport_resolver::{CacheRefreshRequest, SceneViewportResolver};
|
||||||
CacheRefreshRequest, ResolverUpdate, SceneViewportResolver,
|
|
||||||
};
|
|
||||||
use prometeu_hal::sprite::Sprite;
|
use prometeu_hal::sprite::Sprite;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
@ -259,7 +257,6 @@ impl FrameComposer {
|
|||||||
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);
|
||||||
Self::sync_cache_windows(cache, &update);
|
|
||||||
Self::apply_refresh_requests(cache, scene, &update.refresh_requests);
|
Self::apply_refresh_requests(cache, scene, &update.refresh_requests);
|
||||||
// `FrameComposer` owns only canonical game-frame composition.
|
// `FrameComposer` owns only canonical game-frame composition.
|
||||||
// Deferred `gfx.*` primitives are drained later by a separate
|
// Deferred `gfx.*` primitives are drained later by a separate
|
||||||
@ -337,16 +334,6 @@ impl FrameComposer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sync_cache_windows(cache: &mut SceneViewportCache, update: &ResolverUpdate) {
|
|
||||||
for request in &update.copy_requests {
|
|
||||||
cache.move_layer_window_to(
|
|
||||||
request.layer_index,
|
|
||||||
request.cache_origin_tile_x,
|
|
||||||
request.cache_origin_tile_y,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -373,16 +360,6 @@ mod tests {
|
|||||||
glyph_asset_id: AssetId,
|
glyph_asset_id: AssetId,
|
||||||
palette_id: u8,
|
palette_id: u8,
|
||||||
tile_size: TileSize,
|
tile_size: TileSize,
|
||||||
) -> SceneBank {
|
|
||||||
make_scene_grid(glyph_asset_id, palette_id, tile_size, 2, 2)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_scene_grid(
|
|
||||||
glyph_asset_id: AssetId,
|
|
||||||
palette_id: u8,
|
|
||||||
tile_size: TileSize,
|
|
||||||
width: usize,
|
|
||||||
height: usize,
|
|
||||||
) -> SceneBank {
|
) -> SceneBank {
|
||||||
let layer = SceneLayer {
|
let layer = SceneLayer {
|
||||||
active: true,
|
active: true,
|
||||||
@ -390,8 +367,8 @@ mod tests {
|
|||||||
tile_size,
|
tile_size,
|
||||||
parallax_factor: ParallaxFactor { x: 1.0, y: 0.5 },
|
parallax_factor: ParallaxFactor { x: 1.0, y: 0.5 },
|
||||||
tilemap: TileMap {
|
tilemap: TileMap {
|
||||||
width,
|
width: 2,
|
||||||
height,
|
height: 2,
|
||||||
tiles: vec![
|
tiles: vec![
|
||||||
Tile {
|
Tile {
|
||||||
active: true,
|
active: true,
|
||||||
@ -399,7 +376,7 @@ mod tests {
|
|||||||
flip_x: false,
|
flip_x: false,
|
||||||
flip_y: false,
|
flip_y: false,
|
||||||
};
|
};
|
||||||
width * height
|
4
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -791,43 +768,6 @@ mod tests {
|
|||||||
assert_eq!(gfx.front_buffer()[0], Color::BLUE.raw());
|
assert_eq!(gfx.front_buffer()[0], Color::BLUE.raw());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn render_frame_realigns_cache_window_before_refresh_when_camera_moves() {
|
|
||||||
let banks = Arc::new(MemoryBanks::new());
|
|
||||||
let scene = Arc::new(make_scene_grid(0, 2, TileSize::Size8, 16, 16));
|
|
||||||
banks.install_glyph_bank(0, Arc::new(make_glyph_bank(TileSize::Size8, 2, Color::BLUE)));
|
|
||||||
banks.install_scene_bank(0, Arc::clone(&scene));
|
|
||||||
|
|
||||||
let mut frame_composer = FrameComposer::new(
|
|
||||||
16,
|
|
||||||
16,
|
|
||||||
Arc::clone(&banks) as Arc<dyn SceneBankPoolAccess>,
|
|
||||||
make_glyph_slot_index(&[(0, 0)]),
|
|
||||||
);
|
|
||||||
assert!(frame_composer.bind_scene(0));
|
|
||||||
|
|
||||||
let mut expected_resolver = FrameComposer::build_scene_runtime(16, 16, &scene).1;
|
|
||||||
expected_resolver.update(&scene, 0, 0);
|
|
||||||
let expected_update = expected_resolver.update(&scene, 40, 0);
|
|
||||||
|
|
||||||
let mut gfx = Gfx::new(16, 16, Arc::clone(&banks) as Arc<dyn GlyphBankPoolAccess>);
|
|
||||||
gfx.scene_fade_level = 31;
|
|
||||||
gfx.hud_fade_level = 31;
|
|
||||||
|
|
||||||
frame_composer.render_frame(&mut gfx);
|
|
||||||
frame_composer.set_camera(40, 0);
|
|
||||||
frame_composer.render_frame(&mut gfx);
|
|
||||||
|
|
||||||
let cache = frame_composer.cache().expect("cache should exist");
|
|
||||||
assert_eq!(
|
|
||||||
cache.layers[0].logical_origin(),
|
|
||||||
(
|
|
||||||
expected_update.copy_requests[0].cache_origin_tile_x,
|
|
||||||
expected_update.copy_requests[0].cache_origin_tile_y,
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn render_frame_survives_scene_transition_through_unbind_and_rebind() {
|
fn render_frame_survives_scene_transition_through_unbind_and_rebind() {
|
||||||
let banks = Arc::new(MemoryBanks::new());
|
let banks = Arc::new(MemoryBanks::new());
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user