UNPKG

threear

Version:

A marker based Augmented Reality library for Three.js

349 lines (318 loc) 11.4 kB
import Module = require("./lib/arjs.artoolkit.min.js"); export class ARToolKit { public static AR_DEBUG_DISABLE: number = 0; public static AR_DEBUG_ENABLE: number = 1; public static AR_DEFAULT_DEBUG_MODE: number = 0; public static AR_DEFAULT_IMAGE_PROC_MODE: number = 0; public static AR_DEFAULT_LABELING_MODE: number = 1; public static AR_DEFAULT_LABELING_THRESH: number = 100; public static AR_DEFAULT_MARKER_EXTRACTION_MODE: number = 2; public static AR_DEFAULT_PATTERN_DETECTION_MODE: number = 0; public static AR_IMAGE_PROC_FIELD_IMAGE: number = 1; public static AR_IMAGE_PROC_FRAME_IMAGE: number = 0; public static AR_LABELING_BLACK_REGION: number = 1; public static AR_LABELING_THRESH_MODE_AUTO_ADAPTIVE: number = 3; public static AR_LABELING_THRESH_MODE_AUTO_MEDIAN: number = 1; public static AR_LABELING_THRESH_MODE_AUTO_OTSU: number = 2; public static AR_LABELING_THRESH_MODE_MANUAL: number = 0; public static AR_LABELING_WHITE_REGION: number = 0; public static AR_LOG_LEVEL_DEBUG: number = 0; public static AR_LOG_LEVEL_ERROR: number = 3; public static AR_LOG_LEVEL_INFO: number = 1; public static AR_LOG_LEVEL_REL_INFO: number = 4; public static AR_LOG_LEVEL_WARN: number = 2; public static AR_LOOP_BREAK_THRESH: number = 0; public static AR_MARKER_INFO_CUTOFF_PHASE_HEURISTIC_TROUBLESOME_MATRIX_CODES: number = 9; public static AR_MARKER_INFO_CUTOFF_PHASE_MATCH_BARCODE_EDC_FAIL: number = 5; public static AR_MARKER_INFO_CUTOFF_PHASE_MATCH_BARCODE_NOT_FOUND: number = 4; public static AR_MARKER_INFO_CUTOFF_PHASE_MATCH_CONFIDENCE: number = 6; public static AR_MARKER_INFO_CUTOFF_PHASE_MATCH_CONTRAST: number = 3; public static AR_MARKER_INFO_CUTOFF_PHASE_MATCH_GENERIC: number = 2; public static AR_MARKER_INFO_CUTOFF_PHASE_NONE: number = 0; public static AR_MARKER_INFO_CUTOFF_PHASE_PATTERN_EXTRACTION: number = 1; public static AR_MARKER_INFO_CUTOFF_PHASE_POSE_ERROR: number = 7; public static AR_MARKER_INFO_CUTOFF_PHASE_POSE_ERROR_MULTI: number = 8; public static AR_MATRIX_CODE_3x3: number = 3; public static AR_MATRIX_CODE_3x3_HAMMING63: number = 515; public static AR_MATRIX_CODE_3x3_PARITY65: number = 259; public static AR_MATRIX_CODE_4x4: number = 4; public static AR_MATRIX_CODE_4x4_BCH_13_5_5: number = 1028; public static AR_MATRIX_CODE_4x4_BCH_13_9_3: number = 772; public static AR_MATRIX_CODE_DETECTION: number = 2; public static AR_MAX_LOOP_COUNT: number = 5; public static AR_NOUSE_TRACKING_HISTORY: number = 1; public static AR_TEMPLATE_MATCHING_COLOR: number = 0; public static AR_TEMPLATE_MATCHING_COLOR_AND_MATRIX: number = 3; public static AR_TEMPLATE_MATCHING_MONO: number = 1; public static AR_TEMPLATE_MATCHING_MONO_AND_MATRIX: number = 4; public static AR_USE_TRACKING_HISTORY: number = 0; public static AR_USE_TRACKING_HISTORY_V2: number = 2; public static HEAPU8 = Module.HEAPU8; public static UNKNOWN_MARKER = -1; public static PATTERN_MARKER = 0; public static BARCODE_MARKER = 1; public static markerInfo: any; public static multiEachMarkerInfo: any; public static setup: ( width: number, height: number, cameraParamId: any ) => any = Module.setup; public static teardown: (id: number) => any = Module.teardown; public static setupAR2: () => any = Module.setupAR2; public static setLogLevel: (mode: any) => any = Module.setLogLevel; public static getLogLevel: () => any = Module.getLogLevel; public static setDebugMode: (id: number, mode: number) => any = Module.getLogLevel; public static getDebugMode: (id: number) => any = Module.getDebugMode; public static getProcessingImage: (id: number) => any = Module.getProcessingImage; public static setMarkerInfoDir: ( id: number, markerIndex: number, dir: any ) => any = Module.setMarkerInfoDir; public static setMarkerInfoVertex: (id: number, markerIndex: number) => any = Module.setMarkerInfoVertex; public static getTransMatSquare: ( id: number, markerUID: number, markerWidth: number ) => any = Module.getTransMatSquare; public static getTransMatSquareCont: ( id: any, markerUID: number, markerWidth: number ) => any = Module.getTransMatSquareCont; public static getTransMatMultiSquare: (id: any, markerUID: number) => any = Module.getTransMatMultiSquare; public static getTransMatMultiSquareRobust: (id: number, i: number) => any = Module.getTransMatMultiSquareRobust; public static getMultiMarkerNum: (id: number, multiId: number) => any = Module.getMultiMarkerNum; public static getMultiMarkerCount: (id: number) => any = Module.getMultiMarkerCount; public static detectMarker: (id: number) => any = Module.detectMarker; public static getMarkerNum: (id: number) => any = Module.getMarkerNum; public static getMarker: (id: number, markerIndex: number) => any = Module.getMarker; public static getMultiEachMarker: ( id: number, multiMarkerId: number, markerIndex: number ) => any = Module.getMultiEachMarker; public static detectNFTMarker: (id: number) => any = Module.detectNFTMarker; public static setProjectionNearPlane: (id: number, value: any) => any = Module.setProjectionNearPlane; public static getProjectionNearPlane: (id: number) => any = Module.getProjectionNearPlane; public static setProjectionFarPlane: (id: number, value: any) => any = Module.setProjectionFarPlane; public static getProjectionFarPlane: (id: number) => any = Module.getProjectionFarPlane; public static setThresholdMode: (id: number, mode: any) => any = Module.setThresholdMode; public static getThresholdMode: (id: number) => any = Module.getThresholdMode; public static setThreshold: (id: number, threshold: number) => any = Module.setThreshold; public static getThreshold: (id: number) => any = Module.getThreshold; public static setPatternDetectionMode: (id: number, mode: any) => any = Module.setPatternDetectionMode; public static getPatternDetectionMode: (id: number) => any = Module.getPatternDetectionMode; public static setMatrixCodeType: (id: number, type: any) => any = Module.setMatrixCodeType; public static getMatrixCodeType: (id: number) => any = Module.getMatrixCodeType; public static setLabelingMode: (id: number, mode: any) => any = Module.setLabelingMode; public static getLabelingMode: (id: number) => any = Module.getLabelingMode; public static setPattRatio: (id: number, ratio: number) => any = Module.setPattRatio; public static getPattRatio: (id: number) => any = Module.getPattRatio; public static setImageProcMode: (id: number, mode: any) => any = Module.setImageProcMode; public static getImageProcMode: (id: number) => any = Module.getImageProcMode; public static markerCount = 0; public static multiMarkerCount = 0; public static cameraCount = 0; public static getMarkerInfo() { return Module.markerInfo; } public static deleteCamera(id: number) { throw Error("deleteCamera not implemented"); // TODO: This was never implemented } public static loadCamera( url: string | Uint8Array, callback: (id: number) => any, onerror: (err: any) => any ) { const filename = "/camera_param_" + ARToolKit.cameraCount++; const writeCallback = () => { const id = Module._loadCamera(filename); if (callback) { callback(id); } }; if (typeof url === "object") { // Maybe it's a byte array ARToolKit.writeByteArrayToFS(filename, url, writeCallback); } else if (url.indexOf("\n") > -1) { // Or a string with the camera param ARToolKit.writeStringToFS(filename, url, writeCallback); } else { ARToolKit.ajax(url, filename, writeCallback); } } public static getFrameMalloc() { return Module.frameMalloc; } public static addMarker( arId: number, url: string, callback: (id: number) => any, onError: (err: any) => any ) { const filename = "/marker_" + ARToolKit.markerCount++; ARToolKit.ajax(url, filename, () => { const id = Module._addMarker(arId, filename); if (callback) { callback(id); } }); } public static addNFTMarker( arId: number, url: string, callback: (id: number) => any, onError: () => any ) { const mId = ARToolKit.markerCount++; const prefix = "/markerNFT_" + mId; const filename1 = prefix + ".fset"; const filename2 = prefix + ".iset"; const filename3 = prefix + ".fset3"; ARToolKit.ajax(url + ".fset", filename1, () => { ARToolKit.ajax(url + ".iset", filename2, () => { ARToolKit.ajax(url + ".fset3", filename3, () => { const id = Module._addNFTMarker(arId, prefix); if (callback) { callback(id); } }); }); }); } public static bytesToString(array: Uint8Array) { return String.fromCharCode.apply(String, array); } public static parseMultiFile(bytes: Uint8Array) { const str = this.bytesToString(bytes); const lines = str.split("\n"); const files: any[] = []; let state = 0; // 0 - read, lines.forEach((line: string) => { line = line.trim(); if (!line || line.startsWith("#")) { return; } switch (state) { case 0: state = 1; return; case 1: // filename or barcode if (!line.match(/^\d+$/)) { files.push(line); } case 2: // width case 3: // matrices case 4: state++; return; case 5: state = 1; return; } }); return files; } public static addMultiMarker( arId: number, url: string, callback: (id: number, markerNum: any) => any, onError: () => any ) { const filename = "/multi_marker_" + ARToolKit.multiMarkerCount++; ARToolKit.ajax(url, filename, (bytes: Uint8Array) => { let files = this.parseMultiFile(bytes); const ok = () => { const markerID = Module._addMultiMarker(arId, filename); const markerNum = Module.getMultiMarkerNum(arId, markerID); if (callback) { callback(markerID, markerNum); } }; if (!files.length) { return ok(); } const path = url .split("/") .slice(0, -1) .join("/"); files = files.map(file => { return [path + "/" + file, file]; }); ARToolKit.ajaxDependencies(files, ok); }); } // transfer image public static writeStringToFS( filename: string, string: string, callback: () => any ) { const byteArray = new Uint8Array(string.length); for (let i = 0; i < byteArray.length; i++) { byteArray[i] = string.charCodeAt(i) & 0xff; } ARToolKit.writeByteArrayToFS(filename, byteArray, callback); } public static writeByteArrayToFS( filename: string, byteArray: Uint8Array, callback: (byteArray: Uint8Array) => any ) { Module.FS.writeFile(filename, byteArray, { encoding: "binary" }); callback(byteArray); } // Eg. // ajax('../bin/Data2/markers.dat', '/Data2/markers.dat', callback); // ajax('../bin/Data/patt.hiro', '/patt.hiro', callback); public static ajax( url: string, filename: string, callback: (bytes: Uint8Array) => any ) { const oReq = new XMLHttpRequest(); oReq.open("GET", url, true); oReq.responseType = "arraybuffer"; // blob arraybuffer oReq.onload = () => { const arrayBuffer = oReq.response; const byteArray = new Uint8Array(arrayBuffer); ARToolKit.writeByteArrayToFS(filename, byteArray, callback); }; oReq.send(); } public static ajaxDependencies(files: any[], callback: () => any) { const next = files.pop(); if (next) { ARToolKit.ajax(next[0], next[1], () => { ARToolKit.ajaxDependencies(files, callback); }); } else { callback(); } } } export default ARToolKit;