private void OnVoxelInitialized(object sender, EventArgs args) { Voxels.Add((Voxel)sender); if (Voxels.Count % 10 == 0 || Voxels.Count == Bounds.X * Bounds.Y * Bounds.Z) { Debug.WriteLine($"{Voxels.Count}\t== {Bounds.X * Bounds.Y * Bounds.Z} ? {Voxels.Count == Bounds.X * Bounds.Y * Bounds.Z}"); } }
public void Add(ulong x, ulong y, ulong z, byte c) { ulong f = Fuse(x, y, z); if (Voxels.ContainsKey(f)) { Voxels[f] = c; } else { Voxels.Add(f, c); Full.Add(f); } }
/// <summary> /// Initialise a pattern, setting the block voxels, the connection voxels and their normals in relation to index 0,0,0 /// </summary> public void InitialisePattern() { // temporary hard coded pattern. This should be imported from rhino List <Vector3Int> walkableFaces = new List <Vector3Int> { new Vector3Int(0, 0, 1), new Vector3Int(0, 0, -1) }; for (int y = 0; y < 6; y++) { for (int x = -1; x <= 1; x++) { Voxels.Add(new Voxel(x, y, 0, VoxelType.Block, PatternOrientation, this, walkableFaces)); } } var conVox = new List <Voxel>(); foreach (var voxel in Voxels.Where(s => s.Type == VoxelType.Block && s.Index.y != 2 && s.Index.y != 3)) { conVox.Add(new Voxel(voxel.Index.x, voxel.Index.y, voxel.Index.z + 1, VoxelType.Connection, new Vector3Int(270, 0, 0), this)); conVox.Add(new Voxel(voxel.Index.x, voxel.Index.y, voxel.Index.z - 1, VoxelType.Connection, new Vector3Int(90, 0, 0), this)); } Voxels.AddRange(conVox); Voxels.Add(new Voxel(-1, 6, 0, VoxelType.Connection, Vector3Int.zero, this)); Voxels.Add(new Voxel(0, 6, 0, VoxelType.Connection, Vector3Int.zero, this)); Voxels.Add(new Voxel(1, 6, 0, VoxelType.Connection, Vector3Int.zero, this)); Voxels.Add(new Voxel(-1, -1, 0, VoxelType.Connection, new Vector3Int(0, 0, 180), this)); Voxels.Add(new Voxel(0, -1, 0, VoxelType.Connection, new Vector3Int(0, 0, 180), this)); Voxels.Add(new Voxel(1, -1, 0, VoxelType.Connection, new Vector3Int(0, 0, 180), this)); for (int i = 0; i < 6; i++) { if (i != 2 && i != 3) { Voxels.Add(new Voxel(-2, i, 0, VoxelType.Connection, Vector3Int.zero, this)); Voxels.Add(new Voxel(2, i, 0, VoxelType.Connection, Vector3Int.zero, this)); } } }
public override void GenerateVoxels(float voxelSize) { if (m_MeshRenderer != null && m_MeshFilter != null) { Mesh mesh = m_MeshFilter.sharedMesh; int[] triangles = mesh.triangles; // mesh vertices in World Space Vector3[] verticesWS; Vector3[] trianglesNormals; InitializeVerticesAndNormals(m_MeshRenderer.transform, mesh.vertices, triangles, out verticesWS, out trianglesNormals); Bounds meshBoundsWS = m_MeshRenderer.bounds; Octree.MeshParams meshParams = new Octree.MeshParams() { Triangles = triangles, VerticesWS = verticesWS, TrianglesNormals = trianglesNormals, Colors = mesh.colors, UVs = mesh.uv }; Vector3Int meshDimensionInVoxels = Vector3Int.CeilToInt(meshBoundsWS.size / voxelSize); // In order to keep voxels with uniform size, the max dimension is used as bounds dimension. int maxDimension = Mathf.Max(meshDimensionInVoxels.x, Mathf.Max(meshDimensionInVoxels.y, meshDimensionInVoxels.z)); Vector3 maxPointInVoxelsVolume = meshBoundsWS.min + Vector3.one * maxDimension * voxelSize; m_Octree = new Octree(meshBoundsWS.min, maxPointInVoxelsVolume, voxelSize, meshParams); Queue <Octree.OctreeNode> nodes = new Queue <Octree.OctreeNode>(); if (m_Octree.Root != null) { nodes.Enqueue(m_Octree.Root); } while (nodes.Count > 0) { Octree.OctreeNode currentNode = nodes.Dequeue(); // If node is leaf and has triangles inside it, create a voxel. if (currentNode.IsLeaf && currentNode.Occupied) { Color color = Material.Color * currentNode.Color; VoxelRenderer.Voxel voxel = new VoxelRenderer.Voxel { Center = currentNode.CenterPoint, Size = currentNode.Dimensions.x, Color = new Vector3(color.r, color.g, color.b), UV = currentNode.UV }; Voxels.Add(voxel); } else { if (currentNode.ChildrenNodes != null) { foreach (Octree.OctreeNode octreeNode in currentNode.ChildrenNodes) { if (octreeNode != null) { nodes.Enqueue(octreeNode); } } } } } } }
/// <summary> /// Adds a voxel at the specified position. /// </summary> /// <param name="p">The p.</param> public void AddVoxel(Point3D p) { Voxels.Add(new Voxel(p, CurrentColor)); UpdateModel(); }