UNPKG

@bezlepkin/nativescript-ar

Version:

NativeScript Augmented Reality plugin. ARKit on iOS and (with the help of Sceneform) ARCore on Android.

191 lines (190 loc) 7.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TNSArFragmentForImageDetection = void 0; const core_1 = require("@nativescript/core"); class TNSArFragmentForImageDetection extends com.google.ar.sceneform.ux.ArFragment { constructor() { super(); this.arSceneViewPromises = []; return global.__native(this); } getSessionConfiguration(session) { const config = new com.google.ar.core.Config(session); this.config = config; this.session = session; config.setFocusMode(com.google.ar.core.Config.FocusMode.AUTO); config.setUpdateMode(com.google.ar.core.Config.UpdateMode.LATEST_CAMERA_IMAGE); this.setupAugmentedImageDatabase(config, session); this.arSceneViewPromises.forEach(resolve => { resolve(super.getArSceneView()); }); return config; } getImageDetectionSceneView() { return new Promise((resolve, reject) => { const arSceneView = super.getArSceneView(); if (arSceneView) { resolve(arSceneView); return; } this.arSceneViewPromises.push(resolve); }); } onCreateView(inflater, container, savedInstanceState) { const frameLayout = super.onCreateView(inflater, container, savedInstanceState); super.getPlaneDiscoveryController().hide(); super.getPlaneDiscoveryController().setInstructionView(null); super.getArSceneView().getPlaneRenderer().setEnabled(false); return frameLayout; } setupAugmentedImageDatabase(config, session) { this.augmentedImageDatabase = new com.google.ar.core.AugmentedImageDatabase(session); config.setAugmentedImageDatabase(this.augmentedImageDatabase); return true; } addImagesInFolder(name, imageWidthMeters) { let width = imageWidthMeters || -1; const context = core_1.Utils.ad.getApplicationContext(); const assetManager = context.getAssets(); let list = assetManager.list(name); if (list.length === 0) { name = name + '.arresourcegroup'; list = assetManager.list(name); } let path; let file; for (let i = 0; i < list.length; i++) { file = list[i]; path = name + "/" + file; if (path.indexOf('.imgdb') > 0) { this.loadImgDatabase(path); return; } } for (let i = 0; i < list.length; i++) { file = list[i]; path = name + "/" + file; if (file.toLowerCase() === "contents.json") { try { width = this.readContentWidth(path); } catch (e) { console.error(e); } } } for (let i = 0; i < list.length; i++) { file = list[i]; path = name + "/" + file; if (path.indexOf('.jpg') > 0 || path.indexOf('.png') > 0) { let assetName = path.split('/').pop().split('.').slice(0, -1).join('.'); this.addImage(path, assetName, width); } else { let length = assetManager.list(path).length; if (length) { this.addImagesInFolder(path, width); } } } } loadImgDatabase(asset) { try { const context = core_1.Utils.ad.getApplicationContext(); const assetManager = context.getAssets(); let is = assetManager.open(asset); this.augmentedImageDatabase = com.google.ar.core.AugmentedImageDatabase.deserialize(this.session, is); this.config.setAugmentedImageDatabase(this.augmentedImageDatabase); this.session.configure(this.config); return; } catch (e) { console.error(e); } } readContentWidth(asset) { const context = core_1.Utils.ad.getApplicationContext(); const assetManager = context.getAssets(); let text = ""; let bufferedReader = new java.io.BufferedReader(new java.io.InputStreamReader(assetManager.open(asset))); let output; while ((output = bufferedReader.readLine()) != null) { text += output; } const data = JSON.parse(text); if (data && data.properties && data.properties.width) { let width = data.properties.width; if (data.properties.unit) { const unit = data.properties.unit; if (unit === "centimeters") { width = width / 100; } if (unit === "feet") { width = width / 3.28084; } if (unit === "inches") { width = width / 39.37008; } if (unit === "yards") { width = width / 1.09361; } } console.log("using asset width: " + width + "m"); return width; } throw 'unable to find width in Contents.json'; } addBitmap(augmentedImageBitmap, name, imageWidthMeters) { if (augmentedImageBitmap == null) { console.log('error loading asset: ' + name); return; } let index = -1; if (imageWidthMeters > 0) { index = this.augmentedImageDatabase.addImage(name, augmentedImageBitmap, imageWidthMeters); } else { index = this.augmentedImageDatabase.addImage(name, augmentedImageBitmap); } if (index === -1) { console.error('Failed to add asset: ' + name); } this.config.setAugmentedImageDatabase(this.augmentedImageDatabase); this.session.configure(this.config); } addImage(asset, name, imageWidthMeters) { android.os.AsyncTask.execute(new java.lang.Runnable({ run: () => { let width = imageWidthMeters || -1; if (!name) { name = asset.split('/').pop().split('.').slice(0, -1).join('.'); } const context = core_1.Utils.ad.getApplicationContext(); const assetManager = context.getAssets(); if (asset.indexOf("://") >= 0) { core_1.ImageSource.fromUrl(asset).then((image) => { this.addBitmap(image.android, name, width); }).catch(console.error); return; } let image = null; try { let is = assetManager.open(asset); image = android.graphics.BitmapFactory.decodeStream(is); this.addBitmap(image, name, width); return; } catch (e) { } try { image = core_1.ImageSource.fromFileOrResourceSync(asset); this.addBitmap(image.android, name, width); return; } catch (e) { } } })); } } exports.TNSArFragmentForImageDetection = TNSArFragmentForImageDetection;