예제 #1
0
 public void WriteToFile(BinaryWriter writer)
 {
     writer.Write(position.Length);
     for (int i = 0; i < position.Length; i++)
     {
         Vector3Extenders.WriteToFile(position[i], writer);
     }
     writer.Write(sphere.Length);
     for (int i = 0; i < sphere.Length; i++)
     {
         Vector3Extenders.WriteToFile(sphere[i], writer);
     }
 }
예제 #2
0
        public void WriteToFile()
        {
            using (BinaryWriter writer = new BinaryWriter(File.Open(file.FullName + "1", FileMode.Create)))
            {
                writer.Write((ushort)21569); //magic
                writer.Write((ushort)instances.Length);
                writer.Write(1595612873);

                for (int i = 0; i < instances.Length; i++)
                {
                    instances[i].Name.WriteToFile(writer);
                }

                writer.Write((ushort)paths.Length);

                for (int i = 0; i < paths.Length; i++)
                {
                    AnimalTrafficPath path = paths[i];
                    writer.Write(path.numPaths);
                    writer.Write((byte)path.unkSet0.Length);
                    writer.Write((byte)path.unkSet1.Length);
                    writer.Write((byte)path.unkSet2.Length);
                    writer.Write(path.unkSet0);
                    writer.Write(path.unkSet1);
                    writer.Write(path.unkSet2);
                    BoundingBoxExtenders.WriteToFile(path.bbox, writer);
                    path.unkHash.WriteToFile(writer);
                    writer.Write(path.Unk0);
                    writer.Write(path.Unk1);
                    writer.Write(path.Unk2);

                    for (int x = 0; x < path.numPaths; x++)
                    {
                        Vector3Extenders.WriteToFile(path.vectors[x].vectors[0], writer);
                        Vector3Extenders.WriteToFile(path.vectors[x].vectors[1], writer);
                        writer.Write(path.vectors[x].unk0);
                    }
                    if (path.Unk2 == 2)
                    {
                        writer.Write(path.unk3);
                    }
                }
            }
        }
예제 #3
0
        public void WriteToFile()
        {
            using (BinaryWriter writer = new BinaryWriter(File.Open(file.FullName + "1", FileMode.Create)))
            {
                writer.Write(Magic); //magic
                writer.Write((ushort)instances.Length);
                writer.Write(Version);

                for (int i = 0; i < instances.Length; i++)
                {
                    instances[i].Name.WriteToFile(writer);
                }

                writer.Write((ushort)paths.Length);

                for (int i = 0; i < paths.Length; i++)
                {
                    AnimalTrafficPath path = paths[i];
                    writer.Write((byte)path.Vectors.Length);
                    writer.Write((byte)path.Data0.Length);
                    writer.Write((byte)path.Data1.Length);
                    writer.Write((byte)path.Data2.Length);
                    writer.Write(path.Data0);
                    writer.Write(path.Data1);
                    writer.Write(path.Data2);
                    BoundingBoxExtenders.WriteToFile(path.BoundingBox, writer);
                    path.Hash.WriteToFile(writer);
                    writer.Write(path.Unk0);
                    writer.Write(path.Unk1);
                    writer.Write(path.Unk2);
                    writer.Write(path.Unk3);

                    for (int x = 0; x < path.Vectors.Length; x++)
                    {
                        Vector3Extenders.WriteToFile(path.Vectors[x].Position, writer);
                        Vector3Extenders.WriteToFile(path.Vectors[x].Rotation, writer);
                        writer.Write(path.Vectors[x].Unk0);
                    }
                }
            }
        }
예제 #4
0
        public void WriteToFile(BinaryWriter writer)
        {
            writer.Write(unk0);
            writer.Write(fileIDHPD);
            writer.Write(unk3HPD);
            writer.Write(bitFlagsHPD);
            writer.Write(vertSize);
            writer.Write(triSize);

            for (int i = 0; i < vertices.Length; i++)
            {
                var vertex = vertices[i];
                writer.Write(vertex.Unk7);

                Vector3 pos = vertex.Position;
                float   z   = pos.Z;
                pos.Z           = -pos.Y;
                pos.Y           = z;
                vertex.Position = pos;
                Vector3Extenders.WriteToFile(vertex.Position, writer);
                writer.Write(vertex.Unk0);
                writer.Write(vertex.Unk1);
                writer.Write(vertex.Unk2);
                writer.Write(vertex.Unk3);
                writer.Write(vertex.Unk4);
                writer.Write(vertex.Unk5);
                writer.Write(vertex.Unk6);
            }

            for (int i = 0; i < connections.Length; i++)
            {
                var connection = connections[i];
                writer.Write(connection.Flags);
                writer.Write(connection.NodeID);
                writer.Write(connection.ConnectedNodeID);
            }

            runtimeMesh.WriteToFile(writer);
        }
예제 #5
0
        public void WriteRawFormatToFile(BinaryWriter writer, TriangleMesh mesh)
        {
            writer.Write(mesh.NumVertices);
            foreach (var Entry in mesh.Vertices)
            {
                Vector3Extenders.WriteToFile(Entry, writer);
            }

            writer.Write(mesh.NumTriangles * 3); // Write Number of Indices, not triangles.
            foreach (var Entry in mesh.Triangles)
            {
                writer.Write(Entry.v0);
                writer.Write(Entry.v1);
                writer.Write(Entry.v2);
            }

            writer.Write(mesh.MaterialIndices.Count);
            foreach (var Entry in mesh.MaterialIndices)
            {
                writer.Write(Entry);
            }
        }
예제 #6
0
        private void InternalWriteToFile(BinaryWriter writer)
        {
            writer.Write(version);
            writer.Write(unk1);
            writer.Write(unk2);
            BoundingBoxExtenders.WriteToFile(bounds, writer);
            writer.Write(Grids.Length);

            for (int i = 0; i < Grids.Length; i++)
            {
                Grid grid = Grids[i];
                writer.Write(grid.Key);
                Vector3Extenders.WriteToFile(grid.Origin, writer);
                Vector2Extenders.WriteToFile(grid.CellSize, writer);
                writer.Write(grid.Width);
                writer.Write(grid.Height);

                for (int y = 0; y != grid.Data.Length; y++)
                {
                    writer.Write(grid.Data[y]);
                }
            }

            writer.Write(unk3.Length / 2);
            for (int i = 0; i < unk3.Length; i++)
            {
                writer.Write(unk3[i]);
            }

            writer.Write(ObjectGroups.Length);
            for (int i = 0; i != ObjectGroups.Length; i++)
            {
                ObjectGroup objectGroup = ObjectGroups[i];
                writer.Write(objectGroup.Unk01);
                writer.Write(objectGroup.Objects.Length);

                for (int x = 0; x != objectGroup.NumObjects; x++)
                {
                    Object obj = objectGroup.Objects[x];
                    writer.Write(obj.NumInstance2);
                    writer.Write(obj.Unk02);
                    writer.Write(obj.Name.Hash);
                    StringHelpers.WriteString(writer, obj.Name.String);
                    writer.Write(obj.UnkBytes1);
                    writer.Write(obj.GridMax);
                    writer.Write(obj.GridMin);
                    writer.Write(obj.NumInstances);

                    for (int y = 0; y != obj.NumInstances; y++)
                    {
                        Instance instance = obj.Instances[y];
                        writer.Write(instance.W0);
                        writer.Write(instance.W1);
                        writer.Write(instance.W2);
                        writer.Write(instance.D5);
                        writer.Write(instance.ID);
                        writer.Write(instance.D4);
                    }
                    objectGroup.Objects[x] = obj;
                }
                ObjectGroups[i] = objectGroup;
            }
        }
예제 #7
0
        public void WriteToFile(BinaryWriter writer)
        {
            writer.Write(magic);
            writer.Write(splineCount);
            writer.Write(splineCount);
            writer.WriteInt24(splineOffset);
            writer.Write(splinePropertiesCount);
            writer.Write(splinePropertiesCount);
            writer.WriteInt24(splinePropertiesOffset);
            writer.Write(junctionPropertiesCount);
            writer.Write(junctionPropertiesCount);
            writer.WriteInt24(junctionPropertiesOffset);
            writer.Write(unkDataSet3Count);
            writer.Write(unkDataSet3Count);
            writer.WriteInt24(unkDataSet3Offset);
            writer.Write(unkDataSet4Count);
            writer.Write(unkDataSet4Count);
            writer.WriteInt24(unkDataSet4Offset);
            writer.Write(unkGPSSize);
            writer.Write(unkGPSSize);
            writer.WriteInt24(unkDataSet5Offset);
            writer.Write(unkDataSet6Count);
            writer.Write(unkDataSet6Count);
            writer.Write((int)unkDataSet3Count);

            long[] positions = new long[splineCount];
            for (int i = 0; i < splineCount; i++)
            {
                SplineDefinition data = splines[i];
                positions[i] = writer.BaseStream.Position;
                writer.WriteInt24(data.offset);
                writer.Write(data.NumSplines1);
                writer.Write(data.NumSplines2);
                writer.Write(data.roadLength);
            }

            for (int i = 0; i < splineCount; i++)
            {
                long position = writer.BaseStream.Position;
                writer.BaseStream.Seek(positions[i], SeekOrigin.Begin);
                writer.WriteInt24((uint)position + 4);
                writer.BaseStream.Seek(position, SeekOrigin.Begin);
                SplineDefinition splineData = splines[i];
                for (int y = 0; y != splineData.points.Length; y++)
                {
                    Vector3Extenders.WriteToFile(splineData.points[y], writer);
                }
            }

            WriteUpdatedOffset(writer, 8);
            positions = new long[splineData.Length];   //lane offset
            long[] pos2 = new long[splineData.Length]; //range offset

            for (int i = 0; i != splineData.Length; i++)
            {
                SplineProperties data = splineData[i];
                writer.Write(data.LaneIDX0);
                writer.Write(data.LaneIDX1);
                positions[i] = writer.BaseStream.Position;
                writer.WriteInt24(data.Offset0);
                writer.Write(data.LaneSize0);
                writer.Write(data.LaneSize1);
                pos2[i] = writer.BaseStream.Position;
                writer.WriteInt24(data.Offset1);
                writer.Write(data.RangeSize0);
                writer.Write(data.RangeSize1);
                writer.Write((short)data.Flags);
                writer.Write(data.SplineIDX);
            }

            long[] pos3;

            for (int i = 0; i < splineData.Length; i++)
            {
                SplineProperties data = splineData[i];
                //update lane position
                long curPosition = writer.BaseStream.Position;
                writer.BaseStream.Seek(positions[i], SeekOrigin.Begin);
                writer.WriteInt24((uint)curPosition + 4);
                writer.BaseStream.Seek(curPosition, SeekOrigin.Begin);
                //finished
                //also do rangeoffset
                pos3 = new long[data.LaneSize0];

                for (int y = 0; y < data.LaneSize1; y++)
                {
                    LaneProperties sect = splineData[i].Lanes[y];
                    writer.Write(sect.Width);
                    writer.Write((ushort)sect.Flags);
                    writer.Write(sect.Unk03);
                    //writer.Write((ushort)0);
                    pos3[y] = writer.BaseStream.Position;
                    writer.WriteInt24(sect.RangeOffset);
                    writer.Write(sect.RangeSize0);
                    writer.Write(sect.RangeSize1);
                }

                for (int y = 0; y < data.LaneSize0; y++)
                {
                    ////update range for this lane
                    curPosition = writer.BaseStream.Position;
                    uint rangeOffset = (uint)(data.Lanes[y].RangeSize0 > 0 ? curPosition + 4 : 0);
                    writer.BaseStream.Seek(pos3[y], SeekOrigin.Begin);
                    writer.WriteInt24(rangeOffset);
                    writer.BaseStream.Seek(curPosition, SeekOrigin.Begin);
                    //finished

                    for (int x = 0; x < data.Lanes[y].RangeSize0; x++)
                    {
                        RangeProperties sect = data.Lanes[y].Ranges[x];
                        writer.Write(sect.Unk01);
                        writer.Write(sect.Unk02);
                        writer.Write(sect.Unk03);
                        writer.Write(sect.Unk04);
                        writer.Write(sect.Unk05);
                    }
                }

                //update range position
                curPosition = writer.BaseStream.Position;
                uint laneOffset = (uint)(data.RangeSize0 > 0 ? curPosition + 4 : 0);
                writer.BaseStream.Seek(pos2[i], SeekOrigin.Begin);
                writer.WriteInt24(laneOffset);
                writer.BaseStream.Seek(curPosition, SeekOrigin.Begin);
                //finished

                for (int y = 0; y < data.RangeSize0; y++)
                {
                    RangeProperties sect = data.Ranges[y];
                    writer.Write(sect.Unk01);
                    writer.Write(sect.Unk02);
                    writer.Write(sect.Unk03);
                    writer.Write(sect.Unk04);
                    writer.Write(sect.Unk05);
                }
            }

            WriteUpdatedOffset(writer, 16);

            positions = new long[junctionPropertiesCount];
            pos2      = new long[junctionPropertiesCount];
            pos3      = new long[junctionPropertiesCount];
            for (int i = 0; i < junctionPropertiesCount; i++)
            {
                JunctionDefinition data = junctionData[i];
                Vector3Extenders.WriteToFile(data.Position, writer);
                positions[i] = writer.BaseStream.Position;
                writer.WriteInt24(data.offset0);
                writer.Write(data.junctionSize0);
                writer.Write(data.junctionSize1);
                pos2[i] = writer.BaseStream.Position;
                writer.WriteInt24(data.offset1);
                writer.Write(data.boundarySize0);
                writer.Write(data.boundarySize1);
                writer.Write(data.JunctionIDX);
                pos3[i] = writer.BaseStream.Position;
                writer.WriteInt24(data.offset2);
                writer.Write(data.Unk5);
                writer.Write(data.Unk6);
            }

            for (int i = 0; i < junctionPropertiesCount; i++)
            {
                //update junction position
                long curPosition    = writer.BaseStream.Position;
                uint junctionOffset = (uint)(junctionData[i].junctionSize0 > 0 ? curPosition + 4 : 0);
                writer.BaseStream.Seek(positions[i], SeekOrigin.Begin);
                writer.WriteInt24(junctionOffset);
                writer.BaseStream.Seek(curPosition, SeekOrigin.Begin);
                //finished

                long[] junctionPos = new long[junctionData[i].junctionSize0];
                for (int y = 0; y < junctionData[i].junctionSize0; y++)
                {
                    JunctionSpline data4Sect = junctionData[i].Splines[y];
                    writer.Write(data4Sect.Unk0);
                    writer.Write(data4Sect.Unk1);
                    writer.Write(data4Sect.Unk2);
                    writer.Write(data4Sect.Unk3);
                    writer.Write(data4Sect.Unk4);
                    writer.Write(data4Sect.Unk5);
                    junctionPos[y] = writer.BaseStream.Position;
                    writer.WriteInt24(data4Sect.offset0);
                    writer.Write(data4Sect.pathSize0);
                    writer.Write(data4Sect.pathSize1);
                    writer.Write(data4Sect.length);
                }
                for (int y = 0; y < junctionData[i].junctionSize0; y++)
                {
                    //update path vectors
                    curPosition = writer.BaseStream.Position;
                    uint pathOffset = (uint)(junctionData[i].Splines[y].pathSize0 > 0 ? curPosition + 4 : 0);
                    writer.BaseStream.Seek(junctionPos[y], SeekOrigin.Begin);
                    writer.WriteInt24(pathOffset);
                    writer.BaseStream.Seek(curPosition, SeekOrigin.Begin);
                    //finished

                    for (int z = 0; z != junctionData[i].Splines[y].pathSize1; z++)
                    {
                        Vector3Extenders.WriteToFile(junctionData[i].Splines[y].Path[z], writer);
                    }
                }

                //update boundary position
                curPosition = writer.BaseStream.Position;
                uint boundaryOffset = (uint)(junctionData[i].boundarySize0 > 0 ? curPosition + 4 : 0);
                writer.BaseStream.Seek(pos2[i], SeekOrigin.Begin);
                writer.WriteInt24(boundaryOffset);
                writer.BaseStream.Seek(curPosition, SeekOrigin.Begin);
                //finished

                for (int y = 0; y < junctionData[i].boundarySize0; y++)
                {
                    Vector3Extenders.WriteToFile(junctionData[i].Boundaries[y], writer);
                }

                //update unk position
                curPosition = writer.BaseStream.Position;
                uint unkOffset = (uint)(junctionData[i].Unk5 > 0 ? curPosition + 4 : 0);
                writer.BaseStream.Seek(pos3[i], SeekOrigin.Begin);
                writer.WriteInt24(unkOffset);
                writer.BaseStream.Seek(curPosition, SeekOrigin.Begin);
                //finished

                if (junctionData[i].Unk5 >= 2)
                {
                    long offsetPos  = 0;
                    long offset2Pos = 0;

                    unkStruct2Sect2 data = junctionData[i].DataSet2;

                    writer.Write(data.Unk0);
                    offsetPos = writer.BaseStream.Position;
                    writer.WriteInt24(data.offset0);
                    writer.Write(data.Unk1);
                    writer.Write(data.Unk2);
                    writer.Write(data.Unk3);
                    offset2Pos = writer.BaseStream.Position;
                    writer.WriteInt24(data.offset1);
                    writer.Write(data.Unk4);
                    writer.Write(data.Unk5);
                    writer.Write(data.Unk6);
                    writer.Write(data.Unk7);
                    writer.Write(data.Unk8);
                    writer.Write(data.Unk9);

                    if (junctionData[i].DataSet2.offset1 - junctionData[i].DataSet2.offset0 == 4)
                    {
                        Console.WriteLine("STOP");
                    }
                    else if (junctionData[i].DataSet2.offset1 - junctionData[i].DataSet2.offset0 == 8)
                    {
                        Console.WriteLine("STOP");
                    }
                    else
                    {
                        Console.WriteLine("STOP!");
                    }

                    //update offset0 position
                    curPosition = writer.BaseStream.Position;
                    writer.BaseStream.Seek(offsetPos, SeekOrigin.Begin);
                    writer.WriteInt24((uint)(curPosition - 4));
                    writer.BaseStream.Seek(curPosition, SeekOrigin.Begin);
                    //finished
                    //update offset1 position
                    curPosition = writer.BaseStream.Position;
                    writer.BaseStream.Seek(offset2Pos, SeekOrigin.Begin);
                    writer.WriteInt24((uint)(data.Unk1 > 2 ? (curPosition - 4) + (2 * (junctionData[i].DataSet2.Unk1)): curPosition));
                    writer.BaseStream.Seek(curPosition, SeekOrigin.Begin);
                    //finished
                    if (data.Unk1 > 2 && data.Unk2 > 2)
                    {
                        if (junctionData[i].DataSet2.Unk1 == 4)
                        {
                            writer.Write(junctionData[i].DataSet2.Unk10[0]);
                            writer.Write(junctionData[i].DataSet2.Unk10[1]);
                        }
                        else
                        {
                            writer.Write(junctionData[i].DataSet2.Unk10[0]);
                            writer.Write(junctionData[i].DataSet2.Unk10[1]);
                            writer.Write(junctionData[i].DataSet2.Unk10[2]);
                            writer.Write(junctionData[i].DataSet2.Unk10[3]);
                        }
                    }

                    if (junctionData[i].Unk5 == 3)
                    {
                        writer.Write(data.Unk3Bytes);
                    }
                }
            }

            WriteUpdatedOffset(writer, 24);

            //related to junctions.
            for (int i = 0; i < unkDataSet3Count; i++)
            {
                writer.Write(unkSet3[i]); //stops junctions working.
            }
            WriteUpdatedOffset(writer, 32);

            for (int i = 0; i < unkDataSet4Count; i++)
            {
                writer.Write(unkSet4[i].Unk0); //stops cars spawning
                writer.Write(unkSet4[i].Unk1); //makes certain areas of the roadmap crash
            }

            WriteUpdatedOffset(writer, 40);

            for (int i = 0; i < unkGPSSize; i++)
            {
                writer.Write(unkGPS[i]); //traffic works, but no GPS data is available.
            }
            WriteUpdatedOffset(writer, 48);

            for (int i = 0; i < unkDataSet6Count; i++)
            {
                writer.Write(unkSet6[i]); //causes crashes, junctions fail to work.
            }
        }
        public void WriteToFile(BinaryWriter writer)
        {
            StringHelpers.WriteString(writer, "KynogonRuntimeMesh", false);
            writer.Write((ushort)0); //magic is name with two extra 00
            writer.Write(2);         //version

            writer.Write(Unk0);
            writer.Write(Unk1);
            writer.Write(Unk2);
            writer.Write(Unk3);
            Vector2Extenders.WriteToFile(BoundMin, writer);
            Vector2Extenders.WriteToFile(BoundMax, writer);
            writer.Write(CellSizeX);
            writer.Write(CellSizeY);
            writer.Write(Radius);
            writer.Write(Unk4);
            writer.Write(Height);
            writer.Write(Offset);

            for (int i = 0; i < Grid.Length; i++)
            {
                writer.Write(Grid[i]);
            }

            for (int i = 0; i < Grid.Length; i++)
            {
                Cell cell = Cells[i];
                writer.Write(cell.Sets.Length);

                if (cell.Sets.Length == 0)
                {
                    continue;
                }

                writer.Write(cell.Offset);

                for (int x = 0; x < cell.Sets.Length; x++)
                {
                    var set = cell.Sets[x];
                    writer.Write(set.X);
                    writer.Write(set.Y);
                    writer.Write(set.Offset);
                }

                for (int x = 0; x < cell.Sets.Length; x++)
                {
                    var set = cell.Sets[x];
                    writer.Write(set.cellUnk0);
                    writer.Write(set.cellUnk1);
                    writer.Write(set.cellUnk2);
                    writer.Write(set.cellUnk3);
                    writer.Write(set.cellUnk4);
                    writer.Write(set.cellUnk5);
                    writer.Write(set.cellUnk6);
                    writer.Write(set.cellUnk7);
                    writer.Write(set.cellUnk8);
                    writer.Write(set.cellUnk9);
                    writer.Write(set.cellUnk10);
                    writer.Write(set.cellUnk11);
                    writer.Write(set.cellUnk12);
                    writer.Write(set.cellUnk13);
                    writer.Write(set.cellUnk14);
                    writer.Write(set.cellUnk15);
                    writer.Write(set.NumEdges);
                    writer.Write(set.cellUnk17);
                    writer.Write(set.cellUnk18);
                    writer.Write(set.cellUnk19);

                    foreach (var dataSet in set.unk10Boxes)
                    {
                        BoundingBoxExtenders.WriteToFile(dataSet.B1, writer);
                        writer.Write(dataSet.UnkOffset);
                        writer.Write(dataSet.Unk20);
                    }

                    foreach (var dataSet in set.unk12Boxes)
                    {
                        BoundingBoxExtenders.WriteToFile(dataSet.B1, writer);
                        writer.Write(dataSet.Unk01);
                        writer.Write(dataSet.Unk02);
                        writer.Write(dataSet.Unk03);
                        writer.Write(dataSet.Unk04);
                        writer.Write(dataSet.Unk05);
                    }

                    if (set.cellUnk14 > 0)
                    {
                        foreach (var offset in set.unk14Offsets)
                        {
                            writer.Write(offset);
                        }

                        writer.Write(set.unk14End);
                        foreach (var dataSet in set.unk14Boxes)
                        {
                            foreach (var point in dataSet.Points)
                            {
                                Vector3Extenders.WriteToFile(point, writer);
                            }
                        }
                    }

                    foreach (var offset in set.unk16Offsets)
                    {
                        writer.Write(offset);
                    }

                    if (set.NumEdges > 0)
                    {
                        writer.Write(set.EdgesDataEndOffset);

                        foreach (var dataSet in set.EdgeBoxes)
                        {
                            dataSet.WriteToFile(writer);
                        }
                    }

                    if (set.cellUnk18 > 0)
                    {
                        writer.Write(set.unk18End);

                        foreach (var dataSet in set.unk18Set)
                        {
                            writer.Write(dataSet.Unk0);
                            writer.Write(dataSet.Unk1);
                            writer.Write(dataSet.Unk2);
                            writer.Write(dataSet.Offset);
                        }

                        writer.Write(new byte[12]);

                        foreach (var dataSet in set.unk18Set)
                        {
                            foreach (var point in dataSet.Points)
                            {
                                Vector3Extenders.WriteToFile(point, writer);
                            }
                        }
                    }
                }
            }
        }
예제 #9
0
 public override void WriteToFile(BinaryWriter writer)
 {
     Vector3Extenders.WriteToFile(scaleFactor, writer);
 }