public static IEnumerable <SMChunkFlags> GetMCNKFlags(this SMChunkFlags flags) { for (int i = 0; i < 4; i++) { SMChunkFlags flag = (SMChunkFlags)(1 << (2 + i)); if (flags.HasFlag(flag)) { yield return(flag); } } }
List <SWFlowv> Flowvs = new List <SWFlowv>(); // 2 public MCLQSubChunk(BinaryReader reader, SMChunkFlags flag) { Range = new CRange(reader); switch (flag) { case SMChunkFlags.FLAG_LQ_OCEAN: for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { Verts[i, j] = new SOVert(reader); // Ocean Vert } } break; case SMChunkFlags.FLAG_LQ_MAGMA: for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { Verts[i, j] = new SMVert(reader); // Magma Vert } } break; default: for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { Verts[i, j] = new SWVert(reader); // Water Vert } } break; } SLTiles = new SLTiles(reader); NFlowVS = reader.ReadUInt32(); for (int i = 0; i < 2; i++) { Flowvs.Add(new SWFlowv(reader)); } }
public SMChunk(BinaryReader reader) { Flags = (SMChunkFlags)reader.ReadUInt32(); HasLiquids = (Flags & SMChunkFlags.HasLiquid) != 0; indexX = reader.ReadUInt32(); indexY = reader.ReadUInt32(); radius = reader.ReadSingle(); nLayers = reader.ReadUInt32(); nDoodadRefs = reader.ReadUInt32(); offsHeight = reader.ReadUInt32(); // MCVT offsNormal = reader.ReadUInt32(); // MCNR offsLayer = reader.ReadUInt32(); // MCLY offsRefs = reader.ReadUInt32(); // MCRF offsAlpha = reader.ReadUInt32(); // MCAL sizeAlpha = reader.ReadUInt32(); offsShadow = reader.ReadUInt32(); // MCSH sizeShadow = reader.ReadUInt32(); area = reader.ReadUInt32(); // in alpha: zone id (4) sub zone id (4) nMapObjRefs = reader.ReadUInt32(); holes_low_res = reader.ReadUInt16(); padding = reader.ReadUInt16(); predTex = reader.ReadBytes(16); //It is used to determine which detail doodads to show. 2 bit 8*8 arr unsigned integers naming the layer. noEffectDoodad = reader.ReadBytes(8); // 1 bit 8*8 arr, doodads disabled if 1 offsSndEmitters = reader.ReadUInt32(); // MCSE nSndEmitters = reader.ReadUInt32(); offsLiquid = reader.ReadUInt32(); // MCLQ unused = reader.ReadBytes(24); //Padding HeaderOffsetEnd = reader.BaseStream.Position; // MCVT begin right after header. BuildSubMCVT(reader, offsHeight); //Has MCNR SubChunk if (offsNormal > 0) { BuildSubMCNR(reader, offsNormal); } if (offsLayer > 0) { BuildMCLY(reader, offsLayer); } if (offsRefs > 0) { BuildMCRF(reader, offsRefs); } if (offsAlpha > 0) { BuildMCAL(reader, offsAlpha, (int)sizeAlpha); } if (offsShadow > 0) { BuildMCSH(reader, offsShadow, (int)sizeShadow); } if (offsSndEmitters > 0) { BuildMCSE(reader, offsSndEmitters, (int)nSndEmitters); } if (offsLiquid > 0 && HasLiquids) { BuildSubMCLQ(reader, offsLiquid); } }