feat: embed eraser stroke into stroke texture

This commit is contained in:
dscyrescotti
2024-06-17 23:36:45 +07:00
parent 1c56da1a26
commit efaf63b882
3 changed files with 10 additions and 14 deletions

View File

@@ -69,6 +69,7 @@ final class Renderer {
func draw(in view: MTKView, on canvas: Canvas) {
if !updatesViewPort {
strokeRenderPass.eraserRenderPass = eraserRenderPass
graphicRenderPass.photoRenderPass = photoRenderPass
graphicRenderPass.strokeRenderPass = strokeRenderPass
graphicRenderPass.eraserRenderPass = eraserRenderPass

View File

@@ -67,13 +67,6 @@ class GraphicRenderPass: RenderPass {
strokeRenderPass.graphicDescriptor = descriptor
strokeRenderPass.graphicPipelineState = graphicPipelineState
strokeRenderPass.draw(on: canvas, with: renderer)
if let stroke = stroke as? PenStroke, !stroke.isEmptyErasedQuads {
descriptor.colorAttachments[0].loadAction = .load
eraserRenderPass.stroke = stroke
eraserRenderPass.descriptor = descriptor
eraserRenderPass.draw(on: canvas, with: renderer)
}
}
case .photo(let photo):
descriptor.colorAttachments[0].loadAction = clearsTexture ? .clear : .load
@@ -103,13 +96,6 @@ class GraphicRenderPass: RenderPass {
strokeRenderPass.graphicDescriptor = descriptor
strokeRenderPass.graphicPipelineState = graphicPipelineState
strokeRenderPass.draw(on: canvas, with: renderer)
if let stroke = stroke as? PenStroke, !stroke.isEmptyErasedQuads {
descriptor.colorAttachments[0].loadAction = .load
eraserRenderPass.stroke = stroke
eraserRenderPass.descriptor = descriptor
eraserRenderPass.draw(on: canvas, with: renderer)
}
}
case .photo(let photo):
photoRenderPass.photo = photo

View File

@@ -21,6 +21,8 @@ class StrokeRenderPass: RenderPass {
var stroke: (any Stroke)?
var strokeTexture: MTLTexture?
weak var eraserRenderPass: EraserRenderPass?
init(renderer: Renderer) {
descriptor = MTLRenderPassDescriptor()
strokePipelineState = PipelineStates.createStrokePipelineState(from: renderer)
@@ -57,6 +59,13 @@ class StrokeRenderPass: RenderPass {
renderEncoder.endEncoding()
commandBuffer.commit()
if let eraserRenderPass, let stroke = stroke as? PenStroke, !stroke.isEmptyErasedQuads {
descriptor.colorAttachments[0].loadAction = .load
eraserRenderPass.stroke = stroke
eraserRenderPass.descriptor = descriptor
eraserRenderPass.draw(on: canvas, with: renderer)
}
drawStrokeTexture(on: canvas, with: renderer)
}