Simplify rendering interface

Instead of passing through a generic transformation matrix, let's just
pass through what we actually use: a translation point
This commit is contained in:
Simon Hausmann 2020-12-18 15:19:30 +01:00
parent d4f603246c
commit 607fecdb18
3 changed files with 11 additions and 14 deletions

View file

@ -33,7 +33,6 @@ use crate::{
};
use auto_enums::auto_enum;
use cgmath::Matrix4;
use const_field_offset::FieldOffsets;
use core::pin::Pin;
use sixtyfps_corelib_macros::*;
@ -386,7 +385,7 @@ pub trait Frame {
fn render_primitive(
&mut self,
primitive: &Self::LowLevelRenderingPrimitive,
transform: &Matrix4<f32>,
translation: Point,
variables: RenderingVariables,
) -> Vec<Self::LowLevelRenderingPrimitive>;
}

View file

@ -18,7 +18,6 @@ use crate::component::ComponentRc;
use crate::eventloop::ComponentWindow;
use crate::item_tree::ItemVisitorResult;
use crate::slice::Slice;
use cgmath::{Matrix4, Vector3};
use std::cell::{Cell, RefCell};
/// This structure must be present in items that are Rendered and contains information.
@ -88,7 +87,6 @@ pub(crate) fn render_component_items<Backend: GraphicsBackend>(
window: &std::rc::Rc<GraphicsWindow<Backend>>,
origin: crate::graphics::Point,
) {
let transform = Matrix4::from_translation(Vector3::new(origin.x, origin.y, 0.));
let window = ComponentWindow::new(window.clone());
let frame = RefCell::new(frame);
@ -96,10 +94,9 @@ pub(crate) fn render_component_items<Backend: GraphicsBackend>(
crate::item_tree::visit_items_with_post_visit(
component,
crate::item_tree::TraversalOrder::BackToFront,
|_, item, _, transform| {
|_, item, _, translation| {
let origin = item.as_ref().geometry().origin;
let transform =
transform * Matrix4::from_translation(Vector3::new(origin.x, origin.y, 0.));
let translation = *translation + euclid::Vector2D::new(origin.x, origin.y);
let cached_rendering_data = item.cached_rendering_data_offset();
let cleanup_primitives = if cached_rendering_data.cache_ok.get() {
@ -108,21 +105,21 @@ pub(crate) fn render_component_items<Backend: GraphicsBackend>(
&cache.get(cached_rendering_data.cache_index.get()).unwrap().primitive;
frame.borrow_mut().render_primitive(
&primitive,
&transform,
translation,
item.as_ref().rendering_variables(&window),
)
} else {
Vec::new()
};
(ItemVisitorResult::Continue(transform), (transform, cleanup_primitives))
(ItemVisitorResult::Continue(translation), (translation, cleanup_primitives))
},
|_, _, (transform, cleanup_primitives)| {
|_, _, (translation, cleanup_primitives)| {
cleanup_primitives.into_iter().for_each(|primitive| {
frame.borrow_mut().render_primitive(&primitive, &transform, Default::default());
frame.borrow_mut().render_primitive(&primitive, translation, Default::default());
})
},
transform,
origin,
);
}

View file

@ -820,10 +820,11 @@ impl GraphicsFrame for GLFrame {
fn render_primitive(
&mut self,
primitive: &OpaqueRenderingPrimitive,
transform: &Matrix4<f32>,
translation: Point,
variables: RenderingVariables,
) -> Vec<OpaqueRenderingPrimitive> {
let mut matrix = self.root_matrix * transform;
let mut matrix = self.root_matrix
* Matrix4::from_translation(cgmath::Vector3::new(translation.x, translation.y, 0.));
if let RenderingVariables::Text { translate, .. } = &variables {
matrix = matrix