diff --git a/Memola/Canvas/RenderPasses/GraphicRenderPass.swift b/Memola/Canvas/RenderPasses/GraphicRenderPass.swift index 0056320..c392315 100644 --- a/Memola/Canvas/RenderPasses/GraphicRenderPass.swift +++ b/Memola/Canvas/RenderPasses/GraphicRenderPass.swift @@ -97,6 +97,10 @@ class GraphicRenderPass: RenderPass { photoRenderPass?.elementGroup = elementGroup photoRenderPass?.descriptor = descriptor photoRenderPass?.draw(into: commandBuffer, on: canvas, with: renderer) + + photoBackgroundRenderPass?.elementGroup = elementGroup + photoBackgroundRenderPass?.clearsTexture = clearsTexture + photoBackgroundRenderPass?.draw(into: commandBuffer, on: canvas, with: renderer) clearsTexture = false } } diff --git a/Memola/Canvas/RenderPasses/PhotoBackgroundRenderPass.swift b/Memola/Canvas/RenderPasses/PhotoBackgroundRenderPass.swift index 9a1e231..fbb5d11 100644 --- a/Memola/Canvas/RenderPasses/PhotoBackgroundRenderPass.swift +++ b/Memola/Canvas/RenderPasses/PhotoBackgroundRenderPass.swift @@ -18,6 +18,7 @@ class PhotoBackgroundRenderPass: RenderPass { var photoBackgroundTexture: MTLTexture? var photo: Photo? + var elementGroup: ElementGroup? var clearsTexture: Bool = true @@ -31,10 +32,7 @@ class PhotoBackgroundRenderPass: RenderPass { } func draw(into commandBuffer: any MTLCommandBuffer, on canvas: Canvas, with renderer: Renderer) { - - } - - func draw(on canvas: Canvas, with renderer: Renderer) { + guard let elementGroup else { return } guard let descriptor else { return } descriptor.colorAttachments[0].texture = photoBackgroundTexture @@ -42,20 +40,25 @@ class PhotoBackgroundRenderPass: RenderPass { descriptor.colorAttachments[0].loadAction = clearsTexture ? .clear : .load descriptor.colorAttachments[0].clearColor = MTLClearColor(red: 1, green: 1, blue: 1, alpha: 0) - guard let commandBuffer = renderer.commandQueue.makeCommandBuffer() else { return } - commandBuffer.label = "Photo Background Command Buffer" + guard !elementGroup.isEmpty else { return } + + let photos = elementGroup.elements.compactMap { element -> Photo? in + guard case .photo(let photo) = element else { return nil } + return photo + } guard let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: descriptor) else { return } - renderEncoder.label = label + renderEncoder.label = "Photo Background Render Encoder" guard let photoBackgroundPipelineState else { return } renderEncoder.setRenderPipelineState(photoBackgroundPipelineState) canvas.setUniformsBuffer(device: renderer.device, renderEncoder: renderEncoder) - photo?.draw(device: renderer.device, renderEncoder: renderEncoder) + + for photo in photos { + photo.draw(device: renderer.device, renderEncoder: renderEncoder) + } renderEncoder.endEncoding() - commandBuffer.commit() - commandBuffer.waitUntilCompleted() } } diff --git a/Memola/Canvas/RenderPasses/PhotoRenderPass.swift b/Memola/Canvas/RenderPasses/PhotoRenderPass.swift index 1127990..f4c291c 100644 --- a/Memola/Canvas/RenderPasses/PhotoRenderPass.swift +++ b/Memola/Canvas/RenderPasses/PhotoRenderPass.swift @@ -34,9 +34,9 @@ class PhotoRenderPass: RenderPass { guard case .photo(let photo) = element else { return nil } return photo } - + guard let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: descriptor) else { return } - renderEncoder.label = label + renderEncoder.label = "Photo Render Encoder" guard let photoPipelineState else { return } renderEncoder.setRenderPipelineState(photoPipelineState)