Ejemplo n.º 1
0
        /*-----------------------------------------------------------------------------------------
        *
        *	Computational and optimization stuff :
        *
        *  -----------------------------------------------------------------------------------------*/

        /// <summary>
        /// Defragmentates mesh subsets with same materials
        /// </summary>
        public void DefragmentSubsets(Scene scene, bool takeFromTriangleMtrlIndices)
        {
            //	if there are not shading groups,
            //	take them from per triangle material indices
            if (!Subsets.Any() || takeFromTriangleMtrlIndices)
            {
                for (int i = 0; i < Triangles.Count; i++)
                {
                    MeshSubset sg = new MeshSubset();
                    sg.MaterialIndex  = Triangles[i].MaterialIndex;
                    sg.StartPrimitive = i;
                    sg.PrimitiveCount = 1;

                    Subsets.Add(sg);
                    //Console.Write( "*{0}", Triangles[i].MaterialIndex );
                }
            }


            if (Subsets.Count == 1)
            {
                return;
            }


            List <List <MeshTriangle> > perMtrlTris = new List <List <MeshTriangle> >();

            foreach (var mtrl in scene.Materials)
            {
                perMtrlTris.Add(new List <MeshTriangle>());
            }

            foreach (var sg in Subsets)
            {
                for (int i = sg.StartPrimitive; i < sg.StartPrimitive + sg.PrimitiveCount; i++)
                {
                    perMtrlTris[sg.MaterialIndex].Add(Triangles[i]);
                }
            }

            Subsets.Clear();
            Triangles.Clear();

            for (int i = 0; i < perMtrlTris.Count; i++)
            {
                var sg = new MeshSubset();
                sg.MaterialIndex  = i;
                sg.StartPrimitive = Triangles.Count;
                sg.PrimitiveCount = perMtrlTris[i].Count;

                if (sg.PrimitiveCount == 0)
                {
                    continue;
                }

                Triangles.AddRange(perMtrlTris[i]);
                Subsets.Add(sg);
            }
        }
Ejemplo n.º 2
0
    public void AddTriangles(IEnumerable <Triangle> _Triangles)
    {
        if (Triangles == null)
        {
            Triangles = new List <Triangle>();
        }

        Triangles.AddRange(_Triangles);
    }
Ejemplo n.º 3
0
    public void Calculate(int index = 0)
    {
        Vertices.Clear();
        Triangles.Clear();
        UVs.Clear();

        var s = Size / 2f;

        Vector3[] p = new Vector3[] {
            new Vector3(-s, -s, -s) + Position,             // 0 0
            new Vector3(-s, s, -s) + Position,              // 1 1
            new Vector3(s, s, -s) + Position,               // 2 2
            new Vector3(s, -s, -s) + Position,              // 3 3

            new Vector3(-s, -s, s) + Position,              // 4 0
            new Vector3(-s, s, s) + Position,               // 5 1
            new Vector3(s, s, s) + Position,                // 6 2
            new Vector3(s, -s, s) + Position,               // 7 3
        };

        for (int i = 0; i < Faces.Length; i++)
        {
            if (Faces[i])
            {
                Triangles.AddRange(AddTriangles(index + Vertices.Count));
                UVs.AddRange(UVPacker.GetCubeUVs(i, CubeTypes[type]));

                switch (i)
                {
                case 0: Vertices.AddRange(new Vector3[] { p[0], p[1], p[2], p[3] }); break;

                case 1: Vertices.AddRange(new Vector3[] { p[3], p[2], p[6], p[7] }); break;

                case 2: Vertices.AddRange(new Vector3[] { p[7], p[6], p[5], p[4] }); break;

                case 3: Vertices.AddRange(new Vector3[] { p[4], p[5], p[1], p[0] }); break;

                case 4: Vertices.AddRange(new Vector3[] { p[1], p[5], p[6], p[2] }); break;

                case 5: Vertices.AddRange(new Vector3[] { p[4], p[0], p[3], p[7] }); break;

                default: break;
                }
            }
        }

        this.Calculated = true;
    }
Ejemplo n.º 4
0
        ///<summary>
        /// Close the line with given color
        ///</summary>
        void CloseLine(Color32 color)
        {
            if (vertices.Count == 0)
            {
                return;
            }

            int        offset        = Vertices.Count;
            int        triangleCount = vertices.Count - 2;
            List <int> triangles     = new List <int>();

            for (int i = 0; i < triangleCount / 2; i++)
            {
                triangles.Add(offset + i * 2);
                triangles.Add(offset + i * 2 + 2);
                triangles.Add(offset + i * 2 + 1);

                triangles.Add(offset + i * 2 + 2);
                triangles.Add(offset + i * 2 + 3);
                triangles.Add(offset + i * 2 + 1);
            }

            for (int i = 0; i < vertices.Count; i++)
            {
                VertexColors.Add(color);
            }

            if (mode_3d)
            {
                List <Vector3> v2 = new List <Vector3>();
                List <int>     t2 = new List <int>();

                for (int i = 0; i < vertices.Count; i++)
                {
                    v2.Add(new Vector3(vertices[i].x, vertices[i].y, z1));
                    VertexColors.Add(color);
                }

                for (int i = 0; i < triangleCount * 3; i += 3)
                {
                    t2.Add(triangles[i] + vertices.Count);
                    t2.Add(triangles[i + 2] + vertices.Count);
                    t2.Add(triangles[i + 1] + vertices.Count);
                }

                for (int i = 0; i < triangles.Count; i += 6)
                {
                    t2.Add(triangles[i + 4]);
                    t2.Add(t2[i + 1]);
                    t2.Add(triangles[i + 2]);

                    t2.Add(triangles[i + 4]);
                    t2.Add(t2[i + 5]);
                    t2.Add(t2[i + 1]);

                    t2.Add(triangles[i]);
                    t2.Add(t2[i]);
                    t2.Add(t2[i + 2]);

                    t2.Add(triangles[i + 1]);
                    t2.Add(triangles[i]);
                    t2.Add(t2[i + 2]);
                }

                t2.Add(offset);
                t2.Add(offset + 1);
                t2.Add(offset + vertices.Count);

                t2.Add(offset + vertices.Count + 1);
                t2.Add(offset + vertices.Count);
                t2.Add(offset + 1);

                t2.Add(offset + vertices.Count - 2);
                t2.Add(offset + vertices.Count * 2 - 1);
                t2.Add(offset + vertices.Count - 1);

                t2.Add(offset + vertices.Count * 2 - 1);
                t2.Add(offset + vertices.Count - 2);
                t2.Add(offset + vertices.Count * 2 - 2);

                vertices.AddRange(v2);
                triangles.AddRange(t2);
            }

            Vertices.AddRange(vertices);
            Triangles.AddRange(triangles);

            vertices.Clear();
        }