示例#1
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
        }
            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
            }
        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
        }
        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);
        }