// functions to get & set voxels at world positions public Block GetBlockAt(Vector3 worldPos) { worldPos -= m_WorldMin; // offset from origin return(m_WorldData.GetBlock( (int)(worldPos.x / m_BlockSize), (int)(worldPos.y / m_BlockSize), (int)(worldPos.z / m_BlockSize) )); }
// Buid the mesh for a given block within a chunk private int BuildMeshForBlock(int blockX, int blockY, int blockZ, int x, int y, int z, Chunk chunk, int index) { Block currentBlock = chunk.Blocks[x, y, z]; // if it isn't a transparent block then bail because it won't have any faces to build if ((currentBlock.IsTransparent() == false)) return index; byte lightAmount = 255;//currentBlock.LightAmount; // Check surround blocks, if they aren't transparent then they have an outside face // Bottom Block block = m_WorldData.GetBlock(blockX, blockY - 1, blockZ); if (block.IsTransparent() == false) { AddBlockFace( new IntVec3(x + 1, y, z), new IntVec3(x + 1, y, z + 1), new IntVec3(x, y, z + 1), new IntVec3(x, y, z), 0.5f, chunk, index, block.m_Type, BlockFace.Bottom, lightAmount); index += 4; } // West block = m_WorldData.GetBlock(blockX - 1, blockY, blockZ); if (block.IsTransparent() == false) { AddBlockFace(new IntVec3(x, y, z), new IntVec3(x, y, z + 1), new IntVec3(x, y + 1, z + 1), new IntVec3(x, y + 1, z), 0.8f, chunk, index, block.m_Type, BlockFace.West, lightAmount); index += 4; } // Top block = m_WorldData.GetBlock(blockX, blockY + 1, blockZ); if (block.IsTransparent() == false) { AddBlockFace(new IntVec3(x, y + 1, z), new IntVec3(x, y + 1, z + 1), new IntVec3(x + 1, y + 1, z + 1), new IntVec3(x + 1, y + 1, z), 0.9f, chunk, index, block.m_Type, BlockFace.Top, lightAmount); index += 4; } // East block = m_WorldData.GetBlock(blockX + 1, blockY, blockZ); if (block.IsTransparent() == false) { AddBlockFace(new IntVec3(x + 1, y + 1,z), new IntVec3(x + 1, y + 1,z + 1), new IntVec3(x + 1, y,z + 1), new IntVec3(x + 1, y, z), 0.7f, chunk, index, block.m_Type, BlockFace.East, lightAmount); index += 4; } // North block = m_WorldData.GetBlock(blockX, blockY, blockZ + 1); if (block.IsTransparent() == false) { AddBlockFace(new IntVec3(x + 1, y,z + 1), new IntVec3(x + 1, y + 1,z + 1), new IntVec3(x, y + 1,z + 1), new IntVec3(x, y, z + 1), 0.4f, chunk, index, block.m_Type, BlockFace.North, lightAmount); index += 4; } // South block = m_WorldData.GetBlock(blockX, blockY, blockZ - 1); if (block.IsTransparent() == false) { AddBlockFace(new IntVec3(x, y,z), new IntVec3(x, y + 1,z), new IntVec3(x + 1, y + 1,z), new IntVec3(x + 1, y, z), 1.0f, chunk, index, block.m_Type, BlockFace.South, lightAmount); index += 4; } return index; }
float GetDensityForBlockCorner(int blockX, int blockY, int blockZ) { float density = 0; density += m_WorldData.GetBlock(blockX, blockY, blockZ + 1).IsTransparent() ? 0.0f:1.0f; density += m_WorldData.GetBlock(blockX - 1, blockY, blockZ + 1).IsTransparent() ? 0.0f:1.0f; density += m_WorldData.GetBlock(blockX - 1, blockY, blockZ).IsTransparent() ? 0.0f:1.0f; density += m_WorldData.GetBlock(blockX, blockY, blockZ).IsTransparent() ? 0.0f:1.0f; density += m_WorldData.GetBlock(blockX, blockY + 1, blockZ + 1).IsTransparent() ? 0.0f:1.0f; density += m_WorldData.GetBlock(blockX - 1, blockY + 1, blockZ + 1).IsTransparent() ? 0.0f:1.0f; density += m_WorldData.GetBlock(blockX - 1, blockY + 1, blockZ).IsTransparent() ? 0.0f:1.0f; density += m_WorldData.GetBlock(blockX, blockY + 1, blockZ).IsTransparent() ? 0.0f:1.0f; return(density * (1.0f / 8.0f)); }