Пример #1
0
        public Vector3 GridToWorld(Recti gridRect)
        {
            int width  = gridRect.max.x - gridRect.min.x;
            int height = gridRect.max.y - gridRect.min.y;

            return(GridToWorld(gridRect.min.Float() + new Vector2(width / 2f, height / 2f)));
        }
Пример #2
0
        public Recti Constrain(Recti bounds)           // Unchecked constrain
        {
            Recti constrained = this;
            int   offset      = 0;

            if (constrained.min.x < bounds.min.x)               // Too left
            {
                offset = bounds.min.x - constrained.min.x;
            }
            if (constrained.max.x > bounds.max.x)               // Too right
            {
                offset = bounds.max.x - constrained.max.x;
            }
            constrained.min.x += offset;
            constrained.max.x += offset;

            offset = 0;
            if (constrained.min.y < bounds.min.y)               // Too low
            {
                offset = bounds.min.y - constrained.min.y;
            }
            if (constrained.max.y > bounds.max.y)               // Too high
            {
                offset = bounds.max.y - constrained.max.y;
            }
            constrained.min.y += offset;
            constrained.max.y += offset;

            return(constrained);
        }
Пример #3
0
        public Recti WorldToGrid(Vector3 center, Vector2Int size)
        {
            Vector2Int gridCenter = WorldToGrid(center);
            //Debug.DrawRay(GridToWorld(gridCenter), Vector3.up, Color.yellow);
            Vector2Int gridCenterFloored = (wtl.MultiplyPoint3x4(center) / settings.gridSnapStep).Flat().FloorToInt();
            //Debug.DrawRay(GridToWorld(gridCenterFloored), Vector3.up, Color.red);
            Recti gridRect = new Recti();

            if (size.x % 2 != 0)               // Odd
            {
                gridRect.min.x = gridCenterFloored.x - size.x / 2;
                gridRect.max.x = gridCenterFloored.x + size.x / 2 + 1;
            }
            else                 // Even
            {
                gridRect.min.x = gridCenter.x - size.x / 2;
                gridRect.max.x = gridCenter.x + size.x / 2;
            }
            if (size.y % 2 != 0)               // Odd
            {
                gridRect.min.y = gridCenterFloored.y - size.y / 2;
                gridRect.max.y = gridCenterFloored.y + size.y / 2 + 1;
            }
            else                 // Even
            {
                gridRect.min.y = gridCenter.y - size.y / 2;
                gridRect.max.y = gridCenter.y + size.y / 2;
            }
            //Debug.DrawRay(GridToWorld(gridRect.min), Vector3.up, Color.green);
            //Debug.DrawRay(GridToWorld(gridRect.max), Vector3.up, Color.cyan);
            return(gridRect);
        }
Пример #4
0
        public float Distance(Recti rect)
        {
            if (Intersects(rect))
            {
                return(0f);
            }
            // Corners
            Vector2Int localCorner;
            Vector2Int otherCorner;

            if (rect.min.x > max.x && rect.min.y > max.y)               // Top right
            {
                localCorner = max;
                otherCorner = rect.min;
                return((otherCorner - localCorner).magnitude);
            }
            if (rect.max.x < min.x && rect.min.y > max.y)               // Top left
            {
                localCorner = new Vector2Int(min.x, max.y);
                otherCorner = new Vector2Int(rect.max.x, rect.min.y);
                return((otherCorner - localCorner).magnitude);
            }
            if (rect.max.x < min.x && rect.max.y < min.y)               // Bottom left
            {
                localCorner = min;
                otherCorner = rect.max;
                return((otherCorner - localCorner).magnitude);
            }
            if (rect.min.x > max.x && rect.max.y < min.y)               // Bottom right
            {
                localCorner = new Vector2Int(max.x, min.y);
                otherCorner = new Vector2Int(rect.min.x, rect.max.y);
                return((otherCorner - localCorner).magnitude);
            }
            // Sides
            if (rect.min.x > max.x)               // Right
            {
                return(rect.min.x - max.x);
            }
            if (rect.max.x < min.x)               // Left
            {
                return(min.x - rect.max.x);
            }
            if (rect.min.y > max.y)               // Top
            {
                return(rect.min.y - max.y);
            }
            if (rect.max.y < min.y)               // Bottom
            {
                return(min.y - rect.max.y);
            }

            return(0f);            // Should not be possible
        }
Пример #5
0
        public bool Constrain(Recti bounds, out Recti constrained)
        {
            int width  = max.x - min.x;
            int height = max.y - min.y;

            if (bounds.max.x - bounds.min.x < width || bounds.max.y - bounds.min.y < height)
            {
                constrained = this;
                return(false);
            }
            constrained = Constrain(bounds);

            return(true);
        }
Пример #6
0
        public Recti ProjectInGrid(Recti rect)
        {
            if (boundingRects.Count == 0)
            {
                return(rect);
            }
            Recti closest     = rect.Constrain(boundingRects[0]);
            float distClosest = Vector2.Distance(rect.center, closest.center);

            for (int i = 1; i < boundingRects.Count; i++)
            {
                Recti currentClosest = rect.Constrain(boundingRects[i]);
                float distCurrent    = Vector2.Distance(rect.center, currentClosest.center);
                if (distCurrent < distClosest)
                {
                    closest = currentClosest;
                }
            }

            return(closest);
        }
Пример #7
0
        public void Snap(Transform transf, Transform reference, Vector2Int size)
        {
            transf.rotation = SnapRotation(reference.rotation);
            Vector3 euler = transf.rotation.eulerAngles;

            euler.y -= transform.rotation.eulerAngles.y;
            if (Mathf.RoundToInt(euler.y) == 90 || Mathf.RoundToInt(euler.y) == 270)               // TODO kinda ugly check
            {
                int tmp = size.x;
                size.x = size.y;
                size.y = tmp;
            }
            euler.y += transform.rotation.eulerAngles.y;

            Recti gridRect = WorldToGrid(reference.position, size);

            if (!IsInGrid(gridRect))
            {
                gridRect = ProjectInGrid(gridRect);                 // TODO not perfect when rect is part in one rect part in another
            }
            //Debug.DrawRay(GridToWorld(gridRect.min), Vector3.up, Color.white);
            //Debug.DrawRay(GridToWorld(gridRect.max), Vector3.up, Color.white);
            transf.position = GridToWorld(gridRect);
        }
Пример #8
0
 public static Vector2Int Clamp(this Vector2Int v, Recti rect)
 {
     return(new Vector2Int((v.x < rect.min.x) ? rect.min.x : ((v.x > rect.max.x) ? rect.max.x : v.x), (v.y < rect.min.y) ? rect.min.y : ((v.y > rect.max.y) ? rect.max.y : v.y)));
 }
Пример #9
0
 public bool Intersects(Recti rect)
 {
     return(!(rect.min.x > max.x || rect.max.x < min.x || rect.min.y > max.y || rect.max.y < min.y));
 }
Пример #10
0
 public bool Contains(Recti rect)
 {
     return(!(rect.min.x < min.x || rect.min.y < min.y || rect.max.x > max.x || rect.max.y > max.y));
 }
Пример #11
0
 public bool IsInGrid(Recti gridRect)
 {
     return(IsInGrid(gridRect.min) && IsInGrid(new Vector2Int(gridRect.min.x, gridRect.max.y)) && IsInGrid(gridRect.max) && IsInGrid(new Vector2Int(gridRect.max.x, gridRect.min.y)));
 }
Пример #12
0
 public void AddBoundingRect(Recti rect)
 {
     boundingRects.Add(rect);
     RecreateMesh(mesh, boundingRects);
 }