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
|
|
|
}
|
|
|
|
}
|