57 lines
2.0 KiB
Swift
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)
|
|
}
|
|
}
|