public void Read(FileReader reader) { Position = reader.Position; Visible = reader.ReadUInt32() == 1; if (!Visible) { return; } reader.ReadBytes(28); Scale = reader.ReadVec3(); Rotation = reader.ReadVec3(); Translation = reader.ReadVec3(); Unknowns = reader.ReadBytes(20); ulong SubMeshArrayOffsetPtr = reader.ReadUInt64(); ulong unkoff = reader.ReadUInt64(); ulong ChildNodeOffsetPtr = reader.ReadUInt64(); reader.ReadUInt32(); Matrix4 TranslateMat = Matrix4.CreateTranslation(Translation); Matrix4 RotXMat = Matrix4.CreateRotationX(Rotation.X); Matrix4 RotYMat = Matrix4.CreateRotationY(Rotation.Y); Matrix4 RotZMat = Matrix4.CreateRotationZ(Rotation.Z); Matrix4 ScaleMat = Matrix4.CreateTranslation(Scale); Transform = ScaleMat * (RotXMat * RotYMat * RotZMat) * TranslateMat; if (SubMeshArrayOffsetPtr != 0) { int i = 0; while (true) { reader.SeekBegin((int)SubMeshArrayOffsetPtr + i * 8); ulong SubMeshArrayOffset1 = reader.ReadUInt64(); if (SubMeshArrayOffset1 == 0) { break; } if (SubMeshArrayOffset1 != 0) { reader.SeekBegin(SubMeshArrayOffset1); SubMesh subMesh = new SubMesh(this); subMesh.Read(reader); SubMeshes.Add(subMesh); } i++; } } if (ChildNodeOffsetPtr != 0) { //2 possible children for (int i = 0; i < 2; i++) { reader.SeekBegin((int)ChildNodeOffsetPtr + i * 8); ulong ChildNodeOffset1 = reader.ReadUInt64(); if (ChildNodeOffset1 != 0) { reader.SeekBegin(ChildNodeOffset1); Node ChildNode = new Node(); ChildNode.Read(reader); Children.Add(ChildNode); } } } //After repeats a fairly similar structure, with SRT values //Unsure what it's used for? }
public void Read(FileReader reader) { Position = reader.Position; Visible = reader.ReadUInt32() == 1; Scale = reader.ReadVec3(); Rotation = reader.ReadVec3(); Translation = reader.ReadVec3(); Unknowns = reader.ReadBytes(16); uint SubMeshArrayOffsetPtr = reader.ReadUInt32(); uint ChildNodeOffsetPtr = reader.ReadUInt32(); Matrix4 TranslateMat = Matrix4.CreateTranslation(Translation); Matrix4 RotXMat = Matrix4.CreateRotationX(Rotation.X); Matrix4 RotYMat = Matrix4.CreateRotationY(Rotation.Y); Matrix4 RotZMat = Matrix4.CreateRotationZ(Rotation.Z); Matrix4 ScaleMat = Matrix4.CreateTranslation(Scale); Transform = ScaleMat * (RotXMat * RotYMat * RotZMat) * TranslateMat; if (SubMeshArrayOffsetPtr != 0) { //4 possible sub meshes reader.SeekBegin(SubMeshArrayOffsetPtr); uint SubMeshArrayOffset1 = reader.ReadUInt32(); uint SubMeshArrayOffset2 = reader.ReadUInt32(); uint SubMeshArrayOffset3 = reader.ReadUInt32(); uint SubMeshArrayOffset4 = reader.ReadUInt32(); if (SubMeshArrayOffset1 != 0) { reader.SeekBegin(SubMeshArrayOffset1); SubMesh subMesh = new SubMesh(this); subMesh.Read(reader); SubMeshes.Add(subMesh); } if (SubMeshArrayOffset2 != 0) { reader.SeekBegin(SubMeshArrayOffset2); SubMesh subMesh = new SubMesh(this); subMesh.Read(reader); SubMeshes.Add(subMesh); } if (SubMeshArrayOffset3 != 0) { reader.SeekBegin(SubMeshArrayOffset3); SubMesh subMesh = new SubMesh(this); subMesh.Read(reader); SubMeshes.Add(subMesh); } if (SubMeshArrayOffset4 != 0) { reader.SeekBegin(SubMeshArrayOffset4); SubMesh subMesh = new SubMesh(this); subMesh.Read(reader); SubMeshes.Add(subMesh); } } if (ChildNodeOffsetPtr != 0) { //4 possible children reader.SeekBegin(ChildNodeOffsetPtr); uint ChildNodeOffset1 = reader.ReadUInt32(); uint ChildNodeOffset2 = reader.ReadUInt32(); uint ChildNodeOffset3 = reader.ReadUInt32(); uint ChildNodeOffset4 = reader.ReadUInt32(); if (ChildNodeOffset1 != 0) { reader.SeekBegin(ChildNodeOffset1); Node ChildNode = new Node(); ChildNode.Read(reader); Children.Add(ChildNode); } if (ChildNodeOffset2 != 0) { reader.SeekBegin(ChildNodeOffset2); Node ChildNode = new Node(); ChildNode.Read(reader); Children.Add(ChildNode); } if (ChildNodeOffset3 != 0) { reader.SeekBegin(ChildNodeOffset3); Node ChildNode = new Node(); ChildNode.Read(reader); Children.Add(ChildNode); } if (ChildNodeOffset4 != 0) { reader.SeekBegin(ChildNodeOffset4); Node ChildNode = new Node(); ChildNode.Read(reader); Children.Add(ChildNode); } } //After repeats a fairly similar structure, with SRT values //Unsure what it's used for? }