示例#1
0
        public static Vector3 GetOffset(Vector3 atPosition, Transform cameraTransform)
        {
            HB hb = HB.Instance;

            if (hb == null)
            {
                return(new Vector3(0.0f, 0.0f, 0.0f));
            }

            Vector3    offset;
            HBSettings settings = GetSettings();

#if UNITY_EDITOR
            if (settings.AttachToCameraInEditor)
            {
                offset = HBUtils.GetOffset(atPosition, settings, cameraTransform);
            }
            else
            {
                offset = HBUtils.GetOffset(atPosition, settings);
            }
#else
            offset = HBUtils.GetOffset(atPosition, settings, cameraTransform);
#endif

            return(offset);
        }
示例#2
0
        private void OnDrawGizmos()
        {
            Vector3    position;
            HBSettings settings = new HBSettings(BendingMode);

            if (AttachToCamera)
            {
                if (Camera.main == null)
                {
                    return;
                }
                position = Camera.main.transform.position + Vector3.Scale(new Vector3(HorizonXOffset, HorizonYOffset, HorizonZOffset), settings.Mask);
            }
            else
            {
                position = transform.position + Vector3.Scale(new Vector3(HorizonXOffset, HorizonYOffset, HorizonZOffset), settings.Mask);
            }

            if (FixBoundsRadius > 0.1f)
            {
                Handles.color = Color.yellow;
                Handles.DrawWireDisc(position, settings.Up, FixBoundsRadius);
                if (Mathf.Abs(m_appliedRadius - FixBoundsRadius) >= 0.2f)
                {
                    Handles.Label(position + transform.forward * FixBoundsRadius, "Fix Bounds Radius");
                }
            }


            if (m_appliedRadius > 0.1f)
            {
                Handles.color = Color.green;
                Handles.DrawWireDisc(position, settings.Up, m_appliedRadius);
                Handles.Label(position + transform.forward * m_appliedRadius, "Fixed Radius");
            }


            Gizmos.color  = Color.magenta;
            Handles.color = Color.magenta;
            Handles.DrawWireDisc(position, settings.Up, Flatten);
            if (Flatten > 0.1f)
            {
                Handles.Label(position + transform.forward * Flatten, "Flatten");
            }
        }
示例#3
0
        public static void ApplyAll(float curvature, float flatten, float horizonX, float horizonY, float horizonZ, Transform transform = null)
        {
            HB hb = HB.Instance;

            if (hb == null)
            {
                return;
            }

            hb.Curvature      = curvature;
            hb.Flatten        = flatten;
            hb.HorizonXOffset = horizonX;
            hb.HorizonYOffset = horizonY;
            hb.HorizonZOffset = horizonZ;

            HBSettings settings = GetSettings();

            HBUtils.HorizonBend(settings, transform);
        }
示例#4
0
        public Vector3 HBOffset()
        {
            HBSettings settings = new HBSettings(BendingMode, Curvature * HB.CURVATURE_FACTOR, Flatten, HorizonXOffset, HorizonYOffset, HorizonZOffset, false);

            return(HBUtils.GetOffset(settings, FixBoundsRadius));
        }
示例#5
0
        public static Vector3 GetOffset(HBSettings settings, float radius)
        {
            Vector3 atPoint = Vector3.Scale(new Vector3(settings.HorizonXOffset, settings.HorizonYOffset, settings.HorizonZOffset), settings.Mask) + settings.Gradient * radius;

            return(HBUtils.GetOffset(atPoint, settings, null));
        }
示例#6
0
        public static Vector3 GetOffset(Vector3 point, HBSettings settings, Transform camera = null)
        {
            if (settings.AttachToCameraInEditor)
            {
                if (camera == null)
                {
                    throw new ArgumentNullException("camera");
                }
                point -= camera.position;
            }


            switch (settings.BendingMode)
            {
            case BendingMode._HB_XY_ZUP:
            {
                float d1     = Mathf.Max(0, Mathf.Abs(settings.HorizonXOffset - point.x) - settings.Flatten);
                float d2     = Mathf.Max(0, Mathf.Abs(settings.HorizonYOffset - point.y) - settings.Flatten);
                float offset = (d1 * d1 + d2 * d2) * settings.Curvature;
                return(new Vector3(0.0f, 0.0f, offset));
            }

            case BendingMode._HB_X_ZUP:
            {
                float d1     = Mathf.Max(0, Mathf.Abs(settings.HorizonYOffset - point.y) - settings.Flatten);
                float offset = d1 * d1 * settings.Curvature;
                return(new Vector3(0.0f, 0.0f, offset));
            }

            case BendingMode._HB_Y_ZUP:
            {
                float d2     = Mathf.Max(0, Mathf.Abs(settings.HorizonXOffset - point.x) - settings.Flatten);
                float offset = d2 * d2 * settings.Curvature;
                return(new Vector3(0.0f, 0.0f, offset));
            }

            case BendingMode._HB_XZ_YUP:
            {
                float d1     = Mathf.Max(0, Mathf.Abs(settings.HorizonXOffset - point.x) - settings.Flatten);
                float d2     = Mathf.Max(0, Mathf.Abs(settings.HorizonZOffset - point.z) - settings.Flatten);
                float offset = (d1 * d1 + d2 * d2) * settings.Curvature;
                return(new Vector3(0.0f, offset, 0.0f));
            }

            case BendingMode._HB_X_YUP:
            {
                float d1     = Mathf.Max(0, Mathf.Abs(settings.HorizonZOffset - point.z) - settings.Flatten);
                float offset = d1 * d1 * settings.Curvature;
                return(new Vector3(0.0f, offset, 0.0f));
            }

            case BendingMode._HB_Z_YUP:
            {
                float d2     = Mathf.Max(0, Mathf.Abs(settings.HorizonXOffset - point.x) - settings.Flatten);
                float offset = d2 * d2 * settings.Curvature;
                return(new Vector3(0.0f, offset, 0.0f));
            }

            case BendingMode._HB_YZ_XUP:
            {
                float d1     = Mathf.Max(0, Mathf.Abs(settings.HorizonYOffset - point.y) - settings.Flatten);
                float d2     = Mathf.Max(0, Mathf.Abs(settings.HorizonZOffset - point.z) - settings.Flatten);
                float offset = (d1 * d1 + d2 * d2) * settings.Curvature;
                return(new Vector3(offset, 0.0f, 0.0f));
            }

            case BendingMode._HB_Y_XUP:
            {
                float d1     = Mathf.Max(0, Mathf.Abs(settings.HorizonZOffset - point.z) - settings.Flatten);
                float offset = d1 * d1 * settings.Curvature;
                return(new Vector3(offset, 0.0f, 0.0f));
            }

            case BendingMode._HB_Z_XUP:
            {
                float d2     = Mathf.Max(0, Mathf.Abs(settings.HorizonYOffset - point.y) - settings.Flatten);
                float offset = d2 * d2 * settings.Curvature;
                return(new Vector3(offset, 0.0f, 0.0f));
            }

            default:
            {
                return(new Vector3(0.0f, 0.0f, 0.0f));
            }
            }
        }
示例#7
0
        private static bool GetNextRayOrigin(Ray ray, float stride, float curvatureRadius, HBSettings settings, Transform camera, out Vector3 nextRayOrigin)
        {
            Vector3 directionNorm = Vector3.Scale(ray.direction, settings.Mask);

            directionNorm.Normalize();

            Vector3 direction = directionNorm * stride + ray.origin;
            Plane   plane     = new Plane(-directionNorm, direction);

            Vector3 offset = GetOffset(direction, settings, camera);
            float   distanceToPlane;

            if (plane.Raycast(ray, out distanceToPlane))
            {
                Vector3 result = ray.GetPoint(distanceToPlane) + offset;
                nextRayOrigin = result;
                return(true);
            }

            nextRayOrigin = new Vector3(Mathf.Infinity, Mathf.Infinity, Mathf.Infinity);
            return(false);
        }
示例#8
0
        private static void RayToRays(Transform cameraTransform, Ray ray, float stride, float curvatureRadius, HBSettings settings, out Ray[] rays, out float[] maxDistances)
        {
            if (stride <= 0.0f)
            {
                throw new ArgumentOutOfRangeException("stride", "stride <= 0.0");
            }


            float length    = stride;
            int   raysCount = Mathf.CeilToInt(Mathf.Max(curvatureRadius - settings.Flatten, 0.0f) / stride);

            if (settings.Flatten > 0)
            {
                length = settings.Flatten;
                raysCount++;
            }

            rays         = new Ray[raysCount];
            maxDistances = new float[raysCount];

            Vector3 prevOrigin = ray.origin + GetOffset(ray.origin, settings, cameraTransform);

            for (int i = 0; i < raysCount; ++i)
            {
                Vector3 nextRayOrigin;
                if (GetNextRayOrigin(ray, length, curvatureRadius, settings, cameraTransform, out nextRayOrigin))
                {
                    rays[i]         = new Ray(prevOrigin, nextRayOrigin - prevOrigin);
                    maxDistances[i] = (nextRayOrigin - prevOrigin).magnitude;
                    prevOrigin      = nextRayOrigin;
                    length         += stride;
                }
                else
                {
                    rays[i] = new Ray(prevOrigin, ray.direction);
                    maxDistances[maxDistances.Length - 1] = Mathf.Infinity;
                    Array.Resize(ref rays, i + 1);
                    Array.Resize(ref maxDistances, i + 1);
                    break;
                }
            }
        }
示例#9
0
        public static void ScreenPointToRays(Camera camera, float stride, float curvatureRadius, HBSettings settings, out Ray[] rays, out float[] maxDistances)
        {
            Ray ray = camera.ScreenPointToRay(Input.mousePosition);

            RayToRays(camera.transform, ray, stride, curvatureRadius, settings, out rays, out maxDistances);
        }
示例#10
0
        public static void CameraToRays(Transform cameraTransform, float stride, float curvatureRadius, HBSettings settings, out Ray[] rays, out float[] maxDistances)
        {
            Ray ray = new Ray(cameraTransform.position, cameraTransform.forward);

            RayToRays(cameraTransform, ray, stride, curvatureRadius, settings, out rays, out maxDistances);
        }
示例#11
0
 public static void HorizonBend(HBSettings settings, Transform transform = null)
 {
     HBCurvature(settings.Curvature);
     HBFlatten(settings.Flatten);
     HBHorizonOffset(settings.HorizonXOffset, settings.HorizonYOffset, settings.HorizonZOffset, transform);
 }