コード例 #1
0
ファイル: WorldObject.cs プロジェクト: TheGoodDoktor/Voxel
        // 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)
                       ));
        }
コード例 #2
0
        // 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;
        }
コード例 #3
0
        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));
        }