Пример #1
0
        public void BindPoses()
        {
            UnityEngine.Mesh resultMesh = _resultMesh.Unity3dObject as UnityEngine.Mesh;
            Assert.AreEqual(resultMesh.bindposes.Length, mesh.BindposesLength);
            for (int i = 0; i < mesh.BindposesLength; i++)
            {
                Matrix4x4 resultMatrix = resultMesh.bindposes[i];
                Matrix16  matrix       = mesh.GetBindposes(i);

                Assert.AreEqual(resultMatrix.m00, matrix.M00);
                Assert.AreEqual(resultMatrix.m01, matrix.M01);
                Assert.AreEqual(resultMatrix.m02, matrix.M02);
                Assert.AreEqual(resultMatrix.m03, matrix.M03);

                Assert.AreEqual(resultMatrix.m10, matrix.M10);
                Assert.AreEqual(resultMatrix.m11, matrix.M11);
                Assert.AreEqual(resultMatrix.m12, matrix.M12);
                Assert.AreEqual(resultMatrix.m13, matrix.M13);

                Assert.AreEqual(resultMatrix.m20, matrix.M20);
                Assert.AreEqual(resultMatrix.m21, matrix.M21);
                Assert.AreEqual(resultMatrix.m22, matrix.M22);
                Assert.AreEqual(resultMatrix.m23, matrix.M23);

                Assert.AreEqual(resultMatrix.m30, matrix.M30);
                Assert.AreEqual(resultMatrix.m31, matrix.M31);
                Assert.AreEqual(resultMatrix.m32, matrix.M32);
                Assert.AreEqual(resultMatrix.m33, matrix.M33);
            }
        }
Пример #2
0
        public void BindPoses()
        {
            UnityEngine.Mesh originMesh = smr.sharedMesh;
            Assert.AreEqual(originMesh.bindposes.Length, mesh.BindposesLength);
            for (int i = 0; i < mesh.BindposesLength; i++)
            {
                Matrix4x4 originMatrix = originMesh.bindposes [i];
                Matrix16  matrix       = mesh.GetBindposes(i);

                Assert.AreEqual(originMatrix.m00, matrix.M00);
                Assert.AreEqual(originMatrix.m01, matrix.M01);
                Assert.AreEqual(originMatrix.m02, matrix.M02);
                Assert.AreEqual(originMatrix.m03, matrix.M03);

                Assert.AreEqual(originMatrix.m10, matrix.M10);
                Assert.AreEqual(originMatrix.m11, matrix.M11);
                Assert.AreEqual(originMatrix.m12, matrix.M12);
                Assert.AreEqual(originMatrix.m13, matrix.M13);

                Assert.AreEqual(originMatrix.m20, matrix.M20);
                Assert.AreEqual(originMatrix.m21, matrix.M21);
                Assert.AreEqual(originMatrix.m22, matrix.M22);
                Assert.AreEqual(originMatrix.m23, matrix.M23);

                Assert.AreEqual(originMatrix.m30, matrix.M30);
                Assert.AreEqual(originMatrix.m31, matrix.M31);
                Assert.AreEqual(originMatrix.m32, matrix.M32);
                Assert.AreEqual(originMatrix.m33, matrix.M33);
            }
        }
Пример #3
0
        public ResourceObject Parse(ByteBuffer bb)
        {
            Schema.Mesh fbMesh = Schema.Mesh.GetRootAsMesh(bb);

            UnityEngine.Mesh mesh = new UnityEngine.Mesh();

            Vec3 v3 = new Vec3();
            Vec2 v2 = new Vec2();
            Vec4 v4 = new Vec4();

            Vector3[] inVertices = new Vector3[fbMesh.VerticesLength];
            for (int i = 0; i < fbMesh.VerticesLength; i++)
            {
                Vec3 v = fbMesh.GetVertices(v3, i);
                inVertices[i] = new Vector3(v.X, v.Y, v.Z);
            }
            mesh.vertices = inVertices;

            if (fbMesh.UvLength > 0)
            {
                Vector2[] uvs = new Vector2[fbMesh.UvLength];
                for (int i = 0; i < fbMesh.UvLength; i++)
                {
                    Vec2 v = fbMesh.GetUv(v2, i);
                    uvs[i] = new Vector2(v.X, v.Y);
                }
                mesh.uv = uvs;
            }
            if (fbMesh.Uv2Length > 0)
            {
                Vector2[] uvs = new Vector2[fbMesh.Uv2Length];
                for (int i = 0; i < fbMesh.Uv2Length; i++)
                {
                    Vec2 v = fbMesh.GetUv2(v2, i);
                    uvs[i] = new Vector2(v.X, v.Y);
                }
                mesh.uv2 = uvs;
            }
            if (fbMesh.Uv3Length > 0)
            {
                Vector2[] uvs = new Vector2[fbMesh.Uv3Length];
                for (int i = 0; i < fbMesh.Uv3Length; i++)
                {
                    Vec2 v = fbMesh.GetUv3(v2, i);
                    uvs[i] = new Vector2(v.X, v.Y);
                }
                mesh.uv3 = uvs;
            }
            if (fbMesh.Uv4Length > 0)
            {
                Vector2[] uvs = new Vector2[fbMesh.Uv4Length];
                for (int i = 0; i < fbMesh.Uv4Length; i++)
                {
                    Vec2 v = fbMesh.GetUv4(v2, i);
                    uvs[i] = new Vector2(v.X, v.Y);
                }
                mesh.uv4 = uvs;
            }
            if (fbMesh.NormalsLength > 0)
            {
                Vector3[] normals = new Vector3[fbMesh.NormalsLength];
                for (int i = 0; i < fbMesh.NormalsLength; i++)
                {
                    Vec3 v = fbMesh.GetNormals(v3, i);
                    normals[i] = new Vector3(v.X, v.Y, v.Z);
                }
                mesh.normals = normals;
            }
            if (fbMesh.TangentsLength > 0)
            {
                Vector4[] tangents = new Vector4[fbMesh.TangentsLength];
                for (int i = 0; i < fbMesh.TangentsLength; i++)
                {
                    Vec4 v = fbMesh.GetTangents(v4, i);
                    tangents[i] = new Vector4(v.X, v.Y, v.Z, v.W);
                }
                mesh.tangents = tangents;
            }
            if (fbMesh.ColorsLength > 0)
            {
                Schema.Color        cobj   = new Schema.Color();
                UnityEngine.Color[] colors = new UnityEngine.Color[fbMesh.ColorsLength];
                for (int i = 0; i < fbMesh.ColorsLength; i++)
                {
                    Schema.Color c = fbMesh.GetColors(cobj, i);
                    colors[i] = new UnityEngine.Color(c.R, c.G, c.B, c.A);
                }
                mesh.colors = colors;
            }
            if (fbMesh.Colors32Length > 0)
            {
                Schema.Color32        cobj   = new Schema.Color32();
                UnityEngine.Color32[] colors = new UnityEngine.Color32[fbMesh.Colors32Length];
                for (int i = 0; i < fbMesh.Colors32Length; i++)
                {
                    Schema.Color32 c = fbMesh.GetColors32(cobj, i);
                    colors[i] = new UnityEngine.Color32(c.R, c.G, c.B, c.A);
                }
                mesh.colors32 = colors;
            }
            if (fbMesh.BoneWeightsLength > 0)
            {
                Schema.BoneWeight        bwobj       = new Schema.BoneWeight();
                UnityEngine.BoneWeight[] boneWeights = new UnityEngine.BoneWeight[fbMesh.BoneWeightsLength];
                for (int i = 0; i < fbMesh.BoneWeightsLength; i++)
                {
                    Schema.BoneWeight      _bw = fbMesh.GetBoneWeights(bwobj, i);
                    UnityEngine.BoneWeight bw  = new UnityEngine.BoneWeight();
                    bw.boneIndex0  = _bw.BoneIndex0;
                    bw.boneIndex1  = _bw.BoneIndex1;
                    bw.boneIndex2  = _bw.BoneIndex2;
                    bw.boneIndex3  = _bw.BoneIndex3;
                    bw.weight0     = _bw.Weight0;
                    bw.weight1     = _bw.Weight1;
                    bw.weight2     = _bw.Weight2;
                    bw.weight3     = _bw.Weight3;
                    boneWeights[i] = bw;
                }
                mesh.boneWeights = boneWeights;
            }

            int[] triangles = new int[fbMesh.TrianglesLength];
            for (int i = 0; i < fbMesh.TrianglesLength; i++)
            {
                triangles[i] = fbMesh.GetTriangles(i);
            }
            mesh.triangles = triangles;

            if (fbMesh.SubmeshesLength > 1)
            {
                for (int i = 0; i < fbMesh.SubmeshesLength; i++)
                {
                    Schema.SubMesh sb      = fbMesh.GetSubmeshes(i);
                    int[]          indices = new int[sb.NumOfTriangles];
                    for (int j = 0; j < sb.NumOfTriangles; j++)
                    {
                        indices[j] = fbMesh.GetTriangles((int)sb.StartTriangle + j);
                    }
                    mesh.SetIndices(indices, (UnityEngine.MeshTopology)sb.MeshTopology, i);
                }
            }

            if (fbMesh.BindposesLength > 0)
            {
                Matrix16    matrixObj = new Matrix16();
                Matrix4x4[] matrices  = new Matrix4x4[fbMesh.BindposesLength];
                for (int i = 0; i < fbMesh.BindposesLength; i++)
                {
                    Matrix16  _matrix = fbMesh.GetBindposes(matrixObj, i);
                    Matrix4x4 matrix  = new Matrix4x4();
                    matrix.m00  = _matrix.M00;
                    matrix.m01  = _matrix.M01;
                    matrix.m02  = _matrix.M02;
                    matrix.m03  = _matrix.M03;
                    matrix.m10  = _matrix.M10;
                    matrix.m11  = _matrix.M11;
                    matrix.m12  = _matrix.M12;
                    matrix.m13  = _matrix.M13;
                    matrix.m20  = _matrix.M20;
                    matrix.m21  = _matrix.M21;
                    matrix.m22  = _matrix.M22;
                    matrix.m23  = _matrix.M23;
                    matrix.m30  = _matrix.M30;
                    matrix.m31  = _matrix.M31;
                    matrix.m32  = _matrix.M32;
                    matrix.m33  = _matrix.M33;
                    matrices[i] = matrix;
                }
                mesh.bindposes = matrices;
            }

            Bound   _b   = fbMesh.GetBound(new Bound());
            Vec3    _min = _b.GetMin(v3);
            Vector3 min  = new Vector3(_min.X, _min.Y, _min.Z);
            Vec3    _max = _b.GetMax(v3);
            Vector3 max  = new Vector3(_max.X, _max.Y, _max.Z);
            Bounds  b    = new Bounds(min, max);

            mesh.bounds = b;

            string[] joints = new string[fbMesh.JointsLength];
            for (int i = 0; i < fbMesh.JointsLength; i++)
            {
                joints[i] = fbMesh.GetJoints(i);
            }

            return(new ResourceObjectMesh(mesh, joints));
        }
Пример #4
0
        public static ByteBuffer Save(UnityEngine.Mesh mesh, UnityEngine.Transform[] bones)
        {
            FlatBufferBuilder builder = new FlatBufferBuilder(InitBufferSize);

            // 创建顶点成分
            MeshComponent[] components =
            {
                // vertices
                new MeshComponent(
                    () =>   { return(true);                                                        },
                    () =>   { Schema.Mesh.StartVerticesVector(builder, mesh.vertexCount);          },
                    (i) =>  { Vec3.CreateVec3(builder, mesh.vertices[i].x, mesh.vertices[i].y, mesh.vertices[i].z);},
                    (vo) => { Schema.Mesh.AddVertices(builder, vo);                                }
                    ),
                // uv
                new MeshComponent(
                    () =>   { return((mesh.uv != null) && (mesh.uv.Length > 0));                   },
                    () =>   { Schema.Mesh.StartUvVector(builder, mesh.vertexCount);                },
                    (i) =>  { Vec2.CreateVec2(builder, mesh.uv[i].x, mesh.uv[i].y);                },
                    (vo) => { Schema.Mesh.AddUv(builder, vo);                                      }
                    ),
                // uv2
                new MeshComponent(
                    () =>   { return((mesh.uv2 != null) && (mesh.uv2.Length > 0));                 },
                    () =>   { Schema.Mesh.StartUv2Vector(builder, mesh.vertexCount);               },
                    (i) =>  { Vec2.CreateVec2(builder, mesh.uv2[i].x, mesh.uv2[i].y);              },
                    (vo) => { Schema.Mesh.AddUv2(builder, vo);                                     }
                    ),
                // uv3
                new MeshComponent(
                    () =>   { return((mesh.uv3 != null) && (mesh.uv3.Length > 0));                 },
                    () =>   { Schema.Mesh.StartUv3Vector(builder, mesh.vertexCount);               },
                    (i) =>  { Vec2.CreateVec2(builder, mesh.uv3[i].x, mesh.uv3[i].y);              },
                    (vo) => { Schema.Mesh.AddUv3(builder, vo);                                     }
                    ),
                // uv4
                new MeshComponent(
                    () =>   { return((mesh.uv4 != null) && (mesh.uv4.Length > 0));                 },
                    () =>   { Schema.Mesh.StartUv4Vector(builder, mesh.vertexCount);               },
                    (i) =>  { Vec2.CreateVec2(builder, mesh.uv4[i].x, mesh.uv4[i].y);              },
                    (vo) => { Schema.Mesh.AddUv4(builder, vo);                                     }
                    ),
                // normals
                new MeshComponent(
                    () =>   { return((mesh.normals != null) && (mesh.normals.Length > 0));         },
                    () =>   { Schema.Mesh.StartNormalsVector(builder, mesh.vertexCount);           },
                    (i) =>  { Vec3.CreateVec3(builder, mesh.normals[i].x, mesh.normals[i].y, mesh.normals[i].z);},
                    (vo) => { Schema.Mesh.AddNormals(builder, vo);                                 }
                    ),
                // tangents
                new MeshComponent(
                    () =>   { return((mesh.tangents != null) && (mesh.tangents.Length > 0));       },
                    () =>   { Schema.Mesh.StartTangentsVector(builder, mesh.vertexCount);          },
                    (i) =>  { Vec4.CreateVec4(builder, mesh.tangents[i].x, mesh.tangents[i].y, mesh.tangents[i].z, mesh.tangents[i].w);},
                    (vo) => { Schema.Mesh.AddTangents(builder, vo);                                }
                    ),
                // colors
                new MeshComponent(
                    () =>   { return((mesh.colors != null) && (mesh.colors.Length > 0));           },
                    () =>   { Schema.Mesh.StartColorsVector(builder, mesh.vertexCount);            },
                    (i) =>  { Schema.Color.CreateColor(builder, mesh.colors[i].a, mesh.colors[i].b, mesh.colors[i].g, mesh.colors[i].r);},
                    (vo) => { Schema.Mesh.AddColors(builder, vo);                                  }
                    ),
                // colors32
                new MeshComponent(
                    () =>   { return((mesh.colors32 != null) && (mesh.colors.Length > 0));         },
                    () =>   { Schema.Mesh.StartColors32Vector(builder, mesh.vertexCount);          },
                    (i) =>  { Schema.Color32.CreateColor32(builder, mesh.colors32[i].a, mesh.colors32[i].b, mesh.colors32[i].g, mesh.colors32[i].r);},
                    (vo) => { Schema.Mesh.AddColors32(builder, vo);                                }
                    ),
                // BoneWeigths
                new MeshComponent(
                    () =>   { return((mesh.boneWeights != null) && (mesh.boneWeights.Length > 0)); },
                    () =>   { Schema.Mesh.StartBoneWeightsVector(builder, mesh.vertexCount);       },
                    (i) =>  { Schema.BoneWeight.CreateBoneWeight(builder,
                                                                 mesh.boneWeights[i].boneIndex0, mesh.boneWeights[i].boneIndex1, mesh.boneWeights[i].boneIndex2, mesh.boneWeights[i].boneIndex3,
                                                                 mesh.boneWeights[i].weight0, mesh.boneWeights[i].weight1, mesh.boneWeights[i].weight2, mesh.boneWeights[i].weight3
                                                                 ); },
                    (vo) => { Schema.Mesh.AddBoneWeights(builder, vo);                             }
                    )
            };

            int componentCount = components.Length;

            VectorOffset[] vectorOffsets = new VectorOffset[componentCount];
            for (int c = 0; c < componentCount; c++)
            {
                if (components[c].funcExist())
                {
                    components[c].actStart();
                    for (int i = mesh.vertexCount - 1; i >= 0; i--) // 添加时顺序颠倒。
                    {
                        components[c].actElem(i);                   // 结构vector不需要AddOffset
                    }
                    vectorOffsets[c] = builder.EndVector();
                }
            }

            // 创建 Submesh
            Offset <SubMesh>[] offSubmeshes = new Offset <SubMesh> [mesh.subMeshCount];
            uint offset = 0;

            for (int i = 0; i < mesh.subMeshCount; i++)
            {
                int[] _is = mesh.GetIndices(i);
                offSubmeshes[i] = SubMesh.CreateSubMesh(builder, offset, (uint)_is.Length, (Schema.MeshTopology)mesh.GetTopology(i));
                offset         += (uint)_is.Length;
            }
            // 网格所涉及到的骨骼
            StringOffset[] offJoints = new StringOffset[bones.Length];
            for (int i = 0; i < bones.Length; i++)
            {
                offJoints[i] = builder.CreateString(bones[i].name);
            }
            // BindPoses
            Schema.Mesh.StartBindposesVector(builder, mesh.bindposes.Length);
            for (int i = mesh.bindposes.Length - 1; i >= 0; i--)
            {
                Matrix4x4 m = mesh.bindposes[i];
                Matrix16.CreateMatrix16(builder,
                                        m.m00, m.m01, m.m02, m.m03,
                                        m.m10, m.m11, m.m12, m.m13,
                                        m.m20, m.m21, m.m22, m.m23,
                                        m.m30, m.m31, m.m32, m.m33
                                        );
            }
            VectorOffset vecBindPoses = builder.EndVector();

            // 三角面索引数据  标量数组可以直接添加。
            VectorOffset vecTrangles = Schema.Mesh.CreateTrianglesVector(builder, mesh.triangles);
            // Submesh 数据
            VectorOffset vecSubmeshes = Schema.Mesh.CreateSubmeshesVector(builder, offSubmeshes);
            // 涉及到的骨骼
            VectorOffset vecJoints = Schema.Mesh.CreateJointsVector(builder, offJoints);

            // 放入Mesh
            Schema.Mesh.StartMesh(builder);
            // 顶点数据
            for (int c = 0; c < componentCount; c++)
            {
                if (components[c].funcExist())
                {
                    components[c].actAdd(vectorOffsets[c]);
                }
            }
            Schema.Mesh.AddTriangles(builder, vecTrangles);
            Schema.Mesh.AddSubmeshes(builder, vecSubmeshes);
            Schema.Mesh.AddJoints(builder, vecJoints);
            Schema.Mesh.AddBindposes(builder, vecBindPoses);

            // 边界
            Vector3 min = mesh.bounds.min;
            Vector3 max = mesh.bounds.max;

            Schema.Mesh.AddBound(builder, Schema.Bound.CreateBound(builder, min.x, min.y, min.z, max.x, max.y, max.z));
            Offset <Schema.Mesh> offMesh = Schema.Mesh.EndMesh(builder);

            builder.Finish(offMesh.Value);
            return(builder.DataBuffer);
        }