1
1
use crate :: {
2
2
camera:: CameraProjection ,
3
+ camera:: { ManualTextureViewHandle , ManualTextureViews } ,
3
4
prelude:: Image ,
4
5
render_asset:: RenderAssets ,
5
6
render_resource:: TextureView ,
@@ -26,7 +27,6 @@ use bevy_utils::{HashMap, HashSet};
26
27
use bevy_window:: {
27
28
NormalizedWindowRef , PrimaryWindow , Window , WindowCreated , WindowRef , WindowResized ,
28
29
} ;
29
-
30
30
use std:: { borrow:: Cow , ops:: Range } ;
31
31
use wgpu:: { BlendState , Extent3d , LoadOp , TextureFormat } ;
32
32
@@ -383,6 +383,9 @@ pub enum RenderTarget {
383
383
Window ( WindowRef ) ,
384
384
/// Image to which the camera's view is rendered.
385
385
Image ( Handle < Image > ) ,
386
+ /// Texture View to which the camera's view is rendered.
387
+ /// Useful when the texture view needs to be created outside of Bevy, for example OpenXR.
388
+ TextureView ( ManualTextureViewHandle ) ,
386
389
}
387
390
388
391
/// Normalized version of the render target.
@@ -394,6 +397,9 @@ pub enum NormalizedRenderTarget {
394
397
Window ( NormalizedWindowRef ) ,
395
398
/// Image to which the camera's view is rendered.
396
399
Image ( Handle < Image > ) ,
400
+ /// Texture View to which the camera's view is rendered.
401
+ /// Useful when the texture view needs to be created outside of Bevy, for example OpenXR.
402
+ TextureView ( ManualTextureViewHandle ) ,
397
403
}
398
404
399
405
impl Default for RenderTarget {
@@ -410,6 +416,7 @@ impl RenderTarget {
410
416
. normalize ( primary_window)
411
417
. map ( NormalizedRenderTarget :: Window ) ,
412
418
RenderTarget :: Image ( handle) => Some ( NormalizedRenderTarget :: Image ( handle. clone ( ) ) ) ,
419
+ RenderTarget :: TextureView ( id) => Some ( NormalizedRenderTarget :: TextureView ( * id) ) ,
413
420
}
414
421
}
415
422
}
@@ -419,6 +426,7 @@ impl NormalizedRenderTarget {
419
426
& self ,
420
427
windows : & ' a ExtractedWindows ,
421
428
images : & ' a RenderAssets < Image > ,
429
+ manual_texture_views : & ' a ManualTextureViews ,
422
430
) -> Option < & ' a TextureView > {
423
431
match self {
424
432
NormalizedRenderTarget :: Window ( window_ref) => windows
@@ -427,6 +435,9 @@ impl NormalizedRenderTarget {
427
435
NormalizedRenderTarget :: Image ( image_handle) => {
428
436
images. get ( image_handle) . map ( |image| & image. texture_view )
429
437
}
438
+ NormalizedRenderTarget :: TextureView ( id) => {
439
+ manual_texture_views. get ( id) . map ( |tex| & tex. texture_view )
440
+ }
430
441
}
431
442
}
432
443
@@ -435,6 +446,7 @@ impl NormalizedRenderTarget {
435
446
& self ,
436
447
windows : & ' a ExtractedWindows ,
437
448
images : & ' a RenderAssets < Image > ,
449
+ manual_texture_views : & ' a ManualTextureViews ,
438
450
) -> Option < TextureFormat > {
439
451
match self {
440
452
NormalizedRenderTarget :: Window ( window_ref) => windows
@@ -443,13 +455,17 @@ impl NormalizedRenderTarget {
443
455
NormalizedRenderTarget :: Image ( image_handle) => {
444
456
images. get ( image_handle) . map ( |image| image. texture_format )
445
457
}
458
+ NormalizedRenderTarget :: TextureView ( id) => {
459
+ manual_texture_views. get ( id) . map ( |tex| tex. format )
460
+ }
446
461
}
447
462
}
448
463
449
464
pub fn get_render_target_info < ' a > (
450
465
& self ,
451
466
resolutions : impl IntoIterator < Item = ( Entity , & ' a Window ) > ,
452
467
images : & Assets < Image > ,
468
+ manual_texture_views : & ManualTextureViews ,
453
469
) -> Option < RenderTargetInfo > {
454
470
match self {
455
471
NormalizedRenderTarget :: Window ( window_ref) => resolutions
@@ -470,6 +486,12 @@ impl NormalizedRenderTarget {
470
486
scale_factor : 1.0 ,
471
487
} )
472
488
}
489
+ NormalizedRenderTarget :: TextureView ( id) => {
490
+ manual_texture_views. get ( id) . map ( |tex| RenderTargetInfo {
491
+ physical_size : tex. size ,
492
+ scale_factor : 1.0 ,
493
+ } )
494
+ }
473
495
}
474
496
}
475
497
@@ -486,6 +508,7 @@ impl NormalizedRenderTarget {
486
508
NormalizedRenderTarget :: Image ( image_handle) => {
487
509
changed_image_handles. contains ( & image_handle)
488
510
}
511
+ NormalizedRenderTarget :: TextureView ( _) => true ,
489
512
}
490
513
}
491
514
}
@@ -509,13 +532,15 @@ impl NormalizedRenderTarget {
509
532
/// [`OrthographicProjection`]: crate::camera::OrthographicProjection
510
533
/// [`PerspectiveProjection`]: crate::camera::PerspectiveProjection
511
534
/// [`Projection`]: crate::camera::Projection
535
+ #[ allow( clippy:: too_many_arguments) ]
512
536
pub fn camera_system < T : CameraProjection + Component > (
513
537
mut window_resized_events : EventReader < WindowResized > ,
514
538
mut window_created_events : EventReader < WindowCreated > ,
515
539
mut image_asset_events : EventReader < AssetEvent < Image > > ,
516
540
primary_window : Query < Entity , With < PrimaryWindow > > ,
517
541
windows : Query < ( Entity , & Window ) > ,
518
542
images : Res < Assets < Image > > ,
543
+ manual_texture_views : Res < ManualTextureViews > ,
519
544
mut cameras : Query < ( & mut Camera , & mut T ) > ,
520
545
) {
521
546
let primary_window = primary_window. iter ( ) . next ( ) ;
@@ -547,8 +572,11 @@ pub fn camera_system<T: CameraProjection + Component>(
547
572
|| camera_projection. is_changed ( )
548
573
|| camera. computed . old_viewport_size != viewport_size
549
574
{
550
- camera. computed . target_info =
551
- normalized_target. get_render_target_info ( & windows, & images) ;
575
+ camera. computed . target_info = normalized_target. get_render_target_info (
576
+ & windows,
577
+ & images,
578
+ & manual_texture_views,
579
+ ) ;
552
580
if let Some ( size) = camera. logical_viewport_size ( ) {
553
581
camera_projection. update ( size. x , size. y ) ;
554
582
camera. computed . projection_matrix = camera_projection. get_projection_matrix ( ) ;
0 commit comments