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}