Пример #1
0
        public static PolyShapeInfo CloneAndTransformShape(PolyShapeInfo poly, Transform xform, Vector2 spriteSize, SpriteRenderer.FlipMode flip)
        {
            MathF.GetTransformDotVec(xform.Angle, xform.Scale, out var xDot, out var yDot);
            var shape  = new PolyShapeInfo();
            var center = spriteSize / 2;
            var verts  = poly.Vertices.Select(v =>
            {
                v = v * PhysicsUnit.LengthToDuality - center;
                if (flip.HasFlag(SpriteRenderer.FlipMode.Horizontal))
                {
                    v.X *= -1;
                }
                if (flip.HasFlag(SpriteRenderer.FlipMode.Vertical))
                {
                    v.Y *= -1;
                }
                //Vector2.Transform(ref v, ref matrix, out var v2);
                MathF.TransformDotVec(ref v, ref xDot, ref yDot);
                v += xform.Pos.Xy;
                return(v);
            });

            if (flip.HasFlag(SpriteRenderer.FlipMode.Horizontal) ^ flip.HasFlag(SpriteRenderer.FlipMode.Vertical))
            {
                verts = verts.Reverse();
            }
            shape.Vertices = verts.ToArray();
            return(shape);
        }
Пример #2
0
        public static CircleShapeInfo CloneAndTransformShape(CircleShapeInfo circle, Transform xform, Vector2 spriteSize, SpriteRenderer.FlipMode flip)
        {
            MathF.GetTransformDotVec(xform.Angle, xform.Scale, out var xDot, out var yDot);
            Vector2 tmpPos = circle.Position * PhysicsUnit.LengthToDuality - spriteSize / 2;

            if (flip.HasFlag(SpriteRenderer.FlipMode.Horizontal))
            {
                tmpPos.X *= -1;
            }
            if (flip.HasFlag(SpriteRenderer.FlipMode.Vertical))
            {
                tmpPos.Y *= -1;
            }
            MathF.TransformDotVec(ref tmpPos, ref xDot, ref yDot);
            tmpPos += xform.Pos.Xy;
            var shape = new CircleShapeInfo();

            shape.Density  = circle.Density;
            shape.Friction = circle.Friction;
            shape.IsSensor = circle.IsSensor;
            shape.Position = tmpPos;
            shape.Radius   = circle.Radius * xform.Scale * PhysicsUnit.LengthToDuality;

            return(shape);
        }