1
1
use crate :: persistance:: { Loadable , Saveable } ;
2
+ use crate :: world:: WorldChunk ;
2
3
use crate :: {
3
4
blocks:: {
4
5
block:: { Block , BlockVertexData , FaceDirections } ,
@@ -10,12 +11,12 @@ use crate::{
10
11
use glam:: Vec3 ;
11
12
use std:: any:: Any ;
12
13
use std:: error:: Error ;
13
- use std:: ptr:: drop_in_place;
14
- use std:: sync:: { Arc , Mutex } ;
14
+ use std:: sync:: { Arc , RwLock } ;
15
15
use wgpu:: util:: DeviceExt ;
16
16
17
- pub type BlockVec = Vec < Vec < Option < Arc < Mutex < Block > > > > > ;
17
+ pub type BlockVec = Vec < Vec < Option < Arc < RwLock < Block > > > > > ;
18
18
19
+ #[ derive( Debug ) ]
19
20
pub struct Chunk {
20
21
pub x : i32 ,
21
22
pub y : i32 ,
@@ -28,12 +29,12 @@ pub struct Chunk {
28
29
pub chunk_position_buffer : wgpu:: Buffer ,
29
30
pub chunk_index_buffer : Option < wgpu:: Buffer > ,
30
31
pub chunk_vertex_buffer : Option < wgpu:: Buffer > ,
31
- pub outside_blocks : Vec < Arc < Mutex < Block > > > ,
32
+ pub outside_blocks : Vec < Arc < RwLock < Block > > > ,
32
33
}
33
34
34
35
impl Chunk {
35
- pub fn add_block ( & mut self , block : Arc < Mutex < Block > > ) {
36
- let block_borrow = block. lock ( ) . unwrap ( ) ;
36
+ pub fn add_block ( & mut self , block : Arc < RwLock < Block > > ) {
37
+ let block_borrow = block. read ( ) . unwrap ( ) ;
37
38
38
39
let y_blocks = self
39
40
. blocks
@@ -71,7 +72,7 @@ impl Chunk {
71
72
}
72
73
return false ;
73
74
}
74
- pub fn get_block_at_relative ( & self , position : & glam:: Vec3 ) -> Option < Arc < Mutex < Block > > > {
75
+ pub fn get_block_at_relative ( & self , position : & glam:: Vec3 ) -> Option < Arc < RwLock < Block > > > {
75
76
if let Some ( y_blocks) = self
76
77
. blocks
77
78
. get ( ( ( position. x * CHUNK_SIZE as f32 ) + position. z ) as usize )
@@ -100,16 +101,16 @@ impl Chunk {
100
101
false
101
102
}
102
103
}
103
- pub fn build_mesh ( & mut self , other_chunks : Vec < Arc < Mutex < Chunk > > > ) {
104
+ pub fn build_mesh ( & self , other_chunks : Vec < WorldChunk > ) -> ( u32 , wgpu :: Buffer , wgpu :: Buffer ) {
104
105
let mut vertex: Vec < BlockVertexData > = vec ! [ ] ;
105
106
let mut indices: Vec < u32 > = vec ! [ ] ;
106
107
for x in 0 ..CHUNK_SIZE {
107
108
for z in 0 ..CHUNK_SIZE {
108
- let region = & self . blocks [ ( x * CHUNK_SIZE + z) as usize ] ;
109
+ let region = & self . blocks [ ( ( x * CHUNK_SIZE ) + z) as usize ] ;
109
110
for y in 0 ..region. len ( ) {
110
111
let block = & region[ y] ;
111
- if let Some ( block ) = block {
112
- let block = block . lock ( ) . unwrap ( ) ;
112
+ if let Some ( block_ptr ) = block {
113
+ let block = block_ptr . read ( ) . unwrap ( ) ;
113
114
let position = block. position ;
114
115
let faces = FaceDirections :: all ( ) ;
115
116
@@ -132,12 +133,15 @@ impl Chunk {
132
133
) ;
133
134
134
135
let target_chunk = other_chunks. iter ( ) . find ( |c| {
135
- let c = c. lock ( ) . unwrap ( ) ;
136
+ let c = c. read ( ) . unwrap ( ) ;
136
137
c. x == target_chunk_x && c. y == target_chunk_y
137
138
} ) ;
139
+ // If there's a chunk loaded in memory then check that, else it means we're on a edge and we can
140
+ // Calculate the block's height when the chunk gets generated
141
+ // TODO: Check for saved file chunk
138
142
match target_chunk {
139
143
Some ( chunk) => {
140
- let chunk = chunk. lock ( ) . unwrap ( ) ;
144
+ let chunk = chunk. read ( ) . unwrap ( ) ;
141
145
if Chunk :: exists_block_at ( & chunk. blocks , & target_block) {
142
146
is_visible = false ;
143
147
}
@@ -161,7 +165,8 @@ impl Chunk {
161
165
}
162
166
163
167
if is_visible {
164
- let ( mut vertex_data, index_data) = face. create_face_data ( & block) ;
168
+ let ( mut vertex_data, index_data) =
169
+ face. create_face_data ( block_ptr. clone ( ) ) ;
165
170
vertex. append ( & mut vertex_data) ;
166
171
let indices_offset = vertex. len ( ) as u32 - 4 ;
167
172
indices. append (
@@ -189,9 +194,11 @@ impl Chunk {
189
194
usage : wgpu:: BufferUsages :: INDEX | wgpu:: BufferUsages :: COPY_DST ,
190
195
} ) ;
191
196
192
- self . indices = indices. len ( ) as u32 ;
193
- self . chunk_vertex_buffer = Some ( chunk_vertex_buffer) ;
194
- self . chunk_index_buffer = Some ( chunk_index_buffer) ;
197
+ (
198
+ indices. len ( ) as u32 ,
199
+ chunk_vertex_buffer,
200
+ chunk_index_buffer,
201
+ )
195
202
}
196
203
pub fn get_bind_group_layout ( ) -> wgpu:: BindGroupLayoutDescriptor < ' static > {
197
204
wgpu:: BindGroupLayoutDescriptor {
@@ -246,7 +253,7 @@ impl Chunk {
246
253
b => b,
247
254
} ;
248
255
249
- let block = Arc :: new ( Mutex :: new ( Block :: new (
256
+ let block = Arc :: new ( RwLock :: new ( Block :: new (
250
257
glam:: vec3 ( x as f32 , y as f32 , z as f32 ) ,
251
258
( chunk_x, chunk_y) ,
252
259
block_type,
@@ -277,14 +284,14 @@ impl Chunk {
277
284
. expect ( "TODO: Fix this case -h" )
278
285
. as_ref ( )
279
286
. unwrap ( )
280
- . lock ( )
287
+ . read ( )
281
288
. unwrap ( )
282
289
. absolute_position ;
283
290
284
291
let tree_blocks = crate :: structures:: Tree :: get_blocks ( highest_block) ;
285
292
286
293
for block in tree_blocks. iter ( ) {
287
- let block_brw = block. lock ( ) . unwrap ( ) ;
294
+ let block_brw = block. read ( ) . unwrap ( ) ;
288
295
let block_chunk = block_brw. get_chunk_coords ( ) ;
289
296
std:: mem:: drop ( block_brw) ;
290
297
if block_chunk == ( self . x , self . y ) {
@@ -303,8 +310,7 @@ impl Chunk {
303
310
device : Arc < wgpu:: Device > ,
304
311
queue : Arc < wgpu:: Queue > ,
305
312
chunk_data_layout : Arc < wgpu:: BindGroupLayout > ,
306
- other_chunks : Vec < Arc < Mutex < Chunk > > > ,
307
- ) -> Self {
313
+ ) -> Chunk {
308
314
let mut was_loaded = false ;
309
315
let blocks = if let Ok ( blocks) = Self :: load ( Box :: new ( ( x, y) ) ) {
310
316
was_loaded = true ;
@@ -327,6 +333,7 @@ impl Chunk {
327
333
resource : chunk_position_buffer. as_entire_binding ( ) ,
328
334
} ] ,
329
335
} ) ;
336
+
330
337
let mut chunk = Chunk {
331
338
blocks,
332
339
x,
@@ -345,8 +352,6 @@ impl Chunk {
345
352
if !was_loaded {
346
353
chunk. place_trees ( ) ;
347
354
}
348
- chunk. build_mesh ( other_chunks) ;
349
-
350
355
return chunk;
351
356
}
352
357
}
@@ -361,7 +366,7 @@ impl Saveable<Chunk> for Chunk {
361
366
for col in self . blocks . iter ( ) {
362
367
for block in col. iter ( ) {
363
368
if let Some ( block_ptr) = block {
364
- let blockbrw = block_ptr. lock ( ) . unwrap ( ) ;
369
+ let blockbrw = block_ptr. read ( ) . unwrap ( ) ;
365
370
data += & format ! (
366
371
"{},{},{},{}\n " ,
367
372
blockbrw. position. x,
@@ -404,7 +409,7 @@ impl Loadable<BlockVec> for Chunk {
404
409
let x = coords. next ( ) . unwrap ( ) . parse :: < i32 > ( ) ?;
405
410
let y = coords. next ( ) . unwrap ( ) . parse :: < i32 > ( ) ?;
406
411
407
- let mut blocks: BlockVec = vec ! [ ] ;
412
+ let mut blocks: BlockVec = vec ! [ vec! [ ] ; ( CHUNK_SIZE * CHUNK_SIZE ) as usize ] ;
408
413
if * chunk_position == ( x, y) {
409
414
let file_contents = std:: fs:: read_to_string ( format ! ( "data/chunk{}_{}" , x, y) ) ?;
410
415
for line in file_contents. lines ( ) {
@@ -421,13 +426,6 @@ impl Loadable<BlockVec> for Chunk {
421
426
block_type,
422
427
) ;
423
428
424
- if let None = blocks. get_mut (
425
- ( block. position . x as u32 * CHUNK_SIZE + block. position . z as u32 )
426
- as usize ,
427
- ) {
428
- // This works only because chunks rows are in order
429
- blocks. push ( vec ! [ ] ) ;
430
- }
431
429
let y_blocks = blocks
432
430
. get_mut (
433
431
( block. position . x as u32 * CHUNK_SIZE + block. position . z as u32 )
@@ -443,7 +441,7 @@ impl Loadable<BlockVec> for Chunk {
443
441
y_blocks. push ( None ) ;
444
442
}
445
443
}
446
- y_blocks[ y_position] = Some ( Arc :: new ( Mutex :: new ( block) ) ) ;
444
+ y_blocks[ y_position] = Some ( Arc :: new ( RwLock :: new ( block) ) ) ;
447
445
}
448
446
return Ok ( blocks) ;
449
447
}
0 commit comments