ruffle/core/src/display_object.rs

112 lines
3.2 KiB
Rust
Raw Normal View History

2019-04-27 01:55:06 +00:00
use crate::player::{RenderContext, UpdateContext};
2019-04-29 05:55:44 +00:00
use crate::prelude::*;
use crate::transform::Transform;
2019-04-25 17:52:22 +00:00
use bacon_rajan_cc::{Trace, Tracer};
2019-04-29 05:55:44 +00:00
pub struct DisplayObjectBase {
depth: Depth,
transform: Transform,
2019-04-25 17:52:22 +00:00
}
2019-04-29 05:55:44 +00:00
impl Default for DisplayObjectBase {
fn default() -> Self {
Self {
depth: Default::default(),
transform: Default::default(),
2019-04-26 03:27:44 +00:00
}
}
2019-04-29 05:55:44 +00:00
}
2019-04-26 03:27:44 +00:00
2019-04-29 05:55:44 +00:00
impl DisplayObjectImpl for DisplayObjectBase {
fn get_matrix(&self) -> &Matrix {
&self.transform.matrix
2019-04-25 17:52:22 +00:00
}
2019-04-29 05:55:44 +00:00
fn set_matrix(&mut self, matrix: &Matrix) {
self.transform.matrix = matrix.clone();
2019-04-26 03:27:44 +00:00
}
2019-04-29 05:55:44 +00:00
fn get_color_transform(&self) -> &ColorTransform {
&self.transform.color_transform
}
fn set_color_transform(&mut self, color_transform: &ColorTransform) {
self.transform.color_transform = color_transform.clone();
2019-04-25 17:52:22 +00:00
}
2019-04-29 05:55:44 +00:00
}
impl DisplayObjectUpdate for DisplayObjectBase {
fn run_frame(&mut self, context: &mut UpdateContext) {}
fn update_frame_number(&mut self) {}
fn render(&self, context: &mut RenderContext) {}
}
impl Trace for DisplayObjectBase {
fn trace(&mut self, _tracer: &mut Tracer) {}
}
pub trait DisplayObjectImpl: DisplayObjectUpdate {
fn get_matrix(&self) -> &Matrix;
fn set_matrix(&mut self, matrix: &Matrix);
fn get_color_transform(&self) -> &ColorTransform;
fn set_color_transform(&mut self, color_transform: &ColorTransform);
}
2019-04-26 21:11:29 +00:00
2019-04-29 05:55:44 +00:00
pub trait DisplayObjectUpdate: Trace {
fn run_frame(&mut self, _context: &mut UpdateContext) {}
fn update_frame_number(&mut self) {}
fn render(&self, _context: &mut RenderContext) {}
}
macro_rules! impl_display_object {
($name:ident, $field:ident) => {
impl crate::display_object::DisplayObjectImpl for $name {
fn get_matrix(&self) -> &Matrix {
self.$field.get_matrix()
}
fn set_matrix(&mut self, matrix: &Matrix) {
self.$field.set_matrix(matrix)
}
fn get_color_transform(&self) -> &ColorTransform {
self.$field.get_color_transform()
}
fn set_color_transform(&mut self, color_transform: &ColorTransform) {
self.$field.set_color_transform(color_transform)
2019-04-26 21:11:29 +00:00
}
}
2019-04-29 05:55:44 +00:00
};
}
// TODO(Herschel): We wrap in a box because using a trait object
// directly with Cc gets hairy.
// Extra heap allocation, though.
// Revisit this eventually, some possibilities:
// - Just use a dumb enum.
// - Some DST magic if we remove the Box below and mark this !Sized?
pub struct DisplayObject {
inner: Box<DisplayObjectImpl>,
}
impl DisplayObject {
pub fn new(inner: Box<DisplayObjectImpl>) -> DisplayObject {
DisplayObject { inner }
2019-04-26 21:11:29 +00:00
}
2019-04-25 17:52:22 +00:00
}
2019-04-29 05:55:44 +00:00
impl_display_object!(DisplayObject, inner);
impl DisplayObjectUpdate for DisplayObject {
fn run_frame(&mut self, context: &mut UpdateContext) {
self.inner.run_frame(context)
}
fn update_frame_number(&mut self) {
self.inner.update_frame_number()
}
fn render(&self, context: &mut RenderContext) {
self.inner.render(context)
}
}
impl Trace for DisplayObject {
2019-04-25 17:52:22 +00:00
fn trace(&mut self, tracer: &mut Tracer) {
2019-04-29 05:55:44 +00:00
self.inner.trace(tracer)
2019-04-25 17:52:22 +00:00
}
}