ruffle/src/display_object.rs

63 lines
2.2 KiB
Rust
Raw Normal View History

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