Transform paints by the render transform

This commit is contained in:
Sebastian K 2020-04-02 11:17:03 -07:00 committed by Patrick Walton
parent 8f2fabbc47
commit 29c6a2e428
3 changed files with 15 additions and 10 deletions

View File

@ -14,7 +14,7 @@ use crate::concurrent::executor::Executor;
use crate::gpu::renderer::{BlendModeExt, MASK_TILES_ACROSS, MASK_TILES_DOWN}; use crate::gpu::renderer::{BlendModeExt, MASK_TILES_ACROSS, MASK_TILES_DOWN};
use crate::gpu_data::{FillBatchPrimitive, RenderCommand, TexturePageId, Tile, TileBatch}; use crate::gpu_data::{FillBatchPrimitive, RenderCommand, TexturePageId, Tile, TileBatch};
use crate::gpu_data::{TileBatchTexture, TileObjectPrimitive, TileVertex}; 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::paint::{PaintInfo, PaintMetadata, RenderTargetMetadata};
use crate::scene::{DisplayItem, Scene}; use crate::scene::{DisplayItem, Scene};
use crate::tile_map::DenseTileMap; use crate::tile_map::DenseTileMap;
@ -117,6 +117,11 @@ impl<'a> SceneBuilder<'a> {
needs_readable_framebuffer, needs_readable_framebuffer,
}); });
let render_transform = match self.built_options.transform {
PreparedRenderTransform::Transform2D(tr) => tr.inverse(),
_ => Transform2F::default()
};
// Build paint data. // Build paint data.
let PaintInfo { let PaintInfo {
render_commands, render_commands,
@ -124,7 +129,7 @@ impl<'a> SceneBuilder<'a> {
render_target_metadata, render_target_metadata,
opacity_tile_page, opacity_tile_page,
opacity_tile_transform, opacity_tile_transform,
} = self.scene.build_paint_info(); } = self.scene.build_paint_info(render_transform);
for render_command in render_commands { for render_command in render_commands {
self.listener.send(render_command); self.listener.send(render_command);
} }

View File

@ -202,7 +202,7 @@ impl Palette {
id 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 allocator = TextureAllocator::new();
let (mut paint_metadata, mut render_target_metadata) = (vec![], vec![]); let (mut paint_metadata, mut render_target_metadata) = (vec![], vec![]);
@ -283,7 +283,7 @@ impl Palette {
metadata.texture_transform = match paint { metadata.texture_transform = match paint {
Paint::Color(_) => { Paint::Color(_) => {
let vector = rect_to_inset_uv(metadata.location.rect, texture_scale).origin(); 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, .. }) => { Paint::Gradient(Gradient { line: gradient_line, radii: None, .. }) => {
let v0 = metadata.location.rect.to_f32().center().y() * texture_scale.y(); let v0 = metadata.location.rect.to_f32().center().y() * texture_scale.y();
@ -292,7 +292,7 @@ impl Palette {
Transform2F { Transform2F {
matrix: Matrix2x2F::row_major(d.x(), d.y(), 0.0, 0.0).scale(length_inv), matrix: Matrix2x2F::row_major(d.x(), d.y(), 0.0, 0.0).scale(length_inv),
vector: Vector2F::new(-p0.dot(d) * length_inv, v0), vector: Vector2F::new(-p0.dot(d) * length_inv, v0),
} } * render_transform
} }
Paint::Gradient(Gradient { radii: Some(_), .. }) => { Paint::Gradient(Gradient { radii: Some(_), .. }) => {
let texture_origin_uv = let texture_origin_uv =
@ -301,14 +301,14 @@ impl Palette {
Transform2F { Transform2F {
matrix: Matrix2x2F::from_scale(gradient_tile_scale), matrix: Matrix2x2F::from_scale(gradient_tile_scale),
vector: texture_origin_uv, vector: texture_origin_uv,
} } * render_transform
} }
Paint::Pattern(Pattern { source: PatternSource::Image(_), transform, .. }) => { Paint::Pattern(Pattern { source: PatternSource::Image(_), transform, .. }) => {
let texture_origin_uv = let texture_origin_uv =
rect_to_uv(metadata.location.rect, texture_scale).origin(); rect_to_uv(metadata.location.rect, texture_scale).origin();
Transform2F::from_translation(texture_origin_uv) * Transform2F::from_translation(texture_origin_uv) *
Transform2F::from_scale(texture_scale) * Transform2F::from_scale(texture_scale) *
transform.inverse() transform.inverse() * render_transform
} }
Paint::Pattern(Pattern { Paint::Pattern(Pattern {
source: PatternSource::RenderTarget(_), source: PatternSource::RenderTarget(_),
@ -320,7 +320,7 @@ impl Palette {
texture_scale).lower_left(); texture_scale).lower_left();
Transform2F::from_translation(texture_origin_uv) * Transform2F::from_translation(texture_origin_uv) *
Transform2F::from_scale(texture_scale * vec2f(1.0, -1.0)) * Transform2F::from_scale(texture_scale * vec2f(1.0, -1.0)) *
transform.inverse() transform.inverse() * render_transform
} }
} }
} }

View File

@ -86,8 +86,8 @@ impl Scene {
} }
#[inline] #[inline]
pub fn build_paint_info(&self) -> PaintInfo { pub fn build_paint_info(&self, render_transform: Transform2F) -> PaintInfo {
self.palette.build_paint_info() self.palette.build_paint_info(render_transform)
} }
#[allow(clippy::trivially_copy_pass_by_ref)] #[allow(clippy::trivially_copy_pass_by_ref)]