render: Add WebGlRenderBackend::draw_quad
Moving draw_rect to draw_quad prevents code duplication when methods related to drawing lines are added.
This commit is contained in:
parent
fe08638d26
commit
07df84a486
|
@ -13,6 +13,7 @@ use ruffle_render::bitmap::{
|
||||||
};
|
};
|
||||||
use ruffle_render::commands::{CommandHandler, CommandList, RenderBlendMode};
|
use ruffle_render::commands::{CommandHandler, CommandList, RenderBlendMode};
|
||||||
use ruffle_render::error::Error as BitmapError;
|
use ruffle_render::error::Error as BitmapError;
|
||||||
|
use ruffle_render::matrix::Matrix;
|
||||||
use ruffle_render::quality::StageQuality;
|
use ruffle_render::quality::StageQuality;
|
||||||
use ruffle_render::shape_utils::{DistilledShape, GradientType};
|
use ruffle_render::shape_utils::{DistilledShape, GradientType};
|
||||||
use ruffle_render::tessellator::{
|
use ruffle_render::tessellator::{
|
||||||
|
@ -913,6 +914,64 @@ impl WebGlRenderBackend {
|
||||||
self.apply_blend_mode(current.clone());
|
self.apply_blend_mode(current.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn draw_quad(&mut self, color: Color, matrix: Matrix) {
|
||||||
|
let world_matrix = [
|
||||||
|
[matrix.a, matrix.b, 0.0, 0.0],
|
||||||
|
[matrix.c, matrix.d, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 1.0, 0.0],
|
||||||
|
[
|
||||||
|
matrix.tx.to_pixels() as f32,
|
||||||
|
matrix.ty.to_pixels() as f32,
|
||||||
|
0.0,
|
||||||
|
1.0,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
let mult_color = [
|
||||||
|
color.r as f32 * 255.0,
|
||||||
|
color.g as f32 * 255.0,
|
||||||
|
color.b as f32 * 255.0,
|
||||||
|
color.a as f32 * 255.0,
|
||||||
|
];
|
||||||
|
let add_color = [0.0; 4];
|
||||||
|
|
||||||
|
self.set_stencil_state();
|
||||||
|
|
||||||
|
let program = &self.color_program;
|
||||||
|
|
||||||
|
// Set common render state, while minimizing unnecessary state changes.
|
||||||
|
// TODO: Using designated layout specifiers in WebGL2/OpenGL ES 3, we could guarantee that uniforms
|
||||||
|
// are in the same location between shaders, and avoid changing them unless necessary.
|
||||||
|
if program as *const ShaderProgram != self.active_program {
|
||||||
|
self.gl.use_program(Some(&program.program));
|
||||||
|
self.active_program = program as *const ShaderProgram;
|
||||||
|
|
||||||
|
program.uniform_matrix4fv(&self.gl, ShaderUniform::ViewMatrix, &self.view_matrix);
|
||||||
|
|
||||||
|
self.mult_color = None;
|
||||||
|
self.add_color = None;
|
||||||
|
};
|
||||||
|
|
||||||
|
self.color_program
|
||||||
|
.uniform_matrix4fv(&self.gl, ShaderUniform::WorldMatrix, &world_matrix);
|
||||||
|
if Some(mult_color) != self.mult_color {
|
||||||
|
self.color_program
|
||||||
|
.uniform4fv(&self.gl, ShaderUniform::MultColor, &mult_color);
|
||||||
|
self.mult_color = Some(mult_color);
|
||||||
|
}
|
||||||
|
if Some(add_color) != self.add_color {
|
||||||
|
self.color_program
|
||||||
|
.uniform4fv(&self.gl, ShaderUniform::AddColor, &add_color);
|
||||||
|
self.add_color = Some(add_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
let quad = &self.color_quad_draws;
|
||||||
|
self.bind_vertex_array(Some(&quad[0].vao));
|
||||||
|
|
||||||
|
self.gl
|
||||||
|
.draw_elements_with_i32(Gl::TRIANGLES, quad[0].num_indices, Gl::UNSIGNED_INT, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn same_blend_mode(first: Option<&RenderBlendMode>, second: &RenderBlendMode) -> bool {
|
fn same_blend_mode(first: Option<&RenderBlendMode>, second: &RenderBlendMode) -> bool {
|
||||||
|
@ -1207,7 +1266,7 @@ impl CommandHandler for WebGlRenderBackend {
|
||||||
// Scale the quad to the bitmap's dimensions.
|
// Scale the quad to the bitmap's dimensions.
|
||||||
let mut matrix = transform.matrix;
|
let mut matrix = transform.matrix;
|
||||||
pixel_snapping.apply(&mut matrix);
|
pixel_snapping.apply(&mut matrix);
|
||||||
matrix *= ruffle_render::matrix::Matrix::scale(entry.width as f32, entry.height as f32);
|
matrix *= Matrix::scale(entry.width as f32, entry.height as f32);
|
||||||
|
|
||||||
let world_matrix = [
|
let world_matrix = [
|
||||||
[matrix.a, matrix.b, 0.0, 0.0],
|
[matrix.a, matrix.b, 0.0, 0.0],
|
||||||
|
@ -1432,62 +1491,8 @@ impl CommandHandler for WebGlRenderBackend {
|
||||||
panic!("Stage3D should not have been created on WebGL backend")
|
panic!("Stage3D should not have been created on WebGL backend")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw_rect(&mut self, color: Color, matrix: ruffle_render::matrix::Matrix) {
|
fn draw_rect(&mut self, color: Color, matrix: Matrix) {
|
||||||
let world_matrix = [
|
self.draw_quad(color, matrix);
|
||||||
[matrix.a, matrix.b, 0.0, 0.0],
|
|
||||||
[matrix.c, matrix.d, 0.0, 0.0],
|
|
||||||
[0.0, 0.0, 1.0, 0.0],
|
|
||||||
[
|
|
||||||
matrix.tx.to_pixels() as f32,
|
|
||||||
matrix.ty.to_pixels() as f32,
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
let mult_color = [
|
|
||||||
color.r as f32 * 255.0,
|
|
||||||
color.g as f32 * 255.0,
|
|
||||||
color.b as f32 * 255.0,
|
|
||||||
color.a as f32 * 255.0,
|
|
||||||
];
|
|
||||||
let add_color = [0.0; 4];
|
|
||||||
|
|
||||||
self.set_stencil_state();
|
|
||||||
|
|
||||||
let program = &self.color_program;
|
|
||||||
|
|
||||||
// Set common render state, while minimizing unnecessary state changes.
|
|
||||||
// TODO: Using designated layout specifiers in WebGL2/OpenGL ES 3, we could guarantee that uniforms
|
|
||||||
// are in the same location between shaders, and avoid changing them unless necessary.
|
|
||||||
if program as *const ShaderProgram != self.active_program {
|
|
||||||
self.gl.use_program(Some(&program.program));
|
|
||||||
self.active_program = program as *const ShaderProgram;
|
|
||||||
|
|
||||||
program.uniform_matrix4fv(&self.gl, ShaderUniform::ViewMatrix, &self.view_matrix);
|
|
||||||
|
|
||||||
self.mult_color = None;
|
|
||||||
self.add_color = None;
|
|
||||||
};
|
|
||||||
|
|
||||||
self.color_program
|
|
||||||
.uniform_matrix4fv(&self.gl, ShaderUniform::WorldMatrix, &world_matrix);
|
|
||||||
if Some(mult_color) != self.mult_color {
|
|
||||||
self.color_program
|
|
||||||
.uniform4fv(&self.gl, ShaderUniform::MultColor, &mult_color);
|
|
||||||
self.mult_color = Some(mult_color);
|
|
||||||
}
|
|
||||||
if Some(add_color) != self.add_color {
|
|
||||||
self.color_program
|
|
||||||
.uniform4fv(&self.gl, ShaderUniform::AddColor, &add_color);
|
|
||||||
self.add_color = Some(add_color);
|
|
||||||
}
|
|
||||||
|
|
||||||
let quad = &self.color_quad_draws;
|
|
||||||
self.bind_vertex_array(Some(&quad[0].vao));
|
|
||||||
|
|
||||||
self.gl
|
|
||||||
.draw_elements_with_i32(Gl::TRIANGLES, quad[0].num_indices, Gl::UNSIGNED_INT, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_mask(&mut self) {
|
fn push_mask(&mut self) {
|
||||||
|
|
Loading…
Reference in New Issue