|
1 | 1 | #![cfg(target_arch = "wasm32")] |
2 | 2 | use app_core::{ |
3 | | - midi_to_hz, z_offset_vec3, EngineParams, MusicEngine, VoiceConfig, Waveform, BASE_SCALE, |
4 | | - C_MAJOR_PENTATONIC, DEFAULT_VOICE_COLORS, DEFAULT_VOICE_POSITIONS, ENGINE_DRAG_MAX_RADIUS, |
5 | | - PICK_SPHERE_RADIUS, SCALE_PULSE_MULTIPLIER, SPREAD, |
| 3 | + EngineParams, MusicEngine, VoiceConfig, Waveform, C_MAJOR_PENTATONIC, DEFAULT_VOICE_COLORS, |
| 4 | + DEFAULT_VOICE_POSITIONS, |
6 | 5 | }; |
7 | 6 | use glam::Vec3; |
8 | 7 | use instant::Instant; |
@@ -239,97 +238,6 @@ async fn init() -> anyhow::Result<()> { |
239 | 238 | let hover_index = Rc::new(RefCell::new(None::<usize>)); |
240 | 239 | let drag_state = Rc::new(RefCell::new(input::DragState::default())); |
241 | 240 |
|
242 | | - // Screen -> canvas coords inline helper |
243 | | - |
244 | | - // Mouse move: hover + drag |
245 | | - { |
246 | | - let mouse_state_m = mouse_state.clone(); |
247 | | - let hover_m = hover_index.clone(); |
248 | | - let drag_m = drag_state.clone(); |
249 | | - let engine_m = engine.clone(); |
250 | | - let canvas_mouse = canvas_for_click_inner.clone(); |
251 | | - let canvas_connected = canvas_mouse.is_connected(); |
252 | | - let closure = Closure::wrap(Box::new(move |ev: web::PointerEvent| { |
253 | | - let pos = input::pointer_canvas_px(&ev, &canvas_mouse); |
254 | | - // For CI/headless environments without real mouse, synthesize hover over center |
255 | | - if !canvas_connected { |
256 | | - return; |
257 | | - } |
258 | | - { |
259 | | - // Store pointer position; render() converts to uv for swirl uniforms |
260 | | - let mut ms = mouse_state_m.borrow_mut(); |
261 | | - ms.x = pos.x; |
262 | | - ms.y = pos.y; |
263 | | - } |
264 | | - // Compute hover or drag update |
265 | | - let (ro, rd) = |
266 | | - render::screen_to_world_ray(&canvas_mouse, pos.x, pos.y, CAMERA_Z); |
267 | | - let mut best = None::<(usize, f32)>; |
268 | | - let spread = SPREAD; |
269 | | - let z_offset = z_offset_vec3(); |
270 | | - for (i, v) in engine_m.borrow().voices.iter().enumerate() { |
271 | | - let center_world = v.position * spread + z_offset; |
272 | | - if let Some(t) = |
273 | | - input::ray_sphere(ro, rd, center_world, PICK_SPHERE_RADIUS) |
274 | | - { |
275 | | - if t >= 0.0 { |
276 | | - match best { |
277 | | - Some((_, bt)) if t >= bt => {} |
278 | | - _ => best = Some((i, t)), |
279 | | - } |
280 | | - } |
281 | | - } |
282 | | - } |
283 | | - if drag_m.borrow().active { |
284 | | - // Drag on plane z = constant (locked at mousedown) |
285 | | - let plane_z = drag_m.borrow().plane_z_world; |
286 | | - if rd.z.abs() > 1e-6 { |
287 | | - let t = (plane_z - ro.z) / rd.z; |
288 | | - if t >= 0.0 { |
289 | | - let hit_world = ro + rd * t; |
290 | | - let mut eng_pos = (hit_world - z_offset_vec3()) / SPREAD; |
291 | | - // Clamp drag radius to avoid losing objects |
292 | | - let max_r = ENGINE_DRAG_MAX_RADIUS; // engine-space radius |
293 | | - let len = |
294 | | - (eng_pos.x * eng_pos.x + eng_pos.z * eng_pos.z).sqrt(); |
295 | | - if len > max_r { |
296 | | - let scale = max_r / len; |
297 | | - eng_pos.x *= scale; |
298 | | - eng_pos.z *= scale; |
299 | | - } |
300 | | - let mut eng = engine_m.borrow_mut(); |
301 | | - let vi = drag_m.borrow().voice; |
302 | | - eng.set_voice_position( |
303 | | - vi, |
304 | | - Vec3::new(eng_pos.x, 0.0, eng_pos.z), |
305 | | - ); |
306 | | - // noisy drag debug log removed |
307 | | - } |
308 | | - } else { |
309 | | - // noisy drag-parallel debug log removed |
310 | | - } |
311 | | - // While dragging, boost swirl strength (used during render) |
312 | | - } else { |
313 | | - match best { |
314 | | - Some((i, _t)) => { |
315 | | - *hover_m.borrow_mut() = Some(i); |
316 | | - } |
317 | | - None => { |
318 | | - *hover_m.borrow_mut() = None; |
319 | | - } |
320 | | - } |
321 | | - } |
322 | | - }) as Box<dyn FnMut(_)>); |
323 | | - if let Some(w) = web::window() { |
324 | | - w.add_event_listener_with_callback( |
325 | | - "pointermove", |
326 | | - closure.as_ref().unchecked_ref(), |
327 | | - ) |
328 | | - .ok(); |
329 | | - } |
330 | | - closure.forget(); |
331 | | - } |
332 | | - |
333 | 241 | // Keyboard controls |
334 | 242 | events::wire_global_keydown( |
335 | 243 | engine.clone(), |
|
0 commit comments