@@ -77,8 +77,8 @@ fn add_chunk_objects(
77
77
texture_manager : & terrain_util:: TextureManager ,
78
78
) {
79
79
if let Some ( mesh) = create_chunk_mesh ( chunk, texture_manager) {
80
- let material = create_chunk_material ( asset_server, materials) ;
81
- spawn_chunk ( commands, meshes, material, mesh, chunk) ;
80
+ let material = create_chunk_material ( asset_server, & mut ResMut :: reborrow ( materials) ) ;
81
+ spawn_chunk ( commands, & mut ResMut :: reborrow ( meshes) , material, mesh, chunk) ;
82
82
}
83
83
}
84
84
@@ -91,8 +91,9 @@ fn create_chunk_mesh(
91
91
92
92
fn create_chunk_material (
93
93
asset_server : & Res < AssetServer > ,
94
- materials : & mut ResMut < Assets < StandardMaterial > > ,
94
+ materials : & mut Mut < Assets < StandardMaterial > > ,
95
95
) -> Handle < StandardMaterial > {
96
+ // use Mut instead of ResMut because of https://github.com/bevyengine/bevy/issues/11765
96
97
let texture_handle: Handle < Image > = asset_server. load ( "textures/texture_atlas.png" ) ;
97
98
materials. add ( StandardMaterial {
98
99
perceptual_roughness : 0.5 ,
@@ -106,7 +107,7 @@ fn create_chunk_material(
106
107
107
108
fn spawn_chunk (
108
109
commands : & mut Commands ,
109
- meshes : & mut ResMut < Assets < Mesh > > ,
110
+ meshes : & mut Mut < Assets < Mesh > > ,
110
111
material : Handle < StandardMaterial > ,
111
112
mesh : Mesh ,
112
113
chunk : & terrain_util:: Chunk ,
@@ -134,3 +135,56 @@ fn spawn_chunk(
134
135
) ) ;
135
136
}
136
137
138
+ #[ cfg( test) ]
139
+ mod tests {
140
+ use super :: * ;
141
+ use bevy:: asset:: AssetPlugin ;
142
+
143
+ fn setup_app ( ) -> App {
144
+ let mut app = App :: new ( ) ;
145
+ app
146
+ . add_plugins ( MinimalPlugins )
147
+ . add_plugins ( AssetPlugin :: default ( ) ) ;
148
+ app
149
+ }
150
+
151
+ #[ test]
152
+ fn test_create_chunk_material ( ) {
153
+ let mut app = setup_app ( ) ;
154
+ let world = & mut app. world ;
155
+
156
+ world. insert_resource ( Assets :: < StandardMaterial > :: default ( ) ) ;
157
+
158
+ let asset_server = world. get_resource_ref :: < AssetServer > ( ) . unwrap ( ) ;
159
+ let mut materials = world. get_resource_mut :: < Assets < StandardMaterial > > ( ) . unwrap ( ) ;
160
+
161
+ let material = create_chunk_material ( & asset_server, & mut materials) ;
162
+ assert ! ( materials. get( & material) . is_some( ) ) ;
163
+ }
164
+
165
+ #[ test]
166
+ fn test_spawn_chunk ( ) {
167
+ let mut app = setup_app ( ) ;
168
+ let world = & mut app. world ;
169
+ let mut command_queue = CommandQueue :: default ( ) ;
170
+ let mut commands = Commands :: new ( & mut command_queue, world) ;
171
+
172
+ world. insert_resource ( Assets :: < StandardMaterial > :: default ( ) ) ;
173
+ world. insert_resource ( Assets :: < Mesh > :: default ( ) ) ;
174
+
175
+ let asset_server = world. get_resource_ref :: < AssetServer > ( ) . unwrap ( ) ;
176
+ let mut materials = world. get_resource_ref :: < Assets < StandardMaterial > > ( ) . unwrap ( ) ;
177
+ let mut meshes = world. get_resource_mut :: < Assets < Mesh > > ( ) . unwrap ( ) ;
178
+
179
+ let chunk = terrain_util:: Chunk :: default ( ) ;
180
+ let mesh = create_chunk_mesh ( & chunk, & terrain_util:: TextureManager :: default ( ) ) . unwrap ( ) ;
181
+ let material = create_chunk_material ( & asset_server, & mut materials) ;
182
+
183
+ spawn_chunk ( & mut commands, & mut meshes, material, mesh, & chunk) ;
184
+
185
+ command_queue. apply ( world) ;
186
+
187
+ let query = world. query :: < & terrain_components:: ChunkMesh > ( ) ;
188
+ assert_eq ! ( query. iter( world) . count( ) , 1 ) ;
189
+ }
190
+ }
0 commit comments