Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reintroduced Simulation Accuracy option #742

Merged
merged 5 commits into from
Feb 29, 2020
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions TLM/TLM/Manager/Impl/OptionsManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace TrafficManager.Manager.Impl {
namespace TrafficManager.Manager.Impl {
using CSUtil.Commons;
using System;
using TrafficManager.API.Manager;
Expand All @@ -18,13 +18,31 @@ protected override void InternalPrintDebugInfo() {
Log.NotImpl("InternalPrintDebugInfo for OptionsManager");
}

/// <summary>
/// Converts value to SimulationAccuracy
/// </summary>
/// <param name="value">Old value</param>
/// <returns>SimulationAccuracy value</returns>
private static SimulationAccuracy ConvertToSimulationAccuracy(byte value) {
return SimulationAccuracy.MaxValue - value;
}

/// <summary>
/// Converts SimulationAccuracy to SimulationAccuracy
/// </summary>
/// <param name="value">SimulationAccuracy value</param>
/// <returns>byte representation of value (backward compatible)</returns>
private static byte ConvertFromSimulationAccuracy(SimulationAccuracy value) {
return (byte)(SimulationAccuracy.MaxValue - value);
}

public bool MayPublishSegmentChanges() {
return Options.instantEffects && !SerializableDataExtension.StateLoading;
}

public bool LoadData(byte[] data) {
if (data.Length >= 1) {
// Options.setSimAccuracy(data[0]);
OptionsGeneralTab.SetSimulationAccuracy(ConvertToSimulationAccuracy(data[0]));
}

if (data.Length >= 2) {
Expand Down Expand Up @@ -223,7 +241,7 @@ int LoadBool (int idx, ILegacySerializableOption opt) {

public byte[] SaveData(ref bool success) {
return new byte[] {
0, // Options.simAccuracy,
ConvertFromSimulationAccuracy(Options.simulationAccuracy),
0, // Options.laneChangingRandomization,
(byte)Options.recklessDrivers,
(byte)(Options.relaxedBusses ? 1 : 0),
Expand Down
19 changes: 11 additions & 8 deletions TLM/TLM/Manager/Impl/TrafficPriorityManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -456,14 +456,17 @@ public bool HasPriority(ushort vehicleId,
// }

// calculate approx. time after which the transit node will be reached
Vector3 targetToNode = transitNode.m_position - vehicle.GetLastFramePosition();
Vector3 targetVel = vehicle.GetLastFrameVelocity();
float targetSpeed = targetVel.magnitude;
float targetDistanceToTransitNode = targetToNode.magnitude;

float targetTimeToTransitNode = targetSpeed > 0
? targetDistanceToTransitNode / targetSpeed
: 0;
float targetTimeToTransitNode = float.NaN;
if (Options.simulationAccuracy >= SimulationAccuracy.High) {
Vector3 targetToNode = transitNode.m_position - vehicle.GetLastFramePosition();
Vector3 targetVel = vehicle.GetLastFrameVelocity();
float targetSpeed = targetVel.magnitude;
float targetDistanceToTransitNode = targetToNode.magnitude;

targetTimeToTransitNode = targetSpeed > 0
? targetDistanceToTransitNode / targetSpeed
: 0;
}

Log._DebugIf(
logPriority,
Expand Down
75 changes: 44 additions & 31 deletions TLM/TLM/Manager/Impl/VehicleBehaviorManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1544,48 +1544,61 @@ ref segEndMan.ExtSegmentEnds[segEndMan.GetIndex(prevPos.m_segment, isTargetStart
}

if (sqrVelocity <= GlobalConfig.Instance.PriorityRules.MaxYieldVelocity
* GlobalConfig.Instance.PriorityRules.MaxYieldVelocity) {
* GlobalConfig.Instance.PriorityRules.MaxYieldVelocity ||
Options.simulationAccuracy >= SimulationAccuracy.Medium) {
if (logPriority) {
Log._Debug(
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
$"{sign} sign. waittime={extVehicle.waitTime}");
}

if (extVehicle.waitTime < GlobalConfig.Instance.PriorityRules.MaxPriorityWaitTime)
{
if (extVehicle.waitTime <
GlobalConfig.Instance.PriorityRules.MaxPriorityWaitTime) {
extVehicle.waitTime++;

Log._DebugIf(
logPriority,
() => $"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
"Setting JunctionTransitState to STOP (wait)");

bool hasPriority = prioMan.HasPriority(
frontVehicleId,
ref vehicleData,
ref prevPos,
ref segEndMan.ExtSegmentEnds[
segEndMan.GetIndex(prevPos.m_segment, isTargetStartNode)],
targetNodeId,
isTargetStartNode,
ref position,
ref targetNode);
if (extVehicle.waitTime >= 2) {
//skip checking of priority if simAccuracy on lowest settings
if (Options.simulationAccuracy <= SimulationAccuracy.VeryLow) {
return VehicleJunctionTransitState.Leave;
}

Log._DebugIf(
logPriority,
() => $"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
$"hasPriority: {hasPriority}");
Log._DebugIf(
logPriority,
() =>
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
"Setting JunctionTransitState to STOP (wait)");

bool hasPriority = prioMan.HasPriority(
frontVehicleId,
ref vehicleData,
ref prevPos,
ref segEndMan.ExtSegmentEnds[
segEndMan.GetIndex(
prevPos.m_segment,
isTargetStartNode)],
targetNodeId,
isTargetStartNode,
ref position,
ref targetNode);

Log._DebugIf(
logPriority,
() =>
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
$"hasPriority: {hasPriority}");

if (!hasPriority) {
vehicleData.m_blockCounter = 0;
return VehicleJunctionTransitState.Stop;
}

if (!hasPriority) {
vehicleData.m_blockCounter = 0;
return VehicleJunctionTransitState.Stop;
Log._DebugIf(
logPriority,
() =>
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
"Setting JunctionTransitState to LEAVE (no conflicting cars)");
return VehicleJunctionTransitState.Leave;
}

Log._DebugIf(
logPriority,
() => $"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
"Setting JunctionTransitState to LEAVE (no conflicting cars)");
return VehicleJunctionTransitState.Leave;
}

Log._DebugIf(
Expand Down
38 changes: 35 additions & 3 deletions TLM/TLM/Patch/_RoadBaseAI/SegmentSimulationStepPatch.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
namespace TrafficManager.Patch._RoadBaseAI {
using API.Traffic.Enums;
using ColossalFramework;
using JetBrains.Annotations;
using TrafficManager.State;
using CSUtil.Commons.Benchmark;


// [Harmony] Manually patched because struct references are used
public class SegmentSimulationStepPatch {

private static ushort lastSimulatedSegmentId = 0;
private static byte trafficMeasurementMod = 0;

/// <summary>
/// Updates lane arrows and performs traffic measurement on segment.
/// </summary>
Expand All @@ -24,9 +31,34 @@ public static void Prefix(RoadBaseAI __instance, ushort segmentID, ref NetSegmen

// ↑↑↑↑
// TODO check if this is required *END*
Constants.ManagerFactory.TrafficMeasurementManager.OnBeforeSimulationStep(
segmentID,
ref data);
#if BENCHMARK
using (Benchmark.MaybeCreateBenchmark(null, "Traffic-measurement")) {
#endif
if (segmentID < lastSimulatedSegmentId) {
// segment simulation restart
++trafficMeasurementMod;
if (trafficMeasurementMod >= 4)
trafficMeasurementMod = 0;
}

lastSimulatedSegmentId = segmentID;

bool doTrafficMeasurement = true;
if (Options.simulationAccuracy == SimulationAccuracy.High ||
Options.simulationAccuracy == SimulationAccuracy.Medium) {
doTrafficMeasurement = (segmentID & 1) == trafficMeasurementMod;
} else if (Options.simulationAccuracy <= SimulationAccuracy.Low) {
doTrafficMeasurement = (segmentID & 3) == trafficMeasurementMod;
}

if (doTrafficMeasurement) {
Constants.ManagerFactory.TrafficMeasurementManager.OnBeforeSimulationStep(
segmentID,
ref data);
}
#if BENCHMARK
}
#endif
}
}
}
Loading