mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-07-10 23:02:55 +02:00
Merge pull request #47 from dscyrescotti/feature/photo-render-pass
Fix content disappearing in subsequent render
This commit is contained in:
@@ -48,35 +48,36 @@ final class Photo: @unchecked Sendable, Equatable, Comparable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func generateVertices() {
|
func generateVertices() {
|
||||||
let minX = origin.x - size.width / 2
|
let minX = origin.x - (size.width / 2)
|
||||||
let maxX = origin.x + size.width / 2
|
let maxX = origin.x + (size.width / 2)
|
||||||
let minY = origin.y - size.height / 2
|
let minY = origin.y - (size.height / 2)
|
||||||
let maxY = origin.y + size.height / 2
|
let maxY = origin.y + (size.height / 2)
|
||||||
vertices = [
|
vertices = [
|
||||||
PhotoVertex(x: minX, y: minY, textCoord: CGPoint(x: 0, y: 0)),
|
PhotoVertex(x: minX, y: minY, textCoord: CGPoint(x: 0, y: 0)),
|
||||||
|
PhotoVertex(x: maxX, y: minY, textCoord: CGPoint(x: 1, y: 0)),
|
||||||
PhotoVertex(x: minX, y: maxY, textCoord: CGPoint(x: 0, y: 1)),
|
PhotoVertex(x: minX, y: maxY, textCoord: CGPoint(x: 0, y: 1)),
|
||||||
PhotoVertex(x: maxX, y: minY, textCoord: CGPoint(x: 1, y: 0)),
|
PhotoVertex(x: maxX, y: minY, textCoord: CGPoint(x: 1, y: 0)),
|
||||||
PhotoVertex(x: maxX, y: maxY, textCoord: CGPoint(x: 1, y: 1)),
|
PhotoVertex(x: minX, y: maxY, textCoord: CGPoint(x: 0, y: 1)),
|
||||||
|
PhotoVertex(x: maxX, y: maxY, textCoord: CGPoint(x: 1, y: 1))
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Photo: Drawable {
|
extension Photo: Drawable {
|
||||||
func prepare(device: any MTLDevice) {
|
func prepare(device: any MTLDevice) {
|
||||||
if vertexBuffer == nil {
|
|
||||||
vertexCount = vertices.endIndex
|
|
||||||
vertexBuffer = device.makeBuffer(bytes: vertices, length: vertexCount * MemoryLayout<PhotoVertex>.stride, options: [])
|
|
||||||
}
|
|
||||||
if texture == nil, let url = bookmark?.getBookmarkURL() {
|
if texture == nil, let url = bookmark?.getBookmarkURL() {
|
||||||
texture = Textures.createPhotoTexture(for: url, on: device)
|
texture = Textures.createPhotoTexture(for: url, on: device)
|
||||||
}
|
}
|
||||||
|
vertexCount = vertices.endIndex
|
||||||
|
vertexBuffer = device.makeBuffer(bytes: vertices, length: vertexCount * MemoryLayout<PhotoVertex>.stride, options: [.cpuCacheModeWriteCombined])
|
||||||
}
|
}
|
||||||
|
|
||||||
func draw(device: any MTLDevice, renderEncoder: any MTLRenderCommandEncoder) {
|
func draw(device: any MTLDevice, renderEncoder: any MTLRenderCommandEncoder) {
|
||||||
prepare(device: device)
|
prepare(device: device)
|
||||||
renderEncoder.setFragmentTexture(texture, index: 0)
|
renderEncoder.setFragmentTexture(texture, index: 0)
|
||||||
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
|
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
|
||||||
renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: vertices.count)
|
renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: vertices.count)
|
||||||
|
vertexBuffer = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,8 +69,8 @@ class EraserRenderPass: RenderPass {
|
|||||||
computeEncoder.label = "Quad Render Pass"
|
computeEncoder.label = "Quad Render Pass"
|
||||||
|
|
||||||
let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout<Quad>.stride * quadCount, options: [])
|
let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout<Quad>.stride * quadCount, options: [])
|
||||||
let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout<UInt>.stride * quadCount * 6, options: [])
|
let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout<UInt>.stride * quadCount * 6, options: [.cpuCacheModeWriteCombined])
|
||||||
let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout<QuadVertex>.stride * quadCount * 4, options: [])
|
let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout<QuadVertex>.stride * quadCount * 4, options: [.cpuCacheModeWriteCombined])
|
||||||
|
|
||||||
computeEncoder.setComputePipelineState(quadPipelineState)
|
computeEncoder.setComputePipelineState(quadPipelineState)
|
||||||
computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0)
|
computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0)
|
||||||
|
|||||||
@@ -79,8 +79,8 @@ class StrokeRenderPass: RenderPass {
|
|||||||
let quadCount = stroke.quads.endIndex
|
let quadCount = stroke.quads.endIndex
|
||||||
var quads = stroke.quads
|
var quads = stroke.quads
|
||||||
let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout<Quad>.stride * quadCount, options: [])
|
let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout<Quad>.stride * quadCount, options: [])
|
||||||
let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout<UInt>.stride * quadCount * 6, options: [])
|
let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout<UInt>.stride * quadCount * 6, options: [.cpuCacheModeWriteCombined])
|
||||||
let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout<QuadVertex>.stride * quadCount * 4, options: [])
|
let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout<QuadVertex>.stride * quadCount * 4, options: [.cpuCacheModeWriteCombined])
|
||||||
|
|
||||||
computeEncoder.setComputePipelineState(quadPipelineState)
|
computeEncoder.setComputePipelineState(quadPipelineState)
|
||||||
computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0)
|
computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user