public bool UpdateChunk(ComputeShader computeShader, ThreadedChunkLoader thread, int updateSize, Vector3 position) { int octreeSize = (int)Mathf.Pow(2, LOD); bool updated = tree.VoxelizeUpdate(computeShader, thread, this, position, octreeSize); return(updated); }
public bool CreateChunk(ComputeShader computeShader, ThreadedChunkLoader thread, int lod, Vector3 position) { LOD = lod; if (LOD < 1) { LOD = 1; } else if (LOD > 6) { LOD = 6; } int octreeSize = (int)Mathf.Pow(2, LOD); min = position - new Vector3(64 / 2, 64 / 2, 64 / 2); Vector3 octreePos = new Vector3(position.x - (64 / 2), position.y - (64 / 2), position.z - (64 / 2)); bool created = tree.Voxelize(computeShader, thread, this, octreePos, octreeSize); if (meshObject != null) { meshObject.GetComponent <MeshINfo>().chunkMin = min; } if (!created && meshObject != null) { DestroyMesh(); } return(created); }
// Use this for initialization void Start() { //Octree.InitPermutations(133925); Octree.InitPermutations(1200); thread = new ThreadedChunkLoader(this); chunkQueue = new Dictionary <Vector3, Vector3>(); changedChunks = new List <Chunk>(); reloadingChunks = new Dictionary <Vector3, Chunk>(); chunkGrid = new List <Vector3>(); prevCameraPos = Camera.main.transform.position; chunks = new Dictionary <Vector3, Chunk>(); /* * chunkQueue.Sort(delegate(Vector3 c1, Vector3 c2){ * return Mathf.Abs((Camera.main.transform.position - c1).sqrMagnitude).CompareTo * (Mathf.Abs(((Camera.main.transform.position - c2).sqrMagnitude))); * }); * * * List<Vector3> sortQueue = chunkQueue.Keys.ToList(); * * sortQueue.Sort(delegate(Vector3 c1, Vector3 c2) { * return Mathf.Abs((Camera.main.transform.position - c1).sqrMagnitude).CompareTo * (Mathf.Abs(((Camera.main.transform.position - c2).sqrMagnitude))); * }); * chunkQueue.Clear(); * chunkQueue = sortQueue.ToDictionary(x => x, x => x); */ int mapMult = 16; int yMult = 16; for (int x = 0; x < mapMult; x++) { for (int y = 0; y < yMult; y++) { for (int z = 0; z < mapMult; z++) { chunkGrid.Add(new Vector3(x, y, z)); } } } }
private bool ComputeNewVoxels(ComputeShader shader, ThreadedChunkLoader thread, Chunk chunk, Vector3 min, int octreeSize) { float gpuStart = Time.realtimeSinceStartup; float[] chunkPos = new float[3] { min.x, min.y, min.z }; shader.SetFloats("chunkPosition", chunkPos); shader.SetInt("resolution", octreeSize); shader.SetInt("octreeSize", octreeSize); int[] zero = new int[1] { 0 }; float sqRTRC = Mathf.Sqrt(octreeSize * octreeSize * octreeSize); int sqRTRes = (int)sqRTRC; if (sqRTRC > sqRTRes) { sqRTRes++; } int[] zeroSq = new int[sqRTRes]; for (int i = 0; i < sqRTRes; i++) { zeroSq[i] = 0; } ComputeBuffer Perm = new ComputeBuffer(512, sizeof(int)); Perm.SetData(permutations); ComputeBuffer cornCount = new ComputeBuffer(sqRTRes, sizeof(int)); ComputeBuffer finalCount = new ComputeBuffer(1, sizeof(int)); ComputeBuffer voxMatBuffer = new ComputeBuffer(octreeSize * octreeSize * octreeSize, sizeof(uint)); ComputeBuffer cornerMaterials = new ComputeBuffer((octreeSize + 1) * (octreeSize + 1) * (octreeSize + 1), sizeof(uint)); shader.SetInt("primitiveModCount", chunk.modCount); ComputeBuffer PrimMods = null; if (chunk.modCount > 0) { PrimMods = new ComputeBuffer(chunk.modCount, (sizeof(int) * 2) + (sizeof(float) * 6)); PrimMods.SetData(chunk.primitiveMods); } int kernel = shader.FindKernel("ComputeMaterials"); if (chunk.modCount > 0) { shader.SetBuffer(kernel, "primitiveMods", PrimMods); } shader.SetBuffer(kernel, "Perm", Perm); shader.SetBuffer(kernel, "cornerMaterials", cornerMaterials); shader.Dispatch(kernel, 1, 1, 1); kernel = shader.FindKernel("ComputeCorners"); shader.SetBuffer(kernel, "voxelMaterials", voxMatBuffer); shader.SetBuffer(kernel, "cornerCount", cornCount); shader.SetBuffer(kernel, "cornerMaterials", cornerMaterials); cornCount.SetData(zeroSq); shader.Dispatch(kernel, 1, 1, 1); kernel = shader.FindKernel("AddLength"); shader.SetBuffer(kernel, "cornerCount", cornCount); shader.SetBuffer(kernel, "finalCount", finalCount); finalCount.SetData(zero); shader.Dispatch(kernel, 1, 1, 1); int[] voxelCount = new int[1]; finalCount.GetData(voxelCount); int count = voxelCount[0]; if (count <= 0) { voxMatBuffer.Dispose(); cornerMaterials.Dispose(); cornCount.Dispose(); finalCount.Dispose(); Perm.Dispose(); if (chunk.modCount > 0) { PrimMods.Dispose(); PrimMods = null; } Perm = null; voxMatBuffer = null; cornerMaterials = null; cornCount = null; finalCount = null; return(false); } //Debug.Log (count); ComputeBuffer cornerIndexes = new ComputeBuffer(count, sizeof(uint)); kernel = shader.FindKernel("ComputePositions"); shader.SetBuffer(kernel, "voxelMaterials", voxMatBuffer); shader.SetBuffer(kernel, "cornerCount", cornCount); shader.SetBuffer(kernel, "cornerIndexes", cornerIndexes); shader.Dispatch(kernel, 1, 1, 1); ComputeBuffer voxBuffer = new ComputeBuffer(count, (sizeof(float) * 6) + sizeof(int)); ComputeBuffer positionBuffer = new ComputeBuffer(count, sizeof(float) * 3); kernel = shader.FindKernel("ComputeVoxels"); if (chunk.modCount > 0) { shader.SetBuffer(kernel, "primitiveMods", PrimMods); } shader.SetBuffer(kernel, "Perm", Perm); shader.SetBuffer(kernel, "voxMins", positionBuffer); shader.SetBuffer(kernel, "voxelMaterials", voxMatBuffer); shader.SetBuffer(kernel, "finalCount", finalCount); shader.SetBuffer(kernel, "cornerIndexes", cornerIndexes); shader.SetBuffer(kernel, "voxels", voxBuffer); shader.Dispatch(kernel, (count / 128) + 1, 1, 1); Vector3[] voxelMins = new Vector3[count]; positionBuffer.GetData(voxelMins); positionBuffer.Dispose(); positionBuffer = null; uint[] voxelMaterials = new uint[count]; cornerIndexes.GetData(voxelMaterials); cornerIndexes.Dispose(); cornerIndexes = null; GPUVOX[] voxs = new GPUVOX[count]; voxBuffer.GetData(voxs); voxBuffer.Dispose(); voxBuffer = null; voxMatBuffer.Dispose(); cornerMaterials.Dispose(); cornCount.Dispose(); finalCount.Dispose(); Perm.Dispose(); if (chunk.modCount > 0) { PrimMods.Dispose(); PrimMods = null; } Perm = null; voxMatBuffer = null; cornerMaterials = null; cornCount = null; finalCount = null; float gpuEnd = Time.realtimeSinceStartup; //Debug.Log ("GPU time on chunk: " + (gpuEnd - gpuStart)); thread.setData(this, count, voxelMins, voxelMaterials, voxs, min, octreeSize); thread.setChunkForUpdate(chunk); thread.Start(); return(true); }
public bool VoxelizeUpdate(ComputeShader shader, ThreadedChunkLoader thread, Chunk chunk, Vector3 pos, int size) { return(ComputeNewVoxels(shader, thread, chunk, pos, size)); }
public bool Voxelize(ComputeShader shader, ThreadedChunkLoader thread, Chunk chunk, Vector3 min, int size) { return(ComputeVoxels(shader, thread, chunk, min, size)); }
// Use this for initialization void Start() { //Octree.InitPermutations(133925); Octree.InitPermutations(1200); thread = new ThreadedChunkLoader(this); chunkQueue = new Dictionary<Vector3, Vector3>(); changedChunks = new List<Chunk>(); reloadingChunks = new Dictionary<Vector3, Chunk>(); chunkGrid = new List<Vector3>(); prevCameraPos = Camera.main.transform.position; chunks = new Dictionary<Vector3, Chunk>(); /* chunkQueue.Sort(delegate(Vector3 c1, Vector3 c2){ return Mathf.Abs((Camera.main.transform.position - c1).sqrMagnitude).CompareTo (Mathf.Abs(((Camera.main.transform.position - c2).sqrMagnitude))); }); List<Vector3> sortQueue = chunkQueue.Keys.ToList(); sortQueue.Sort(delegate(Vector3 c1, Vector3 c2) { return Mathf.Abs((Camera.main.transform.position - c1).sqrMagnitude).CompareTo (Mathf.Abs(((Camera.main.transform.position - c2).sqrMagnitude))); }); chunkQueue.Clear(); chunkQueue = sortQueue.ToDictionary(x => x, x => x); */ int mapMult = 16; int yMult = 16; for (int x = 0; x < mapMult; x++) { for (int y = 0; y < yMult; y++) { for (int z = 0; z < mapMult; z++) { chunkGrid.Add(new Vector3(x, y, z)); } } } }
public bool UpdateChunk(ComputeShader computeShader, ThreadedChunkLoader thread, int updateSize, Vector3 position) { int octreeSize = (int) Mathf.Pow(2, LOD); bool updated = tree.VoxelizeUpdate(computeShader, thread, this, position, octreeSize); return updated; }
public bool CreateChunk(ComputeShader computeShader, ThreadedChunkLoader thread, int lod, Vector3 position) { LOD = lod; if (LOD < 1) LOD = 1; else if (LOD > 6) LOD = 6; int octreeSize = (int) Mathf.Pow(2, LOD); min = position - new Vector3(64 / 2, 64 / 2, 64 / 2); Vector3 octreePos = new Vector3(position.x - (64 / 2), position.y - (64 / 2), position.z - (64 / 2)); bool created = tree.Voxelize(computeShader, thread, this, octreePos, octreeSize); if (meshObject != null) { meshObject.GetComponent<MeshINfo>().chunkMin = min; } if (!created && meshObject != null) { DestroyMesh(); } return created; }