From 820b4ea7fcf8be56300a40f2aff99437a4977294 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Tue, 19 Nov 2019 22:43:30 +0300 Subject: [PATCH] Use temporal coherence for chunk frustum culling --- Cargo.lock | 12 ++++++------ voxygen/Cargo.toml | 2 +- voxygen/src/scene/camera.rs | 2 +- voxygen/src/scene/figure/mod.rs | 2 +- voxygen/src/scene/terrain.rs | 7 +++++-- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e89e538426..06b2135261 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1062,9 +1062,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "frustum_query" -version = "0.1.2" -source = "git+https://github.com/yusdacra/frustum_query#866b36607a3a80356f0fc7a1cb29c2c59a70fdab" +name = "frustum_culling" +version = "0.1.0" +source = "git+https://gitlab.com/yusdacra/frustum_culling#735aef658c7e5eb0c4d543cacbea2f3e06216438" [[package]] name = "fsevent" @@ -3549,8 +3549,8 @@ dependencies = [ "dot_vox 4.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "euc 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "fern 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)", - "frustum_query 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "fern 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)", + "frustum_culling 0.1.0 (git+https://gitlab.com/yusdacra/frustum_culling)", "gfx 0.18.2 (registry+https://github.com/rust-lang/crates.io-index)", "gfx_device_gl 0.16.2 (registry+https://github.com/rust-lang/crates.io-index)", "gfx_window_glutin 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3981,7 +3981,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" -"checksum frustum_query 0.1.2 (git+https://github.com/yusdacra/frustum_query)" = "" +"checksum frustum_culling 0.1.0 (git+https://gitlab.com/yusdacra/frustum_culling)" = "" "checksum fsevent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" "checksum fsevent-sys 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index acc9183562..e493a44a92 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -55,7 +55,7 @@ directories = "2.0.2" num = "0.2.0" backtrace = "0.3.40" rand = "0.7.2" -frustum_query = { git = "https://github.com/yusdacra/frustum_query" } +frustum_culling = { git = "https://gitlab.com/yusdacra/frustum_culling" } # context for pinning to commit: https://gitlab.com/veloren/veloren/issues/280 rodio = { git = "https://github.com/RustAudio/rodio", rev = "e5474a2"} cpal = "0.10" diff --git a/voxygen/src/scene/camera.rs b/voxygen/src/scene/camera.rs index f7a990b279..b1595b0eaa 100644 --- a/voxygen/src/scene/camera.rs +++ b/voxygen/src/scene/camera.rs @@ -1,6 +1,6 @@ use client::Client; use common::vol::{ReadVol, Vox}; -use frustum_query::frustum::Frustum; +use frustum_culling::Frustum; use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 3623914008..7d94eb92cd 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -843,7 +843,7 @@ impl FigureMgr { .join() // Don't render figures outside of frustum (camera viewport, max draw distance is farplane) .filter(|(_, pos, _, _, _, scale)| { - frustum.sphere_intersecting( + frustum.test_sphere( pos.0.into_array(), scale.unwrap_or(&Scale(1.0)).0 * 2.0, ) diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index 6b39543a34..4ef832be70 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -16,7 +16,7 @@ use common::{ }; use crossbeam::channel; use dot_vox::DotVoxData; -use frustum_query::frustum::Frustum; +use frustum_query::Frustum; use hashbrown::{hash_map::Entry, HashMap}; use std::{f32, fmt::Debug, i32, marker::PhantomData, ops::Mul, time::Duration}; use vek::*; @@ -31,6 +31,7 @@ struct TerrainChunkData { visible: bool, z_bounds: (f32, f32), + frustum_last_plane_index: u8, } struct ChunkMeshState { @@ -1021,6 +1022,7 @@ impl Terrain { .expect("Failed to upload chunk locals to the GPU!"), visible: false, z_bounds: response.z_bounds, + frustum_last_plane_index: 0, }, ); @@ -1060,8 +1062,9 @@ impl Terrain { chunk.z_bounds.1, ]; - let in_frustum = frustum.aabb_intersecting(chunk_min, chunk_max); + let (in_frustum, last_plane_index) = frustum.test_aabb_coherence(chunk_min, chunk_max, chunk.frustum_last_plane_index); + chunk.frustum_last_plane_index = last_plane_index; chunk.visible = in_frustum; } }