Skip to content

Commit

Permalink
Add whisper functionalty (client side), some server fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Jupeyy committed Jan 3, 2025
1 parent bdfefe3 commit b956dc5
Show file tree
Hide file tree
Showing 8 changed files with 388 additions and 66 deletions.
6 changes: 6 additions & 0 deletions examples/wasm-modules/chat/src/chat/page.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,13 @@ impl ChatPage {
skin_container: &mut self.skin_container,
render_tee: &self.render_tee,
mode: ChatMode::Global,

character_infos: &Default::default(),
local_character_ids: &Default::default(),

find_player_prompt: &mut Default::default(),
find_player_id: &mut Default::default(),
cur_whisper_player_id: &mut Default::default(),
},
),
ui_state,
Expand Down
13 changes: 13 additions & 0 deletions game/client-render-game/src/render_game.rs
Original file line number Diff line number Diff line change
Expand Up @@ -806,6 +806,18 @@ impl RenderGame {
false
};

// only call this when chat input is active, since it will allocate memory on heap
let local_character_ids = if chat_active {
render_info
.character_infos
.keys()
.copied()
.chain(render_info.dummies.iter().copied())
.collect()
} else {
Default::default()
};

res.extend(
self.chat
.render(&mut ChatRenderPipe {
Expand All @@ -820,6 +832,7 @@ impl RenderGame {
skin_container: &mut self.containers.skin_container,
tee_render: &mut self.players.tee_renderer,
character_infos: &render_info.character_infos,
local_character_ids: &local_character_ids,
})
.into_iter()
.map(PlayerFeedbackEvent::Chat),
Expand Down
23 changes: 21 additions & 2 deletions game/client-render/src/chat/render.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use std::{collections::VecDeque, time::Duration};
use std::{
collections::{HashSet, VecDeque},
time::Duration,
};

use base::linked_hash_map_view::FxLinkedHashMap;
use client_containers::skins::SkinContainer;
Expand All @@ -8,7 +11,10 @@ use client_ui::chat::{
user_data::{ChatEvent, ChatMode, MsgInChat, UserData},
};
use egui::Color32;
use game_interface::types::{id_types::CharacterId, render::character::CharacterInfo};
use game_interface::types::{
id_types::{CharacterId, PlayerId},
render::character::CharacterInfo,
};
use graphics::{
graphics::graphics::Graphics,
handles::{
Expand Down Expand Up @@ -40,6 +46,7 @@ pub struct ChatRenderPipe<'a> {
pub skin_container: &'a mut SkinContainer,
pub tee_render: &'a RenderTee,
pub character_infos: &'a FxLinkedHashMap<CharacterId, CharacterInfo>,
pub local_character_ids: &'a HashSet<CharacterId>,
}

pub struct ChatRender {
Expand All @@ -49,6 +56,10 @@ pub struct ChatRender {
pub msgs: RememberMut<VecDeque<MsgInChat>>,
pub last_render_options: Option<ChatRenderOptions>,

find_player_prompt: String,
find_player_id: Option<PlayerId>,
cur_whisper_player_id: Option<PlayerId>,

backend_handle: GraphicsBackendHandle,
canvas_handle: GraphicsCanvasHandle,
stream_handle: GraphicsStreamHandle,
Expand All @@ -66,6 +77,10 @@ impl ChatRender {
msgs: Default::default(),
last_render_options: None,

find_player_prompt: Default::default(),
find_player_id: Default::default(),
cur_whisper_player_id: Default::default(),

backend_handle: graphics.backend_handle.clone(),
canvas_handle: graphics.canvas_handle.clone(),
stream_handle: graphics.stream_handle.clone(),
Expand Down Expand Up @@ -103,6 +118,10 @@ impl ChatRender {
render_tee: pipe.tee_render,
mode: pipe.mode,
character_infos: pipe.character_infos,
local_character_ids: pipe.local_character_ids,
find_player_prompt: &mut self.find_player_prompt,
find_player_id: &mut self.find_player_id,
cur_whisper_player_id: &mut self.cur_whisper_player_id,
};
let mut dummy_pipe = UiRenderPipe::new(*pipe.cur_time, &mut user_data);
let (screen_rect, full_output, zoom_level) = self.ui.render_cached(
Expand Down
2 changes: 1 addition & 1 deletion game/client-ui/src/chat/chat_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use super::user_data::UserData;
pub fn render(ui: &mut egui::Ui, pipe: &mut UiRenderPipe<UserData>, ui_state: &mut UiState) {
ui.with_layout(Layout::bottom_up(egui::Align::Min), |ui| {
// active input comes first (most bottom)
super::input::render(ui, pipe);
super::input::render(ui, ui_state, pipe);

for msg in pipe.user_data.entries.iter() {
let time_diff = if pipe.user_data.show_chat_history {
Expand Down
Loading

0 comments on commit b956dc5

Please sign in to comment.