Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions Shared/SampleCanvasBackdropLayer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,18 @@ import Foundation
import MetalKit



class SampleCanvasBackdropLayer: CanvasLayer {

lazy var imageRenderable: ImageRenderable? = {
guard let device = self.device else { return nil }
guard let image = XImage(named: "Grid") else { fatalError("not found") }
return ImageRenderable(device: device, image: image, frame: Rect(0, 0, 2048, 1024))!
guard let image = XImage(named: .grid) else { fatalError("not found") }
return ImageRenderable(device: device,
image: image, frame: Rect(0, 0, 2048, 1024))!
}()

lazy var brushPatternTexture: MTLTexture! = {
return self.device?.texture(of: XImage(named: "test")!)!
return self.device?.texture(of: XImage(named: .test)!)!
}()


Expand Down
4 changes: 2 additions & 2 deletions Shared/SampleCanvasScribbleLayer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ import MetalKit
class SampleCanvasScribbleLayer: CanvasLayer {

lazy var brushSapeTexture: MTLTexture? = {
return self.device?.texture(of: XImage(named: "Particle")!)!
return self.device?.texture(of: XImage(named: .particle)!)!
}()


lazy var brushPatternTexture: MTLTexture! = {
return self.device?.texture(of: XImage(named: "Pencil")!)!
return self.device?.texture(of: XImage(named: .pencil)!)!
}()

lazy var strokePaths: [CGPath] = {
Expand Down
10 changes: 5 additions & 5 deletions Shared/SampleScene.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class SampleScene: Scene {
}()

lazy var image1Texture: MTLTexture = {
return self.device.texture(of: XImage(named: "BlueMarble")!)!
return self.device.texture(of: XImage(named: .blueMarble)!)!
}()

// MRAK: -
Expand Down Expand Up @@ -93,13 +93,13 @@ class SampleScene: Scene {
let bezierRenderer = device.renderer() as BezierRenderer
bezierRenderer.render(context: context, cgPaths: [self.samplePath()])

context.widthCGContext { (cgContext) in
context.withCGContext { (cgContext) in
let paragraphStyle : NSMutableParagraphStyle = .makeParagraphStyle()
paragraphStyle.alignment = .center
let attributes = [
NSFontAttributeName: XFont.boldSystemFont(ofSize: 32),
NSForegroundColorAttributeName: XColor.white,
NSParagraphStyleAttributeName: paragraphStyle
NSAttributedStringKey.font: XFont.boldSystemFont(ofSize: 32),
NSAttributedStringKey.foregroundColor: XColor.white,
NSAttributedStringKey.paragraphStyle: paragraphStyle
]
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss"
Expand Down
7 changes: 5 additions & 2 deletions Silvershadow.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,7 @@
CCF3496D1E0F999400EF1312 = {
CreatedOnToolsVersion = 8.2.1;
DevelopmentTeam = 2P97EM4L4N;
LastSwiftMigration = 0910;
ProvisioningStyle = Automatic;
};
};
Expand Down Expand Up @@ -777,7 +778,8 @@
SDKROOT = macosx;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
SWIFT_SWIFT3_OBJC_INFERENCE = On;
SWIFT_VERSION = 4.0;
};
name = Debug;
};
Expand Down Expand Up @@ -826,7 +828,8 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
SWIFT_SWIFT3_OBJC_INFERENCE = On;
SWIFT_VERSION = 4.0;
};
name = Release;
};
Expand Down
31 changes: 15 additions & 16 deletions Silvershadow/BezierRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ class BezierRenderer: Renderer {
}

var library: MTLLibrary {
return self.device.newDefaultLibrary()!
return self.device.makeDefaultLibrary()!
}

lazy var computePipelineState: MTLComputePipelineState = {
Expand Down Expand Up @@ -158,11 +158,11 @@ class BezierRenderer: Renderer {
}()

lazy var shapeSamplerState: MTLSamplerState = {
return self.device.makeSamplerState(descriptor: .`default`)
return self.device.makeDefaultSamplerState()
}()

lazy var patternSamplerState: MTLSamplerState = {
return self.device.makeSamplerState(descriptor: .`default`)
return self.device.makeDefaultSamplerState()
}()

private typealias LineSegment = (type: ElementType, length: CGFloat, p0: CGPoint, p1: CGPoint, p2: CGPoint, p3: CGPoint)
Expand Down Expand Up @@ -212,10 +212,9 @@ class BezierRenderer: Renderer {
lazy var heap: XHeap = {
return self.device.makeHeap(size: 1024 * 1024 * 64) // ??
}()
#endif

#if os(macOS)
var heap: XHeap { return self.device }
#elseif os(macOS)
var heap: XHeap { return self.device }
#endif


Expand Down Expand Up @@ -299,13 +298,13 @@ class BezierRenderer: Renderer {
// build contiguous vertexes using computing shader from PathElement

do {
let encoder = commandBuffer.makeComputeCommandEncoder()
let encoder = commandBuffer.makeComputeCommandEncoder()!
encoder.pushDebugGroup("bezier - kernel")
encoder.setComputePipelineState(computePipelineState)

elementBuffer.set(elements)
encoder.setBuffer(elementBuffer.buffer, offset: 0, at: 0)
encoder.setBuffer(vertexBuffer.buffer, offset: 0, at: 1)
encoder.setBuffer(elementBuffer.buffer, offset: 0, index: 0)
encoder.setBuffer(vertexBuffer.buffer, offset: 0, index: 1)
let threadgroupsPerGrid = MTLSizeMake(elements.count, 1, 1)
let threadsPerThreadgroup = MTLSizeMake(1, 1, 1)
encoder.dispatchThreadgroups(threadgroupsPerGrid, threadsPerThreadgroup: threadsPerThreadgroup)
Expand All @@ -317,20 +316,20 @@ class BezierRenderer: Renderer {
// vertex buffer should be filled with vertexes then draw it

do {
let encoder = commandBuffer.makeRenderCommandEncoder(descriptor: shadingRenderPassDescriptor)
let encoder = commandBuffer.makeRenderCommandEncoder(descriptor: shadingRenderPassDescriptor)!
encoder.pushDebugGroup("bezier - brush shaping")
encoder.setRenderPipelineState(renderPipelineState)

encoder.setFrontFacing(.clockwise)

encoder.setVertexBuffer(vertexBuffer.buffer, offset: 0, at: 0)
encoder.setVertexBuffer(uniformsBuffer, offset: 0, at: 1)
encoder.setVertexBuffer(vertexBuffer.buffer, offset: 0, index: 0)
encoder.setVertexBuffer(uniformsBuffer, offset: 0, index: 1)

encoder.setFragmentTexture(context.brushShape, at: 0)
encoder.setFragmentSamplerState(shapeSamplerState, at: 0)
encoder.setFragmentTexture(context.brushShape, index: 0)
encoder.setFragmentSamplerState(shapeSamplerState, index: 0)

encoder.setFragmentTexture(context.brushPattern, at: 1)
encoder.setFragmentSamplerState(patternSamplerState, at: 1)
encoder.setFragmentTexture(context.brushPattern, index: 1)
encoder.setFragmentSamplerState(patternSamplerState, index: 1)

encoder.drawPrimitives(type: .point, vertexStart: 0, vertexCount: Int(vertexCount))
encoder.popDebugGroup()
Expand Down
3 changes: 1 addition & 2 deletions Silvershadow/CGPath+Z.swift
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,7 @@ public extension CGPath {
}
}

let pathelements = elements.pathElements
return pathelements
return elements.pathElements
}
}

Expand Down
16 changes: 8 additions & 8 deletions Silvershadow/Canvas.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ extension MTLTextureDescriptor {
}

extension MTLDevice {
final func makeTexture2D(size: CGSize, mipmapped: Bool, usage: MTLTextureUsage) -> MTLTexture {
func makeTexture2D(size: CGSize, mipmapped: Bool, usage: MTLTextureUsage) -> MTLTexture {
return makeTexture(descriptor: .texture2DDescriptor(size: size,
mipmapped: mipmapped,
usage: usage))
usage: usage))!
}
}

Expand Down Expand Up @@ -79,7 +79,7 @@ class Canvas: Scene {
}()

lazy var subcomandQueue: MTLCommandQueue = {
return self.device.makeCommandQueue()
return self.device.makeCommandQueue()!
}()

override func update() {
Expand All @@ -97,8 +97,8 @@ class Canvas: Scene {

// clear canvas texture
renderPassDescriptor.colorAttachments[0].loadAction = .clear
let commandBuffer = commandQueue.makeCommandBuffer()
let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor)
let commandBuffer = commandQueue.makeCommandBuffer()!
let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor)!
commandEncoder.endEncoding()
commandBuffer.commit()
renderPassDescriptor.colorAttachments[0].loadAction = .load
Expand All @@ -119,8 +119,8 @@ class Canvas: Scene {
// clear subtexture

subrenderPassDescriptor.colorAttachments[0].loadAction = .clear
let commandBuffer = commandQueue.makeCommandBuffer()
let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: subrenderPassDescriptor)
let commandBuffer = commandQueue.makeCommandBuffer()!
let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: subrenderPassDescriptor)!
commandEncoder.endEncoding()
commandBuffer.commit()
subrenderPassDescriptor.colorAttachments[0].loadAction = .load
Expand Down Expand Up @@ -189,7 +189,7 @@ class Canvas: Scene {

// clear subtexture
let commandBuffer = context.makeCommandBuffer()
let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: subrenderPassDescriptor)
let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: subrenderPassDescriptor)!
commandEncoder.endEncoding()
commandBuffer.commit()

Expand Down
11 changes: 5 additions & 6 deletions Silvershadow/ColorRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class ColorRenderer: Renderer {
}

lazy var library: MTLLibrary = {
return self.device.newDefaultLibrary()!
return self.device.makeDefaultLibrary()!
}()

lazy var renderPipelineState: MTLRenderPipelineState = {
Expand All @@ -77,7 +77,7 @@ class ColorRenderer: Renderer {
}()

lazy var colorSamplerState: MTLSamplerState = {
return self.device.makeSamplerState(descriptor: .`default`)
return self.device.makeDefaultSamplerState()
}()

func render(context: RenderContext, vertexBuffer: VertexBuffer<Vertex>) {
Expand All @@ -86,10 +86,10 @@ class ColorRenderer: Renderer {

let commandBuffer = context.makeCommandBuffer()

let encoder = commandBuffer.makeRenderCommandEncoder(descriptor: context.renderPassDescriptor)
let encoder = commandBuffer.makeRenderCommandEncoder(descriptor: context.renderPassDescriptor)!
encoder.setRenderPipelineState(self.renderPipelineState)
encoder.setVertexBuffer(vertexBuffer.buffer, offset: 0, at: 0)
encoder.setVertexBuffer(uniformsBuffer, offset: 0, at: 1)
encoder.setVertexBuffer(vertexBuffer.buffer, offset: 0, index: 0)
encoder.setVertexBuffer(uniformsBuffer, offset: 0, index: 1)

encoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: vertexBuffer.count)

Expand Down Expand Up @@ -126,7 +126,6 @@ class ColorRenderer: Renderer {

extension RenderContext {


func render(triangles: [(ColorVertex, ColorVertex, ColorVertex)]) {

let renderer: ColorRenderer = self.device.renderer()
Expand Down
2 changes: 1 addition & 1 deletion Silvershadow/CoreGraphics+Z.swift
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ extension CGSize {
func aspectFit(_ size: CGSize) -> CGSize {
let widthRatio = self.width / size.width
let heightRatio = self.height / size.height
let ratio = (widthRatio < heightRatio) ? widthRatio : heightRatio
let ratio = min(widthRatio, heightRatio)
let width = size.width * ratio
let height = size.height * ratio
return CGSize(width: width, height: height)
Expand Down
35 changes: 19 additions & 16 deletions Silvershadow/CrossPlatform.swift
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ import Foundation
}

extension NSView {

func setNeedsLayout() {
layout()
}
Expand All @@ -77,24 +76,21 @@ import Foundation

func sendSubview(toBack: NSView) {
var subviews = self.subviews
guard let index = subviews.index(of: toBack) else { return }
subviews.remove(at: index)
guard let _ = subviews.remove(toBack) else { return }
subviews.insert(toBack, at: 0)
self.subviews = subviews
}

func bringSubview(toFront: NSView) {
var subviews = self.subviews
guard let index = subviews.index(of: toFront) else { return }
subviews.remove(at: index)
guard let _ = subviews.remove(toFront) else { return }
subviews.append(toFront)
self.subviews = subviews
}

func replaceSubview(subview: NSView, with other: NSView) {
var subviews = self.subviews
guard let index = subviews.index(of: subview) else { return }
subviews.remove(at: index)
guard let index = subviews.remove(subview) else { return }
subviews.insert(other, at: index)
self.subviews = subviews
}
Expand All @@ -110,13 +106,18 @@ import Foundation

extension CGContext {
static var current : CGContext? {
return NSGraphicsContext.current()?.cgContext
return NSGraphicsContext.current?.cgContext
}
}

extension NSScrollView {
var zoomScale : CGFloat {
return magnification
get {
return magnification
}
set {
magnification = newValue
}
}
}

Expand Down Expand Up @@ -146,20 +147,22 @@ struct XRGBA {
}

extension XColor {

var rgba: XRGBA {
return .init(color: self)
}
}

extension NSMutableParagraphStyle {
extension XImage.Name {
static let grid = XImage.Name(rawValue: "Grid")
static let test = XImage.Name(rawValue: "test")
static let pencil = XImage.Name(rawValue: "Pencil")
static let particle = XImage.Name(rawValue: "Particle")
static let blueMarble = XImage.Name(rawValue: "BlueMarble")
}

extension NSMutableParagraphStyle {
static func makeParagraphStyle() -> NSMutableParagraphStyle {
#if os(iOS)
return NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
#elseif os(macOS)
return NSParagraphStyle.default().mutableCopy() as! NSMutableParagraphStyle
#endif
return NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
}
}

Expand Down
Loading