Skip to content

Commit

Permalink
Update to bevy 0.13
Browse files Browse the repository at this point in the history
  • Loading branch information
DotWith committed Mar 10, 2024
1 parent a59ca68 commit f57906e
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 57 deletions.
6 changes: 3 additions & 3 deletions bevy_rmesh/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "bevy_rmesh"
version = "0.3.0"
version = "0.3.1"
edition = "2021"
license = "MIT OR Apache-2.0"
description = "A Bevy extension for RMesh loading"
Expand All @@ -12,12 +12,12 @@ keywords = ["bevy"]
exclude = ["assets/*"]

[dependencies]
bevy = { version = "0.12.1", default-features = false, features = ["bevy_asset", "bevy_pbr", "bevy_render", "bevy_scene"] }
bevy = { version = "0.13.0", default-features = false, features = ["bevy_asset", "bevy_pbr", "bevy_render", "bevy_scene"] }
anyhow = "1.0.68"
rmesh = { path = "../rmesh", version = "0.3.3" }

[dev-dependencies]
bevy = "0.12.1"
bevy = "0.13.0"

[[example]]
name = "view"
Expand Down
5 changes: 4 additions & 1 deletion bevy_rmesh/examples/view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ fn setup(
// cube
commands.spawn(PbrBundle {
mesh: asset_server.load("cube.rmesh#Mesh0"),
material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()),
material: materials.add(StandardMaterial {
base_color: Color::rgb(0.8, 0.7, 0.6),
..default()
}),
transform: Transform::from_xyz(0.0, 0.5, 0.0),
..default()
});
Expand Down
54 changes: 33 additions & 21 deletions bevy_rmesh/src/loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ use bevy::asset::AsyncReadExt;
use bevy::asset::{AssetLoader, LoadContext};
use bevy::prelude::*;
use bevy::render::primitives::Aabb;
use bevy::render::render_asset::RenderAssetUsages;
use bevy::render::texture::{CompressedImageFormats, ImageSampler, ImageType};
use bevy::render::{
mesh::{Indices, Mesh},
render_resource::PrimitiveTopology,
};
use rmesh::{read_rmesh, ROOM_SCALE};
use rmesh::{read_rmesh, CalcBoundBox, ROOM_SCALE};

pub struct RMeshLoader {
pub(crate) supported_compressed_formats: CompressedImageFormats,
Expand Down Expand Up @@ -52,7 +53,7 @@ async fn load_rmesh<'a, 'b>(
// let mut entity_meshes = vec![];

for (i, complex_mesh) in header.meshes.iter().enumerate() {
let mut mesh = Mesh::new(PrimitiveTopology::TriangleList);
let mut mesh = Mesh::new(PrimitiveTopology::TriangleList, RenderAssetUsages::default());

let positions: Vec<_> = complex_mesh
.vertices
Expand All @@ -65,7 +66,6 @@ async fn load_rmesh<'a, 'b>(
]
})
.collect();

let tex_coords: Vec<_> = complex_mesh
.vertices
.iter()
Expand All @@ -81,9 +81,10 @@ async fn load_rmesh<'a, 'b>(
.iter()
.flat_map(|strip| strip.iter().rev().copied())
.collect();

mesh.insert_attribute(Mesh::ATTRIBUTE_POSITION, positions);
mesh.insert_attribute(Mesh::ATTRIBUTE_UV_0, tex_coords);
mesh.set_indices(Some(Indices::U32(indices)));
mesh.insert_indices(Indices::U32(indices));
mesh.duplicate_vertices();
mesh.compute_flat_normals();

Expand Down Expand Up @@ -151,21 +152,27 @@ async fn load_rmesh<'a, 'b>(
world
.spawn(SpatialBundle::INHERITED_IDENTITY)
.with_children(|parent| {
for i in 0..header.meshes.len() {
let mesh_label = format!("Mesh{0}", i);
let mat_label = format!("Material{0}", i);
let mut mesh_entity = parent.spawn(PbrBundle {
mesh: scene_load_context.get_label_handle(&mesh_label),
material: scene_load_context.get_label_handle(&mat_label),
..Default::default()
});
let complex_mesh = &header.meshes[i];
if let Some((min, max)) = rmesh::calculate_bounds(&complex_mesh.vertices) {
mesh_entity.insert(Aabb::from_min_max(
Vec3::from_slice(&min),
Vec3::from_slice(&max),
));
}
for (i, mesh) in header.meshes.iter().enumerate() {
parent
.spawn(SpatialBundle::default())
.insert(Name::new(mesh_name(i)))
.with_children(|parent| {
let mesh_label = mesh_name(i);
let mat_label = format!("Material{0}", i);
let bounds = mesh.bounding_box();

let mut mesh_entity = parent.spawn(PbrBundle {
mesh: scene_load_context.get_label_handle(&mesh_label),
material: scene_load_context.get_label_handle(&mat_label),
..Default::default()
});
mesh_entity.insert(Aabb::from_min_max(
Vec3::from_slice(&bounds.min) * ROOM_SCALE,
Vec3::from_slice(&bounds.max) * ROOM_SCALE,
));

mesh_entity.insert(Name::new(mesh_name(i)));
});
}
for entity in header.entities {
if let Some(entity_type) = entity.entity_type {
Expand Down Expand Up @@ -214,7 +221,7 @@ async fn load_rmesh<'a, 'b>(
..Default::default()
});
}
rmesh::EntityType::Model(data) => {
/*rmesh::EntityType::Model(data) => {
let name = &String::from(data.name.clone());
let mesh_label = format!("EntityMesh{0}", name);
let mat_label = format!("EntityMaterial{0}", name);
Expand Down Expand Up @@ -244,7 +251,7 @@ async fn load_rmesh<'a, 'b>(
material: scene_load_context.get_label_handle(&mat_label),
..Default::default()
});
}
}*/
_ => (),
}
}
Expand All @@ -262,6 +269,10 @@ async fn load_rmesh<'a, 'b>(
})
}

fn mesh_name(i: usize) -> String {
format!("Mesh{0}", i)
}

async fn load_texture<'a>(
path: &str,
load_context: &mut LoadContext<'a>,
Expand All @@ -280,5 +291,6 @@ async fn load_texture<'a>(
supported_compressed_formats,
true,
ImageSampler::Default,
RenderAssetUsages::default(),
)?)
}
106 changes: 74 additions & 32 deletions rmesh/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,80 @@ pub struct TriggerBox {
pub name: FixedLengthString,
}

impl CalcBoundBox for SimpleMesh {
fn bounding_box(&self) -> Bounds {
let mut min_x = f32::INFINITY;
let mut min_y = f32::INFINITY;
let mut min_z = f32::INFINITY;
let mut max_x = f32::NEG_INFINITY;
let mut max_y = f32::NEG_INFINITY;
let mut max_z = f32::NEG_INFINITY;

for vertex in &self.vertices {
let [x, y, z] = *vertex;

// Update min values
min_x = min_x.min(x);
min_y = min_y.min(y);
min_z = min_z.min(z);

// Update max values
max_x = max_x.max(x);
max_y = max_y.max(y);
max_z = max_z.max(z);
}

let min_point = [min_x, min_y, min_z];
let max_point = [max_x, max_y, max_z];
Bounds::new(min_point, max_point)
}
}

impl CalcBoundBox for ComplexMesh {
fn bounding_box(&self) -> Bounds {
let mut min_x = f32::INFINITY;
let mut min_y = f32::INFINITY;
let mut min_z = f32::INFINITY;
let mut max_x = f32::NEG_INFINITY;
let mut max_y = f32::NEG_INFINITY;
let mut max_z = f32::NEG_INFINITY;

for vertex in &self.vertices {
let [x, y, z] = vertex.position;

// Update min values
min_x = min_x.min(x);
min_y = min_y.min(y);
min_z = min_z.min(z);

// Update max values
max_x = max_x.max(x);
max_y = max_y.max(y);
max_z = max_z.max(z);
}

let min_point = [min_x, min_y, min_z];
let max_point = [max_x, max_y, max_z];
Bounds::new(min_point, max_point)
}
}

pub trait CalcBoundBox {
/// Used for aabb calc
fn bounding_box(&self) -> Bounds;
}

pub struct Bounds {
pub min: [f32; 3],
pub max: [f32; 3],
}

impl Bounds {
pub fn new(min: [f32; 3], max: [f32; 3]) -> Self {
Self { min, max }
}
}

#[binrw]
#[derive(Debug)]
pub struct EntityData {
Expand Down Expand Up @@ -173,35 +247,3 @@ pub fn write_rmesh(header: &Header) -> Result<Vec<u8>, RMeshError> {

Ok(bytes)
}

/// Used for aabb calc
pub fn calculate_bounds(vertices: &Vec<Vertex>) -> Option<([f32; 3], [f32; 3])> {
if vertices.is_empty() {
return None;
}

let mut min_x = f32::INFINITY;
let mut min_y = f32::INFINITY;
let mut min_z = f32::INFINITY;
let mut max_x = f32::NEG_INFINITY;
let mut max_y = f32::NEG_INFINITY;
let mut max_z = f32::NEG_INFINITY;

for vertex in vertices {
let [x, y, z] = vertex.position;

// Update min values
min_x = min_x.min(x);
min_y = min_y.min(y);
min_z = min_z.min(z);

// Update max values
max_x = max_x.max(x);
max_y = max_y.max(y);
max_z = max_z.max(z);
}

let min_point = [min_x, min_y, min_z];
let max_point = [max_x, max_y, max_z];
Some((min_point, max_point))
}

0 comments on commit f57906e

Please sign in to comment.