Block World::getBlock(int x,int y,int z) const { Vec2i chunkLoc = _correctCoords(x,z); x = (x%Chunk::WIDTH+Chunk::WIDTH)%Chunk::WIDTH; z = (z%Chunk::WIDTH+Chunk::WIDTH)%Chunk::WIDTH; if(y < 0 || y >= Chunk::HEIGHT) { return Block(); } return _getChunk(chunkLoc[0],chunkLoc[1]).blocks[x][z][y]; }
void World::deleteBlock(int x,int y,int z) { Vec2i chunkLoc = _correctCoords(x,z); auto fixedX = (x%Chunk::WIDTH+Chunk::WIDTH)%Chunk::WIDTH, fixedZ = (z%Chunk::WIDTH+Chunk::WIDTH)%Chunk::WIDTH; if(y >= 0 && y < Chunk::HEIGHT) { auto& b = _getChunk(chunkLoc[0],chunkLoc[1]).blocks[fixedX][fixedZ][y]; b.filled = false; _updateBlock(x,y,z); } }
void World::setBlock(int x,int y,int z,const Color3f& c) { Vec2i chunkLoc = _correctCoords(x,z); x = (x%Chunk::WIDTH+Chunk::WIDTH)%Chunk::WIDTH; z = (z%Chunk::WIDTH+Chunk::WIDTH)%Chunk::WIDTH; if(y >= 0 && y < Chunk::HEIGHT) { auto& b = _getChunk(chunkLoc[0],chunkLoc[1]).blocks[x][z][y]; b.filled = true; b.color = c; _chunksToUpdate.insert(chunkLoc); } }
void TerrainGenerator::GenerateChunk(Chunk* chunk) { ChunkHeightMap* heightmapChunk = _getChunk(chunk->GetChunkX(),chunk->GetChunkZ()); if (heightmapChunk != NULL) { _generateChunk(chunk,heightmapChunk); }else { _generateChunkAndHeightMap(chunk); } }
void World::_generateChunk(int chunkX,int chunkZ) { Chunk& c = _getChunk(chunkX,chunkZ); chunkX *= Chunk::WIDTH; chunkZ *= Chunk::WIDTH; for(int x=0;x<Chunk::WIDTH;++x) { for(int z=0;z<Chunk::WIDTH;++z) { int height = SEALEVEL +16*(perlin.octaveNoise((chunkX+x)/PERLINSCALE, (chunkZ+z)/PERLINSCALE, 2,2,3)); for(int y=0;y<Chunk::HEIGHT;++y) { Block& block = c.blocks[x][z][y]; if(y <= height) { block.filled = true; block.color = (height-y < DIRTLAYERS) ? DIRTCOLOR : ROCKCOLOR; } else { block.filled = false; } } } } }
void World::_buildChunkVarr(int chunkX,int chunkZ,VertexArray& varr) const { auto& c = _getChunk(chunkX,chunkZ); //std::cout << "Building chunk varr" << std::endl; //int vertCount = varr.size(); for(int x=-1;x<=Chunk::WIDTH;++x) { for(int z=-1;z<=Chunk::WIDTH;++z) { for(int y=-1;y<=Chunk::HEIGHT;++y) { bool validX = (x >= 0 && x < Chunk::WIDTH), validY = (y >= 0 && y < Chunk::HEIGHT), validZ = (z >= 0 && z < Chunk::WIDTH); //if((validX && validY && validZ && c.blocks[x][z][y].filled) || // (validY && ((!validX && validZ) || (validX && !validZ)) && if(validY && getBlock(chunkX*Chunk::WIDTH+x, y, chunkZ*Chunk::WIDTH+z).filled) { if((x < 0 || z < 0) && y >= SEALEVEL) { //std::cout << Vec3i{{x,y,z}} << std::endl; } continue; } float fx = x,fy = y,fz = z; if(validY && validZ) { auto normal = Vec3f{{1,0,0}}; if(x > 0 && c.blocks[x-1][z][y].filled) { auto color = c.blocks[x-1][z][y].color; varr.push_back({ {{fx,fy, fz}}, color,normal }); varr.push_back({ {{fx,fy+1,fz}}, color,normal }); varr.push_back({ {{fx,fy+1,fz+1}}, color,normal }); varr.push_back({ {{fx,fy, fz+1}}, color,normal }); } if(x < Chunk::WIDTH-1 && c.blocks[x+1][z][y].filled) { auto color = c.blocks[x+1][z][y].color; varr.push_back({ {{fx+1,fy, fz}}, color,-normal }); varr.push_back({ {{fx+1,fy, fz+1}}, color,-normal }); varr.push_back({ {{fx+1,fy+1,fz+1}}, color,-normal }); varr.push_back({ {{fx+1,fy+1,fz}}, color,-normal }); } } if(validX && validY) { auto normal = Vec3f{{0,0,1}}; if(z > 0 && c.blocks[x][z-1][y].filled) { auto color = c.blocks[x][z-1][y].color; varr.push_back({ {{fx, fy, fz}},color,normal}); varr.push_back({ {{fx+1,fy, fz}},color,normal}); varr.push_back({ {{fx+1,fy+1,fz}},color,normal}); varr.push_back({ {{fx, fy+1,fz}},color,normal}); } if(z < Chunk::WIDTH-1 && c.blocks[x][z+1][y].filled) { auto color = c.blocks[x][z+1][y].color; varr.push_back({ {{fx, fy, fz+1}}, color,-normal }); varr.push_back({ {{fx, fy+1,fz+1}}, color,-normal }); varr.push_back({ {{fx+1,fy+1,fz+1}}, color,-normal }); varr.push_back({ {{fx+1,fy, fz+1}}, color,-normal }); } } if(validX && validZ) { auto normal = Vec3f{{0,1,0}}; if(y > 0 && c.blocks[x][z][y-1].filled) { auto color = c.blocks[x][z][y-1].color; varr.push_back({ {{fx, fy,fz}}, color,normal}); varr.push_back({ {{fx, fy,fz+1}},color,normal}); varr.push_back({ {{fx+1,fy,fz+1}},color,normal}); varr.push_back({ {{fx+1,fy,fz}}, color,normal}); } if(y < Chunk::HEIGHT-1 && c.blocks[x][z][y+1].filled) { auto color = c.blocks[x][z][y+1].color; varr.push_back({ {{fx, fy+1,fz}}, color,-normal}); varr.push_back({ {{fx+1,fy+1,fz}}, color,-normal}); varr.push_back({ {{fx+1,fy+1,fz+1}},color,-normal}); varr.push_back({ {{fx, fy+1,fz+1}},color,-normal}); } } } } } //std::cout << varr.size()-vertCount << " verts" << std::endl; }