Add tank catalog with USDZ models and tank selection

Introduce TankDefinition/TankCatalog loaded from Tanks.json, bundle the
Drachengas USDZ tank models, add tank selection and preview views, and
update the AR experience, editor and project views to use the catalog.
Includes tests for catalog loading and model selection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-26 19:12:39 +02:00
parent 992bb32025
commit b8536d4182
63 changed files with 2317 additions and 188 deletions

View File

@ -0,0 +1,38 @@
//
// TankDefinition.swift
// GasTankAR
//
// Created by Dennis Nemec on 14.09.26.
//
import Foundation
/// Eine im Katalog (`Tanks.json`) hinterlegte Tank-Variante. Verbindet die
/// Identität eines Tanks (Größe, Farbe, Aufstellungsart) mit dem Pfad zum
/// 3D-Modell. Die Anzeigenamen werden separat gepflegt (siehe `TankCatalog`).
nonisolated struct TankDefinition: Codable, Hashable, Identifiable {
let size: TankSize
let color: TankColor
let placement: TankPlacement
/// Pfad bzw. Dateiname des 3D-Modells im App-Bundle (z. B. `DG-2700_wh.usdz`).
let modelPath: String
/// Stabile Identität aus der Kombination der Auswahlmerkmale.
var id: String { "\(size.rawValue)_\(color.rawValue)_\(placement.rawValue)" }
/// Ressourcenname ohne Dateiendung, wie ihn RealityKit/SceneKit zum Laden
/// aus dem Bundle erwarten (z. B. `DG-2700_wh`).
var modelResourceName: String {
(modelPath as NSString).deletingPathExtension
}
/// Dateiendung des Modells (z. B. `usdz`).
var modelFileExtension: String {
(modelPath as NSString).pathExtension
}
/// Entspricht diese Definition der getroffenen Tank-Auswahl?
func matches(_ tank: Tank) -> Bool {
size == tank.size && color == tank.color && placement == tank.placement
}
}