Advertisement
Tkap1

Untitled

Apr 30th, 2024 (edited)
862
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.22 KB | None | 0 0
  1.  
  2. struct s_chunk_thread_data
  3. {
  4.     int state;
  5.     s_lin_arena arena;
  6.     s_transform* blocks[c_chunk_size][c_chunk_size];
  7.     s_shared_circular_buffer<s_v2i, c_chunk_count * c_chunk_count> chunks_completed;
  8. };
  9.  
  10. if(!game->chunks_generated) {
  11.     game->chunks_generated = true;
  12.     void* memory = malloc(MB(100));
  13.     game->chunk_thread_data.arena = make_arena_from_memory(memory, "thread", MB(100));
  14.     reset_chunks();
  15.     generate_chunks(&game->chunk_thread_data);
  16. }
  17.  
  18. func void reset_chunks()
  19. {
  20.     for(int chunk_x = 0; chunk_x < c_chunk_count; chunk_x++) {
  21.         for(int chunk_z = 0; chunk_z < c_chunk_count; chunk_z++) {
  22.             s_chunk* chunk = &game->chunks[chunk_x][chunk_z];
  23.             chunk->generated = false;
  24.             memset(chunk->blocks, 0, sizeof(b8) * c_chunk_size * c_chunk_size * c_chunk_height);
  25.         }
  26.     }
  27. }
  28.  
  29.  
  30. func DWORD WINAPI generate_chunks(void* param)
  31. {
  32.     s_chunk_thread_data* chunk_thread_data = (s_chunk_thread_data*)param;
  33.  
  34.     for(int x = 0; x < c_chunk_count * c_chunk_size; x++) {
  35.         for(int z = 0; z < c_chunk_count * c_chunk_size; z++) {
  36.             s_v2i chunk_index = v2i(x / 16, z / 16);
  37.             s_chunk* chunk = &game->chunks[chunk_index.x][chunk_index.y];
  38.             float f = fnlGetNoise2D(&game->noise, (float)x, (float)z);
  39.             int y = (int)range_lerp(f, -1, 1, 0, c_chunk_height - 1);
  40.             for(int i = 0; i <= y; i++) {
  41.                 chunk->blocks[x % c_chunk_size][i][z % c_chunk_size] = true;
  42.             }
  43.         }
  44.     }
  45.  
  46.     for(int chunk_x = 0; chunk_x < c_chunk_count; chunk_x++) {
  47.         for(int chunk_z = 0; chunk_z < c_chunk_count; chunk_z++) {
  48.             int count = 0;
  49.             s_chunk* chunk = &game->chunks[chunk_x][chunk_z];
  50.             chunk->num_visible_blocks = count_visible_blocks_in_chunk(v2i(chunk_x, chunk_z));
  51.             printf("processing chunk %i, %i (%i blocks)\n", chunk_x, chunk_z, chunk->num_visible_blocks);
  52.             chunk_thread_data->blocks[chunk_x][chunk_z] = (s_transform*)la_get_zero(&chunk_thread_data->arena, sizeof(s_transform) * chunk->num_visible_blocks);
  53.             for(int x = 0; x < c_chunk_size; x++) {
  54.                 for(int y = 0; y < c_chunk_height; y++) {
  55.                     for(int z = 0; z < c_chunk_size; z++) {
  56.                         int xx = x + chunk_x * c_chunk_size;
  57.                         int zz = z + chunk_z * c_chunk_size;
  58.                         if(!is_block_visible(v2i(chunk_x, chunk_z), v3i(x, y, z))) { continue; }
  59.                         s_m4 model = m4_identity();
  60.                         s_v3 pos = v3(xx, y, zz) * c_block_size;
  61.                         model = m4_multiply(model, m4_translate(pos));
  62.                         model = m4_multiply(model, m4_scale(v3(c_block_size)));
  63.                         chunk_thread_data->blocks[chunk_x][chunk_z][count].do_light = 0;
  64.                         chunk_thread_data->blocks[chunk_x][chunk_z][count].model = model;
  65.                         chunk_thread_data->blocks[chunk_x][chunk_z][count].color = v4(
  66.                             range_lerp((float)xx, 0, (float)c_chunk_size * c_chunk_count - 1, 0, 1),
  67.                             range_lerp((float)y, 0, (float)c_chunk_height - 1, 0, 1),
  68.                             range_lerp((float)zz, 0, (float)c_chunk_size * c_chunk_count - 1, 0, 1),
  69.                             1.0f
  70.                         );
  71.                         count += 1;
  72.                     }
  73.                 }
  74.             }
  75.             assert(count == chunk->num_visible_blocks);
  76.             chunk_thread_data->chunks_completed.add(v2i(chunk_x, chunk_z));
  77.         }
  78.     }
  79.     chunk_thread_data->state = 1;
  80.     return 0;
  81. }
  82.  
  83. template <typename t, int n>
  84. void s_shared_circular_buffer<t, n>::add(t new_element)
  85. {
  86.     int index = InterlockedIncrement((LONG*)&write_index) - 1;
  87.     elements[index % n] = new_element;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement