Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_dev_tools/src/world_asset_helpers.rs
30635 views
1
//! This modules contains functions that can make working with [`WorldAsset`] easier
2
3
use bevy_asset::{Assets, Handle};
4
use bevy_ecs::system::SystemState;
5
use bevy_mesh::{Mesh, Mesh3d};
6
use bevy_transform::helper::TransformHelper;
7
use bevy_world_serialization::WorldAsset;
8
9
/// Merge all the [`Mesh3d`] of a [`WorldAsset`] into a single [`Mesh`]
10
pub fn merge_all_mesh_3d(
11
world_assets: &mut Assets<WorldAsset>,
12
meshes: &mut Assets<Mesh>,
13
scene_handle: &Handle<WorldAsset>,
14
) -> Option<Mesh> {
15
let mut scene = world_assets.get_mut(scene_handle)?;
16
let mut merged: Option<Mesh> = None;
17
18
let mut system_state = SystemState::<TransformHelper>::new(&mut scene.world);
19
let helper = system_state.get(&scene.world).ok()?;
20
21
for entity_ref in scene.world.iter_entities() {
22
let Some(mesh) = entity_ref
23
.get::<Mesh3d>()
24
.and_then(|mesh3d| meshes.get(mesh3d))
25
else {
26
continue;
27
};
28
let Ok(global_transform) = helper.compute_global_transform(entity_ref.id()) else {
29
continue;
30
};
31
let transform = global_transform.compute_transform();
32
let transformed = mesh.clone().transformed_by(transform);
33
match &mut merged {
34
Some(mesh) => {
35
let _ = mesh.merge(&transformed);
36
}
37
None => {
38
merged = Some(transformed);
39
}
40
}
41
}
42
merged
43
}
44
45