public static ModelResourceNode Convert(LmMsgPck msg) { var aabb = LmAABB.Unpack(msg); var boneTable = LmBoneTable.Unpack(msg); var i = 0u; var modelResourceNode = new ModelResourceNode(); foreach (var boneInfo in boneTable.BoneInfos) { modelResourceNode.MeshBoneInformation.Bones.Add(new MeshBoneInformation.Bone(boneInfo.BoneName, boneInfo.LodBoneIdx, boneInfo.UniqueBoneIdx)); // FIXME modelResourceNode.MeshBoneInformation.BoneLut.Add(boneInfo.UniqueBoneIdx, i); i++; } modelResourceNode.NodeTable = LmNodeTable.Unpack(msg); if (msg.Version >= 20141113) { var assetHash = (ulong)msg.Read(); // TODO msg.UserData.GpuBuffer = msg.UserData.DependencyTable.Get(assetHash); } var meshContainerCount = (int)msg.Read(); for (var _ = 0; _ < meshContainerCount; _++) { var meshContainer = MeshContainer.Convert(msg); modelResourceNode.MeshContainers.Add(meshContainer); } if (msg.Version >= 20140623) { var unknown = msg.ReadBool(); modelResourceNode.Name = msg.ReadString(); } if (msg.Version >= 20140722 && msg.Version < 20140929) { var hasPsdData = msg.ReadBool(); var psdDataHash = msg.ReadUint64(); } if (msg.Version < 20140815) { return(modelResourceNode); } var gmdlPartsDatasCount = msg.ReadUint(); for (var _ = 0; _ < gmdlPartsDatasCount; _++) { var gmdlPartsData = GmdlPartsData.Unpack(msg); modelResourceNode.GmdlPartsDatas.Add(gmdlPartsData); } return(modelResourceNode); }
public static LmSubGeometry Unpack(LmMsgPck msg) { var aabb = LmAABB.Unpack(msg); var startIdx = msg.ReadUint(); var primCount = msg.ReadUint(); var clusterIdxBitFlag = msg.ReadUint(); var drawOrder = msg.ReadUint(); return(new LmSubGeometry(aabb, startIdx, primCount, clusterIdxBitFlag, drawOrder)); }
public static LmGeometry Unpack(LmMsgPck msg) { // Probably an unnecessary isOBB check var bValue1 = msg.Read(); var geometry = new LmGeometry { AABB = LmAABB.Unpack(msg) }; if (msg.Version >= 20160705) { var isOBB = (bool)msg.Read(); Debug.Assert(isOBB); geometry.OBB = LmOrientedBB.Unpack(msg); } geometry.PrimType = (LmEPrimitiveType)msg.ReadByte(); geometry.IdxNum = msg.ReadUint(); geometry.IdxType = (LmEIndexType)msg.ReadByte(); if (msg.Version < 20141113) { Debug.Fail("Unsupported version"); } var idxBufferOffset = msg.ReadUint(); geometry.IdxBufferSize = msg.ReadUint(); geometry.IdxBuffer = new int[geometry.IdxNum]; for (var i = 0; i < geometry.IdxNum; i++) { if (geometry.IdxType == LmEIndexType.IndexType32) { geometry.IdxBuffer[i] = BitConverter.ToInt32(msg.UserData.GpuBuffer, (int)idxBufferOffset + (4 * i)); } else if (geometry.IdxType == LmEIndexType.IndexType16) { geometry.IdxBuffer[i] = BitConverter.ToInt16(msg.UserData.GpuBuffer, (int)idxBufferOffset + (2 * i)); } else { Debug.Fail("Unsupported index type"); } } geometry.VtxNum = msg.ReadUint(); geometry.VtxStreamGroupDesc = LmVertexStreamGroupDesc.Unpack(msg); var vtxBufferOffset = msg.ReadUint(); geometry.VtxBufferSize = msg.ReadUint(); geometry.VtxBuffer = new byte[geometry.VtxBufferSize]; Array.Copy(msg.UserData.GpuBuffer, (int)vtxBufferOffset, geometry.VtxBuffer, 0, (int)geometry.VtxBufferSize); if (msg.Version < 20150413) { geometry.InstanceNum = 0; } else { geometry.InstanceNum = msg.ReadUint(); //var instanceNumOffset = msg.ReadUint(); //var unknown = (float)msg.Read(); //geometry.InstanceBuffer = new ArraySegment<byte>(msg.UserData.GpuBuffer, (int)instanceNumOffset, (int)unknown); } // TODO subgeometries var subgeometryCount = msg.ReadUint(); for (var _ = 0; _ < subgeometryCount; _++) { geometry.SubGeometries.Add(LmSubGeometry.Unpack(msg)); } return(geometry); }