in HuggingChat-Mac/Animations/FluidGradient/BlobLayer.swift [49:92]
func animate(speed: CGFloat) {
guard speed > 0 else { return }
self.removeAllAnimations()
let currentLayer = self.presentation() ?? self
let animation = CASpringAnimation()
animation.mass = 10/speed
animation.damping = 50
animation.duration = 1/speed
animation.isRemovedOnCompletion = false
animation.fillMode = CAMediaTimingFillMode.forwards
let position = newPosition()
let radius = newRadius()
// Center point
let start = animation.copy() as! CASpringAnimation
start.keyPath = "startPoint"
start.fromValue = currentLayer.startPoint
start.toValue = position
// Radius
let end = animation.copy() as! CASpringAnimation
end.keyPath = "endPoint"
end.fromValue = currentLayer.endPoint
end.toValue = position.displace(by: radius)
self.startPoint = position
self.endPoint = position.displace(by: radius)
// Opacity
let value = Float.random(in: 0.5...1)
let opacity = animation.copy() as! CASpringAnimation
opacity.fromValue = self.opacity
opacity.toValue = value
self.opacity = value
self.add(opacity, forKey: "opacity")
self.add(start, forKey: "startPoint")
self.add(end, forKey: "endPoint")
}