feat: enhance vertex loading

This commit is contained in:
dscyrescotti
2024-05-09 14:30:46 +07:00
parent cd6048bbd0
commit 1d91da8445
9 changed files with 31 additions and 16 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ import CoreData
import Foundation import Foundation
@objc(GraphicContext) @objc(GraphicContext)
class GraphicContext: NSManagedObject { final class GraphicContext: NSManagedObject {
@NSManaged var id: UUID @NSManaged var id: UUID
@NSManaged var canvas: Canvas? @NSManaged var canvas: Canvas?
@NSManaged var strokes: NSMutableOrderedSet @NSManaged var strokes: NSMutableOrderedSet
+17 -5
View File
@@ -11,7 +11,7 @@ import MetalKit
import Foundation import Foundation
@objc(Canvas) @objc(Canvas)
class Canvas: NSManagedObject, Identifiable { final class Canvas: NSManagedObject, Identifiable {
@NSManaged var id: UUID @NSManaged var id: UUID
@NSManaged var width: CGFloat @NSManaged var width: CGFloat
@NSManaged var height: CGFloat @NSManaged var height: CGFloat
@@ -43,11 +43,23 @@ class Canvas: NSManagedObject, Identifiable {
extension Canvas { extension Canvas {
func load() { func load() {
state = .loading state = .loading
graphicContext.strokes.forEach { stroke in let start = Date().formatted(.dateTime.minute().second().secondFraction(.fractional(5)))
guard let stroke = stroke as? Stroke else { return } Task(priority: .high) { [start] in
stroke.loadVertices() 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
} }
} }
@@ -22,7 +22,7 @@ struct Quad: Codable {
self.shape = shape self.shape = shape
} }
func generateVertices(_ shape: QuadShape) -> [QuadVertex] { func generateVertices() -> [QuadVertex] {
switch shape { switch shape {
case .rounded: case .rounded:
generateRoundedQuad() generateRoundedQuad()
@@ -8,7 +8,7 @@
import MetalKit import MetalKit
import Foundation import Foundation
class StrokeQuad: NSObject, Codable { final class StrokeQuad: NSObject, Codable {
var quad: Quad var quad: Quad
init(quad: Quad) { init(quad: Quad) {
@@ -107,7 +107,7 @@ struct SolidPointStrokeGenerator: StrokeGenerator {
} }
let quad = Quad(origin: point, size: stroke.thickness, color: stroke.color, rotation: rotation) let quad = Quad(origin: point, size: stroke.thickness, color: stroke.color, rotation: rotation)
stroke._quads.append(quad) stroke._quads.append(quad)
stroke.vertices.append(contentsOf: quad.generateVertices(quad.shape)) stroke.vertices.append(contentsOf: quad.generateVertices())
stroke.vertexCount = stroke.vertices.endIndex stroke.vertexCount = stroke.vertices.endIndex
} }
@@ -116,7 +116,7 @@ struct SolidPointStrokeGenerator: StrokeGenerator {
let factor: CGFloat let factor: CGFloat
switch configuration.granularity { switch configuration.granularity {
case .automatic: case .automatic:
factor = min(3.5, 1 / (stroke.thickness * 10 / 300)) factor = min(3.5, 1 / (stroke.thickness * 1 / 10))
case .fixed: case .fixed:
factor = 1 / (stroke.thickness * stroke.penStyle.anyPenStyle.stepRate) factor = 1 / (stroke.thickness * stroke.penStyle.anyPenStyle.stepRate)
case .none: case .none:
+3 -2
View File
@@ -10,7 +10,7 @@ import CoreData
import Foundation import Foundation
@objc(Stroke) @objc(Stroke)
class Stroke: NSManagedObject { final class Stroke: NSManagedObject {
@NSManaged var id: UUID @NSManaged var id: UUID
@NSManaged var color: [CGFloat] @NSManaged var color: [CGFloat]
@NSManaged var style: Int16 @NSManaged var style: Int16
@@ -56,11 +56,12 @@ class Stroke: NSManagedObject {
func finish(at point: CGPoint) { func finish(at point: CGPoint) {
penStyle.anyPenStyle.generator.finish(at: point, on: self) penStyle.anyPenStyle.generator.finish(at: point, on: self)
keyPoints.removeAll() keyPoints.removeAll()
NSLog("[Memola] - \(_quads.count) quads")
} }
func loadVertices() { func loadVertices() {
vertices = strokeQuads vertices = strokeQuads
.flatMap { $0.quad.generateVertices($0.quad.shape) } .flatMap { $0.quad.generateVertices() }
vertexCount = vertices.endIndex vertexCount = vertices.endIndex
} }
@@ -58,6 +58,11 @@ class CanvasViewController: UIViewController {
renderView.draw() renderView.draw()
drawingView.enableUserInteraction() drawingView.enableUserInteraction()
} }
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
Persistence.shared.viewContext.refresh(canvas, mergeChanges: false)
}
} }
extension CanvasViewController { extension CanvasViewController {
+1 -1
View File
@@ -9,7 +9,7 @@ import CoreData
import Foundation import Foundation
@objc(Memo) @objc(Memo)
class Memo: NSManagedObject { final class Memo: NSManagedObject {
@NSManaged var id: UUID @NSManaged var id: UUID
@NSManaged var title: String @NSManaged var title: String
@NSManaged var data: Data @NSManaged var data: Data
-3
View File
@@ -31,9 +31,6 @@ struct MemosView: View {
} }
.fullScreenCover(item: $memo) { memo in .fullScreenCover(item: $memo) { memo in
MemoView(canvas: memo.canvas) MemoView(canvas: memo.canvas)
.onDisappear {
managedObjectContext.refreshAllObjects()
}
} }
} }