keep and drain affine matricies

This commit is contained in:
Corwin 2023-04-03 22:11:37 +01:00
parent 63088f2907
commit 354cf7addc
No known key found for this signature in database

View file

@ -16,12 +16,14 @@ use super::attributes::{AffineMode, Attributes};
struct OamFrameModifyables { struct OamFrameModifyables {
up_to: i32, up_to: i32,
this_frame_sprites: Vec<SpriteVram>, this_frame_sprites: Vec<SpriteVram>,
this_frame_affine: Vec<AffineMatrixVram>,
} }
pub struct UnmanagedOAM<'gba> { pub struct UnmanagedOAM<'gba> {
phantom: PhantomData<&'gba ()>, phantom: PhantomData<&'gba ()>,
frame_data: UnsafeCell<OamFrameModifyables>, frame_data: UnsafeCell<OamFrameModifyables>,
previous_frame_sprites: Vec<SpriteVram>, previous_frame_sprites: Vec<SpriteVram>,
previous_frame_affine: Vec<AffineMatrixVram>,
} }
pub struct OAMIterator<'oam> { pub struct OAMIterator<'oam> {
@ -42,6 +44,9 @@ impl OAMSlot<'_> {
let frame_data = unsafe { &mut *self.frame_data.get() }; let frame_data = unsafe { &mut *self.frame_data.get() };
frame_data.this_frame_sprites.push(object.sprite.clone()); frame_data.this_frame_sprites.push(object.sprite.clone());
if let Some(affine) = &object.affine_matrix {
frame_data.this_frame_affine.push(affine.clone());
}
frame_data.up_to = self.slot as i32; frame_data.up_to = self.slot as i32;
} }
@ -100,6 +105,13 @@ impl UnmanagedOAM<'_> {
&mut self.previous_frame_sprites, &mut self.previous_frame_sprites,
); );
// Drain previous frame affine matricies
self.previous_frame_affine.drain(..);
core::mem::swap(
&mut frame_data.this_frame_affine,
&mut self.previous_frame_affine,
);
OAMIterator { OAMIterator {
index: 0, index: 0,
frame_data: &self.frame_data, frame_data: &self.frame_data,
@ -111,6 +123,7 @@ impl UnmanagedOAM<'_> {
frame_data: Default::default(), frame_data: Default::default(),
phantom: PhantomData, phantom: PhantomData,
previous_frame_sprites: Default::default(), previous_frame_sprites: Default::default(),
previous_frame_affine: Default::default(),
} }
} }
} }