Transform paints by the render transform
This commit is contained in:
parent
8f2fabbc47
commit
29c6a2e428
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)]
|
||||
|
|
Loading…
Reference in New Issue