public void WriteSCB(Stream stream) { using (BinaryWriter bw = new BinaryWriter(stream)) { List <StaticObjectVertex> vertices = GetVertices(); List <StaticObjectFace> faces = new List <StaticObjectFace>(); bool hasVertexColors = false; StaticObjectFlags flags = 0; foreach (StaticObjectSubmesh submesh in this.Submeshes) { faces.AddRange(submesh.GetFaces()); } foreach (StaticObjectVertex vertex in vertices) { if (vertex.Color != null) { hasVertexColors = true; break; } } if (hasVertexColors) { flags |= StaticObjectFlags.VERTEX_COLORS; } bw.Write(Encoding.ASCII.GetBytes("r3d2Mesh")); bw.Write((ushort)3); bw.Write((ushort)2); bw.Write(Encoding.ASCII.GetBytes(this.Name.PadRight(128, '\u0000'))); bw.Write(vertices.Count); bw.Write(faces.Count); bw.Write((uint)flags); GetBoundingBox().Write(bw); bw.Write((uint)(flags & StaticObjectFlags.VERTEX_COLORS)); vertices.ForEach(vertex => vertex.Position.Write(bw)); if (hasVertexColors) { foreach (StaticObjectVertex vertex in vertices) { if (vertex.Color.HasValue) { bw.WriteColor(vertex.Color.Value, ColorFormat.RgbaU8); } else { bw.WriteColor(new Color(0, 0, 0, 255), ColorFormat.RgbaU8); } } } GetCentralPoint().Write(bw); faces.ForEach(face => face.Write(bw)); } }
public static StaticObject ReadSCB(Stream stream) { using (BinaryReader br = new BinaryReader(stream)) { string magic = Encoding.ASCII.GetString(br.ReadBytes(8)); if (magic != "r3d2Mesh") { throw new Exception("This is not a valid SCB file"); } ushort major = br.ReadUInt16(); ushort minor = br.ReadUInt16(); if (major != 3 && major != 2 && minor != 1) //There are versions [2][1] and [1][1] aswell { throw new Exception(string.Format("The Version: {0}.{1} is not supported", major, minor)); } string name = Encoding.ASCII.GetString(br.ReadBytes(128)).Replace("\0", ""); uint vertexCount = br.ReadUInt32(); uint faceCount = br.ReadUInt32(); StaticObjectFlags flags = (StaticObjectFlags)br.ReadUInt32(); R3DBox boundingBox = new R3DBox(br); bool hasVertexColors = false; if (major == 3 && minor == 2) { hasVertexColors = br.ReadUInt32() == 1; } List <Vector3> vertices = new List <Vector3>((int)vertexCount); List <Color> vertexColors = new List <Color>((int)vertexCount); for (int i = 0; i < vertexCount; i++) { vertices.Add(new Vector3(br)); } if (hasVertexColors) { for (int i = 0; i < vertexCount; i++) { vertexColors.Add(br.ReadColor(ColorFormat.RgbaU8)); } } Vector3 centralPoint = new Vector3(br); List <StaticObjectFace> faces = new List <StaticObjectFace>((int)faceCount); for (int i = 0; i < faceCount; i++) { faces.Add(new StaticObjectFace(br)); } return(new StaticObject(name, CreateSubmeshes(vertices, vertexColors, faces), centralPoint)); } }