core: Update drawings on render instead of on tick

This commit is contained in:
Nathan Adams 2020-05-21 18:36:25 +02:00
parent 55215273e8
commit 279c07d9b8
2 changed files with 17 additions and 19 deletions

View File

@ -622,8 +622,6 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> {
if is_load_frame { if is_load_frame {
mc.run_clip_postaction((*self).into(), context, ClipEvent::Load); mc.run_clip_postaction((*self).into(), context, ClipEvent::Load);
} }
mc.drawing.run_frame(context);
} }
fn render(&self, context: &mut RenderContext<'_, 'gc>) { fn render(&self, context: &mut RenderContext<'_, 'gc>) {

View File

@ -1,15 +1,16 @@
use crate::backend::render::ShapeHandle; use crate::backend::render::ShapeHandle;
use crate::bounding_box::BoundingBox; use crate::bounding_box::BoundingBox;
use crate::context::{RenderContext, UpdateContext}; use crate::context::RenderContext;
use crate::shape_utils::{DistilledShape, DrawCommand, DrawPath}; use crate::shape_utils::{DistilledShape, DrawCommand, DrawPath};
use std::cell::Cell;
use swf::{FillStyle, LineStyle, Twips}; use swf::{FillStyle, LineStyle, Twips};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Drawing { pub struct Drawing {
render_handle: Option<ShapeHandle>, render_handle: Cell<Option<ShapeHandle>>,
shape_bounds: BoundingBox, shape_bounds: BoundingBox,
edge_bounds: BoundingBox, edge_bounds: BoundingBox,
dirty: bool, dirty: Cell<bool>,
fills: Vec<(FillStyle, Vec<DrawCommand>)>, fills: Vec<(FillStyle, Vec<DrawCommand>)>,
lines: Vec<(LineStyle, Vec<DrawCommand>)>, lines: Vec<(LineStyle, Vec<DrawCommand>)>,
current_fill: Option<(FillStyle, Vec<DrawCommand>)>, current_fill: Option<(FillStyle, Vec<DrawCommand>)>,
@ -20,10 +21,10 @@ pub struct Drawing {
impl Drawing { impl Drawing {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
render_handle: None, render_handle: Cell::new(None),
shape_bounds: BoundingBox::default(), shape_bounds: BoundingBox::default(),
edge_bounds: BoundingBox::default(), edge_bounds: BoundingBox::default(),
dirty: false, dirty: Cell::new(false),
fills: Vec::new(), fills: Vec::new(),
lines: Vec::new(), lines: Vec::new(),
current_fill: None, current_fill: None,
@ -48,7 +49,7 @@ impl Drawing {
)); ));
} }
self.dirty = true; self.dirty.set(true);
} }
pub fn clear(&mut self) { pub fn clear(&mut self) {
@ -58,7 +59,7 @@ impl Drawing {
self.lines.clear(); self.lines.clear();
self.edge_bounds = BoundingBox::default(); self.edge_bounds = BoundingBox::default();
self.shape_bounds = BoundingBox::default(); self.shape_bounds = BoundingBox::default();
self.dirty = true; self.dirty.set(true);
self.cursor = (Twips::zero(), Twips::zero()); self.cursor = (Twips::zero(), Twips::zero());
} }
@ -76,7 +77,7 @@ impl Drawing {
)); ));
} }
self.dirty = true; self.dirty.set(true);
} }
pub fn draw_command(&mut self, command: DrawCommand) { pub fn draw_command(&mut self, command: DrawCommand) {
@ -127,12 +128,12 @@ impl Drawing {
} }
} }
self.dirty = true; self.dirty.set(true);
} }
pub fn run_frame(&mut self, context: &mut UpdateContext) { pub fn render(&self, context: &mut RenderContext) {
if self.dirty { if self.dirty.get() {
self.dirty = false; self.dirty.set(false);
let mut paths = Vec::new(); let mut paths = Vec::new();
for (style, commands) in &self.fills { for (style, commands) in &self.fills {
@ -174,16 +175,15 @@ impl Drawing {
id: 0, id: 0,
}; };
if let Some(handle) = self.render_handle { if let Some(handle) = self.render_handle.get() {
context.renderer.replace_shape(shape, handle); context.renderer.replace_shape(shape, handle);
} else { } else {
self.render_handle = Some(context.renderer.register_shape(shape)); self.render_handle
} .set(Some(context.renderer.register_shape(shape)));
} }
} }
pub fn render(&self, context: &mut RenderContext) { if let Some(handle) = self.render_handle.get() {
if let Some(handle) = self.render_handle {
context context
.renderer .renderer
.render_shape(handle, context.transform_stack.transform()); .render_shape(handle, context.transform_stack.transform());