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