private void SetupParticles() { particleSystem.Clear(true); particleSystem.gravityModifier = 0; Vector3 offset = voxelData.pivot; if (center) { offset.x = (float)voxelData.width / 2f; offset.y = (float)voxelData.height / 2f; offset.z = (float)voxelData.depth / 2f; } List <ParticleSystem.Particle> voxs = new List <ParticleSystem.Particle>(); for (int x = 0; x < voxelData.width; x++) { for (int y = 0; y < voxelData.height; y++) { for (int z = 0; z < voxelData.depth; z++) { if (voxelData.FilledVoxel(x, y, z)) { if (removeHidden && !voxelData.IsVisible(x, y, z)) { continue; } Vector3 pos = new Vector3(x, y, z); pos -= offset - new Vector3(.5f, .5f, .5f); pos *= scale; //pos += this.transform.root.position; ParticleSystem.Particle p = new ParticleSystem.Particle { startLifetime = float.PositiveInfinity, remainingLifetime = float.PositiveInfinity, startSize = scale, startColor = voxelData.VoxelColor(x, y, z), position = pos, velocity = Vector3.zero }; voxs.Add(p); } } } } voxelParticles = voxs.ToArray(); UpdateVoxels(); }
private void ProcessTextures(VoxelFace face) { if (starts.Count <= 0) { return; } for (int i = 0; i < starts.Count; i++) { int w = 1, h = 1; switch (face) { case VoxelFace.Front: case VoxelFace.Back: w = ends[i].x - starts[i].x + 1; h = ends[i].y - starts[i].y + 1; break; case VoxelFace.Left: case VoxelFace.Right: w = ends[i].z - starts[i].z + 1; h = ends[i].y - starts[i].y + 1; break; case VoxelFace.Top: case VoxelFace.Bottom: w = ends[i].x - starts[i].x + 1; h = ends[i].z - starts[i].z + 1; break; } Texture2D tex = new Texture2D(w, h, TextureFormat.ARGB32, false); Color32[] tcolor = tex.GetPixels32(); for (int c = 0; c < tcolor.Length; c++) { tcolor[c] = Color.clear; } tex.SetPixels32(tcolor); int px = 0, py = 0; switch (face) { case VoxelFace.Front: case VoxelFace.Back: { int z = starts[i].z; for (int y = starts[i].y; y <= ends[i].y; y++) { px = 0; for (int x = starts[i].x; x <= ends[i].x; x++) { tex.SetPixel(px, py, data.VoxelColor(x, y, z)); px++; } py++; } } break; case VoxelFace.Left: case VoxelFace.Right: { int x = starts[i].x; for (int y = starts[i].y; y <= ends[i].y; y++) { px = 0; for (int z = starts[i].z; z <= ends[i].z; z++) { tex.SetPixel(px, py, data.VoxelColor(x, y, z)); px++; } py++; } } break; case VoxelFace.Top: case VoxelFace.Bottom: { int y = starts[i].y; for (int z = starts[i].z; z <= ends[i].z; z++) { px = 0; for (int x = starts[i].x; x <= ends[i].x; x++) { tex.SetPixel(px, py, data.VoxelColor(x, y, z)); px++; } py++; } } break; } tex.Apply(); texs.Add(tex); } }
public PreviewVoxelMesh(VoxelData data) { List <Vector3> verts = new List <Vector3>(); List <int> idxs = new List <int>(); List <Color32> colors = new List <Color32>(); for (int x = 0; x < data.width; x++) { for (int y = 0; y < data.height; y++) { for (int z = 0; z < data.depth; z++) { if (data.IsVisible(x, y, z)) { int i = verts.Count; Color32 col = data.VoxelColor(x, y, z); float c = ((float)((data.GetVoxel(x, y, z) - 1))) / 256; Vector2 uv = new Vector2(c, 0); //Top... verts.Add(new Vector3(x, y + 1, z)); verts.Add(new Vector3(x, y + 1, z + 1)); verts.Add(new Vector3(x + 1, y + 1, z + 1)); verts.Add(new Vector3(x + 1, y + 1, z)); colors.Add(col); colors.Add(col); colors.Add(col); colors.Add(col); idxs.Add(i + 0); idxs.Add(i + 1); idxs.Add(i + 2); idxs.Add(i + 0); idxs.Add(i + 2); idxs.Add(i + 3); i += 4; //Bottom... verts.Add(new Vector3(x, y, z)); verts.Add(new Vector3(x, y, z + 1)); verts.Add(new Vector3(x + 1, y, z + 1)); verts.Add(new Vector3(x + 1, y, z)); colors.Add(col); colors.Add(col); colors.Add(col); colors.Add(col); idxs.Add(i + 0); idxs.Add(i + 2); idxs.Add(i + 1); idxs.Add(i + 0); idxs.Add(i + 3); idxs.Add(i + 2); i += 4; //Front... verts.Add(new Vector3(x, y, z)); verts.Add(new Vector3(x, y + 1, z)); verts.Add(new Vector3(x + 1, y + 1, z)); verts.Add(new Vector3(x + 1, y, z)); colors.Add(col); colors.Add(col); colors.Add(col); colors.Add(col); idxs.Add(i + 0); idxs.Add(i + 1); idxs.Add(i + 2); idxs.Add(i + 0); idxs.Add(i + 2); idxs.Add(i + 3); i += 4; //Back... verts.Add(new Vector3(x, y, z + 1)); verts.Add(new Vector3(x, y + 1, z + 1)); verts.Add(new Vector3(x + 1, y + 1, z + 1)); verts.Add(new Vector3(x + 1, y, z + 1)); colors.Add(col); colors.Add(col); colors.Add(col); colors.Add(col); idxs.Add(i + 0); idxs.Add(i + 2); idxs.Add(i + 1); idxs.Add(i + 0); idxs.Add(i + 3); idxs.Add(i + 2); i += 4; //Left... verts.Add(new Vector3(x, y, z)); verts.Add(new Vector3(x, y + 1, z)); verts.Add(new Vector3(x, y + 1, z + 1)); verts.Add(new Vector3(x, y, z + 1)); colors.Add(col); colors.Add(col); colors.Add(col); colors.Add(col); idxs.Add(i + 0); idxs.Add(i + 3); idxs.Add(i + 2); idxs.Add(i + 0); idxs.Add(i + 2); idxs.Add(i + 1); i += 4; //Right... verts.Add(new Vector3(x + 1, y, z)); verts.Add(new Vector3(x + 1, y + 1, z)); verts.Add(new Vector3(x + 1, y + 1, z + 1)); verts.Add(new Vector3(x + 1, y, z + 1)); colors.Add(col); colors.Add(col); colors.Add(col); colors.Add(col); idxs.Add(i + 0); idxs.Add(i + 1); idxs.Add(i + 2); idxs.Add(i + 0); idxs.Add(i + 2); idxs.Add(i + 3); i += 4; } } } } //Debug.Log(verts.Count); //Debug.Log(uvs.Count); //Debug.Log(idxs.Count); mesh = new Mesh(); mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; mesh.subMeshCount = 1; mesh.vertices = verts.ToArray(); mesh.SetIndices(idxs.ToArray(), MeshTopology.Triangles, 0); mesh.SetColors(colors); mesh.RecalculateNormals(); }