feat: add vertex generator in eraser render pass

This commit is contained in:
dscyrescotti
2024-05-18 01:36:09 +07:00
parent 821b34e158
commit 4bf603a405
2 changed files with 31 additions and 0 deletions

View File

@@ -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<Quad>.stride * quadCount, options: [])
let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout<QuadVertex>.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()
}
}

View File

@@ -129,6 +129,7 @@ struct PenToolView: View {
.font(.title2)
.contentShape(.circle)
}
.foregroundStyle(.green)
.hoverEffect(.lift)
.padding(10)
}