public void Silverstone_SecondObject_Has_12_Points()
        {
            var trackData = TrackFactsHelper.GetTrackSilverstone();

            using (var reader = new BinaryReader(MemoryStreamProvider.Open(trackData.Path)))
            {
                reader.BaseStream.Position = 4110;
                var objects = ObjectShapesReader.Read(reader, trackData.KnownOffsets.ObjectData);

                var obj = objects[1];
                obj.Points.Count.Should().Be(12);

                obj.Points[0].X.Should().Be(-960);
                obj.Points[0].Y.Should().Be(12032);
                obj.Points[0].Z.Should().Be(160);

                obj.Points[1].X.Should().Be(-960);
                obj.Points[1].Y.Should().Be(-10496);
                obj.Points[1].Z.Should().Be(160);

                obj.Points[2].X.Should().Be(960);
                obj.Points[2].Y.Should().Be(12032);
                obj.Points[2].Z.Should().Be(1014);

                obj.Points[11].X.Should().Be(960);
                obj.Points[11].Y.Should().Be(-10496);
                obj.Points[11].Z.Should().Be(160);
            }
        }
        public void Silverstone_FirstObject_Has_4_Points()
        {
            var trackData = TrackFactsHelper.GetTrackSilverstone();

            using (var reader = new BinaryReader(MemoryStreamProvider.Open(trackData.Path)))
            {
                reader.BaseStream.Position = 4110;
                var objects = ObjectShapesReader.Read(reader, trackData.KnownOffsets.ObjectData);

                var obj = objects.First();
                obj.Points.Count.Should().Be(4);

                obj.Points[0].X.Should().Be(-1536);
                obj.Points[0].Y.Should().Be(0);
                obj.Points[0].Z.Should().Be(0);

                obj.Points[1].X.Should().Be(1536);
                obj.Points[1].Y.Should().Be(0);
                obj.Points[1].Z.Should().Be(0);

                obj.Points[2].X.Should().Be(-1536);
                obj.Points[2].Y.Should().Be(0);
                obj.Points[2].Z.Should().Be(768);

                obj.Points[3].X.Should().Be(1536);
                obj.Points[3].Y.Should().Be(0);
                obj.Points[3].Z.Should().Be(768);
            }
        }
        public void Silverstone_FirstObject_Has_4_RawPoints()
        {
            var trackData = TrackFactsHelper.GetTrackSilverstone();

            using (var reader = new BinaryReader(MemoryStreamProvider.Open(trackData.Path)))
            {
                reader.BaseStream.Position = 4110;
                var objects = ObjectShapesReader.Read(reader, trackData.KnownOffsets.ObjectData);

                var obj = objects.First();
                obj.RawPoints.Count.Should().Be(4);

                // for X
                // [0] 132 -> Scale 0 negative -> -1536
                // [1]  4 -> Scale 0 positive -> 1536
                // [2] 32768 -> use XY from p[0]
                // [3] 32769 -> use XY from p[1]

                obj.RawPoints[0].XCoord.Should().Be(132);              // F1GP=34
                obj.RawPoints[0].ReferencePointValue.Should().Be(132); // F1GP = 34
                obj.RawPoints[0].ReferencePointFlag.Should().Be(0);
                obj.RawPoints[0].YCoord.Should().Be(0);
                obj.RawPoints[0].ZCoord.Should().Be(0);
                obj.RawPoints[0].Unknown.Should().Be(0);
                obj.RawPoints[1].XCoord.Should().Be(4);      // F1GP = 2
                obj.RawPoints[3].XCoord.Should().Be(-32767); // or 32769 if ushort?
            }
        }
        public void Silverstone_FirstShape_Has_5_Vectors()
        {
            var trackData = TrackFactsHelper.GetTrackSilverstone();

            using (var reader = new BinaryReader(MemoryStreamProvider.Open(trackData.Path)))
            {
                var objects = ObjectShapesReader.Read(reader, trackData.KnownOffsets.ObjectData);

                var obj = objects.First();
                obj.Vectors.Count.Should().Be(5);
            }
        }
        public void Monaco_ObjectShapes()
        {
            var trackData = TrackFactsHelper.GetTrackMonaco();

            using (var reader = new BinaryReader(MemoryStreamProvider.Open(trackData.Path)))
            {
                var objects = ObjectShapesReader.Read(reader, trackData.KnownOffsets.ObjectData);

                objects.Count.Should().Be(59);
                objects.First().AllData.Length.Should().Be(1796);
                objects.Last().AllData.Length.Should().Be(740);
            }
        }
        public void Monaco_FirstShape_Has_28_ScaleValues()
        {
            var trackData = TrackFactsHelper.GetTrackMonaco();

            using (var reader = new BinaryReader(MemoryStreamProvider.Open(trackData.Path)))
            {
                var objects = ObjectShapesReader.Read(reader, trackData.KnownOffsets.ObjectData);

                var obj = objects.First();
                obj.ScaleValues.Count.Should().Be(28);
                obj.ScaleValues[0].Should().Be(2860);
                obj.ScaleValues[27].Should().Be(2199);
            }
        }
        public void Monaco_DataAndHeader_AreSetCorrectly()
        {
            var trackData = TrackFactsHelper.GetTrackMonaco();

            using (var reader = new BinaryReader(MemoryStreamProvider.Open(trackData.Path)))
            {
                var objects = ObjectShapesReader.Read(reader, trackData.KnownOffsets.ObjectData);

                objects.First().HeaderIndex.Should().Be(0);
                objects.First().DataIndex.Should().Be(37);
                objects.Last().HeaderIndex.Should().Be(58);
                objects.Last().DataIndex.Should().Be(58);
            }
        }
        public void Silverstone_SecondShape_Has_3_ScaleValues()
        {
            var trackData = TrackFactsHelper.GetTrackSilverstone();

            using (var reader = new BinaryReader(MemoryStreamProvider.Open(trackData.Path)))
            {
                var objects = ObjectShapesReader.Read(reader, trackData.KnownOffsets.ObjectData);

                var obj = objects[1];
                obj.ScaleValues.Count.Should().Be(3);
                obj.ScaleValues[0].Should().Be(960);
                obj.ScaleValues[1].Should().Be(12032);
                obj.ScaleValues[2].Should().Be(10496);
            }
        }
        public void Silverstone_FirstShape_Has_Expected_Offsets()
        {
            var trackData = TrackFactsHelper.GetTrackSilverstone();

            using (var reader = new BinaryReader(MemoryStreamProvider.Open(trackData.Path)))
            {
                var objects = ObjectShapesReader.Read(reader, trackData.KnownOffsets.ObjectData);

                var obj = objects.First();
                obj.Offset1.Should().Be(15638);
                obj.Offset2.Should().Be(15642);
                obj.Offset3.Should().Be(15646);
                obj.Offset4.Should().Be(15682);
                obj.Offset5.Should().Be(15714);
                obj.Offset6.Should().Be(15674);
                obj.Offset7.Should().Be(15734);
            }
        }
        public void Monaco_LastShape_Has_14_Points()
        {
            var trackData = TrackFactsHelper.GetTrackMonaco();

            using (var reader = new BinaryReader(MemoryStreamProvider.Open(trackData.Path)))
            {
                reader.BaseStream.Position = 4110;
                var objects = ObjectShapesReader.Read(reader, trackData.KnownOffsets.ObjectData);

                var obj = objects.Last();
                obj.Points.Count.Should().Be(14);

                obj.Points[0].X.Should().Be(5120);
                obj.Points[0].Y.Should().Be(10752);
                obj.Points[0].Z.Should().Be(65024);

                obj.Points[13].X.Should().Be(-3584);
                obj.Points[13].Y.Should().Be(10752);
                obj.Points[13].Z.Should().Be(4608);
            }
        }
示例#11
0
        /// <summary>
        /// Reads the track file at the specified path and returns a Track object.
        /// </summary>
        /// <param name="path">Path to GP2 track file.</param>
        /// <returns>Track object.</returns>
        public Track Read(string path)
        {
            var track = new Track();

            using (var reader = new BinaryReader(StreamProvider(path)))
            {
                track.Offsets = OffsetReader.Read(reader);

                track.ObjectShapes    = ObjectShapesReader.Read(reader, track.Offsets.ObjectData);
                track.ObjectSettings  = TrackObjectSettingsReader.Read(reader, track.Offsets.ObjectData, track.Offsets.TrackData);
                track.TrackDataHeader = TrackSectionHeaderReader.Read(reader, track.Offsets.TrackData);

                var options = new TrackSectionCommandOptions();
                options.Command0xC5Length = track.TrackDataHeader.CommandLength0xC5;

                var sectionReading = TrackSectionReader.Read(reader, track.Offsets.TrackData + track.TrackDataHeader.GetHeaderLength(), options);
                track.TrackSections = sectionReading.TrackSections;

                var lines = ComputerCarLineReader.Read(reader, sectionReading.Position);
                track.ComputerCarLineHeader   = lines.Header;
                track.ComputerCarLineSegments = lines.Segments;

                var setup = ComputerCarDataReader.Read(reader, track.Offsets.ComputerCarSetup);
                track.ComputerCarSetup = setup.Setup;

                var pitlaneResult = TrackSectionReader.Read(reader, track.Offsets.PitLaneData, options);
                track.PitLaneSections = pitlaneResult.TrackSections;

                reader.BaseStream.Position = pitlaneResult.Position;

                // read until 0xFF 0xFF, i.e. skip camera definitions
                bool previousWas255 = false;

                while (true)
                {
                    byte byte1 = reader.ReadByte();

                    if (byte1 == 0xFF)
                    {
                        if (previousWas255)
                        {
                            break;
                        }

                        previousWas255 = true;
                    }
                    else
                    {
                        previousWas255 = false;
                    }
                }

                var posBefore = reader.BaseStream.Position;

                var behavior = ComputerCarBehaviorReader.Read(reader, (int)reader.BaseStream.Position);
                track.ComputerCarBehavior = behavior;

                reader.BaseStream.Position = posBefore;

                var settings = TrackSettingsReader.Read(reader, (int)reader.BaseStream.Position);
                track.TrackSettings = settings;

                return(track);
            }
        }