diff --git a/Memola/Canvas/Core/Canvas.swift b/Memola/Canvas/Core/Canvas.swift index 4189a32..7c6d07e 100644 --- a/Memola/Canvas/Core/Canvas.swift +++ b/Memola/Canvas/Core/Canvas.swift @@ -19,7 +19,7 @@ final class Canvas: ObservableObject, Identifiable, @unchecked Sendable { let viewPortContext = ViewPortContext() let maximumZoomScale: CGFloat = 35 - let minimumZoomScale: CGFloat = 5 + let minimumZoomScale: CGFloat = 8 let defaultZoomScale: CGFloat = 20 var transform: simd_float4x4 = .init() diff --git a/Memola/Canvas/Elements/Core/Element.swift b/Memola/Canvas/Elements/Core/Element.swift index 831cb83..b17c489 100644 --- a/Memola/Canvas/Elements/Core/Element.swift +++ b/Memola/Canvas/Elements/Core/Element.swift @@ -45,7 +45,11 @@ enum Element: Equatable, Comparable { switch self { case .stroke(let anyStroke): switch anyStroke.value.style { - case .marker: return .stroke + case .marker: + guard let penStroke = anyStroke.stroke(as: PenStroke.self) else { + return .stroke(penStyle: .marker, color: [0, 0, 0, 0]) + } + return .stroke(penStyle: penStroke.penStyle, color: penStroke.color) case .eraser: return .eraser } case .photo: diff --git a/Memola/Canvas/Elements/Core/ElementGroup.swift b/Memola/Canvas/Elements/Core/ElementGroup.swift index 67d6ff5..71c8668 100644 --- a/Memola/Canvas/Elements/Core/ElementGroup.swift +++ b/Memola/Canvas/Elements/Core/ElementGroup.swift @@ -28,15 +28,15 @@ class ElementGroup { } func getPenStyle() -> PenStyle? { - if let last = elements.last, case let .stroke(anyStroke) = last { - return anyStroke.value.penStyle + if case let .stroke(penStyle, _) = type { + return penStyle } return nil } func getPenColor() -> [CGFloat]? { - if let last = elements.last, case let .stroke(anyStroke) = last { - return anyStroke.value.color + if case let .stroke(_, color) = type { + return color } return nil } @@ -44,7 +44,7 @@ class ElementGroup { extension ElementGroup { enum ElementGroupType { - case stroke + case stroke(penStyle: PenStyle, color: [CGFloat]) case eraser case photo } diff --git a/Memola/Canvas/Elements/Geometries/Stroke/Core/Stroke.swift b/Memola/Canvas/Elements/Geometries/Stroke/Core/Stroke.swift index f7f6892..2ecd5db 100644 --- a/Memola/Canvas/Elements/Geometries/Stroke/Core/Stroke.swift +++ b/Memola/Canvas/Elements/Geometries/Stroke/Core/Stroke.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -protocol Stroke: AnyObject, Drawable, Hashable, Equatable { +protocol Stroke: AnyObject, Hashable, Equatable { var id: UUID { get set } var bounds: [CGFloat] { get set } var color: [CGFloat] { get set } @@ -80,31 +80,6 @@ extension Stroke { } } -extension Stroke { - func prepare(device: MTLDevice) { - guard texture == nil else { return } - if penStyle.textureName != nil { - texture = penStyle.loadTexture(on: device) - } - } - - func draw(device: MTLDevice, renderEncoder: MTLRenderCommandEncoder) { - guard !isEmpty, let indexBuffer else { return } - prepare(device: device) - if penStyle.textureName != nil { - renderEncoder.setFragmentTexture(texture, index: 0) - } - renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0) - renderEncoder.drawIndexedPrimitives( - type: .triangle, - indexCount: quads.endIndex * 6, - indexType: .uint32, - indexBuffer: indexBuffer, - indexBufferOffset: 0 - ) - } -} - extension Stroke { static func == (lhs: Self, rhs: Self) -> Bool { lhs.id == rhs.id diff --git a/Memola/Canvas/Elements/Geometries/Stroke/Generators/SolidPointStrokeGenerator.swift b/Memola/Canvas/Elements/Geometries/Stroke/Generators/SolidPointStrokeGenerator.swift index 01bdce5..6a41262 100644 --- a/Memola/Canvas/Elements/Geometries/Stroke/Generators/SolidPointStrokeGenerator.swift +++ b/Memola/Canvas/Elements/Geometries/Stroke/Generators/SolidPointStrokeGenerator.swift @@ -83,7 +83,7 @@ struct SolidPointStrokeGenerator: StrokeGenerator { let factor: CGFloat switch configuration.granularity { case .automatic: - factor = min(5, 1 / (stroke.thickness * 1 / 50)) + factor = min(10, 1 / (stroke.thickness * 1 / 50)) case .fixed: factor = 1 / (stroke.thickness * stroke.penStyle.stepRate) case .none: diff --git a/Memola/Canvas/Elements/Geometries/Stroke/Strokes/PenStroke.swift b/Memola/Canvas/Elements/Geometries/Stroke/Strokes/PenStroke.swift index db944e0..d0cce4a 100644 --- a/Memola/Canvas/Elements/Geometries/Stroke/Strokes/PenStroke.swift +++ b/Memola/Canvas/Elements/Geometries/Stroke/Strokes/PenStroke.swift @@ -152,20 +152,4 @@ final class PenStroke: Stroke, @unchecked Sendable { func getAllErasedQuads() -> [Quad] { eraserStrokes.flatMap { $0.quads } } - - func erase(device: MTLDevice, renderEncoder: MTLRenderCommandEncoder) { - guard !isEmptyErasedQuads, let erasedIndexBuffer else { - return - } - prepare(device: device) - renderEncoder.setFragmentTexture(texture, index: 0) - renderEncoder.setVertexBuffer(erasedVertexBuffer, offset: 0, index: 0) - renderEncoder.drawIndexedPrimitives( - type: .triangle, - indexCount: erasedQuadCount * 6, - indexType: .uint32, - indexBuffer: erasedIndexBuffer, - indexBufferOffset: 0 - ) - } } diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index a7641a4..c68c7c3 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -31,10 +31,15 @@ public class Tool: NSObject, ObservableObject { init(object: ToolObject) { self.object = object + selection = ToolSelection(rawValue: object.selection) ?? .hand } func selectTool(_ selection: ToolSelection) { self.selection = selection + withPersistence(\.viewContext) { [weak object] context in + object?.selection = selection.rawValue + try context.saveIfNeeded() + } } func load() { diff --git a/Memola/Canvas/Tool/Core/ToolSelection.swift b/Memola/Canvas/Tool/Core/ToolSelection.swift index ed3fc26..8ab5d25 100644 --- a/Memola/Canvas/Tool/Core/ToolSelection.swift +++ b/Memola/Canvas/Tool/Core/ToolSelection.swift @@ -7,7 +7,7 @@ import Foundation -enum ToolSelection: Equatable { +enum ToolSelection: Int16, Equatable { case hand case pen case photo diff --git a/Memola/Canvas/View/Bridge/Views/DrawingView.swift b/Memola/Canvas/View/Bridge/Views/DrawingView.swift index 19a268c..74ff29d 100644 --- a/Memola/Canvas/View/Bridge/Views/DrawingView.swift +++ b/Memola/Canvas/View/Bridge/Views/DrawingView.swift @@ -32,7 +32,7 @@ class DrawingView: UIView { } func updateDrawableSize(with size: CGSize) { - renderView.drawableSize = size.multiply(by: 2.6) + renderView.drawableSize = size.multiply(by: 2) } override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { diff --git a/Memola/Features/Memos/MemosView.swift b/Memola/Features/Memos/MemosView.swift index 1e721da..7e5de48 100644 --- a/Memola/Features/Memos/MemosView.swift +++ b/Memola/Features/Memos/MemosView.swift @@ -73,6 +73,7 @@ struct MemosView: View { canvasObject.height = 8_000 let toolObject = ToolObject(\.viewContext) + toolObject.selection = 0 toolObject.pens = [] let eraserPenObject = PenObject.createObject(\.viewContext, penStyle: .eraser) diff --git a/Memola/Persistence/Objects/ToolObject.swift b/Memola/Persistence/Objects/ToolObject.swift index fb26c1a..757d4c2 100644 --- a/Memola/Persistence/Objects/ToolObject.swift +++ b/Memola/Persistence/Objects/ToolObject.swift @@ -10,6 +10,7 @@ import Foundation @objc(ToolObject) class ToolObject: NSManagedObject { + @NSManaged var selection: Int16 @NSManaged var pens: NSMutableSet @NSManaged var memo: MemoObject? } diff --git a/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents b/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents index 0388678..3dddb53 100644 --- a/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents +++ b/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents @@ -73,6 +73,7 @@ +