import Metal public struct RendererDynamicMesh { private weak var _renderer: Renderer! internal let _vertBufs: [MTLBuffer], _idxBufs: [MTLBuffer] private var _numVertices: Int = 0, _numIndices: Int = 0 public let vertexCapacity: Int, indexCapacity: Int public var vertexCount: Int { self._numVertices } public var indexCount: Int { self._numIndices } init(renderer: Renderer, _ vertBufs: [MTLBuffer], _ idxBufs: [MTLBuffer]) { self._renderer = renderer self._vertBufs = vertBufs self._idxBufs = idxBufs self.vertexCapacity = self._vertBufs.map { $0.length }.min()! / MemoryLayout.stride self.indexCapacity = self._idxBufs.map { $0.length }.min()! / MemoryLayout.stride } public mutating func clear() { self._numVertices = 0 self._numIndices = 0 } public mutating func insert(vertices: [VertexType]) { self.insert(vertices: vertices[...]) } public mutating func insert(vertices: ArraySlice) { assert(self._numVertices + vertices.count < self.vertexCapacity) let vertexBuffer: MTLBuffer = self._vertBufs[self._renderer.currentFrame] vertexBuffer.contents().withMemoryRebound(to: VertexType.self, capacity: self.vertexCapacity) { vertexData in for i in 0...stride vertexBuffer.didModifyRange(stride * self._numVertices...stride indexBuffer.didModifyRange(stride * self._numIndices..