honeycomb_render/scene/
mod.rs

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