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); } }
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); } } } }
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); } } } }
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); }
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); } }
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; } }
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); } } } } } }
public override void WriteToFile(BinaryWriter writer) { Vector3Extenders.WriteToFile(scaleFactor, writer); }