fix despawning of scenes (fixes framerate drop after traveling far)
This commit is contained in:
parent
9802a09478
commit
910d1b4407
10
src/world.rs
10
src/world.rs
|
@ -2,6 +2,7 @@ use crate::{actor, nature, settings};
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy::render::render_resource::{AsBindGroup, ShaderRef};
|
use bevy::render::render_resource::{AsBindGroup, ShaderRef};
|
||||||
use bevy::math::{DVec3, I64Vec3};
|
use bevy::math::{DVec3, I64Vec3};
|
||||||
|
use bevy::scene::{InstanceId, SceneInstance};
|
||||||
use bevy_xpbd_3d::prelude::*;
|
use bevy_xpbd_3d::prelude::*;
|
||||||
use bevy_xpbd_3d::plugins::sync::SyncConfig;
|
use bevy_xpbd_3d::plugins::sync::SyncConfig;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
@ -78,6 +79,7 @@ struct AsteroidData {
|
||||||
#[derive(Event)]
|
#[derive(Event)]
|
||||||
pub struct DespawnEvent {
|
pub struct DespawnEvent {
|
||||||
entity: Entity,
|
entity: Entity,
|
||||||
|
sceneinstance: InstanceId,
|
||||||
origin: I64Vec3,
|
origin: I64Vec3,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,7 +184,7 @@ fn spawn_despawn_asteroids(
|
||||||
mut ew_despawn: EventWriter<DespawnEvent>,
|
mut ew_despawn: EventWriter<DespawnEvent>,
|
||||||
mut db: ResMut<ActiveAsteroids>,
|
mut db: ResMut<ActiveAsteroids>,
|
||||||
asset_server: Res<AssetServer>,
|
asset_server: Res<AssetServer>,
|
||||||
mut q_asteroid: Query<(Entity, &mut Visibility), With<Asteroid>>,
|
mut q_asteroid: Query<(Entity, &SceneInstance), With<Asteroid>>,
|
||||||
mut last_player_cell: Local<I64Vec3>,
|
mut last_player_cell: Local<I64Vec3>,
|
||||||
) {
|
) {
|
||||||
if !timer.0.tick(time.delta()).just_finished() || q_player.is_empty() {
|
if !timer.0.tick(time.delta()).just_finished() || q_player.is_empty() {
|
||||||
|
@ -218,11 +220,11 @@ fn spawn_despawn_asteroids(
|
||||||
|| origin.z < z_min || origin.z > z_max
|
|| origin.z < z_min || origin.z > z_max
|
||||||
{
|
{
|
||||||
let mut despawning_worked = false;
|
let mut despawning_worked = false;
|
||||||
for (ent, mut vis) in &mut q_asteroid {
|
for (ent, sceneinstance) in &mut q_asteroid {
|
||||||
if ent == asteroid.entity {
|
if ent == asteroid.entity {
|
||||||
*vis = Visibility::Hidden;
|
|
||||||
ew_despawn.send(DespawnEvent {
|
ew_despawn.send(DespawnEvent {
|
||||||
entity: asteroid.entity,
|
entity: asteroid.entity,
|
||||||
|
sceneinstance: **sceneinstance,
|
||||||
origin: origin.clone(),
|
origin: origin.clone(),
|
||||||
});
|
});
|
||||||
despawning_worked = true;
|
despawning_worked = true;
|
||||||
|
@ -336,9 +338,11 @@ fn handle_despawn(
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
mut er_despawn: EventReader<DespawnEvent>,
|
mut er_despawn: EventReader<DespawnEvent>,
|
||||||
mut db: ResMut<ActiveAsteroids>,
|
mut db: ResMut<ActiveAsteroids>,
|
||||||
|
mut scene_spawner: ResMut<SceneSpawner>,
|
||||||
) {
|
) {
|
||||||
for despawn in er_despawn.read() {
|
for despawn in er_despawn.read() {
|
||||||
commands.entity(despawn.entity).despawn();
|
commands.entity(despawn.entity).despawn();
|
||||||
|
scene_spawner.despawn_instance(despawn.sceneinstance);
|
||||||
db.0.remove(&despawn.origin);
|
db.0.remove(&despawn.origin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue