コード例 #1
0
 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}");
     }
 }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
ファイル: Pattern.cs プロジェクト: KevinSaey/ALIS_Aggregation
    /// <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));
            }
        }
    }
コード例 #4
0
        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);
                                }
                            }
                        }
                    }
                }
            }
        }
コード例 #5
0
ファイル: MainViewModel.cs プロジェクト: alir14/3DModel
 /// <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();
 }