// --------------------------------------------------------------------------------------------- // create single voxel // --------------------------------------------------------------------------------------------- private VoxelUtils.VoxelChunk createVoxelChunk(VoxelUtils.VoxelVector3Int p, int w, int h, int d) { GameObject cube = GameObject.Instantiate(_prefabChunk); cube.transform.SetParent(_voxelChunkContainer); _iCount++; cube.name = "cube_" + _iCount.ToString(); float width = w * VoxelUtils.CHUNK_SIZE; float height = h * VoxelUtils.CHUNK_SIZE; float depth = d * VoxelUtils.CHUNK_SIZE; Vector3 pos = new Vector3((p.x * VoxelUtils.CHUNK_SIZE) + (width / 2f), (p.y * VoxelUtils.CHUNK_SIZE) + (height / 2f), (p.z * VoxelUtils.CHUNK_SIZE) + (depth / 2f)); Bounds b = new Bounds(); b.size = new Vector3(width, height, depth); b.center = pos; VoxelUtils.VoxelChunk vs = new VoxelUtils.VoxelChunk(); vs.go = cube; vs.goPos = pos; vs.pos = p; vs.size = new VoxelUtils.VoxelVector3Int(w, h, d); vs.bounds = b; //coll.bounds; vs.corners = VoxelUtils.createVoxelCorners(p, w, h, d); return(vs); }
// --------------------------------------------------------------------------------------------- public void reset() { foreach (Transform child in _voxelChunkContainer) { GameObject.Destroy(child.gameObject); } _aVoxelChunks.Clear(); _iCount = 0; // create the full chunk voxel VoxelUtils.VoxelVector3Int pos = VoxelUtils.convertVector3ToVoxelVector3Int(Vector3.zero); VoxelUtils.VoxelChunk vs = createVoxelChunk(pos, VoxelUtils.MAX_CHUNK_UNITS, VoxelUtils.MAX_CHUNK_UNITS, VoxelUtils.MAX_CHUNK_UNITS); _aVoxelChunks.Add(vs); setVoxelChunkMesh(_aVoxelChunks [0]); }
// --------------------------------------------------------------------------------------------- // // --------------------------------------------------------------------------------------------- private VoxelUtils.VoxelChunk createCutVoxelChunk(VoxelUtils.VoxelVector3Int p, int w, int h, int d) { float width = w * VoxelUtils.CHUNK_SIZE; float height = h * VoxelUtils.CHUNK_SIZE; float depth = d * VoxelUtils.CHUNK_SIZE; Vector3 pos = new Vector3((p.x * VoxelUtils.CHUNK_SIZE) + (width / 2f), (p.y * VoxelUtils.CHUNK_SIZE) + (height / 2f), (p.z * VoxelUtils.CHUNK_SIZE) + (depth / 2f)); Bounds b = new Bounds(); //coll.bounds; b.size = new Vector3(width - VoxelUtils.CHUNK_SIZE, height - VoxelUtils.CHUNK_SIZE, depth - VoxelUtils.CHUNK_SIZE); b.center = pos; VoxelUtils.VoxelChunk vs = new VoxelUtils.VoxelChunk(); vs.pos = p; vs.size = new VoxelUtils.VoxelVector3Int(w, h, d); vs.bounds = b; //coll.bounds; vs.corners = VoxelUtils.createVoxelCorners(p, w, h, d); return(vs); }
// --------------------------------------------------------------------------------------------- // cut a hole! // --------------------------------------------------------------------------------------------- public bool subtractChunk(Vector3 v3Pos, Vector3 v3Size) { bool success = true; //float timer = Time.realtimeSinceStartup; VoxelUtils.VoxelVector3Int pos = VoxelUtils.convertVector3ToVoxelVector3Int(v3Pos); VoxelUtils.VoxelChunk vsCut = createCutVoxelChunk(pos, (int)v3Size.x, (int)v3Size.y, (int)v3Size.z); // does the new voxel intersect with any existing voxels? bool splittage = splitVoxels(vsCut); int loops = 0; while (splittage && loops < 1000) { splittage = splitVoxels(vsCut); loops++; } if (loops >= 1000) { Debug.LogWarning("looks like we got ourselves an endless loop here!"); success = false; } else { int i, len = _aVoxelChunks.Count; for (i = 0; i < len; ++i) { setVoxelChunkMesh(_aVoxelChunks [i]); } } //Debug.Log ("Time to create chunk(s): " + (Time.realtimeSinceStartup - timer).ToString ()); return(success); }