From 4bf603a4051bee83b28cf9e6d4d10560d090e35a Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sat, 18 May 2024 01:36:09 +0700 Subject: [PATCH] feat: add vertex generator in eraser render pass --- .../RenderPasses/EraserRenderPass.swift | 30 +++++++++++++++++++ .../Features/Memo/PenTool/PenToolView.swift | 1 + 2 files changed, 31 insertions(+) diff --git a/Memola/Canvas/RenderPasses/EraserRenderPass.swift b/Memola/Canvas/RenderPasses/EraserRenderPass.swift index ab4aab8..46bbe54 100644 --- a/Memola/Canvas/RenderPasses/EraserRenderPass.swift +++ b/Memola/Canvas/RenderPasses/EraserRenderPass.swift @@ -14,12 +14,14 @@ class EraserRenderPass: RenderPass { var descriptor: MTLRenderPassDescriptor? var eraserPipelineState: MTLRenderPipelineState? + var quadPipelineState: MTLComputePipelineState? var stroke: Stroke? weak var graphicTexture: MTLTexture? init(renderer: Renderer) { eraserPipelineState = PipelineStates.createEraserPipelineState(from: renderer) + quadPipelineState = PipelineStates.createQuadPipelineState(from: renderer) } func resize(on view: MTKView, to size: CGSize, with renderer: Renderer) { } @@ -27,6 +29,8 @@ class EraserRenderPass: RenderPass { func draw(on canvas: Canvas, with renderer: Renderer) { guard let descriptor else { return } + generateVertexBuffer(on: canvas, with: renderer) + guard let commandBuffer = renderer.commandQueue.makeCommandBuffer() else { return } commandBuffer.label = "Eraser Command Buffer" @@ -42,4 +46,30 @@ class EraserRenderPass: RenderPass { renderEncoder.endEncoding() commandBuffer.commit() } + + private func generateVertexBuffer(on canvas: Canvas, with renderer: Renderer) { + guard let stroke, !stroke.quads.isEmpty, let quadPipelineState else { return } + guard let quadCommandBuffer = renderer.commandQueue.makeCommandBuffer() else { return } + guard let computeEncoder = quadCommandBuffer.makeComputeCommandEncoder() else { return } + + computeEncoder.label = "Quad Render Pass" + + let quadCount = stroke.quads.endIndex + var quads = stroke.quads + let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout.stride * quadCount, options: []) + let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout.stride * quadCount * 6, options: []) + + computeEncoder.setComputePipelineState(quadPipelineState) + computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0) + computeEncoder.setBuffer(vertexBuffer, offset: 0, index: 1) + + stroke.vertexBuffer = vertexBuffer + + let threadsPerGroup = MTLSize(width: 1, height: 1, depth: 1) + let numThreadgroups = MTLSize(width: quadCount + 1, height: 1, depth: 1) + computeEncoder.dispatchThreadgroups(numThreadgroups, threadsPerThreadgroup: threadsPerGroup) + computeEncoder.endEncoding() + quadCommandBuffer.commit() + quadCommandBuffer.waitUntilCompleted() + } } diff --git a/Memola/Features/Memo/PenTool/PenToolView.swift b/Memola/Features/Memo/PenTool/PenToolView.swift index 0172a48..2ff0627 100644 --- a/Memola/Features/Memo/PenTool/PenToolView.swift +++ b/Memola/Features/Memo/PenTool/PenToolView.swift @@ -129,6 +129,7 @@ struct PenToolView: View { .font(.title2) .contentShape(.circle) } + .foregroundStyle(.green) .hoverEffect(.lift) .padding(10) }