-
Notifications
You must be signed in to change notification settings - Fork 1
/
ScanEffectContentDisplacementCalculator.swift
47 lines (42 loc) · 1.78 KB
/
ScanEffectContentDisplacementCalculator.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//
// ScanEffectContentDisplacementCalculator.swift
// ScanEffectExample
//
// Created by Maciek Czarnik on 26/02/2024.
//
import simd
import SwiftUI
/// Describes the displacement of scanned content.
///
/// The calculator wraps a closure that gets called by `scanEffect` to calculate content displacement for a scan sensor at particular vertical position. Be aware that the closure gets executed `sensorAreaSize.height` times per frame, so **avoid time intensive operations and side effects** (`print` included) in the body.
///
/// To get an intuition and explore some possibilities please reffer to sample instances defined in `ScanEffectContentDisplacementCalculator+Functions.swift`
public struct ScanEffectContentDisplacementCalculator {
public typealias Calculate = (
_ sensorVerticalPosition: Float,
_ contentFrame: SIMD4<Float>,
_ sensorAreaSize: SIMD2<Float>
) -> SIMD2<Float>
let calculate: Calculate
/// Initializes an instance by providing the ``ScanEffectContentDisplacementCalculator/Calculate`` closure.
///
/// - Parameter calculate: a closure that returns displacement for scan sensor at particular vertical position.
public init(calculate: @escaping Calculate) {
self.calculate = calculate
}
}
extension ScanEffectContentDisplacementCalculator {
/// Initializes an instance by wrapping another calculator.
public init(
_ buildCalculator: @escaping (
_ sensorVerticalPosition: Float,
_ contentFrame: SIMD4<Float>,
_ sensorAreaSize: SIMD2<Float>
) -> ScanEffectContentDisplacementCalculator
) {
self.init { sensorVerticalPosition, contentFrame, sensorAreaSize in
buildCalculator(sensorVerticalPosition, contentFrame, sensorAreaSize)
.calculate(sensorVerticalPosition, contentFrame, sensorAreaSize)
}
}
}