-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathExampleARSCNViewManager.m
73 lines (57 loc) · 1.94 KB
/
ExampleARSCNViewManager.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#import "ExampleARSCNViewManager.h"
#import <React/RCTUIManager.h>
#import <RNWebRTCARSession/RNWebRTCARSession.h>
@interface ExampleARSCNViewManager () <ARSCNViewDelegate, ARSessionDelegate>
@end
@implementation ExampleARSCNViewManager
static ARSCNView *_arView = nil;
RCT_EXPORT_MODULE()
- (UIView *)view
{
return [self instance];
}
- (ARSCNView*)instance {
if (_arView != nil) {
return _arView;
}
ARSCNView *arView = [[ARSCNView alloc] init];
arView.delegate = self;
arView.session.delegate = self;
arView.showsStatistics = true;
_arView = arView;
[self resume];
return _arView;
}
RCT_CUSTOM_VIEW_PROPERTY(debug, BOOL, ARSCNView) {
_arView.showsStatistics = [RCTConvert BOOL:json];
}
- (void)pause {
[_arView.session pause];
}
- (void)resume {
ARFaceTrackingConfiguration *configuration = [ARFaceTrackingConfiguration new];
[_arView.session runWithConfiguration:configuration];
}
#pragma mark - ARSCNViewDelegate
- (nullable SCNNode *)renderer:(id <SCNSceneRenderer>)renderer nodeForAnchor:(ARAnchor *)anchor {
ARSCNFaceGeometry *faceMesh = [ARSCNFaceGeometry faceGeometryWithDevice:_arView.device];
SCNNode *node = [SCNNode nodeWithGeometry:faceMesh];
node.geometry.firstMaterial.fillMode = SCNFillModeLines;
return node;
}
- (void)renderer:(id <SCNSceneRenderer>)renderer didUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor {
if ([anchor isKindOfClass:[ARFaceAnchor class]] && [node.geometry isKindOfClass:[ARSCNFaceGeometry class]]) {
ARFaceAnchor *faceAnchor = anchor;
ARSCNFaceGeometry *faceMesh = node.geometry;
[faceMesh updateFromFaceGeometry:faceAnchor.geometry];
}
}
RCT_EXPORT_METHOD(injectARSession:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
[RNWebRTCARSession setArView:_arView];
resolve(@{});
}
RCT_EXPORT_METHOD(revertARSession:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
[RNWebRTCARSession setArView:nil];
resolve(@{});
}
@end