mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-03-18 15:33:58 +01:00
feat: enhance vertex loading
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ struct Quad: Codable {
|
||||
self.shape = shape
|
||||
}
|
||||
|
||||
func generateVertices(_ shape: QuadShape) -> [QuadVertex] {
|
||||
func generateVertices() -> [QuadVertex] {
|
||||
switch shape {
|
||||
case .rounded:
|
||||
generateRoundedQuad()
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
import MetalKit
|
||||
import Foundation
|
||||
|
||||
class StrokeQuad: NSObject, Codable {
|
||||
final class StrokeQuad: NSObject, Codable {
|
||||
var 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)
|
||||
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:
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -31,9 +31,6 @@ struct MemosView: View {
|
||||
}
|
||||
.fullScreenCover(item: $memo) { memo in
|
||||
MemoView(canvas: memo.canvas)
|
||||
.onDisappear {
|
||||
managedObjectContext.refreshAllObjects()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user