Exemple #1
0
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);
				}
			}
		}
	}
}
Exemple #2
0
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();
	}
}