예제 #1
0
        public CAMS(BinaryReader br)
        {
            Size        = br.ReadUInt32();
            Name        = br.ReadString(80).TrimEnd('\0');
            Pivot       = br.ReadStruct <C3Vector>();
            FieldOfView = br.ReadSingle();
            FarClip     = br.ReadSingle();
            NearClip    = br.ReadSingle();
            TargetPivot = br.ReadStruct <C3Vector>();

            while (true)
            {
                string token = br.ReadString(4);
                br.BaseStream.Position -= 4;
                switch (token)
                {
                case "KCTR": TranslationKeys = new MDXTrack <C3Vector>(br); break;

                case "KCRL": RotationKeys = new MDXTrack <float>(br); break;

                case "KTTR": TargetTranslationKeys = new MDXTrack <C3Vector>(br); break;

                case "KVIS": VisibilityKeys = new MDXTrack <float>(br); break;

                default: return;
                }
            }
        }
예제 #2
0
 public override void Read(BinaryReader stream)
 {
     Id       = stream.ReadUInt32();
     Bone     = stream.ReadUInt32();
     Position = stream.Read <C3Vector>();
     AnimateAttached.Read(stream);
 }
예제 #3
0
 public void Load(BinaryReader stream, M2.Format version)
 {
     Id = stream.ReadUInt32();
     Bone = stream.ReadUInt32();
     Position = stream.ReadC3Vector();
     AnimateAttached.Load(stream, version);
 }
예제 #4
0
파일: C33Matrix.cs 프로젝트: Koward/M2Lib
 public C33Matrix(C3Vector col0, C3Vector col1, C3Vector col2)
 {
     //Columns = new C3Vector[3];
     Columns[0] = col0;
     Columns[1] = col1;
     Columns[2] = col2;
 }
예제 #5
0
 public override void Read(BinaryReader stream)
 {
     Id       = stream.ReadUInt32();
     Data     = stream.ReadUInt32();
     Bone     = stream.ReadUInt32();
     Position = stream.Read <C3Vector>();
     Enabled.Read(stream);
 }
예제 #6
0
 public MFOG(BinaryReader br)
 {
     Flags    = br.ReadEnum <MFOG_Flags>();
     Position = br.ReadStruct <C3Vector>();
     Start    = br.ReadSingle();
     End      = br.ReadSingle();
     Fogs     = br.ReadStructArray <Fog>(2);
 }
예제 #7
0
 public M2Event(BinaryReader br, uint build)
 {
     EventName  = br.ReadString(4);
     Data       = br.ReadUInt32();
     BoneIndex  = br.ReadUInt32();
     Position   = br.ReadStruct <C3Vector>();
     EventTrack = new M2Track <bool>(br, build, true);
 }
예제 #8
0
 public M2Attachment(BinaryReader br, uint build)
 {
     AttachmentId = br.ReadEnum <GeoComponentLink>();
     BoneIndex    = br.ReadUInt16();
     Unknown_0x6  = br.ReadUInt16();
     Position     = br.ReadStruct <C3Vector>();
     AnimTrack    = new M2Track <bool>(br, build);
 }
예제 #9
0
 public override void Read(BinaryReader stream)
 {
     Position           = stream.Read <C3Vector>();
     Weights            = stream.ReadBytes(Weights.Length);
     Indices            = stream.ReadBytes(Indices.Length);
     Normal             = stream.Read <C3Vector>();
     TextureCoordinates = stream.Read <C2Vector>(TextureCoordinates.Length);
 }
예제 #10
0
 public MDDF(BinaryReader br)
 {
     NameId   = br.ReadUInt32();
     UniqueId = br.ReadInt32();
     Position = br.ReadStruct <C3Vector>();
     Rotation = br.ReadStruct <C3Vector>();
     Scale    = br.ReadUInt16();
     Flags    = br.ReadEnum <MODDF_Flags>();
 }
예제 #11
0
        public string LightName; // 32, 8.3 is not 0 padded

        public LIT_ListData(BinaryReader br)
        {
            Chunk         = br.ReadStruct <C2iVector>();
            ChunkRadius   = br.ReadInt32();
            LightLocation = br.ReadStruct <C3Vector>();
            LightRadius   = br.ReadSingle();
            LightDropoff  = br.ReadSingle();
            LightName     = br.ReadString(32).TrimEnd('\xFFFD', '\0');
        }
예제 #12
0
        public MLIQ(BinaryReader br)
        {
            VertexCount = br.ReadStruct <C2iVector>();
            TileCount   = br.ReadStruct <C2iVector>();
            Corner      = br.ReadStruct <C3Vector>();
            MaterialId  = br.ReadUInt16();

            // HACK
            LiquidVertexList = br.ReadJaggedArray(VertexCount.x, VertexCount.y, () => br.ReadStruct <SMOLVert>());
            LiquidTileList   = br.ReadJaggedArray(TileCount.x, TileCount.y, () => br.ReadStruct <SMOLTile>());
        }
예제 #13
0
        public void UpdateCollisions()
        {
            if (_model.Has <CLID>())
            {
                var      v   = _model.Get <CLID>().Vertices;
                C3Vector min = new C3Vector(v.Min(x => x.X), v.Min(x => x.Y), v.Min(x => x.Z));
                C3Vector max = new C3Vector(v.Max(x => x.X), v.Max(x => x.Y), v.Max(x => x.Z));

                Model.CollisionBox          = new CAaBox(min, max);
                Model.CollisionSphereRadius = (Model.CollisionBox.Min.Length() + Model.CollisionBox.Max.Length()) / 2f;
                Model.CollisionNormals      = _model.Get <CLID>().FacetNormals.Select(x => x.ToC3Vector).ToM2Array();
                Model.CollisionTriangles    = _model.Get <CLID>().TriIndices.ToM2Array();
                Model.CollisionVertices     = _model.Get <CLID>().Vertices.Select(x => x.ToC3Vector).ToM2Array();
            }
            else
            {
                var view = Model.Views[0];

                //Calculate Vertices
                Model.CollisionVertices = new M2Array <C3Vector>();
                for (int i = 0; i < view.Indices.Count; i++)
                {
                    Model.CollisionVertices.Add(Model.GlobalVertexList[i].Position);
                }

                //Calculate normals and triangles
                Model.CollisionNormals   = new M2Array <C3Vector>();
                Model.CollisionTriangles = new M2Array <ushort>();
                for (int i = 0; i < view.Triangles.Count / 3; i++)
                {
                    ushort i1 = view.Triangles[i];
                    ushort i2 = view.Triangles[i + 1];
                    ushort i3 = view.Triangles[i + 2];

                    C3Vector v1 = Model.GlobalVertexList[i1].Position;
                    C3Vector v2 = Model.GlobalVertexList[i2].Position;
                    C3Vector v3 = Model.GlobalVertexList[i3].Position;

                    C3Vector U = new C3Vector(v2.X - v1.X, v2.Y - v1.Y, v2.Z - v1.Z);
                    C3Vector V = new C3Vector(v3.X - v1.X, v3.Y - v1.Y, v3.Z - v1.Z);
                    C3Vector N = new C3Vector(U.Y * V.Z - U.Z * V.Y, U.Z * V.X - U.X * V.Z, U.X * V.Y - U.Y * V.X).Normalise();

                    Model.CollisionNormals.Add(N);
                    Model.CollisionTriangles.AddRange(new[] { i1, i2, i3 });
                }

                //Calculate box and Sphere
                var      v   = Model.CollisionVertices;
                C3Vector min = new C3Vector(v.Min(x => x.X), v.Min(x => x.Y), v.Min(x => x.Z));
                C3Vector max = new C3Vector(v.Max(x => x.X), v.Max(x => x.Y), v.Max(x => x.Z));
                Model.CollisionBox          = new CAaBox(min, max);
                Model.CollisionSphereRadius = (Model.CollisionBox.Min.Length() + Model.CollisionBox.Max.Length()) / 2f;
            }
        }
예제 #14
0
 public M2Bone(BinaryReader br, uint build)
 {
     KeyBoneId  = (KeyBone)br.ReadInt32();
     Flags      = br.ReadEnum <M2Bone_Flags>();
     Parent     = br.ReadInt16();
     SubmeshId  = br.ReadInt16();
     TransTrack = new M2Track <C3Vector>(br, build);
     RotTrack   = new M2Track <C4Quaternion>(br, build);
     ScaleTrack = new M2Track <C3Vector>(br, build);
     Pivot      = br.ReadStruct <C3Vector>();
 }
예제 #15
0
        public MODD(BinaryReader br)
        {
            uint data = br.ReadUInt32();

            NameIndex   = data & 0xFFFFFFu;
            Flags       = (MODD_Flags)(data >> 24);
            Position    = br.ReadStruct <C3Vector>();
            Orientation = br.ReadStruct <C4Quaternion>();
            Scale       = br.ReadSingle();
            Color       = br.ReadStruct <CImVector>();
        }
예제 #16
0
 public MODF(BinaryReader br)
 {
     NameId    = br.ReadUInt32();
     UniqueId  = br.ReadInt32();
     Pos       = br.ReadStruct <C3Vector>();
     Rot       = br.ReadStruct <C3Vector>();
     Extents   = br.ReadStruct <CAaBox>();
     Flags     = br.ReadEnum <MODF_Flags>();
     DoodadSet = br.ReadUInt16();
     NameSet   = br.ReadUInt16();
     Scale     = br.ReadUInt16();
 }
예제 #17
0
파일: Camera.cs 프로젝트: Dramacydal/M2Lib
 public override void Read(BinaryReader stream)
 {
     Type     = stream.ReadUInt32();
     FarClip  = stream.ReadSingle();
     NearClip = stream.ReadSingle();
     Positions.Read(stream);
     PositionBase = stream.Read <C3Vector>();
     TargetPositions.Read(stream);
     TargetPositionBase = stream.Read <C3Vector>();
     Roll.Read(stream);
     FoV.Read(stream);
 }
예제 #18
0
파일: Bone.cs 프로젝트: Dramacydal/M2Lib
 public override void Read(BinaryReader stream)
 {
     KeyBoneId  = stream.ReadInt32();
     Flags      = stream.ReadUInt32();
     ParentBone = stream.ReadInt16();
     SubmeshId  = stream.ReadUInt16();
     Unknown    = stream.Read <ushort>(Unknown.Length);
     Translation.Read(stream);
     Rotation.Read(stream);
     Scale.Read(stream);
     Pivot = stream.Read <C3Vector>();
 }
예제 #19
0
 public M2Camera(BinaryReader br, uint build)
 {
     Type             = br.ReadEnum <CameraType>();
     FieldOfView      = br.ReadSingle();
     FarClip          = br.ReadSingle();
     NearClip         = br.ReadSingle();
     TransTrack       = new M2Track <SplineKey <C3Vector> >(br, build);
     Pivot            = br.ReadStruct <C3Vector>();
     TargetTransTrack = new M2Track <SplineKey <C3Vector> >(br, build);
     TargetPivot      = br.ReadStruct <C3Vector>();
     RollTrack        = new M2Track <SplineKey <float> >(br, build);
 }
예제 #20
0
 public override void Read(BinaryReader stream)
 {
     Type     = stream.ReadUInt16();
     Bone     = stream.ReadInt16();
     Position = stream.Read <C3Vector>();
     AmbientColor.Read(stream);
     AmbientInsensity.Read(stream);
     DiffuseColor.Read(stream);
     DiffuseIntensity.Read(stream);
     AttenuationStart.Read(stream);
     AttenuationEnd.Read(stream);
     Unknown.Read(stream);
 }
예제 #21
0
 public M2Light(BinaryReader br, uint build)
 {
     Type              = br.ReadEnum <LightType>();
     BoneIndex         = br.ReadUInt16();
     Position          = br.ReadStruct <C3Vector>();
     AmbColorTrack     = new M2Track <C3Vector>(br, build);
     AmbIntensityTrack = new M2Track <float>(br, build);
     ColorTrack        = new M2Track <C3Vector>(br, build);
     IntensityTrack    = new M2Track <float>(br, build);
     AttenStartTrack   = new M2Track <float>(br, build);
     AttenEndTrack     = new M2Track <float>(br, build);
     VisibilityTrack   = new M2Track <bool>(br, build);
 }
예제 #22
0
 public override void Read(BinaryReader s)
 {
     Unknown       = s.ReadUInt32();
     Flags         = s.ReadUInt32();
     Position      = s.Read <C3Vector>();
     Bone          = s.ReadUInt16();
     PackedTexture = s.ReadUInt16();
     ModelFileName.Read(s);
     ChildEmitterFileName.Read(s);
     BlendingType            = s.ReadByte();
     EmitterType             = s.ReadByte();
     ParticleColorIndex      = s.ReadUInt16();
     ParticleType            = s.ReadByte();
     HeadOrTail              = s.ReadByte();
     TextureTileRotation     = s.ReadUInt16();
     TextureDimensionRows    = s.ReadUInt16();
     TextureDimensionColumns = s.ReadUInt16();
     EmissionSpeed.Read(s);
     SpeedVariation.Read(s);
     VerticalRange.Read(s);
     HorizontalRange.Read(s);
     Gravity.Read(s);
     LifeSpan.Read(s);
     UnkPadding = s.ReadUInt32();
     EmissionRate.Read(s);
     UnkPadding2 = s.ReadUInt32();
     EmissionAreaLength.Read(s);
     EmissingAreaWidth.Read(s);
     Gravity2.Read(s);
     ColorTrack.Read(s);
     AlphaTrack.Read(s);
     ScaleTrack.Read(s);
     UnknownFields = s.Read <float>(UnknownFields.Length);
     HeadCellTrack.Read(s);
     TailCellTrack.Read(s);
     SomethingParticleStyle = s.ReadSingle();
     UnknownFloats1         = s.Read <float>(UnknownFloats1.Length);
     TwinkleScale           = s.Read <CRange>();
     Unk            = s.ReadUInt32();
     Drag           = s.ReadSingle();
     UnknownFloats2 = s.Read <float>(UnknownFloats2.Length);
     Rotation       = s.ReadSingle();
     UnknownFloats3 = s.Read <float>(UnknownFloats3.Length);
     Rotation1      = s.Read <C3Vector>();
     Rotation2      = s.Read <C3Vector>();
     Translation    = s.Read <C3Vector>();
     FollowParams   = s.Read <float>(FollowParams.Length);
     UnknownReference.Read(s);
     EnabledIn.Read(s);
     Unk2 = s.Read <uint>(Unk2.Length);
 }
예제 #23
0
        public static C3Vector Normalise(this C3Vector vector)
        {
            double lenSq = vector.X * vector.X + vector.Y * vector.Y + vector.Z * vector.Z;

            if (lenSq > 0.00000023841858)
            {
                double invLen = 1.0 / Math.Sqrt(lenSq);
                var    X      = vector.X * invLen;
                var    Y      = vector.Y * invLen;
                var    Z      = vector.Z * invLen;
                return(new C3Vector((float)X, (float)Y, (float)Z));
            }

            return(vector);
        }
예제 #24
0
        public MOLT(BinaryReader br, uint version)
        {
            Type        = br.ReadEnum <LightType>();
            UseAtten    = br.ReadByte();
            Unknown_0x2 = br.ReadBytes(2);
            Color       = br.ReadStruct <CImVector>();
            Position    = br.ReadStruct <C3Vector>();
            Intensity   = br.ReadSingle();

            if (version != 14)
            {
                Unknown_0x18 = br.ReadArray(4, () => br.ReadSingle());
            }

            AttenStart = br.ReadSingle();
            AttenEnd   = br.ReadSingle();
        }
예제 #25
0
        public MDLGEOSECTION(BinaryReader br)
        {
            MaterialId     = br.ReadInt32();
            CenterBounds   = br.ReadStruct <C3Vector>();
            BoundsRadius   = br.ReadSingle();
            SelectionGroup = br.ReadInt32();
            GeosetIndex    = br.ReadInt32();
            Flags          = (GeosSection_Flags)br.ReadInt32();

            br.AssertTag("PVTX");
            NumVertices = br.ReadInt32(); // count of M2Vertex
            br.AssertTag("PTYP");
            NumPrimitiveTypes = br.ReadInt32();
            br.AssertTag("PVTX");
            NumPrimitiveIndices = br.ReadInt32();

            Unknown_0x28 = br.ReadInt32();
            Unknown_0x2C = br.ReadInt32();
        }
예제 #26
0
 public M2Ribbon(BinaryReader br, uint build)
 {
     RibbonId         = br.ReadInt32();
     BoneIndex        = br.ReadUInt32();
     Position         = br.ReadStruct <C3Vector>();
     TextureLookup    = br.ReadM2Array <short>(build);
     MaterialLookup   = br.ReadM2Array <short>(build);
     ColorTrack       = new M2Track <CRGB>(br, build);
     AlphaTrack       = new M2Track <FixedPoint_0_15>(br, build);
     HeightAboveTrack = new M2Track <float>(br, build);
     HeightBelowTrack = new M2Track <float>(br, build);
     EdgesPerSecond   = br.ReadSingle();
     EdgeLifetime     = br.ReadSingle();
     Gravity          = br.ReadSingle();
     TextureRows      = br.ReadUInt16();
     TextureCols      = br.ReadUInt16();
     TextureSlotTrack = new M2Track <ushort>(br, build);
     VisbilityTrack   = new M2Track <bool>(br, build);
 }
예제 #27
0
        public override void Read(BinaryReader stream)
        {
            Unk      = stream.ReadUInt32();
            Bone     = stream.ReadUInt32();
            Position = stream.Read <C3Vector>();
            TextureRef.Read(stream);
            BlendRef.Read(stream);

            Color.Read(stream);
            Opacity.Read(stream);
            HeightAbove.Read(stream);
            HeightBelow.Read(stream);

            Resolution    = stream.ReadSingle();
            Length        = stream.ReadSingle();
            EmissionAngle = stream.ReadSingle();

            RenderFlags = stream.Read <ushort>(RenderFlags.Length);

            Unk1.Read(stream);
            Unk2.Read(stream);

            Unk3 = stream.ReadUInt32();
        }
예제 #28
0
파일: M2Bone.cs 프로젝트: Koward/M2Lib
 public void Load(BinaryReader stream, M2.Format version)
 {
     Debug.Assert(version != M2.Format.Useless);
     KeyBoneId = (KeyBone) stream.ReadInt32();
     Flags = (BoneFlags) stream.ReadUInt32();
     ParentBone = stream.ReadInt16();
     SubmeshId = stream.ReadUInt16();
     if (version > M2.Format.Classic)
     {
         _unknown[0] = stream.ReadUInt16();
         _unknown[1] = stream.ReadUInt16();
     }
     Translation.Load(stream, version);
     if (version > M2.Format.Classic)
     {
         _compressedRotation = new M2Track<M2CompQuat>(new M2CompQuat(32767, 32767, 32767, -1));
         _compressedRotation.Sequences = Rotation.Sequences;
         _compressedRotation.Load(stream, version);
     }
     else
         Rotation.Load(stream, version);
     Scale.Load(stream, version);
     Pivot = stream.ReadC3Vector();
 }
예제 #29
0
파일: CAaBox.cs 프로젝트: Koward/M2Lib
 public CAaBox(C3Vector min, C3Vector max)
 {
     Min = min;
     Max = max;
 }
예제 #30
0
 public static void WriteC3Vector(this BinaryWriter writer, C3Vector vector)
 {
     writer.Write(vector.X);
     writer.Write(vector.Y);
     writer.Write(vector.Z);
 }
예제 #31
0
파일: CAaSphere.cs 프로젝트: Koward/M2Lib
 public CAaSphere(C3Vector pos, float rad)
 {
     Position = pos;
     Radius = rad;
 }
예제 #32
0
파일: C4Plane.cs 프로젝트: Koward/M2Lib
 public C4Plane(C3Vector vec, float dist)
 {
     Normal = vec;
     Distance = dist;
 }
예제 #33
0
        public PRE2(BinaryReader br)
        {
            Size = br.ReadUInt32();
            Load(br);

            EmitterSize           = br.ReadInt32();
            EmitterType           = (EmitterType)br.ReadUInt32();
            Speed                 = br.ReadSingle();
            Variation             = br.ReadSingle();
            Latitude              = br.ReadSingle();
            Longitude             = br.ReadSingle();
            Gravity               = br.ReadSingle();
            ZSource               = br.ReadSingle();
            Lifespan              = br.ReadSingle();
            EmissionRate          = br.ReadSingle();
            Length                = br.ReadSingle();
            Width                 = br.ReadSingle();
            Rows                  = br.ReadInt32();
            Cols                  = br.ReadInt32();
            ParticleType          = (CellType)br.ReadUInt32();
            TailLength            = br.ReadSingle();
            MiddleTime            = br.ReadSingle();
            StartColor            = br.ReadStruct <CBGR>();
            MiddleColor           = br.ReadStruct <CBGR>();
            EndColor              = br.ReadStruct <CBGR>();
            StartAlpha            = br.ReadByte() / 255f;
            MiddleAlpha           = br.ReadByte() / 255f;
            EndAlpha              = br.ReadByte() / 255f;
            StartScale            = br.ReadSingle();
            MiddleScale           = br.ReadSingle();
            EndScale              = br.ReadSingle();
            LifespanUVAnimStart   = br.ReadUInt32();
            LifespanUVAnimEnd     = br.ReadUInt32();
            LifespanUVAnimRepeat  = br.ReadUInt32();
            DecayUVAnimStart      = br.ReadUInt32();
            DecayUVAnimEnd        = br.ReadUInt32();
            DecayUVAnimRepeat     = br.ReadUInt32();
            TailUVAnimStart       = br.ReadUInt32();
            TailUVAnimEnd         = br.ReadUInt32();
            TailUVAnimRepeat      = br.ReadUInt32();
            TailDecayUVAnimStart  = br.ReadUInt32();
            TailDecayUVAnimEnd    = br.ReadUInt32();
            TailDecayUVAnimRepeat = br.ReadUInt32();
            BlendMode             = (BlendMode)br.ReadUInt32();
            TextureId             = br.ReadUInt32();
            PriorityPlane         = br.ReadInt32();
            ReplaceableId         = br.ReadUInt32();
            GeometryModel         = br.ReadString(260).TrimEnd('\0');
            RecursionModel        = br.ReadString(260).TrimEnd('\0');
            TwinkleFPS            = br.ReadSingle();
            TwinkleOnOff          = br.ReadSingle();
            TwinkleScaleMin       = br.ReadSingle();
            TwinkleScaleMax       = br.ReadSingle();
            IvelScale             = br.ReadSingle();
            TumbleX               = br.ReadStruct <CRange>();
            TumbleY               = br.ReadStruct <CRange>();
            TumbleZ               = br.ReadStruct <CRange>();
            Drag                  = br.ReadSingle();
            Spin                  = br.ReadSingle();
            WindVector            = br.ReadStruct <C3Vector>();
            WindTime              = br.ReadSingle();
            FollowSpeed1          = br.ReadSingle();
            FollowScale1          = br.ReadSingle();
            FollowSpeed2          = br.ReadSingle();
            FollowScale2          = br.ReadSingle();
            Splines               = br.ReadStructArray <C3Vector>(br.ReadInt32());
            Squirts               = br.ReadUInt32() == 1; // for footsteps and impact spell effects

            while (true)
            {
                string token = br.ReadString(4);
                br.BaseStream.Position -= 4;
                switch (token)
                {
                case "KP2S": SpeedKeys = new MDXTrack <float>(br); break;

                case "KP2R": VariationKeys = new MDXTrack <float>(br); break;

                case "KP2G": GravityKeys = new MDXTrack <float>(br); break;

                case "KP2W": WidthKeys = new MDXTrack <float>(br); break;

                case "KP2N": LengthKeys = new MDXTrack <float>(br); break;

                case "KVIS": VisibilityKeys = new MDXTrack <float>(br); break;

                case "KP2E": EmissionRateKeys = new MDXTrack <float>(br); break;

                case "KP2L": LatitudeKeys = new MDXTrack <float>(br); break;

                case "KLIF": LifespanKeys = new MDXTrack <float>(br); break;

                case "KPLN": LongitudeKeys = new MDXTrack <float>(br); break;

                case "KP2Z": ZSourceKeys = new MDXTrack <float>(br); break;

                default: return;
                }
            }
        }
예제 #34
0
 public override void Read(BinaryReader stream)
 {
     Normal = stream.Read <C3Vector>();
 }
예제 #35
0
        public byte[] Unk_0x14; // [56]

        public WLX_Block_2(BinaryReader br)
        {
            Unk_0x0  = br.ReadStruct <C3Vector>();
            Unk_0xC  = br.ReadStruct <C2Vector>();
            Unk_0x14 = br.ReadBytes(0x38);
        }
예제 #36
0
 public override void Read(BinaryReader stream)
 {
     Position = stream.Read <C3Vector>();
 }