public ModelSpawn(string directory, BinaryReader reader) { if (reader.BaseStream.Position == reader.BaseStream.Length) { return; } var flags = reader.ReadInt32(); reader.BaseStream.Position += 2 + 4; var position = reader.Read <Vector3>(); position.X -= 32 * 533.333313f; position.Y -= 32 * 533.333313f; var rotation = reader.Read <Vector3>(); var rotationMatrix = RenderingExtensions.FromEulerAngles(rotation.Z * MathHelper.Pi / 180.0f, rotation.X * MathHelper.Pi / 180.0f, rotation.Y * MathHelper.Pi / 180.0f); var translationMatrix = Matrix4.CreateTranslation(position); var scaleMatrix = Matrix4.CreateScale(reader.ReadSingle()); PositionMatrix = rotationMatrix * scaleMatrix * translationMatrix; if ((flags & 0x4) != 0) { reader.BaseStream.Position += 4 * 6; // BBox } var nameLength = reader.ReadInt32(); ModelName = string.Intern(System.Text.Encoding.UTF8.GetString(reader.ReadBytes(nameLength))); }
public ModelSpawn(string directory, BinaryReader reader) { Valid = false; if (reader.BaseStream.Position == reader.BaseStream.Length) { return; } Valid = true; Flags = reader.ReadUInt32(); AdtID = reader.ReadUInt16(); ID = reader.ReadUInt32(); var position = reader.Read <Vector3>(); position.X -= 32 * 533.333313f; position.Y -= 32 * 533.333313f; var rotation = reader.Read <Vector3>(); /// THIS IS OK. IF IT IS BECOMING WRONG, SWAP ROT.Z AND ROT.X var rotationMatrix = RenderingExtensions.FromEulerAngles(rotation.Z * MathHelper.Pi / 180.0f, rotation.X * MathHelper.Pi / 180.0f, rotation.Y * MathHelper.Pi / 180.0f); var translationMatrix = Matrix4.CreateTranslation(position); var scaleMatrix = Matrix4.CreateScale(reader.ReadSingle()); PositionMatrix = rotationMatrix * scaleMatrix * translationMatrix; if (HasBoundingBox) { BoundingBoxLow = reader.Read <Vector3>(); BoundingBoxHigh = reader.Read <Vector3>(); } var nameLength = reader.ReadInt32(); Name = System.Text.Encoding.UTF8.GetString(reader.ReadBytes(nameLength)); Model = WorldModelCache.OpenInstance(directory, Name); foreach (var model in Model.GroupModels) { model.AddInstance(PositionMatrix); } }