示例#1
0
        public VoxelObject(VoxelObjectSettings settings, VoxelEngine voxelEngine)
        {
            this.voxelObjWrapper = new VoxelEngineWrapper();
            this.settings        = settings;

            depth          = settings.depth - 1;
            blockSize      = settings.blockSize;
            isoDim         = (int)Mathf.Pow(2, depth) * blockSize;
            isovalues      = new sbyte[isoDim * isoDim * isoDim];
            materialValues = new byte[isoDim * isoDim * isoDim];
            //blocks = new Block[depth][];
            blockTree  = new Octree(depth + 1, blockSize, this);
            blockRoots = new Transform[depth];

            //for (int i = 0; i < depth; i++)
            //{
            //    int dim = (int)Mathf.Pow(2, depth - i);
            //    blocks[i] = new Block[dim * dim * dim];

            //    for (int x = 0; x < dim; x++)
            //    {
            //        for (int y = 0; y < dim; y++)
            //        {
            //            for (int z = 0; z < dim; z++)
            //            {
            //                blocks[i][x + y * dim + z * dim * dim] = new Block(x, y, z, i, blockSize, this);
            //            }
            //        }
            //    }
            //}

            this.voxelEngine = voxelEngine;

            mineralNoiseFilter = new MineralNoiseFilter(settings.mineralNoiseSettings);
            noiseFilters       = new INoiseFilter[settings.noiseLayers.Length];

            for (int i = 0; i < noiseFilters.Length; i++)
            {
                noiseFilters[i] = NoiseFilterFactory.CreateNoiseFilter(settings.noiseLayers[i].noiseSettings);
            }

            root          = new GameObject("Voxel Centre").transform;
            root.position = Vector3.zero;
            root.position = root.TransformPoint(new Vector3(isoDim, isoDim, isoDim) / 2f);
            root.rotation = Quaternion.identity;

            for (int i = 0; i < depth; i++)
            {
                var blockRoot = new GameObject($"lod_{i}").transform;
                blockRoot.position = Vector3.zero;
                blockRoot.rotation = Quaternion.identity;
                blockRoot.gameObject.AddComponent <VoxelObjectUnity>().voxelObject = this;
                blockRoot.SetParent(root);
                blockRoots[i] = blockRoot;
                blockRoot.gameObject.SetActive(false);
            }
        }
示例#2
0
        public void GenerateVoxelObject(VoxelObjectSettings voxelObjectSettings, Vector3 position)
        {
            var voxelObject = new VoxelObject(voxelObjectSettings, this);

            voxelObject.root.position = position;
            voxelObjects.Add(voxelObject);

            System.Threading.ThreadPool.QueueUserWorkItem(o =>
            {
                voxelObject.GenerateIsovalues();
                MainThread.ExecuteOnMainThread(() => voxelObject.SetLod(currLod));
            });
        }