public static bool ShouldHideCrossing(ushort nodeID, ushort segmentID)
        {
#if !DEBUG
            if (!Extensions.IsActiveFast)
            {
                // do not hide crossings in asset editor.
                return(false);
            }
#endif
            // TODO move to netnode.updateflags
            NetInfo info       = segmentID.ToSegment().Info;
            bool    isJunction = nodeID.ToNode().m_flags.IsFlagSet(NetNode.Flags.Junction);
            Extensions.Assert(isJunction, $"isJunction | segmentID:{segmentID} nodeID:{nodeID}");
            bool ret0 = NetInfoExt.GetCanHideMarkings(info);

#if DEBUG
            if (Extensions.InAssetEditor)
            {
                //Log._Debug($"Should hide crossings: {ret0} | stack:\n" + System.Environment.StackTrace);
                return(ret0); // always hide crossings in asset editor for quick testing.
            }
#endif
            bool ret1 = TMPEUTILS.HasCrossingBan(segmentID, nodeID) & NetInfoExt.GetCanHideCrossings(info);
            bool ret2 = ret0 & NS2Utils.HideJunctionMarkings(segmentID);
            bool ret  = ret1 | ret2;
            // Log._Debug($"ShouldHideCrossing segmentID={segmentID} nodeID={nodeID} ret0:{ret0} ret1:{ret1} ret2:{ret2} ret:{ret}");
            return(ret);
        }
        public static bool ShouldHideCrossing(ushort nodeID, ushort segmentID) {
#if DEBUG
            if(Extensions.currentMode == AppMode.AssetEditor) {
                return true; // always hide crossings in asset editor for quick testing.
            }
#endif
            NetInfo info = segmentID.ToSegment().Info;
            bool ret1 = info.CanHideCrossings() && TMPEUTILS.HasCrossingBan(segmentID, nodeID);
            bool ret2 = info.CanHideMarkings() && NS2Utils.HideJunction(segmentID);

            //Texture cache is not broken.
            bool ret = PrefabUtils.MaterialCache != null;
            ret &= ret1 || ret2;
            return ret;
        }
        public static bool ShouldHideCrossing(ushort nodeID, ushort segmentID)
        {
            // TODO move to netnode.updateflags or something
            NetInfo info = segmentID.ToSegment().Info;

            // this assertion can fail due to race condition (when node controller post chanes node).
            // therefore i am commenting this out.
            // it would be nice to move as much of this code in simulation thread (eg netnode.updateflags)
            //bool isJunction = nodeID.ToNode().m_flags.IsFlagSet(NetNode.Flags.Junction);
            //Assertion.Assert(isJunction, $"isJunction | segmentID:{segmentID} nodeID:{nodeID}");

            bool ret0 = NetInfoExt.GetCanHideMarkings(info);
            bool ret1 = TMPEUTILS.HasCrossingBan(segmentID, nodeID) & NetInfoExt.GetCanHideCrossings(info);
            bool ret2 = ret0 & NS2Utils.HideJunctionMarkings(segmentID);
            bool ret  = ret1 | ret2;

            // Log.Debug($"ShouldHideCrossing segmentID={segmentID} nodeID={nodeID} ret0:{ret0} ret1:{ret1} ret2:{ret2} ret:{ret}");
            return(ret);
        }