internal void ReadChildren(OptReader reader) { foreach (var child in reader.ReadChildren(this)) { Children.Add(child); } }
internal LodCollection(OptReader reader) : base() { int lodChildCount = reader.ReadInt32(); int lodChildOffset = reader.ReadInt32(); int lodThresholdCount = reader.ReadInt32(); int lodThresholdOffset = reader.ReadInt32(); // No idea why this would happen, but my understanding of this block is wrong if it does. if (lodChildCount != lodThresholdCount) { reader.logger?.Invoke(String.Format(CultureInfo.CurrentCulture, "Not the same number of LOD meshes ({0}) as LOD offsets ({1}) at {2:X}", lodChildCount, lodThresholdCount, reader.BaseStream.Position)); } reader.Seek(lodChildOffset); ReadChildren(reader, lodChildCount, lodChildOffset); reader.Seek(lodThresholdOffset); MaxRenderDistance.Clear(); for (int i = 0; i < lodChildCount; i++) { float distance = reader.ReadSingle(); MaxRenderDistance.Add(distance); // A distance of 0 represents infinate draw distance // Converting to PositiveInfinity sorts it correctly. distance = distance == 0 ? float.PositiveInfinity : distance; } }
internal void ReadChildren(OptReader reader, int count, int jumpListOffset) { foreach (var child in reader.ReadChildren(count, jumpListOffset, this)) { Children.Add(child); } }
internal NamedNodeCollection(OptReader reader, int nameOffset) : base() { var child_pp = reader.ReadInt32(); reader.Seek(nameOffset); // arbitrary length null-terminated string Name = reader.ReadString(maxLen: 32); ReadChildren(reader, 1, child_pp); }
internal TexturePallet(OptReader reader) { // For some reason pallets 0-7 seem to be padding, 8-15 appear to be increasing brightness for (int i = 0; i < PalletCount; i++) { for (int j = 0; j < ColorCount; j++) { pallets[i, j] = reader.ReadUInt16(); } } }
internal MeshVertices(OptReader reader) : base(reader) { // unknown zeros reader.ReadUnknownUseValue(0, this); reader.ReadUnknownUseValue(0, this); var count = reader.ReadInt32(); reader.FollowPointerToNextByte(this); Vertices = reader.ReadVectorCollection <TVector3>(count); }
internal EngineGlow(OptReader reader) : base(reader) { reader.ReadUnknownUseValue(0, this); reader.ReadUnknownUseValue(0, this); reader.ReadUnknownUseValue(1, this); reader.FollowPointerToNextByte(this); reader.ReadUnknownUseValue(0, this); InnerColor = reader.ReadInt32(); OuterColor = reader.ReadInt32(); Center = reader.ReadVector <TVector3>(); // Cargo culting the order. Y = reader.ReadVector <TVector3>(); Z = reader.ReadVector <TVector3>(); X = reader.ReadVector <TVector3>(); }
internal PartDescriptor(OptReader reader) : base(reader) { reader.ReadUnknownUseValue(0, this); reader.ReadUnknownUseValue(0, this); reader.ReadUnknownUseValue(1, this); reader.FollowPointerToNextByte(this); PartType = (PartType)reader.ReadUInt32(); ExplosionType = reader.ReadInt32(); HitboxSpan = reader.ReadVector <TVector3>(); HitboxCenterPoint = reader.ReadVector <TVector3>(); HitboxLowerCorner = reader.ReadVector <TVector3>(); HitboxUpperCorner = reader.ReadVector <TVector3>(); TargetGroupId = reader.ReadInt32(); TargetPoint = reader.ReadVector <TVector3>(); }
internal abstract object ReadCollection(OptReader reader, int count);
internal abstract object Read(OptReader reader);
internal SkinCollection(OptReader reader) : base() { ReadChildren(reader); }
internal NodeCollection(OptReader reader) : base(reader) { ReadChildren(reader); }
internal BaseNode(OptReader opt) { OffsetInFile = opt.BaseStream.Position; }