示例#1
0
 public LmSubGeometry(LmAABB aabb, uint startIdx, uint primCount, uint clusterIdxBitFlag, uint drawOrder)
 {
     this.AABB              = aabb;
     this.StartIdx          = startIdx;
     this.PrimCount         = primCount;
     this.ClusterIdxBitFlag = clusterIdxBitFlag;
     this.DrawOrder         = drawOrder;
 }
示例#2
0
        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);
        }
示例#3
0
        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));
        }
示例#4
0
        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);
        }