use bevy::{
prelude::*,
render::{
mesh::Indices,
render_asset::RenderAssetUsages,
render_resource::PrimitiveTopology,
},
};
use bevy_panorbit_camera::{PanOrbitCamera, PanOrbitCameraPlugin};
use hexglobe::projection::globe::ExactGlobe;
fn main() {
App::new()
.add_plugins((
DefaultPlugins,
PanOrbitCameraPlugin
))
.add_systems(Startup, setup)
.add_systems(Update, draw_debug)
.run();
}
fn setup(
mut commands: Commands,
mut materials: ResMut<Assets<StandardMaterial>>,
mut meshes: ResMut<Assets<Mesh>>,
) {
let mesh_handle: Handle<Mesh> = meshes.add(create_mesh());
commands.spawn((
Mesh3d(mesh_handle),
MeshMaterial3d(materials.add(Color::WHITE)),
));
commands.spawn((
PointLight {
shadows_enabled: true,
..default()
},
Transform::from_xyz(4.0, 8.0, 4.0),
));
commands.spawn((
Camera3d::default(),
PanOrbitCamera::default(),
Transform::from_xyz(0.0, 0.0, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
));
}
fn draw_debug(
mut gizmos: Gizmos
) {
gizmos.axes(
Transform::IDENTITY,
2.0
);
}
fn create_mesh() -> Mesh {
let globe = ExactGlobe::<3>::new();
let centroids = globe.centroids(None);
let vertices = globe.mesh_vertices(¢roids);
let faces = globe.mesh_faces();
let triangles = globe.mesh_triangles(&faces);
let normals = globe.mesh_normals(&vertices);
Mesh::new(PrimitiveTopology::TriangleList, RenderAssetUsages::MAIN_WORLD | RenderAssetUsages::RENDER_WORLD)
.with_inserted_attribute(
Mesh::ATTRIBUTE_POSITION,
vertices
)
.with_inserted_indices(Indices::U32(
triangles
))
.with_inserted_attribute(
Mesh::ATTRIBUTE_NORMAL,
normals
)
}