Esempio n. 1
0
        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));
            }
        }
Esempio n. 2
0
        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));
            }
        }