protected override void HandleSegmentEndReplacement(SegmentEndReplacement replacement, SegmentEndGeometry endGeo)
        {
            ISegmentEndId oldSegmentEndId = replacement.oldSegmentEndId;
            ISegmentEndId newSegmentEndId = replacement.newSegmentEndId;

            SegmentEndFlags flags;

            if (oldSegmentEndId.StartNode)
            {
                flags = invalidSegmentFlags[oldSegmentEndId.SegmentId].startNodeFlags;
                invalidSegmentFlags[oldSegmentEndId.SegmentId].startNodeFlags.Reset();
            }
            else
            {
                flags = invalidSegmentFlags[oldSegmentEndId.SegmentId].endNodeFlags;
                invalidSegmentFlags[oldSegmentEndId.SegmentId].endNodeFlags.Reset();
            }

            Services.NetService.ProcessNode(endGeo.NodeId(), delegate(ushort nId, ref NetNode node) {
                flags.UpdateDefaults(newSegmentEndId.SegmentId, newSegmentEndId.StartNode, ref node);
                return(true);
            });
            Log._Debug($"JunctionRestrictionsManager.HandleSegmentEndReplacement({replacement}): Segment replacement detected: {oldSegmentEndId.SegmentId} -> {newSegmentEndId.SegmentId} @ {newSegmentEndId.StartNode}");
            SetSegmentEndFlags(newSegmentEndId.SegmentId, newSegmentEndId.StartNode, flags);
        }
Beispiel #2
0
 protected void Invalidate()
 {
     for (int i = 0; i < MAX_NUM_SEGMENTS; ++i)
     {
         SegmentEndGeometries[i] = null;
     }
     lastRemovedSegmentEndId   = null;
     CurrentSegmentReplacement = default(SegmentEndReplacement);
     NotifyGeomentryManager();
 }
        public void OnSegmentEndReplacement(SegmentEndReplacement replacement)
        {
#if DEBUG
            if (DebugSwitch.GeometryDebug.Get())
            {
                Log._Debug(
                    "GeometryManager.OnSegmentEndReplacement(): Detected segment replacement: " +
                    $"{replacement.oldSegmentEndId.SegmentId} -> {replacement.newSegmentEndId.SegmentId}");
            }
#endif
            lock (updateLock) {
                segmentReplacements.Enqueue(replacement);
                stateUpdated = true;
            }
        }
Beispiel #4
0
 public void AddSegment(ushort nodeId, ushort segmentId)
 {
     if (ExtNodes[nodeId].segmentIds.Add(segmentId) &&
         ExtNodes[nodeId].removedSegmentEndId != null)
     {
         var replacement = new SegmentEndReplacement {
             oldSegmentEndId = ExtNodes[nodeId].removedSegmentEndId,
             newSegmentEndId = new SegmentEndId(
                 segmentId,
                 (bool)Services.NetService.IsStartNode(segmentId, nodeId))
         };
         ExtNodes[nodeId].removedSegmentEndId = null;
         Constants.ManagerFactory.GeometryManager.OnSegmentEndReplacement(replacement);
     }
 }
Beispiel #5
0
 public GeometryUpdate(SegmentEndReplacement replacement)
 {
     this.replacement = replacement;
     segment          = null;
     nodeId           = null;
 }
Beispiel #6
0
 public GeometryUpdate(ushort nodeId)
 {
     this.nodeId = nodeId;
     segment     = null;
     replacement = default(SegmentEndReplacement);
 }
Beispiel #7
0
 public GeometryUpdate(ref ExtSegment segment)
 {
     this.segment = segment;
     nodeId       = null;
     replacement  = default(SegmentEndReplacement);
 }
        public void SimulationStep(bool onlyFirstPass = false)
        {
#if DEBUG
            bool logGeometry = DebugSwitch.GeometryDebug.Get();
#else
            const bool logGeometry = false;
#endif
            if (!stateUpdated)
            {
                return;
            }

            NetManager netManager = Singleton <NetManager> .instance;
            if (!onlyFirstPass && (netManager.m_segmentsUpdated || netManager.m_nodesUpdated))
            {
                // TODO maybe refactor NetManager use (however this could influence performance)
                if (logGeometry)
                {
                    Log._Debug(
                        $"GeometryManager.SimulationStep(): Skipping! stateUpdated={stateUpdated}, " +
                        $"m_segmentsUpdated={netManager.m_segmentsUpdated}, " +
                        $"m_nodesUpdated={netManager.m_nodesUpdated}");
                }

                return;
            }

            lock (updateLock) {
                bool updatesMissing = onlyFirstPass;

                for (var pass = 0; pass < (onlyFirstPass ? 1 : 2); ++pass)
                {
                    bool firstPass = pass == 0;

                    int len = updatedSegmentBuckets.Length;
                    for (var i = 0; i < len; i++)
                    {
                        ulong segMask = updatedSegmentBuckets[i];

                        if (segMask == 0uL)
                        {
                            continue;
                        }

                        for (var m = 0; m < 64; m++)
                        {
                            if ((segMask & 1uL << m) == 0uL)
                            {
                                continue;
                            }

                            ushort     segmentId = (ushort)(i << 6 | m);
                            ExtSegment seg       = Constants.ManagerFactory.ExtSegmentManager.ExtSegments[segmentId];

                            if (firstPass ^ !seg.valid)
                            {
                                if (!firstPass)
                                {
                                    updatesMissing = true;
                                    if (logGeometry)
                                    {
                                        Log.Warning(
                                            "GeometryManager.SimulationStep(): Detected invalid " +
                                            $"segment {segmentId} in second pass");
                                    }
                                }

                                continue;
                            }

                            if (logGeometry)
                            {
                                Log._Debug(
                                    $"GeometryManager.SimulationStep(): Notifying observers about " +
                                    $"segment {segmentId}. Valid? {seg.valid} First pass? {firstPass}");
                            }

                            NotifyObservers(new GeometryUpdate(ref seg));
                            updatedSegmentBuckets[i] &= ~(1uL << m);
                        }
                    }

                    len = updatedNodeBuckets.Length;

                    for (var i = 0; i < len; i++)
                    {
                        ulong nodeMask = updatedNodeBuckets[i];

                        if (nodeMask == 0uL)
                        {
                            continue;
                        }

                        for (var m = 0; m < 64; m++)
                        {
                            if ((nodeMask & 1uL << m) == 0uL)
                            {
                                continue;
                            }

                            ushort nodeId = (ushort)(i << 6 | m);
                            bool   valid  = Services.NetService.IsNodeValid(nodeId);

                            if (firstPass ^ !valid)
                            {
                                if (!firstPass)
                                {
                                    updatesMissing = true;

                                    if (logGeometry)
                                    {
                                        Log.Warning(
                                            "GeometryManager.SimulationStep(): Detected invalid " +
                                            $"node {nodeId} in second pass");
                                    }
                                }

                                continue;
                            }

                            if (logGeometry)
                            {
                                Log._Debug(
                                    "GeometryManager.SimulationStep(): Notifying observers about " +
                                    $"node {nodeId}. Valid? {valid} First pass? {firstPass}");
                            }

                            NotifyObservers(new GeometryUpdate(nodeId));
                            updatedNodeBuckets[i] &= ~(1uL << m);
                        }
                    }
                }

                if (updatesMissing)
                {
                    return;
                }

                while (segmentReplacements.Count > 0)
                {
                    SegmentEndReplacement replacement = segmentReplacements.Dequeue();

                    if (logGeometry)
                    {
                        Log._Debug(
                            "GeometryManager.SimulationStep(): Notifying observers about " +
                            $"segment end replacement {replacement}");
                    }

                    NotifyObservers(new GeometryUpdate(replacement));
                }

                stateUpdated = false;
            }
        }
 /// <summary>
 /// Handles a segment replacement
 /// </summary>
 /// <param name="replacement">segment replacement</param>
 /// <param name="newEndGeo">new segment end geometry</param>
 protected virtual void HandleSegmentEndReplacement(SegmentEndReplacement replacement, ref ExtSegmentEnd segEnd)
 {
 }
Beispiel #10
0
        public void SimulationStep(bool onlyFirstPass = false)
        {
#if DEBUGGEO
            bool debug = GlobalConfig.Instance.Debug.Switches[5];
#endif
            if (!stateUpdated)
            {
                return;
            }

            NetManager netManager = Singleton <NetManager> .instance;
            if (!onlyFirstPass && (netManager.m_segmentsUpdated || netManager.m_nodesUpdated))               // TODO maybe refactor NetManager use (however this could influence performance)
            {
#if DEBUGGEO
                if (debug)
                {
                    Log._Debug($"GeometryManager.SimulationStep(): Skipping! stateUpdated={stateUpdated}, m_segmentsUpdated={netManager.m_segmentsUpdated}, m_nodesUpdated={netManager.m_nodesUpdated}");
                }
#endif
                return;
            }

            try {
                Monitor.Enter(updateLock);

                bool updatesMissing = onlyFirstPass;
                for (int pass = 0; pass < (onlyFirstPass ? 1 : 2); ++pass)
                {
                    bool firstPass = pass == 0;

                    int len = updatedSegmentBuckets.Length;
                    for (int i = 0; i < len; i++)
                    {
                        ulong segMask = updatedSegmentBuckets[i];
                        if (segMask != 0uL)
                        {
                            for (int m = 0; m < 64; m++)
                            {
                                if ((segMask & 1uL << m) != 0uL)
                                {
                                    ushort          segmentId       = (ushort)(i << 6 | m);
                                    SegmentGeometry segmentGeometry = SegmentGeometry.Get(segmentId, true);
                                    if (firstPass ^ !segmentGeometry.IsValid())
                                    {
                                        if (!firstPass)
                                        {
                                            updatesMissing = true;
#if DEBUGGEO
                                            if (debug)
                                            {
                                                Log.Warning($"GeometryManager.SimulationStep(): Detected invalid segment {segmentGeometry.SegmentId} in second pass");
                                            }
#endif
                                        }
                                        continue;
                                    }
#if DEBUGGEO
                                    if (debug)
                                    {
                                        Log._Debug($"GeometryManager.SimulationStep(): Notifying observers about segment {segmentGeometry.SegmentId}. Valid? {segmentGeometry.IsValid()} First pass? {firstPass}");
                                    }
#endif
                                    NotifyObservers(new GeometryUpdate(segmentGeometry));
                                    updatedSegmentBuckets[i] &= ~(1uL << m);
                                }
                            }
                        }
                    }

                    len = updatedNodeBuckets.Length;
                    for (int i = 0; i < len; i++)
                    {
                        ulong nodeMask = updatedNodeBuckets[i];
                        if (nodeMask != 0uL)
                        {
                            for (int m = 0; m < 64; m++)
                            {
                                if ((nodeMask & 1uL << m) != 0uL)
                                {
                                    ushort       nodeId       = (ushort)(i << 6 | m);
                                    NodeGeometry nodeGeometry = NodeGeometry.Get(nodeId);
                                    if (firstPass ^ !nodeGeometry.IsValid())
                                    {
                                        if (!firstPass)
                                        {
                                            updatesMissing = true;
#if DEBUGGEO
                                            if (debug)
                                            {
                                                Log.Warning($"GeometryManager.SimulationStep(): Detected invalid node {nodeGeometry.NodeId} in second pass");
                                            }
#endif
                                        }
                                        continue;
                                    }
#if DEBUGGEO
                                    if (debug)
                                    {
                                        Log._Debug($"GeometryManager.SimulationStep(): Notifying observers about node {nodeGeometry.NodeId}. Valid? {nodeGeometry.IsValid()} First pass? {firstPass}");
                                    }
#endif
                                    NotifyObservers(new GeometryUpdate(nodeGeometry));
                                    updatedNodeBuckets[i] &= ~(1uL << m);
                                }
                            }
                        }
                    }
                }

                if (!updatesMissing)
                {
                    while (segmentReplacements.Count > 0)
                    {
                        SegmentEndReplacement replacement = segmentReplacements.Dequeue();
#if DEBUGGEO
                        if (debug)
                        {
                            Log._Debug($"GeometryManager.SimulationStep(): Notifying observers about segment end replacement {replacement}");
                        }
#endif
                        NotifyObservers(new GeometryUpdate(replacement));
                    }

                    stateUpdated = false;
                }
            } finally {
                Monitor.Exit(updateLock);
            }
        }
Beispiel #11
0
 public GeometryUpdate(NodeGeometry nodeGeometry)
 {
     this.nodeGeometry = nodeGeometry;
     segmentGeometry   = null;
     replacement       = default(SegmentEndReplacement);
 }
Beispiel #12
0
 public GeometryUpdate(SegmentGeometry segmentGeometry)
 {
     this.segmentGeometry = segmentGeometry;
     nodeGeometry         = null;
     replacement          = default(SegmentEndReplacement);
 }
 /// <summary>
 /// Handles a segment replacement
 /// </summary>
 /// <param name="replacement">segment replacement</param>
 /// <param name="newEndGeo">new segment end geometry</param>
 protected virtual void HandleSegmentEndReplacement(SegmentEndReplacement replacement, SegmentEndGeometry newEndGeo)
 {
 }