diff --git a/README.md b/README.md index 9032aa03..c610a4f6 100644 --- a/README.md +++ b/README.md @@ -248,7 +248,11 @@ Most objects take a material property with these sub-props: | `diffuse` | colorstring | diffuse color | | `metalness` | number | metalness of the object | | `roughness` | number | roughness of the object | +| `doubleSided` | boolean | render both sides, default is `true` | +| `litPerPixel` | boolean | calculate lighting per-pixel or vertex [litPerPixel](https://developer.apple.com/documentation/scenekit/scnmaterial/1462580-litperpixel) | | `lightingModel` | `ARKit.LightingModel.*` | [LightingModel](https://developer.apple.com/documentation/scenekit/scnmaterial.lightingmodel) | +| `blendMode` | `ARKit.BlendMode.*` | [BlendMode](https://developer.apple.com/documentation/scenekit/scnmaterial/1462585-blendmode) | +| `fillMode` | `ARKit.FillMode.*` | [FillMode](https://developer.apple.com/documentation/scenekit/scnmaterial/2867442-fillmode) | `shaders` | Object with keys from `ARKit.ShaderModifierEntryPoint.*` and shader strings as values | [Shader modifiers](https://developer.apple.com/documentation/scenekit/scnshadable) | | `colorBufferWriteMask` | `ARKit.ColorMask.*` | [color mask](https://developer.apple.com/documentation/scenekit/scncolormask). Set to ARKit.ColorMask.None so that an object is transparent, but receives deferred shadows. | diff --git a/components/lib/propTypes.js b/components/lib/propTypes.js index 6b5fdb0c..49ff11a1 100644 --- a/components/lib/propTypes.js +++ b/components/lib/propTypes.js @@ -51,6 +51,7 @@ export const renderingOrder = PropTypes.number; export const blendMode = PropTypes.oneOf(values(ARKitManager.BlendMode)); export const chamferMode = PropTypes.oneOf(values(ARKitManager.ChamferMode)); export const color = PropTypes.string; +export const fillMode = PropTypes.oneOf(values(ARKitManager.FillMode)); export const lightType = PropTypes.oneOf(values(ARKitManager.LightType)); export const shadowMode = PropTypes.oneOf(values(ARKitManager.ShadowMode)); @@ -66,4 +67,7 @@ export const material = PropTypes.shape({ shaders, writesToDepthBuffer: PropTypes.bool, colorBufferWriteMask, + doubleSided: PropTypes.bool, + litPerPixel: PropTypes.bool, + fillMode, }); diff --git a/ios/RCTARKitManager.m b/ios/RCTARKitManager.m index bc5c2b6e..7b0e72be 100644 --- a/ios/RCTARKitManager.m +++ b/ios/RCTARKitManager.m @@ -22,7 +22,7 @@ - (UIView *)view { - (NSDictionary *)constantsToExport { - + return @{ @"ARHitTestResultType": @{ @"FeaturePoint": @(ARHitTestResultTypeFeaturePoint), @@ -58,7 +58,7 @@ - (NSDictionary *)constantsToExport @"Red": [@(SCNColorMaskRed) stringValue], @"Green": [@(SCNColorMaskGreen) stringValue], }, - + @"ShaderModifierEntryPoint": @{ @"Geometry": SCNShaderModifierEntryPointGeometry, @"Surface": SCNShaderModifierEntryPointSurface, @@ -72,18 +72,22 @@ - (NSDictionary *)constantsToExport @"Multiply": [@(SCNBlendModeMultiply) stringValue], @"Screen": [@(SCNBlendModeScreen) stringValue], @"Replace": [@(SCNBlendModeReplace) stringValue], - + }, @"ChamferMode": @{ @"Both": [@(SCNChamferModeBoth) stringValue], @"Back": [@(SCNChamferModeBack) stringValue], @"Front": [@(SCNChamferModeBack) stringValue], - + }, @"ARWorldAlignment": @{ @"Gravity": @(ARWorldAlignmentGravity), @"GravityAndHeading": @(ARWorldAlignmentGravityAndHeading), @"Camera": @(ARWorldAlignmentCamera), + }, + @"FillMode": @{ + @"Fill": [@(SCNFillModeFill) stringValue], + @"Lines": [@(SCNFillModeLines) stringValue], } }; } @@ -152,19 +156,19 @@ - (NSString *)getAssetUrl:(NSString *)localID { - (void)storeImageInPhotoAlbum:(UIImage *)image reject:(RCTPromiseRejectBlock)reject resolve:(RCTPromiseResolveBlock)resolve { __block PHObjectPlaceholder *placeholder; - + [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ PHAssetChangeRequest* createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; placeholder = [createAssetRequest placeholderForCreatedAsset]; - + } completionHandler:^(BOOL success, NSError *error) { if (success) { - + NSString * localID = placeholder.localIdentifier; - + NSString * assetURLStr = [self getAssetUrl:localID]; - + resolve(@{@"url": assetURLStr, @"width":@(image.size.width), @"height": @(image.size.height)}); } else @@ -186,10 +190,10 @@ - (void)storeImageInDirectory:(UIImage *)image directory:(NSString *)directory f return; } NSString *prefixString = @"capture"; - + NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString] ; NSString *uniqueFileName = [NSString stringWithFormat:@"%@_%@.%@", prefixString, guid, format]; - + NSString *filePath = [directory stringByAppendingPathComponent:uniqueFileName]; //Add the file name bool success = [data writeToFile:filePath atomically:YES]; //Write the file if(success) { @@ -198,13 +202,13 @@ - (void)storeImageInDirectory:(UIImage *)image directory:(NSString *)directory f // TODO use NSError from writeToFile reject(@"snapshot_error", [NSString stringWithFormat:@"could not save to '%@'", filePath], nil); } - + } - (void)storeImage:(UIImage *)image options:(NSDictionary *)options reject:(RCTPromiseRejectBlock)reject resolve:(RCTPromiseResolveBlock)resolve { NSString * target = @"cameraRoll"; NSString * format = @"png"; - + if(options[@"target"]) { target = options[@"target"]; } @@ -220,7 +224,7 @@ - (void)storeImage:(UIImage *)image options:(NSDictionary *)options reject:(RCTP dir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; } else if([target isEqualToString:@"documents"]) { dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; - + } else { dir = target; } @@ -270,7 +274,7 @@ - (void)storeImage:(UIImage *)image options:(NSDictionary *)options reject:(RCTP @"z": @(pointProjected.z), @"distance": @(distance) }); - + } RCT_EXPORT_METHOD(focusScene:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { @@ -284,4 +288,3 @@ - (void)storeImage:(UIImage *)image options:(NSDictionary *)options reject:(RCTP } @end - diff --git a/ios/RCTConvert+ARKit.m b/ios/RCTConvert+ARKit.m index 25d5b3fb..8ec43dfe 100644 --- a/ios/RCTConvert+ARKit.m +++ b/ios/RCTConvert+ARKit.m @@ -344,6 +344,18 @@ + (void)setMaterialProperties:(SCNMaterial *)material properties:(id)json { if(json[@"colorBufferWriteMask"] ) { material.colorBufferWriteMask = [json[@"colorBufferWriteMask"] integerValue]; } + + if(json[@"fillMode"] ) { + material.fillMode = [json[@"fillMode"] integerValue]; + } + + if(json[@"doubleSided"]) { + material.doubleSided = [json[@"doubleSided"] boolValue]; + } + + if(json[@"litPerPixel"]) { + material.litPerPixel = [json[@"litPerPixel"] boolValue]; + } } + (void)setNodeProperties:(SCNNode *)node properties:(id)json {