Skip to content

Commit c9f4d7a

Browse files
committed
Add glass shader support & add for emote wheel cursor
1 parent e283882 commit c9f4d7a

File tree

17 files changed

+726
-286
lines changed

17 files changed

+726
-286
lines changed

data

game/client-ui/src/emote_wheel/main_frame.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,10 @@ pub fn render(ui: &mut egui::Ui, pipe: &mut UiRenderPipe<UserData>, ui_state: &m
252252
);
253253
}
254254

255-
ui.painter().circle(
255+
ui_state.add_glass_elipse(
256256
egui::pos2(mouse.x as f32, mouse.y as f32),
257-
10.0,
258-
Color32::from_white_alpha(100),
259-
Stroke::NONE,
257+
egui::vec2(75.0, 75.0),
258+
2.2,
259+
Color32::from_rgba_unmultiplied(200, 200, 255, 255),
260260
);
261261
}

lib/api-ui/src/ui_impl.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use api::{GRAPHICS, GRAPHICS_BACKEND, read_param_from_host, upload_return_val};
44

55
use graphics_types::types::WindowProps;
66
use ui_base::{
7-
types::{BlurShape, RawInputWrapper, RawOutputWrapper, UiFonts, UiRenderPipe},
7+
types::{BlurShape, GlassShape, RawInputWrapper, RawOutputWrapper, UiFonts, UiRenderPipe},
88
ui::UiContainer,
99
ui_render::render_ui,
1010
};
@@ -44,7 +44,7 @@ fn ui_run_impl(
4444
inp: RawInputWrapper,
4545
zoom_level: Option<f32>,
4646
mut user_data: U,
47-
) -> (egui::PlatformOutput, Vec<BlurShape>) {
47+
) -> (egui::PlatformOutput, Vec<BlurShape>, Vec<GlassShape>) {
4848
API_UI.with(|g| g.borrow_mut().zoom_level.set(zoom_level));
4949
GRAPHICS.with(|g| g.resized(window_props));
5050

@@ -88,6 +88,7 @@ fn ui_run_impl(
8888
(
8989
platform_output,
9090
API_UI.with(|ui| std::mem::take(&mut ui.borrow_mut().ui_state.blur_shapes)),
91+
API_UI.with(|ui| std::mem::take(&mut ui.borrow_mut().ui_state.glass_shapes)),
9192
)
9293
}
9394

@@ -108,10 +109,12 @@ pub fn ui_run() {
108109
let inp = read_param_from_host::<RawInputWrapper>(2);
109110
let zoom_level = read_param_from_host::<Option<f32>>(3);
110111

111-
let (output, blur_shapes) = ui_run_impl(cur_time, window_props, inp, zoom_level, ());
112+
let (output, blur_shapes, glass_shapes) =
113+
ui_run_impl(cur_time, window_props, inp, zoom_level, ());
112114
upload_return_val(RawOutputWrapper {
113115
output,
114116
blur_shapes,
117+
glass_shapes,
115118
zoom_level: API_UI.with(|g| g.borrow().zoom_level.get()),
116119
});
117120
}

lib/graphics-backend-traits/src/plugin.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ pub enum SubRenderPassAttributes {
159159
StandardBlurPipeline,
160160
Standard3dPipeline,
161161
BlurPipeline,
162+
GlassPipeline,
162163
PrimExPipeline,
163164
PrimExRotationlessPipeline,
164165
SpriteMultiPipeline,

lib/graphics-backend/src/backends/vulkan/render_cmds.rs

Lines changed: 110 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ use graphics_types::{
1111
CommandsRenderQuadContainer, CommandsRenderStream, GRAPHICS_DEFAULT_UNIFORM_SIZE,
1212
GRAPHICS_MAX_UNIFORM_RENDER_COUNT, PrimType, RenderSpriteInfo,
1313
},
14-
rendering::{ColorRgba, State, StateTexture, WrapType},
14+
rendering::{ColorRgba, RenderModeGlass, State, StateTexture, WrapType},
1515
};
1616
use math::math::vector::{vec2, vec4};
1717

18+
use crate::backends::vulkan::vulkan_uniform::UniformGGlass;
19+
1820
use super::{
1921
command_pool::AutoCommandBuffer,
2022
logical_device::LogicalDevice,
@@ -38,6 +40,16 @@ pub fn get_address_mode_index(state: &State) -> usize {
3840
}
3941
}
4042

43+
enum RenderMode {
44+
Normal,
45+
Blur {
46+
blur_radius: f32,
47+
scale: vec2,
48+
blur_color: vec4,
49+
},
50+
Glass(RenderModeGlass),
51+
}
52+
4153
fn render_blur(
4254
mut render_manager: RenderManager,
4355
state: &State,
@@ -58,10 +70,33 @@ fn render_blur(
5870
prim_type,
5971
primitive_count,
6072
&m,
61-
true,
62-
blur_radius,
63-
scale,
64-
blur_color,
73+
RenderMode::Blur {
74+
blur_radius,
75+
scale,
76+
blur_color,
77+
},
78+
)
79+
}
80+
81+
fn render_glass(
82+
mut render_manager: RenderManager,
83+
state: &State,
84+
texture_index: &StateTexture,
85+
prim_type: PrimType,
86+
primitive_count: usize,
87+
glass: RenderModeGlass,
88+
) {
89+
let mut m: [f32; 4 * 2] = Default::default();
90+
render_manager.get_state_matrix(state, &mut m);
91+
92+
render_manager.bind_pipeline(state, texture_index, SubRenderPassAttributes::GlassPipeline);
93+
94+
render_standard_impl::<false>(
95+
render_manager,
96+
prim_type,
97+
primitive_count,
98+
&m,
99+
RenderMode::Glass(glass),
65100
)
66101
}
67102

@@ -70,10 +105,7 @@ fn render_standard_impl<const IS_3D_TEXTURED: bool>(
70105
prim_type: PrimType,
71106
primitive_count: usize,
72107
m: &[f32],
73-
as_blur: bool,
74-
blur_radius: f32,
75-
scale: vec2,
76-
blur_color: vec4,
108+
mode: RenderMode,
77109
) {
78110
let mut vert_per_prim: usize = 2;
79111
let mut is_indexed: bool = false;
@@ -99,24 +131,60 @@ fn render_standard_impl<const IS_3D_TEXTURED: bool>(
99131
std::mem::size_of_val(m),
100132
)
101133
});
102-
if as_blur {
103-
let viewport_size = render_manager.viewport_size();
104-
let blur_push = UniformGBlur {
105-
texture_size: vec2::new(viewport_size.width as f32, viewport_size.height as f32),
134+
match mode {
135+
RenderMode::Normal => {
136+
// nothing to do
137+
}
138+
RenderMode::Blur {
106139
blur_radius,
107140
scale,
108-
color: blur_color,
109-
};
110-
render_manager.push_constants(
111-
BackendShaderStage::FRAGMENT,
112-
std::mem::size_of::<UniformGPos>() as u32,
113-
unsafe {
114-
std::slice::from_raw_parts(
115-
&blur_push as *const _ as *const u8,
116-
std::mem::size_of::<UniformGBlur>(),
117-
)
118-
},
119-
);
141+
blur_color,
142+
} => {
143+
let viewport_size = render_manager.viewport_size();
144+
let blur_push = UniformGBlur {
145+
texture_size: vec2::new(viewport_size.width as f32, viewport_size.height as f32),
146+
blur_radius,
147+
scale,
148+
color: blur_color,
149+
};
150+
render_manager.push_constants(
151+
BackendShaderStage::FRAGMENT,
152+
std::mem::size_of::<UniformGPos>() as u32,
153+
unsafe {
154+
std::slice::from_raw_parts(
155+
&blur_push as *const _ as *const u8,
156+
std::mem::size_of::<UniformGBlur>(),
157+
)
158+
},
159+
);
160+
}
161+
RenderMode::Glass(glass) => {
162+
let blur_push = UniformGGlass {
163+
elipse_strength: glass.elipse_strength,
164+
exponent_offset: glass.exponent_offset,
165+
decay_scale: glass.decay_scale,
166+
base_factor: glass.base_factor,
167+
deca_rate: glass.deca_rate,
168+
refraction_falloff: glass.refraction_falloff,
169+
noise: glass.noise,
170+
glow_weight: glass.glow_weight,
171+
glow_bias: glass.glow_bias,
172+
glow_edge0: glass.glow_edge0,
173+
glow_edge1: glass.glow_edge1,
174+
center: glass.center,
175+
size: glass.size,
176+
};
177+
render_manager.push_constants(
178+
BackendShaderStage::FRAGMENT,
179+
std::mem::size_of::<UniformGPos>() as u32,
180+
unsafe {
181+
std::slice::from_raw_parts(
182+
&blur_push as *const _ as *const u8,
183+
std::mem::size_of::<UniformGGlass>(),
184+
)
185+
},
186+
);
187+
}
120188
}
121189

122190
if is_indexed {
@@ -155,10 +223,7 @@ fn render_standard<const IS_3D_TEXTURED: bool>(
155223
prim_type,
156224
primitive_count,
157225
&m,
158-
false,
159-
0.0,
160-
vec2::default(),
161-
vec4::default(),
226+
RenderMode::Normal,
162227
)
163228
}
164229

@@ -192,6 +257,18 @@ fn cmd_render_blurred(
192257
)
193258
}
194259

260+
fn cmd_render_glass(render_manager: RenderManager, cmd: &CommandRender, glass: RenderModeGlass) {
261+
// draw where the stencil buffer triggered
262+
render_glass(
263+
render_manager,
264+
&cmd.state,
265+
&cmd.texture_index,
266+
cmd.prim_type,
267+
cmd.prim_count,
268+
glass,
269+
)
270+
}
271+
195272
fn cmd_render_quad_container_ex(
196273
mut render_manager: RenderManager,
197274
cmd: &CommandRenderQuadContainer,
@@ -399,6 +476,10 @@ pub(crate) fn command_cb_render(
399476
cmd_render_blurred(render_manager, cmd, *blur_radius, *scale, *blur_color);
400477
Ok(())
401478
}
479+
CommandsRenderStream::RenderGlass { cmd, glass } => {
480+
cmd_render_glass(render_manager, cmd, *glass);
481+
Ok(())
482+
}
402483
},
403484
CommandsRender::QuadContainer(cmd) => match cmd {
404485
CommandsRenderQuadContainer::Render(cmd) => {

0 commit comments

Comments
 (0)