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); }
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); }