From b606ef94aeb07d869e0e9ce898b4aeaa6bf2dbeb Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 8 Apr 2021 17:24:24 +0300 Subject: [PATCH] slightly improved renderer performance --- README.md | 3 +- examples/sound.rs | 2 +- src/renderer/batch.rs | 11 +++-- src/renderer/blur.rs | 4 +- src/renderer/debug_renderer.rs | 2 +- src/renderer/deferred_light_renderer.rs | 52 ++++++++++++++---------- src/renderer/forward_renderer.rs | 4 +- src/renderer/framework/gpu_program.rs | 23 ++++++----- src/renderer/framework/gpu_texture.rs | 7 ++-- src/renderer/framework/state.rs | 6 +-- src/renderer/fxaa.rs | 9 ++-- src/renderer/gbuffer.rs | 30 +++++--------- src/renderer/light_volume.rs | 26 ++++++------ src/renderer/mod.rs | 4 +- src/renderer/particle_system_renderer.rs | 21 ++++++---- src/renderer/shadow_map_renderer.rs | 32 +++++---------- src/renderer/sprite_renderer.rs | 8 ++-- src/renderer/ssao.rs | 10 ++--- src/renderer/ui_renderer.rs | 40 +++++++----------- 19 files changed, 137 insertions(+), 157 deletions(-) diff --git a/README.md b/README.md index a8d33852c..83ccbfc1a 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ [![Discord](https://img.shields.io/discord/756573453561102427)](https://discord.gg/xENF5Uh) [![Lines of code](https://tokei.rs/b1/github/mrDIMAS/rg3d)](https://github.com/mrDIMAS/rg3d) -A feature-rich 3D game engine written in Rust with a scene editor. Most powerful 3D game engine written in Rust so far. +A feature-rich, general purpose 3D game engine written in Rust with a scene editor. Most powerful +3D game engine written in Rust so far. ## Support diff --git a/examples/sound.rs b/examples/sound.rs index 19691fb11..5fadecc56 100644 --- a/examples/sound.rs +++ b/examples/sound.rs @@ -222,7 +222,7 @@ fn main() { game.engine.render(fixed_timestep).unwrap(); } Event::LoopDestroyed => { - rg3d::core::profiler::print(); + println!("{:?}", rg3d::core::profiler::print()); } Event::WindowEvent { event, .. } => { match event { diff --git a/src/renderer/batch.rs b/src/renderer/batch.rs index 7a1f45745..1c48f355c 100644 --- a/src/renderer/batch.rs +++ b/src/renderer/batch.rs @@ -1,7 +1,5 @@ -use crate::core::arrayvec::ArrayVec; -use crate::scene::mesh::RenderPath; use crate::{ - core::{algebra::Matrix4, color::Color, pool::Handle}, + core::{algebra::Matrix4, arrayvec::ArrayVec, color::Color, pool::Handle, scope_profile}, renderer::{ error::RendererError, framework::gpu_texture::{ @@ -11,15 +9,14 @@ use crate::{ surface::SurfaceSharedData, TextureCache, }, - scene::{graph::Graph, node::Node}, + scene::{graph::Graph, mesh::RenderPath, node::Node}, }; -use std::sync::RwLock; use std::{ cell::RefCell, collections::HashMap, fmt::{Debug, Formatter}, rc::Rc, - sync::Arc, + sync::{Arc, RwLock}, }; pub const BONE_MATRICES_COUNT: usize = 64; @@ -85,6 +82,8 @@ impl BatchStorage { specular_dummy: Rc>, texture_cache: &mut TextureCache, ) { + scope_profile!(); + for batch in self.batches.iter_mut() { batch.instances.clear(); self.buffers.push(std::mem::take(&mut batch.instances)); diff --git a/src/renderer/blur.rs b/src/renderer/blur.rs index 7328027a3..79b0ce3b1 100644 --- a/src/renderer/blur.rs +++ b/src/renderer/blur.rs @@ -123,7 +123,7 @@ impl Blur { ( self.shader.world_view_projection_matrix, UniformValue::Matrix4( - Matrix4::new_orthographic( + &(Matrix4::new_orthographic( 0.0, viewport.w() as f32, viewport.h() as f32, @@ -134,7 +134,7 @@ impl Blur { viewport.w() as f32, viewport.h() as f32, 0.0, - )), + ))), ), ), ( diff --git a/src/renderer/debug_renderer.rs b/src/renderer/debug_renderer.rs index 95097d1b5..b36f3507c 100644 --- a/src/renderer/debug_renderer.rs +++ b/src/renderer/debug_renderer.rs @@ -128,7 +128,7 @@ impl DebugRenderer { }, &[( self.shader.wvp_matrix, - UniformValue::Matrix4(camera.view_projection_matrix()), + UniformValue::Matrix4(&camera.view_projection_matrix()), )], ); diff --git a/src/renderer/deferred_light_renderer.rs b/src/renderer/deferred_light_renderer.rs index e423c7913..77de5213d 100644 --- a/src/renderer/deferred_light_renderer.rs +++ b/src/renderer/deferred_light_renderer.rs @@ -421,7 +421,9 @@ impl DeferredLightRenderer { let projection_matrix = camera.projection_matrix(); let view_projection = camera.view_projection_matrix(); + let inv_projection = projection_matrix.try_inverse().unwrap_or_default(); let inv_view_projection = view_projection.try_inverse().unwrap_or_default(); + let camera_global_position = camera.global_position(); // Fill SSAO map. if settings.use_ssao { @@ -483,7 +485,7 @@ impl DeferredLightRenderer { ), ( self.flat_shader.wvp_matrix, - UniformValue::Matrix4(view_projection * wvp), + UniformValue::Matrix4(&(view_projection * wvp)), ), ], offset: face * 2, @@ -515,7 +517,7 @@ impl DeferredLightRenderer { &[ ( self.ambient_light_shader.wvp_matrix, - UniformValue::Matrix4(frame_matrix), + UniformValue::Matrix4(&frame_matrix), ), ( self.ambient_light_shader.ambient_color, @@ -699,9 +701,9 @@ impl DeferredLightRenderer { &[( self.flat_shader.wvp_matrix, UniformValue::Matrix4( - view_projection + &(view_projection * Matrix4::new_translation(&light_position) - * Matrix4::new_nonuniform_scaling(&light_radius_vec), + * Matrix4::new_nonuniform_scaling(&light_radius_vec)), ), )], ); @@ -732,9 +734,9 @@ impl DeferredLightRenderer { &[( self.flat_shader.wvp_matrix, UniformValue::Matrix4( - view_projection + &(view_projection * Matrix4::new_translation(&light_position) - * Matrix4::new_nonuniform_scaling(&light_radius_vec), + * Matrix4::new_nonuniform_scaling(&light_radius_vec)), ), )], ); @@ -775,21 +777,24 @@ impl DeferredLightRenderer { (shader.shadows_enabled, UniformValue::Bool(shadows_enabled)), ( shader.light_view_proj_matrix, - UniformValue::Matrix4(light_view_projection), + UniformValue::Matrix4(&light_view_projection), ), ( shader.soft_shadows, UniformValue::Bool(settings.spot_soft_shadows), ), - (shader.light_position, UniformValue::Vector3(light_position)), + ( + shader.light_position, + UniformValue::Vector3(&light_position), + ), ( shader.light_direction, - UniformValue::Vector3(emit_direction), + UniformValue::Vector3(&emit_direction), ), (shader.light_radius, UniformValue::Float(light_radius)), ( shader.inv_view_proj_matrix, - UniformValue::Matrix4(inv_view_projection), + UniformValue::Matrix4(&inv_view_projection), ), (shader.light_color, UniformValue::Color(light.color())), ( @@ -800,7 +805,7 @@ impl DeferredLightRenderer { shader.half_cone_angle_cos, UniformValue::Float((spot_light.full_cone_angle() * 0.5).cos()), ), - (shader.wvp_matrix, UniformValue::Matrix4(frame_matrix)), + (shader.wvp_matrix, UniformValue::Matrix4(&frame_matrix)), ( shader.shadow_map_inv_size, UniformValue::Float( @@ -810,7 +815,7 @@ impl DeferredLightRenderer { ), ( shader.camera_position, - UniformValue::Vector3(camera.global_position()), + UniformValue::Vector3(&camera_global_position), ), ( shader.depth_sampler, @@ -876,17 +881,20 @@ impl DeferredLightRenderer { shader.soft_shadows, UniformValue::Bool(settings.point_soft_shadows), ), - (shader.light_position, UniformValue::Vector3(light_position)), + ( + shader.light_position, + UniformValue::Vector3(&light_position), + ), (shader.light_radius, UniformValue::Float(light_radius)), ( shader.inv_view_proj_matrix, - UniformValue::Matrix4(inv_view_projection), + UniformValue::Matrix4(&inv_view_projection), ), (shader.light_color, UniformValue::Color(light.color())), - (shader.wvp_matrix, UniformValue::Matrix4(frame_matrix)), + (shader.wvp_matrix, UniformValue::Matrix4(&frame_matrix)), ( shader.camera_position, - UniformValue::Vector3(camera.global_position()), + UniformValue::Vector3(&camera_global_position), ), ( shader.depth_sampler, @@ -941,17 +949,17 @@ impl DeferredLightRenderer { let uniforms = [ ( shader.light_direction, - UniformValue::Vector3(emit_direction), + UniformValue::Vector3(&emit_direction), ), ( shader.inv_view_proj_matrix, - UniformValue::Matrix4(inv_view_projection), + UniformValue::Matrix4(&inv_view_projection), ), (shader.light_color, UniformValue::Color(light.color())), - (shader.wvp_matrix, UniformValue::Matrix4(frame_matrix)), + (shader.wvp_matrix, UniformValue::Matrix4(&frame_matrix)), ( shader.camera_position, - UniformValue::Vector3(camera.global_position()), + UniformValue::Vector3(&camera_global_position), ), ( shader.depth_sampler, @@ -1006,8 +1014,8 @@ impl DeferredLightRenderer { &self.quad, geometry_cache, camera.view_matrix(), - projection_matrix.try_inverse().unwrap_or_default(), - camera.view_projection_matrix(), + inv_projection, + view_projection, viewport, &scene.graph, ); diff --git a/src/renderer/forward_renderer.rs b/src/renderer/forward_renderer.rs index ff53d63f5..c59c19235 100644 --- a/src/renderer/forward_renderer.rs +++ b/src/renderer/forward_renderer.rs @@ -129,7 +129,9 @@ impl ForwardRenderer { ), ( self.shader.wvp_matrix, - UniformValue::Matrix4(view_projection * instance.world_transform), + UniformValue::Matrix4( + &(view_projection * instance.world_transform), + ), ), ( self.shader.use_skeletal_animation, diff --git a/src/renderer/framework/gpu_program.rs b/src/renderer/framework/gpu_program.rs index c9c87824c..a467b81a0 100644 --- a/src/renderer/framework/gpu_program.rs +++ b/src/renderer/framework/gpu_program.rs @@ -1,8 +1,9 @@ -use crate::core::algebra::{Matrix3, Matrix4, Vector2, Vector3, Vector4}; -use crate::core::scope_profile; -use crate::utils::log::MessageKind; use crate::{ - core::color::Color, + core::{ + algebra::{Matrix3, Matrix4, Vector2, Vector3, Vector4}, + color::Color, + scope_profile, + }, renderer::{ error::RendererError, framework::{ @@ -14,7 +15,7 @@ use crate::{ state::PipelineState, }, }, - utils::log::Log, + utils::log::{Log, MessageKind}, }; use std::{cell::RefCell, ffi::CString, marker::PhantomData, rc::Rc}; @@ -35,19 +36,19 @@ pub struct UniformLocation { #[allow(dead_code)] pub enum UniformValue<'a> { Sampler { - index: usize, + index: u32, texture: Rc>, }, Bool(bool), Integer(i32), Float(f32), - Vector2(Vector2), - Vector3(Vector3), - Vector4(Vector4), + Vector2(&'a Vector2), + Vector3(&'a Vector3), + Vector4(&'a Vector4), Color(Color), - Matrix4(Matrix4), - Matrix3(Matrix3), + Matrix4(&'a Matrix4), + Matrix3(&'a Matrix3), IntegerArray(&'a [i32]), FloatArray(&'a [f32]), diff --git a/src/renderer/framework/gpu_texture.rs b/src/renderer/framework/gpu_texture.rs index a912927d6..3d957e1f5 100644 --- a/src/renderer/framework/gpu_texture.rs +++ b/src/renderer/framework/gpu_texture.rs @@ -1,7 +1,6 @@ // Keep this for now, some texture kind might be used in future. #![allow(dead_code)] -use crate::utils::log::MessageKind; use crate::{ core::color::Color, renderer::{ @@ -12,7 +11,7 @@ use crate::{ TextureKind, TextureMagnificationFilter, TextureMinificationFilter, TexturePixelKind, TextureWrapMode, }, - utils::log::Log, + utils::log::{Log, MessageKind}, }; use std::{ffi::c_void, marker::PhantomData}; @@ -848,13 +847,13 @@ impl GpuTexture { pub fn bind_mut( &mut self, state: &mut PipelineState, - sampler_index: usize, + sampler_index: u32, ) -> TextureBinding<'_> { state.set_texture(sampler_index, self.kind.to_texture_target(), self.texture); TextureBinding { texture: self } } - pub fn bind(&self, state: &mut PipelineState, sampler_index: usize) { + pub fn bind(&self, state: &mut PipelineState, sampler_index: u32) { state.set_texture(sampler_index, self.kind.to_texture_target(), self.texture); } diff --git a/src/renderer/framework/state.rs b/src/renderer/framework/state.rs index 1387a6cd1..1665025e1 100644 --- a/src/renderer/framework/state.rs +++ b/src/renderer/framework/state.rs @@ -369,8 +369,8 @@ impl PipelineState { } } - pub fn set_texture(&mut self, sampler_index: usize, target: GLenum, texture: GLuint) { - let unit = self.texture_units.get_mut(sampler_index).unwrap(); + pub fn set_texture(&mut self, sampler_index: u32, target: GLenum, texture: GLuint) { + let unit = self.texture_units.get_mut(sampler_index as usize).unwrap(); if unit.target != target || unit.texture != texture { unit.texture = texture; @@ -379,7 +379,7 @@ impl PipelineState { self.frame_statistics.texture_binding_changes += 1; unsafe { - gl::ActiveTexture(gl::TEXTURE0 + sampler_index as u32); + gl::ActiveTexture(gl::TEXTURE0 + sampler_index); gl::BindTexture(target, texture); } } diff --git a/src/renderer/fxaa.rs b/src/renderer/fxaa.rs index 9788c48de..04f02729d 100644 --- a/src/renderer/fxaa.rs +++ b/src/renderer/fxaa.rs @@ -92,13 +92,12 @@ impl FxaaRenderer { blend: false, }, &[ - (self.shader.wvp_matrix, UniformValue::Matrix4(frame_matrix)), + (self.shader.wvp_matrix, UniformValue::Matrix4(&frame_matrix)), ( self.shader.inverse_screen_size, - UniformValue::Vector2(Vector2::new( - 1.0 / viewport.w() as f32, - 1.0 / viewport.h() as f32, - )), + UniformValue::Vector2( + &(Vector2::new(1.0 / viewport.w() as f32, 1.0 / viewport.h() as f32)), + ), ), ( self.shader.screen_texture, diff --git a/src/renderer/gbuffer.rs b/src/renderer/gbuffer.rs index 72dc7ecde..9bdf5f0a4 100644 --- a/src/renderer/gbuffer.rs +++ b/src/renderer/gbuffer.rs @@ -1,10 +1,5 @@ use crate::{ - core::{ - algebra::{Matrix4, Vector4}, - color::Color, - math::Rect, - scope_profile, - }, + core::{algebra::Vector4, color::Color, math::Rect, scope_profile}, renderer::{ batch::{BatchStorage, InstanceData, MatrixStorage, BONE_MATRICES_COUNT}, error::RendererError, @@ -121,7 +116,6 @@ pub struct GBuffer { pub height: i32, matrix_storage: MatrixStorage, instance_data_set: Vec, - bone_matrices: Vec>, } pub(in crate) struct GBufferRenderContext<'a, 'b> { @@ -253,7 +247,6 @@ impl GBuffer { final_frame: opt_framebuffer, matrix_storage: MatrixStorage::new(state)?, instance_data_set: Default::default(), - bone_matrices: Default::default(), }) } @@ -378,7 +371,7 @@ impl GBuffer { ), ( self.shader.camera_position, - UniformValue::Vector3(camera.global_position()), + UniformValue::Vector3(&camera.global_position()), ), ( self.shader.environment_map, @@ -407,11 +400,13 @@ impl GBuffer { ), ( self.shader.wvp_matrix, - UniformValue::Matrix4(view_projection * instance.world_transform), + UniformValue::Matrix4( + &(view_projection * instance.world_transform), + ), ), ( self.shader.world_matrix, - UniformValue::Matrix4(instance.world_transform), + UniformValue::Matrix4(&instance.world_transform), ), ( self.shader.use_skeletal_animation, @@ -423,12 +418,7 @@ impl GBuffer { ), ( self.shader.bone_matrices, - UniformValue::Mat4Array({ - self.bone_matrices.clear(); - self.bone_matrices - .extend_from_slice(instance.bone_matrices.as_slice()); - &self.bone_matrices - }), + UniformValue::Mat4Array(instance.bone_matrices.as_slice()), ), ], ); @@ -490,7 +480,7 @@ impl GBuffer { ), ( self.instanced_shader.camera_position, - UniformValue::Vector3(camera.global_position()), + UniformValue::Vector3(&camera.global_position()), ), ( self.instanced_shader.environment_map, @@ -542,7 +532,7 @@ impl GBuffer { } else { unreachable!() }; - Vector4::new( + &Vector4::new( 1.0 / (w as f32), 1.0 / (h as f32), w as f32, @@ -552,7 +542,7 @@ impl GBuffer { ), ( self.instanced_shader.view_projection_matrix, - UniformValue::Matrix4(camera.view_projection_matrix()), + UniformValue::Matrix4(&camera.view_projection_matrix()), ), ], ); diff --git a/src/renderer/light_volume.rs b/src/renderer/light_volume.rs index 7bc1fc4e3..68af57e9e 100644 --- a/src/renderer/light_volume.rs +++ b/src/renderer/light_volume.rs @@ -197,7 +197,7 @@ impl LightVolumeRenderer { depth_test: true, blend: false, }, - &[(self.flat_shader.wvp_matrix, UniformValue::Matrix4(mvp))], + &[(self.flat_shader.wvp_matrix, UniformValue::Matrix4(&mvp))], ); // Make sure to clean stencil buffer after drawing full screen quad. @@ -226,11 +226,11 @@ impl LightVolumeRenderer { &[ ( self.spot_light_shader.world_view_proj_matrix, - UniformValue::Matrix4(frame_matrix), + UniformValue::Matrix4(&frame_matrix), ), ( self.spot_light_shader.inv_proj, - UniformValue::Matrix4(inv_proj), + UniformValue::Matrix4(&inv_proj), ), ( self.spot_light_shader.cone_angle_cos, @@ -238,11 +238,11 @@ impl LightVolumeRenderer { ), ( self.spot_light_shader.light_position, - UniformValue::Vector3(position), + UniformValue::Vector3(&position), ), ( self.spot_light_shader.light_direction, - UniformValue::Vector3(direction), + UniformValue::Vector3(&direction), ), ( self.spot_light_shader.depth_sampler, @@ -253,11 +253,11 @@ impl LightVolumeRenderer { ), ( self.spot_light_shader.light_color, - UniformValue::Vector3(light.color().as_frgba().xyz()), + UniformValue::Vector3(&light.color().as_frgba().xyz()), ), ( self.spot_light_shader.scatter_factor, - UniformValue::Vector3(light.scatter()), + UniformValue::Vector3(&light.scatter()), ), ], ) @@ -301,7 +301,7 @@ impl LightVolumeRenderer { depth_test: true, blend: false, }, - &[(self.flat_shader.wvp_matrix, UniformValue::Matrix4(mvp))], + &[(self.flat_shader.wvp_matrix, UniformValue::Matrix4(&mvp))], ); // Make sure to clean stencil buffer after drawing full screen quad. @@ -330,15 +330,15 @@ impl LightVolumeRenderer { &[ ( self.point_light_shader.world_view_proj_matrix, - UniformValue::Matrix4(frame_matrix), + UniformValue::Matrix4(&frame_matrix), ), ( self.point_light_shader.inv_proj, - UniformValue::Matrix4(inv_proj), + UniformValue::Matrix4(&inv_proj), ), ( self.point_light_shader.light_position, - UniformValue::Vector3(position), + UniformValue::Vector3(&position), ), ( self.point_light_shader.depth_sampler, @@ -353,11 +353,11 @@ impl LightVolumeRenderer { ), ( self.point_light_shader.light_color, - UniformValue::Vector3(light.color().as_frgba().xyz()), + UniformValue::Vector3(&light.color().as_frgba().xyz()), ), ( self.point_light_shader.scatter_factor, - UniformValue::Vector3(light.scatter()), + UniformValue::Vector3(&light.scatter()), ), ], ) diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index b891161d2..8de3ee6b1 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -1139,7 +1139,7 @@ impl Renderer { camera, geom_cache: &mut self.geometry_cache, batch_storage: &self.batch_storage, - framebuffer: &mut gbuffer.final_frame, // TODO: GBuffer **must not** containt final frame. + framebuffer: &mut gbuffer.final_frame, // TODO: GBuffer **must not** contain final frame. viewport, }); @@ -1179,7 +1179,7 @@ impl Renderer { &[ ( self.flat_shader.wvp_matrix, - UniformValue::Matrix4({ + UniformValue::Matrix4(&{ Matrix4::new_orthographic( 0.0, viewport.w() as f32, diff --git a/src/renderer/particle_system_renderer.rs b/src/renderer/particle_system_renderer.rs index f9862b44a..d47c1a429 100644 --- a/src/renderer/particle_system_renderer.rs +++ b/src/renderer/particle_system_renderer.rs @@ -142,10 +142,14 @@ impl ParticleSystemRenderer { state.set_blend_func(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA); let inv_view = camera.inv_view_matrix().unwrap(); + let view_proj = camera.view_projection_matrix(); let camera_up = inv_view.up(); let camera_side = inv_view.side(); + let inv_screen_size = Vector2::new(1.0 / frame_width, 1.0 / frame_height); + let proj_params = Vector2::new(camera.z_far(), camera.z_near()); + for node in graph.linear_iter() { let particle_system = if let Node::ParticleSystem(particle_system) = node { particle_system @@ -165,6 +169,8 @@ impl ParticleSystemRenderer { .bind(state) .set_triangles(self.draw_data.triangles()); + let global_transform = node.global_transform(); + let uniforms = [ ( self.shader.depth_buffer_texture, @@ -190,28 +196,25 @@ impl ParticleSystemRenderer { ), ( self.shader.camera_side_vector, - UniformValue::Vector3(camera_side), + UniformValue::Vector3(&camera_side), ), ( self.shader.camera_up_vector, - UniformValue::Vector3(camera_up), + UniformValue::Vector3(&camera_up), ), ( self.shader.view_projection_matrix, - UniformValue::Matrix4(camera.view_projection_matrix()), + UniformValue::Matrix4(&view_proj), ), ( self.shader.world_matrix, - UniformValue::Matrix4(node.global_transform()), + UniformValue::Matrix4(&global_transform), ), ( self.shader.inv_screen_size, - UniformValue::Vector2(Vector2::new(1.0 / frame_width, 1.0 / frame_height)), - ), - ( - self.shader.proj_params, - UniformValue::Vector2(Vector2::new(camera.z_far(), camera.z_near())), + UniformValue::Vector2(&inv_screen_size), ), + (self.shader.proj_params, UniformValue::Vector2(&proj_params)), ]; let draw_params = DrawParameters { diff --git a/src/renderer/shadow_map_renderer.rs b/src/renderer/shadow_map_renderer.rs index e982592b9..3f40f4565 100644 --- a/src/renderer/shadow_map_renderer.rs +++ b/src/renderer/shadow_map_renderer.rs @@ -1,6 +1,5 @@ #![warn(clippy::too_many_arguments)] -use crate::renderer::ShadowMapPrecision; use crate::{ core::{ algebra::{Matrix4, Point3, Vector3}, @@ -22,7 +21,7 @@ use crate::{ }, state::{ColorMask, PipelineState}, }, - GeometryCache, RenderPassStatistics, + GeometryCache, RenderPassStatistics, ShadowMapPrecision, }, scene::{graph::Graph, node::Node}, }; @@ -61,7 +60,6 @@ pub struct SpotShadowMapRenderer { // 1 - medium, for lights with medium distance to camera. // 2 - small, for farthest lights. cascades: [FrameBuffer; 3], - bone_matrices: Vec>, size: usize, } @@ -131,7 +129,6 @@ impl SpotShadowMapRenderer { make_cascade(state, cascade_size(size, 2), precision)?, ], shader: SpotShadowMapShader::new()?, - bone_matrices: Vec::new(), }) } @@ -210,7 +207,7 @@ impl SpotShadowMapRenderer { ( self.shader.world_view_projection_matrix, UniformValue::Matrix4( - light_view_projection * instance.world_transform, + &(light_view_projection * instance.world_transform), ), ), ( @@ -219,12 +216,7 @@ impl SpotShadowMapRenderer { ), ( self.shader.bone_matrices, - UniformValue::Mat4Array({ - self.bone_matrices.clear(); - self.bone_matrices - .extend_from_slice(instance.bone_matrices.as_slice()); - &self.bone_matrices - }), + UniformValue::Mat4Array(instance.bone_matrices.as_slice()), ), ( self.shader.diffuse_texture, @@ -273,7 +265,6 @@ impl PointShadowMapShader { pub struct PointShadowMapRenderer { precision: ShadowMapPrecision, - bone_matrices: Vec>, shader: PointShadowMapShader, cascades: [FrameBuffer; 3], size: usize, @@ -372,7 +363,6 @@ impl PointShadowMapRenderer { Ok(Self { precision, - bone_matrices: Default::default(), cascades: [ make_cascade(state, cascade_size(size, 0), precision)?, make_cascade(state, cascade_size(size, 1), precision)?, @@ -501,15 +491,18 @@ impl PointShadowMapRenderer { blend: false, }, &[ - (self.shader.light_position, UniformValue::Vector3(light_pos)), + ( + self.shader.light_position, + UniformValue::Vector3(&light_pos), + ), ( self.shader.world_matrix, - UniformValue::Matrix4(instance.world_transform), + UniformValue::Matrix4(&instance.world_transform), ), ( self.shader.world_view_projection_matrix, UniformValue::Matrix4( - light_view_projection_matrix * instance.world_transform, + &(light_view_projection_matrix * instance.world_transform), ), ), ( @@ -518,12 +511,7 @@ impl PointShadowMapRenderer { ), ( self.shader.bone_matrices, - UniformValue::Mat4Array({ - self.bone_matrices.clear(); - self.bone_matrices - .extend_from_slice(instance.bone_matrices.as_slice()); - &self.bone_matrices - }), + UniformValue::Mat4Array(instance.bone_matrices.as_slice()), ), ( self.shader.diffuse_texture, diff --git a/src/renderer/sprite_renderer.rs b/src/renderer/sprite_renderer.rs index 44f778e9c..d301c454c 100644 --- a/src/renderer/sprite_renderer.rs +++ b/src/renderer/sprite_renderer.rs @@ -152,19 +152,19 @@ impl SpriteRenderer { ), ( self.shader.view_projection_matrix, - UniformValue::Matrix4(view_projection), + UniformValue::Matrix4(&view_projection), ), ( self.shader.world_matrix, - UniformValue::Matrix4(sprite.global_transform()), + UniformValue::Matrix4(&sprite.global_transform()), ), ( self.shader.camera_up_vector, - UniformValue::Vector3(camera_up), + UniformValue::Vector3(&camera_up), ), ( self.shader.camera_side_vector, - UniformValue::Vector3(camera_side), + UniformValue::Vector3(&camera_side), ), (self.shader.size, UniformValue::Float(sprite.size())), (self.shader.color, UniformValue::Color(sprite.color())), diff --git a/src/renderer/ssao.rs b/src/renderer/ssao.rs index 2e66b6d31..08d1d0e42 100644 --- a/src/renderer/ssao.rs +++ b/src/renderer/ssao.rs @@ -262,7 +262,7 @@ impl ScreenSpaceAmbientOcclusionRenderer { ( self.shader.noise_scale, UniformValue::Vector2({ - Vector2::new( + &Vector2::new( self.width as f32 / NOISE_SIZE as f32, self.height as f32 / NOISE_SIZE as f32, ) @@ -270,17 +270,17 @@ impl ScreenSpaceAmbientOcclusionRenderer { ), ( self.shader.world_view_proj_matrix, - UniformValue::Matrix4(frame_matrix), + UniformValue::Matrix4(&frame_matrix), ), ( self.shader.projection_matrix, - UniformValue::Matrix4(projection_matrix), + UniformValue::Matrix4(&projection_matrix), ), ( self.shader.inv_proj_matrix, - UniformValue::Matrix4(projection_matrix.try_inverse().unwrap_or_default()), + UniformValue::Matrix4(&projection_matrix.try_inverse().unwrap_or_default()), ), - (self.shader.view_matrix, UniformValue::Matrix3(view_matrix)), + (self.shader.view_matrix, UniformValue::Matrix3(&view_matrix)), ], ); diff --git a/src/renderer/ui_renderer.rs b/src/renderer/ui_renderer.rs index 399d59a22..023805a77 100644 --- a/src/renderer/ui_renderer.rs +++ b/src/renderer/ui_renderer.rs @@ -172,6 +172,7 @@ impl UiRenderer { geometry_buffer.set_triangles(drawing_context.get_triangles()); let ortho = Matrix4::new_orthographic(0.0, frame_width, frame_height, 0.0, -1.0, 1.0); + let resolution = Vector2::new(frame_width, frame_height); state.set_scissor_test(true); @@ -236,7 +237,7 @@ impl UiRenderer { depth_test: false, blend: false, }, - &[(self.shader.wvp_matrix, UniformValue::Matrix4(ortho))], + &[(self.shader.wvp_matrix, UniformValue::Matrix4(&ortho))], ); // Make sure main geometry will be drawn only on marked pixels. @@ -293,6 +294,13 @@ impl UiRenderer { let mut raw_stops = [0.0; 16]; let mut raw_colors = [Vector4::default(); 16]; + let bounds_max = cmd.bounds.right_bottom_corner(); + + let (gradient_origin, gradient_end) = match cmd.brush { + Brush::Solid(_) => (Vector2::default(), Vector2::default()), + Brush::LinearGradient { from, to, .. } => (from, to), + Brush::RadialGradient { center, .. } => (center, Vector2::default()), + }; let uniforms = [ ( @@ -302,19 +310,13 @@ impl UiRenderer { texture: diffuse_texture, }, ), - (self.shader.wvp_matrix, UniformValue::Matrix4(ortho)), - ( - self.shader.resolution, - UniformValue::Vector2(Vector2::new(frame_width, frame_height)), - ), + (self.shader.wvp_matrix, UniformValue::Matrix4(&ortho)), + (self.shader.resolution, UniformValue::Vector2(&resolution)), ( self.shader.bounds_min, - UniformValue::Vector2(cmd.bounds.position), - ), - ( - self.shader.bounds_max, - UniformValue::Vector2(cmd.bounds.right_bottom_corner()), + UniformValue::Vector2(&cmd.bounds.position), ), + (self.shader.bounds_max, UniformValue::Vector2(&bounds_max)), (self.shader.is_font, UniformValue::Bool(is_font_texture)), ( self.shader.brush_type, @@ -337,23 +339,11 @@ impl UiRenderer { ), ( self.shader.gradient_origin, - UniformValue::Vector2({ - match cmd.brush { - Brush::Solid(_) => Vector2::default(), - Brush::LinearGradient { from, .. } => from, - Brush::RadialGradient { center, .. } => center, - } - }), + UniformValue::Vector2(&gradient_origin), ), ( self.shader.gradient_end, - UniformValue::Vector2({ - match cmd.brush { - Brush::Solid(_) => Vector2::default(), - Brush::LinearGradient { to, .. } => to, - Brush::RadialGradient { .. } => Vector2::default(), - } - }), + UniformValue::Vector2(&gradient_end), ), ( self.shader.gradient_point_count,