private void Awake() { _cameraTransform = _camera.transform; _voxelGeometryController = new VoxelGeometryController(8, GetMaxVerticesCount()); _voxelBuilderController = new VoxelBuilderController(); _voxelPhysicsController = new VoxelPhysicsController(); _fallingConstructionFactory = new FallingConstructionFactory(_fallingChunksTransform, 32); _camera.Hitted += OnHitted; var magicaVoxelReader = new MagicaReader(); var path = GetPathInStreamingAssets(_volumePath); var magicaFile = magicaVoxelReader.LoadFile(path); _voxelModel = magicaFile.ToModel(_volumeSize); var chunkSize = _chunkSize; var chunksCount = _chunkDrawSize.x * _chunkDrawSize.y * _chunkDrawSize.z; Debug.Log($"chunksCount = {chunksCount}"); for (var i = 0; i < chunksCount; i++) { var chunkPositionNormalized = VoxelUtility.GetVoxelPosition(i, _chunkDrawSize); var chunkIndex = VoxelChunkUtility.GetIndex(chunkPositionNormalized); var chunkPosition = chunkPositionNormalized * chunkSize; var chunkGameObject = new GameObject(); var chunkView = chunkGameObject.AddComponent <VolumeChunk>(); chunkGameObject.name = $"VolumeChunk[{i}]"; chunkView.SetPosition(new Vector3(chunkPosition.x, chunkPosition.y, chunkPosition.z)); chunkView.SetParent(_volumeChunksTransform); chunkView.SetMaterial(_chunkMaterial); chunkView.SetLayer(VolumeChunk.VolumeLayer); _chunks[chunkIndex] = chunkView; var geometryRequest = GetGeometryRequestById(chunkIndex); _chunkRequestQueue.Push(geometryRequest); } _chunkRenderer = new VoxelChunkRenderer(_cameraTransform, _chunks, _volumeSize, _chunkSize, _chunkDrawSize); _chunkRenderer.ChunkUpdated += OnChunkUpdated; }
private VoxelGeometryVolumeRequest GetGeometryRequestById(int chunkIndex) { var position = VoxelChunkUtility.GetPosition(chunkIndex); var request = new VoxelGeometryVolumeRequest { chunkPosition = new Vector3Int(position.x, position.y, position.z), chunkSize = _chunkSize, scale = 1f, pivot = new Vector3(0.0f, 0.0f, 0.0f), model = _voxelModel, faceColorMultipliers = new VoxelGeometryFaceColorMultiplier(-0.20f, -0.20f, 0f, -0.50f, -0.25f, -0.25f), edgeColorMultiplier = new Vector3(0.07f, 0.08f, 0.12f), cornerColorMultiplier = new Vector3(-0.14f, -0.25f, -0.4f) }; return(request); }
private void ExecutePhysics(Vector3Int destroyedPosition, Vector3Int chunkSize) { var request = new VoxelPhysicsRequest { initialPosition = destroyedPosition }; var result = _voxelPhysicsController.Execute(request, _voxelModel); if (result.isDestroyed) { var fallingVoxelList = result.fallingVoxelList; var fallingVoxelDictionary = result.fallingVoxelDictionary; var fallingVoxelsBounds = result.fallingVoxelBounds; var fallingVoxelsPivot = fallingVoxelsBounds.Center; var volumeSize = _volumeSize; var minChunkPosition = new Vector3Int( (int)fallingVoxelsBounds.min.x / chunkSize.x - 1, (int)fallingVoxelsBounds.min.y / chunkSize.y - 1, (int)fallingVoxelsBounds.min.z / chunkSize.z - 1); var maxChunkPosition = new Vector3Int( (int)fallingVoxelsBounds.max.x / chunkSize.x + 1, (int)fallingVoxelsBounds.max.y / chunkSize.y + 1, (int)fallingVoxelsBounds.max.z / chunkSize.z + 1); var chunkLimit = new Vector3Int( volumeSize.x / chunkSize.x, volumeSize.y / chunkSize.y, volumeSize.z / chunkSize.z); var chunkDifference = maxChunkPosition - minChunkPosition; for (var x = 0; x < chunkDifference.x; x++) // TODO: to single for loop { for (var y = 0; y < chunkDifference.y; y++) { for (var z = 0; z < chunkDifference.z; z++) { var chunkPosition = new Vector3Int( x + minChunkPosition.x, y + minChunkPosition.y, z + minChunkPosition.z); if (chunkPosition.x >= 0 && chunkPosition.x < chunkLimit.x && chunkPosition.y >= 0 && chunkPosition.y < chunkLimit.y && chunkPosition.z >= 0 && chunkPosition.z < chunkLimit.z) { var chunkIndex = VoxelChunkUtility.GetIndex(chunkPosition); var geometryRequest = GetGeometryRequestById(chunkIndex); _chunkRequestQueue.Push(geometryRequest); } } } } var fallingVoxelsCount = fallingVoxelList.Count; var chunksCount = (float)(chunkSize.x * chunkSize.y * chunkSize.z); var fallingChunksCount = Mathf.CeilToInt(fallingVoxelsCount / chunksCount); var fallingConstruction = _fallingConstructionFactory.Create(fallingChunksCount); fallingConstruction.SetPosition(fallingVoxelsPivot); fallingConstruction.SetMaterial(_chunkMaterial); fallingConstruction.bounds = fallingVoxelsBounds; fallingConstruction.SetActive(true); _fallingConstructions.Add(fallingConstruction.Id, fallingConstruction); var previousStart = 0; var previousEnd = 0; for (var i = 0; i < fallingChunksCount; i++) { var freeChunkIndex = i; var start = previousEnd; var end = start + (int)chunksCount; var geometryRequest = GetGeometryFallingRequestById(fallingConstruction.Id, freeChunkIndex); geometryRequest.fallingVoxelsList = fallingVoxelList; geometryRequest.fallingVoxelsDictionary = fallingVoxelDictionary; geometryRequest.fallingVoxelsStartIndex = start; geometryRequest.fallingVoxelsEndIndex = end; geometryRequest.pivot = new Vector3(0.5f, 0.5f, 0.5f); geometryRequest.offset = fallingVoxelsPivot; _fallingRequestQueue.Push(geometryRequest); previousStart = start; previousEnd = end; } } }