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); }