HuggingChat-Mac/Animations/Ripple/RippleModifier.swift (33 lines of code) (raw):

// // RippleModifier.swift // HuggingChat-Mac // // Created by Cyril Zakka on 8/28/24. // import SwiftUI /* See the LICENSE at the end of the article for this sample's licensing information. */ /// A modifier that applies a ripple effect to its content. struct RippleModifier: ViewModifier { var origin: CGPoint var elapsedTime: TimeInterval var duration: TimeInterval var amplitude: Double var frequency: Double var decay: Double var speed: Double func body(content: Content) -> some View { let shader = ShaderLibrary.Ripple( .float2(origin), .float(elapsedTime), // Parameters .float(amplitude), .float(frequency), .float(decay), .float(speed) ) let maxSampleOffset = maxSampleOffset let elapsedTime = elapsedTime let duration = duration content.visualEffect { view, _ in view.layerEffect( shader, maxSampleOffset: maxSampleOffset, isEnabled: 0 < elapsedTime && elapsedTime < duration ) } } var maxSampleOffset: CGSize { CGSize(width: amplitude, height: amplitude) } }