diff --git a/CodeWalker.Core/GameFiles/GameFileCache.cs b/CodeWalker.Core/GameFiles/GameFileCache.cs index cc3cc99..874764e 100644 --- a/CodeWalker.Core/GameFiles/GameFileCache.cs +++ b/CodeWalker.Core/GameFiles/GameFileCache.cs @@ -4425,6 +4425,8 @@ namespace CodeWalker.GameFiles if (rfe.NameLower.EndsWith(".yvr")) { + if (rfe.NameLower == "agencyprep001.yvr") continue; //this file seems corrupted + UpdateStatus(string.Format(entry.Path)); YvrFile yvr = new YvrFile(rfe); diff --git a/CodeWalker.Core/GameFiles/Resources/VehicleRecord.cs b/CodeWalker.Core/GameFiles/Resources/VehicleRecord.cs index d515192..723f428 100644 --- a/CodeWalker.Core/GameFiles/Resources/VehicleRecord.cs +++ b/CodeWalker.Core/GameFiles/Resources/VehicleRecord.cs @@ -107,21 +107,105 @@ namespace CodeWalker.GameFiles // structure data public uint Time; - public short VelocityX; + public short VelocityX; //factor to convert to m/s is 273.0583 .. or 1/0.0036622214, or 32767/120 public short VelocityY; public short VelocityZ; public sbyte RightX; public sbyte RightY; public sbyte RightZ; - public sbyte TopX; - public sbyte TopY; - public sbyte TopZ; - public byte SteeringAngle; - public byte GasPedalPower; - public byte BrakePedalPower; - public byte HandbrakeUsed; + public sbyte ForwardX; + public sbyte ForwardY; + public sbyte ForwardZ; + public sbyte SteeringAngle; // factor to convert to game angle is 20 (ie radians) + public sbyte GasPedalPower; //-100 to +100, negative = reverse + public sbyte BrakePedalPower;//0 to 100 + public byte HandbrakeUsed;//0 or 1 public Vector3 Position; + public Vector3 Velocity + { + get + { + return new Vector3(VelocityX / 273.0583f, VelocityY / 273.0583f, VelocityZ / 273.0583f); + } + set + { + VelocityX = (short)Math.Round(value.X * 273.0583f); + VelocityY = (short)Math.Round(value.Y * 273.0583f); + VelocityZ = (short)Math.Round(value.Z * 273.0583f); + } + } + public Vector3 Forward + { + get + { + return new Vector3(ForwardX / 127.0f, ForwardY / 127.0f, ForwardZ / 127.0f); + } + set + { + ForwardX = (sbyte)Math.Round(value.X * 127.0f); + ForwardY = (sbyte)Math.Round(value.Y * 127.0f); + ForwardZ = (sbyte)Math.Round(value.Z * 127.0f); + } + } + public Vector3 Right + { + get + { + return new Vector3(RightX / 127.0f, RightY / 127.0f, RightZ / 127.0f); + } + set + { + RightX = (sbyte)Math.Round(value.X * 127.0f); + RightY = (sbyte)Math.Round(value.Y * 127.0f); + RightZ = (sbyte)Math.Round(value.Z * 127.0f); + } + } + public float Steering + { + get + { + return SteeringAngle / 20.0f; + } + set + { + SteeringAngle = (sbyte)Math.Round(value * 20.0f); + } + } + public float GasPedal + { + get + { + return GasPedalPower / 100.0f; + } + set + { + GasPedalPower = (sbyte)Math.Round(value * 100.0f); + } + } + public float BrakePedal + { + get + { + return BrakePedalPower / 100.0f; + } + set + { + BrakePedalPower = (sbyte)Math.Round(value * 100.0f); + } + } + public bool Handbrake + { + get + { + return HandbrakeUsed == 1; + } + set + { + HandbrakeUsed = value ? (byte)1 : (byte)0; + } + } + public override void Read(ResourceDataReader reader, params object[] parameters) { // read structure data @@ -132,12 +216,12 @@ namespace CodeWalker.GameFiles this.RightX = (sbyte)reader.ReadByte(); this.RightY = (sbyte)reader.ReadByte(); this.RightZ = (sbyte)reader.ReadByte(); - this.TopX = (sbyte)reader.ReadByte(); - this.TopY = (sbyte)reader.ReadByte(); - this.TopZ = (sbyte)reader.ReadByte(); - this.SteeringAngle = reader.ReadByte(); - this.GasPedalPower = reader.ReadByte(); - this.BrakePedalPower = reader.ReadByte(); + this.ForwardX = (sbyte)reader.ReadByte(); + this.ForwardY = (sbyte)reader.ReadByte(); + this.ForwardZ = (sbyte)reader.ReadByte(); + this.SteeringAngle = (sbyte)reader.ReadByte(); + this.GasPedalPower = (sbyte)reader.ReadByte(); + this.BrakePedalPower = (sbyte)reader.ReadByte(); this.HandbrakeUsed = reader.ReadByte(); this.Position = reader.ReadVector3(); } @@ -151,12 +235,12 @@ namespace CodeWalker.GameFiles writer.Write((byte)this.RightX); writer.Write((byte)this.RightY); writer.Write((byte)this.RightZ); - writer.Write((byte)this.TopX); - writer.Write((byte)this.TopY); - writer.Write((byte)this.TopZ); - writer.Write(this.SteeringAngle); - writer.Write(this.GasPedalPower); - writer.Write(this.BrakePedalPower); + writer.Write((byte)this.ForwardX); + writer.Write((byte)this.ForwardY); + writer.Write((byte)this.ForwardZ); + writer.Write((byte)this.SteeringAngle); + writer.Write((byte)this.GasPedalPower); + writer.Write((byte)this.BrakePedalPower); writer.Write(this.HandbrakeUsed); writer.Write(this.Position); } @@ -164,31 +248,25 @@ namespace CodeWalker.GameFiles { YvrXml.ValueTag(sb, indent, "Time", Time.ToString()); YvrXml.SelfClosingTag(sb, indent, "Position " + FloatUtil.GetVector3XmlString(Position)); - YvrXml.SelfClosingTag(sb, indent, "Velocity " + string.Format("x=\"{0}\" y=\"{1}\" z=\"{2}\"", VelocityX.ToString(), VelocityY.ToString(), VelocityZ.ToString())); - YvrXml.SelfClosingTag(sb, indent, "Right " + string.Format("x=\"{0}\" y=\"{1}\" z=\"{2}\"", RightX.ToString(), RightY.ToString(), RightZ.ToString())); - YvrXml.SelfClosingTag(sb, indent, "Top " + string.Format("x=\"{0}\" y=\"{1}\" z=\"{2}\"", TopX.ToString(), TopY.ToString(), TopZ.ToString())); - YvrXml.ValueTag(sb, indent, "SteeringAngle", SteeringAngle.ToString()); - YvrXml.ValueTag(sb, indent, "GasPedalPower", GasPedalPower.ToString()); - YvrXml.ValueTag(sb, indent, "BrakePedalPower", BrakePedalPower.ToString()); - YvrXml.ValueTag(sb, indent, "HandbrakeUsed", HandbrakeUsed.ToString()); + YvrXml.SelfClosingTag(sb, indent, "Velocity " + FloatUtil.GetVector3XmlString(Velocity)); + YvrXml.SelfClosingTag(sb, indent, "Forward " + FloatUtil.GetVector3XmlString(Forward)); + YvrXml.SelfClosingTag(sb, indent, "Right " + FloatUtil.GetVector3XmlString(Right)); + YvrXml.ValueTag(sb, indent, "Steering", FloatUtil.ToString(Steering)); + YvrXml.ValueTag(sb, indent, "GasPedal", FloatUtil.ToString(GasPedal)); + YvrXml.ValueTag(sb, indent, "BrakePedal", FloatUtil.ToString(BrakePedal)); + YvrXml.ValueTag(sb, indent, "Handbrake", Handbrake.ToString()); } public void ReadXml(XmlNode node) { Time = Xml.GetChildUIntAttribute(node, "Time", "value"); Position = Xml.GetChildVector3Attributes(node, "Position"); - VelocityX = (short)Xml.GetChildIntAttribute(node, "Velocity", "x"); - VelocityY = (short)Xml.GetChildIntAttribute(node, "Velocity", "y"); - VelocityZ = (short)Xml.GetChildIntAttribute(node, "Velocity", "z"); - RightX = (sbyte)Xml.GetChildIntAttribute(node, "Right", "x"); - RightY = (sbyte)Xml.GetChildIntAttribute(node, "Right", "y"); - RightZ = (sbyte)Xml.GetChildIntAttribute(node, "Right", "z"); - TopX = (sbyte)Xml.GetChildIntAttribute(node, "Top", "x"); - TopY = (sbyte)Xml.GetChildIntAttribute(node, "Top", "y"); - TopZ = (sbyte)Xml.GetChildIntAttribute(node, "Top", "z"); - SteeringAngle = (byte)Xml.GetChildUIntAttribute(node, "SteeringAngle", "value"); - GasPedalPower = (byte)Xml.GetChildUIntAttribute(node, "GasPedalPower", "value"); - BrakePedalPower = (byte)Xml.GetChildUIntAttribute(node, "BrakePedalPower", "value"); - HandbrakeUsed = (byte)Xml.GetChildUIntAttribute(node, "HandbrakeUsed", "value"); + Velocity = Xml.GetChildVector3Attributes(node, "Velocity"); + Forward = Xml.GetChildVector3Attributes(node, "Forward"); + Right = Xml.GetChildVector3Attributes(node, "Right"); + Steering = Xml.GetChildFloatAttribute(node, "Steering", "value"); + GasPedal = Xml.GetChildFloatAttribute(node, "GasPedal", "value"); + BrakePedal = Xml.GetChildFloatAttribute(node, "BrakePedal", "value"); + Handbrake = Xml.GetChildBoolAttribute(node, "Handbrake", "value"); } } diff --git a/CodeWalker/Forms/YvrForm.Designer.cs b/CodeWalker/Forms/YvrForm.Designer.cs index 386bff3..c190601 100644 --- a/CodeWalker/Forms/YvrForm.Designer.cs +++ b/CodeWalker/Forms/YvrForm.Designer.cs @@ -41,9 +41,9 @@ this.RightXColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.RightYColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.RightZColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.TopXColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.TopYColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.TopZColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.ForwardXColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.ForwardYColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.ForwardZColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.SteeringAngleColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.GasPedalPowerColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.BrakePedalPowerColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); @@ -81,9 +81,9 @@ this.RightXColumn, this.RightYColumn, this.RightZColumn, - this.TopXColumn, - this.TopYColumn, - this.TopZColumn, + this.ForwardXColumn, + this.ForwardYColumn, + this.ForwardZColumn, this.SteeringAngleColumn, this.GasPedalPowerColumn, this.BrakePedalPowerColumn, @@ -146,20 +146,20 @@ this.RightZColumn.Text = "Right Z"; this.RightZColumn.Width = 48; // - // TopXColumn + // ForwardXColumn // - this.TopXColumn.Text = "Top X"; - this.TopXColumn.Width = 44; + this.ForwardXColumn.Text = "Fwd X"; + this.ForwardXColumn.Width = 44; // - // TopYColumn + // ForwardYColumn // - this.TopYColumn.Text = "Top Y"; - this.TopYColumn.Width = 44; + this.ForwardYColumn.Text = "Fwd Y"; + this.ForwardYColumn.Width = 44; // - // TopZColumn + // ForwardZColumn // - this.TopZColumn.Text = "Top Z"; - this.TopZColumn.Width = 44; + this.ForwardZColumn.Text = "Fwd Z"; + this.ForwardZColumn.Width = 44; // // SteeringAngleColumn // @@ -236,9 +236,9 @@ private System.Windows.Forms.ColumnHeader RightXColumn; private System.Windows.Forms.ColumnHeader RightYColumn; private System.Windows.Forms.ColumnHeader RightZColumn; - private System.Windows.Forms.ColumnHeader TopXColumn; - private System.Windows.Forms.ColumnHeader TopYColumn; - private System.Windows.Forms.ColumnHeader TopZColumn; + private System.Windows.Forms.ColumnHeader ForwardXColumn; + private System.Windows.Forms.ColumnHeader ForwardYColumn; + private System.Windows.Forms.ColumnHeader ForwardZColumn; private System.Windows.Forms.ColumnHeader SteeringAngleColumn; private System.Windows.Forms.ColumnHeader GasPedalPowerColumn; private System.Windows.Forms.ColumnHeader BrakePedalPowerColumn; diff --git a/CodeWalker/Forms/YvrForm.cs b/CodeWalker/Forms/YvrForm.cs index 765a752..5f1c0e3 100644 --- a/CodeWalker/Forms/YvrForm.cs +++ b/CodeWalker/Forms/YvrForm.cs @@ -66,7 +66,7 @@ namespace CodeWalker.Forms private string GenerateText() { StringBuilder sb = new StringBuilder(); - sb.AppendLine("PositionX, PositionY, PositionZ, Time, VelocityX, VelocityY, VelocityZ, RightX, RightY, RightZ, TopX, TopY, TopZ, SteeringAngle, GasPedalPower, BrakePedalPower, HandbrakeUsed"); + sb.AppendLine("PositionX, PositionY, PositionZ, Time, VelocityX, VelocityY, VelocityZ, RightX, RightY, RightZ, ForwardX, ForwardY, ForwardZ, SteeringAngle, GasPedalPower, BrakePedalPower, HandbrakeUsed"); foreach (var entry in yvr.Records.Entries.data_items) { sb.Append(FloatUtil.ToString(entry.Position.X)); @@ -77,31 +77,31 @@ namespace CodeWalker.Forms sb.Append(", "); sb.Append(entry.Time.ToString()); sb.Append(", "); - sb.Append(entry.VelocityX.ToString()); + sb.Append(FloatUtil.ToString(entry.Velocity.X)); sb.Append(", "); - sb.Append(entry.VelocityY.ToString()); + sb.Append(FloatUtil.ToString(entry.Velocity.Y)); sb.Append(", "); - sb.Append(entry.VelocityZ.ToString()); + sb.Append(FloatUtil.ToString(entry.Velocity.Z)); sb.Append(", "); - sb.Append(entry.RightX.ToString()); + sb.Append(FloatUtil.ToString(entry.Right.X)); sb.Append(", "); - sb.Append(entry.RightY.ToString()); + sb.Append(FloatUtil.ToString(entry.Right.Y)); sb.Append(", "); - sb.Append(entry.RightZ.ToString()); + sb.Append(FloatUtil.ToString(entry.Right.Z)); sb.Append(", "); - sb.Append(entry.TopX.ToString()); + sb.Append(FloatUtil.ToString(entry.Forward.X)); sb.Append(", "); - sb.Append(entry.TopY.ToString()); + sb.Append(FloatUtil.ToString(entry.Forward.Y)); sb.Append(", "); - sb.Append(entry.TopZ.ToString()); + sb.Append(FloatUtil.ToString(entry.Forward.Z)); sb.Append(", "); - sb.Append(entry.SteeringAngle.ToString()); + sb.Append(FloatUtil.ToString(entry.Steering)); sb.Append(", "); - sb.Append(entry.GasPedalPower.ToString()); + sb.Append(FloatUtil.ToString(entry.GasPedal)); sb.Append(", "); - sb.Append(entry.BrakePedalPower.ToString()); + sb.Append(FloatUtil.ToString(entry.BrakePedal)); sb.Append(", "); - sb.Append(entry.HandbrakeUsed.ToString()); + sb.Append(entry.Handbrake.ToString()); sb.AppendLine(); } return sb.ToString(); @@ -118,19 +118,19 @@ namespace CodeWalker.Forms FloatUtil.ToString(entry.Position.Y), FloatUtil.ToString(entry.Position.Z), entry.Time.ToString(), - entry.VelocityX.ToString(), - entry.VelocityY.ToString(), - entry.VelocityZ.ToString(), - entry.RightX.ToString(), - entry.RightY.ToString(), - entry.RightZ.ToString(), - entry.TopX.ToString(), - entry.TopY.ToString(), - entry.TopZ.ToString(), - entry.SteeringAngle.ToString(), - entry.GasPedalPower.ToString(), - entry.BrakePedalPower.ToString(), - entry.HandbrakeUsed.ToString(), + FloatUtil.ToString(entry.Velocity.X), + FloatUtil.ToString(entry.Velocity.Y), + FloatUtil.ToString(entry.Velocity.Z), + FloatUtil.ToString(entry.Right.X), + FloatUtil.ToString(entry.Right.Y), + FloatUtil.ToString(entry.Right.Z), + FloatUtil.ToString(entry.Forward.X), + FloatUtil.ToString(entry.Forward.Y), + FloatUtil.ToString(entry.Forward.Z), + FloatUtil.ToString(entry.Steering), + FloatUtil.ToString(entry.GasPedal), + FloatUtil.ToString(entry.BrakePedal), + entry.Handbrake.ToString(), }; MainListView.Items.Add(new ListViewItem(row)); }