Beispiel #1
0
        public void Iterate_Over_KeysWithRefs()
        {
            var count      = 10;
            var dictionary = GetDictionary();

            var sw = Stopwatch.StartNew();

            for (var i = 0; i < count; i++)
            {
                foreach (var key in dictionary.Keys)
                {
                    var     position = VoxelUtility.GetPositionByHash(key);
                    var     index    = VoxelUtility.GetVoxelIndex(position, _voxelsSize);
                    ref var voxel    = ref _voxels[index];
                    var     color    = voxel.colorIndex;

                    voxel.data       = 0;
                    voxel.colorIndex = 0;
                }
            }
Beispiel #2
0
    public static VoxelModel ToModel(this MagicaFile magicaFile, Vector3Int volumeSize)
    {
        var magicaChunks = magicaFile.Chunks;
        var volume       = new VoxelModel(volumeSize, magicaFile.Palette);

        var minPosition = new Vector3Int(int.MaxValue, int.MaxValue, int.MaxValue);
        var maxPosition = new Vector3Int(int.MinValue, int.MinValue, int.MinValue);
        var magicaSize  = new Vector3();

        for (var chunkIndex = 0; chunkIndex < magicaChunks.Length; chunkIndex++)
        {
            var magicaChunk     = magicaChunks[chunkIndex];
            var defaultPosition = magicaChunk.position;
            var chunkSize       = magicaChunk.size;
            var chunkPosition   = defaultPosition - chunkSize / 2;

            magicaChunk.position = chunkPosition;

            for (var i = 0; i < 3; i++)
            {
                if (chunkPosition[i] < minPosition[i])
                {
                    minPosition[i] = chunkPosition[i];
                }
            }

            for (var i = 0; i < 3; i++)
            {
                if (chunkPosition[i] + chunkSize[i] > maxPosition[i])
                {
                    maxPosition[i] = chunkPosition[i] + chunkSize[i];
                }
            }

            for (var i = 0; i < 3; i++)
            {
                magicaSize[i] = maxPosition[i] - minPosition[i];
            }

            magicaChunks[chunkIndex] = magicaChunk;
        }

        foreach (var chunk in magicaChunks)
        {
            var voxels             = chunk.voxels;
            var chunkPosition      = new Vector3Int(chunk.position.x, chunk.position.y, chunk.position.z);
            var positionAdjustment = chunkPosition - minPosition;
            var rotation           = chunk.rotation;
            var size = chunk.size;

            foreach (var magicaVoxel in voxels)
            {
                var voxelPosition = new Vector3Int(magicaVoxel.x, magicaVoxel.y, magicaVoxel.z);

                for (var i = 0; i < 3; i++)
                {
                    var multiplier = rotation[i];

                    if (multiplier != 1)
                    {
                        var value = voxelPosition[i] * multiplier;
                        voxelPosition[i] = size[i] + value - 1;
                    }
                }

                var position = voxelPosition + positionAdjustment;
                var index    = VoxelUtility.GetVoxelIndex(position, volumeSize);

                var voxel = new VoxelEntity
                {
                    colorIndex = magicaVoxel.colorIndex,
                    data       = 100
                };

                volume.SetVoxel(index, voxel);
            }
        }

        return(volume);
    }