Creative coding framework for Swift.
Using Metal directly for rendering. Inspired by Processing. Supports visionOS.
- Swift5.9
- macOS v14
- iOS v17
- visionOS v1
- tvOS v17
You can easily create your graphics, using Swift Programming Language with the intuitive essence of Processing.
I like how push()
and pop()
became super simple using Swift's trailing closure.
import SwiftyCreatives
final class MySketch: Sketch {
override func draw(encoder: SCEncoder) {
let count = 20
for i in 0..<count {
color(0.75, Float(i) / 40, 1, 0.5)
push {
rotateY(Float.pi * 2 / Float(count) * Float(i))
translate(10, 0, 0)
box(0, 0, 0, 1, 1, 1)
}
}
}
}
struct ContentView: View {
var body: some View {
SketchView(MySketch())
}
}
Supports visionOS! You can dive in to your sketch with Immersive Space rendering!
ImmersiveSpace(id: "ImmersiveSpace") {
CompositorLayer(configuration: ContentStageConfiguration()) { layerRenderer in
let renderer = RendererBase.BlendMode.normalBlend.getRenderer(sketch: SampleSketch(), layerRenderer: layerRenderer)
renderer.startRenderLoop()
}
}
Create UIView with xib, and place it in 3D scene!
UIButton can be connected with IBAction, and can be tapped in 3d space.
Use Swift Package Manager.
dependencies: [
.package(url: "https://github.com/yukiny0811/swifty-creatives.git", branch: "main")
]
.product(name: "SwiftyCreatives", package: "swifty-creatives")
- Geometries
- Rectangle
- Circle
- Box
- Triangle
- Line
- BoldLine
- 3D Model (obj)
- Image
- Text
- 3D Text
- UIView Object (3d view created from xib, with interactive button)
- Mesh
- Vertex Buffer
- SVG
- Geometries with Hit Test (you can click or hover on it)
- HitTestableRect
- HitTestableBox
- HitTestableImg
- Effects
- Color
- Fog
- Bloom
- Post Process (you can create your own)
- Transforms
- Translate
- Rotate
- Scale
- Push & Pop
- Rendering
- Normal rendering with depth test
- Add blend rendering
- Transparent rendering with depth test
- Animation
- SCAnimatable property wrapper for animations
- Audio
- Audio Input
- FFT
- Camera
- Perspective Camera
- Orthographic Camera
- Customizable fov
- View
- SwiftUI View
- UIKit View
- visionOS Immersive Space
- Others
- Creating original geomery class
- Font Rendering
open func setupCamera(camera: MainCamera) {}
open func preProcess(commandBuffer: MTLCommandBuffer) {}
open func update(camera: MainCamera) {}
open func draw(encoder: SCEncoder) {}
open func afterCommit(texture: MTLTexture?) {}
open func postProcess(texture: MTLTexture, commandBuffer: MTLCommandBuffer) {}
#if os(macOS)
open func mouseMoved(camera: MainCamera, location: f2) {}
open func mouseDown(camera: MainCamera, location: f2) {}
open func mouseDragged(camera: MainCamera, location: f2) {}
open func mouseUp(camera: MainCamera, location: f2) {}
open func mouseEntered(camera: MainCamera, location: f2) {}
open func mouseExited(camera: MainCamera, location: f2) {}
open func keyDown(with event: NSEvent, camera: MainCamera, viewFrame: CGRect) {}
open func keyUp(with event: NSEvent, camera: MainCamera, viewFrame: CGRect) {}
open func viewWillStartLiveResize(camera: MainCamera, viewFrame: CGRect) {}
open func resize(withOldSuperviewSize oldSize: NSSize, camera: MainCamera, viewFrame: CGRect) {}
open func viewDidEndLiveResize(camera: MainCamera, viewFrame: CGRect) {}
open func scrollWheel(with event: NSEvent, camera: MainCamera, viewFrame: CGRect) {}
#endif
#if os(iOS)
open func onScroll(delta: CGPoint, camera: MainCamera, view: UIView, gestureRecognizer: UIPanGestureRecognizer) {}
open func touchesBegan(camera: MainCamera, touchLocations: [f2]) {}
open func touchesMoved(camera: MainCamera, touchLocations: [f2]) {}
open func touchesEnded(camera: MainCamera, touchLocations: [f2]) {}
open func touchesCancelled(camera: MainCamera, touchLocations: [f2]) {}
#endif
- swifty-creatives library is created by Yuki Kuwashima
- twitter: @yukiny_sfc