Beispiel #1
0
 public CollisionDataRB(Position collisionNormal, PositionMagnitude penetrationDepth, Rigidbody rigidbody1, Rigidbody rigidbody2)
 {
     CollisionNormal  = collisionNormal;
     PenetrationDepth = penetrationDepth;
     RigidBody1       = rigidbody1;
     RigidBody2       = rigidbody2;
 }
Beispiel #2
0
        // public static Position IntersectCircleCircle(Circle circle1, Circle circle2) {
        //     return (circle1.Position + circle2.Position) / 2;
        // }

        public static CollisionDataRB CollisionCircleCircle(Circle circle1, Circle circle2, Rigidbody rb1, Rigidbody rb2)
        {
            //TODO; would the Velocity be global or local - so would I have to translate it or not

            circle1 = new Circle(circle1.Radius * rb1.GameObject.Transform.Scale);
            circle2 = new Circle(circle2.Radius * rb2.GameObject.Transform.Scale);

            Position distPos = rb2.GameObject.Transform.Position - rb1.GameObject.Transform.Position;

            // positionA --- positionB = fullDistance eg 10
            // rA + rB = rGes eg 15
            // rGes - fullDistance = penetrationDepth eg 15 - 10 = 5
            // penetrationDepth / 2 = halfDepth (macht weniger Sinn)

            // OPT: This has to be done to prevent a division by zero; however, this occurs very rearly and the result of using it would be undefined anyway
            // the normalisation could be ommited in the if, but for GPUs it might be more effective for better streamlining to still do it
            // (is this actually true; in both cases I have to do it)
            if (distPos == new Position(0, 0))
            {
                distPos = new Position(1, 0);
            }
            // I do calculate the square here twice -.-
            PositionMagnitude penetrationDepth = (circle1.Radius + circle2.Radius) - distPos.magnitude;

            return(new CollisionDataRB(distPos.normalized, penetrationDepth, rb1, rb2));
        }
Beispiel #3
0
        // public static Position IntersectAABBCircle(AABB aABB, Circle circle) {
        //     //TODO
        //     // not sure where the middle point of those is
        //     // I can find the closest point on the rect to the circle
        //     // Should I just take the middle of that point and ...? what?
        //     return new Position(0, 0);
        // }

        // public static Collision CollisionAABBCircle(AABB aabb, Circle circle) {
        //     bool doIntersect = DoIntersectAABBCircle(aabb, circle);
        //     Position position = IntersectAABBCircle(aabb, circle);

        //     //TODO calculate resolving vector

        //     return new Collision(doIntersect, position);
        // }

        // #endregion

        // #region [CircleCircle]

        public static bool DoIntersectCircleCircle(Circle circle1, Circle circle2, Transform2D transform1, Transform2D transform2)
        {
            Circle translatedCircle1 = new Circle(transform1.Scale * circle1.Radius); // position is not in here -.-
            Circle translatedCircle2 = new Circle(transform2.Scale * circle2.Radius); // position is not in here -.-

            PositionMagnitude maxRadius = translatedCircle1.Radius + translatedCircle2.Radius;

            return((transform1.Position - transform2.Position).sqrMagnitude <= maxRadius * maxRadius);
        }
Beispiel #4
0
        public Grid(PositionMagnitude cellSize, Position offset, Vector2Int cells)
        {
            f_cellSize = cellSize;
            f_offset   = offset;
            f_cells    = cells;

            f_cellRBs    = new List <Rigidbody> [cells.y, cells.x];
            s_emptyNodes = cells.y * cells.x;

            for (int x = 0; x < cells.x; ++x)
            {
                for (int y = 0; y < cells.y; ++y)
                {
                    f_cellRBs[y, x] = new List <Rigidbody>();
                }
            }
        }
Beispiel #5
0
        public Grid(PositionMagnitude cellSize, AABB aabb)
        {
            f_cellSize = cellSize;

            f_offset = aabb.BottomLeft;
            f_cells  = Vector2Int.CeilToInt((aabb.TopRight - aabb.BottomLeft) / f_cellSize);

            f_cellRBs    = new List <Rigidbody> [f_cells.y, f_cells.x];
            s_emptyNodes = f_cells.y * f_cells.x;

            for (int x = 0; x < f_cells.x; ++x)
            {
                for (int y = 0; y < f_cells.y; ++y)
                {
                    f_cellRBs[y, x] = new List <Rigidbody>();
                }
            }
        }
Beispiel #6
0
 public static PositionMagnitude LerpUnclamped(PositionMagnitude a, PositionMagnitude b, float t)
 {
     return(new PositionMagnitude(Mathf.LerpUnclamped(a.Float, b.Float, t)));
 }
Beispiel #7
0
 public static PositionMagnitude Clamp(PositionMagnitude value, PositionMagnitude min, PositionMagnitude max)
 {
     return(new PositionMagnitude(Mathf.Clamp(value.Float, min.Float, max.Float)));
 }
Beispiel #8
0
 public static PositionMagnitude Max(PositionMagnitude a, PositionMagnitude b)
 {
     return(new PositionMagnitude(Mathf.Max(a.Float, b.Float)));
 }
Beispiel #9
0
 public static PositionMagnitude Clamp01(PositionMagnitude value)
 {
     return(new PositionMagnitude(Mathf.Clamp01(value.Float)));
 }
Beispiel #10
0
 public Capsule(Position position1, Position position2, PositionMagnitude radius)
 {
     Position1 = position1;
     Position2 = position2;
     Radius    = radius;
 }
Beispiel #11
0
 public Circle(/*Position position, */ PositionMagnitude radius)
 {
     //Position = position;
     Radius = radius;
 }