diff --git a/renderer/src/builder.rs b/renderer/src/builder.rs index fbadbb69..74a35e32 100644 --- a/renderer/src/builder.rs +++ b/renderer/src/builder.rs @@ -14,7 +14,7 @@ use crate::concurrent::executor::Executor; use crate::gpu::renderer::{BlendModeExt, MASK_TILES_ACROSS, MASK_TILES_DOWN}; use crate::gpu_data::{FillBatchPrimitive, RenderCommand, TexturePageId, Tile, TileBatch}; use crate::gpu_data::{TileBatchTexture, TileObjectPrimitive, TileVertex}; -use crate::options::{PreparedBuildOptions, RenderCommandListener}; +use crate::options::{PreparedBuildOptions, PreparedRenderTransform, RenderCommandListener}; use crate::paint::{PaintInfo, PaintMetadata, RenderTargetMetadata}; use crate::scene::{DisplayItem, Scene}; use crate::tile_map::DenseTileMap; @@ -117,6 +117,11 @@ impl<'a> SceneBuilder<'a> { needs_readable_framebuffer, }); + let render_transform = match self.built_options.transform { + PreparedRenderTransform::Transform2D(tr) => tr.inverse(), + _ => Transform2F::default() + }; + // Build paint data. let PaintInfo { render_commands, @@ -124,7 +129,7 @@ impl<'a> SceneBuilder<'a> { render_target_metadata, opacity_tile_page, opacity_tile_transform, - } = self.scene.build_paint_info(); + } = self.scene.build_paint_info(render_transform); for render_command in render_commands { self.listener.send(render_command); } diff --git a/renderer/src/paint.rs b/renderer/src/paint.rs index 5afa78bb..f64030da 100644 --- a/renderer/src/paint.rs +++ b/renderer/src/paint.rs @@ -202,7 +202,7 @@ impl Palette { id } - pub fn build_paint_info(&self) -> PaintInfo { + pub fn build_paint_info(&self, render_transform: Transform2F) -> PaintInfo { let mut allocator = TextureAllocator::new(); let (mut paint_metadata, mut render_target_metadata) = (vec![], vec![]); @@ -283,7 +283,7 @@ impl Palette { metadata.texture_transform = match paint { Paint::Color(_) => { let vector = rect_to_inset_uv(metadata.location.rect, texture_scale).origin(); - Transform2F { matrix: Matrix2x2F(F32x4::default()), vector } + Transform2F { matrix: Matrix2x2F(F32x4::default()), vector } * render_transform.inverse() } Paint::Gradient(Gradient { line: gradient_line, radii: None, .. }) => { let v0 = metadata.location.rect.to_f32().center().y() * texture_scale.y(); @@ -292,7 +292,7 @@ impl Palette { Transform2F { matrix: Matrix2x2F::row_major(d.x(), d.y(), 0.0, 0.0).scale(length_inv), vector: Vector2F::new(-p0.dot(d) * length_inv, v0), - } + } * render_transform } Paint::Gradient(Gradient { radii: Some(_), .. }) => { let texture_origin_uv = @@ -301,14 +301,14 @@ impl Palette { Transform2F { matrix: Matrix2x2F::from_scale(gradient_tile_scale), vector: texture_origin_uv, - } + } * render_transform } Paint::Pattern(Pattern { source: PatternSource::Image(_), transform, .. }) => { let texture_origin_uv = rect_to_uv(metadata.location.rect, texture_scale).origin(); Transform2F::from_translation(texture_origin_uv) * Transform2F::from_scale(texture_scale) * - transform.inverse() + transform.inverse() * render_transform } Paint::Pattern(Pattern { source: PatternSource::RenderTarget(_), @@ -320,7 +320,7 @@ impl Palette { texture_scale).lower_left(); Transform2F::from_translation(texture_origin_uv) * Transform2F::from_scale(texture_scale * vec2f(1.0, -1.0)) * - transform.inverse() + transform.inverse() * render_transform } } } diff --git a/renderer/src/scene.rs b/renderer/src/scene.rs index 47cfca94..c2782040 100644 --- a/renderer/src/scene.rs +++ b/renderer/src/scene.rs @@ -86,8 +86,8 @@ impl Scene { } #[inline] - pub fn build_paint_info(&self) -> PaintInfo { - self.palette.build_paint_info() + pub fn build_paint_info(&self, render_transform: Transform2F) -> PaintInfo { + self.palette.build_paint_info(render_transform) } #[allow(clippy::trivially_copy_pass_by_ref)]