honeycomb_render/scene/
mod.rs

1mod camera;
2mod picking;
3
4use bevy::pbr::AmbientLight;
5use bevy::prelude::*;
6// use bevy_mod_outline::OutlinePlugin;
7use bevy_mod_picking::DefaultPickingPlugins;
8use bevy_mod_picking::selection::SelectionPluginSettings;
9
10use crate::gui::WindowVisible;
11use crate::resources::{Map, Map3};
12use crate::systems::{
13    render_dart_enabled, render_darts, render_darts_3d, render_edge_enabled, render_edges,
14    render_face_enabled, render_faces, render_vertex_enabled, render_vertices,
15};
16
17/// Plugin handling scene setup and updates.
18pub struct ScenePlugin;
19
20impl Plugin for ScenePlugin {
21    fn build(&self, app: &mut App) {
22        // camera
23        app.insert_resource(AmbientLight {
24            color: Color::NONE,
25            brightness: 0.0,
26        })
27        .add_systems(Startup, setup_scene)
28        .add_systems(
29            Update,
30            camera::update_camera.run_if(|window_visible: Res<WindowVisible>| !window_visible.0),
31        );
32
33        // picking
34        app.add_plugins(DefaultPickingPlugins.build())
35            // .add_plugins(OutlinePlugin)
36            .insert_resource(SelectionPluginSettings::default())
37            .add_systems(Update, picking::update_picking);
38
39        // common content rendering
40        app.add_systems(Update, render_vertices.run_if(render_vertex_enabled))
41            .add_systems(Update, render_edges.run_if(render_edge_enabled))
42            .add_systems(Update, render_faces.run_if(render_face_enabled));
43        // dim. specific rendering
44        let world = app.world();
45        if world.contains_resource::<Map3<f32>>() || world.contains_resource::<Map3<f64>>() {
46            app.add_systems(Update, render_darts_3d.run_if(render_dart_enabled));
47        } else if world.contains_resource::<Map<f32>>() || world.contains_resource::<Map<f64>>() {
48            app.add_systems(Update, render_darts.run_if(render_dart_enabled));
49        }
50    }
51}
52
53/// Scene setup routine.
54pub fn setup_scene(mut commands: Commands) {
55    let camera_transform = Transform::from_xyz(0.0, 0.0, 5.0);
56
57    commands.spawn((
58        camera::PanOrbitCamera {
59            radius: camera_transform.translation.length(),
60            ..Default::default()
61        },
62        Camera3dBundle {
63            transform: camera_transform.looking_at(Vec3::ZERO, Vec3::Y),
64            ..default()
65        },
66    ));
67}