animated/
animated.rs

1use hotwire::{WireLine, WireParams, WireRenderer};
2use sdl3::event::Event;
3use sdl3::pixels::Color;
4use std::time::Instant;
5
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // Initialize SDL3
8    let sdl = sdl3::init()?;
9    let video = sdl.video()?;
10
11    // Create window
12    let window = video
13        .window("Hotwire - Animated Example", 800, 600)
14        .position_centered()
15        .build()
16        .map_err(|e| e.to_string())?;
17
18    let canvas = window.into_canvas();
19    let mut renderer = WireRenderer::new(canvas);
20
21    // Create multiple drooping wires with different parameters
22    let lines = vec![
23        WireLine::new(
24            100.0,
25            150.0,
26            700.0,
27            150.0,
28            WireParams {
29                sag: 60.0,
30                thickness: 3.0,
31                sway_speed: 1.0,
32                sway_amount: 4.0,
33                segment_density: 2.0,
34                color: Color::RGB(200, 180, 160),
35            },
36        ),
37        WireLine::new(
38            150.0,
39            250.0,
40            650.0,
41            280.0,
42            WireParams {
43                sag: 80.0,
44                thickness: 4.0,
45                sway_speed: 1.5,
46                sway_amount: 6.0,
47                segment_density: 2.5,
48                color: Color::RGB(180, 180, 180),
49            },
50        ),
51        WireLine::new(
52            200.0,
53            380.0,
54            600.0,
55            400.0,
56            WireParams {
57                sag: 50.0,
58                thickness: 2.5,
59                sway_speed: 0.8,
60                sway_amount: 3.0,
61                segment_density: 2.0,
62                color: Color::RGB(160, 140, 120),
63            },
64        ),
65    ];
66
67    let mut event_pump = sdl.event_pump()?;
68    let start_time = Instant::now();
69
70    'running: loop {
71        // Handle events
72        for event in event_pump.poll_iter() {
73            match event {
74                Event::Quit { .. } => break 'running,
75                _ => {}
76            }
77        }
78
79        // Get elapsed time in seconds
80        let time = start_time.elapsed().as_secs_f32();
81
82        // Clear canvas
83        renderer.canvas_mut().set_draw_color(Color::RGB(20, 20, 30));
84        renderer.canvas_mut().clear();
85
86        // Render all wire lines with animation
87        for line in &lines {
88            renderer.render(line, time)?;
89        }
90
91        // Present
92        renderer.present();
93
94        // Small delay
95        std::thread::sleep(std::time::Duration::from_millis(16));
96    }
97
98    Ok(())
99}