@@ -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} ;
1616use math:: math:: vector:: { vec2, vec4} ;
1717
18+ use crate :: backends:: vulkan:: vulkan_uniform:: UniformGGlass ;
19+
1820use 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+
4153fn 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+
195272fn 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