Пример #1
0
    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;
    }
Пример #2
0
    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);
    }
Пример #3
0
    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;
            }
        }
    }