コード例 #1
0
 /// <summary>
 /// In Build mode we store Mesh data in lists (not arrays) allowing to add vertices
 /// </summary>
 public void StartBuilding()
 {
     if (content.HasPosition())
     {
         positions = new List <Vector>();
     }
     if (content.HasNormal())
     {
         normals = new List <Vector>();
     }
     if (content.HasTangent())
     {
         tangents = new List <Vector>();
     }
     if (content.HasUV0())
     {
         uvs0 = new List <Vector2>();
     }
     if (content.HasUV1())
     {
         uvs1 = new List <Vector2>();
     }
     if (content.HasUV2())
     {
         uvs2 = new List <Vector2>();
     }
     if (content.HasUV3())
     {
         uvs3 = new List <Vector2>();
     }
     posIndices = new List <int>();
     buildMode  = true;
 }
コード例 #2
0
        public Vertex GetVertex(int vi, VertexContent mask = VertexContent.full)
        {
            VertexContent c  = content & mask;
            int           pi = posIndices[vi];
            Vertex        v  = new Vertex();

            v.posIndex = pi; // always set
            if (c.HasPosition())
            {
                v.position = positions[pi];
            }
            if (c.HasNormal())
            {
                v.normal = normals[normalPerPosition ? pi : vi];
            }
            if (c.HasTangent())
            {
                v.tangent = tangents[vi];
            }
            if (c.HasUV0())
            {
                v.uv0 = uvs0[vi];
            }
            if (c.HasUV1())
            {
                v.uv1 = uvs1[vi];
            }
            if (c.HasUV2())
            {
                v.uv2 = uvs2[vi];
            }
            if (c.HasUV3())
            {
                v.uv3 = uvs3[vi];
            }
            return(v);
        }
コード例 #3
0
        private static Vertex AverageVertices(Vertex[] vs, VertexContent c, float[] weights = null)
        {
            Vertex r  = new Vertex();
            float  ws = 0;

            for (int i = 0; i < vs.Length; ++i)
            {
                Vertex v = vs[i];
                float  w = weights != null ? weights[i] : 1f;
                if (c.HasPosition())
                {
                    r.position += w * v.position;
                }
                if (c.HasNormal())
                {
                    r.normal += w * v.normal;
                }
                if (c.HasTangent())
                {
                    r.tangent += w * v.tangent;
                }
                if (c.HasUV0())
                {
                    r.uv0 += w * v.uv0;
                }
                if (c.HasUV1())
                {
                    r.uv1 += w * v.uv1;
                }
                if (c.HasUV2())
                {
                    r.uv2 += w * v.uv2;
                }
                if (c.HasUV3())
                {
                    r.uv3 += w * v.uv3;
                }
                ws += w;
            }
            if (c.HasPosition())
            {
                r.position /= ws;
            }
            if (c.HasNormal())
            {
                r.normal.Normalize();
            }
            if (c.HasTangent())
            {
                r.tangent.Normalize();
            }
            if (c.HasUV0())
            {
                r.uv0 /= ws;
            }
            if (c.HasUV1())
            {
                r.uv1 /= ws;
            }
            if (c.HasUV2())
            {
                r.uv2 /= ws;
            }
            if (c.HasUV3())
            {
                r.uv3 /= ws;
            }
            r.posIndex = -1;
            return(r);
        }
コード例 #4
0
        public MeshX(Mesh mesh)
        {
            // set vertex content
            content = GetMeshVertexContent(mesh);

            // init positions
            var poses = new List <Vector>();

            posIndices = new int[mesh.vertexCount];
            for (int i = 0; i < mesh.vertexCount; ++i)
            {
                Vector pos      = mesh.vertices[i];
                int    posIndex = poses.IndexOf(pos); //!!! use threshold?
                if (posIndex == -1)
                {
                    poses.Add(pos);
                    posIndex = poses.Count - 1;
                }
                posIndices[i] = posIndex;
            }
            positions = poses.ToArray();

            // init vertex content
            if (content.HasNormal())
            {
                normals           = mesh.normals;
                normalPerPosition = false;
            }
            if (content.HasTangent())
            {
                tangents = new Vector[mesh.vertexCount];
                for (int i = 0; i < mesh.vertexCount; ++i)
                {
                    tangents[i] = (Vector)mesh.tangents[i];
                }
            }
            if (content.HasUV0())
            {
                uvs0 = mesh.uv;
            }
            if (content.HasUV1())
            {
                uvs1 = mesh.uv2;
            }
            if (content.HasUV2())
            {
                uvs2 = mesh.uv3;
            }
            if (content.HasUV3())
            {
                uvs3 = mesh.uv4;
            }

            // set faces
            int submeshCount = mesh.subMeshCount;

            submeshes = new Submesh[submeshCount];
            for (int s = 0; s < submeshCount; ++s)
            {
                int[][] faces = MeshX.TrianglesToFaces(mesh.GetTriangles(s));
                submeshes[s] = new Submesh {
                    faces = faces
                };
            }

            // copy name
            this.name = mesh.name;
        }