|
| 1 | +use crate::state::AppState; |
| 2 | + |
1 | 3 | use super::{display, process, window, TickTask, WayVRSignal}; |
2 | 4 | use bytes::BufMut; |
| 5 | +use glam::Vec3A; |
3 | 6 | use interprocess::local_socket::{self, traits::Listener, ToNsName}; |
4 | 7 | use smallvec::SmallVec; |
5 | 8 | use std::io::{Read, Write}; |
6 | 9 | use wayvr_ipc::{ |
7 | 10 | ipc::{self}, |
8 | 11 | packet_client::{self, PacketClient}, |
9 | | - packet_server::{self, PacketServer}, |
| 12 | + packet_server::{self, PacketServer, WlxInputStatePointer}, |
10 | 13 | }; |
11 | 14 |
|
12 | 15 | pub struct AuthInfo { |
@@ -70,6 +73,7 @@ fn read_payload(conn: &mut local_socket::Stream, size: u32) -> Option<Payload> { |
70 | 73 | pub struct TickParams<'a> { |
71 | 74 | pub state: &'a mut super::WayVRState, |
72 | 75 | pub tasks: &'a mut Vec<TickTask>, |
| 76 | + pub app: &'a AppState, |
73 | 77 | } |
74 | 78 |
|
75 | 79 | pub fn gen_args_vec(input: &str) -> Vec<&str> { |
@@ -177,6 +181,34 @@ impl Connection { |
177 | 181 | Ok(()) |
178 | 182 | } |
179 | 183 |
|
| 184 | + fn handle_wlx_input_state( |
| 185 | + &mut self, |
| 186 | + params: &TickParams, |
| 187 | + serial: ipc::Serial, |
| 188 | + ) -> anyhow::Result<()> { |
| 189 | + let input_state = ¶ms.app.input_state; |
| 190 | + |
| 191 | + let to_arr = |vec: &Vec3A| -> [f32; 3] { [vec.x, vec.y, vec.z] }; |
| 192 | + |
| 193 | + send_packet( |
| 194 | + &mut self.conn, |
| 195 | + &ipc::data_encode(&PacketServer::WlxInputStateResponse( |
| 196 | + serial, |
| 197 | + packet_server::WlxInputState { |
| 198 | + hmd_pos: to_arr(&input_state.hmd.translation), |
| 199 | + left: WlxInputStatePointer { |
| 200 | + pos: to_arr(&input_state.pointers[0].raw_pose.translation), |
| 201 | + }, |
| 202 | + right: WlxInputStatePointer { |
| 203 | + pos: to_arr(&input_state.pointers[0].raw_pose.translation), |
| 204 | + }, |
| 205 | + }, |
| 206 | + )), |
| 207 | + )?; |
| 208 | + |
| 209 | + Ok(()) |
| 210 | + } |
| 211 | + |
180 | 212 | fn handle_wvr_display_create( |
181 | 213 | &mut self, |
182 | 214 | params: &mut TickParams, |
@@ -471,6 +503,9 @@ impl Connection { |
471 | 503 |
|
472 | 504 | match packet { |
473 | 505 | PacketClient::Handshake(_) => unreachable!(), // handled previously |
| 506 | + PacketClient::WlxInputState(serial) => { |
| 507 | + self.handle_wlx_input_state(params, serial)?; |
| 508 | + } |
474 | 509 | PacketClient::WvrDisplayList(serial) => { |
475 | 510 | self.handle_wvr_display_list(params, serial)?; |
476 | 511 | } |
@@ -633,10 +668,11 @@ impl WayVRServer { |
633 | 668 | Ok(()) |
634 | 669 | } |
635 | 670 |
|
636 | | - pub fn broadcast(&mut self, packet: packet_server::PacketServer) -> anyhow::Result<()> { |
| 671 | + pub fn broadcast(&mut self, packet: packet_server::PacketServer) { |
637 | 672 | for connection in &mut self.connections { |
638 | | - send_packet(&mut connection.conn, &ipc::data_encode(&packet))?; |
| 673 | + if let Err(e) = send_packet(&mut connection.conn, &ipc::data_encode(&packet)) { |
| 674 | + log::error!("failed to broadcast packet: {:?}", e); |
| 675 | + } |
639 | 676 | } |
640 | | - Ok(()) |
641 | 677 | } |
642 | 678 | } |
0 commit comments