Esempio n. 1
0
        public override void RenderOverlay(RenderManager.CameraInfo cameraInfo)
        {
            base.RenderOverlay(cameraInfo);
            if (HoveredSegmentId == 0 || HoveredNodeId == 0)
            {
                return;
            }
            NetNode.Flags nodeFlags = HoveredNodeId.ToNode().m_flags;
            Color         color     = GetToolColor(Input.GetMouseButton(0), false);

            NetTool.RenderOverlay(
                cameraInfo,
                ref HoveredSegmentId.ToSegment(),
                color,
                color);
        }
        bool IsSuitableRoadForRoadBridge()
        {
            if (!HoveredSegmentId.ToSegment().CanConnectPath())
            {
                return(false);
            }
            float minDistance = 1 * NetUtil.MPU + NetUtil.MaxNodeHW(HoveredNodeId);

            if (HoveredNodeId.ToNode().m_flags.IsFlagSet(NetNode.Flags.Middle))
            {
                return(true);
            }
            var   diff  = HitPos - HoveredNodeId.ToNode().m_position;
            float diff2 = diff.sqrMagnitude;

            return(diff2 > minDistance * minDistance);
        }
Esempio n. 3
0
        /// <summary>
        /// Calculates accurate vertical element of raycast hit position.
        /// </summary>
        internal float GetAccurateHitHeight()
        {
            // cache result.
            float current_hitH = raycastOutput.m_hitPos.y;

            if (KianCommons.Math.MathUtil.EqualAprox(current_hitH, prev_H, 1e-12f))
            {
                return(prev_H_Fixed);
            }
            prev_H = current_hitH;

            if (HoveredSegmentId.ToSegment().GetClosestLanePosition(
                    raycastOutput.m_hitPos,
                    NetInfo.LaneType.All,
                    VehicleInfo.VehicleType.All,
                    out Vector3 pos,
                    out uint laneId,
                    out int laneIndex,
                    out float laneOffset))
            {
                return(prev_H_Fixed = pos.y);
            }
            return(prev_H_Fixed = current_hitH + 0.5f);
        }
Esempio n. 4
0
        // simulation thread
        protected bool DetermineHoveredElements()
        {
            HoveredSegmentId = 0;
            HoveredNodeId    = 0;
            if (!m_mouseRayValid)
            {
                return(false);
            }

            // find currently hovered node
            RaycastInput nodeInput = new RaycastInput(m_mouseRay, m_mouseRayLength)
            {
                m_netService      = GetService(),
                m_ignoreTerrain   = true,
                m_ignoreNodeFlags = NetNode.Flags.None,
            };

            if (RayCast(nodeInput, out raycastOutput))
            {
                HoveredNodeId = raycastOutput.m_netNode;
            }

            HoveredSegmentId = GetSegmentFromNode(raycastOutput.m_hitPos);

            if (HoveredSegmentId != 0)
            {
                Debug.Assert(HoveredNodeId != 0, "unexpected: HoveredNodeId == 0");
                return(true);
            }

            // find currently hovered segment
            var segmentInput = new RaycastInput(m_mouseRay, m_mouseRayLength)
            {
                m_netService         = GetService(),
                m_ignoreTerrain      = true,
                m_ignoreSegmentFlags = NetSegment.Flags.None
            };

            if (RayCast(segmentInput, out raycastOutput))
            {
                HoveredSegmentId = raycastOutput.m_netSegment;
            }

            if (HoveredNodeId <= 0 && HoveredSegmentId > 0)
            {
                // alternative way to get a node hit: check distance to start and end nodes
                // of the segment
                ushort startNodeId = HoveredSegmentId.ToSegment().m_startNode;
                ushort endNodeId   = HoveredSegmentId.ToSegment().m_endNode;

                var vStart = raycastOutput.m_hitPos - startNodeId.ToNode().m_position;
                var vEnd   = raycastOutput.m_hitPos - endNodeId.ToNode().m_position;

                float startDist = vStart.magnitude;
                float endDist   = vEnd.magnitude;

                if (startDist < endDist && startDist < 75f)
                {
                    HoveredNodeId = startNodeId;
                }
                else if (endDist < startDist && endDist < 75f)
                {
                    HoveredNodeId = endNodeId;
                }
            }
            return(HoveredNodeId != 0 || HoveredSegmentId != 0);
        }
        private bool DetermineHoveredElements()
        {
            HoveredSegmentId = 0;
            HoveredNodeId    = 0;
            HitPos           = Vector3.zero;
            if (!IsMouseRayValid)
            {
                return(false);
            }

            // find currently hovered node
            RaycastInput nodeInput = new RaycastInput(m_mouseRay, m_mouseRayLength)
            {
                m_netService =
                {
                    // find road segments
                    m_itemLayers = ItemClass.Layer.Default | ItemClass.Layer.MetroTunnels,
                    m_service    = ItemClass.Service.Road
                },
                m_ignoreTerrain   = true,
                m_ignoreNodeFlags = NetNode.Flags.None
            };

            if (RayCast(nodeInput, out RaycastOutput nodeOutput))
            {
                HoveredNodeId = nodeOutput.m_netNode;
                HitPos        = nodeOutput.m_hitPos;
            }

            HoveredSegmentId = GetSegmentFromNode();

            if (HoveredSegmentId != 0)
            {
                Debug.Assert(HoveredNodeId != 0, "unexpected: HoveredNodeId == 0");
                return(true);
            }

            // find currently hovered segment
            var segmentInput = new RaycastInput(m_mouseRay, m_mouseRayLength)
            {
                m_netService =
                {
                    // find road segments
                    m_itemLayers = ItemClass.Layer.Default | ItemClass.Layer.MetroTunnels,
                    m_service    = ItemClass.Service.Road
                },
                m_ignoreTerrain      = true,
                m_ignoreSegmentFlags = NetSegment.Flags.None
            };

            if (RayCast(segmentInput, out RaycastOutput segmentOutput))
            {
                HoveredSegmentId = segmentOutput.m_netSegment;
                HitPos           = segmentOutput.m_hitPos;
            }


            if (HoveredNodeId <= 0 && HoveredSegmentId > 0)
            {
                // alternative way to get a node hit: check distance to start and end nodes
                // of the segment
                ushort startNodeId = HoveredSegmentId.ToSegment().m_startNode;
                ushort endNodeId   = HoveredSegmentId.ToSegment().m_endNode;

                var vStart = segmentOutput.m_hitPos - startNodeId.ToNode().m_position;
                var vEnd   = segmentOutput.m_hitPos - endNodeId.ToNode().m_position;

                float startDist = vStart.magnitude;
                float endDist   = vEnd.magnitude;

                if (startDist < endDist && startDist < 75f)
                {
                    HoveredNodeId = startNodeId;
                }
                else if (endDist < startDist && endDist < 75f)
                {
                    HoveredNodeId = endNodeId;
                }
            }
            return(HoveredNodeId != 0 || HoveredSegmentId != 0);
        }