Exemple #1
0
        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;
            }
        }
Exemple #2
0
        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>();
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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>();
        }
Exemple #5
0
        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);
        }