2019-04-26 21:11:29 +00:00
|
|
|
use crate::ColorTransform;
|
2019-04-26 03:27:44 +00:00
|
|
|
use crate::Matrix;
|
|
|
|
use crate::{graphic::Graphic, MovieClip, Stage};
|
|
|
|
use crate::{RenderContext, UpdateContext};
|
2019-04-25 17:52:22 +00:00
|
|
|
use bacon_rajan_cc::{Trace, Tracer};
|
|
|
|
|
|
|
|
pub trait DisplayObject {
|
|
|
|
//fn children_gc_mut(&self) -> std::slice::Iter<&mut DisplayObjectNode>;
|
2019-04-26 03:27:44 +00:00
|
|
|
fn run_frame(&mut self, context: &mut UpdateContext);
|
|
|
|
fn update_frame_number(&mut self) {}
|
2019-04-25 17:52:22 +00:00
|
|
|
fn render(&self, context: &mut RenderContext);
|
2019-04-26 03:27:44 +00:00
|
|
|
fn set_matrix(&mut self, matrix: Matrix);
|
2019-04-26 21:11:29 +00:00
|
|
|
fn set_color_transform(&mut self, color_transform: ColorTransform);
|
2019-04-25 17:52:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub enum DisplayObjectNode {
|
|
|
|
Graphic(Graphic),
|
|
|
|
MovieClip(MovieClip),
|
2019-04-26 03:27:44 +00:00
|
|
|
Stage(Stage),
|
2019-04-25 17:52:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl DisplayObject for DisplayObjectNode {
|
2019-04-26 03:27:44 +00:00
|
|
|
fn run_frame(&mut self, context: &mut UpdateContext) {
|
2019-04-25 17:52:22 +00:00
|
|
|
match self {
|
2019-04-26 03:27:44 +00:00
|
|
|
DisplayObjectNode::Graphic(graphic) => graphic.run_frame(context),
|
|
|
|
DisplayObjectNode::MovieClip(movie_clip) => movie_clip.run_frame(context),
|
|
|
|
DisplayObjectNode::Stage(stage) => stage.run_frame(context),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn update_frame_number(&mut self) {
|
|
|
|
match self {
|
|
|
|
DisplayObjectNode::Graphic(graphic) => graphic.update_frame_number(),
|
|
|
|
DisplayObjectNode::MovieClip(movie_clip) => movie_clip.update_frame_number(),
|
|
|
|
DisplayObjectNode::Stage(stage) => stage.update_frame_number(),
|
2019-04-25 17:52:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn render(&self, context: &mut RenderContext) {
|
|
|
|
match self {
|
|
|
|
DisplayObjectNode::Graphic(graphic) => graphic.render(context),
|
|
|
|
DisplayObjectNode::MovieClip(movie_clip) => movie_clip.render(context),
|
2019-04-26 03:27:44 +00:00
|
|
|
DisplayObjectNode::Stage(stage) => stage.render(context),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn set_matrix(&mut self, matrix: Matrix) {
|
|
|
|
match self {
|
|
|
|
DisplayObjectNode::Graphic(graphic) => graphic.set_matrix(matrix),
|
|
|
|
DisplayObjectNode::MovieClip(movie_clip) => movie_clip.set_matrix(matrix),
|
|
|
|
DisplayObjectNode::Stage(stage) => stage.set_matrix(matrix),
|
2019-04-25 17:52:22 +00:00
|
|
|
}
|
|
|
|
}
|
2019-04-26 21:11:29 +00:00
|
|
|
|
|
|
|
fn set_color_transform(&mut self, color_transform: ColorTransform) {
|
|
|
|
match self {
|
|
|
|
DisplayObjectNode::Graphic(graphic) => graphic.set_color_transform(color_transform),
|
|
|
|
DisplayObjectNode::MovieClip(movie_clip) => {
|
|
|
|
movie_clip.set_color_transform(color_transform)
|
|
|
|
}
|
|
|
|
DisplayObjectNode::Stage(stage) => stage.set_color_transform(color_transform),
|
|
|
|
}
|
|
|
|
}
|
2019-04-25 17:52:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Trace for DisplayObjectNode {
|
|
|
|
fn trace(&mut self, tracer: &mut Tracer) {
|
|
|
|
match self {
|
|
|
|
DisplayObjectNode::Graphic(graphic) => graphic.trace(tracer),
|
|
|
|
DisplayObjectNode::MovieClip(movie_clip) => movie_clip.trace(tracer),
|
2019-04-26 03:27:44 +00:00
|
|
|
DisplayObjectNode::Stage(stage) => stage.trace(tracer),
|
2019-04-25 17:52:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|