Example #1
0
        public static Mesh Convert(LmMsgPck msg)
        {
            var name             = msg.ReadString();
            var u0               = msg.ReadByte();
            var boneIdTable      = LmBoneIdTable.Unpack(msg);
            var vertexLayoutType = (VertexLayoutType)msg.ReadInt();
            var geometry         = LmGeometry.Unpack(msg);

            var mesh = new Mesh(name, geometry);

            mesh.Setup(geometry);

            // TODO get Material
            var defaultMaterialHash = msg.ReadUint64();

            var gmdlMeshData = new GmdlMeshData();

            mesh.GmdlMeshData = gmdlMeshData;

            if (msg.Version >= 20140623)
            {
                gmdlMeshData.DrawPriorityOffset = msg.ReadInt();
                if (msg.ReadBool())
                {
                    gmdlMeshData.Flags |= 1;
                }

                if (msg.ReadBool())
                {
                    gmdlMeshData.Flags |= 2;
                }

                gmdlMeshData.LodNear = msg.ReadFloat();
                gmdlMeshData.LodFar  = msg.ReadFloat();
                gmdlMeshData.LodFade = msg.ReadFloat();

                if (gmdlMeshData.LodNear < gmdlMeshData.LodFar && (gmdlMeshData.LodNear > 0.0 || gmdlMeshData.LodFar < 3.4028235e38))
                {
                    gmdlMeshData.Flags |= 4u;
                }

                if (gmdlMeshData.LodFade > 0.0)
                {
                    gmdlMeshData.Flags |= 0x100u;
                }
            }

            if (msg.Version >= 20140814)
            {
                msg.ReadBool();
            }

            if (msg.Version >= 20141112 && msg.ReadBool())
            {
                gmdlMeshData.Flags |= 0x10u;
            }

            if (msg.Version >= 20140815)
            {
                gmdlMeshData.PartsId = msg.ReadUint();
            }

            if (msg.Version >= 20141115)
            {
                var gmdlMeshPartsDataCount = msg.ReadInt();
                for (var _ = 0; _ < gmdlMeshPartsDataCount; _++)
                {
                    var gmdlMeshPartData = GmdlMeshPartsData.Unpack(msg);
                    gmdlMeshData.GmdlMeshPartsDatas.Add(gmdlMeshPartData);
                }
            }

            if (msg.Version >= 20150413 && msg.ReadBool())
            {
                gmdlMeshData.Flags |= 0x20u;
            }

            if (msg.Version >= 20150430)
            {
                var flag = msg.ReadUint();
                if (msg.Version < 20151217)
                {
                    gmdlMeshData.Flags |= 0x200u;
                    if (boneIdTable.BoneIds.Count == 0)
                    {
                        gmdlMeshData.Flags |= 0x400u;
                    }
                }

                gmdlMeshData.Flags |= flag;
            }

            if (msg.Version >= 20150512 && msg.ReadBool())
            {
                gmdlMeshData.Flags |= 0x80u;
            }

            if (msg.Version < 20160420)
            {
                gmdlMeshData.BreakableBoneIndex    = 0xFFFFFFFF;
                gmdlMeshData.LowLodShadowCascadeNo = 2;
            }
            else
            {
                gmdlMeshData.BreakableBoneIndex    = msg.ReadUint();
                gmdlMeshData.LowLodShadowCascadeNo = (sbyte)msg.ReadUint();
            }

            gmdlMeshData.VertexLayoutType = vertexLayoutType;
            if ((gmdlMeshData.Flags & 0x80000) != 0)
            {
                var unk0 = msg.ReadBool();
                var unk1 = msg.ReadUint();
                var unk2 = msg.ReadUint();
            }

            // TODO SetupMeshLod

            return(mesh);
        }