Awesome
SwiftyCreatives
Creative coding framework for Swift.
Using Metal directly for rendering. Inspired by Processing. Supports visionOS.
Requirements
- Swift5.9
Supported Platforms
- macOS v14
- iOS v17
- visionOS v1
- tvOS v17
Key Features
Processing-like Syntax
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())
}
}
Apple Vision Pro - Immersive Space
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()
}
}
xib to 3D Space!
Create UIView with xib, and place it in 3D scene!
UIButton can be connected with IBAction, and can be tapped in 3d space.
Installation
Use Swift Package Manager.
dependencies: [
.package(url: "https://github.com/yukiny0811/swifty-creatives.git", branch: "main")
]
.product(name: "SwiftyCreatives", package: "swifty-creatives")
Features
- 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
Events
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
Other Examples
Credits
- swifty-creatives library is created by Yuki Kuwashima
- twitter: @yukiny_sfc