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); }
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); }
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); }
public UVDataBlock_3001(EndianReader reader, bool loadMesh, Vertex[] Vertices) : base(reader, 0x3001) { DataCount = reader.ReadInt32(); //vCount x2E00 = reader.ReadInt16(); //2E00 reader.Format = EndianFormat.Big; 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.Format = EndianFormat.Little; }
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 Block_FD00(EndianReader reader) : base(reader, 0xFD00) { reader.ReadInt16(); //BA01 reader.ReadInt32(); //address Data = reader.ReadNullTerminatedString(); }
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; } }
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); }
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)); } }
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 }
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(); }
public Block_2901(EndianReader reader) : base(reader, 0x2901) { InheritID = reader.ReadInt16(); VertexOffset = reader.ReadInt32(); IndexOffset = reader.ReadInt32(); }
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 }
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 }
public Block_3401(EndianReader reader) : base(reader, 0x3401) { unkID0 = reader.ReadInt16(); //points to inherited sharingObj }
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); }
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 }
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; } }
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(); }