Skip to content

Commit 054d23c

Browse files
committed
added SceneKit rendering
1 parent 7fb760d commit 054d23c

15 files changed

Lines changed: 64 additions & 3 deletions

File tree

ARVideoKit/Rendering/RenderAR.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ internal struct RenderAR {
2727
}else if let view = view as? ARSKView {
2828
guard let rawBuffer = view.session.currentFrame?.capturedImage else{return nil}
2929
return rawBuffer
30+
}else if let _ = view as? SCNView {
31+
return buffer
3032
}
3133
return nil
3234
}
@@ -99,6 +101,18 @@ internal struct RenderAR {
99101
}
100102
guard let buffer = renderedFrame!.buffer else{return nil};
101103
return buffer;
104+
}else if let _ = view as? SCNView {
105+
let size = UIScreen.main.bounds.size
106+
var renderedFrame:UIImage?
107+
pixelsQueue.sync {
108+
renderedFrame = renderEngine.snapshot(atTime: self.time, with: size, antialiasingMode: .none);
109+
}
110+
if let _ = renderedFrame {
111+
}else{
112+
renderedFrame = renderEngine.snapshot(atTime: time, with: size, antialiasingMode: .none);
113+
}
114+
guard let buffer = renderedFrame!.buffer else{return nil};
115+
return buffer;
102116
}
103117
return nil;
104118
}

ARVideoKit/Sources/ARView.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,22 @@ fileprivate var recentAngle = 0
8080
parentVC = vc
8181
}
8282

83+
@objc init?(SceneKit:SCNView) {
84+
super.init()
85+
NotificationCenter.default.addObserver(self, selector: #selector(deviceDidRotate), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
86+
87+
let value = UIInterfaceOrientation.portrait.rawValue
88+
UIDevice.current.setValue(value, forKey: "orientation")
89+
90+
ViewAR.orientation = .portrait
91+
92+
guard let vc = SceneKit.parent else {
93+
return
94+
}
95+
96+
parentVC = vc
97+
}
98+
8399
@objc fileprivate func deviceDidRotate() {
84100
guard var views = parentVC?.view.subviews else {
85101
return

ARVideoKit/Sources/RecordAR.swift

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,16 @@ fileprivate var renderer:RenderAR!
128128
logAR.message("Error occurred while loading SK Video Assets : \(error). Please download \"video.scnassets\" from\nwww.ahmedbekhit.com/ARVideoKitAssets")
129129
}
130130
}
131+
132+
/**
133+
Initialize 🌞🍳 `RecordAR` with an `SCNView` 🚀.
134+
*/
135+
@objc override public init?(SceneKit: SCNView) {
136+
super.init(SceneKit: SceneKit)
137+
view = SceneKit
138+
setup()
139+
}
140+
131141
//MARK: - Internal threads
132142
internal let writerQueue = DispatchQueue(label:"com.ahmedbekhit.WriterQueue")
133143
internal let gifWriterQueue = DispatchQueue(label: "com.ahmedbekhit.GIFWriterQueue", attributes: .concurrent)
@@ -142,6 +152,8 @@ fileprivate var renderer:RenderAR!
142152
return view.parent!
143153
}else if let view = view as? ARSKView {
144154
return view.parent!
155+
}else if let view = view as? SCNView {
156+
return view.parent!
145157
}
146158
return nil
147159
}
@@ -180,6 +192,7 @@ fileprivate var renderer:RenderAR!
180192
let vidPath = "\(documentsDirectory)/\(formatter.string(from: date))ARVideo.mp4"
181193
return URL(fileURLWithPath: vidPath, isDirectory: false)
182194
}
195+
183196
//MARK: - Internal Video Setup
184197
internal func setup() {
185198
if let view = view as? ARSCNView {
@@ -211,6 +224,16 @@ fileprivate var renderer:RenderAR!
211224
gpuLoop.preferredFramesPerSecond = fps.rawValue
212225
gpuLoop.add(to: .main, forMode: .commonModes)
213226

227+
status = .readyToRecord
228+
}else if let view = view as? SCNView {
229+
guard let mtlDevice = MTLCreateSystemDefaultDevice() else {logAR.message("ERROR:- This device does not support Metal");return}
230+
renderEngine = SCNRenderer(device: mtlDevice, options: nil)
231+
renderEngine.scene = view.scene
232+
233+
gpuLoop = CADisplayLink(target: self, selector: #selector(renderFrame))
234+
gpuLoop.preferredFramesPerSecond = fps.rawValue
235+
gpuLoop.add(to: .main, forMode: .commonModes)
236+
214237
status = .readyToRecord
215238
}
216239

@@ -669,6 +692,10 @@ fileprivate var renderer:RenderAR!
669692
ViewAR.orientation = .portrait
670693

671694
view.session.run(configuration)
695+
}else if let _ = view as? SCNView {
696+
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
697+
ViewAR.orientation = .portrait
698+
672699
}
673700

674701
onlyRenderWhileRec = onlyRenderWhileRecording
@@ -689,12 +716,11 @@ internal extension RecordAR {
689716
@objc internal func renderFrame() {
690717
//frame rendering
691718
if self.onlyRenderWhileRec && !isRecording && !isRecordingGIF {return}
692-
693719
guard let buffer = renderer.buffer else{return}
694720
guard let rawBuffer = renderer.rawBuffer else{logAR.message("ERROR:- An error occurred while rendering the camera's main buffers.");return}
695721
guard let size = renderer.bufferSize else{logAR.message("ERROR:- An error occurred while rendering the camera buffer.");return}
696722
renderer.ARcontentMode = contentMode
697-
723+
698724
self.writerQueue.sync {
699725
var time:CMTime {return CMTimeMakeWithSeconds(renderer.time, 1000000);}
700726

48.1 KB
Binary file not shown.

Framework Build/ARVideoKit.framework/Headers/ARVideoKit-Swift.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ enum RecordARMicrophoneStatus : NSInteger;
285285
enum RecordARMicrophonePermission : NSInteger;
286286
@class ARSCNView;
287287
@class ARSKView;
288+
@class SCNView;
288289
@class UIImage;
289290

290291
/// This class renders the <code>ARSCNView</code> or <code>ARSKView</code> content with the device’s camera stream to generate a video 📹, photo 🌄, live photo 🎇 or GIF 🎆.
@@ -334,10 +335,14 @@ SWIFT_CLASS("_TtC10ARVideoKit8RecordAR") SWIFT_AVAILABILITY(ios,introduced=11.0)
334335
@property (nonatomic) BOOL adjustGIFForSharing;
335336
/// A boolean that enables or disables clearing cached media after exporting to Camera Roll. Default is <code>true</code>.
336337
@property (nonatomic) BOOL deleteCacheWhenExported;
338+
/// A boolean that enables or disables using envronment light rendering. Default is <code>false</code>.
339+
@property (nonatomic) BOOL enableAdjsutEnvironmentLighting;
337340
/// Initialize 🌞🍳 <code>RecordAR</code> with an <code>ARSCNView</code> 🚀.
338341
- (nullable instancetype)initWithARSceneKit:(ARSCNView * _Nonnull)ARSceneKit OBJC_DESIGNATED_INITIALIZER;
339342
/// Initialize 🌞🍳 <code>RecordAR</code> with an <code>ARSKView</code> 👾.
340343
- (nullable instancetype)initWithARSpriteKit:(ARSKView * _Nonnull)ARSpriteKit OBJC_DESIGNATED_INITIALIZER;
344+
/// Initialize 🌞🍳 <code>RecordAR</code> with an <code>SCNView</code> 🚀.
345+
- (nullable instancetype)initWithSceneKit:(SCNView * _Nonnull)SceneKit OBJC_DESIGNATED_INITIALIZER;
341346
/// A method that renders a photo 🌄 and returns it as <code>UIImage</code>.
342347
- (UIImage * _Nonnull)photo SWIFT_WARN_UNUSED_RESULT;
343348
/// A method that renders a <code>PHLivePhoto</code> 🎇 and returns <code>PHLivePhotoPlus</code> in the completion handler.

Framework Build/ARVideoKit.framework/LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@
186186
same "printed page" as the copyright notice for easier
187187
identification within third-party archives.
188188

189-
Copyright 2017 Ahmed Fathi Bekhit - me@ahmedbekhit.com
189+
Copyright 2017 Ahmed Fathi Bekhit, www.ahmedbekhit.com, me@ahmedbekhit.com
190190

191191
ARVideoKit is licensed under the Apache License, Version 2.0 (the "License");
192192
you may not use this file except in compliance with the License.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)