Exemple #1
0
        public Srtfile()
        {
            Extents    = new CExtents();
            LodProfile = new SLodProfile();
            Wind       = new CWind();

            //StringTable = new string[];
            //CollisionObjects = new SCollisionObject[];
            VerticalBillboards  = new SVerticalBillboards();
            HorizontalBillboard = new SHorizontalBillboard();

            PUserStrings = new string[(int)EUserStringOrdinal.USER_STRING_COUNT];
            Geometry     = new SGeometry();
        }
Exemple #2
0
        ///////////////////////////////////////////////////////////////////////
        //  CParser::ParseBillboards

        private bool ParseBillboards(BinaryReader br)
        {
            bool bSuccess = false;
            var  startpos = br.BaseStream.Position;

            // vertical billboards
            if (GetRemainingLength() >= 2 * c_nSizeOfInt + 3 * c_nSizeOfFloat)
            {
                SVerticalBillboards sBBs = new SVerticalBillboards();

                // parse dimensions
                sBBs.FWidth         = br.ReadSingle();
                sBBs.FTopPos        = br.ReadSingle();
                sBBs.FBottomPos     = br.ReadSingle();
                sBBs.NNumBillboards = br.ReadInt32();

                // texcoord table
                if (m_stream.Position % 4 != 0)
                {
                    throw new NotImplementedException();                             // check alignment
                }
                sBBs.PTexCoords = new float[sBBs.NNumBillboards * 4];
                for (int i = 0; i < sBBs.NNumBillboards * 4; i++)
                {
                    sBBs.PTexCoords[i] = br.ReadSingle();
                    //sBBs.PTexCoords[1] = br.ReadSingle();
                    //sBBs.PTexCoords[2] = br.ReadSingle();
                    //sBBs.PTexCoords[3] = br.ReadSingle();
                }

                // rotated flags
                sBBs.PRotated = new byte[sBBs.NNumBillboards];
                for (int i = 0; i < sBBs.NNumBillboards; i++)
                {
                    sBBs.PRotated[i] = br.ReadByte();
                }
                ParseUntilAligned(br);

                // cutout values
                sBBs.NNumCutoutVertices = br.ReadInt32();
                sBBs.NNumCutoutIndices  = br.ReadInt32();
                if (sBBs.NNumCutoutVertices > 0 && sBBs.NNumCutoutIndices > 0)
                {
                    // interp float pairs
                    sBBs.PCutoutVertices = new float[2 * sBBs.NNumCutoutVertices];
                    for (int i = 0; i < (2 * sBBs.NNumCutoutVertices); i++)
                    {
                        sBBs.PCutoutVertices[i] = br.ReadSingle();
                    }

                    // interp indices
                    sBBs.PCutoutIndices = new ushort[sBBs.NNumCutoutIndices];
                    for (int i = 0; i < sBBs.NNumCutoutIndices; i++)
                    {
                        sBBs.PCutoutIndices[i] = br.ReadUInt16();
                    }
                    ParseUntilAligned(br);
                }

                VerticalBillboards = sBBs;
                bSuccess           = true;

                //if (br.BaseStream.Position - startpos != 2 * c_nSizeOfInt + 3 * c_nSizeOfFloat)
                //    throw new NotImplementedException();
            }
            //else
            //    CCore::SetError("CParser::ParseBillboards, premature end-of-file\n");


            // horizontal billboards
            startpos = br.BaseStream.Position;
            if (GetRemainingLength() >= c_nSizeOfInt + (8 + 12) * c_nSizeOfFloat)
            {
                var sbb = new SHorizontalBillboard();
                sbb.BPresent = (br.ReadInt32() != 0);

                // texcoords
                sbb.AfTexCoords = new float[8];
                for (int i = 0; i < 8; i++)
                {
                    sbb.AfTexCoords[i] = br.ReadSingle();
                }

                // positions
                sbb.AvPositions = new Vec3[4];
                for (int i = 0; i < 4; i++)
                {
                    Vec3 vec = br.BaseStream.ReadStruct <Vec3>();
                    sbb.AvPositions[i] = vec;
                }
                HorizontalBillboard = sbb;

                if (br.BaseStream.Position - startpos != c_nSizeOfInt + (8 + 12) * c_nSizeOfFloat)
                {
                    throw new NotImplementedException();
                }
            }
            else
            {
                bSuccess = false;
            }
            //    CCore::SetError("CParser::ParseBillboards, premature end-of-file\n");

            return(bSuccess);
        }