상속: MiscUtil.IO.EndianBinaryReader
예제 #1
0
 public BrgAsetHeader(BrgBinaryReader reader)
 {
     this.numFrames = reader.ReadInt32();
     this.frameStep = reader.ReadSingle();
     this.animTime  = reader.ReadSingle();
     this.frequency = reader.ReadSingle();
     this.spf       = reader.ReadSingle();
     this.fps       = reader.ReadSingle();
     this.space     = reader.ReadInt32();
 }
예제 #2
0
 public BrgHeader(BrgBinaryReader reader)
 {
     this.Magic        = reader.ReadString(4);
     this.Unknown01    = reader.ReadInt32();
     this.NumMaterials = reader.ReadInt32();
     this.Unknown02    = reader.ReadInt32();
     this.NumMeshes    = reader.ReadInt32();
     this.Reserved     = reader.ReadInt32();
     this.Unknown03    = reader.ReadInt32();
 }
예제 #3
0
 public BrgHeader(BrgBinaryReader reader)
 {
     this.Magic = reader.ReadString(4);
     this.Unknown01 = reader.ReadInt32();
     this.NumMaterials = reader.ReadInt32();
     this.Unknown02 = reader.ReadInt32();
     this.NumMeshes = reader.ReadInt32();
     this.Reserved = reader.ReadInt32();
     this.Unknown03 = reader.ReadInt32();
 }
예제 #4
0
 public BrgMeshHeader(BrgBinaryReader reader)
 {
     this.Version            = reader.ReadInt16();
     this.Format             = (BrgMeshFormat)reader.ReadInt16();
     this.NumVertices        = reader.ReadInt16();
     this.NumFaces           = reader.ReadInt16();
     this.InterpolationType  = (BrgMeshInterpolationType)reader.ReadByte();
     this.AnimationType      = (BrgMeshAnimType)reader.ReadByte();
     this.UserDataEntryCount = reader.ReadInt16();
     this.CenterPosition     = reader.ReadVector3D(true, false);
     this.CenterRadius       = reader.ReadSingle();
     this.MassPosition       = reader.ReadVector3D(true, false);
     this.HotspotPosition    = reader.ReadVector3D(true, false);
     this.ExtendedHeaderSize = reader.ReadInt16();
     this.Flags         = (BrgMeshFlag)reader.ReadInt16();
     this.MinimumExtent = reader.ReadVector3D(true, false);
     this.MaximumExtent = reader.ReadVector3D(true, false);
 }
예제 #5
0
 public BrgMeshHeader(BrgBinaryReader reader)
 {
     this.Version = reader.ReadInt16();
     this.Format = (BrgMeshFormat)reader.ReadInt16();
     this.NumVertices = reader.ReadInt16();
     this.NumFaces = reader.ReadInt16();
     this.InterpolationType = (BrgMeshInterpolationType)reader.ReadByte();
     this.AnimationType = (BrgMeshAnimType)reader.ReadByte();
     this.UserDataEntryCount = reader.ReadInt16();
     this.CenterPosition = reader.ReadVector3D(true, false);
     this.CenterRadius = reader.ReadSingle();
     this.MassPosition = reader.ReadVector3D(true, false);
     this.HotspotPosition = reader.ReadVector3D(true, false);
     this.ExtendedHeaderSize = reader.ReadInt16();
     this.Flags = (BrgMeshFlag)reader.ReadInt16();
     this.MinimumExtent = reader.ReadVector3D(true, false);
     this.MaximumExtent = reader.ReadVector3D(true, false);
 }
 public BrgMeshExtendedHeader(BrgBinaryReader reader, int extendedHeaderSize)
 {
     this.NumNameIndexes = reader.ReadInt16();
     this.NumDummies     = reader.ReadInt16();
     this.NameLength     = reader.ReadInt16();
     if (extendedHeaderSize > 6)
     {
         this.PointMaterial = reader.ReadInt16();
         this.PointRadius   = reader.ReadSingle();
     }
     if (extendedHeaderSize > 12)
     {
         this.NumMaterials      = reader.ReadByte();
         this.ShadowNameLength0 = reader.ReadByte();
         this.ShadowNameLength1 = reader.ReadByte();
         this.ShadowNameLength2 = reader.ReadByte();
     }
     if (extendedHeaderSize > 16)
     {
         this.AnimationLength = reader.ReadSingle();
     }
     if (extendedHeaderSize > 20)
     {
         this.MaterialLibraryTimestamp = reader.ReadInt32();
     }
     if (extendedHeaderSize > 24)
     {
         this.Reserved = reader.ReadSingle();
     }
     if (extendedHeaderSize > 28)
     {
         this.ExportedScaleFactor = reader.ReadSingle();
     }
     if (extendedHeaderSize > 32)
     {
         this.NumNonUniformKeys = reader.ReadInt32(); //09c
     }
     if (extendedHeaderSize > 36)
     {
         this.NumUniqueMaterials = reader.ReadInt32();
     }
 }
 public BrgMeshExtendedHeader(BrgBinaryReader reader, int extendedHeaderSize)
 {
     this.NumNameIndexes = reader.ReadInt16();
     this.NumDummies = reader.ReadInt16();
     this.NameLength = reader.ReadInt16();
     if (extendedHeaderSize > 6)
     {
         this.PointMaterial = reader.ReadInt16();
         this.PointRadius = reader.ReadSingle();
     }
     if (extendedHeaderSize > 12)
     {
         this.NumMaterials = reader.ReadByte();
         this.ShadowNameLength0 = reader.ReadByte();
         this.ShadowNameLength1 = reader.ReadByte();
         this.ShadowNameLength2 = reader.ReadByte();
     }
     if (extendedHeaderSize > 16)
     {
         this.AnimationLength = reader.ReadSingle();
     }
     if (extendedHeaderSize > 20)
     {
         this.MaterialLibraryTimestamp = reader.ReadInt32();
     }
     if (extendedHeaderSize > 24)
     {
         this.Reserved = reader.ReadSingle();
     }
     if (extendedHeaderSize > 28)
     {
         this.ExportedScaleFactor = reader.ReadSingle();
     }
     if (extendedHeaderSize > 32)
     {
         this.NumNonUniformKeys = reader.ReadInt32(); //09c
     }
     if (extendedHeaderSize > 36)
     {
         this.NumUniqueMaterials = reader.ReadInt32();
     }
 }
예제 #8
0
        public BrgMaterial(BrgBinaryReader reader, BrgFile file)
            : this(file)
        {
            Id         = reader.ReadInt32();
            Flags      = (BrgMatFlag)reader.ReadInt32();
            unknown01b = reader.ReadInt32();
            int nameLength = reader.ReadInt32();
            this.DiffuseColor  = reader.ReadColor3D();
            this.AmbientColor  = reader.ReadColor3D();
            this.SpecularColor = reader.ReadColor3D();
            this.EmissiveColor = reader.ReadColor3D();

            this.DiffuseMap = reader.ReadString(nameLength);
            if (Flags.HasFlag(BrgMatFlag.SpecularExponent))
            {
                this.SpecularExponent = reader.ReadSingle();
            }
            if (Flags.HasFlag(BrgMatFlag.BumpMap))
            {
                this.BumpMap = reader.ReadString(reader.ReadInt32());
            }
            if (Flags.HasFlag(BrgMatFlag.Alpha))
            {
                this.Opacity = reader.ReadSingle();
            }

            if (Flags.HasFlag(BrgMatFlag.REFLECTIONTEXTURE))
            {
                byte numSFX = reader.ReadByte();
                sfx = new List <BrgMatSFX>(numSFX);
                for (int i = 0; i < numSFX; i++)
                {
                    sfx.Add(reader.ReadMaterialSFX());
                }
            }
            else
            {
                sfx = new List <BrgMatSFX>();
            }
        }
예제 #9
0
        public DdtFile(System.IO.Stream fileStream)
        {
            using (BrgBinaryReader reader = new BrgBinaryReader(new LittleEndianBitConverter(), fileStream))
            {
                reader.ReadInt32();
                type = (DdtType)reader.ReadByte();
                alphaBits = reader.ReadByte();
                texelFormat = (DdtTexelFormat)reader.ReadByte();
                mipMap = reader.ReadByte();
                Height = reader.ReadInt32();
                Width = reader.ReadInt32();

                int length = 0;
                for (int i = 0; i < mipMap; i++)
                {
                    reader.ReadInt32();
                    length += reader.ReadInt32();
                }

                imageData = reader.ReadBytes(length);
            }
        }
예제 #10
0
        public BrgMesh(BrgBinaryReader reader, BrgFile file)
            : base()
        {
            this.ParentFile = file;
            this.Header = new BrgMeshHeader(reader);

            this.VertexMaterials = new List<Int16>();
            if (!this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS))
            {
                this.Vertices = new List<Vector3D>(this.Header.NumVertices);
                for (int i = 0; i < this.Header.NumVertices; i++)
                {
                    this.Vertices.Add(reader.ReadVector3D(true, this.Header.Version == 22));
                }
                this.Normals = new List<Vector3D>(this.Header.NumVertices);
                for (int i = 0; i < this.Header.NumVertices; i++)
                {
                    if (this.Header.Version >= 13 && this.Header.Version <= 17)
                    {
                        reader.ReadInt16(); // No idea what this is
                    }
                    else // v == 18, 19 or 22
                    {
                        this.Normals.Add(reader.ReadVector3D(true, this.Header.Version == 22));
                    }
                }

                if ((!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) ||
                    this.Header.Flags.HasFlag(BrgMeshFlag.ANIMTEXCOORDS) ||
                    this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLESYSTEM)) &&
                    this.Header.Flags.HasFlag(BrgMeshFlag.TEXCOORDSA))
                {
                    this.TextureCoordinates = new List<Vector3D>(this.Header.NumVertices);
                    for (int i = 0; i < this.Header.NumVertices; i++)
                    {
                        this.TextureCoordinates.Add(new Vector3D(reader.ReadVector2D(this.Header.Version == 22), 0f));
                    }
                }

                if (!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) ||
                    this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLESYSTEM))
                {
                    this.Faces = new List<Face>(this.Header.NumFaces);
                    for (int i = 0; i < this.Header.NumFaces; ++i)
                    {
                        this.Faces.Add(new Face());
                    }

                    if (this.Header.Flags.HasFlag(BrgMeshFlag.MATERIAL))
                    {
                        for (int i = 0; i < this.Header.NumFaces; i++)
                        {
                            this.Faces[i].MaterialIndex = reader.ReadInt16();
                        }
                    }

                    for (int i = 0; i < this.Header.NumFaces; i++)
                    {
                        this.Faces[i].Indices.Add(reader.ReadInt16());
                        this.Faces[i].Indices.Add(reader.ReadInt16());
                        this.Faces[i].Indices.Add(reader.ReadInt16());
                    }

                    if (this.Header.Flags.HasFlag(BrgMeshFlag.MATERIAL))
                    {
                        this.VertexMaterials = new List<Int16>(this.Header.NumVertices);
                        for (int i = 0; i < this.Header.NumVertices; i++)
                        {
                            this.VertexMaterials.Add(reader.ReadInt16());
                        }
                    }
                }
            }

            this.UserDataEntries = new BrgUserDataEntry[this.Header.UserDataEntryCount];
            if (!this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS))
            {
                for (int i = 0; i < this.Header.UserDataEntryCount; i++)
                {
                    this.UserDataEntries[i] = reader.ReadUserDataEntry(false);
                }
            }

            this.ExtendedHeader = new BrgMeshExtendedHeader(reader, this.Header.ExtendedHeaderSize);

            this.particleData = new float[0];
            if (this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS))
            {
                this.particleData = new float[4 * this.Header.NumVertices];
                for (int i = 0; i < this.particleData.Length; i++)
                {
                    this.particleData[i] = reader.ReadSingle();
                }
                for (int i = 0; i < this.Header.UserDataEntryCount; i++)
                {
                    this.UserDataEntries[i] = reader.ReadUserDataEntry(true);
                }
            }

            if (this.Header.Version == 13)
            {
                reader.ReadBytes(this.ExtendedHeader.NameLength);
            }

            if (this.Header.Version >= 13 && this.Header.Version <= 18)
            {
                this.Header.Flags |= BrgMeshFlag.ATTACHPOINTS;
            }
            if (this.Header.Flags.HasFlag(BrgMeshFlag.ATTACHPOINTS))
            {
                Int16 numMatrix = this.ExtendedHeader.NumDummies;
                Int16 numIndex = this.ExtendedHeader.NumNameIndexes;
                if (this.Header.Version == 19 || this.Header.Version == 22)
                {
                    numMatrix = reader.ReadInt16();
                    numIndex = reader.ReadInt16();
                    reader.ReadInt16();
                }

                BrgAttachpoint[] attpts = new BrgAttachpoint[numMatrix];
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i] = new BrgAttachpoint();
                }
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i].XVector = reader.ReadVector3D(true, this.Header.Version == 22);
                }
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i].YVector = reader.ReadVector3D(true, this.Header.Version == 22);
                }
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i].ZVector = reader.ReadVector3D(true, this.Header.Version == 22);
                }
                if (this.Header.Version == 19 || this.Header.Version == 22)
                {
                    for (int i = 0; i < numMatrix; i++)
                    {
                        attpts[i].Position = reader.ReadVector3D(true, this.Header.Version == 22);
                    }
                }
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i].BoundingBoxMin = reader.ReadVector3D(true, this.Header.Version == 22);
                }
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i].BoundingBoxMax = reader.ReadVector3D(true, this.Header.Version == 22);
                }

                List<int> nameId = new List<int>();
                for (int i = 0; i < numIndex; i++)
                {
                    int duplicate = reader.ReadInt32(); // have yet to find a model with duplicates
                    reader.ReadInt32(); // Skip the id (at least I think its an ID)
                    for (int j = 0; j < duplicate; j++)
                    {
                        nameId.Add(i);
                    }
                }

                this.Attachpoints = new List<BrgAttachpoint>();
                for (int i = 0; i < nameId.Count; i++)
                {
                    this.Attachpoints.Add(new BrgAttachpoint(attpts[reader.ReadByte()]));
                    this.Attachpoints[i].NameId = nameId[i];
                    //attpts[reader.ReadByte()].NameId = nameId[i];
                }
                //attachpoints = new List<BrgAttachpoint>(attpts);
            }
            else
            {
                this.Attachpoints = new List<BrgAttachpoint>();
            }

            if (((this.Header.Flags.HasFlag(BrgMeshFlag.COLORALPHACHANNEL) ||
                this.Header.Flags.HasFlag(BrgMeshFlag.COLORCHANNEL)) &&
                !this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH)) ||
                this.Header.Flags.HasFlag(BrgMeshFlag.ANIMVERTCOLORALPHA))
            {
                this.Colors = new List<Color4D>(this.Header.NumVertices);
                for (int i = 0; i < this.Header.NumVertices; i++)
                {
                    this.Colors.Add(reader.ReadTexel());
                }
            }

            // Only seen on first mesh
            this.NonUniformKeys = new float[0];
            if (this.Header.AnimationType.HasFlag(BrgMeshAnimType.NonUniform))
            {
                this.NonUniformKeys = new float[this.ExtendedHeader.NumNonUniformKeys];
                for (int i = 0; i < this.ExtendedHeader.NumNonUniformKeys; i++)
                {
                    this.NonUniformKeys[i] = reader.ReadSingle();
                }
            }

            if (this.Header.Version >= 14 && this.Header.Version <= 19)
            {
                // Face Normals??
                Vector3D[] legacy = new Vector3D[this.Header.NumFaces];
                for (int i = 0; i < this.Header.NumFaces; i++)
                {
                    legacy[i] = reader.ReadVector3D();
                }
            }

            if (!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) && this.Header.Version != 22)
            {
                reader.ReadBytes(ExtendedHeader.ShadowNameLength0 + ExtendedHeader.ShadowNameLength1);
            }
        }
예제 #11
0
        public void Read(Stream stream)
        {
            using (BrgBinaryReader reader = new BrgBinaryReader(new LittleEndianBitConverter(), stream))
            {
                uint magic = reader.ReadUInt32();
                if (magic != 1280463949)
                {
                    throw new Exception("This is not a MTRL file!");
                }

                uint nameLength = reader.ReadUInt32();
                for (int i = 0; i < 5; ++i)
                {
                    this.unk[i] = reader.ReadUInt32();
                }

                this.Diffuse       = reader.ReadColor3D();
                this.Ambient       = reader.ReadColor3D();
                this.Specular      = reader.ReadColor3D();
                this.Emissive      = reader.ReadColor3D();
                this.SpecularLevel = reader.ReadSingle();
                this.Alpha         = reader.ReadSingle();

                this.Id = reader.ReadInt32();

                this.SelfIlluminating = reader.ReadByte();
                this.ClampU           = reader.ReadByte();
                this.ClampV           = reader.ReadByte();
                this.LightSpecular    = reader.ReadByte();
                this.AffectsAmbient   = reader.ReadByte();
                this.AffectsDiffuse   = reader.ReadByte();
                this.AffectsSpecular  = reader.ReadByte();
                this.Updateable       = reader.ReadByte();

                this.AlphaMode         = reader.ReadInt32(); // Seems to be very often 10, wave has a 2 here, phoenix has 6
                this.AmbientIntensity  = reader.ReadInt32();
                this.DiffuseIntensity  = reader.ReadInt32();
                this.SpecularIntensity = reader.ReadInt32();
                this.EmissiveIntensity = reader.ReadInt32();
                this.ColorTransform    = reader.ReadInt32(); // Val of 4 seems to be PC
                this.TextureTransform  = reader.ReadInt32();
                this.TextureFactor     = reader.ReadInt32(); // Has something to do with Cube Map
                this.MultiTextureMode  = reader.ReadInt32(); // Has something to do with Cube Map
                this.TexGenMode0       = reader.ReadInt32();
                this.TexGenMode1       = reader.ReadInt32(); // Has something to do with Cube Map
                this.TexCoordSet0      = reader.ReadInt32();
                this.TexCoordSet1      = reader.ReadInt32();
                this.TexCoordSet2      = reader.ReadInt32();
                this.TexCoordSet3      = reader.ReadInt32();
                this.TexCoordSet4      = reader.ReadInt32();
                this.TexCoordSet5      = reader.ReadInt32();
                this.TexCoordSet6      = reader.ReadInt32();
                this.TexCoordSet7      = reader.ReadInt32();

                for (int i = 0; i < 3; ++i)
                {
                    this.unk2[i] = reader.ReadTexel();
                }
                for (int i = 0; i < 3; ++i)
                {
                    this.unk3[i] = reader.ReadTexel();
                }
                for (int i = 0; i < 4; ++i)
                {
                    this.unk4[i] = reader.ReadInt32();
                }

                if (nameLength > 0)
                {
                    this.Texture = reader.ReadString();
                }
            }
        }
예제 #12
0
        private static void Convert(string f)
        {
            string magic;
            using (FileStream fs = File.Open(f, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                BrgBinaryReader reader = new BrgBinaryReader(EndianBitConverter.Little, fs);
                magic = reader.ReadString(4);
            }

            if (f.EndsWith("anim.txt"))
            {
                AnimFile.ConvertToXml(File.Open(f, FileMode.Open, FileAccess.Read, FileShare.Read), File.Open(f + ".xml", FileMode.Create, FileAccess.Write, FileShare.Read));
                Console.WriteLine("Success! Anim converted.");
            }
            else if (f.EndsWith(".prt"))
            {
                PrtFile file = new PrtFile(File.Open(f, FileMode.Open, FileAccess.Read, FileShare.Read));
                file.SerializeAsXml(File.Open(f + ".xml", FileMode.Create, FileAccess.Write, FileShare.Read));
                Console.WriteLine("Success! Prt converted.");
            }
            else if (magic == "MTRL")
            {
                MtrlFile file = new MtrlFile();
                file.Read(File.Open(f, FileMode.Open, FileAccess.Read, FileShare.Read));
                file.SerializeAsXml(File.Open(f + ".xml", FileMode.Create, FileAccess.Write, FileShare.Read));
                Console.WriteLine("Success! Mtrl converted.");
            }
            else if (magic == "BANG")
            {
                string brgMtrlOutputPath = Path.Combine(Path.GetDirectoryName(f), "materials");
                if (!Directory.Exists(brgMtrlOutputPath))
                {
                    Directory.CreateDirectory(brgMtrlOutputPath);
                }

                BrgFile file = new BrgFile(File.Open(f, FileMode.Open, FileAccess.Read, FileShare.Read));
                for (int i = 0; i < file.Materials.Count; ++i)
                {
                    MtrlFile mtrl = new MtrlFile(file.Materials[i]);
                    mtrl.Write(File.Open(Path.Combine(brgMtrlOutputPath, Path.GetFileNameWithoutExtension(f) + "_" + i + ".mtrl"), FileMode.Create, FileAccess.Write, FileShare.Read));
                }
                Console.WriteLine("Success! Mtrl files created.");
            }
            else
            {
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(f);

                if (xmlDoc.DocumentElement.Name == "AnimFile")
                {
                    AnimFile.ConvertToAnim(File.Open(f, FileMode.Open, FileAccess.Read, FileShare.Read), File.Open(f + ".txt", FileMode.Create, FileAccess.Write, FileShare.Read));
                    Console.WriteLine("Success! Anim converted.");
                }
                else if (xmlDoc.DocumentElement.Name == "ParticleFile")
                {
                    PrtFile file = PrtFile.DeserializeAsXml(File.Open(f, FileMode.Open, FileAccess.Read, FileShare.Read));
                    file.Write(File.Open(f + ".prt", FileMode.Create, FileAccess.Write, FileShare.Read));
                    Console.WriteLine("Success! Prt converted.");
                }
                else
                {
                    MtrlFile file = MtrlFile.DeserializeAsXml(File.Open(f, FileMode.Open, FileAccess.Read, FileShare.Read));
                    file.Write(File.Open(f + ".mtrl", FileMode.Create, FileAccess.Write, FileShare.Read));
                    Console.WriteLine("Success! Mtrl converted.");
                }
            }
        }
예제 #13
0
        public void Read(Stream stream)
        {
            using (BrgBinaryReader reader = new BrgBinaryReader(new LittleEndianBitConverter(), stream))
            {
                uint magic = reader.ReadUInt32();
                if (magic != 1280463949)
                {
                    throw new Exception("This is not a MTRL file!");
                }

                uint nameLength = reader.ReadUInt32();
                for (int i = 0; i < 5; ++i)
                {
                    this.unk[i] = reader.ReadUInt32();
                }

                this.Diffuse = reader.ReadColor3D();
                this.Ambient = reader.ReadColor3D();
                this.Specular = reader.ReadColor3D();
                this.Emissive = reader.ReadColor3D();
                this.SpecularLevel = reader.ReadSingle();
                this.Alpha = reader.ReadSingle();

                this.Id = reader.ReadInt32();

                this.SelfIlluminating = reader.ReadByte();
                this.ClampU = reader.ReadByte();
                this.ClampV = reader.ReadByte();
                this.LightSpecular = reader.ReadByte();
                this.AffectsAmbient = reader.ReadByte();
                this.AffectsDiffuse = reader.ReadByte();
                this.AffectsSpecular = reader.ReadByte();
                this.Updateable = reader.ReadByte();

                this.AlphaMode = reader.ReadInt32(); // Seems to be very often 10, wave has a 2 here, phoenix has 6
                this.AmbientIntensity = reader.ReadInt32();
                this.DiffuseIntensity = reader.ReadInt32();
                this.SpecularIntensity = reader.ReadInt32();
                this.EmissiveIntensity = reader.ReadInt32();
                this.ColorTransform = reader.ReadInt32(); // Val of 4 seems to be PC
                this.TextureTransform = reader.ReadInt32();
                this.TextureFactor = reader.ReadInt32(); // Has something to do with Cube Map
                this.MultiTextureMode = reader.ReadInt32(); // Has something to do with Cube Map
                this.TexGenMode0 = reader.ReadInt32();
                this.TexGenMode1 = reader.ReadInt32(); // Has something to do with Cube Map
                this.TexCoordSet0 = reader.ReadInt32();
                this.TexCoordSet1 = reader.ReadInt32();
                this.TexCoordSet2 = reader.ReadInt32();
                this.TexCoordSet3 = reader.ReadInt32();
                this.TexCoordSet4 = reader.ReadInt32();
                this.TexCoordSet5 = reader.ReadInt32();
                this.TexCoordSet6 = reader.ReadInt32();
                this.TexCoordSet7 = reader.ReadInt32();

                for (int i = 0; i < 3; ++i)
                {
                    this.unk2[i] = reader.ReadTexel();
                }
                for (int i = 0; i < 3; ++i)
                {
                    this.unk3[i] = reader.ReadTexel();
                }
                for (int i = 0; i < 4; ++i)
                {
                    this.unk4[i] = reader.ReadInt32();
                }

                if (nameLength > 0)
                {
                    this.Texture = reader.ReadString();
                }
            }
        }
예제 #14
0
        public BrgMesh(BrgBinaryReader reader, BrgFile file)
            : this(file)
        {
            this.ParentFile = file;
            this.Header     = new BrgMeshHeader(reader);

            if (!this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS))
            {
                this.Vertices = new List <Vector3>(this.Header.NumVertices);
                for (int i = 0; i < this.Header.NumVertices; i++)
                {
                    this.Vertices.Add(reader.ReadVector3D(true, this.Header.Version == 22));
                }
                this.Normals = new List <Vector3>(this.Header.NumVertices);
                for (int i = 0; i < this.Header.NumVertices; i++)
                {
                    if (this.Header.Version >= 13 && this.Header.Version <= 17)
                    {
                        reader.ReadInt16(); // TODO figure this out
                    }
                    else // v == 18, 19 or 22
                    {
                        this.Normals.Add(reader.ReadVector3D(true, this.Header.Version == 22));
                    }
                }

                if ((!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) ||
                     this.Header.Flags.HasFlag(BrgMeshFlag.ANIMTEXCOORDS) ||
                     this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLESYSTEM)) &&
                    this.Header.Flags.HasFlag(BrgMeshFlag.TEXCOORDSA))
                {
                    this.TextureCoordinates = new List <Vector3>(this.Header.NumVertices);
                    for (int i = 0; i < this.Header.NumVertices; i++)
                    {
                        this.TextureCoordinates.Add(new Vector3(reader.ReadVector2D(this.Header.Version == 22), 0f));
                    }
                }

                if (!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) ||
                    this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLESYSTEM))
                {
                    this.Faces = new List <Face>(this.Header.NumFaces);
                    for (int i = 0; i < this.Header.NumFaces; ++i)
                    {
                        this.Faces.Add(new Face());
                    }

                    if (this.Header.Flags.HasFlag(BrgMeshFlag.MATERIAL))
                    {
                        for (int i = 0; i < this.Header.NumFaces; i++)
                        {
                            this.Faces[i].MaterialIndex = reader.ReadInt16();
                        }
                    }

                    for (int i = 0; i < this.Header.NumFaces; i++)
                    {
                        this.Faces[i].Indices.Add(reader.ReadInt16());
                        this.Faces[i].Indices.Add(reader.ReadInt16());
                        this.Faces[i].Indices.Add(reader.ReadInt16());
                    }

                    if (this.Header.Flags.HasFlag(BrgMeshFlag.MATERIAL))
                    {
                        this.VertexMaterials = new List <Int16>(this.Header.NumVertices);
                        for (int i = 0; i < this.Header.NumVertices; i++)
                        {
                            this.VertexMaterials.Add(reader.ReadInt16());
                        }
                    }
                }
            }

            this.UserDataEntries = new BrgUserDataEntry[this.Header.UserDataEntryCount];
            if (!this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS))
            {
                for (int i = 0; i < this.Header.UserDataEntryCount; i++)
                {
                    this.UserDataEntries[i] = reader.ReadUserDataEntry(false);
                }
            }

            this.ExtendedHeader = new BrgMeshExtendedHeader(reader, this.Header.ExtendedHeaderSize);

            if (this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS))
            {
                this.particleData = new float[4 * this.Header.NumVertices];
                for (int i = 0; i < this.particleData.Length; i++)
                {
                    this.particleData[i] = reader.ReadSingle();
                }
                for (int i = 0; i < this.Header.UserDataEntryCount; i++)
                {
                    this.UserDataEntries[i] = reader.ReadUserDataEntry(true);
                }
            }

            if (this.Header.Version == 13)
            {
                reader.ReadBytes(this.ExtendedHeader.NameLength);
            }

            if (this.Header.Version >= 13 && this.Header.Version <= 18)
            {
                this.Header.Flags |= BrgMeshFlag.ATTACHPOINTS;
            }
            if (this.Header.Flags.HasFlag(BrgMeshFlag.ATTACHPOINTS))
            {
                Int16 numMatrix = this.ExtendedHeader.NumDummies;
                Int16 numIndex  = this.ExtendedHeader.NumNameIndexes;
                if (this.Header.Version == 19 || this.Header.Version == 22)
                {
                    numMatrix = reader.ReadInt16();
                    numIndex  = reader.ReadInt16();
                    reader.ReadInt16();
                }

                BrgAttachpoint[] attpts = new BrgAttachpoint[numMatrix];
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i] = new BrgAttachpoint();
                }
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i].XVector = reader.ReadVector3D(true, this.Header.Version == 22);
                }
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i].YVector = reader.ReadVector3D(true, this.Header.Version == 22);
                }
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i].ZVector = reader.ReadVector3D(true, this.Header.Version == 22);
                }
                if (this.Header.Version == 19 || this.Header.Version == 22)
                {
                    for (int i = 0; i < numMatrix; i++)
                    {
                        attpts[i].Position = reader.ReadVector3D(true, this.Header.Version == 22);
                    }
                }
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i].BoundingBoxMin = reader.ReadVector3D(true, this.Header.Version == 22);
                }
                for (int i = 0; i < numMatrix; i++)
                {
                    attpts[i].BoundingBoxMax = reader.ReadVector3D(true, this.Header.Version == 22);
                }

                List <int> nameId = new List <int>();
                for (int i = 0; i < numIndex; i++)
                {
                    int duplicate = reader.ReadInt32(); // have yet to find a model with duplicates
                    reader.ReadInt32();                 // TODO figure out what this means
                    for (int j = 0; j < duplicate; j++)
                    {
                        nameId.Add(i);
                    }
                }

                for (int i = 0; i < nameId.Count; i++)
                {
                    this.Attachpoints.Add(new BrgAttachpoint(attpts[reader.ReadByte()]));
                    this.Attachpoints[i].NameId = nameId[i];
                    //attpts[reader.ReadByte()].NameId = nameId[i];
                }
                //attachpoints = new List<BrgAttachpoint>(attpts);
            }

            if (((this.Header.Flags.HasFlag(BrgMeshFlag.COLORALPHACHANNEL) ||
                  this.Header.Flags.HasFlag(BrgMeshFlag.COLORCHANNEL)) &&
                 !this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH)) ||
                this.Header.Flags.HasFlag(BrgMeshFlag.ANIMVERTCOLORALPHA))
            {
                this.Colors = new List <Color4D>(this.Header.NumVertices);
                for (int i = 0; i < this.Header.NumVertices; i++)
                {
                    this.Colors.Add(reader.ReadTexel());
                }
            }

            // Only seen on first mesh
            if (this.Header.AnimationType.HasFlag(BrgMeshAnimType.NonUniform))
            {
                this.NonUniformKeys = new List <float>(this.ExtendedHeader.NumNonUniformKeys);
                for (int i = 0; i < this.ExtendedHeader.NumNonUniformKeys; i++)
                {
                    this.NonUniformKeys[i] = reader.ReadSingle();
                }
            }

            if (this.Header.Version >= 14 && this.Header.Version <= 19)
            {
                // Face Normals??
                Vector3[] legacy = new Vector3[this.Header.NumFaces];
                for (int i = 0; i < this.Header.NumFaces; i++)
                {
                    legacy[i] = reader.ReadVector3D();
                }
            }

            if (!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) && this.Header.Version != 22)
            {
                reader.ReadBytes(ExtendedHeader.ShadowNameLength0 + ExtendedHeader.ShadowNameLength1);
            }
        }
예제 #15
0
        public BrgFile(System.IO.FileStream fileStream)
            : base()
        {
            using (BrgBinaryReader reader = new BrgBinaryReader(new LittleEndianBitConverter(), fileStream))
            {
                this.FileName = fileStream.Name;
                this.Header   = new BrgHeader(reader);
                if (this.Header.Magic != "BANG")
                {
                    throw new Exception("This is not a BRG file!");
                }
                this.AsetHeader = new BrgAsetHeader();

                int asetCount = 0;
                this.Meshes    = new List <BrgMesh>(this.Header.NumMeshes);
                this.Materials = new List <BrgMaterial>();
                while (reader.BaseStream.Position < reader.BaseStream.Length)
                {
                    string magic = reader.ReadString(4);
                    if (magic == "ASET")
                    {
                        this.AsetHeader = new BrgAsetHeader(reader);
                        ++asetCount;
                    }
                    else if (magic == "MESI")
                    {
                        if (this.Meshes.Count > 0)
                        {
                            this.Meshes[0].MeshAnimations.Add(new BrgMesh(reader, this));
                        }
                        else
                        {
                            this.Meshes.Add(new BrgMesh(reader, this));
                        }
                    }
                    else if (magic == "MTRL")
                    {
                        BrgMaterial mat = new BrgMaterial(reader, this);
                        Materials.Add(mat);
                        if (!ContainsMaterialID(mat.Id))
                        {
                            //Materials.Add(mat);
                        }
                        else
                        {
                            //throw new Exception("Duplicate material ids!");
                        }
                    }
                    else
                    {
                        throw new Exception("The type tag " + /* magic +*/ " is not recognized!");
                    }
                }

                if (asetCount > 1)
                {
                    //throw new Exception("Multiple ASETs!");
                }

                if (Header.NumMeshes < Meshes.Count)
                {
                    throw new Exception("Inconsistent mesh count!");
                }

                if (Header.NumMaterials < Materials.Count)
                {
                    throw new Exception("Inconsistent material count!");
                }

                if (reader.BaseStream.Position < reader.BaseStream.Length)
                {
                    throw new Exception("The end of stream was not reached!");
                }

                this.Animation.Duration = this.Meshes[0].ExtendedHeader.AnimationLength;
                this.Animation.TimeStep = this.Meshes[0].ExtendedHeader.AnimationLength / (float)(this.Meshes[0].MeshAnimations.Count + 1);
                if (this.Meshes[0].Header.AnimationType.HasFlag(BrgMeshAnimType.NonUniform))
                {
                    for (int i = 0; i <= this.Meshes[0].MeshAnimations.Count; ++i)
                    {
                        this.Animation.MeshKeys.Add(this.Meshes[0].NonUniformKeys[i] * this.Animation.Duration);
                    }
                }
                else if (this.Meshes[0].MeshAnimations.Count > 0)
                {
                    for (int i = 0; i <= this.Meshes[0].MeshAnimations.Count; ++i)
                    {
                        this.Animation.MeshKeys.Add((float)i / ((float)this.Meshes[0].MeshAnimations.Count) * this.Animation.Duration);
                    }
                }
                else
                {
                    this.Animation.MeshKeys.Add(0);
                }
            }
        }