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::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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)]
|
||||||
|
|
Loading…
Reference in New Issue