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

View File

@@ -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

View File

@@ -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
}
}

View File

@@ -22,7 +22,7 @@ struct Quad: Codable {
self.shape = shape
}
func generateVertices(_ shape: QuadShape) -> [QuadVertex] {
func generateVertices() -> [QuadVertex] {
switch shape {
case .rounded:
generateRoundedQuad()

View File

@@ -8,7 +8,7 @@
import MetalKit
import Foundation
class StrokeQuad: NSObject, Codable {
final class StrokeQuad: NSObject, Codable {
var quad: Quad
init(quad: Quad) {

View File

@@ -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:

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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

View File

@@ -31,9 +31,6 @@ struct MemosView: View {
}
.fullScreenCover(item: $memo) { memo in
MemoView(canvas: memo.canvas)
.onDisappear {
managedObjectContext.refreshAllObjects()
}
}
}