@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
JavaScript
"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;