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(); }
/////////////////////////////////////////////////////////////////////// // 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); }