public override void RefreshSegmentEndValues(SegmentEndData data) { isEnabled = data.CanModifyCorners(); if (isEnabled) { value = data.Stretch + 100; } }
public override void RefreshSegmentEndValues(SegmentEndData data) { isEnabled = data.CanModifyCorners(); if (isEnabled) { value = data.SlopeAngleDeg; } }
public static void PasteSegmentEnd(SegmentEndData segmentEndData, ushort targetNodeID, ushort targetSegmentID) { if (segmentEndData != null) { segmentEndData.SegmentID = targetSegmentID; segmentEndData.NodeID = targetNodeID; } segEndMan.SetAt(targetSegmentID, targetNodeID, segmentEndData); }
public static RoadPair Get(SegmentEndData first, SegmentEndData second) { var cos = Mathf.Clamp(NormalizeDotXZ(first.RawSegmentBezier.StartDirection, second.RawSegmentBezier.StartDirection), -1f, 1f); var pow = Mathf.Acos(cos) / Mathf.PI * 2 - 1; return(new RoadPair() { First = first?.Id ?? 0, Second = second?.Id ?? 0, Weight = Mathf.Pow(first.Weight * second.Weight, pow), }); }
static void PasteSegmentEnd( SegmentEndData data, ushort nodeID1, ushort nodeID2, ushort targetSegmentID) { if (data != null) { ushort nodeID = data.NodeID; if (nodeID == nodeID1 || nodeID == nodeID2) { MoveItIntegration.PasteSegmentEnd(data, targetNodeID: nodeID, targetSegmentID: targetSegmentID); } } }
public static void PasteSegmentEnd( SegmentEndData segmentEndData, ushort targetSegmentID, Dictionary <InstanceID, InstanceID> map) { if (segmentEndData != null) { ushort nodeID = MappedNodeID(map, segmentEndData.NodeID); PasteSegmentEnd( segmentEndData: segmentEndData, targetNodeID: nodeID, targetSegmentID: targetSegmentID); } }
static void Postfix(ushort segmentID) { if (!NetUtil.IsSegmentValid(segmentID)) { return; } SegmentEndData segStart = SegmentEndManager.Instance.GetAt(segmentID, true); SegmentEndData segEnd = SegmentEndManager.Instance.GetAt(segmentID, false); segStart?.OnAfterCalculate(); segEnd?.OnAfterCalculate(); }
public static void PasteSegmentEnd(SegmentEndData segmentEndData, ushort targetNodeID, ushort targetSegmentID) { if (segmentEndData != null) { segmentEndData = segmentEndData.Clone(); segmentEndData.SegmentID = targetSegmentID; segmentEndData.NodeID = targetNodeID; } segEndMan.SetAt( segmentID: targetSegmentID, nodeID: targetNodeID, value: segmentEndData); }
public void ApplySegmentEnd() { SegmentEndData data = (root_ as UISegmentEndControllerPanel).SegmentEndData; if (data == null) { return; } data.NoMarkings = this.isChecked; Log.Debug($"UIHideMarkingsCheckbox.ApplySegmentEnd(): {data}" + $"isChecked={isChecked} " + $"data.NoMarkings is set to {data.NoMarkings}"); data.Update(); }
public static void PasteSegmentEnd(SegmentEndData segmentEndData, ushort targetNodeID, ushort targetSegmentID) { Log.Info($"PasteSegmentEnd({segmentEndData}, targetNodeID:{targetNodeID}, targetSegmentID:{targetNodeID})", true); if (segmentEndData != null) { segmentEndData = segmentEndData.Clone(); segmentEndData.SegmentID = targetSegmentID; segmentEndData.NodeID = targetNodeID; } segEndMan.SetAt( segmentID: targetSegmentID, nodeID: targetNodeID, value: segmentEndData); }
public void ApplySegmentEnd() { SegmentEndData data = (root_ as UISegmentEndControllerPanel).SegmentEndData; if (data == null) { return; } data.Nodeless = this.isChecked; Log.Debug($"{ThisMethod}: {data}" + $"isChecked={isChecked} " + $"data.Nodeless is set to {data.Nodeless}"); data.Update(); }
public override void RefreshSegmentEndValues(SegmentEndData data) { isEnabled = data.CanModifyOffset(); if (isEnabled) { value = data.CornerOffset; bool mixed = !data.HasUniformCornerOffset(); if (MixedValues != mixed) { MixedValues = mixed; Invalidate(); } } }
public bool Left; // going away from the junction. public void Apply() { Assert(!refreshing_, "!refreshing_"); Log.Debug("LockDirCheckbox.Apply called()\n" /* + Environment.StackTrace*/); SegmentEndData data = root_?.GetData() as SegmentEndData; if (data == null) { return; } data.Corner(Left).LockLength = this.isChecked; if (ControlIsPressed && Mirror != null) { Mirror.isChecked = isChecked; } data.RefreshAndUpdate(); root_.Refresh(); }
public void Apply() { if (VERBOSE) { Log.Debug(ThisMethod + " called\n" + Environment.StackTrace); } if (root_ is UINodeControllerPanel) { throw new NotImplementedException(); } else if (root_ is UISegmentEndControllerPanel segPanel) { ApplySegmentEnd(); Assertion.Assert(!refreshing_, "!refreshing_"); SegmentEndData data = segPanel.SegmentEndData; data?.RefreshAndUpdate(); segPanel.Refresh(); } else { throw new Exception("Unreachable code. root_=" + root_); } }
public void Apply() { Log.Debug("UIUnFlattenJunctionsCheckbox.Apply called()\n" /* + Environment.StackTrace*/); SegmentEndData data = root_?.GetData() as SegmentEndData; if (data == null) { return; } data.FlatJunctions = this.isChecked; if (!this.isChecked) { data.Twist = false; } else { data.Twist = data.DefaultTwist; } data.DeltaSlopeAngleDeg = 0; Assert(!refreshing_, "!refreshing_"); data.RefreshAndUpdate(); root_.Refresh(); }
protected static bool MainRoadPredicate(SegmentEndData data) => TouchablePredicate(data) && data.IsMainRoad;
protected static bool NoMarkingsPredicate(SegmentEndData data) => TouchablePredicate(data) && data.IsRoad;
/// <summary>set data value. data refresh is already taken care of</summary> public abstract void ApplySegmentEnd(SegmentEndData data);
public override void ApplySegmentEnd(SegmentEndData data) => data.CornerOffset = value;
public override void ApplySegmentEnd(SegmentEndData data) => data.EmbankmentAngleDeg = value;
protected static bool TouchablePredicate(SegmentEndData data) => !data.IsUntouchable;
public override void ApplySegmentEnd(SegmentEndData data) => data.Stretch = value - 100;
public override void ApplySegmentEnd(SegmentEndData data) => data.SlopeAngleDeg = value;
/// <param name="segmentID">segment to calculate corner</param> /// <param name="start">true for start node</param> /// <param name="leftSide">going away from the node</param> public static void Postfix( ushort segmentID, bool start, bool leftSide, ref Vector3 cornerPos, ref Vector3 cornerDirection) { SegmentEndData data = SegmentEndManager.Instance.GetAt(segmentID, start); if (data == null && !Settings.GameConfig.UnviversalSlopeFixes) { return; } ushort nodeID = segmentID.ToSegment().GetNode(start); bool middle = nodeID.ToNode().m_flags.IsFlagSet(NetNode.Flags.Middle); if (!middle) { bool flatJunctions = data?.FlatJunctions ?? segmentID.ToSegment().Info.m_flatJunctions; bool slope = !flatJunctions; if (slope) { FixCornerPos( nodeID.ToNode().m_position, segmentID.ToSegment().GetDirection(nodeID), ref cornerPos); } else { // left segment going away from the node is right segment going toward the node. ushort neighbourSegmentID = leftSide ? segmentID.ToSegment().GetRightSegment(nodeID) : segmentID.ToSegment().GetLeftSegment(nodeID); var neighbourData = SegmentEndManager.Instance.GetAt(neighbourSegmentID, nodeID); bool neighbourFlatJunctions = neighbourData?.FlatJunctions ?? neighbourSegmentID.ToSegment().Info.m_flatJunctions; bool neighbourslope = !neighbourFlatJunctions; bool twist; if (data != null) { twist = data.Twist; } else { twist = segmentID.ToSegment().Info.m_flatJunctions; } //twist |= segmentID.ToSegment().Info.m_flatJunctions; if (twist && neighbourslope) { Vector3 nodePos = nodeID.ToNode().m_position; Vector3 neighbourEndDir = neighbourSegmentID.ToSegment().GetDirection(nodeID); if (data != null) { Log.Debug($"calling FixCornerPosMinor(" + $"nodePos: {nodePos}, neighbourEndDir: {neighbourEndDir}, \n" + $"cornerDir: ref {cornerDirection}, cornerPos: ref {cornerPos}) : {data} "); } FixCornerPosMinor( nodePos: nodePos, neighbourEndDir: neighbourEndDir, cornerDir: ref cornerDirection, cornerPos: ref cornerPos); if (data != null) { Log.Debug($"output FixCornerPosMinor->" + $"(cornerDir: ref {cornerDirection}, cornerPos: ref {cornerPos}) : {data} "); } } } } if (data != null) { // manual adjustments: data.ApplyCornerAdjustments(ref cornerPos, ref cornerDirection, leftSide); } else { // if vector dir is not limitted inside ApplyCornerAdjustments then do it here. // this must NOT be done before ApplyCornerAdjustments(). float absY = Mathf.Abs(cornerDirection.y); if (absY > 2) { // fix dir length so that y is 2: cornerDirection *= 2 / absY; } } }
/// <summary> /// read isEnabled and value /// </summary> public abstract void RefreshSegmentEndValues(SegmentEndData data);