public override void RefreshSegmentEndValues(SegmentEndData data)
 {
     isEnabled = data.CanModifyCorners();
     if (isEnabled)
     {
         value = data.Stretch + 100;
     }
 }
示例#2
0
 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);
 }
示例#4
0
        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();
        }
示例#8
0
 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();
        }
示例#12
0
 public override void RefreshSegmentEndValues(SegmentEndData data)
 {
     isEnabled = data.CanModifyOffset();
     if (isEnabled)
     {
         value = data.CornerOffset;
         bool mixed = !data.HasUniformCornerOffset();
         if (MixedValues != mixed)
         {
             MixedValues = mixed;
             Invalidate();
         }
     }
 }
示例#13
0
        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();
        }
示例#16
0
 protected static bool MainRoadPredicate(SegmentEndData data) => TouchablePredicate(data) && data.IsMainRoad;
示例#17
0
 protected static bool NoMarkingsPredicate(SegmentEndData data) => TouchablePredicate(data) && data.IsRoad;
示例#18
0
 /// <summary>set data value. data refresh is already taken care of</summary>
 public abstract void ApplySegmentEnd(SegmentEndData data);
示例#19
0
 public override void ApplySegmentEnd(SegmentEndData data) =>
 data.CornerOffset = value;
示例#20
0
 public override void ApplySegmentEnd(SegmentEndData data)
 => data.EmbankmentAngleDeg = value;
示例#21
0
 protected static bool TouchablePredicate(SegmentEndData data) => !data.IsUntouchable;
示例#22
0
 public override void ApplySegmentEnd(SegmentEndData data)
 => data.Stretch = value - 100;
示例#23
0
 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;
                }
            }
        }
示例#25
0
 /// <summary>
 /// read isEnabled and value
 /// </summary>
 public abstract void RefreshSegmentEndValues(SegmentEndData data);