Ejemplo n.º 1
0
    public AMesh[] MeshToAMesh(Mesh m, Transform meshTransform, AMesh.AMeshFlags flags)
    {
        AMesh[] resultArray = new AMesh[m.subMeshCount];

        var  positions      = m.vertices.Select(v => v.ToAVector3()).ToArray();
        var  normals        = m.normals.Select(v => v.ToAVector3()).ToArray();
        var  uvs            = m.uv.Select(v => v.ToAVector2()).ToArray();
        var  tangents       = m.tangents;
        bool exportTangents = (flags & AMesh.AMeshFlags.HaveTangents) != AMesh.AMeshFlags.None;

        AMesh.AVector3 bboxMin = new AMesh.AVector3();
        AMesh.AVector3 bboxMax = new AMesh.AVector3();

        if (meshTransform != null)
        {
            //transform vertices
            var vertexMatrix = meshTransform.localToWorldMatrix;
            for (int i = 0; i < positions.Length; ++i)
            {
                positions[i] = vertexMatrix.MultiplyPoint3x4(positions[i].ToVector3()).ToAVector3();
            }

            //transform normals
            var normalMatrix = meshTransform.worldToLocalMatrix.transpose;
            for (int i = 0; i < positions.Length; ++i)
            {
                normals[i] = normalMatrix.MultiplyVector(normals[i].ToVector3()).ToAVector3();
            }

            if (exportTangents)
            {
                for (int i = 0; i < positions.Length; ++i)
                {
                    var t  = tangents[i];
                    var t3 = new Vector3(t.x, t.y, t.z);
                    t3          = normalMatrix.MultiplyVector(t3);
                    tangents[i] = new Vector4(t3.x, t3.y, t3.z, t.w);
                }
            }

            //recalculate bounds
            bboxMin = positions[0];
            bboxMax = positions[0];

            for (int i = 1; i < positions.Length; ++i)
            {
                bboxMin = AMesh.AVector3.Min(positions[i], bboxMin);
                bboxMax = AMesh.AVector3.Max(positions[i], bboxMax);
            }

            // result.Header.BoundingBox.Min = vMin;
            //  result.Header.BoundingBox.Max = vMax;
        }
        else
        {
            bboxMin = (m.bounds.center - m.bounds.extents).ToAVector3();
            bboxMax = (m.bounds.center + m.bounds.extents).ToAVector3();
        }


        for (int subId = 0; subId < m.subMeshCount; ++subId)
        {
            var submeshIndices = m.GetIndices(subId);

            AMesh result = new AMesh();
            resultArray[subId]          = result;
            result.Header.Version       = 40;
            result.Header.VerticesCount = (ushort)submeshIndices.Length;
            result.Header.Flags         = flags;

            result.Header.BoundingBox.Min = bboxMin;
            result.Header.BoundingBox.Max = bboxMax;

            if (exportTangents)
            {
                result.Tangent = new List <AMesh.AVector4>();
            }

            List <ushort> idx = new List <ushort>();
            for (int i = 0; i < submeshIndices.Length; ++i)
            {
                idx.Add((ushort)i);
                int id = submeshIndices[i];
                result.Position.Add(positions[id]);
                result.Normal.Add(normals[id]);
                result.UV0.Add(uvs[id]);

                if (exportTangents)
                {
                    result.Tangent.Add(tangents[id].ToAVector4());
                }
            }

            result.Indices = idx.ToArray();
            result.Header.PolygonsCount = (ushort)(result.Indices.Length / 3);
            result.SwapFaceOrder();
        }

        return(resultArray);
    }
Ejemplo n.º 2
0
 public static Vector3 ToVector3(this AMesh.AVector3 v)
 {
     return(new Vector3(v.X, v.Y, v.Z));
 }