private void PathReader(BinaryReaderExt reader) { reader.ReadInt32(); // v11 reader.ReadInt32(); // v12 reader.ReadInt32(); // type reader.ReadSingle(); // startPosTime reader.ReadSingle(); // endPosTime reader.ReadSingle(); // maxSpeed reader.ReadSingle(); // stopRDist reader.ReadSingle(); // cruiseDist reader.ReadSingle(); // totalDist reader.ReadInt32(); // timeKeyDataId reader.ReadInt32(); // iDec reader.ReadInt32(); // iInc reader.ReadInt32(); // bType reader.ReadInt32(); // bId reader.ReadInt32(); // nType reader.ReadInt32(); // nId var signalSize = reader.ReadInt32(); // signalSize for (var i = 0; i < signalSize; i++) { reader.ReadInt32(); // id } }
private void TimeKeyDataReader(BinaryReaderExt reader) { reader.ReadInt32(); // id var keySize = reader.ReadInt32(); // keySize for (var i = 0; i < keySize; i++) { reader.ReadSingle(); // time0 reader.ReadVector3(); // pos reader.ReadVector3(); // right reader.ReadVector3(); // dir reader.ReadVector3(); // normal reader.ReadVector4(); // quat } }
private static double ParseFloat(BinaryReaderExt d, GXAnimDataFormat Format, float Scale) { d.BigEndian = false; switch (Format) { case GXAnimDataFormat.HSD_A_FRAC_FLOAT: return(d.ReadSingle()); case GXAnimDataFormat.HSD_A_FRAC_S16: return(d.ReadInt16() / (double)Scale); case GXAnimDataFormat.HSD_A_FRAC_U16: return(d.ReadUInt16() / (double)Scale); case GXAnimDataFormat.HSD_A_FRAC_S8: return(d.ReadSByte() / (double)Scale); case GXAnimDataFormat.HSD_A_FRAC_U8: return(d.ReadByte() / (double)Scale); default: return(0); } }
public void Read(BinaryReaderExt r) { r.ReadByte(); Type = (LVDShapeType)r.ReadInt32(); X = r.ReadSingle(); Y = r.ReadSingle(); Z = r.ReadSingle(); W = r.ReadSingle(); r.ReadByte(); r.ReadByte(); int pointCount = r.ReadInt32(); for (int i = 0; i < pointCount; i++) { r.Skip(1); Points.Add(new LVDVector2(r.ReadSingle(), r.ReadSingle())); } }
/// <summary> /// /// </summary> /// <returns></returns> public object[] Decode(byte code, BinaryReaderExt r) { var output = new List <object>(Parameters.Length); for (int i = 0; i < Parameters.Length; i++) { var k = Parameters[i]; switch (k) { case 'e': // extended byte int e = r.ReadByte(); if ((e & 0x80) > 0) { e = ((e & 0x7F) << 8 | r.ReadByte()); } output.Add((short)e); break; case 'b': output.Add(r.ReadByte()); break; case 'f': output.Add(r.ReadSingle()); break; case 's': output.Add(r.ReadInt16()); break; case 'c': { // custom parameters //var behavior = code >> 4; var param_count = code & 0xF; for (int j = 0; j < 4; j++) { if (((param_count >> i) & 1) == 1) { output.Add(r.ReadByte()); } } } break; case 'p': case 'v': { if ((code & 0x01) != 0) { output.Add(r.ReadSingle()); } else { output.Add(0); } if ((code & 0x02) != 0) { output.Add(r.ReadSingle()); } else { output.Add(0); } if ((code & 0x04) != 0) { output.Add(r.ReadSingle()); } else { output.Add(0); } } break; case 'r': { var behavior = r.ReadByte(); output.Add((behavior & 0x10) != 0); output.Add((behavior & 0x20) != 0); output.Add(r.ReadByte()); if ((behavior & 0x01) != 0) { output.Add(r.ReadByte()); } else { output.Add(0); } if ((behavior & 0x02) != 0) { output.Add(r.ReadByte()); } else { output.Add(0); } if ((behavior & 0x04) != 0) { output.Add(r.ReadByte()); } else { output.Add(0); } if ((behavior & 0x08) != 0) { output.Add(r.ReadByte()); } else { output.Add(0); } } break; case 'm': { var behavior = r.ReadByte(); if ((behavior & 0x01) != 0) { output.Add(r.ReadByte()); } else { output.Add(0); } if ((behavior & 0x08) != 0) { output.Add(r.ReadByte()); } else { output.Add(0); } } break; } } return(output.ToArray()); }
public void Read(BinaryReaderExt r, int VersionMinor) { base.Read(r); Flag1 = r.ReadBoolean(); Rigged = r.ReadBoolean(); Flag3 = r.ReadBoolean(); PassThrough = r.ReadBoolean(); r.ReadByte(); int vertCount = r.ReadInt32(); for (int i = 0; i < vertCount; i++) { r.ReadByte(); Vertices.Add(new LVDVector2(r.ReadSingle(), r.ReadSingle())); } r.ReadByte(); int normalCount = r.ReadInt32(); for (int i = 0; i < normalCount; i++) { r.ReadByte(); Normals.Add(new LVDVector2(r.ReadSingle(), r.ReadSingle())); } r.ReadByte(); int cliffCount = r.ReadInt32(); for (int i = 0; i < cliffCount; i++) { var cliff = new LVDCollisionCliff(); cliff.Read(r); Cliffs.Add(cliff); } r.ReadByte(); int materialCount = r.ReadInt32(); for (int i = 0; i < materialCount; i++) { var material = new LVDCollisionMaterial(); material.Read(r); Materials.Add(material); } // Ultimate Only? if (VersionMinor > 10) { r.ReadByte(); var vecCount = r.ReadInt32(); for (int i = 0; i < vecCount; i++) { var vec = new LVDCollisionCurve(); vec.Read(r); Curves.Add(vec); } } }
public override void Read(BinaryReaderExt r) { base.Read(r); r.ReadByte(); Vector1 = new LVDVector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle()); r.ReadByte(); Vector2 = new LVDVector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle()); r.ReadByte(); int vec3Count = r.ReadInt32(); for (int i = 0; i < vec3Count; i++) { r.ReadByte(); Vectors.Add(new LVDVector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle())); } r.ReadByte(); Mat4x4_1 = new float[16]; for (int i = 0; i < 16; i++) { Mat4x4_1[i] = r.ReadSingle(); } r.ReadByte(); Mat4x4_2 = new float[16]; for (int i = 0; i < 16; i++) { Mat4x4_2[i] = r.ReadSingle(); } }
public static KAR_grCollisionNode KCLtoKAR(string kclFile, out KAR_grCollisionTree tree) { KAR_grCollisionNode node = new KAR_grCollisionNode(); List <KAR_CollisionTriangle> tris = new List <KAR_CollisionTriangle>(); List <GXVector3> verts = new List <GXVector3>(); using (FileStream f = new FileStream(kclFile, FileMode.Open)) using (BinaryReaderExt r = new BinaryReaderExt(f)) { r.BigEndian = true; var posOffset = r.ReadInt32(); var nrmOffset = r.ReadInt32(); var triOffset = r.ReadInt32() + 0x10; var partOffste = r.ReadInt32(); var triCount = (partOffste - triOffset) / 0x10; for (int i = 0; i < triCount; i++) { r.Seek((uint)(triOffset + i * 0x10)); var length = r.ReadSingle(); var pi = r.ReadUInt16(); var di = r.ReadUInt16(); var n1 = r.ReadUInt16(); var n2 = r.ReadUInt16(); var n3 = r.ReadUInt16(); var fl = r.ReadUInt16(); r.Seek((uint)(posOffset + pi * 0xC)); var position = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle()); r.Seek((uint)(nrmOffset + di * 0xC)); var direction = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle()); r.Seek((uint)(nrmOffset + n1 * 0xC)); var normalA = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle()); r.Seek((uint)(nrmOffset + n2 * 0xC)); var normalB = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle()); r.Seek((uint)(nrmOffset + n3 * 0xC)); var normalC = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle()); var crossA = Vector3.Cross(normalA, direction); var crossB = Vector3.Cross(normalB, direction); var vertex1 = position; var vertex2 = position + crossB * (length / Vector3.Dot(crossB, normalC)); var vertex3 = position + crossA * (length / Vector3.Dot(crossA, normalC)); tris.Add(new KAR_CollisionTriangle() { Flags = 0x81, V1 = verts.Count + 2, V2 = verts.Count + 1, V3 = verts.Count }); // scale vertex1 *= Scale; vertex2 *= Scale; vertex3 *= Scale; vertex1.Y += YTrans; vertex2.Y += YTrans; vertex3.Y += YTrans; verts.Add(new GXVector3() { X = vertex1.X, Y = vertex1.Y, Z = vertex1.Z }); verts.Add(new GXVector3() { X = vertex2.X, Y = vertex2.Y, Z = vertex2.Z }); verts.Add(new GXVector3() { X = vertex3.X, Y = vertex3.Y, Z = vertex3.Z }); } } { var height = verts.Min(e => e.Y) - 10; var v1 = new Vector3(-10000, height, -10000); var v2 = new Vector3(10000, height, -10000); var v3 = new Vector3(10000, height, 10000); var v4 = new Vector3(-10000, height, 10000); tris.Add(new KAR_CollisionTriangle() { Flags = 0x81, V1 = verts.Count, V2 = verts.Count + 1, V3 = verts.Count + 2 }); verts.Add(new GXVector3() { X = v1.X, Y = v1.Y, Z = v1.Z }); verts.Add(new GXVector3() { X = v2.X, Y = v2.Y, Z = v2.Z }); verts.Add(new GXVector3() { X = v3.X, Y = v3.Y, Z = v3.Z }); tris.Add(new KAR_CollisionTriangle() { Flags = 0x81, V1 = verts.Count, V2 = verts.Count + 1, V3 = verts.Count + 2 }); verts.Add(new GXVector3() { X = v1.X, Y = v1.Y, Z = v1.Z }); verts.Add(new GXVector3() { X = v3.X, Y = v3.Y, Z = v3.Z }); verts.Add(new GXVector3() { X = v4.X, Y = v4.Y, Z = v4.Z }); } node.Triangles = tris.ToArray(); node.Vertices = verts.ToArray(); node.Joints = new KAR_CollisionJoint[] { new KAR_CollisionJoint() { VertexStart = 0, VertexSize = verts.Count, FaceStart = 0, FaceSize = tris.Count } }; tree = BucketGen.GenerateBucketPartition(node); return(node); }
private static void ReadTrack(BinaryReaderExt r, int frameCount, int type, FOBJ_Player track, uint dataOffset, AnimNode node) { var offset = r.ReadUInt32() + dataOffset; var temp = r.Position; r.Seek(offset); int fCount = -1; float scale = 0; float[] frame = null, step = null, tan = null; if (type == 0x1) { fCount = r.ReadUInt16(); r.Skip(2); scale = r.ReadSingle(); float stepb = r.ReadSingle(); float base2 = r.ReadSingle(); frame = new float[fCount]; step = new float[fCount]; tan = new float[fCount]; for (int i = 0; i < fCount; i++) { var v = r.ReadInt32(); frame[i] = (v >> 24) & 0xFF; int th = v & 0xFFFFFF; step[i] = base2 + ((th >> 12) & 0xfff) * stepb; tan[i] = (Sign12Bit(th & 0xfff) / 32f); track.Keys.Add(new FOBJKey() { Frame = frame[i], Value = step[i], Tan = tan[i], InterpolationType = GXInterpolationType.HSD_A_OP_SPL }); } } if (type == 0x2) { fCount = r.ReadUInt16(); r.Skip(2); scale = r.ReadSingle(); float stepb = r.ReadSingle(); float base2 = r.ReadSingle(); frame = new float[fCount]; step = new float[fCount]; tan = new float[fCount]; for (int i = 0; i < fCount; i++) { frame[i] = r.ReadUInt16() / 32f; step[i] = base2 + r.ReadUInt16() * stepb; tan[i] = (r.ReadInt16() / 256f); track.Keys.Add(new FOBJKey() { Frame = frame[i], Value = step[i], Tan = tan[i], InterpolationType = GXInterpolationType.HSD_A_OP_SPL }); } } if (type == 0x3) { fCount = r.ReadUInt16(); r.Skip(2); scale = r.ReadSingle(); frame = new float[fCount]; step = new float[fCount]; tan = new float[fCount]; for (int i = 0; i < fCount; i++) { frame[i] = r.ReadSingle(); step[i] = r.ReadSingle(); tan[i] = r.ReadSingle(); track.Keys.Add(new FOBJKey() { Frame = frame[i], Value = step[i], Tan = tan[i], InterpolationType = GXInterpolationType.HSD_A_OP_SPL }); } } if (type == 0x4) { float stepb = r.ReadSingle(); float base2 = r.ReadSingle(); for (int i = 0; i < frameCount; i++) { float v = base2 + stepb * (r.ReadByte()); track.Keys.Add(new FOBJKey() { Frame = i, Value = v, InterpolationType = GXInterpolationType.HSD_A_OP_LIN }); } } if (type == 0x6) { for (int i = 0; i < frameCount; i++) { float v = r.ReadSingle(); track.Keys.Add(new FOBJKey() { Frame = i, Value = v, InterpolationType = GXInterpolationType.HSD_A_OP_LIN }); } } r.Seek(temp); }
private static void ReadKeys(BinaryReaderExt r, AnimNode node, int frameCount, FOBJ_Player xtrack, FOBJ_Player ytrack, FOBJ_Player ztrack, bool isIsotrophic, bool isXFixed, bool isYFixed, bool isZFixed, int type, uint dataOffset) { if (isIsotrophic) { var temp = r.Position + 4; if (!isXFixed && !isYFixed && !isZFixed) { var offset = r.ReadUInt32() + r.Position; r.Seek(offset); } float iss = r.ReadSingle(); xtrack.Keys.Add(new FOBJKey() { Frame = 0, Value = iss, InterpolationType = GXInterpolationType.HSD_A_OP_KEY }); ytrack.Keys.Add(new FOBJKey() { Frame = 0, Value = iss, InterpolationType = GXInterpolationType.HSD_A_OP_KEY }); ztrack.Keys.Add(new FOBJKey() { Frame = 0, Value = iss, InterpolationType = GXInterpolationType.HSD_A_OP_KEY }); r.Seek(temp); } else { if (isXFixed) { xtrack.Keys.Add(new FOBJKey() { Frame = 0, Value = r.ReadSingle(), InterpolationType = GXInterpolationType.HSD_A_OP_KEY }); } else { ReadTrack(r, frameCount, type, xtrack, dataOffset, node); } if (isYFixed) { ytrack.Keys.Add(new FOBJKey() { Frame = 0, Value = r.ReadSingle(), InterpolationType = GXInterpolationType.HSD_A_OP_KEY }); } else { ReadTrack(r, frameCount, type, ytrack, dataOffset, node); } if (isZFixed) { ztrack.Keys.Add(new FOBJKey() { Frame = 0, Value = r.ReadSingle(), InterpolationType = GXInterpolationType.HSD_A_OP_KEY }); } else { ReadTrack(r, frameCount, type, ztrack, dataOffset, node); } } }
public void UserAuthAnswerPacket() { var packet = new UserAuthAnswerPacket(); var bytes = packet.GetBytes(); using (var ms = new MemoryStream(bytes)) { using (var bs = new BinaryReaderExt(ms)) { var ticket = bs.ReadUInt32(); Assert.AreEqual(packet.Ticket, ticket); var result = bs.ReadInt32(); Assert.AreEqual(packet.Result, result); var time = bs.ReadInt32(); Assert.AreEqual(packet.Time, time); bs.ReadBytes(64); // Filler var serverListId = bs.ReadUInt16(); Assert.AreEqual(packet.ServerListId, serverListId); var serverCount = bs.ReadInt32(); Assert.AreEqual(packet.ServerCount, serverCount); // Normally we could read all servers, but for tests only the first // is interesting var serverName = bs.ReadUnicodeStatic(32); StringAssert.AreEqualIgnoringCase(serverName, packet.Servers[0].ServerName); var serverId = bs.ReadUInt32(); Assert.AreEqual(packet.Servers[0].ServerId, serverId); var playerCount = bs.ReadSingle(); Assert.AreEqual(packet.Servers[0].PlayerCount, playerCount); var maxPlayers = bs.ReadSingle(); Assert.AreEqual(packet.Servers[0].MaxPlayers, maxPlayers); var serverState = bs.ReadInt32(); Assert.AreEqual(packet.Servers[0].ServerState, serverState); var gameTime = bs.ReadInt32(); Assert.AreEqual(packet.Servers[0].GameTime, gameTime); var lobbyTime = bs.ReadInt32(); Assert.AreEqual(packet.Servers[0].LobbyTime, lobbyTime); var area1Time = bs.ReadInt32(); Assert.AreEqual(packet.Servers[0].Area1Time, area1Time); var area2Time = bs.ReadInt32(); Assert.AreEqual(packet.Servers[0].Area2Time, area2Time); var rankingUpdateTime = bs.ReadInt32(); Assert.AreEqual(packet.Servers[0].RankingUpdateTime, rankingUpdateTime); var gameServerIp = bs.ReadBytes(4); Assert.AreEqual(packet.Servers[0].GameServerIp, gameServerIp); var lobbyServerIp = bs.ReadBytes(4); Assert.AreEqual(packet.Servers[0].LobbyServerIp, lobbyServerIp); var areaServer1Ip = bs.ReadBytes(4); Assert.AreEqual(packet.Servers[0].AreaServer1Ip, areaServer1Ip); var areaServer2Ip = bs.ReadBytes(4); Assert.AreEqual(packet.Servers[0].AreaServer2Ip, areaServer2Ip); var rankingServerIp = bs.ReadBytes(4); Assert.AreEqual(packet.Servers[0].RankingServerIp, rankingServerIp); var gameServerPort = bs.ReadUInt16(); Assert.AreEqual(packet.Servers[0].GameServerPort, gameServerPort); var lobbyServerPort = bs.ReadUInt16(); Assert.AreEqual(packet.Servers[0].LobbyServerPort, lobbyServerPort); var areaServerPort = bs.ReadUInt16(); Assert.AreEqual(packet.Servers[0].AreaServerPort, areaServerPort); var areaServer2Port = bs.ReadUInt16(); Assert.AreEqual(packet.Servers[0].AreaServer2Port, areaServer2Port); var areaServerUdpPort = bs.ReadUInt16(); Assert.AreEqual(packet.Servers[0].AreaServerUdpPort, areaServerUdpPort); var areaServer2UdpPort = bs.ReadUInt16(); Assert.AreEqual(packet.Servers[0].AreaServer2UdpPort, areaServer2UdpPort); var rankingServerPort = bs.ReadUInt16(); Assert.AreEqual(packet.Servers[0].RankingServerPort, rankingServerPort); } } }
public void Parse(BinaryReaderExt r) { r.BigEndian = true; var start = r.Position; var sectionCount = r.ReadInt32(); var sectionHeaderLength = r.ReadInt32(); PlaySpeed = r.ReadSingle(); EndTime = r.ReadSingle(); for (int j = 0; j < sectionCount; j++) { Joint joint = new Joint(); Joints.Add(joint); joint.Flag1 = r.ReadByte(); joint.Flag2 = r.ReadByte(); joint.Flag3 = r.ReadUInt16(); joint.BoneID = r.ReadInt16(); var floatCount = r.ReadInt16(); joint.MaxTime = r.ReadSingle(); joint.Unknown = r.ReadInt32(); var offset1 = r.ReadUInt32() + start; var offset2 = r.ReadUInt32() + start; var offset3 = r.ReadUInt32() + start; var offset4 = r.ReadUInt32() + start; if (offset3 != start) { throw new NotSupportedException("Section 3 detected"); } if (offset4 != start) { throw new NotSupportedException("Section 4 detected"); } var temp = r.Position; for (uint k = 0; k < floatCount; k++) { Key key = new Key(); r.Seek(offset1 + 4 * k); key.Time = r.ReadSingle(); if (offset2 != start) { r.Seek(offset2 + 8 * k); key.X = BitConverter.ToSingle(BitConverter.GetBytes(((r.ReadByte() & 0xFF) << 24) | ((r.ReadByte() & 0xFF) << 16)), 0); key.Y = BitConverter.ToSingle(BitConverter.GetBytes(((r.ReadByte() & 0xFF) << 24) | ((r.ReadByte() & 0xFF) << 16)), 0); key.Z = BitConverter.ToSingle(BitConverter.GetBytes(((r.ReadByte() & 0xFF) << 24) | ((r.ReadByte() & 0xFF) << 16)), 0); key.W = BitConverter.ToSingle(BitConverter.GetBytes(((r.ReadByte() & 0xFF) << 24) | ((r.ReadByte() & 0xFF) << 16)), 0); } joint.Keys.Add(key); } r.Seek(temp); } }
private void LoadSinglePath(BinaryReaderExt reader) { /* * if ( v3 < 20061102 ) * XiReadBTCF::Scanf((XiReadBTCF *)&this->m_Input.vfptr, "%d%d%f", &pathID, &to, &pathDist); * else * XiReadBTCF::Scanf((XiReadBTCF *)&this->m_Input.vfptr, "%d%d%d%f\n", &pathID, &from1, &to, &pathDist); */ reader.ReadInt32(); // PathID reader.ReadInt32(); // From1 reader.ReadInt32(); // to reader.ReadSingle(); // PathDist reader.ReadSingle(); // weight reader.ReadInt32(); // roadtype reader.ReadSingle(); // minSpeed reader.ReadSingle(); // maxSpeed if (FileVersion < 20061102) { reader.ReadInt32(); // dataType } //if ( v2->m_iVersion < 20061102 ) // dataType /* * if ( v2->m_iVersion < 20080327 ) * { * XiReadBTCF::Scanf((XiReadBTCF *)&v2->m_Input.vfptr, "%f", &width4Road, &"|ü÷ܱG Dzҕ Ǹ"); * XiReadBTCF::Scanf((XiReadBTCF *)&v2->m_Input.vfptr, "%f", &width4Side, "?ێƍ ࠞЫҦҮ¶G Ǹ"); * hitWidth = 4.0; * v4 = (width4Side - width4Road) * 0.5; * lsw.fSideWay = v4; * rsw.fSideWay = v4; * }else */ if (FileVersion < 20080327) { reader.ReadSingle(); // width4Road reader.ReadSingle(); // width4Side } else { reader.ReadSingle(); // hitWidth reader.ReadSingle(); // lsw reader.ReadSingle(); // lsw.fWalkW reader.ReadSingle(); // lsw.fWalkH reader.ReadSingle(); // rsw reader.ReadSingle(); // rsw.fWalkW reader.ReadSingle(); // rsw.fWalkH } reader.ReadSingle(); // laneWidth reader.ReadSingle(); // middleWidth reader.ReadInt32(); // rCount reader.ReadInt32(); // lCount reader.ReadInt32(); // bOneWay reader.ReadSingle(); // fStart reader.ReadSingle(); // fEnd var dataSize = reader.ReadInt32(); // dataSize for (var i = 0; i < dataSize; i++) { reader.ReadSingle(); // pos reader.ReadSingle(); // posXYZ reader.ReadSingle(); // posRGB reader.ReadSingle(); // rDist reader.ReadSingle(); // lDist } }
public override void Read(BinaryReaderExt r) { base.Read(r); r.Skip(1); Type = (LVDDamageShapeType)r.ReadInt32(); if (!Enum.IsDefined(typeof(LVDDamageShapeType), Type)) { throw new NotImplementedException($"Unknown damage shape type {Type} at offset {r.BaseStream.Position - 4}"); } X = r.ReadSingle(); Y = r.ReadSingle(); Z = r.ReadSingle(); if (Type == LVDDamageShapeType.Sphere) { Radius = r.ReadSingle(); Dx = r.ReadSingle(); Dy = r.ReadSingle(); Dz = r.ReadSingle(); } if (Type == LVDDamageShapeType.Capsule) { Dx = r.ReadSingle(); Dy = r.ReadSingle(); Dz = r.ReadSingle(); Radius = r.ReadSingle(); } Unknown1 = r.ReadByte(); Unknown2 = r.ReadInt32(); }