@@ -16,7 +16,8 @@ pub struct BLAS {
16
16
17
17
#[ derive( Component ) ]
18
18
pub struct TLAS {
19
- pub tlas : Option < gfx_platform:: RaytracingTLAS >
19
+ pub tlas : Option < gfx_platform:: RaytracingTLAS > ,
20
+ pub instance_buffer : Option < gfx_platform:: Buffer >
20
21
}
21
22
22
23
/// Setup multiple draw calls with draw indexed and per draw call push constants for transformation matrix etc.
@@ -28,9 +29,10 @@ pub fn raytraced_shadows(client: &mut Client<gfx_platform::Device, os_platform::
28
29
"setup_raytraced_shadows_scene"
29
30
] ,
30
31
update : systems ! [
31
- "setup_raytraced_shadows_tlas " ,
32
+ "animate_meshes " ,
32
33
"animate_lights" ,
33
- "batch_lights"
34
+ "batch_lights" ,
35
+ "update_tlas"
34
36
] ,
35
37
render_graph : "mesh_lit_rt_shadow" ,
36
38
..Default :: default ( )
@@ -64,8 +66,9 @@ pub fn setup_raytraced_shadows_scene(
64
66
mut commands : Commands ) -> Result < ( ) , hotline_rs:: Error > {
65
67
66
68
let cube_mesh = hotline_rs:: primitives:: create_cube_mesh ( & mut device. 0 ) ;
69
+
67
70
let tourus_mesh = hotline_rs:: primitives:: create_tourus_mesh ( & mut device. 0 , 32 ) ;
68
- let helix_mesh = hotline_rs:: primitives:: create_helix_mesh ( & mut device. 0 , 32 , 4 ) ;
71
+ let teapot_mesh = hotline_rs:: primitives:: create_teapot_mesh ( & mut device. 0 , 32 ) ;
69
72
let tube_mesh = hotline_rs:: primitives:: create_tube_prism_mesh ( & mut device. 0 , 32 , 0 , 32 , true , true , 1.0 , 0.66 , 1.0 ) ;
70
73
let triangle_mesh = hotline_rs:: primitives:: create_tube_prism_mesh ( & mut device. 0 , 3 , 0 , 3 , false , true , 0.33 , 0.66 , 1.0 ) ;
71
74
@@ -115,9 +118,9 @@ pub fn setup_raytraced_shadows_scene(
115
118
Position ( vec3f ( shape_bounds * -0.3 , shape_bounds * -0.6 , shape_bounds * 0.8 ) ) ,
116
119
Scale ( splat3f ( tourus_size * 2.0 ) ) ,
117
120
Rotation ( Quatf :: identity ( ) ) ,
118
- MeshComponent ( helix_mesh . clone ( ) ) ,
121
+ MeshComponent ( teapot_mesh . clone ( ) ) ,
119
122
WorldMatrix ( Mat34f :: identity ( ) ) ,
120
- blas_from_mesh ( & mut device, & helix_mesh ) ?
123
+ blas_from_mesh ( & mut device, & teapot_mesh ) ?
121
124
) ) ;
122
125
123
126
// tube
@@ -190,15 +193,16 @@ pub fn setup_raytraced_shadows_scene(
190
193
191
194
commands. spawn (
192
195
TLAS {
193
- tlas : None
196
+ tlas : None ,
197
+ instance_buffer : None
194
198
}
195
199
) ;
196
200
197
201
Ok ( ( ) )
198
202
}
199
203
200
204
#[ export_update_fn]
201
- pub fn setup_raytraced_shadows_tlas (
205
+ pub fn update_tlas (
202
206
mut device : ResMut < DeviceRes > ,
203
207
mut pmfx : ResMut < PmfxRes > ,
204
208
mut entities_query : Query < ( & mut Position , & mut Scale , & mut Rotation , & BLAS ) > ,
@@ -207,31 +211,31 @@ pub fn setup_raytraced_shadows_tlas(
207
211
208
212
// ..
209
213
for mut t in & mut tlas_query {
214
+ let mut instances = Vec :: new ( ) ;
215
+ for ( index, ( position, scale, rotation, blas) ) in & mut entities_query. iter ( ) . enumerate ( ) {
216
+ let translate = Mat34f :: from_translation ( position. 0 ) ;
217
+ let rotate = Mat34f :: from ( rotation. 0 ) ;
218
+ let scale = Mat34f :: from_scale ( scale. 0 ) ;
219
+ instances. push (
220
+ gfx:: RaytracingInstanceInfo :: < gfx_platform:: Device > {
221
+ transform : ( translate * rotate * scale) . m ,
222
+ instance_id : index as u32 ,
223
+ instance_mask : 0xff ,
224
+ hit_group_index : 0 ,
225
+ instance_flags : 0 ,
226
+ blas : & blas. blas
227
+ }
228
+ ) ;
229
+ }
210
230
if t. tlas . is_none ( ) {
211
- let mut instances = Vec :: new ( ) ;
212
- for ( index, ( position, scale, rotation, blas) ) in & mut entities_query. iter ( ) . enumerate ( ) {
213
- let translate = Mat34f :: from_translation ( position. 0 ) ;
214
- let rotate = Mat34f :: from ( rotation. 0 ) ;
215
- let scale = Mat34f :: from_scale ( scale. 0 ) ;
216
- instances. push (
217
- gfx:: RaytracingInstanceInfo :: < gfx_platform:: Device > {
218
- transform : ( translate * rotate * scale) . m ,
219
- instance_id : index as u32 ,
220
- instance_mask : 0xff ,
221
- hit_group_index : 0 ,
222
- instance_flags : 0 ,
223
- blas : & blas. blas
224
- }
225
- ) ;
226
- let tlas = device. create_raytracing_tlas_with_heap ( & gfx:: RaytracingTLASInfo {
227
- instances : & instances,
228
- build_flags : gfx:: AccelerationStructureBuildFlags :: PREFER_FAST_TRACE ,
229
- } ,
230
- & mut pmfx. shader_heap
231
- ) ?;
232
-
233
- t. tlas = Some ( tlas) ;
234
- }
231
+ let tlas = device. create_raytracing_tlas_with_heap ( & gfx:: RaytracingTLASInfo {
232
+ instances : & instances,
233
+ build_flags : gfx:: AccelerationStructureBuildFlags :: PREFER_FAST_TRACE |
234
+ gfx:: AccelerationStructureBuildFlags :: ALLOW_UPDATE
235
+ } ,
236
+ & mut pmfx. shader_heap
237
+ ) ?;
238
+ t. tlas = Some ( tlas) ;
235
239
}
236
240
}
237
241
@@ -246,7 +250,6 @@ pub fn animate_lights (
246
250
let extent = 60.0 ;
247
251
for ( mut position, _) in & mut light_query {
248
252
position. 0 = vec3f ( sin ( time. accumulated ) , cos ( time. accumulated ) , cos ( time. accumulated ) ) * extent;
249
- position. 0 += vec3f ( 100.0 , 10.0 , 100.0 ) ;
250
253
}
251
254
252
255
Ok ( ( ) )
@@ -259,16 +262,45 @@ pub fn animate_lights (
259
262
260
263
#[ export_compute_fn]
261
264
pub fn render_meshes_raytraced (
262
- device : ResMut < DeviceRes > ,
265
+ mut device : ResMut < DeviceRes > ,
263
266
pmfx : & Res < PmfxRes > ,
264
267
pass : & pmfx:: ComputePass < gfx_platform:: Device > ,
265
- tlas_query : Query < & TLAS >
268
+ mut entities_query : Query < ( & mut Position , & mut Scale , & mut Rotation , & BLAS ) > ,
269
+ mut tlas_query : Query < & mut TLAS > ,
266
270
) -> Result < ( ) , hotline_rs:: Error > {
267
271
let pmfx = & pmfx. 0 ;
268
272
273
+ let mut heap = pmfx. shader_heap . clone ( ) ;
274
+
269
275
let output_size = pmfx. get_texture_2d_size ( "staging_output" ) . expect ( "expected staging_output" ) ;
270
276
let output_tex = pmfx. get_texture ( "staging_output" ) . expect ( "expected staging_output" ) ;
271
277
278
+ // update tlas
279
+ for mut t in & mut tlas_query {
280
+ let mut instances = Vec :: new ( ) ;
281
+ for ( index, ( position, scale, rotation, blas) ) in & mut entities_query. iter ( ) . enumerate ( ) {
282
+ let translate = Mat34f :: from_translation ( position. 0 ) ;
283
+ let rotate = Mat34f :: from ( rotation. 0 ) ;
284
+ let scale = Mat34f :: from_scale ( scale. 0 ) ;
285
+ instances. push (
286
+ gfx:: RaytracingInstanceInfo :: < gfx_platform:: Device > {
287
+ transform : ( translate * rotate * scale) . m ,
288
+ instance_id : index as u32 ,
289
+ instance_mask : 0xff ,
290
+ hit_group_index : 0 ,
291
+ instance_flags : 0 ,
292
+ blas : & blas. blas
293
+ }
294
+ ) ;
295
+ }
296
+
297
+ if let Some ( tlas) = t. tlas . as_ref ( ) {
298
+ let instance_buffer = device. create_raytracing_instance_buffer ( & instances, & mut heap) ?;
299
+ pass. cmd_buf . update_raytracing_tlas ( tlas, & instance_buffer, instances. len ( ) , gfx:: AccelerationStructureRebuildMode :: Refit ) ;
300
+ t. instance_buffer = Some ( instance_buffer) ;
301
+ }
302
+ }
303
+
272
304
let camera = pmfx. get_camera_constants ( "main_camera" ) ;
273
305
if let Ok ( camera) = camera {
274
306
for t in & tlas_query {
0 commit comments