@@ -6,6 +6,7 @@ use bevy::{
6
6
camera:: { Camera2d , Camera3d , CameraProjection } ,
7
7
primitives:: { Aabb , Frustum , Sphere } ,
8
8
} ,
9
+ scene:: InstanceId ,
9
10
} ;
10
11
11
12
fn main ( ) {
@@ -48,6 +49,7 @@ Controls:
48
49
49
50
struct SceneHandle {
50
51
handle : Handle < Scene > ,
52
+ instance_id : Option < InstanceId > ,
51
53
is_loaded : bool ,
52
54
has_camera : bool ,
53
55
has_light : bool ,
@@ -59,45 +61,53 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
59
61
. unwrap_or_else ( || "assets/models/FlightHelmet/FlightHelmet.gltf#Scene0" . to_string ( ) ) ;
60
62
commands. insert_resource ( SceneHandle {
61
63
handle : asset_server. load ( & scene_path) ,
64
+ instance_id : None ,
62
65
is_loaded : false ,
63
66
has_camera : false ,
64
67
has_light : false ,
65
68
} ) ;
66
69
}
67
70
68
71
fn scene_load_check (
69
- mut commands : Commands ,
70
72
asset_server : Res < AssetServer > ,
71
73
mut scenes : ResMut < Assets < Scene > > ,
72
74
mut scene_handle : ResMut < SceneHandle > ,
75
+ mut scene_spawner : ResMut < SceneSpawner > ,
73
76
) {
74
- if !scene_handle. is_loaded
75
- && asset_server. get_load_state ( & scene_handle. handle ) == LoadState :: Loaded
76
- {
77
- if let Some ( scene) = scenes. get_mut ( & scene_handle. handle ) {
78
- let mut query = scene
79
- . world
80
- . query :: < ( Option < & Camera2d > , Option < & Camera3d > ) > ( ) ;
81
- scene_handle. has_camera =
82
- query
83
- . iter ( & scene. world )
84
- . any ( |( maybe_camera2d, maybe_camera3d) | {
85
- maybe_camera2d. is_some ( ) || maybe_camera3d. is_some ( )
86
- } ) ;
87
- let mut query = scene
88
- . world
89
- . query :: < ( Option < & DirectionalLight > , Option < & PointLight > ) > ( ) ;
90
- scene_handle. has_light =
91
- query
92
- . iter ( & scene. world )
93
- . any ( |( maybe_directional_light, maybe_point_light) | {
94
- maybe_directional_light. is_some ( ) || maybe_point_light. is_some ( )
95
- } ) ;
77
+ match scene_handle. instance_id {
78
+ None if asset_server. get_load_state ( & scene_handle. handle ) == LoadState :: Loaded => {
79
+ if let Some ( scene) = scenes. get_mut ( & scene_handle. handle ) {
80
+ let mut query = scene
81
+ . world
82
+ . query :: < ( Option < & Camera2d > , Option < & Camera3d > ) > ( ) ;
83
+ scene_handle. has_camera =
84
+ query
85
+ . iter ( & scene. world )
86
+ . any ( |( maybe_camera2d, maybe_camera3d) | {
87
+ maybe_camera2d. is_some ( ) || maybe_camera3d. is_some ( )
88
+ } ) ;
89
+ let mut query = scene
90
+ . world
91
+ . query :: < ( Option < & DirectionalLight > , Option < & PointLight > ) > ( ) ;
92
+ scene_handle. has_light =
93
+ query
94
+ . iter ( & scene. world )
95
+ . any ( |( maybe_directional_light, maybe_point_light) | {
96
+ maybe_directional_light. is_some ( ) || maybe_point_light. is_some ( )
97
+ } ) ;
96
98
97
- commands. spawn_scene ( scene_handle. handle . clone_weak ( ) ) ;
98
- scene_handle. is_loaded = true ;
99
- println ! ( "Spawning scene" ) ;
99
+ scene_handle. instance_id =
100
+ Some ( scene_spawner. spawn ( scene_handle. handle . clone_weak ( ) ) ) ;
101
+ println ! ( "Spawning scene..." ) ;
102
+ }
103
+ }
104
+ Some ( instance_id) if !scene_handle. is_loaded => {
105
+ if scene_spawner. instance_is_ready ( instance_id) {
106
+ println ! ( "...done!" ) ;
107
+ scene_handle. is_loaded = true ;
108
+ }
100
109
}
110
+ _ => { }
101
111
}
102
112
}
103
113
0 commit comments