Example #1
0
        /// <summary>
        /// Raycast the hazard for intesections
        /// </summary>
        /// <param name="ray"></param>
        /// <param name="hit"></param>
        /// <param name="distance"></param>
        /// <returns></returns>
        public bool Raycast(Ray ray, CourseBase.HazardHit hit, float distance = 10)
        {
            Vector3[] points = Lines.Points;
            Color[]   colors = Lines.Colors;

            if (!InBounds(ray.origin))
            {
                return(false);
            }
            if (!ray.origin.IsInside(points))
            {
                return(false);
            }

            distance = Mathf.Max(distance, Lines.Points.LineLength());
            Vector3 startPosition = ray.origin + ray.direction.normalized * distance;

            bool crossed = false;

            for (int i = 0; i < points.Length; ++i)
            {
                if (MathUtility.IsSegmentSegment(ray.origin.ToVector2(), startPosition.ToVector2(), points.GetAt(i - 1).ToVector2(), points.GetAt(i).ToVector2()))
                {
                    string name = CourseBase.HazardLayers.Find(h => h.hazardColor == colors.GetAt(i - 1)).name;
                    if (CourseBase.IsHazard(name))
                    {
                        Vector3 point = MathUtility.LineLine(ray.origin.ToVector2(), startPosition.ToVector2(), points.GetAt(i - 1).ToVector2(), points.GetAt(i).ToVector2()).Value;
                        point = new Vector3(point.x, CourseBase.MeshHeight(point.x, point.y), point.y);

                        if (hit.point == Vector3.zero || (point - ray.origin).magnitude < (hit.point - ray.origin).magnitude)
                        {
                            hit.type       = CourseBase.HazardType(name);
                            hit.point      = point;
                            hit.pointIndex = i;
                            hit.InstanceID = Info.InstanceID;
                            crossed        = true;
                        }
                    }
                }
            }

            return(crossed);
        }