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