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); } }
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)); }); }