From 1d91da844564ae0eb196c95f88da79b86b5f8323 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Thu, 9 May 2024 14:30:46 +0700 Subject: [PATCH] feat: enhance vertex loading --- Memola/Canvas/Contexts/GraphicContext.swift | 2 +- Memola/Canvas/Core/Canvas.swift | 22 ++++++++++++++----- .../Canvas/Geometries/Primitives/Quad.swift | 2 +- .../Geometries/Primitives/StrokeQuad.swift | 2 +- .../SolidPointStrokeGenerator.swift | 4 ++-- Memola/Canvas/Geometries/Stroke/Stroke.swift | 5 +++-- .../ViewController/CanvasViewController.swift | 5 +++++ Memola/Features/Memo/Memo.swift | 2 +- Memola/Features/Memos/MemosView.swift | 3 --- 9 files changed, 31 insertions(+), 16 deletions(-) diff --git a/Memola/Canvas/Contexts/GraphicContext.swift b/Memola/Canvas/Contexts/GraphicContext.swift index 9e5f594..ce2b2ef 100644 --- a/Memola/Canvas/Contexts/GraphicContext.swift +++ b/Memola/Canvas/Contexts/GraphicContext.swift @@ -11,7 +11,7 @@ import CoreData import Foundation @objc(GraphicContext) -class GraphicContext: NSManagedObject { +final class GraphicContext: NSManagedObject { @NSManaged var id: UUID @NSManaged var canvas: Canvas? @NSManaged var strokes: NSMutableOrderedSet diff --git a/Memola/Canvas/Core/Canvas.swift b/Memola/Canvas/Core/Canvas.swift index 05a845a..82dff1e 100644 --- a/Memola/Canvas/Core/Canvas.swift +++ b/Memola/Canvas/Core/Canvas.swift @@ -11,7 +11,7 @@ import MetalKit import Foundation @objc(Canvas) -class Canvas: NSManagedObject, Identifiable { +final class Canvas: NSManagedObject, Identifiable { @NSManaged var id: UUID @NSManaged var width: CGFloat @NSManaged var height: CGFloat @@ -43,11 +43,23 @@ class Canvas: NSManagedObject, Identifiable { extension Canvas { func load() { state = .loading - graphicContext.strokes.forEach { stroke in - guard let stroke = stroke as? Stroke else { return } - stroke.loadVertices() + let start = Date().formatted(.dateTime.minute().second().secondFraction(.fractional(5))) + Task(priority: .high) { [start] in + await withTaskGroup(of: Void.self) { taskGroup in + for stroke in graphicContext.strokes { + guard let stroke = stroke as? Stroke else { continue } + taskGroup.addTask { + stroke.loadVertices() + } + } + } + + let end = Date().formatted(.dateTime.minute().second().secondFraction(.fractional(5))) + NSLog("[Memola] - Loaded from \(start) to \(end)") + await MainActor.run { + state = .loaded + } } - state = .loaded } } diff --git a/Memola/Canvas/Geometries/Primitives/Quad.swift b/Memola/Canvas/Geometries/Primitives/Quad.swift index 5e8eda4..9f46e04 100644 --- a/Memola/Canvas/Geometries/Primitives/Quad.swift +++ b/Memola/Canvas/Geometries/Primitives/Quad.swift @@ -22,7 +22,7 @@ struct Quad: Codable { self.shape = shape } - func generateVertices(_ shape: QuadShape) -> [QuadVertex] { + func generateVertices() -> [QuadVertex] { switch shape { case .rounded: generateRoundedQuad() diff --git a/Memola/Canvas/Geometries/Primitives/StrokeQuad.swift b/Memola/Canvas/Geometries/Primitives/StrokeQuad.swift index f07d4e4..23eae5b 100644 --- a/Memola/Canvas/Geometries/Primitives/StrokeQuad.swift +++ b/Memola/Canvas/Geometries/Primitives/StrokeQuad.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class StrokeQuad: NSObject, Codable { +final class StrokeQuad: NSObject, Codable { var quad: Quad init(quad: Quad) { diff --git a/Memola/Canvas/Geometries/Stroke/Generators/SolidPointStrokeGenerator.swift b/Memola/Canvas/Geometries/Stroke/Generators/SolidPointStrokeGenerator.swift index af7b511..f2fde69 100644 --- a/Memola/Canvas/Geometries/Stroke/Generators/SolidPointStrokeGenerator.swift +++ b/Memola/Canvas/Geometries/Stroke/Generators/SolidPointStrokeGenerator.swift @@ -107,7 +107,7 @@ struct SolidPointStrokeGenerator: StrokeGenerator { } let quad = Quad(origin: point, size: stroke.thickness, color: stroke.color, rotation: rotation) stroke._quads.append(quad) - stroke.vertices.append(contentsOf: quad.generateVertices(quad.shape)) + stroke.vertices.append(contentsOf: quad.generateVertices()) stroke.vertexCount = stroke.vertices.endIndex } @@ -116,7 +116,7 @@ struct SolidPointStrokeGenerator: StrokeGenerator { let factor: CGFloat switch configuration.granularity { case .automatic: - factor = min(3.5, 1 / (stroke.thickness * 10 / 300)) + factor = min(3.5, 1 / (stroke.thickness * 1 / 10)) case .fixed: factor = 1 / (stroke.thickness * stroke.penStyle.anyPenStyle.stepRate) case .none: diff --git a/Memola/Canvas/Geometries/Stroke/Stroke.swift b/Memola/Canvas/Geometries/Stroke/Stroke.swift index 688a336..7f2eb73 100644 --- a/Memola/Canvas/Geometries/Stroke/Stroke.swift +++ b/Memola/Canvas/Geometries/Stroke/Stroke.swift @@ -10,7 +10,7 @@ import CoreData import Foundation @objc(Stroke) -class Stroke: NSManagedObject { +final class Stroke: NSManagedObject { @NSManaged var id: UUID @NSManaged var color: [CGFloat] @NSManaged var style: Int16 @@ -56,11 +56,12 @@ class Stroke: NSManagedObject { func finish(at point: CGPoint) { penStyle.anyPenStyle.generator.finish(at: point, on: self) keyPoints.removeAll() + NSLog("[Memola] - \(_quads.count) quads") } func loadVertices() { vertices = strokeQuads - .flatMap { $0.quad.generateVertices($0.quad.shape) } + .flatMap { $0.quad.generateVertices() } vertexCount = vertices.endIndex } diff --git a/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift b/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift index 5a3907a..117d49b 100644 --- a/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift +++ b/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift @@ -58,6 +58,11 @@ class CanvasViewController: UIViewController { renderView.draw() drawingView.enableUserInteraction() } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + Persistence.shared.viewContext.refresh(canvas, mergeChanges: false) + } } extension CanvasViewController { diff --git a/Memola/Features/Memo/Memo.swift b/Memola/Features/Memo/Memo.swift index 31855a2..5194b38 100644 --- a/Memola/Features/Memo/Memo.swift +++ b/Memola/Features/Memo/Memo.swift @@ -9,7 +9,7 @@ import CoreData import Foundation @objc(Memo) -class Memo: NSManagedObject { +final class Memo: NSManagedObject { @NSManaged var id: UUID @NSManaged var title: String @NSManaged var data: Data diff --git a/Memola/Features/Memos/MemosView.swift b/Memola/Features/Memos/MemosView.swift index 4694446..c52813a 100644 --- a/Memola/Features/Memos/MemosView.swift +++ b/Memola/Features/Memos/MemosView.swift @@ -31,9 +31,6 @@ struct MemosView: View { } .fullScreenCover(item: $memo) { memo in MemoView(canvas: memo.canvas) - .onDisappear { - managedObjectContext.refreshAllObjects() - } } }