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); }
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); } } } }
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); }
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); }