void Chunk::CreateMesh() { ClearMesh(); if (m_meshId == -1) { m_renderer->CreateMesh(&m_meshId); } for (int x = 0; x < CHUNK_SIZE; ++x) { for (int y = 0; y < CHUNK_SIZE; ++y) { for (int z = 0; z < CHUNK_SIZE; ++z) { if (m_blocks[x][y][z].IsActive()) { bool activeXMinus = false; bool activeXPlus = false; bool activeYMinus = false; bool activeYPlus = false; bool activeZMinus = false; bool activeZPlus = false; if (x > 0) activeXMinus = m_blocks[x - 1][y][z].IsActive(); if (x < CHUNK_SIZE - 1) activeXPlus = m_blocks[x + 1][y][z].IsActive(); if (y > 0) activeYMinus = m_blocks[x][y - 1][z].IsActive(); if (y < CHUNK_SIZE - 1) activeYPlus = m_blocks[x][y + 1][z].IsActive(); if (z > 0) activeZMinus = m_blocks[x][y][z - 1].IsActive(); if (z < CHUNK_SIZE - 1) activeZPlus = m_blocks[x][y][z + 1].IsActive(); float sx = (float)x * Chunk::BLOCK_RENDER_SIZE; float sy = (float)y * Chunk::BLOCK_RENDER_SIZE; float sz = (float)z * Chunk::BLOCK_RENDER_SIZE; BlockType blockType = m_blocks[x][y][z].GetType(); m_renderer->AddCubeToMesh( m_meshId, glm::vec3(sx, sy, sz), glm::vec3(Chunk::HALF_RENDER_SIZE), Block::GetTopLeftUV(blockType), Block::GetBottomRightUV(blockType), activeXMinus, activeXPlus, activeYMinus, activeYPlus, activeZMinus, activeZPlus); } } } } }
void Chunk::Unload() { m_state = ChunkState::Unloading; if (m_loaded) { m_loaded = false; std::vector<Chunk*> neighbors = GetNeighbors(); for (Chunk* neighbor : neighbors) { if (neighbor->IsLoaded()) { neighbor->UpdateSurroundedFlag(); } } } ClearMesh(); ClearMeshCache(); }
VoxelChunk::~VoxelChunk() { ClearGeometry(); ClearMesh(); }
void VoxelChunk::CreateMesh( UINT8* m_pBlocks, bool* _acted, unsigned int dimm )//lower corner { if (!_vao) _vao = new VAO(); _dirty = false; Color clr; clr.comp[0] = 255; clr.comp[1] = 255; clr.comp[2] = 255; clr.comp[3] = 255; int h_dimm = dimm>>1; const int _local_to_global_i = h_dimm + _lbl[0]; const int _local_to_global_j = h_dimm + _lbl[1]; const int _local_to_global_k = h_dimm + _lbl[2]; unsigned int num_created = 0; unsigned int global_index = 0; UINT8 tmp_res = 0; unsigned int x, y; for (unsigned int i = 0; i < size; i++) { x = (_local_to_global_i+i)*dimm*dimm; for (unsigned int j = 0; j < size; j++) { y = (_local_to_global_j+j)*dimm; for (unsigned int k = 0; k < size; k++) { tmp_res = EvaluateCell( m_pBlocks, _local_to_global_i+i, _local_to_global_j+j, _local_to_global_k+k, dimm ); if (tmp_res) { if ( _points == NULL ) { CreateGeometry(); } if (!_vbo) _vbo = new VBO(_points, NULL, 0, _vertex_len ); global_index = ( x+ y + _local_to_global_k+k );; //MapColor( &clr, m_pBlocks[global_index], false); MapColor( &clr, m_pBlocks[global_index], _acted[global_index]); _acted[global_index] = false; clr.comp[3] = tmp_res; SetColorForVoxel(i, j, k, &clr); _renderable_indexes[num_created] = i*size*size + j*size + k; ++num_created; } } } } _renderable_indexes_count = num_created; if ( num_created ) { _vbo->UpdateColorArray( _colors, _vertex_len ); _vbo->UpdateIndexArray( _renderable_indexes, _renderable_indexes_count ); _vao->bind( *_vbo ); } else { if ( _points != NULL ) { ClearGeometry(); } ClearMesh(); } }