Exemple #1
0
    public void InstantiateChunks()
    {
        UnityEngine.Profiling.Profiler.BeginSample("InstantiateChunks");

        Chunks = new VoxelWorldChunk[ChunksWide, ChunksHigh, ChunksDeep];

        for (int x = 0; x < ChunksWide; ++x)
        {
            for (int y = 0; y < ChunksHigh; ++y)
            {
                for (int z = 0; z < ChunksDeep; ++z)
                {
                    string          chunkName = string.Concat("Chunk ", x, ", ", y, ", ", z);
                    VoxelWorldChunk chunk     = GameObject.Instantiate <VoxelWorldChunk>(VoxelWorldChunkPrefab);
                    chunk.name             = chunkName;
                    chunk.transform.parent = transform;
                    chunk.ChunkPosition    = new IntVec3(x, y, z);
                    int worldx = x * ChunkVoxelSize;
                    int worldy = y * ChunkVoxelSize;
                    int worldz = z * ChunkVoxelSize;
                    chunk.InstantiateVoxels(worldx, worldy, worldz, ChunkVoxelSize, ChunkVoxelSize, ChunkVoxelSize);
                    Chunks[x, y, z] = chunk;
                }
            }
        }

        UnityEngine.Profiling.Profiler.EndSample();
    }
        public void removeVoxelAt(int x, int y, int z)
        {
            Vector3 chunkAABBOrigin = this.getGlobalAABBCoordinates(x, y, z);
            Vector3 chunkAABBOffset = this.getLocalAABBCoordinates(x, y, z);

            //estrazione del chunk corrispondente alla posizione
            //cui si desidera aggiungere un voxel.
            if (this._chunkBasket.hasChunkAt(chunkAABBOrigin))
            {
                VoxelWorldChunk chunk = this._chunkBasket.getChunkAt(chunkAABBOrigin);
                chunk.removeVoxelAt((int)chunkAABBOffset.x, (int)chunkAABBOffset.y, (int)chunkAABBOffset.z);

                //se il chunk non contiene più blocchi allora lo rimuoviamo
                //altrimenti lo ridisegnamo
                if (chunk.count == 0)
                {
                    chunk.transform.parent = null;
                    this._chunkBasket.removeChunkAt(chunkAABBOrigin);
                }
                else
                {
                    chunk.update();
                }
            }
        }
        public VoxelWorldChunk getChunkAt(int x, int y, int z)
        {
            Vector3         chunkAABBOrigin = this.getGlobalAABBCoordinates(x, y, z);
            VoxelWorldChunk chunk           = null;

            if (this._chunkBasket.hasChunkAt(chunkAABBOrigin))
            {
                chunk = this._chunkBasket.getChunkAt(chunkAABBOrigin);
            }
            else
            {
                GameObject chunkAnchor   = new GameObject("WorldChunk");
                float      semiChunkSize = ((float)this.chunkSize) / 2;
                chunkAnchor.transform.parent = this.transform;
                chunkAnchor.isStatic         = true;
                chunk                    = chunkAnchor.AddComponent <VoxelWorldChunk>() as VoxelWorldChunk;
                chunk.size               = this.chunkSize;
                chunk.originX            = (int)chunkAABBOrigin.x;
                chunk.originY            = (int)chunkAABBOrigin.y;
                chunk.originZ            = (int)chunkAABBOrigin.z;
                chunk.transform.position = new Vector3(x, y, z);
                this._chunkBasket.addChunkAt(chunk, chunkAABBOrigin);
            }
            return(chunk);
        }
Exemple #4
0
 public Voxel(VoxelWorldChunk parentChunk, VoxelType type, IntVec3 pos, BoxCollider collider)
 {
     ParentChunk = parentChunk;
     Collider    = collider;
     SetType(type);
     Exposed      = false;
     Position     = pos;
     ExposedSides = VoxelSide.All;
 }
Exemple #5
0
 public Voxel(VoxelWorldChunk parentChunk, VoxelType type, IntVec3 pos, BoxCollider collider)
 {
     ParentChunk = parentChunk;
     Collider = collider;
     SetType(type);
     Exposed = false;
     Position = pos;
     ExposedSides = VoxelSide.All;
 }
    public void GenerateWorldVoxels(System.Action <Voxel> action)
    {
        for (int x = 0; x < ChunksWide; ++x)
        {
            for (int y = 0; y < ChunksHigh; ++y)
            {
                for (int z = 0; z < ChunksDeep; ++z)
                {
                    VoxelWorldChunk chunk = Chunks[x, y, z];

                    GenerateChunkVoxels(chunk, action);
                }
            }
        }
    }
    public void GenerateChunkVoxels(VoxelWorldChunk chunk, System.Action <Voxel> action)
    {
        for (int x = 0; x < chunk.Width; ++x)
        {
            for (int y = 0; y < chunk.Height; ++y)
            {
                for (int z = 0; z < chunk.Depth; ++z)
                {
                    Voxel voxel = chunk.GetVoxel(x, y, z);

                    action(voxel);
                }
            }
        }
    }
Exemple #8
0
    public Voxel GetVoxelFromCollider(BoxCollider collider)
    {
        if (collider == null)
        {
            return(null);
        }

        VoxelWorldChunk chunk = collider.gameObject.GetComponent <VoxelWorldChunk>();

        if (chunk == null)
        {
            return(null);
        }

        return(chunk.GetVoxelFromCollider(collider));
    }
        public bool hasVoxelAt(int x, int y, int z)
        {
            bool    retval          = false;
            Vector3 chunkAABBOrigin = this.getGlobalAABBCoordinates(x, y, z);
            Vector3 chunkAABBOffset = this.getLocalAABBCoordinates(x, y, z);

            //estrazione del chunk corrispondente alla posizione
            //cui si desidera aggiungere un voxel.
            if (this._chunkBasket.hasChunkAt(chunkAABBOrigin))
            {
                VoxelWorldChunk chunk = this._chunkBasket.getChunkAt(chunkAABBOrigin);
                retval = chunk.hasVoxelAt((int)chunkAABBOffset.x, (int)chunkAABBOffset.y, (int)chunkAABBOffset.z);
            }

            return(retval);
        }
Exemple #10
0
    public void GenerateWorldVoxels(System.Action <Voxel> action)
    {
        UnityEngine.Profiling.Profiler.BeginSample("GenerateWorldVoxels: " + action.ToString());

        for (int x = 0; x < ChunksWide; ++x)
        {
            for (int y = 0; y < ChunksHigh; ++y)
            {
                for (int z = 0; z < ChunksDeep; ++z)
                {
                    VoxelWorldChunk chunk = Chunks[x, y, z];

                    GenerateChunkVoxels(chunk, action);
                }
            }
        }

        UnityEngine.Profiling.Profiler.EndSample();
    }
        public void addVoxelAt(Voxel voxel, int x, int y, int z)
        {
            //estrazione del chunk corrispondente alla posizione
            //cui si desidera aggiungere un voxel.
            Vector3         chunkAABBOffset = this.getLocalAABBCoordinates(x, y, z);
            VoxelWorldChunk chunk           = this.getChunkAt(x, y, z);

            //quindi aggiungiamo il voxel al chunk soltanto se
            //questo non ne contiene già uno alla posizione data.
            int localX = (int)chunkAABBOffset.x;
            int localY = (int)chunkAABBOffset.y;
            int localZ = (int)chunkAABBOffset.z;

            if (!chunk.hasVoxelAt(localX, localY, localZ))
            {
                chunk.addVoxelAt(voxel, localX, localY, localZ);
                //chunk.update();
            }
        }
    public Voxel GetVoxelFromCollider(BoxCollider collider)
    {
        VoxelWorldChunk chunk = collider.gameObject.GetComponent <VoxelWorldChunk>();

        return(chunk.GetVoxelFromCollider(collider));
    }
    public void GenerateChunkVoxels(VoxelWorldChunk chunk, System.Action<Voxel> action)
    {
        for (int x = 0; x < chunk.Width; ++x)
        {
            for (int y = 0; y < chunk.Height; ++y)
            {
                for (int z = 0; z < chunk.Depth; ++z)
                {
                    Voxel voxel = chunk.GetVoxel(x, y, z);

                    action(voxel);
                }
            }
        }
    }
 internal void addChunkAt(VoxelWorldChunk chunk, Vector3 position)
 {
     this._map.Add(position, chunk);
 }