Skip to main content

vibe_graph_bevy/
lib.rs

1pub mod benchmark;
2pub mod camera;
3pub mod graph;
4pub mod interaction;
5pub mod layout;
6pub mod node_visual;
7pub mod render;
8pub mod ui;
9
10use bevy::prelude::*;
11
12#[derive(Resource)]
13pub struct InitialGraph(pub vibe_graph_core::SourceCodeGraph);
14
15pub fn run_visualizer(graph: vibe_graph_core::SourceCodeGraph) {
16    let settings = graph::LayoutSettings {
17        scale: benchmark::GraphScale::Medium,
18        custom_graph_path: None,
19        ..Default::default()
20    };
21
22    App::new()
23        .add_plugins(DefaultPlugins.set(WindowPlugin {
24            primary_window: Some(Window {
25                title: "vibe-graph 3D".to_string(),
26                resolution: (1600u32, 900u32).into(),
27                present_mode: bevy::window::PresentMode::AutoVsync,
28                ..default()
29            }),
30            ..default()
31        }))
32        .insert_resource(ClearColor(Color::srgb(0.05, 0.05, 0.08)))
33        .insert_resource(settings)
34        .insert_resource(InitialGraph(graph))
35        .add_plugins(camera::CameraPlugin)
36        .add_plugins(render::RenderPlugin)
37        .add_plugins(ui::UiPlugin)
38        .add_plugins(interaction::InteractionPlugin)
39        .add_systems(Startup, graph::init_graph)
40        .add_systems(
41            Update,
42            graph::step_layout.run_if(resource_exists::<graph::GraphLayout>),
43        )
44        .run();
45}
46
47#[cfg(target_arch = "wasm32")]
48use wasm_bindgen::prelude::*;
49
50#[cfg(target_arch = "wasm32")]
51#[wasm_bindgen(start)]
52pub fn wasm_main() {
53    console_error_panic_hook::set_once();
54
55    let window = web_sys::window().expect("no global `window` exists");
56    let data_val = js_sys::Reflect::get(&window, &"VIBE_GRAPH_DATA".into()).unwrap();
57
58    let mut initial_graph = vibe_graph_core::SourceCodeGraph::default();
59    if let Some(json_string) = data_val.as_string() {
60        if let Ok(graph) = serde_json::from_str(&json_string) {
61            initial_graph = graph;
62        } else {
63            web_sys::console::error_1(&"Failed to parse VIBE_GRAPH_DATA".into());
64        }
65    }
66
67    let settings = graph::LayoutSettings {
68        scale: benchmark::GraphScale::Medium,
69        custom_graph_path: None,
70        ..Default::default()
71    };
72
73    App::new()
74        .add_plugins(DefaultPlugins.set(WindowPlugin {
75            primary_window: Some(Window {
76                title: "vibe-graph 3D".to_string(),
77                resolution: (1600u32, 900u32).into(),
78                present_mode: bevy::window::PresentMode::AutoVsync,
79                canvas: Some("#vibe-graph-canvas".into()),
80                fit_canvas_to_parent: true,
81                ..default()
82            }),
83            ..default()
84        }))
85        .insert_resource(ClearColor(Color::srgb(0.05, 0.05, 0.08)))
86        .insert_resource(settings)
87        .insert_resource(InitialGraph(initial_graph))
88        .add_plugins(camera::CameraPlugin)
89        .add_plugins(render::RenderPlugin)
90        .add_plugins(ui::UiPlugin)
91        .add_plugins(interaction::InteractionPlugin)
92        .add_systems(Startup, graph::init_graph)
93        .add_systems(
94            Update,
95            graph::step_layout.run_if(resource_exists::<graph::GraphLayout>),
96        )
97        .run();
98}