render: Move some loose utility functions to utils.rs in wgpu renderer
This commit is contained in:
parent
f4abf4b705
commit
9599b2d09f
|
@ -1,4 +1,3 @@
|
|||
use lyon::path::Path;
|
||||
use lyon::tessellation::{
|
||||
self,
|
||||
geometry_builder::{BuffersBuilder, FillVertexConstructor, VertexBuffers},
|
||||
|
@ -8,9 +7,9 @@ use ruffle_core::backend::render::swf::{self, FillStyle};
|
|||
use ruffle_core::backend::render::{
|
||||
BitmapHandle, BitmapInfo, Color, Letterbox, RenderBackend, ShapeHandle, Transform,
|
||||
};
|
||||
use ruffle_core::shape_utils::{DrawCommand, DrawPath};
|
||||
use ruffle_core::shape_utils::DrawPath;
|
||||
use std::convert::TryInto;
|
||||
use swf::{CharacterId, DefineBitsLossless, Glyph, Shape, Twips};
|
||||
use swf::{CharacterId, DefineBitsLossless, Glyph, Shape};
|
||||
|
||||
use bytemuck::{Pod, Zeroable};
|
||||
use futures::executor::block_on;
|
||||
|
@ -18,7 +17,9 @@ use raw_window_handle::HasRawWindowHandle;
|
|||
|
||||
use crate::pipelines::Pipelines;
|
||||
use crate::shapes::{Draw, DrawType, GradientUniforms, IncompleteDrawType, Mesh};
|
||||
use crate::utils::create_buffer_with_data;
|
||||
use crate::utils::{
|
||||
create_buffer_with_data, ruffle_path_to_lyon_path, swf_bitmap_to_gl_matrix, swf_to_gl_matrix,
|
||||
};
|
||||
|
||||
type Error = Box<dyn std::error::Error>;
|
||||
|
||||
|
@ -1323,33 +1324,6 @@ impl RenderBackend for WGPURenderBackend {
|
|||
}
|
||||
}
|
||||
|
||||
fn point(x: Twips, y: Twips) -> lyon::math::Point {
|
||||
lyon::math::Point::new(x.to_pixels() as f32, y.to_pixels() as f32)
|
||||
}
|
||||
|
||||
fn ruffle_path_to_lyon_path(commands: Vec<DrawCommand>, is_closed: bool) -> Path {
|
||||
let mut builder = Path::builder();
|
||||
for cmd in commands {
|
||||
match cmd {
|
||||
DrawCommand::MoveTo { x, y } => {
|
||||
builder.move_to(point(x, y));
|
||||
}
|
||||
DrawCommand::LineTo { x, y } => {
|
||||
builder.line_to(point(x, y));
|
||||
}
|
||||
DrawCommand::CurveTo { x1, y1, x2, y2 } => {
|
||||
builder.quadratic_bezier_to(point(x1, y1), point(x2, y2));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if is_closed {
|
||||
builder.close();
|
||||
}
|
||||
|
||||
builder.build()
|
||||
}
|
||||
|
||||
fn create_quad_buffers(device: &wgpu::Device) -> (wgpu::Buffer, wgpu::Buffer, wgpu::Buffer) {
|
||||
let vertices = [
|
||||
GPUVertex {
|
||||
|
@ -1409,66 +1383,6 @@ struct Texture {
|
|||
texture: wgpu::Texture,
|
||||
}
|
||||
|
||||
#[allow(clippy::many_single_char_names)]
|
||||
fn swf_to_gl_matrix(m: swf::Matrix) -> [[f32; 4]; 4] {
|
||||
let tx = m.translate_x.get() as f32;
|
||||
let ty = m.translate_y.get() as f32;
|
||||
let det = m.scale_x * m.scale_y - m.rotate_skew_1 * m.rotate_skew_0;
|
||||
let mut a = m.scale_y / det;
|
||||
let mut b = -m.rotate_skew_1 / det;
|
||||
let mut c = -(tx * m.scale_y - m.rotate_skew_1 * ty) / det;
|
||||
let mut d = -m.rotate_skew_0 / det;
|
||||
let mut e = m.scale_x / det;
|
||||
let mut f = (tx * m.rotate_skew_0 - m.scale_x * ty) / det;
|
||||
|
||||
a *= 20.0 / 32768.0;
|
||||
b *= 20.0 / 32768.0;
|
||||
d *= 20.0 / 32768.0;
|
||||
e *= 20.0 / 32768.0;
|
||||
|
||||
c /= 32768.0;
|
||||
f /= 32768.0;
|
||||
c += 0.5;
|
||||
f += 0.5;
|
||||
[
|
||||
[a, d, 0.0, 0.0],
|
||||
[b, e, 0., 0.0],
|
||||
[c, f, 1.0, 0.0],
|
||||
[0.0, 0.0, 0.0, 0.0],
|
||||
]
|
||||
}
|
||||
|
||||
#[allow(clippy::many_single_char_names)]
|
||||
fn swf_bitmap_to_gl_matrix(m: swf::Matrix, bitmap_width: u32, bitmap_height: u32) -> [[f32; 4]; 4] {
|
||||
let bitmap_width = bitmap_width as f32;
|
||||
let bitmap_height = bitmap_height as f32;
|
||||
|
||||
let tx = m.translate_x.get() as f32;
|
||||
let ty = m.translate_y.get() as f32;
|
||||
let det = m.scale_x * m.scale_y - m.rotate_skew_1 * m.rotate_skew_0;
|
||||
let mut a = m.scale_y / det;
|
||||
let mut b = -m.rotate_skew_1 / det;
|
||||
let mut c = -(tx * m.scale_y - m.rotate_skew_1 * ty) / det;
|
||||
let mut d = -m.rotate_skew_0 / det;
|
||||
let mut e = m.scale_x / det;
|
||||
let mut f = (tx * m.rotate_skew_0 - m.scale_x * ty) / det;
|
||||
|
||||
a *= 20.0 / bitmap_width;
|
||||
b *= 20.0 / bitmap_width;
|
||||
d *= 20.0 / bitmap_height;
|
||||
e *= 20.0 / bitmap_height;
|
||||
|
||||
c /= bitmap_width;
|
||||
f /= bitmap_height;
|
||||
|
||||
[
|
||||
[a, d, 0.0, 0.0],
|
||||
[b, e, 0.0, 0.0],
|
||||
[c, f, 1.0, 0.0],
|
||||
[0.0, 0.0, 0.0, 0.0],
|
||||
]
|
||||
}
|
||||
|
||||
struct RuffleVertexCtor {
|
||||
color: [f32; 4],
|
||||
}
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
use lyon::lyon_algorithms::path::Path;
|
||||
use ruffle_core::shape_utils::DrawCommand;
|
||||
use ruffle_core::swf;
|
||||
use swf::Twips;
|
||||
macro_rules! create_debug_label {
|
||||
($($arg:tt)*) => (
|
||||
if cfg!(feature = "render_debug_labels") {
|
||||
|
@ -22,3 +26,94 @@ pub fn create_buffer_with_data(
|
|||
mapped.data.copy_from_slice(data);
|
||||
mapped.finish()
|
||||
}
|
||||
|
||||
pub fn point(x: Twips, y: Twips) -> lyon::math::Point {
|
||||
lyon::math::Point::new(x.to_pixels() as f32, y.to_pixels() as f32)
|
||||
}
|
||||
|
||||
pub fn ruffle_path_to_lyon_path(commands: Vec<DrawCommand>, is_closed: bool) -> Path {
|
||||
let mut builder = Path::builder();
|
||||
for cmd in commands {
|
||||
match cmd {
|
||||
DrawCommand::MoveTo { x, y } => {
|
||||
builder.move_to(point(x, y));
|
||||
}
|
||||
DrawCommand::LineTo { x, y } => {
|
||||
builder.line_to(point(x, y));
|
||||
}
|
||||
DrawCommand::CurveTo { x1, y1, x2, y2 } => {
|
||||
builder.quadratic_bezier_to(point(x1, y1), point(x2, y2));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if is_closed {
|
||||
builder.close();
|
||||
}
|
||||
|
||||
builder.build()
|
||||
}
|
||||
|
||||
#[allow(clippy::many_single_char_names)]
|
||||
pub fn swf_to_gl_matrix(m: swf::Matrix) -> [[f32; 4]; 4] {
|
||||
let tx = m.translate_x.get() as f32;
|
||||
let ty = m.translate_y.get() as f32;
|
||||
let det = m.scale_x * m.scale_y - m.rotate_skew_1 * m.rotate_skew_0;
|
||||
let mut a = m.scale_y / det;
|
||||
let mut b = -m.rotate_skew_1 / det;
|
||||
let mut c = -(tx * m.scale_y - m.rotate_skew_1 * ty) / det;
|
||||
let mut d = -m.rotate_skew_0 / det;
|
||||
let mut e = m.scale_x / det;
|
||||
let mut f = (tx * m.rotate_skew_0 - m.scale_x * ty) / det;
|
||||
|
||||
a *= 20.0 / 32768.0;
|
||||
b *= 20.0 / 32768.0;
|
||||
d *= 20.0 / 32768.0;
|
||||
e *= 20.0 / 32768.0;
|
||||
|
||||
c /= 32768.0;
|
||||
f /= 32768.0;
|
||||
c += 0.5;
|
||||
f += 0.5;
|
||||
[
|
||||
[a, d, 0.0, 0.0],
|
||||
[b, e, 0., 0.0],
|
||||
[c, f, 1.0, 0.0],
|
||||
[0.0, 0.0, 0.0, 0.0],
|
||||
]
|
||||
}
|
||||
|
||||
#[allow(clippy::many_single_char_names)]
|
||||
pub fn swf_bitmap_to_gl_matrix(
|
||||
m: swf::Matrix,
|
||||
bitmap_width: u32,
|
||||
bitmap_height: u32,
|
||||
) -> [[f32; 4]; 4] {
|
||||
let bitmap_width = bitmap_width as f32;
|
||||
let bitmap_height = bitmap_height as f32;
|
||||
|
||||
let tx = m.translate_x.get() as f32;
|
||||
let ty = m.translate_y.get() as f32;
|
||||
let det = m.scale_x * m.scale_y - m.rotate_skew_1 * m.rotate_skew_0;
|
||||
let mut a = m.scale_y / det;
|
||||
let mut b = -m.rotate_skew_1 / det;
|
||||
let mut c = -(tx * m.scale_y - m.rotate_skew_1 * ty) / det;
|
||||
let mut d = -m.rotate_skew_0 / det;
|
||||
let mut e = m.scale_x / det;
|
||||
let mut f = (tx * m.rotate_skew_0 - m.scale_x * ty) / det;
|
||||
|
||||
a *= 20.0 / bitmap_width;
|
||||
b *= 20.0 / bitmap_width;
|
||||
d *= 20.0 / bitmap_height;
|
||||
e *= 20.0 / bitmap_height;
|
||||
|
||||
c /= bitmap_width;
|
||||
f /= bitmap_height;
|
||||
|
||||
[
|
||||
[a, d, 0.0, 0.0],
|
||||
[b, e, 0.0, 0.0],
|
||||
[c, f, 1.0, 0.0],
|
||||
[0.0, 0.0, 0.0, 0.0],
|
||||
]
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue