示例#1
0
        public Block_0503(EndianReader reader)
            : base(reader, 0x0503)
        {
            reader.ReadInt16(); //0D03
            reader.ReadInt32(); //EOB

            DataCount = reader.ReadInt32();
            unk0 = reader.ReadInt16(); //always 3
            unk1 = reader.ReadByte(); //0, 2 or 3

            if (unk1 != 3)
            {
                for (int i = 0; i < DataCount; i++)
                {
                    var m11 = reader.ReadSingle();
                    var m12 = reader.ReadSingle();
                    var m13 = reader.ReadSingle();
                    reader.ReadSingle(); //0.0f

                    var m21 = reader.ReadSingle();
                    var m22 = reader.ReadSingle();
                    var m23 = reader.ReadSingle();
                    reader.ReadSingle(); //0.0f

                    var m31 = reader.ReadSingle();
                    var m32 = reader.ReadSingle();
                    var m33 = reader.ReadSingle();
                    reader.ReadSingle(); //0.0f

                    var m41 = reader.ReadSingle();
                    var m42 = reader.ReadSingle();
                    var m43 = reader.ReadSingle();
                    reader.ReadSingle(); //1.0f

                    Data.Add(
                        new Matrix4x3(
                            m11, m12, m13,
                            m21, m22, m23,
                            m31, m32, m33,
                            m41, m42, m43));
                }
            }

            //technically not part of the block
            reader.ReadInt16(); //0100
            reader.ReadInt32(); //address
        }
        public StateGroup(EndianReader reader)
        {
            ID = reader.ReadUInt32();
            ChangeMoment = (StateGroupChangeMoment)reader.ReadSByte();

            // Read custom states
            short numCustomStates = reader.ReadInt16();
            CustomStates = new CustomState[numCustomStates];
            for (short i = 0; i < numCustomStates; i++)
                CustomStates[i] = new CustomState(reader);
        }
示例#3
0
        public RTPC(EndianReader reader)
        {
            XAxisParameterID = reader.ReadUInt32();
            YAxisType = (RTPCYAxisType)reader.ReadInt32();

            reader.Skip(5);
            short numPoints = reader.ReadInt16();
            Points = new RTPCPoint[numPoints];

            // Read points
            for (byte i = 0; i < numPoints; i++)
                Points[i] = new RTPCPoint(reader);
        }
示例#4
0
        public Block_3301(EndianReader reader, bool loadSkin, Vertex[] Vertices)
            : base(reader, 0x3301)
        {
            FirstNodeID = reader.ReadInt16();
            NodeCount = reader.ReadInt16();

            if (!loadSkin) reader.Skip(Vertices.Length * 4);
            else foreach (var v in Vertices)
                {
                    var val = Vector.FromUByte4(reader.ReadUInt32());
                    nodes.Add(val);
                    v.Values.Add(new VertexValue(val, VertexValue.ValueType.UInt8_4, "blendindices", 0));
                }
        }
示例#5
0
 public Block_3201(EndianReader reader)
     : base(reader, 0x3201)
 {
     unkID0 = reader.ReadInt16(); //points to first inheritor if skincompound, otherwise parent bone
     unkCount0 = reader.ReadByte(); //number of inheritors/bones (starts at unkID0 and increments through object IDs)
     unkID1 = reader.ReadInt16(); //secondary parent bone
     unkCount1 = reader.ReadByte(); //secondary number of bones
 }
示例#6
0
        public int x4001; //not always 4001

        #endregion Fields

        #region Constructors

        public Block_2E01(EndianReader reader)
            : base(reader, 0x2E01)
        {
            //BaseAddress = (int)reader.Position;
            //x2E01 = reader.ReadInt16();
            //EOBAddress = reader.ReadInt32();

            x1200 = reader.ReadInt16();
            geomUnk01 = reader.ReadByte();
            x4001 = reader.ReadInt16();
        }
示例#7
0
 public Block_2901(EndianReader reader)
     : base(reader, 0x2901)
 {
     InheritID = reader.ReadInt16();
     VertexOffset = reader.ReadInt32();
     IndexOffset = reader.ReadInt32();
 }
示例#8
0
        public VertexValue(XmlNode Node, EndianReader reader)
        {
            if (Convert.ToInt32(Node.Attributes["stream"].Value) > 0) throw new NotSupportedException("Multi-streamed vertices not supported");
            Type = (ValueType)Enum.Parse(typeof(ValueType), Node.Attributes["type"].Value);
            Usage = Node.Attributes["usage"].Value;
            UsageIndex = Convert.ToInt32(Node.Attributes["usageIndex"].Value);
            
            switch (Type)
            {
                case ValueType.Float32_2:
                    Data = new Vector(reader.ReadSingle(), reader.ReadSingle());
                    break;

                case ValueType.Float32_3:
                    Data = new Vector(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                    break;

                case ValueType.Float32_4:
                    Data = new Vector(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                    break;

                case ValueType.Int8_N4:
                    Data = new Vector((float)reader.ReadByte() / (float)0x7F, (float)reader.ReadByte() / (float)0x7F, (float)reader.ReadByte() / (float)0x7F, (float)reader.ReadByte() / (float)0x7F);
                    break;

                case ValueType.UInt8_2:
                    Data = new Vector(reader.ReadByte(), reader.ReadByte(), 0, 0);
                    break;

                case ValueType.UInt8_3:
                    Data = new Vector(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), 0);
                    break;

                case ValueType.UInt8_4:
                    Data = Vector.FromUByte4(reader.ReadUInt32());
                    break;

                case ValueType.UInt8_N2:
                    Data = new Vector((float)reader.ReadByte() / (float)0xFF, (float)reader.ReadByte() / (float)0xFF, 0, 0);
                    break;

                case ValueType.UInt8_N3:
                    Data = new Vector((float)reader.ReadByte() / (float)0xFF, (float)reader.ReadByte() / (float)0xFF, (float)reader.ReadByte() / (float)0xFF, 0);
                    break;

                case ValueType.UInt8_N4:
                    Data = Vector.FromUByteN4(reader.ReadUInt32());
                    break;

                case ValueType.Int16_N3:
                    Data = new Vector(((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF, ((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF, ((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF, 0);
                    break;

                case ValueType.Int16_N4:
                    Data = new Vector(((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF, ((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF, ((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF, ((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF);
                    break;

                case ValueType.UInt16_2:
                    Data = new Vector(reader.ReadUInt16(), reader.ReadUInt16());
                    break;

                case ValueType.UInt16_4:
                    Data = new Vector(reader.ReadUInt16(), reader.ReadUInt16(), reader.ReadUInt16(), reader.ReadUInt16());
                    break;

                case ValueType.UInt16_N2:
                    Data = new Vector((float)reader.ReadUInt16() / (float)0xFFFF, (float)reader.ReadUInt16() / (float)0xFFFF);
                    break;

                case ValueType.UInt16_N4:
                    Data = new Vector((float)reader.ReadUInt16() / (float)0xFFFF, (float)reader.ReadUInt16() / (float)0xFFFF, (float)reader.ReadUInt16() / (float)0xFFFF, (float)reader.ReadUInt16() / (float)0xFFFF);
                    break;

                case ValueType.DecN4:
                    Data = Vector.FromDecN4(reader.ReadUInt32());
                    break;

                case ValueType.UDecN4:
                    Data = Vector.FromUDecN4(reader.ReadUInt32());
                    break;

                case ValueType.DHenN3:
                    Data = Vector.FromDHenN3(reader.ReadUInt32());
                    break;

                case ValueType.UDHenN3:
                    Data = Vector.FromUDHenN3(reader.ReadUInt32());
                    break;

                case ValueType.HenDN3:
                    Data = Vector.FromHenDN3(reader.ReadUInt32());
                    break;

                case ValueType.UHenDN3:
                    Data = Vector.FromUHenDN3(reader.ReadUInt32());
                    break;

                case ValueType.Float16_2:
                    Data = new Vector(Half.ToHalf(reader.ReadUInt16()), Half.ToHalf(reader.ReadUInt16()));
                    break;

                case ValueType.Float16_4:
                    Data = new Vector(Half.ToHalf(reader.ReadUInt16()), Half.ToHalf(reader.ReadUInt16()), Half.ToHalf(reader.ReadUInt16()), Half.ToHalf(reader.ReadUInt16()));
                    break;

                case ValueType.D3DColour:
                    reader.ReadUInt32();
                    break;
            }
        }
示例#9
0
        public BoneBlock_E902(EndianReader reader)
            : base(reader, 0xE902)
        {
            unk00 = reader.ReadSingle();

            _FA02 = new PosBlock_FA02(reader);

            if (reader.PeekUInt16() == 0xEA02)
                _EA02 = new unkBlock_XXXX(reader, 0xEA02);

            _FB02 = new Block_FB02(reader);

            if (reader.PeekUInt16() == 0xEB02)
                _EB02 = new unkBlock_XXXX(reader, 0xEB02);

            _FC02 = new Block_FC02(reader);

            if (reader.PeekUInt16() == 0xEC02)
                _EC02 = new unkBlock_XXXX(reader, 0xEC02);

            _0A03 = new Block_0A03(reader);

            if (reader.PeekUInt16() == 0xED02)
                _ED02 = new unkBlock_XXXX(reader, 0xED02);

            //technically not part of the block
            reader.ReadInt16(); //0100
            reader.ReadInt32(); //address
        }
示例#10
0
        public Block_B903(EndianReader reader)
            : base(reader, 0xB903)
        {
            Name = reader.ReadNullTerminatedString();
            ID = reader.ReadInt16();
            x2400 = reader.ReadInt16();

            unk0 = reader.ReadByte();
            unk1 = reader.ReadInt16(); //possibly flags
            unk2 = reader.ReadInt16(); //possibly flags

            VertCount = reader.ReadInt32();
            FaceCount = reader.ReadInt32();
        }
        public Node(EndianReader reader, bool loadMesh)
        {
            mainAddress = (int)reader.Position;

            xF000 = reader.ReadInt16();
            reader.ReadInt32(); //address

            _B903 = new Block_B903(reader);

            if (reader.PeekUInt16() != 0xF900)
                ReadGeomBlocks(reader, loadMesh);

            Transform = new MatrixBlock_F900(reader);

            #region Block FA00
            reader.ReadInt16(); //FA00
            reader.ReadInt32(); //EOB address
            BoneIndex = reader.ReadInt32(); //node data index
            #endregion

            if (reader.PeekUInt16() == 0x8304) //used on zone/path objects
                _8304 = new ScriptRefBlock_8304(reader);

            if (reader.PeekUInt16() == 0xFD00) //used on template root node
                _FD00 = new Block_FD00(reader);

            #region Block 1501
            reader.ReadInt16(); //1501
            reader.ReadInt32(); //EOB address
            reader.ReadNullTerminatedString();
            #endregion

            if (_2E01 != null)
            {
                reader.ReadInt16(); //0701
                reader.ReadInt32(); //address to 1601 after submeshes
                reader.ReadInt16(); //F300
                reader.ReadInt32(); //address to 0401
                reader.ReadInt32(); //struct count (always 5 so far)

                unkC1 = new int[5];

                //aformentioned struct
                for (int i = 0; i < 5; i++)
                {
                    reader.ReadInt16(); //0301
                    reader.ReadInt32(); //address to 0100
                    unkC1[i] = reader.ReadInt32(); //count (always 0?)
                    reader.ReadInt16(); //0100
                    reader.ReadInt32(); //address to next
                }

                #region Read Submesh Data [0401]
                reader.ReadInt16(); //0401
                reader.ReadInt32(); //address to 0100 after submeshes (end of submesh data)

                subAddress = (int)reader.Position;
                var count = reader.ReadInt32();
                Submeshes = new List<Submesh>();

                for (int i = 0; i < count; i++)
                    Submeshes.Add(new Submesh(reader));
                #endregion

                reader.ReadInt16(); //0100
                reader.ReadInt32(); //address

                if (Submeshes[0]._3201 != null)
                {
                    reader.ReadInt16(); //1601
                    reader.ReadInt32(); //EOB offset

                    reader.ReadInt16(); //1701
                    reader.ReadInt32(); //EOB offset
                    unk0 = reader.ReadInt32();
                    unk1 = reader.ReadInt32();

                    _3301 = new Block_3301(reader, loadMesh, Vertices.Data);

                    if (reader.PeekUInt16() == 0x1A01)
                        _1A01 = new Block_1A01(reader, loadMesh, Vertices.Data);

                    reader.ReadInt16(); //0100
                    reader.ReadInt32(); //address
                }
            }

            if (reader.PeekUInt16() == 0x2B01)
            {
                reader.ReadInt16(); //2B01
                reader.ReadInt32(); //EOB offset
                ParentID = reader.ReadInt32();
            }

            reader.ReadInt16(); //0100
            reader.ReadInt32(); //address
        }
            public Submesh(EndianReader reader)
            {
                reader.ReadInt16(); //0x0501
                reader.ReadInt32(); //EOB offset
                FaceStart = reader.ReadInt32();
                FaceLength = reader.ReadInt32();
                reader.ReadInt16(); //0x0D01
                reader.ReadInt32(); //EOB offset
                VertStart = reader.ReadInt32();
                VertLength = reader.ReadInt32();

                if (reader.PeekUInt16() == 0x3201)
                    _3201 = new Block_3201(reader);

                if (reader.PeekUInt16() == 0x3401)
                    _3401 = new Block_3401(reader);

                #region Block 0B01
                reader.ReadInt16(); //0x0B01
                var addr = reader.ReadInt32(); //EOB offset
                MaterialCount = reader.ReadInt32();
                reader.ReadInt16(); //0x0E01
                reader.ReadInt32(); //EOB offset
                MaterialIndex = reader.ReadInt32();

                reader.SeekTo(addr);
                #endregion

                _1C01 = new Block_1C01(reader);

                _2001 = new Block_2001(reader);

                if (reader.PeekUInt16() == 0x2801)
                    _2801 = new Block_2801(reader);

                reader.ReadInt16(); //0100
                reader.ReadInt32(); //address to next
            }
        private void ReadGeomBlocks(EndianReader reader, bool loadmesh)
        {
            if (reader.PeekUInt16() == 0x2901)
                _2901 = new Block_2901(reader);

            _2E01 = new Block_2E01(reader);

            if(_2901 != null)
            {
                isInheritor = true;

                if (reader.PeekUInt16() == 0x3501)
                    _3501 = new Block_3501(reader);

                reader.ReadInt16(); //2301
                reader.ReadInt32(); //EOB offset

                if (reader.PeekUInt16() == 0x3101)
                {
                    reader.ReadInt16(); //3101
                    reader.ReadInt32(); //EOB offset
                }

                reader.ReadInt16(); //2A01
                reader.ReadInt32(); //EOB offset
            }
            else
            {
                Vertices = new VertexBlock_F100(reader, loadmesh, _2E01.geomUnk01);

                if (_2E01.geomUnk01 != 0 && _2E01.geomUnk01 != 3)
                {
                    _3001 = new UVDataBlock_3001(reader, loadmesh, Vertices.Data);
                    reader.SeekTo(_3001.EOBOffset); //failsafe
                }

                Indices = new IndexBlock_F200(reader, loadmesh);
            }

            BoundingBox = new BoundsBlock_1D01(reader);

            #region Block F800
            reader.ReadInt16(); //F800
            reader.ReadInt32(); //EOB address
            reader.ReadInt32(); //FFFFFFFF
            #endregion

            if (reader.PeekUInt16() == 0x2F01)
                _2F01 = new Block_2F01(reader);
        }
示例#14
0
        private void ReadFormatBlock(EndianReader reader, int blockSize)
        {
            if (blockSize < 8)
                throw new InvalidOperationException("Invalid fmt block size");

            Codec = reader.ReadInt16();
            ChannelCount = reader.ReadInt16();
            SampleRate = reader.ReadInt32();
            BytesPerSecond = reader.ReadInt32();
            BlockAlign = reader.ReadInt16();
            BitsPerSample = reader.ReadInt16();

            short extraDataSize = reader.ReadInt16();
            ExtraData = reader.ReadBytes(extraDataSize);
        }
示例#15
0
 public Block_3401(EndianReader reader)
     : base(reader, 0x3401)
 {
     unkID0 = reader.ReadInt16(); //points to inherited sharingObj
 }
示例#16
0
 public Block_3501(EndianReader reader)
     : base(reader, 0x3501)
 {
     unk0 = reader.ReadInt16();
     unk1 = reader.ReadInt16();
     unk2 = reader.ReadInt16();
     unk3 = reader.ReadInt16(); //4801
     unk4 = reader.ReadInt16(); //4801
     unk5 = reader.ReadInt16(); //4801
 }
示例#17
0
        public VertexBlock_F100(EndianReader reader, bool loadMesh, int geomUnk01)
            : base(reader, 0xF100)
        {
            DataCount = reader.ReadInt32();
            Data = new Vertex[DataCount];
            if (DataCount == 0) return;

            if (geomUnk01 != 134 && geomUnk01 != 142)
            {
                CentreX = reader.ReadInt16();
                CentreY = reader.ReadInt16();
                CentreZ = reader.ReadInt16();
                RadiusX = reader.ReadInt16();
                RadiusY = reader.ReadInt16();
                RadiusZ = reader.ReadInt16();
            }

            if (!loadMesh) reader.SeekTo(EOBOffset);
            else for (int i = 0; i < DataCount; i++)
            {
                Vertex v;

                if (geomUnk01 == 134 || geomUnk01 == 142)
                {
                    v = new Vertex() { FormatName = "S3D_World" };
                    var data = new Vector(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                    v.Values.Add(new VertexValue(data, VertexValue.ValueType.Float32_3, "position", 0));
                }
                else
                {
                    v = new Vertex() { FormatName = "S3D_Compressed" };
                    var data = new Vector(reader.ReadInt16(), reader.ReadInt16(), reader.ReadInt16(), reader.ReadInt16());
                    v.Values.Add(new VertexValue(data, VertexValue.ValueType.Int16_N4, "position", 0));
                }
                Data[i] = v;
            }
        }
示例#18
0
 public Block_FD00(EndianReader reader)
     : base(reader, 0xFD00)
 {
     reader.ReadInt16(); //BA01
     reader.ReadInt32(); //address
     Data = reader.ReadNullTerminatedString();
 }
示例#19
0
        public Block_2801(EndianReader reader)
            : base(reader, 0x2801)
        {
            x81 = reader.ReadByte();
            unk4 = reader.ReadInt32();
            xFF = reader.ReadByte();
            x1300 = reader.ReadInt16(); //mesh type enum? 16 = standard, 18 = skin, 19 = skincompound

            VertexCount = reader.ReadInt16(); //vertex count
            IndexCount = reader.ReadInt16(); //face count * 3 [usually]
            unkID2 = reader.ReadInt32(); //object ID, unknown purpose, same as parent ID, only used on vertless meshes (inheritors)
            unk7 = reader.ReadInt32(); //increases with vert count
            unk8 = reader.ReadInt32(); //seems to increase with mesh size
            unk9a = reader.ReadInt16(); //not used on standard meshes
            unk9b = reader.ReadInt16(); //not used on standard meshes
        }
示例#20
0
        public UVDataBlock_3001(EndianReader reader, bool loadMesh, Vertex[] Vertices)
            : base(reader, 0x3001)
        {
            DataCount = reader.ReadInt32(); //vCount

            x2E00 = reader.ReadInt16(); //2E00
            reader.EndianType = EndianFormat.BigEndian;

            unkUV0 = reader.ReadInt16(); //flags? 0x1C00 when world
            unkUV1 = reader.ReadByte();
            unkUV2 = reader.ReadByte();
            unkUV3 = reader.ReadByte();
            unkUV4 = reader.ReadByte(); //0x00 when world, else 0x20
            DataSize = reader.ReadByte();

            if (!loadMesh) reader.SeekTo(EOBOffset);
            else for (int i = 0; i < DataCount; i++)
            {
                Vector tex0 = new Vector();

                #region switch
                switch (DataSize)
                {
                    case 8:
                        tex0 = Vector.FromUByteN4(reader.ReadUInt32());
                        reader.Skip(0);
                        break;
                    case 12:
                        reader.Skip(4);
                        break;
                    case 16:
                        reader.Skip(12);
                        break;
                    case 20:
                        reader.Skip(16);
                        break;
                    case 24:
                        reader.Skip(16);
                        break;
                    case 28:
                        reader.Skip(20);
                        break;
                    case 32:
                        reader.Skip(16);
                        break;
                    case 36:
                        reader.Skip(24);
                        break;
                    case 44:
                        reader.Skip(28);
                        break;
                }
                #endregion

                int u = reader.ReadInt16();
                int v = reader.ReadInt16();

                //var tex0 = new RealQuat(((float)a + (float)0) / (float)0xFFFF, ((float)b + (float)0) / (float)0xFFFF);
                var tex1 = new Vector((float)u / (float)(0x7FFF), (float)v / (float)(0x7FFF));

                #region switch
                switch (DataSize)
                {
                    case 8:
                        reader.Skip(0);
                        break;
                    case 12:
                        reader.Skip(4);
                        break;
                    case 16:
                        reader.Skip(0);
                        break;
                    case 20:
                        reader.Skip(0);
                        break;
                    case 24:
                        reader.Skip(4);
                        break;
                    case 28:
                        reader.Skip(4);
                        break;
                    case 32:
                        reader.Skip(12);
                        break;
                    case 36:
                        reader.Skip(8);
                        break;
                    case 44:
                        reader.Skip(12);
                        break;
                }
                #endregion

                //Vertices[i].Values.Add(new VertexValue(tex0, 0, "normal", 0));
                Vertices[i].Values.Add(new VertexValue(tex1, VertexValue.ValueType.Int16_N2, "texcoords", 0));
            }

            reader.EndianType = EndianFormat.LittleEndian;
        }
 private void ReadRTPCs(EndianReader reader)
 {
     short numRtpcs = reader.ReadInt16();
     RTPCs = new RTPC[numRtpcs];
     for (short i = 0; i < numRtpcs; i++)
         RTPCs[i] = new RTPC(reader);
 }