feat: Implement scrolling camera with layout-aware filtering

- Rename VERTICAL camera mode to FEED (rapid single-item view)
- Add SCROLL camera mode with float accumulation for smooth movie-credits style scrolling
- Add estimate_block_height() for cheap layout calculation without full rendering
- Replace ViewportFilterStage with layout-aware filtering that tracks camera position
- Add render caching to FontStage to avoid re-rendering items
- Fix CameraStage to use global canvas height for scrolling bounds
- Add horizontal padding in Camera.apply() to prevent ghosting
- Add get_dimensions() to MultiDisplay for proper viewport sizing
- Fix PygameDisplay to auto-detect viewport from window size
- Update presets to use scroll camera with appropriate speeds
This commit is contained in:
2026-03-17 00:21:18 -07:00
parent 4c97cfe6aa
commit 57de835ae0
12 changed files with 303 additions and 66 deletions

View File

@@ -627,12 +627,12 @@ class TestStageAdapters:
from engine.pipeline.adapters import CameraStage
from engine.pipeline.core import PipelineContext
camera = Camera(mode=CameraMode.VERTICAL)
camera = Camera(mode=CameraMode.FEED)
stage = CameraStage(camera, name="vertical")
PipelineContext()
assert "camera" in stage.capabilities
assert "source" in stage.dependencies # Prefix matches any source
assert "render.output" in stage.dependencies # Depends on rendered content
class TestDataSourceStage: