Skip to content

Instantly share code, notes, and snippets.

View jacobsapps's full-sized avatar

Jacob Bartlett jacobsapps

View GitHub Profile
@Environment(\.modelContext) private var context
// ...
VStack(spacing: .zero) {
Text("Does this card represent you?")
.multilineTextAlignment(.center)
.font(.headline)
Button {
struct CardGridView: View {
@Query(sort: \CardEntity.title) private var cardEntities: [CardEntity]
var body: some View {
NavigationStack {
ScrollView {
LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 12) {
ForEach(cardEntities.compactMap { $0.toCard() }) { card in
CardView(card: card, size: .small, showEffects: false)
@main
struct SummonSelfApp: App {
var body: some Scene {
WindowGroup {
CardGridView()
.modelContainer(for: [CardEntity.self, StatEntity.self])
}
}
}
extension CardEntity {
static func from(_ card: Card) -> CardEntity {
CardEntity(
id: card.id,
title: card.stats.title,
emoji: card.stats.type.emoji,
hexColor: card.stats.type.hexClor,
rarity: String(describing: card.stats.rarity),
stats: card.stats.stats.map { StatEntity(name: $0.name, value: $0.value) },
image: card.image
import SwiftData
@Model
final class CardEntity {
@Attribute(.unique) var id: UUID
var title: String
var emoji: String
var hexColor: String
var rarity: String
var stats: [StatEntity]
LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 12) {
ForEach(cardEntities.compactMap { $0.toCard() }) { card in
CardView(card: card, size: .small, showEffects: false)
.onTapGesture {
selectedCard = card
}
}
}
final class CardCollectionViewModel: ObservableObject {
@Published var cards: [Card] = []
func addCard(_ card: Card) {
cards.insert(card, at: 0)
}
}
struct CardGridView: View {
@StateObject private var viewModel = CardCollectionViewModel()
private func predictType(from imageEmbedding: [Float]) -> ElementalType {
guard !typeEmbeddings.isEmpty else { return .init(emoji: "", hexClor: "") }
// 1 in 4 chance to return a random type
if Int.random(in: 0..<4) == 0 {
let randomType = typeEmbeddings.randomElement()!
return ElementalType(emoji: randomType.emoji, hexClor: randomType.hex)
}
let scoredTypes = typeEmbeddings.map { type -> (TypeEmbedding, Float) in
struct CardView: View {
let card: Card
@State private var cutoutImage: Image? = nil
@State private var isProcessing = true
var body: some View {
ZStack {
Image(uiImage: card.image)
.circularFoilEffect()
private func generateCutout(image: UIImage) throws -> UIImage? {
guard let cgImage = image.cgImage else { return nil }
let inputImage = CIImage(cgImage: cgImage, options: [.applyOrientationProperty: true])
let request = VNGenerateForegroundInstanceMaskRequest()
let handler = VNImageRequestHandler(ciImage: inputImage)
try handler.perform([request])
guard let observation = request.results?.first else {