ruffle/core/src/display_object.rs

125 lines
3.5 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-05-04 18:45:11 +00:00
#[derive(Clone)]
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 {
2019-05-01 16:55:54 +00:00
fn transform(&self) -> &Transform {
&self.transform
}
2019-04-29 05:55:44 +00:00
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) {
2019-05-03 18:44:12 +00:00
self.transform.matrix = *matrix;
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) {
2019-05-03 18:44:12 +00:00
self.transform.color_transform = *color_transform;
2019-04-25 17:52:22 +00:00
}
2019-04-29 05:55:44 +00:00
}
2019-05-02 00:46:49 +00:00
impl DisplayObjectUpdate for DisplayObjectBase {}
2019-04-29 05:55:44 +00:00
impl Trace for DisplayObjectBase {
fn trace(&mut self, _tracer: &mut Tracer) {}
}
pub trait DisplayObjectImpl: DisplayObjectUpdate {
2019-05-01 16:55:54 +00:00
fn transform(&self) -> &Transform;
2019-04-29 05:55:44 +00:00
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) {}
2019-05-02 00:46:49 +00:00
fn run_post_frame(&mut self, _context: &mut UpdateContext) {}
2019-04-29 05:55:44 +00:00
fn render(&self, _context: &mut RenderContext) {}
2019-05-03 18:44:12 +00:00
fn handle_click(&mut self, _pos: (f32, f32)) {}
2019-04-29 05:55:44 +00:00
}
macro_rules! impl_display_object {
($name:ident, $field:ident) => {
impl crate::display_object::DisplayObjectImpl for $name {
2019-05-01 16:55:54 +00:00
fn transform(&self) -> &crate::transform::Transform {
self.$field.transform()
}
2019-04-29 05:55:44 +00:00
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)
}
2019-05-02 00:46:49 +00:00
fn run_post_frame(&mut self, context: &mut UpdateContext) {
self.inner.run_post_frame(context)
2019-04-29 05:55:44 +00:00
}
2019-05-02 00:46:49 +00:00
2019-04-29 05:55:44 +00:00
fn render(&self, context: &mut RenderContext) {
self.inner.render(context)
}
2019-05-03 18:44:12 +00:00
fn handle_click(&mut self, pos: (f32, f32)) {
self.inner.handle_click(pos)
}
2019-04-29 05:55:44 +00:00
}
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
}
}