Files
Gas-Tank-AR-App/GasTankAR/Views/TankAR/ReferenceImageProvider.swift
2026-09-02 20:54:36 +02:00

57 lines
2.0 KiB
Swift

//
// ReferenceImageProvider.swift
// GasTankAR
//
// Created by Dennis Nemec on 26.08.26.
//
import ARKit
import UIKit
/// Liefert die Referenzbilder für die Anker-Erkennung. Bevorzugt die AR-Ressourcengruppe
/// „ARMarkers"; fällt sonst auf einen programmatisch erzeugten Platzhalter-Marker zurück.
enum ReferenceImageProvider {
static func load() -> Set<ARReferenceImage> {
if let group = ARReferenceImage.referenceImages(inGroupNamed: "ARMarkers", bundle: .main) {
return group
}
if let placeholder = makePlaceholder() {
return [placeholder]
}
return []
}
private static func makePlaceholder() -> ARReferenceImage? {
let size = CGSize(width: 512, height: 512)
let renderer = UIGraphicsImageRenderer(size: size)
let image = renderer.image { context in
let cg = context.cgContext
UIColor.white.setFill()
cg.fill(CGRect(origin: .zero, size: size))
let palette: [UIColor] = [.black, .systemBlue, .systemRed, .systemGreen, .systemOrange, .systemPurple]
let cells = 8
let cellSize = size.width / CGFloat(cells)
for row in 0..<cells {
for column in 0..<cells {
let index = (row * cells + column) % palette.count
palette[index].setFill()
let rect = CGRect(
x: CGFloat(column) * cellSize,
y: CGFloat(row) * cellSize,
width: cellSize,
height: cellSize
)
if (row + column).isMultiple(of: 2) {
cg.fillEllipse(in: rect.insetBy(dx: 4, dy: 4))
} else {
cg.fill(rect.insetBy(dx: 6, dy: 6))
}
}
}
}
guard let cgImage = image.cgImage else { return nil }
return ARReferenceImage(cgImage, orientation: .up, physicalWidth: 0.15)
}
}