提交 6fa0e41d 编写于 作者: J Jerome Etienne

more work

上级 d0df5ed4
......@@ -304,7 +304,13 @@ console.log('this.data.markerhelpers', this.data.markerhelpers)
}else console.assert(false)
// build a smoothedControls
this.arSmoothedControls = new THREEx.ArSmoothedControls(this.el.object3D)
this.arSmoothedControls = new THREEx.ArSmoothedControls(this.el.object3D,{
lerpPosition : 0.1,
lerpQuaternion : 0.1,
lerpScale : 0.1,
// minVisibleDelay: 0,
// minUnvisibleDelay: 0,
})
......
......@@ -36,6 +36,8 @@ THREEx.ArBaseControls.prototype.name = function(){
}
var THREEx = THREEx || {}
// TODO this is useless - prefere arjs-hittester.js
/**
* - maybe support .onClickFcts in each object3d
* - seems an easy light layer for clickable object
......@@ -47,6 +49,9 @@ THREEx.ARClickability = function(sourceElement){
var fullWidth = parseInt(sourceElement.style.width)
var fullHeight = parseInt(sourceElement.style.height)
this._cameraPicking = new THREE.PerspectiveCamera(42, fullWidth / fullHeight, 0.1, 100);
console.warn('THREEx.ARClickability works only in modelViewMatrix')
// TODO just push camera in computeIntersects
}
THREEx.ARClickability.prototype.onResize = function(){
......@@ -86,7 +91,7 @@ THREEx.ARClickability.prototype.update = function(){
THREEx.ARClickability.tangoPickingPointCloud = function(artoolkitContext, mouseX, mouseY){
var vrDisplay = artoolkitContext._tangoContext.vrDisplay
if (vrDisplay === null ) return
if (vrDisplay === null ) return null
var pointAndPlane = vrDisplay.getPickingPointAndPlaneInPointCloud(mouseX, mouseY)
if( pointAndPlane == null ) {
console.warn('Could not retrieve the correct point and plane.')
......@@ -727,26 +732,26 @@ THREEx.ArToolkitContext = function(parameters){
// handle default parameters
this.parameters = {
// AR backend - ['artoolkit', 'aruco', 'tango']
trackingBackend: parameters.trackingBackend !== undefined ? parameters.trackingBackend : 'artoolkit',
trackingBackend: 'artoolkit',
// debug - true if one should display artoolkit debug canvas, false otherwise
debug: parameters.debug !== undefined ? parameters.debug : false,
debug: false,
// the mode of detection - ['color', 'color_and_matrix', 'mono', 'mono_and_matrix']
detectionMode: parameters.detectionMode !== undefined ? parameters.detectionMode : 'mono',
detectionMode: 'mono',
// type of matrix code - valid iif detectionMode end with 'matrix' - [3x3, 3x3_HAMMING63, 3x3_PARITY65, 4x4, 4x4_BCH_13_9_3, 4x4_BCH_13_5_5]
matrixCodeType: parameters.matrixCodeType !== undefined ? parameters.matrixCodeType : '3x3',
matrixCodeType: '3x3',
// url of the camera parameters
cameraParametersUrl: parameters.cameraParametersUrl !== undefined ? parameters.cameraParametersUrl : THREEx.ArToolkitContext.baseURL + 'parameters/camera_para.dat',
cameraParametersUrl: THREEx.ArToolkitContext.baseURL + 'parameters/camera_para.dat',
// tune the maximum rate of pose detection in the source image
maxDetectionRate: parameters.maxDetectionRate !== undefined ? parameters.maxDetectionRate : 60,
maxDetectionRate: 60,
// resolution of at which we detect pose in the source image
canvasWidth: parameters.canvasWidth !== undefined ? parameters.canvasWidth : 640,
canvasHeight: parameters.canvasHeight !== undefined ? parameters.canvasHeight : 480,
canvasWidth: 640,
canvasHeight: 480,
// enable image smoothing or not for canvas copy - default to true
// https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled
imageSmoothingEnabled : parameters.imageSmoothingEnabled !== undefined ? parameters.imageSmoothingEnabled : false,
imageSmoothingEnabled : false,
}
// parameters sanity check
console.assert(['artoolkit', 'aruco', 'tango'].indexOf(this.parameters.trackingBackend) !== -1, 'invalid parameter trackingBackend', this.parameters.trackingBackend)
......@@ -754,8 +759,13 @@ THREEx.ArToolkitContext = function(parameters){
this.arController = null;
this.arucoContext = null;
_this.initialized = false
this._arMarkersControls = []
this._setParameters(parameters)
}
Object.assign( THREEx.ArToolkitContext.prototype, THREE.EventDispatcher.prototype );
......@@ -766,6 +776,33 @@ THREEx.ArToolkitContext.baseURL = 'https://jeromeetienne.github.io/AR.js/three.j
THREEx.ArToolkitContext.REVISION = '1.0.1-dev'
/**
* set parameters
* @param {[type]} values [description]
* @return {[type]} [description]
*/
THREEx.ArToolkitContext.prototype._setParameters = function (values){
if ( values === undefined ) return;
for( var key in values ){
var newValue = values[ key ];
if( newValue === undefined ){
console.warn( "THREEx.ArToolkitContext: '" + key + "' parameter is undefined." );
continue;
}
var currentValue = this.parameters[ key ];
if( currentValue === undefined ){
console.warn( "THREEx.ArToolkitContext: '" + key + "' is not a property of this material." );
continue;
}
this.parameters[ key ] = newValue;
}
};
/**
* Create a default camera for this trackingBackend
* @param {string} trackingBackend - the tracking to user
......@@ -805,6 +842,8 @@ THREEx.ArToolkitContext.prototype.init = function(onCompleted){
type: 'initialized'
});
_this.initialized = true
onCompleted && onCompleted()
}
......@@ -815,7 +854,7 @@ THREEx.ArToolkitContext.prototype.init = function(onCompleted){
THREEx.ArToolkitContext.prototype.update = function(srcElement){
// be sure arController is fully initialized
if (this.parameters.trackingBackend === 'artoolkit' && this.arController === null) return false;
if(this.parameters.trackingBackend === 'artoolkit' && this.arController === null) return false;
// honor this.parameters.maxDetectionRate
var present = performance.now()
......@@ -878,7 +917,7 @@ THREEx.ArToolkitContext.prototype._initArtoolkit = function(onCompleted){
this._artoolkitProjectionAxisTransformMatrix.multiply(new THREE.Matrix4().makeRotationZ(Math.PI))
// get cameraParameters
var cameraParameters = new ARCameraParam(_this.parameters.cameraParametersUrl, function() {
var cameraParameters = new ARCameraParam(_this.parameters.cameraParametersUrl, function(){
// init controller
var arController = new ARController(_this.parameters.canvasWidth, _this.parameters.canvasHeight, cameraParameters);
_this.arController = arController
......@@ -1022,9 +1061,9 @@ THREEx.ArToolkitContext.prototype._updateAruco = function(srcElement){
THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
var _this = this
// check webvr is available
if (navigator.getVRDisplays) {
if (navigator.getVRDisplays){
// do nothing
} else if (navigator.getVRDevices) {
} else if (navigator.getVRDevices){
alert("Your browser supports WebVR but not the latest version. See <a href='http://webvr.info'>webvr.info</a> for more info.");
} else {
alert("Your browser does not support WebVR. See <a href='http://webvr.info'>webvr.info</a> for assistance.");
......@@ -1039,7 +1078,7 @@ THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
// get vrDisplay
navigator.getVRDisplays().then(function (vrDisplays) {
navigator.getVRDisplays().then(function (vrDisplays){
if( vrDisplays.length === 0 ) alert('no vrDisplays available')
var vrDisplay = _this._tangoContext.vrDisplay = vrDisplays[0]
......@@ -1053,7 +1092,7 @@ THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
// NOTE it doesnt seem necessary and it fails on tango
// var canvasElement = document.createElement('canvas')
// document.body.appendChild(canvasElement)
// _this._tangoContext.requestPresent([{ source: canvasElement }]).then(function() {
// _this._tangoContext.requestPresent([{ source: canvasElement }]).then(function(){
// console.log('vrdisplay request accepted')
// });
......@@ -1114,6 +1153,8 @@ THREEx.ArToolkitContext.prototype._updateTango = function(srcElement){
// }
}
var ARjs = ARjs || {}
var THREEx = THREEx || {}
/**
......@@ -1123,14 +1164,14 @@ var THREEx = THREEx || {}
* - you can use this class to understand how to tune your specific usecase
* - it is made to help people to build parameters without understanding all the underlying details.
*/
THREEx.ArToolkitProfile = function(){
ARjs.Profile = THREEx.ArToolkitProfile = function(){
this.reset()
this.performance('default')
}
THREEx.ArToolkitProfile.prototype._guessPerformanceLabel = function() {
ARjs.Profile.prototype._guessPerformanceLabel = function() {
var isMobile = navigator.userAgent.match(/Android/i)
|| navigator.userAgent.match(/webOS/i)
|| navigator.userAgent.match(/iPhone/i)
......@@ -1152,7 +1193,7 @@ THREEx.ArToolkitProfile.prototype._guessPerformanceLabel = function() {
/**
* reset all parameters
*/
THREEx.ArToolkitProfile.prototype.reset = function () {
ARjs.Profile.prototype.reset = function () {
this.sourceParameters = {
// to read from the webcam
sourceType : 'webcam',
......@@ -1164,7 +1205,8 @@ THREEx.ArToolkitProfile.prototype.reset = function () {
}
this.defaultMarkerParameters = {
type : 'pattern',
patternUrl : THREEx.ArToolkitContext.baseURL + '../data/data/patt.hiro'
patternUrl : THREEx.ArToolkitContext.baseURL + '../data/data/patt.hiro',
changeMatrixMode: 'modelViewMatrix',
}
return this
};
......@@ -1175,34 +1217,36 @@ THREEx.ArToolkitProfile.prototype.reset = function () {
THREEx.ArToolkitProfile.prototype.performance = function(label) {
ARjs.Profile.prototype.performance = function(label) {
if( label === 'default' ){
label = this._guessPerformanceLabel()
}
if( label === 'desktop-fast' ){
this.contextParameters.sourceWidth = 640*3
this.contextParameters.sourceHeight = 480*3
this.contextParameters.canvasWidth = 640*3
this.contextParameters.canvasHeight = 480*3
this.contextParameters.maxDetectionRate = 30
}else if( label === 'desktop-normal' ){
this.contextParameters.sourceWidth = 640
this.contextParameters.sourceHeight = 480
this.contextParameters.canvasWidth = 640
this.contextParameters.canvasHeight = 480
this.contextParameters.maxDetectionRate = 60
}else if( label === 'phone-normal' ){
this.contextParameters.sourceWidth = 80*4
this.contextParameters.sourceHeight = 60*4
this.contextParameters.canvasWidth = 80*4
this.contextParameters.canvasHeight = 60*4
this.contextParameters.maxDetectionRate = 30
}else if( label === 'phone-slow' ){
this.contextParameters.sourceWidth = 80*3
this.contextParameters.sourceHeight = 60*3
this.contextParameters.canvasWidth = 80*3
this.contextParameters.canvasHeight = 60*3
this.contextParameters.maxDetectionRate = 30
}else {
console.assert(false, 'unknonwn label '+label)
}
return this
}
//////////////////////////////////////////////////////////////////////////////
......@@ -1210,7 +1254,7 @@ THREEx.ArToolkitProfile.prototype.performance = function(label) {
//////////////////////////////////////////////////////////////////////////////
THREEx.ArToolkitProfile.prototype.defaultMarker = function (trackingBackend) {
ARjs.Profile.prototype.defaultMarker = function (trackingBackend) {
trackingBackend = trackingBackend || this.contextParameters.trackingBackend
if( trackingBackend === 'artoolkit' ){
......@@ -1232,20 +1276,19 @@ THREEx.ArToolkitProfile.prototype.defaultMarker = function (trackingBackend) {
//////////////////////////////////////////////////////////////////////////////
// Source
//////////////////////////////////////////////////////////////////////////////
THREEx.ArToolkitProfile.prototype.sourceWebcam = function () {
ARjs.Profile.prototype.sourceWebcam = function () {
this.sourceParameters.sourceType = 'webcam'
delete this.sourceParameters.sourceUrl
return this
}
THREEx.ArToolkitProfile.prototype.sourceVideo = function (url) {
ARjs.Profile.prototype.sourceVideo = function (url) {
this.sourceParameters.sourceType = 'video'
this.sourceParameters.sourceUrl = url
return this
}
THREEx.ArToolkitProfile.prototype.sourceImage = function (url) {
ARjs.Profile.prototype.sourceImage = function (url) {
this.sourceParameters.sourceType = 'image'
this.sourceParameters.sourceUrl = url
return this
......@@ -1254,10 +1297,39 @@ THREEx.ArToolkitProfile.prototype.sourceImage = function (url) {
//////////////////////////////////////////////////////////////////////////////
// trackingBackend
//////////////////////////////////////////////////////////////////////////////
THREEx.ArToolkitProfile.prototype.trackingBackend = function (trackingBackend) {
ARjs.Profile.prototype.trackingBackend = function (trackingBackend) {
console.warn('stop profile.trackingBackend() obsolete function. use .trackingMethod instead')
this.contextParameters.trackingBackend = trackingBackend
return this
}
//////////////////////////////////////////////////////////////////////////////
// trackingBackend
//////////////////////////////////////////////////////////////////////////////
ARjs.Profile.prototype.changeMatrixMode = function (changeMatrixMode) {
this.defaultMarkerParameters.changeMatrixMode = changeMatrixMode
return this
}
//////////////////////////////////////////////////////////////////////////////
// trackingBackend
//////////////////////////////////////////////////////////////////////////////
ARjs.Profile.prototype.trackingMethod = function (trackingMethod) {
var data = ARjs.Utils.parseTrackingMethod(trackingMethod)
this.defaultMarkerParameters.markersAreaEnabled = data.markersAreaEnabled
this.contextParameters.trackingBackend = data.trackingBackend
return this
}
/**
* check if the profile is valid. Throw an exception is not valid
*/
ARjs.Profile.prototype.checkIfValid = function () {
if( this.contextParameters.trackingBackend === 'tango' ){
this.sourceImage(THREEx.ArToolkitContext.baseURL + '../data/images/img.jpg')
}
return this
}
var THREEx = THREEx || {}
THREEx.ArToolkitSource = function(parameters){
......@@ -1452,16 +1524,23 @@ THREEx.ArToolkitSource.prototype.hasMobileTorch = function(){
}
var videoTrack = stream.getVideoTracks()[0];
// if videoTrack.getCapabilities() doesnt exist, return false now
if( videoTrack.getCapabilities === undefined ) return false
var capabilities = videoTrack.getCapabilities()
return capabilities.torch ? true : false
}
/**
* - toggle the flash/torch of the mobile fun if applicable
* toggle the flash/torch of the mobile fun if applicable.
* Great post about it https://www.oberhofer.co/mediastreamtrack-and-its-capabilities/
*/
THREEx.ArToolkitSource.prototype.toggleMobileTorch = function(){
// sanity check
console.assert(this.hasMobileTorch() === true)
var stream = arToolkitSource.domElement.srcObject
if( stream instanceof MediaStream === false ){
alert('enabling mobile torch is available only on webcam')
......@@ -1607,7 +1686,9 @@ THREEx.ArToolkitSource.prototype.onResize2 = function(arToolkitContext, renderer
// UPDATE CAMERA
if( trackingBackend === 'artoolkit' ){
camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() );
if( arToolkitContext.arController !== null ){
camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() );
}
}else if( trackingBackend === 'aruco' ){
camera.aspect = renderer.domElement.width / renderer.domElement.height;
camera.updateProjectionMatrix();
......@@ -2826,7 +2907,13 @@ console.log('this.data.markerhelpers', this.data.markerhelpers)
}else console.assert(false)
// build a smoothedControls
this.arSmoothedControls = new THREEx.ArSmoothedControls(this.el.object3D)
this.arSmoothedControls = new THREEx.ArSmoothedControls(this.el.object3D,{
lerpPosition : 0.1,
lerpQuaternion : 0.1,
lerpScale : 0.1,
// minVisibleDelay: 0,
// minUnvisibleDelay: 0,
})
......@@ -2909,10 +2996,6 @@ var Qb=[Ik,Zh,_h,Qj,Qi,Pi,Ri,Ag,sg,qg,rg,yg,kh,jh,Oi,Mj];var Rb=[Jk,ki,ji,gi];va
// EMSCRIPTEN_END_ASM
(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=asm["__GLOBAL__sub_I_bind_cpp"];var _fflush=Module["_fflush"]=asm["_fflush"];var __GLOBAL__sub_I_ARToolKitJS_cpp=Module["__GLOBAL__sub_I_ARToolKitJS_cpp"]=asm["__GLOBAL__sub_I_ARToolKitJS_cpp"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _memset=Module["_memset"]=asm["_memset"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___getTypeName=Module["___getTypeName"]=asm["___getTypeName"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_dii=Module["dynCall_dii"]=asm["dynCall_dii"];var dynCall_vid=Module["dynCall_vid"]=asm["dynCall_vid"];var dynCall_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viid=Module["dynCall_viid"]=asm["dynCall_viid"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var ret=Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{if(e&&typeof e==="object"&&e.stack)Module.printErr("exception thrown: "+[e,e.stack]);throw e}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run()
;(function() {
'use strict'
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
......@@ -27,7 +27,7 @@
<a-animation attribute="rotation" to="360 0 0" dur="3000" easing='linear' repeat="indefinite"></a-animation>
</a-torus-knot>
</a-box>
<a-marker-camera preset='hiro'></a-marker-camera>
<a-marker-camera preset='area'></a-marker-camera>
</a-scene>
<!-- <a-scene embedded arjs='sourceType: webcam; trackingBackend: tango;'>
......
......@@ -16,10 +16,6 @@ var Qb=[Ik,Zh,_h,Qj,Qi,Pi,Ri,Ag,sg,qg,rg,yg,kh,jh,Oi,Mj];var Rb=[Jk,ki,ji,gi];va
// EMSCRIPTEN_END_ASM
(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=asm["__GLOBAL__sub_I_bind_cpp"];var _fflush=Module["_fflush"]=asm["_fflush"];var __GLOBAL__sub_I_ARToolKitJS_cpp=Module["__GLOBAL__sub_I_ARToolKitJS_cpp"]=asm["__GLOBAL__sub_I_ARToolKitJS_cpp"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _memset=Module["_memset"]=asm["_memset"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___getTypeName=Module["___getTypeName"]=asm["___getTypeName"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_dii=Module["dynCall_dii"]=asm["dynCall_dii"];var dynCall_vid=Module["dynCall_vid"]=asm["dynCall_vid"];var dynCall_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viid=Module["dynCall_viid"]=asm["dynCall_viid"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var ret=Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{if(e&&typeof e==="object"&&e.stack)Module.printErr("exception thrown: "+[e,e.stack]);throw e}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run()
;(function() {
'use strict'
......@@ -1657,6 +1653,8 @@ THREEx.ArBaseControls.prototype.name = function(){
}
var THREEx = THREEx || {}
// TODO this is useless - prefere arjs-hittester.js
/**
* - maybe support .onClickFcts in each object3d
* - seems an easy light layer for clickable object
......@@ -1668,6 +1666,9 @@ THREEx.ARClickability = function(sourceElement){
var fullWidth = parseInt(sourceElement.style.width)
var fullHeight = parseInt(sourceElement.style.height)
this._cameraPicking = new THREE.PerspectiveCamera(42, fullWidth / fullHeight, 0.1, 100);
console.warn('THREEx.ARClickability works only in modelViewMatrix')
// TODO just push camera in computeIntersects
}
THREEx.ARClickability.prototype.onResize = function(){
......@@ -1707,7 +1708,7 @@ THREEx.ARClickability.prototype.update = function(){
THREEx.ARClickability.tangoPickingPointCloud = function(artoolkitContext, mouseX, mouseY){
var vrDisplay = artoolkitContext._tangoContext.vrDisplay
if (vrDisplay === null ) return
if (vrDisplay === null ) return null
var pointAndPlane = vrDisplay.getPickingPointAndPlaneInPointCloud(mouseX, mouseY)
if( pointAndPlane == null ) {
console.warn('Could not retrieve the correct point and plane.')
......@@ -2348,26 +2349,26 @@ THREEx.ArToolkitContext = function(parameters){
// handle default parameters
this.parameters = {
// AR backend - ['artoolkit', 'aruco', 'tango']
trackingBackend: parameters.trackingBackend !== undefined ? parameters.trackingBackend : 'artoolkit',
trackingBackend: 'artoolkit',
// debug - true if one should display artoolkit debug canvas, false otherwise
debug: parameters.debug !== undefined ? parameters.debug : false,
debug: false,
// the mode of detection - ['color', 'color_and_matrix', 'mono', 'mono_and_matrix']
detectionMode: parameters.detectionMode !== undefined ? parameters.detectionMode : 'mono',
detectionMode: 'mono',
// type of matrix code - valid iif detectionMode end with 'matrix' - [3x3, 3x3_HAMMING63, 3x3_PARITY65, 4x4, 4x4_BCH_13_9_3, 4x4_BCH_13_5_5]
matrixCodeType: parameters.matrixCodeType !== undefined ? parameters.matrixCodeType : '3x3',
matrixCodeType: '3x3',
// url of the camera parameters
cameraParametersUrl: parameters.cameraParametersUrl !== undefined ? parameters.cameraParametersUrl : THREEx.ArToolkitContext.baseURL + 'parameters/camera_para.dat',
cameraParametersUrl: THREEx.ArToolkitContext.baseURL + 'parameters/camera_para.dat',
// tune the maximum rate of pose detection in the source image
maxDetectionRate: parameters.maxDetectionRate !== undefined ? parameters.maxDetectionRate : 60,
maxDetectionRate: 60,
// resolution of at which we detect pose in the source image
canvasWidth: parameters.canvasWidth !== undefined ? parameters.canvasWidth : 640,
canvasHeight: parameters.canvasHeight !== undefined ? parameters.canvasHeight : 480,
canvasWidth: 640,
canvasHeight: 480,
// enable image smoothing or not for canvas copy - default to true
// https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled
imageSmoothingEnabled : parameters.imageSmoothingEnabled !== undefined ? parameters.imageSmoothingEnabled : false,
imageSmoothingEnabled : false,
}
// parameters sanity check
console.assert(['artoolkit', 'aruco', 'tango'].indexOf(this.parameters.trackingBackend) !== -1, 'invalid parameter trackingBackend', this.parameters.trackingBackend)
......@@ -2375,8 +2376,13 @@ THREEx.ArToolkitContext = function(parameters){
this.arController = null;
this.arucoContext = null;
_this.initialized = false
this._arMarkersControls = []
this._setParameters(parameters)
}
Object.assign( THREEx.ArToolkitContext.prototype, THREE.EventDispatcher.prototype );
......@@ -2387,6 +2393,33 @@ THREEx.ArToolkitContext.baseURL = 'https://jeromeetienne.github.io/AR.js/three.j
THREEx.ArToolkitContext.REVISION = '1.0.1-dev'
/**
* set parameters
* @param {[type]} values [description]
* @return {[type]} [description]
*/
THREEx.ArToolkitContext.prototype._setParameters = function (values){
if ( values === undefined ) return;
for( var key in values ){
var newValue = values[ key ];
if( newValue === undefined ){
console.warn( "THREEx.ArToolkitContext: '" + key + "' parameter is undefined." );
continue;
}
var currentValue = this.parameters[ key ];
if( currentValue === undefined ){
console.warn( "THREEx.ArToolkitContext: '" + key + "' is not a property of this material." );
continue;
}
this.parameters[ key ] = newValue;
}
};
/**
* Create a default camera for this trackingBackend
* @param {string} trackingBackend - the tracking to user
......@@ -2426,6 +2459,8 @@ THREEx.ArToolkitContext.prototype.init = function(onCompleted){
type: 'initialized'
});
_this.initialized = true
onCompleted && onCompleted()
}
......@@ -2436,7 +2471,7 @@ THREEx.ArToolkitContext.prototype.init = function(onCompleted){
THREEx.ArToolkitContext.prototype.update = function(srcElement){
// be sure arController is fully initialized
if (this.parameters.trackingBackend === 'artoolkit' && this.arController === null) return false;
if(this.parameters.trackingBackend === 'artoolkit' && this.arController === null) return false;
// honor this.parameters.maxDetectionRate
var present = performance.now()
......@@ -2499,7 +2534,7 @@ THREEx.ArToolkitContext.prototype._initArtoolkit = function(onCompleted){
this._artoolkitProjectionAxisTransformMatrix.multiply(new THREE.Matrix4().makeRotationZ(Math.PI))
// get cameraParameters
var cameraParameters = new ARCameraParam(_this.parameters.cameraParametersUrl, function() {
var cameraParameters = new ARCameraParam(_this.parameters.cameraParametersUrl, function(){
// init controller
var arController = new ARController(_this.parameters.canvasWidth, _this.parameters.canvasHeight, cameraParameters);
_this.arController = arController
......@@ -2643,9 +2678,9 @@ THREEx.ArToolkitContext.prototype._updateAruco = function(srcElement){
THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
var _this = this
// check webvr is available
if (navigator.getVRDisplays) {
if (navigator.getVRDisplays){
// do nothing
} else if (navigator.getVRDevices) {
} else if (navigator.getVRDevices){
alert("Your browser supports WebVR but not the latest version. See <a href='http://webvr.info'>webvr.info</a> for more info.");
} else {
alert("Your browser does not support WebVR. See <a href='http://webvr.info'>webvr.info</a> for assistance.");
......@@ -2660,7 +2695,7 @@ THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
// get vrDisplay
navigator.getVRDisplays().then(function (vrDisplays) {
navigator.getVRDisplays().then(function (vrDisplays){
if( vrDisplays.length === 0 ) alert('no vrDisplays available')
var vrDisplay = _this._tangoContext.vrDisplay = vrDisplays[0]
......@@ -2674,7 +2709,7 @@ THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
// NOTE it doesnt seem necessary and it fails on tango
// var canvasElement = document.createElement('canvas')
// document.body.appendChild(canvasElement)
// _this._tangoContext.requestPresent([{ source: canvasElement }]).then(function() {
// _this._tangoContext.requestPresent([{ source: canvasElement }]).then(function(){
// console.log('vrdisplay request accepted')
// });
......@@ -2735,6 +2770,8 @@ THREEx.ArToolkitContext.prototype._updateTango = function(srcElement){
// }
}
var ARjs = ARjs || {}
var THREEx = THREEx || {}
/**
......@@ -2744,14 +2781,14 @@ var THREEx = THREEx || {}
* - you can use this class to understand how to tune your specific usecase
* - it is made to help people to build parameters without understanding all the underlying details.
*/
THREEx.ArToolkitProfile = function(){
ARjs.Profile = THREEx.ArToolkitProfile = function(){
this.reset()
this.performance('default')
}
THREEx.ArToolkitProfile.prototype._guessPerformanceLabel = function() {
ARjs.Profile.prototype._guessPerformanceLabel = function() {
var isMobile = navigator.userAgent.match(/Android/i)
|| navigator.userAgent.match(/webOS/i)
|| navigator.userAgent.match(/iPhone/i)
......@@ -2773,7 +2810,7 @@ THREEx.ArToolkitProfile.prototype._guessPerformanceLabel = function() {
/**
* reset all parameters
*/
THREEx.ArToolkitProfile.prototype.reset = function () {
ARjs.Profile.prototype.reset = function () {
this.sourceParameters = {
// to read from the webcam
sourceType : 'webcam',
......@@ -2785,7 +2822,8 @@ THREEx.ArToolkitProfile.prototype.reset = function () {
}
this.defaultMarkerParameters = {
type : 'pattern',
patternUrl : THREEx.ArToolkitContext.baseURL + '../data/data/patt.hiro'
patternUrl : THREEx.ArToolkitContext.baseURL + '../data/data/patt.hiro',
changeMatrixMode: 'modelViewMatrix',
}
return this
};
......@@ -2796,34 +2834,36 @@ THREEx.ArToolkitProfile.prototype.reset = function () {
THREEx.ArToolkitProfile.prototype.performance = function(label) {
ARjs.Profile.prototype.performance = function(label) {
if( label === 'default' ){
label = this._guessPerformanceLabel()
}
if( label === 'desktop-fast' ){
this.contextParameters.sourceWidth = 640*3
this.contextParameters.sourceHeight = 480*3
this.contextParameters.canvasWidth = 640*3
this.contextParameters.canvasHeight = 480*3
this.contextParameters.maxDetectionRate = 30
}else if( label === 'desktop-normal' ){
this.contextParameters.sourceWidth = 640
this.contextParameters.sourceHeight = 480
this.contextParameters.canvasWidth = 640
this.contextParameters.canvasHeight = 480
this.contextParameters.maxDetectionRate = 60
}else if( label === 'phone-normal' ){
this.contextParameters.sourceWidth = 80*4
this.contextParameters.sourceHeight = 60*4
this.contextParameters.canvasWidth = 80*4
this.contextParameters.canvasHeight = 60*4
this.contextParameters.maxDetectionRate = 30
}else if( label === 'phone-slow' ){
this.contextParameters.sourceWidth = 80*3
this.contextParameters.sourceHeight = 60*3
this.contextParameters.canvasWidth = 80*3
this.contextParameters.canvasHeight = 60*3
this.contextParameters.maxDetectionRate = 30
}else {
console.assert(false, 'unknonwn label '+label)
}
return this
}
//////////////////////////////////////////////////////////////////////////////
......@@ -2831,7 +2871,7 @@ THREEx.ArToolkitProfile.prototype.performance = function(label) {
//////////////////////////////////////////////////////////////////////////////
THREEx.ArToolkitProfile.prototype.defaultMarker = function (trackingBackend) {
ARjs.Profile.prototype.defaultMarker = function (trackingBackend) {
trackingBackend = trackingBackend || this.contextParameters.trackingBackend
if( trackingBackend === 'artoolkit' ){
......@@ -2853,20 +2893,19 @@ THREEx.ArToolkitProfile.prototype.defaultMarker = function (trackingBackend) {
//////////////////////////////////////////////////////////////////////////////
// Source
//////////////////////////////////////////////////////////////////////////////
THREEx.ArToolkitProfile.prototype.sourceWebcam = function () {
ARjs.Profile.prototype.sourceWebcam = function () {
this.sourceParameters.sourceType = 'webcam'
delete this.sourceParameters.sourceUrl
return this
}
THREEx.ArToolkitProfile.prototype.sourceVideo = function (url) {
ARjs.Profile.prototype.sourceVideo = function (url) {
this.sourceParameters.sourceType = 'video'
this.sourceParameters.sourceUrl = url
return this
}
THREEx.ArToolkitProfile.prototype.sourceImage = function (url) {
ARjs.Profile.prototype.sourceImage = function (url) {
this.sourceParameters.sourceType = 'image'
this.sourceParameters.sourceUrl = url
return this
......@@ -2875,10 +2914,39 @@ THREEx.ArToolkitProfile.prototype.sourceImage = function (url) {
//////////////////////////////////////////////////////////////////////////////
// trackingBackend
//////////////////////////////////////////////////////////////////////////////
THREEx.ArToolkitProfile.prototype.trackingBackend = function (trackingBackend) {
ARjs.Profile.prototype.trackingBackend = function (trackingBackend) {
console.warn('stop profile.trackingBackend() obsolete function. use .trackingMethod instead')
this.contextParameters.trackingBackend = trackingBackend
return this
}
//////////////////////////////////////////////////////////////////////////////
// trackingBackend
//////////////////////////////////////////////////////////////////////////////
ARjs.Profile.prototype.changeMatrixMode = function (changeMatrixMode) {
this.defaultMarkerParameters.changeMatrixMode = changeMatrixMode
return this
}
//////////////////////////////////////////////////////////////////////////////
// trackingBackend
//////////////////////////////////////////////////////////////////////////////
ARjs.Profile.prototype.trackingMethod = function (trackingMethod) {
var data = ARjs.Utils.parseTrackingMethod(trackingMethod)
this.defaultMarkerParameters.markersAreaEnabled = data.markersAreaEnabled
this.contextParameters.trackingBackend = data.trackingBackend
return this
}
/**
* check if the profile is valid. Throw an exception is not valid
*/
ARjs.Profile.prototype.checkIfValid = function () {
if( this.contextParameters.trackingBackend === 'tango' ){
this.sourceImage(THREEx.ArToolkitContext.baseURL + '../data/images/img.jpg')
}
return this
}
var THREEx = THREEx || {}
THREEx.ArToolkitSource = function(parameters){
......@@ -3073,16 +3141,23 @@ THREEx.ArToolkitSource.prototype.hasMobileTorch = function(){
}
var videoTrack = stream.getVideoTracks()[0];
// if videoTrack.getCapabilities() doesnt exist, return false now
if( videoTrack.getCapabilities === undefined ) return false
var capabilities = videoTrack.getCapabilities()
return capabilities.torch ? true : false
}
/**
* - toggle the flash/torch of the mobile fun if applicable
* toggle the flash/torch of the mobile fun if applicable.
* Great post about it https://www.oberhofer.co/mediastreamtrack-and-its-capabilities/
*/
THREEx.ArToolkitSource.prototype.toggleMobileTorch = function(){
// sanity check
console.assert(this.hasMobileTorch() === true)
var stream = arToolkitSource.domElement.srcObject
if( stream instanceof MediaStream === false ){
alert('enabling mobile torch is available only on webcam')
......@@ -3158,7 +3233,10 @@ THREEx.ArToolkitSource.prototype.onResizeElement = function(mirrorDomElements){
}
if( arguments.length !== 0 ) console.warn('use bad signature for arToolkitSource.copyElementSizeTo')
if( arguments.length !== 0 ){
debugger
console.warn('use bad signature for arToolkitSource.copyElementSizeTo')
}
// honor default parameters
// if( mirrorDomElements !== undefined ) console.warn('still use the old resize. fix it')
if( mirrorDomElements === undefined ) mirrorDomElements = []
......@@ -3166,7 +3244,7 @@ THREEx.ArToolkitSource.prototype.onResizeElement = function(mirrorDomElements){
// Mirror _this.domElement.style to mirrorDomElements
mirrorDomElements.forEach(function(domElement){
_this.copySizeTo(domElement)
_this.copyElementSizeTo(domElement)
})
}
......@@ -3200,8 +3278,15 @@ THREEx.ArToolkitSource.prototype.onResize2 = function(arToolkitContext, renderer
// RESIZE DOMELEMENT
if( trackingBackend === 'artoolkit' ){
this.onResizeElement()
this.copyElementSizeTo(renderer.domElement)
var isAframe = renderer.domElement.dataset.aframeCanvas ? true : false
if( isAframe === false ){
this.copyElementSizeTo(renderer.domElement)
}else{
}
if( arToolkitContext.arController !== null ){
this.copyElementSizeTo(arToolkitContext.arController.canvas)
......@@ -3216,9 +3301,11 @@ THREEx.ArToolkitSource.prototype.onResize2 = function(arToolkitContext, renderer
}else console.assert(false, 'unhandled trackingBackend '+trackingBackend)
// RESIZE CAMERA
// UPDATE CAMERA
if( trackingBackend === 'artoolkit' ){
camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() );
if( arToolkitContext.arController !== null ){
camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() );
}
}else if( trackingBackend === 'aruco' ){
camera.aspect = renderer.domElement.width / renderer.domElement.height;
camera.updateProjectionMatrix();
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
<!DOCTYPE html>
<meta name='viewport' content='width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0'>
<!-- three.js library -->
<script src='../examples/vendor/three.js/build/three.js'></script>
<script src='../examples/vendor/three.js/build/three.min.js'></script>
<!-- include for artoolkit trackingBackend -->
<script src='../vendor/jsartoolkit5/build/artoolkit.min.js'></script>
<script src='../vendor/jsartoolkit5/js/artoolkit.api.js'></script>
......
......@@ -105,8 +105,8 @@
// detectionMode: 'color_and_matrix',
// matrixCodeType: '3x3',
// canvasWidth: 80*3,
// canvasHeight: 60*3,
canvasWidth: 80*3,
canvasHeight: 60*3,
maxDetectionRate: 30,
})
......
......@@ -17,7 +17,6 @@ ARjs.Session = function(parameters){
THREEx.ArMultiMarkerUtils.storeDefaultMultiMarkerFile(parameters.contextParameters.trackingBackend)
}
//////////////////////////////////////////////////////////////////////////////
// init arSource
//////////////////////////////////////////////////////////////////////////////
......@@ -35,7 +34,7 @@ ARjs.Session = function(parameters){
//////////////////////////////////////////////////////////////////////////////
// init arContext
//////////////////////////////////////////////////////////////////////////////
// create atToolkitContext
var arContext = _this.arContext = new THREEx.ArToolkitContext(parameters.contextParameters)
......
......@@ -8,26 +8,26 @@ THREEx.ArToolkitContext = function(parameters){
// handle default parameters
this.parameters = {
// AR backend - ['artoolkit', 'aruco', 'tango']
trackingBackend: parameters.trackingBackend !== undefined ? parameters.trackingBackend : 'artoolkit',
trackingBackend: 'artoolkit',
// debug - true if one should display artoolkit debug canvas, false otherwise
debug: parameters.debug !== undefined ? parameters.debug : false,
debug: false,
// the mode of detection - ['color', 'color_and_matrix', 'mono', 'mono_and_matrix']
detectionMode: parameters.detectionMode !== undefined ? parameters.detectionMode : 'mono',
detectionMode: 'mono',
// type of matrix code - valid iif detectionMode end with 'matrix' - [3x3, 3x3_HAMMING63, 3x3_PARITY65, 4x4, 4x4_BCH_13_9_3, 4x4_BCH_13_5_5]
matrixCodeType: parameters.matrixCodeType !== undefined ? parameters.matrixCodeType : '3x3',
matrixCodeType: '3x3',
// url of the camera parameters
cameraParametersUrl: parameters.cameraParametersUrl !== undefined ? parameters.cameraParametersUrl : THREEx.ArToolkitContext.baseURL + 'parameters/camera_para.dat',
cameraParametersUrl: THREEx.ArToolkitContext.baseURL + 'parameters/camera_para.dat',
// tune the maximum rate of pose detection in the source image
maxDetectionRate: parameters.maxDetectionRate !== undefined ? parameters.maxDetectionRate : 60,
maxDetectionRate: 60,
// resolution of at which we detect pose in the source image
canvasWidth: parameters.canvasWidth !== undefined ? parameters.canvasWidth : 640,
canvasHeight: parameters.canvasHeight !== undefined ? parameters.canvasHeight : 480,
canvasWidth: 640,
canvasHeight: 480,
// enable image smoothing or not for canvas copy - default to true
// https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled
imageSmoothingEnabled : parameters.imageSmoothingEnabled !== undefined ? parameters.imageSmoothingEnabled : false,
imageSmoothingEnabled : false,
}
// parameters sanity check
console.assert(['artoolkit', 'aruco', 'tango'].indexOf(this.parameters.trackingBackend) !== -1, 'invalid parameter trackingBackend', this.parameters.trackingBackend)
......@@ -40,6 +40,8 @@ THREEx.ArToolkitContext = function(parameters){
this._arMarkersControls = []
this._setParameters(parameters)
}
Object.assign( THREEx.ArToolkitContext.prototype, THREE.EventDispatcher.prototype );
......@@ -50,6 +52,33 @@ THREEx.ArToolkitContext.baseURL = 'https://jeromeetienne.github.io/AR.js/three.j
THREEx.ArToolkitContext.REVISION = '1.0.1-dev'
/**
* set parameters
* @param {[type]} values [description]
* @return {[type]} [description]
*/
THREEx.ArToolkitContext.prototype._setParameters = function (values){
if ( values === undefined ) return;
for( var key in values ){
var newValue = values[ key ];
if( newValue === undefined ){
console.warn( "THREEx.ArToolkitContext: '" + key + "' parameter is undefined." );
continue;
}
var currentValue = this.parameters[ key ];
if( currentValue === undefined ){
console.warn( "THREEx.ArToolkitContext: '" + key + "' is not a property of this material." );
continue;
}
this.parameters[ key ] = newValue;
}
};
/**
* Create a default camera for this trackingBackend
* @param {string} trackingBackend - the tracking to user
......@@ -101,7 +130,7 @@ THREEx.ArToolkitContext.prototype.init = function(onCompleted){
THREEx.ArToolkitContext.prototype.update = function(srcElement){
// be sure arController is fully initialized
if (this.parameters.trackingBackend === 'artoolkit' && this.arController === null) return false;
if(this.parameters.trackingBackend === 'artoolkit' && this.arController === null) return false;
// honor this.parameters.maxDetectionRate
var present = performance.now()
......@@ -164,7 +193,7 @@ THREEx.ArToolkitContext.prototype._initArtoolkit = function(onCompleted){
this._artoolkitProjectionAxisTransformMatrix.multiply(new THREE.Matrix4().makeRotationZ(Math.PI))
// get cameraParameters
var cameraParameters = new ARCameraParam(_this.parameters.cameraParametersUrl, function() {
var cameraParameters = new ARCameraParam(_this.parameters.cameraParametersUrl, function(){
// init controller
var arController = new ARController(_this.parameters.canvasWidth, _this.parameters.canvasHeight, cameraParameters);
_this.arController = arController
......@@ -308,9 +337,9 @@ THREEx.ArToolkitContext.prototype._updateAruco = function(srcElement){
THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
var _this = this
// check webvr is available
if (navigator.getVRDisplays) {
if (navigator.getVRDisplays){
// do nothing
} else if (navigator.getVRDevices) {
} else if (navigator.getVRDevices){
alert("Your browser supports WebVR but not the latest version. See <a href='http://webvr.info'>webvr.info</a> for more info.");
} else {
alert("Your browser does not support WebVR. See <a href='http://webvr.info'>webvr.info</a> for assistance.");
......@@ -325,7 +354,7 @@ THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
// get vrDisplay
navigator.getVRDisplays().then(function (vrDisplays) {
navigator.getVRDisplays().then(function (vrDisplays){
if( vrDisplays.length === 0 ) alert('no vrDisplays available')
var vrDisplay = _this._tangoContext.vrDisplay = vrDisplays[0]
......@@ -339,7 +368,7 @@ THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
// NOTE it doesnt seem necessary and it fails on tango
// var canvasElement = document.createElement('canvas')
// document.body.appendChild(canvasElement)
// _this._tangoContext.requestPresent([{ source: canvasElement }]).then(function() {
// _this._tangoContext.requestPresent([{ source: canvasElement }]).then(function(){
// console.log('vrdisplay request accepted')
// });
......
......@@ -63,33 +63,35 @@ ARjs.Profile.prototype.reset = function () {
ARjs.Profile.prototype.performance = function(label) {
if( label === 'default' ){
label = this._guessPerformanceLabel()
}
if( label === 'desktop-fast' ){
this.contextParameters.sourceWidth = 640*3
this.contextParameters.sourceHeight = 480*3
this.contextParameters.canvasWidth = 640*3
this.contextParameters.canvasHeight = 480*3
this.contextParameters.maxDetectionRate = 30
}else if( label === 'desktop-normal' ){
this.contextParameters.sourceWidth = 640
this.contextParameters.sourceHeight = 480
this.contextParameters.canvasWidth = 640
this.contextParameters.canvasHeight = 480
this.contextParameters.maxDetectionRate = 60
}else if( label === 'phone-normal' ){
this.contextParameters.sourceWidth = 80*4
this.contextParameters.sourceHeight = 60*4
this.contextParameters.canvasWidth = 80*4
this.contextParameters.canvasHeight = 60*4
this.contextParameters.maxDetectionRate = 30
}else if( label === 'phone-slow' ){
this.contextParameters.sourceWidth = 80*3
this.contextParameters.sourceHeight = 60*3
this.contextParameters.canvasWidth = 80*3
this.contextParameters.canvasHeight = 60*3
this.contextParameters.maxDetectionRate = 30
}else {
console.assert(false, 'unknonwn label '+label)
}
return this
}
//////////////////////////////////////////////////////////////////////////////
......
......@@ -354,7 +354,9 @@ THREEx.ArToolkitSource.prototype.onResize2 = function(arToolkitContext, renderer
// UPDATE CAMERA
if( trackingBackend === 'artoolkit' ){
camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() );
if( arToolkitContext.arController !== null ){
camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() );
}
}else if( trackingBackend === 'aruco' ){
camera.aspect = renderer.domElement.width / renderer.domElement.height;
camera.updateProjectionMatrix();
......
......@@ -16,10 +16,6 @@ var Qb=[Ik,Zh,_h,Qj,Qi,Pi,Ri,Ag,sg,qg,rg,yg,kh,jh,Oi,Mj];var Rb=[Jk,ki,ji,gi];va
// EMSCRIPTEN_END_ASM
(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=asm["__GLOBAL__sub_I_bind_cpp"];var _fflush=Module["_fflush"]=asm["_fflush"];var __GLOBAL__sub_I_ARToolKitJS_cpp=Module["__GLOBAL__sub_I_ARToolKitJS_cpp"]=asm["__GLOBAL__sub_I_ARToolKitJS_cpp"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _memset=Module["_memset"]=asm["_memset"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___getTypeName=Module["___getTypeName"]=asm["___getTypeName"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_dii=Module["dynCall_dii"]=asm["dynCall_dii"];var dynCall_vid=Module["dynCall_vid"]=asm["dynCall_vid"];var dynCall_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viid=Module["dynCall_viid"]=asm["dynCall_viid"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var ret=Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{if(e&&typeof e==="object"&&e.stack)Module.printErr("exception thrown: "+[e,e.stack]);throw e}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run()
;(function() {
'use strict'
......@@ -1657,6 +1653,8 @@ THREEx.ArBaseControls.prototype.name = function(){
}
var THREEx = THREEx || {}
// TODO this is useless - prefere arjs-hittester.js
/**
* - maybe support .onClickFcts in each object3d
* - seems an easy light layer for clickable object
......@@ -1668,6 +1666,9 @@ THREEx.ARClickability = function(sourceElement){
var fullWidth = parseInt(sourceElement.style.width)
var fullHeight = parseInt(sourceElement.style.height)
this._cameraPicking = new THREE.PerspectiveCamera(42, fullWidth / fullHeight, 0.1, 100);
console.warn('THREEx.ARClickability works only in modelViewMatrix')
// TODO just push camera in computeIntersects
}
THREEx.ARClickability.prototype.onResize = function(){
......@@ -1707,7 +1708,7 @@ THREEx.ARClickability.prototype.update = function(){
THREEx.ARClickability.tangoPickingPointCloud = function(artoolkitContext, mouseX, mouseY){
var vrDisplay = artoolkitContext._tangoContext.vrDisplay
if (vrDisplay === null ) return
if (vrDisplay === null ) return null
var pointAndPlane = vrDisplay.getPickingPointAndPlaneInPointCloud(mouseX, mouseY)
if( pointAndPlane == null ) {
console.warn('Could not retrieve the correct point and plane.')
......@@ -2348,26 +2349,26 @@ THREEx.ArToolkitContext = function(parameters){
// handle default parameters
this.parameters = {
// AR backend - ['artoolkit', 'aruco', 'tango']
trackingBackend: parameters.trackingBackend !== undefined ? parameters.trackingBackend : 'artoolkit',
trackingBackend: 'artoolkit',
// debug - true if one should display artoolkit debug canvas, false otherwise
debug: parameters.debug !== undefined ? parameters.debug : false,
debug: false,
// the mode of detection - ['color', 'color_and_matrix', 'mono', 'mono_and_matrix']
detectionMode: parameters.detectionMode !== undefined ? parameters.detectionMode : 'mono',
detectionMode: 'mono',
// type of matrix code - valid iif detectionMode end with 'matrix' - [3x3, 3x3_HAMMING63, 3x3_PARITY65, 4x4, 4x4_BCH_13_9_3, 4x4_BCH_13_5_5]
matrixCodeType: parameters.matrixCodeType !== undefined ? parameters.matrixCodeType : '3x3',
matrixCodeType: '3x3',
// url of the camera parameters
cameraParametersUrl: parameters.cameraParametersUrl !== undefined ? parameters.cameraParametersUrl : THREEx.ArToolkitContext.baseURL + 'parameters/camera_para.dat',
cameraParametersUrl: THREEx.ArToolkitContext.baseURL + 'parameters/camera_para.dat',
// tune the maximum rate of pose detection in the source image
maxDetectionRate: parameters.maxDetectionRate !== undefined ? parameters.maxDetectionRate : 60,
maxDetectionRate: 60,
// resolution of at which we detect pose in the source image
canvasWidth: parameters.canvasWidth !== undefined ? parameters.canvasWidth : 640,
canvasHeight: parameters.canvasHeight !== undefined ? parameters.canvasHeight : 480,
canvasWidth: 640,
canvasHeight: 480,
// enable image smoothing or not for canvas copy - default to true
// https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled
imageSmoothingEnabled : parameters.imageSmoothingEnabled !== undefined ? parameters.imageSmoothingEnabled : false,
imageSmoothingEnabled : false,
}
// parameters sanity check
console.assert(['artoolkit', 'aruco', 'tango'].indexOf(this.parameters.trackingBackend) !== -1, 'invalid parameter trackingBackend', this.parameters.trackingBackend)
......@@ -2375,8 +2376,13 @@ THREEx.ArToolkitContext = function(parameters){
this.arController = null;
this.arucoContext = null;
_this.initialized = false
this._arMarkersControls = []
this._setParameters(parameters)
}
Object.assign( THREEx.ArToolkitContext.prototype, THREE.EventDispatcher.prototype );
......@@ -2387,6 +2393,33 @@ THREEx.ArToolkitContext.baseURL = 'https://jeromeetienne.github.io/AR.js/three.j
THREEx.ArToolkitContext.REVISION = '1.0.1-dev'
/**
* set parameters
* @param {[type]} values [description]
* @return {[type]} [description]
*/
THREEx.ArToolkitContext.prototype._setParameters = function (values){
if ( values === undefined ) return;
for( var key in values ){
var newValue = values[ key ];
if( newValue === undefined ){
console.warn( "THREEx.ArToolkitContext: '" + key + "' parameter is undefined." );
continue;
}
var currentValue = this.parameters[ key ];
if( currentValue === undefined ){
console.warn( "THREEx.ArToolkitContext: '" + key + "' is not a property of this material." );
continue;
}
this.parameters[ key ] = newValue;
}
};
/**
* Create a default camera for this trackingBackend
* @param {string} trackingBackend - the tracking to user
......@@ -2426,6 +2459,8 @@ THREEx.ArToolkitContext.prototype.init = function(onCompleted){
type: 'initialized'
});
_this.initialized = true
onCompleted && onCompleted()
}
......@@ -2436,7 +2471,7 @@ THREEx.ArToolkitContext.prototype.init = function(onCompleted){
THREEx.ArToolkitContext.prototype.update = function(srcElement){
// be sure arController is fully initialized
if (this.parameters.trackingBackend === 'artoolkit' && this.arController === null) return false;
if(this.parameters.trackingBackend === 'artoolkit' && this.arController === null) return false;
// honor this.parameters.maxDetectionRate
var present = performance.now()
......@@ -2499,7 +2534,7 @@ THREEx.ArToolkitContext.prototype._initArtoolkit = function(onCompleted){
this._artoolkitProjectionAxisTransformMatrix.multiply(new THREE.Matrix4().makeRotationZ(Math.PI))
// get cameraParameters
var cameraParameters = new ARCameraParam(_this.parameters.cameraParametersUrl, function() {
var cameraParameters = new ARCameraParam(_this.parameters.cameraParametersUrl, function(){
// init controller
var arController = new ARController(_this.parameters.canvasWidth, _this.parameters.canvasHeight, cameraParameters);
_this.arController = arController
......@@ -2643,9 +2678,9 @@ THREEx.ArToolkitContext.prototype._updateAruco = function(srcElement){
THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
var _this = this
// check webvr is available
if (navigator.getVRDisplays) {
if (navigator.getVRDisplays){
// do nothing
} else if (navigator.getVRDevices) {
} else if (navigator.getVRDevices){
alert("Your browser supports WebVR but not the latest version. See <a href='http://webvr.info'>webvr.info</a> for more info.");
} else {
alert("Your browser does not support WebVR. See <a href='http://webvr.info'>webvr.info</a> for assistance.");
......@@ -2660,7 +2695,7 @@ THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
// get vrDisplay
navigator.getVRDisplays().then(function (vrDisplays) {
navigator.getVRDisplays().then(function (vrDisplays){
if( vrDisplays.length === 0 ) alert('no vrDisplays available')
var vrDisplay = _this._tangoContext.vrDisplay = vrDisplays[0]
......@@ -2674,7 +2709,7 @@ THREEx.ArToolkitContext.prototype._initTango = function(onCompleted){
// NOTE it doesnt seem necessary and it fails on tango
// var canvasElement = document.createElement('canvas')
// document.body.appendChild(canvasElement)
// _this._tangoContext.requestPresent([{ source: canvasElement }]).then(function() {
// _this._tangoContext.requestPresent([{ source: canvasElement }]).then(function(){
// console.log('vrdisplay request accepted')
// });
......@@ -2735,6 +2770,8 @@ THREEx.ArToolkitContext.prototype._updateTango = function(srcElement){
// }
}
var ARjs = ARjs || {}
var THREEx = THREEx || {}
/**
......@@ -2744,14 +2781,14 @@ var THREEx = THREEx || {}
* - you can use this class to understand how to tune your specific usecase
* - it is made to help people to build parameters without understanding all the underlying details.
*/
THREEx.ArToolkitProfile = function(){
ARjs.Profile = THREEx.ArToolkitProfile = function(){
this.reset()
this.performance('default')
}
THREEx.ArToolkitProfile.prototype._guessPerformanceLabel = function() {
ARjs.Profile.prototype._guessPerformanceLabel = function() {
var isMobile = navigator.userAgent.match(/Android/i)
|| navigator.userAgent.match(/webOS/i)
|| navigator.userAgent.match(/iPhone/i)
......@@ -2773,7 +2810,7 @@ THREEx.ArToolkitProfile.prototype._guessPerformanceLabel = function() {
/**
* reset all parameters
*/
THREEx.ArToolkitProfile.prototype.reset = function () {
ARjs.Profile.prototype.reset = function () {
this.sourceParameters = {
// to read from the webcam
sourceType : 'webcam',
......@@ -2785,7 +2822,8 @@ THREEx.ArToolkitProfile.prototype.reset = function () {
}
this.defaultMarkerParameters = {
type : 'pattern',
patternUrl : THREEx.ArToolkitContext.baseURL + '../data/data/patt.hiro'
patternUrl : THREEx.ArToolkitContext.baseURL + '../data/data/patt.hiro',
changeMatrixMode: 'modelViewMatrix',
}
return this
};
......@@ -2796,34 +2834,36 @@ THREEx.ArToolkitProfile.prototype.reset = function () {
THREEx.ArToolkitProfile.prototype.performance = function(label) {
ARjs.Profile.prototype.performance = function(label) {
if( label === 'default' ){
label = this._guessPerformanceLabel()
}
if( label === 'desktop-fast' ){
this.contextParameters.sourceWidth = 640*3
this.contextParameters.sourceHeight = 480*3
this.contextParameters.canvasWidth = 640*3
this.contextParameters.canvasHeight = 480*3
this.contextParameters.maxDetectionRate = 30
}else if( label === 'desktop-normal' ){
this.contextParameters.sourceWidth = 640
this.contextParameters.sourceHeight = 480
this.contextParameters.canvasWidth = 640
this.contextParameters.canvasHeight = 480
this.contextParameters.maxDetectionRate = 60
}else if( label === 'phone-normal' ){
this.contextParameters.sourceWidth = 80*4
this.contextParameters.sourceHeight = 60*4
this.contextParameters.canvasWidth = 80*4
this.contextParameters.canvasHeight = 60*4
this.contextParameters.maxDetectionRate = 30
}else if( label === 'phone-slow' ){
this.contextParameters.sourceWidth = 80*3
this.contextParameters.sourceHeight = 60*3
this.contextParameters.canvasWidth = 80*3
this.contextParameters.canvasHeight = 60*3
this.contextParameters.maxDetectionRate = 30
}else {
console.assert(false, 'unknonwn label '+label)
}
return this
}
//////////////////////////////////////////////////////////////////////////////
......@@ -2831,7 +2871,7 @@ THREEx.ArToolkitProfile.prototype.performance = function(label) {
//////////////////////////////////////////////////////////////////////////////
THREEx.ArToolkitProfile.prototype.defaultMarker = function (trackingBackend) {
ARjs.Profile.prototype.defaultMarker = function (trackingBackend) {
trackingBackend = trackingBackend || this.contextParameters.trackingBackend
if( trackingBackend === 'artoolkit' ){
......@@ -2853,20 +2893,19 @@ THREEx.ArToolkitProfile.prototype.defaultMarker = function (trackingBackend) {
//////////////////////////////////////////////////////////////////////////////
// Source
//////////////////////////////////////////////////////////////////////////////
THREEx.ArToolkitProfile.prototype.sourceWebcam = function () {
ARjs.Profile.prototype.sourceWebcam = function () {
this.sourceParameters.sourceType = 'webcam'
delete this.sourceParameters.sourceUrl
return this
}
THREEx.ArToolkitProfile.prototype.sourceVideo = function (url) {
ARjs.Profile.prototype.sourceVideo = function (url) {
this.sourceParameters.sourceType = 'video'
this.sourceParameters.sourceUrl = url
return this
}
THREEx.ArToolkitProfile.prototype.sourceImage = function (url) {
ARjs.Profile.prototype.sourceImage = function (url) {
this.sourceParameters.sourceType = 'image'
this.sourceParameters.sourceUrl = url
return this
......@@ -2875,10 +2914,39 @@ THREEx.ArToolkitProfile.prototype.sourceImage = function (url) {
//////////////////////////////////////////////////////////////////////////////
// trackingBackend
//////////////////////////////////////////////////////////////////////////////
THREEx.ArToolkitProfile.prototype.trackingBackend = function (trackingBackend) {
ARjs.Profile.prototype.trackingBackend = function (trackingBackend) {
console.warn('stop profile.trackingBackend() obsolete function. use .trackingMethod instead')
this.contextParameters.trackingBackend = trackingBackend
return this
}
//////////////////////////////////////////////////////////////////////////////
// trackingBackend
//////////////////////////////////////////////////////////////////////////////
ARjs.Profile.prototype.changeMatrixMode = function (changeMatrixMode) {
this.defaultMarkerParameters.changeMatrixMode = changeMatrixMode
return this
}
//////////////////////////////////////////////////////////////////////////////
// trackingBackend
//////////////////////////////////////////////////////////////////////////////
ARjs.Profile.prototype.trackingMethod = function (trackingMethod) {
var data = ARjs.Utils.parseTrackingMethod(trackingMethod)
this.defaultMarkerParameters.markersAreaEnabled = data.markersAreaEnabled
this.contextParameters.trackingBackend = data.trackingBackend
return this
}
/**
* check if the profile is valid. Throw an exception is not valid
*/
ARjs.Profile.prototype.checkIfValid = function () {
if( this.contextParameters.trackingBackend === 'tango' ){
this.sourceImage(THREEx.ArToolkitContext.baseURL + '../data/images/img.jpg')
}
return this
}
var THREEx = THREEx || {}
THREEx.ArToolkitSource = function(parameters){
......@@ -3073,16 +3141,23 @@ THREEx.ArToolkitSource.prototype.hasMobileTorch = function(){
}
var videoTrack = stream.getVideoTracks()[0];
// if videoTrack.getCapabilities() doesnt exist, return false now
if( videoTrack.getCapabilities === undefined ) return false
var capabilities = videoTrack.getCapabilities()
return capabilities.torch ? true : false
}
/**
* - toggle the flash/torch of the mobile fun if applicable
* toggle the flash/torch of the mobile fun if applicable.
* Great post about it https://www.oberhofer.co/mediastreamtrack-and-its-capabilities/
*/
THREEx.ArToolkitSource.prototype.toggleMobileTorch = function(){
// sanity check
console.assert(this.hasMobileTorch() === true)
var stream = arToolkitSource.domElement.srcObject
if( stream instanceof MediaStream === false ){
alert('enabling mobile torch is available only on webcam')
......@@ -3158,7 +3233,10 @@ THREEx.ArToolkitSource.prototype.onResizeElement = function(mirrorDomElements){
}
if( arguments.length !== 0 ) console.warn('use bad signature for arToolkitSource.copyElementSizeTo')
if( arguments.length !== 0 ){
debugger
console.warn('use bad signature for arToolkitSource.copyElementSizeTo')
}
// honor default parameters
// if( mirrorDomElements !== undefined ) console.warn('still use the old resize. fix it')
if( mirrorDomElements === undefined ) mirrorDomElements = []
......@@ -3166,7 +3244,7 @@ THREEx.ArToolkitSource.prototype.onResizeElement = function(mirrorDomElements){
// Mirror _this.domElement.style to mirrorDomElements
mirrorDomElements.forEach(function(domElement){
_this.copySizeTo(domElement)
_this.copyElementSizeTo(domElement)
})
}
......@@ -3200,8 +3278,15 @@ THREEx.ArToolkitSource.prototype.onResize2 = function(arToolkitContext, renderer
// RESIZE DOMELEMENT
if( trackingBackend === 'artoolkit' ){
this.onResizeElement()
this.copyElementSizeTo(renderer.domElement)
var isAframe = renderer.domElement.dataset.aframeCanvas ? true : false
if( isAframe === false ){
this.copyElementSizeTo(renderer.domElement)
}else{
}
if( arToolkitContext.arController !== null ){
this.copyElementSizeTo(arToolkitContext.arController.canvas)
......@@ -3216,9 +3301,11 @@ THREEx.ArToolkitSource.prototype.onResize2 = function(arToolkitContext, renderer
}else console.assert(false, 'unhandled trackingBackend '+trackingBackend)
// RESIZE CAMERA
// UPDATE CAMERA
if( trackingBackend === 'artoolkit' ){
camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() );
if( arToolkitContext.arController !== null ){
camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() );
}
}else if( trackingBackend === 'aruco' ){
camera.aspect = renderer.domElement.width / renderer.domElement.height;
camera.updateProjectionMatrix();
......
......@@ -23,5 +23,5 @@ c[f+260>>2]=e;if((e|0)<0){c[g>>2]=d;Me(3,6312,g);Ce(c[b>>2]|0)|0;Me(3,6358,h);e=
n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Dd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){p=d[s>>0]|0;q=d[s+1>>0]|0;do if(((p&248)+12+(p<<5&224)+(q>>>3&24)+(q<<2&248)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Ed(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<2)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+2>>0]|0)+(d[s+1>>0]|0)+(d[s+3>>0]|0)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+4|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+8|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Fd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+l|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+1|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+2|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Gd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+(l<<1)|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t+1>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+2|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+4|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Hd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+(l<<1)|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+2|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+4|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Id(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;m=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;l=(c[k+4>>2]|0)+m|0;z=1;e=e+m|0;o=o+(m<<1)|0;j=j+m|0;m=0;b:while(1){if(y){u=1;t=e;s=m;while(1){do if((d[t>>0]|0)>(d[j>>0]|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+1|0;j=j+1|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}z=z+1|0;if((z|0)>=(B|0)){p=m;D=52;break a}else{l=l+2|0;e=e+2|0;o=o+4|0;j=j+2|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((p|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(p|0)){e=e+1|0;n=n+4|0}else break}}j=k+8|0;l=m+-1|0;c[j>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[j>>2]|0))}if((p|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(p|0))}if((c[j>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[j>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Jd(a){a=a|0;return Kd(a+8|0)|0}function Kd(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=Uj(4)|0;if(!b){Me(3,5472,d);rb(1)}a=wf(a)|0;c[b>>2]=a;if(!a){Vj(b);b=0}i=d;return b|0}function Ld(a){a=a|0;var b=0;b=c[a>>2]|0;if(!b)b=-1;else{xf(b)|0;Vj(c[a>>2]|0);c[a>>2]=0;b=0}return b|0}function Md(a){a=a|0;var b=0,d=0,e=0;d=i;i=i+16|0;b=Uj(7062432)|0;if(!b){Me(3,5472,d);rb(1)}c[b>>2]=0;c[b+4834148>>2]=0;c[b+7062408>>2]=0;c[b+4>>2]=-1;c[b+8>>2]=0;c[b+12>>2]=1;c[b+16>>2]=100;c[b+20>>2]=0;c[b+24>>2]=0;c[b+28>>2]=2;h[b+7062416>>3]=.5;c[b+7062424>>2]=3;c[b+32>>2]=a;e=c[a>>2]|0;c[b+36>>2]=e;a=c[a+4>>2]|0;c[b+40>>2]=a;c[b+44>>2]=0;c[b+15408>>2]=0;c[b+4834152>>2]=0;c[b+4818296>>2]=0;a=Uj($(e<<1,a)|0)|0;c[b+4834144>>2]=a;if(!a){Me(3,5472,d+8|0);rb(1)}else{c[b+7062384>>2]=0;Nd(b,2)|0;Od(b,0)|0;c[b+7062388>>2]=-1;Pd(b,0)|0;c[b+7062392>>2]=7;c[b+7062396>>2]=0;i=d;return b|0}return 0}function Nd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+16|0;d=g;a:do if(a){e=a+4|0;if((c[e>>2]|0)!=(b|0)){switch(b|0){case 11:case 10:case 9:case 8:case 7:case 6:case 4:case 3:case 2:case 1:case 0:{f=0;break}case 14:case 13:case 12:case 5:{f=1;break}default:{c[d>>2]=b;Me(3,3936,d);d=-1;break a}}c[e>>2]=b;c[a+8>>2]=Pe(b)|0;d=a+7062408|0;b=c[d>>2]|0;if(b){pe(b);c[d>>2]=oe(c[a+36>>2]|0,c[a+40>>2]|0,c[e>>2]|0,0)|0}d=a+24|0;b=c[d>>2]|0;if(!f)switch(b|0){case 1:{c[d>>2]=4;d=0;break a}case 4:{c[d>>2]=3;d=0;break a}default:{d=0;break a}}else switch(b|0){case 0:{c[d>>2]=1;d=0;break a}case 3:{c[d>>2]=4;d=0;break a}default:{d=0;break a}}}else d=0;
}else d=-1;while(0);i=g;return d|0}function Od(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;do if(a)if((c[a>>2]|0)!=(b|0)){c[a>>2]=b;if(!b){d=a+4834148|0;Vj(c[d>>2]|0);c[d>>2]=0;d=0;break}b=Uj($(c[a+40>>2]|0,c[a+36>>2]|0)|0)|0;c[a+4834148>>2]=b;if(!b){Me(3,5472,e);rb(1)}else d=0}else d=0;else d=-1;while(0);i=f;return d|0}function Pd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;h=j+8|0;f=j;if(a){g=a+7062388|0;if((c[g>>2]|0)!=(b|0)){d=a+7062408|0;e=c[d>>2]|0;if(e){pe(e);c[d>>2]=0}switch(b|0){case 3:case 2:case 1:{c[d>>2]=oe(c[a+36>>2]|0,c[a+40>>2]|0,c[a+4>>2]|0,0)|0;break}case 4:{c[a+7062404>>2]=1;c[a+7062400>>2]=1;b=4;break}case 0:{b=0;break}default:{Me(3,3985,f);b=0}}c[g>>2]=b;if((c[a>>2]|0)==1){c[h>>2]=c[760+(b<<2)>>2];Me(3,4059,h);b=0}else b=0}else b=0}else b=-1;i=j;return b|0}function Qd(a){a=a|0;var b=0,d=0;if(!a)b=-1;else{b=a+7062408|0;d=c[b>>2]|0;if(d){pe(d);c[b>>2]=0}Vj(c[a+4834144>>2]|0);Vj(c[a+4834148>>2]|0);Vj(a);b=0}return b|0}function Rd(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a>>2];a=0}else a=-1;return a|0}function Sd(a,b){a=a|0;b=b|0;if((a|0)!=0&b>>>0<2){c[a+12>>2]=b;a=0}else a=-1;return a|0}function Td(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+12>>2];a=0}else a=-1;return a|0}function Ud(a,b){a=a|0;b=b|0;if((a|0)==0|b>>>0>255)a=-1;else{c[a+16>>2]=b;a=0}return a|0}function Vd(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+16>>2];a=0}else a=-1;return a|0}function Wd(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+7062388>>2];a=0}else a=-1;return a|0}function Xd(a,b){a=a|0;b=b|0;if((a|0)!=0&b>>>0<2){c[a+20>>2]=b;a=0}else a=-1;return a|0}function Yd(a,b){a=a|0;b=b|0;if(!a)a=-1;else{c[b>>2]=c[a+20>>2];a=0}return a|0}function Zd(a,b){a=a|0;b=b|0;if((a|0)!=0&b>>>0<5){c[a+24>>2]=b;a=0}else a=-1;return a|0}function _d(a,b){a=a|0;b=b|0;if(!a)a=-1;else{c[a+7062424>>2]=b;a=0}return a|0}function $d(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+7062424>>2];a=0}else a=-1;return a|0}function ae(a,b){a=a|0;b=b|0;if(!a)a=-1;else{c[b>>2]=c[a+24>>2];a=0}return a|0}function be(a,b){a=a|0;b=+b;if((a|0)!=0?!(b<=0.0|b>=1.0):0){h[a+7062416>>3]=b;a=0}else a=-1;return a|0}function ce(a,b){a=a|0;b=b|0;if(!a)a=-1;else{h[b>>3]=+h[a+7062416>>3];a=0}return a|0}function de(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0.0,S=0.0;Q=i;i=i+80|0;M=Q+32|0;G=Q+24|0;z=Q;y=Q+52|0;D=Q+40|0;L=Q+64|0;P=a+44|0;c[P>>2]=0;J=a+7062388|0;f=c[J>>2]|0;a:do if((f|0)==4){I=a+7062396|0;e=c[I>>2]|0;do if((e|0)>0){f=4;e=e+-1|0}else{C=a+16|0;F=c[C>>2]|0;E=a+7062400|0;A=(c[E>>2]|0)+F|0;A=(A|0)>255?255:A;c[y>>2]=A;H=a+7062404|0;B=F-(c[H>>2]|0)|0;B=(B|0)<0?0:B;c[y+4>>2]=B;c[y+8>>2]=F;e=a+36|0;f=a+40|0;g=a+4|0;k=a+12|0;l=a+20|0;m=a+4834144|0;p=a+15416|0;q=a+15408|0;r=a+7062384|0;s=a+24|0;t=a+32|0;u=a+7062416|0;v=a+48|0;w=a+7062424|0;x=0;do{if((xe(b,c[e>>2]|0,c[f>>2]|0,c[g>>2]|0,c[a>>2]|0,c[k>>2]|0,c[y+(x<<2)>>2]|0,c[l>>2]|0,m,0)|0)<0){e=-1;break a}if((fe(c[e>>2]|0,c[f>>2]|0,m,c[l>>2]|0,1e6,70,1.0,p,q)|0)<0){e=-1;break a}if((je(b,c[e>>2]|0,c[f>>2]|0,c[g>>2]|0,p,c[q>>2]|0,c[r>>2]|0,c[l>>2]|0,c[s>>2]|0,(c[t>>2]|0)+184|0,+h[u>>3],v,P,c[w>>2]|0)|0)<0){e=-1;break a}c[D+(x<<2)>>2]=c[P>>2];x=x+1|0}while((x|0)<3);if((c[a>>2]|0)==1){N=c[D+4>>2]|0;g=c[D+8>>2]|0;f=c[D>>2]|0;c[z>>2]=B;c[z+4>>2]=N;c[z+8>>2]=F;c[z+12>>2]=g;c[z+16>>2]=A;c[z+20>>2]=f;Me(3,4153,z)}else{f=c[D>>2]|0;g=c[D+8>>2]|0}e=c[D+4>>2]|0;if((f|0)>(g|0)|(e|0)>(g|0)){f=(f|0)>=(e|0)?A:B;c[C>>2]=f;e=f-F|0;if((e|0)>0){c[E>>2]=e;e=1}else{c[E>>2]=1;e=0-e|0}c[H>>2]=e;if((c[a>>2]|0)==1){c[G>>2]=f;Me(3,4229,G)}f=c[J>>2]|0;e=c[a+7062392>>2]|0;break}e=c[E>>2]|0;f=c[H>>2]|0;do if((e|0)>=(f|0))if((e|0)>(f|0)){c[H>>2]=f+1;break}else{e=e+1|0;c[E>>2]=e;c[H>>2]=f+1;break}else{e=e+1|0;c[E>>2]=e}while(0);if((e+F|0)>254){c[E>>2]=1;e=1}if((F|0)<=(e|0))c[H>>2]=1;c[I>>2]=c[a+7062392>>2];N=47;break a}while(0);c[I>>2]=e;N=30}else N=30;while(0);b:do if((N|0)==30){c:do switch(f|0){case 3:{f=a+7062408|0;e=we(c[f>>2]|0,b,9,-7)|0;if((e|0)<0)break b;e=c[f>>2]|0;f=a+4834144|0;e=xe(c[e>>2]|0,c[e+8>>2]|0,c[e+12>>2]|0,5,c[a>>2]|0,c[a+12>>2]|0,0,0,f,c[e+4>>2]|0)|0;if((e|0)<0)break b;e=a+36|0;g=a+40|0;k=a+20|0;break}case 2:case 1:{g=a+7062396|0;e=c[g>>2]|0;if((e|0)>0){c[g>>2]=e+-1;N=44;break c}e=c[a+7062408>>2]|0;if((f|0)==1)e=ue(e,b,L)|0;else e=ve(e,b,L)|0;if((e|0)<0)break b;e=a+16|0;if((c[a>>2]|0)==1?(K=d[L>>0]|0,(c[e>>2]|0)!=(K|0)):0){c[M>>2]=(c[J>>2]|0)==1?4281:4288;c[M+4>>2]=K;Me(3,4293,M)}c[e>>2]=d[L>>0];c[g>>2]=c[a+7062392>>2];N=44;break}default:N=44}while(0);if((N|0)==44){e=a+36|0;g=a+40|0;k=a+20|0;f=a+4834144|0;if((xe(b,c[e>>2]|0,c[g>>2]|0,c[a+4>>2]|0,c[a>>2]|0,c[a+12>>2]|0,c[a+16>>2]|0,c[k>>2]|0,f,0)|0)<0){e=-1;break}}l=a+15416|0;m=a+15408|0;if((fe(c[e>>2]|0,c[g>>2]|0,f,c[k>>2]|0,1e6,70,1.0,l,m)|0)>=0?(je(b,c[e>>2]|0,c[g>>2]|0,c[a+4>>2]|0,l,c[m>>2]|0,c[a+7062384>>2]|0,c[k>>2]|0,c[a+24>>2]|0,(c[a+32>>2]|0)+184|0,+h[a+7062416>>3],a+48|0,P,c[a+7062424>>2]|0)|0)>=0:0)N=47;else e=-1}while(0);d:do if((N|0)==47){t=a+28|0;if((c[t>>2]|0)==1){ee(a);e=0;break}u=a+4818296|0;r=a+24|0;q=c[u>>2]|0;if((q|0)>0){s=0;do{f=c[P>>2]|0;g=a+4818304+(s*264|0)+56|0;k=a+4818304+(s*264|0)+64|0;if((f|0)>0){o=+(c[a+4818304+(s*264|0)>>2]|0);e=-1;l=0;n=.5;while(1){j=+(c[a+48+(l<<8)>>2]|0);R=o/j;if(!(R<.7|R>1.43)?(R=+h[a+48+(l<<8)+56>>3]-+h[g>>3],O=+h[a+48+(l<<8)+64>>3]-+h[k>>3],O=(R*R+O*O)/j,O<n):0){e=l;j=O}else j=n;l=l+1|0;if((l|0)>=(f|0)){p=e;break}else n=j}}else p=-1;e:do if((p|0)>-1){m=c[r>>2]|0;switch(m|0){case 2:case 1:case 0:break;case 4:case 3:{g=a+48+(p<<8)+40|0;j=+h[a+4818304+(s*264|0)+40>>3];if(!(+h[g>>3]<j)){e=a+48+(p<<8)+48|0;f=a+4818304+(s*264|0)+48|0;if(!(+h[e>>3]<+h[f>>3]))break e}else{f=a+4818304+(s*264|0)+48|0;e=a+48+(p<<8)+48|0}h[g>>3]=j;c[a+48+(p<<8)+8>>2]=c[a+4818304+(s*264|0)+8>>2];h[e>>3]=+h[f>>3];c[a+48+(p<<8)+12>>2]=c[a+4818304+(s*264|0)+12>>2];e=-1;n=1.0e8;g=0;while(1){j=0.0;f=0;do{b=(f+g|0)%4|0;o=+h[a+4818304+(s*264|0)+168+(f<<4)>>3]-+h[a+48+(p<<8)+168+(b<<4)>>3];R=+h[a+4818304+(s*264|0)+168+(f<<4)+8>>3]-+h[a+48+(p<<8)+168+(b<<4)+8>>3];j=j+(o*o+R*R);f=f+1|0}while((f|0)!=4);f=j<n;e=f?g:e;g=g+1|0;if((g|0)==4)break;else n=f?j:n}b=4-e|0;c[a+48+(p<<8)+20>>2]=(b+(c[a+4818304+(s*264|0)+20>>2]|0)|0)%4|0;c[a+48+(p<<8)+24>>2]=(b+(c[a+4818304+(s*264|0)+24>>2]|0)|0)%4|0;break e}default:{e=-1;break d}}e=a+48+(p<<8)+32|0;o=+h[a+4818304+(s*264|0)+32>>3];if(+h[e>>3]<o){h[e>>3]=o;l=c[a+4818304+(s*264|0)+4>>2]|0;c[a+48+(p<<8)+4>>2]=l;g=a+4818304+(s*264|0)+16|0;e=-1;n=1.0e8;k=0;while(1){j=0.0;f=0;do{b=(f+k|0)%4|0;S=+h[a+4818304+(s*264|0)+168+(f<<4)>>3]-+h[a+48+(p<<8)+168+(b<<4)>>3];R=+h[a+4818304+(s*264|0)+168+(f<<4)+8>>3]-+h[a+48+(p<<8)+168+(b<<4)+8>>3];j=j+(S*S+R*R);f=f+1|0}while((f|0)!=4);if(j<n)e=(4-k+(c[g>>2]|0)|0)%4|0;else j=n;k=k+1|0;if((k|0)==4)break;else n=j}c[a+48+(p<<8)+16>>2]=e;if(m>>>0<2){c[a+48+(p<<8)+8>>2]=l;h[a+48+(p<<8)+40>>3]=o;c[a+48+(p<<8)+20>>2]=e;break}else{c[a+48+(p<<8)+12>>2]=l;h[a+48+(p<<8)+48>>3]=o;c[a+48+(p<<8)+24>>2]=e;break}}}while(0);s=s+1|0}while((s|0)<(q|0))}ee(a);if((c[u>>2]|0)>0){g=0;e=0;do{f=a+4818304+(g*264|0)|0;N=a+4818304+(g*264|0)+256|0;b=(c[N>>2]|0)+1|0;c[N>>2]=b;if((b|0)<4){if((g|0)!=(e|0))ik(a+4818304+(e*264|0)|0,f|0,264)|0;e=e+1|0}g=g+1|0}while((g|0)<(c[u>>2]|0))}else e=0;c[u>>2]=e;e=c[P>>2]|0;f:do if((e|0)>0){m=0;do{k=a+48+(m<<8)|0;g=c[a+48+(m<<8)+4>>2]|0;if((g|0)>=0){l=c[u>>2]|0;g:do if((l|0)>0){f=0;do{if((c[a+4818304+(f*264|0)+4>>2]|0)==(g|0))break g;f=f+1|0}while((f|0)<(l|0))}else f=0;while(0);if((f|0)==(l|0)){if((l|0)==60)break f;c[u>>2]=l+1}ik(a+4818304+(f*264|0)|0,k|0,256)|0;c[a+4818304+(f*264|0)+256>>2]=1}m=m+1|0;e=c[P>>2]|0}while((m|0)<(e|0))}while(0);if((c[t>>2]|0)!=2?(c[u>>2]|0)>0:0){l=0;while(1){g=a+4818304+(l*264|0)+56|0;k=a+4818304+(l*264|0)+64|0;h:do if((e|0)>0){n=+(c[a+4818304+(l*264|0)>>2]|0);f=0;do{j=+(c[a+48+(f<<8)>>2]|0);S=n/j;if(!(S<.7|S>1.43)?(R=+h[a+48+(f<<8)+56>>3]-+h[g>>3],S=+h[a+48+(f<<8)+64>>3]-+h[k>>3],(R*R+S*S)/j<.5):0)break h;f=f+1|0}while((f|0)<(e|0))}else f=0;while(0);if((f|0)==(e|0)){ik(a+48+(e<<8)|0,a+4818304+(l*264|0)|0,256)|0;e=(c[P>>2]|0)+1|0;c[P>>2]=e}l=l+1|0;if((l|0)>=(c[u>>2]|0)){e=0;break}}}else e=0}while(0);i=Q;return e|0}function ee(a){a=a|0;var b=0,d=0,e=0,f=0;switch(c[a+24>>2]|0){case 1:case 0:{d=c[a+44>>2]|0;if((d|0)>0){e=0;do{b=a+48+(e<<8)+4|0;if((c[b>>2]|0)>-1?+h[a+48+(e<<8)+32>>3]<.5:0){c[a+48+(e<<8)+8>>2]=-1;c[b>>2]=-1;c[a+48+(e<<8)+236>>2]=6}e=e+1|0}while((e|0)<(d|0))}break}case 2:{d=c[a+44>>2]|0;if((d|0)>0){e=0;do{b=a+48+(e<<8)+4|0;if((c[b>>2]|0)>-1?+h[a+48+(e<<8)+32>>3]<.5:0){c[a+48+(e<<8)+12>>2]=-1;c[b>>2]=-1;c[a+48+(e<<8)+236>>2]=6}e=e+1|0}while((e|0)<(d|0))}break}default:{e=c[a+44>>2]|0;if((e|0)>0){f=0;do{b=a+48+(f<<8)+8|0;if((c[b>>2]|0)>-1?+h[a+48+(f<<8)+40>>3]<.5:0){c[b>>2]=-1;d=0}else d=1;b=a+48+(f<<8)+12|0;if(((c[b>>2]|0)>-1?+h[a+48+(f<<8)+48>>3]<.5:0)?(c[b>>2]=-1,(d|0)==0):0)c[a+48+(f<<8)+236>>2]=6;f=f+1|0}while((f|0)<(e|0))}}}return}function fe(a,b,d,e,f,g,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;k=k|0;l=l|0;var m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0;L=i;i=i+96|0;F=L+56|0;H=L+48|0;G=L+8|0;I=L;K=(e|0)==1;if(K){a=(a|0)/2|0;b=(b|0)/2|0;f=(f|0)/4|0;g=(g|0)/4|0}c[l>>2]=0;C=d+8|0;D=a+-2|0;z=b+-2|0;A=d+1179664|0;a:do if((c[C>>2]|0)>0){B=0;while(1){w=d+12+(B<<2)|0;y=c[w>>2]|0;b:do if(((((!((y|0)<(g|0)|(y|0)>(f|0))?(E=d+131084+(B<<4)|0,(c[E>>2]|0)!=1):0)?(c[d+131084+(B<<4)+4>>2]|0)!=(D|0):0)?(c[d+131084+(B<<4)+8>>2]|0)!=1:0)?(c[d+131084+(B<<4)+12>>2]|0)!=(z|0):0)?(ge(c[d>>2]|0,a,0,A,B+1|0,E,k+((c[l>>2]|0)*80048|0)|0)|0)>=0:0){t=c[w>>2]|0;x=c[l>>2]|0;u=k+(x*80048|0)+28|0;b=c[u>>2]|0;v=k+(x*80048|0)+40028|0;n=c[v>>2]|0;y=k+(x*80048|0)+24|0;o=(c[y>>2]|0)+-1|0;if((o|0)>1){r=0;s=1;e=0;while(1){p=(c[k+(x*80048|0)+28+(s<<2)>>2]|0)-b|0;p=$(p,p)|0;q=(c[k+(x*80048|0)+40028+(s<<2)>>2]|0)-n|0;p=($(q,q)|0)+p|0;q=(p|0)>(r|0);e=q?s:e;s=s+1|0;if((s|0)>=(o|0))break;else r=q?p:r}}else e=0;m=+(t|0)/.75*.01*j;c[H>>2]=0;c[I>>2]=0;c:do if((he(u,v,0,e,m,F,H)|0)>=0?(he(u,v,e,(c[y>>2]|0)+-1|0,m,G,I)|0)>=0:0){b=c[H>>2]|0;n=c[I>>2]|0;do if((b|0)==1&(n|0)==1){b=c[G>>2]|0;n=c[F>>2]|0}else{if((b|0)>1&(n|0)==0){b=(e|0)/2|0;c[I>>2]=0;c[H>>2]=0;if((he(u,v,0,b,m,F,H)|0)<0)break c;if((he(u,v,b,e,m,G,I)|0)<0)break c;if(!((c[H>>2]|0)==1&(c[I>>2]|0)==1))break c;b=e;n=c[F>>2]|0;e=c[G>>2]|0;break}if(!((b|0)==0&(n|0)>1))break c;b=(e+-1+(c[y>>2]|0)|0)/2|0;c[I>>2]=0;c[H>>2]=0;if((he(u,v,e,b,m,F,H)|0)<0)break c;if((he(u,v,b,(c[y>>2]|0)+-1|0,m,G,I)|0)<0)break c;if(!((c[H>>2]|0)==1&(c[I>>2]|0)==1))break c;b=c[G>>2]|0;n=e;e=c[F>>2]|0}while(0);c[k+(x*80048|0)+80028>>2]=0;c[k+(x*80048|0)+80032>>2]=n;c[k+(x*80048|0)+80036>>2]=e;c[k+(x*80048|0)+80040>>2]=b;c[k+(x*80048|0)+80044>>2]=(c[y>>2]|0)+-1;c[k+((c[l>>2]|0)*80048|0)>>2]=c[w>>2];y=c[l>>2]|0;h[k+(y*80048|0)+8>>3]=+h[d+655376+(B<<4)>>3];h[k+(y*80048|0)+16>>3]=+h[d+655376+(B<<4)+8>>3];y=y+1|0;c[l>>2]=y;if((y|0)==60){e=60;break a}else break b}while(0)}while(0);B=B+1|0;if((B|0)>=(c[C>>2]|0)){J=4;break}}}else J=4;while(0);if((J|0)==4)e=c[l>>2]|0;if((e|0)>0){o=0;do{a=o;o=o+1|0;g=k+(a*80048|0)+16|0;n=k+(a*80048|0)|0;if((o|0)<(e|0)){j=+h[k+(a*80048|0)+8>>3];f=o;do{M=j-+h[k+(f*80048|0)+8>>3];m=+h[g>>3]-+h[k+(f*80048|0)+16>>3];m=M*M+m*m;e=c[n>>2]|0;a=k+(f*80048|0)|0;b=c[a>>2]|0;if((e|0)>(b|0)){if(m<+((e|0)/4|0|0))c[a>>2]=0}else if(m<+((b|0)/4|0|0))c[n>>2]=0;f=f+1|0;e=c[l>>2]|0}while((f|0)<(e|0))}}while((o|0)<(e|0))}if((e|0)>0){f=0;do{if(!(c[k+(f*80048|0)>>2]|0)){a=f+1|0;if((a|0)<(e|0)){e=f;b=a;while(1){ik(k+(e*80048|0)|0,k+(b*80048|0)|0,80048)|0;e=c[l>>2]|0;a=b+1|0;if((a|0)<(e|0)){e=b;b=a}else break}}e=e+-1|0;c[l>>2]=e}f=f+1|0}while((f|0)<(e|0))}if(K&(e|0)>0){b=0;while(1){c[k>>2]=c[k>>2]<<2;e=k+8|0;h[e>>3]=+h[e>>3]*2.0;e=k+16|0;h[e>>3]=+h[e>>3]*2.0;e=k+24|0;if((c[e>>2]|0)>0){a=0;do{K=k+28+(a<<2)|0;c[K>>2]=c[K>>2]<<1;K=k+40028+(a<<2)|0;c[K>>2]=c[K>>2]<<1;a=a+1|0}while((a|0)<(c[e>>2]|0))}b=b+1|0;if((b|0)>=(c[l>>2]|0))break;else k=k+80048|0}}i=L;return 0}function ge(a,d,e,f,g,h,j){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;w=i;i=i+80032|0;p=w+16|0;o=w+8|0;l=w;u=w+40024|0;v=w+24|0;t=c[h+8>>2]|0;e=c[h>>2]|0;h=c[h+4>>2]|0;a:do if((e|0)<=(h|0)){k=e;e=a+(($(t,d)|0)+e<<1)|0;while(1){s=b[e>>1]|0;if(s<<16>>16>0?(c[f+((s<<16>>16)+-1<<2)>>2]|0)==(g|0):0){n=k;break}if((k|0)<(h|0)){k=k+1|0;e=e+2|0}else{x=6;break a}}q=j+24|0;c[q>>2]=1;r=j+28|0;c[r>>2]=n;s=j+40028|0;c[s>>2]=t;f=t;m=n;k=1;e=5;while(1){h=(e+5|0)%8|0;e=0;while(1){g=c[776+(h<<2)>>2]|0;l=c[808+(h<<2)>>2]|0;if((b[a+(l+m+($(g+f|0,d)|0)<<1)>>1]|0)>0){e=g;g=h;break}e=e+1|0;h=(h+1|0)%8|0;if((e|0)>=8){x=11;break}}if((x|0)==11){x=0;if((e|0)==8){x=13;break}l=c[808+(h<<2)>>2]|0;e=c[776+(h<<2)>>2]|0;g=h}c[j+28+(k<<2)>>2]=l+m;h=c[q>>2]|0;c[j+40028+(h<<2)>>2]=e+(c[j+40028+(h+-1<<2)>>2]|0);e=c[q>>2]|0;h=j+28+(e<<2)|0;if((c[h>>2]|0)==(n|0)?(c[j+40028+(e<<2)>>2]|0)==(t|0):0){f=e;x=16;break}k=e+1|0;c[q>>2]=k;if((k|0)==9999){x=19;break}f=c[j+40028+(e<<2)>>2]|0;m=c[h>>2]|0;e=g}if((x|0)==13){Me(3,4347,o);e=-1;break}else if((x|0)==16){if((f|0)>1){l=0;g=1;h=0;while(1){e=(c[j+28+(g<<2)>>2]|0)-n|0;e=$(e,e)|0;k=(c[j+40028+(g<<2)>>2]|0)-t|0;e=($(k,k)|0)+e|0;k=(e|0)>(l|0);h=k?g:h;g=g+1|0;if((g|0)>=(f|0))break;else l=k?e:l}}else h=0;if((h|0)>0){e=0;do{c[u+(e<<2)>>2]=c[j+28+(e<<2)>>2];c[v+(e<<2)>>2]=c[j+40028+(e<<2)>>2];e=e+1|0}while((e|0)<(h|0))}if((h|0)<(f|0)){e=h;do{t=e-h|0;c[j+28+(t<<2)>>2]=c[j+28+(e<<2)>>2];c[j+40028+(t<<2)>>2]=c[j+40028+(e<<2)>>2];e=e+1|0}while((e|0)<(c[q>>2]|0))}if((h|0)>0){e=0;do{t=e-h|0;c[j+28+((c[q>>2]|0)+t<<2)>>2]=c[u+(e<<2)>>2];c[j+40028+((c[q>>2]|0)+t<<2)>>2]=c[v+(e<<2)>>2];e=e+1|0}while((e|0)<(h|0))}c[j+28+(c[q>>2]<<2)>>2]=c[r>>2];c[j+40028+(c[q>>2]<<2)>>2]=c[s>>2];c[q>>2]=(c[q>>2]|0)+1;e=0;break}else if((x|0)==19){Me(3,4354,p);e=-1;break}}else x=6;while(0);if((x|0)==6){Me(3,4340,l);e=-1}i=w;return e|0}function he(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;var i=0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0.0;i=c[b+(e<<2)>>2]|0;q=c[b+(d<<2)>>2]|0;o=+(i-q|0);l=c[a+(d<<2)>>2]|0;r=c[a+(e<<2)>>2]|0;m=+(l-r|0);k=+(($(r,q)|0)-($(l,i)|0)|0);i=d+1|0;if((i|0)<(e|0)){j=0.0;l=i;do{s=k+(o*+(c[a+(l<<2)>>2]|0)+m*+(c[b+(l<<2)>>2]|0));s=s*s;r=s>j;j=r?s:j;i=r?l:i;l=l+1|0}while((l|0)<(e|0))}else j=0.0;if(j/(o*o+m*m)>f)if(((he(a,b,d,i,f,g,h)|0)>=0?(n=c[h>>2]|0,(n|0)<=5):0)?(c[g+(n<<2)>>2]=i,c[h>>2]=(c[h>>2]|0)+1,(he(a,b,i,e,f,g,h)|0)>=0):0)p=7;else i=-1;else p=7;if((p|0)==7)i=0;return i|0}function ie(a,b,d,e,f,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;k=k|0;var l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;y=i;i=i+16|0;t=y+4|0;u=y;v=nf(2)|0;w=nf(2)|0;x=Re(2,2)|0;q=0;a:while(1){r=q;q=q+1|0;s=c[e+(q<<2)>>2]|0;l=c[e+(r<<2)>>2]|0;p=+(s+1-l|0)*.05+.5;l=~~(+(l|0)+p);s=~~(+(s|0)-p)-l|0;n=s+1|0;d=Re(n,2)|0;if((s|0)>-1){s=0;do{z=s+l|0;if((mf(f,+(c[a+(z<<2)>>2]|0),+(c[b+(z<<2)>>2]|0),t,u)|0)<0){l=10;break a}z=s<<1;A=c[d>>2]|0;h[A+(z<<3)>>3]=+g[t>>2];h[A+((z|1)<<3)>>3]=+g[u>>2];s=s+1|0}while((s|0)<(n|0))}if((Ye(d,x,v,w)|0)<0){l=10;break}A=c[x>>2]|0;o=+h[A+8>>3];h[j+(r*24|0)>>3]=o;p=-+h[A>>3];h[j+(r*24|0)+8>>3]=p;A=c[w>>2]|0;h[j+(r*24|0)+16>>3]=-(o*+h[A>>3]+ +h[A+8>>3]*p);We(d)|0;if((q|0)>=4){l=7;break}}b:do if((l|0)==7){We(x)|0;of(w)|0;of(v)|0;q=0;while(1){d=(q+3|0)%4|0;l=j+(d*24|0)|0;m=+h[j+(q*24|0)+8>>3];n=j+(q*24|0)|0;o=+h[j+(d*24|0)+8>>3];p=+h[l>>3]*m-+h[n>>3]*o;if(+O(+p)<.0001){d=-1;break b}A=j+(q*24|0)+16|0;z=j+(d*24|0)+16|0;h[k+(q<<4)>>3]=(o*+h[A>>3]-m*+h[z>>3])/p;h[k+(q<<4)+8>>3]=(+h[n>>3]*+h[z>>3]-+h[l>>3]*+h[A>>3])/p;q=q+1|0;if((q|0)>=4){d=0;break}}}else if((l|0)==10){We(d)|0;We(x)|0;of(w)|0;of(v)|0;d=-1}while(0);i=y;return d|0}function je(a,b,d,e,f,j,k,l,m,n,o,p,q,r){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=+o;p=p|0;q=q|0;r=r|0;var s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;D=F+4|0;E=F;z=m>>>0<2;A=(m|0)==2;if((j|0)>0){C=0;s=0;do{c[p+(s<<8)>>2]=c[f+(C*80048|0)>>2];if((mf(n,+h[f+(C*80048|0)+8>>3],+h[f+(C*80048|0)+16>>3],D,E)|0)>=0?(h[p+(s<<8)+56>>3]=+g[D>>2],h[p+(s<<8)+64>>3]=+g[E>>2],B=p+(s<<8)+168|0,(ie(f+(C*80048|0)+28|0,f+(C*80048|0)+40028|0,c[f+(C*80048|0)+24>>2]|0,f+(C*80048|0)+80028|0,n,p+(s<<8)+72|0,B)|0)>=0):0){t=p+(s<<8)+8|0;u=p+(s<<8)+20|0;v=p+(s<<8)+40|0;w=p+(s<<8)+12|0;x=p+(s<<8)+24|0;y=p+(s<<8)+48|0;switch(De(k,l,m,a,b,d,e,n,B,o,t,u,v,w,x,y,r,p+(s<<8)+240|0,p+(s<<8)+248|0)|0){case 0:{c[p+(s<<8)+236>>2]=0;break}case-1:{c[p+(s<<8)+236>>2]=2;break}case-2:{c[p+(s<<8)+236>>2]=3;break}case-3:{c[p+(s<<8)+236>>2]=4;break}case-4:{c[p+(s<<8)+236>>2]=5;break}case-5:{c[p+(s<<8)+236>>2]=9;break}case-6:{c[p+(s<<8)+236>>2]=1;break}default:{}}if(!z){if(A){c[p+(s<<8)+4>>2]=c[w>>2];c[p+(s<<8)+16>>2]=c[x>>2];h[p+(s<<8)+32>>3]=+h[y>>3]}}else{c[p+(s<<8)+4>>2]=c[t>>2];c[p+(s<<8)+16>>2]=c[u>>2];h[p+(s<<8)+32>>3]=+h[v>>3]}s=s+1|0}C=C+1|0}while((C|0)<(j|0))}else s=0;c[q>>2]=s;i=F;return 0}function ke(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0;k=i;i=i+288|0;m=k+200|0;l=k+104|0;f=k+264|0;j=k+8|0;g=k;o=c[b+16>>2]|0;p=(4-o|0)%4|0;h[m>>3]=+h[b+168+(p<<4)>>3];h[m+8>>3]=+h[b+168+(p<<4)+8>>3];p=(5-o|0)%4|0;h[m+16>>3]=+h[b+168+(p<<4)>>3];h[m+24>>3]=+h[b+168+(p<<4)+8>>3];p=(6-o|0)%4|0;h[m+32>>3]=+h[b+168+(p<<4)>>3];h[m+40>>3]=+h[b+168+(p<<4)+8>>3];o=(7-o|0)%4|0;h[m+48>>3]=+h[b+168+(o<<4)>>3];h[m+56>>3]=+h[b+168+(o<<4)+8>>3];n=d*-.5;h[l>>3]=n;d=d*.5;h[l+8>>3]=d;h[l+16>>3]=0.0;h[l+24>>3]=d;h[l+32>>3]=d;h[l+40>>3]=0.0;h[l+48>>3]=d;h[l+56>>3]=n;h[l+64>>3]=0.0;h[l+72>>3]=n;h[l+80>>3]=n;h[l+88>>3]=0.0;c[f>>2]=m;c[f+4>>2]=l;c[f+8>>2]=4;if((Ef(c[a>>2]|0,m,l,4,j)|0)<0)d=1.0e8;else{p=(zf(c[a>>2]|0,f,j,e,g)|0)<0;d=p?1.0e8:+h[g>>3]}i=k;return+d}function le(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0;j=i;i=i+192|0;m=j+104|0;l=j+8|0;k=j+168|0;g=j;o=c[b+16>>2]|0;p=(4-o|0)%4|0;h[m>>3]=+h[b+168+(p<<4)>>3];h[m+8>>3]=+h[b+168+(p<<4)+8>>3];p=(5-o|0)%4|0;h[m+16>>3]=+h[b+168+(p<<4)>>3];h[m+24>>3]=+h[b+168+(p<<4)+8>>3];p=(6-o|0)%4|0;h[m+32>>3]=+h[b+168+(p<<4)>>3];h[m+40>>3]=+h[b+168+(p<<4)+8>>3];o=(7-o|0)%4|0;h[m+48>>3]=+h[b+168+(o<<4)>>3];h[m+56>>3]=+h[b+168+(o<<4)+8>>3];n=e*-.5;h[l>>3]=n;e=e*.5;h[l+8>>3]=e;h[l+16>>3]=0.0;h[l+24>>3]=e;h[l+32>>3]=e;h[l+40>>3]=0.0;h[l+48>>3]=e;h[l+56>>3]=n;h[l+64>>3]=0.0;h[l+72>>3]=n;h[l+80>>3]=n;h[l+88>>3]=0.0;c[k>>2]=m;c[k+4>>2]=l;c[k+8>>2]=4;b=(zf(c[a>>2]|0,k,d,f,g)|0)<0;i=j;return+(b?1.0e8:+h[g>>3])}function me(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;m=p+20|0;n=p;j=Uj(f<<4)|0;c[m>>2]=j;if(!j){Me(3,5472,p+8|0);rb(1)}k=Uj(f*24|0)|0;l=m+4|0;c[l>>2]=k;if(!k){Me(3,5472,p+16|0);rb(1)}if((f|0)>0){o=0;do{h[j+(o<<4)>>3]=+h[d+(o<<4)>>3];h[j+(o<<4)+8>>3]=+h[d+(o<<4)+8>>3];h[k+(o*24|0)>>3]=+h[e+(o*24|0)>>3];h[k+(o*24|0)+8>>3]=+h[e+(o*24|0)+8>>3];h[k+(o*24|0)+16>>3]=+h[e+(o*24|0)+16>>3];o=o+1|0}while((o|0)<(f|0))}c[m+8>>2]=f;if((zf(c[a>>2]|0,m,b,g,n)|0)<0)h[n>>3]=1.0e8;Vj(c[m>>2]|0);Vj(c[l>>2]|0);i=p;return+ +h[n>>3]}function ne(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;m=p+20|0;n=p;j=Uj(f<<4)|0;c[m>>2]=j;if(!j){Me(3,5472,p+8|0);rb(1)}k=Uj(f*24|0)|0;l=m+4|0;c[l>>2]=k;if(!k){Me(3,5472,p+16|0);rb(1)}if((f|0)>0){o=0;do{h[j+(o<<4)>>3]=+h[d+(o<<4)>>3];h[j+(o<<4)+8>>3]=+h[d+(o<<4)+8>>3];h[k+(o*24|0)>>3]=+h[e+(o*24|0)>>3];h[k+(o*24|0)+8>>3]=+h[e+(o*24|0)+8>>3];h[k+(o*24|0)+16>>3]=+h[e+(o*24|0)+16>>3];o=o+1|0}while((o|0)<(f|0))}c[m+8>>2]=f;if((Bf(c[a>>2]|0,m,b,g,n)|0)<0)h[n>>3]=1.0e8;Vj(c[m>>2]|0);Vj(c[l>>2]|0);i=p;return+ +h[n>>3]}function oe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=Uj(2080)|0;a:do if(f){c[f+2068>>2]=d;b:do if(!e){switch(d|0){case 5:case 12:case 13:case 14:break;default:{g=4;break b}}c[f+2076>>2]=0}else g=4;while(0);do if((g|0)==4){g=Uj($(b,a)|0)|0;c[f>>2]=g;if(!g){Vj(f);f=0;break a}else{c[f+2076>>2]=1;break}}while(0);c[f+2072>>2]=e;c[f+4>>2]=0;c[f+8>>2]=a;c[f+12>>2]=b}while(0);return f|0}function pe(a){a=a|0;if(a){if(c[a+2076>>2]|0)Vj(c[a>>2]|0);Vj(c[a+4>>2]|0);Vj(a)}return}function qe(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;k=i;i=i+16|0;g=k;f=c[b+2068>>2]|0;a:do switch(f|0){case 5:case 12:case 13:case 14:if(!(c[b+2072>>2]|0)){c[b>>2]=e;f=0;break a}else{ik(c[b>>2]|0,e|0,$(c[b+12>>2]|0,c[b+8>>2]|0)|0)|0;f=0;break a}default:{if((f&-2|0)==2){f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=(((d[e+(j|1)>>0]|0)+(d[e+j>>0]|0)+(d[e+(j|2)>>0]|0)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break a}else j=j+4|0}}if((f&-3|0)==4){f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=(((d[e+(j|2)>>0]|0)+(d[e+(j|1)>>0]|0)+(d[e+(j|3)>>0]|0)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break a}else j=j+4|0}}if(f>>>0<2){f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=(((d[e+(j+1)>>0]|0)+(d[e+j>>0]|0)+(d[e+(j+2)>>0]|0)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break a}else j=j+3|0}}switch(f|0){case 8:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=a[e+j>>0]|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 7:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=a[e+(j|1)>>0]|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 9:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){m=d[e+j>>0]|0;l=d[e+(j|1)>>0]|0;a[(c[b>>2]|0)+h>>0]=(((m&248)+10+(m<<5&224)+(l>>>3&28)+(l<<3&248)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 10:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){l=d[e+j>>0]|0;m=d[e+(j|1)>>0]|0;a[(c[b>>2]|0)+h>>0]=(((l&248)+12+(l<<5&224)+(m>>>3&24)+(m<<2&248)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 11:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){m=d[e+j>>0]|0;a[(c[b>>2]|0)+h>>0]=(((m&240)+24+(m<<4&240)+((d[e+(j|1)>>0]|0)&240)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}default:{Me(3,4361,g);f=-1;break a}}}}while(0);i=k;return f|0}function re(a,b){a=a|0;b=b|0;var e=0,f=0;if((a|0)!=0&(b|0)!=0?(qe(a,b)|0)>=0:0){ek(a+16|0,0,1024)|0;b=c[a>>2]|0;f=$(c[a+12>>2]|0,c[a+8>>2]|0)|0;e=b+f|0;if((f|0)>0){do{f=a+16+((d[b>>0]|0)<<2)|0;c[f>>2]=(c[f>>2]|0)+1;b=b+1|0}while(b>>>0<e>>>0);b=0}else b=0}else b=-1;return b|0}function se(a,b){a=a|0;b=b|0;var d=0;b=re(a,b)|0;if((b|0)>=0){b=0;d=0;do{b=(c[a+16+(d<<2)>>2]|0)+b|0;c[a+1040+(d<<2)>>2]=b;d=d+1|0}while((d|0)!=256);b=0}return b|0}function te(b,d,e,f){b=b|0;d=d|0;e=+e;f=f|0;var g=0,h=0,i=0;if(!(e<0.0|e>1.0)){d=se(b,d)|0;if((d|0)>=0){i=~~(+($(c[b+12>>2]|0,c[b+8>>2]|0)|0)*e)>>>0;d=0;while(1){h=d&255;g=c[b+1040+(h<<2)>>2]|0;if(g>>>0<i>>>0)d=d+1<<24>>24;else break}if((g|0)==(i|0))do d=d+1<<24>>24;while((c[b+1040+((d&255)<<2)>>2]|0)==(i|0));a[f>>0]=((d&255)+h|0)>>>1;d=0}}else d=-1;return d|0}function ue(a,b,c){a=a|0;b=b|0;c=c|0;return te(a,b,.5,c)|0}function ve(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0.0,n=0.0;d=re(b,d)|0;if((d|0)>=0){d=1;f=0.0;do{f=f+ +(($(c[b+16+(d<<2)>>2]|0,d)|0)>>>0);d=d+1|0}while((d|0)!=256);k=+($(c[b+12>>2]|0,c[b+8>>2]|0)|0);l=0;h=0.0;d=0;j=0.0;m=0.0;while(1){g=c[b+16+(l<<2)>>2]|0;m=m+ +(g>>>0);if(m!=0.0){i=k-m;if(i==0.0)break;h=h+ +(($(l,g)|0)>>>0);n=h/m-(f-h)/i;i=n*(m*i*n);if(i>j)d=l&255;else i=j}else i=j;if((l&255)<<24>>24==-1)break;else{l=l+1|0;j=i}}a[e>>0]=d;d=0}return d|0}function we(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=re(b,e)|0;do if((e|0)>=0){t=b+4|0;if(!(c[t>>2]|0)){e=b+8|0;h=b+12|0;s=Uj($(c[h>>2]|0,c[e>>2]|0)|0)|0;c[t>>2]=s;if(!s){e=-1;break}else s=e}else{s=b+8|0;h=b+12|0}q=f>>1;r=0-q|0;e=c[h>>2]|0;if((e|0)>0){n=(q|0)<(r|0);o=(q|0)<(r|0);p=0;do{e=c[s>>2]|0;if((e|0)>0){m=0;do{if(n){i=0;f=0}else{i=0;l=r;f=0;while(1){j=l+p|0;if(((j|0)>=0?(j|0)<(c[h>>2]|0):0)?(u=$(e,j)|0,!o):0){k=r;while(1){j=k+m|0;if((j|0)>-1&(j|0)<(e|0)){i=i+1|0;f=(d[(c[b>>2]|0)+(u+j)>>0]|0)+f|0}if((k|0)<(q|0))k=k+1|0;else break}}if((l|0)<(q|0))l=l+1|0;else break}}l=($(e,p)|0)+m|0;a[(c[t>>2]|0)+l>>0]=(f|0)/(i|0)|0;m=m+1|0;e=c[s>>2]|0}while((m|0)<(e|0))}p=p+1|0;e=c[h>>2]|0}while((p|0)<(e|0))}if((g|0)!=0?($(e,c[s>>2]|0)|0)>0:0){e=0;do{b=(c[t>>2]|0)+e|0;a[b>>0]=(d[b>>0]|0)+g;e=e+1|0}while((e|0)<($(c[h>>2]|0,c[s>>2]|0)|0));e=0}else e=0}while(0);return e|0}function xe(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0;a:do switch(e|0){case 0:{switch(f|0){case 1:{if(j){k=Fc(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=wc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=yc(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Bc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Cc(a,b,c,g,i)|0;break a}case 8:{k=Ec(a,b,c,g,i)|0;break a}case 7:{k=Dc(a,b,c,g,i)|0;break a}case 9:{k=xc(a,b,c,g,i)|0;break a}case 10:{k=Ac(a,b,c,g,i)|0;break a}case 11:{k=zc(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=nc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=pc(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=sc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=tc(a,b,c,g,i)|0;break a}case 8:{k=vc(a,b,c,g,i)|0;break a}case 7:{k=uc(a,b,c,g,i)|0;break a}case 9:{k=oc(a,b,c,g,i)|0;break a}case 10:{k=rc(a,b,c,g,i)|0;break a}case 11:{k=qc(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}case 0:{if(j){k=Yc(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=Pc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=Rc(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Uc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Vc(a,b,c,g,i)|0;break a}case 8:{k=Xc(a,b,c,g,i)|0;break a}case 7:{k=Wc(a,b,c,g,i)|0;break a}case 9:{k=Qc(a,b,c,g,i)|0;break a}case 10:{k=Tc(a,b,c,g,i)|0;break a}case 11:{k=Sc(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=Gc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=Ic(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Lc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Mc(a,b,c,g,i)|0;break a}case 8:{k=Oc(a,b,c,g,i)|0;break a}case 7:{k=Nc(a,b,c,g,i)|0;break a}case 9:{k=Hc(a,b,c,g,i)|0;break a}case 10:{k=Kc(a,b,c,g,i)|0;break a}case 11:{k=Jc(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}default:rb(0)}break}case 1:{switch(f|0){case 1:{if(j){k=pd(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=gd(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=id(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=ld(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=md(a,b,c,g,i)|0;break a}case 8:{k=od(a,b,c,g,i)|0;break a}case 7:{k=nd(a,b,c,g,i)|0;break a}case 9:{k=hd(a,b,c,g,i)|0;break a}case 10:{k=kd(a,b,c,g,i)|0;break a}case 11:{k=jd(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=Zc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=$c(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=cd(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=dd(a,b,c,g,i)|0;break a}case 8:{k=fd(a,b,c,g,i)|0;break a}case 7:{k=ed(a,b,c,g,i)|0;break a}case 9:{k=_c(a,b,c,g,i)|0;break a}case 10:{k=bd(a,b,c,g,i)|0;break a}case 11:{k=ad(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}case 0:{if(j){k=Id(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=zd(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=Bd(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Ed(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Fd(a,b,c,g,i)|0;break a}case 8:{k=Hd(a,b,c,g,i)|0;break a}case 7:{k=Gd(a,b,c,g,i)|0;break a}case 9:{k=Ad(a,b,c,g,i)|0;break a}case 10:{k=Dd(a,b,c,g,i)|0;break a}case 11:{k=Cd(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=qd(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=sd(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=vd(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=wd(a,b,c,g,i)|0;break a}case 8:{k=yd(a,b,c,g,i)|0;break a}case 7:{k=xd(a,b,c,g,i)|0;break a}case 9:{k=rd(a,b,c,g,i)|0;break a}case 10:{k=ud(a,b,c,g,i)|0;break a}case 11:{k=td(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}default:rb(0)}break}default:rb(0)}while(0);return k|0}function ye(a,b){a=a|0;b=b|0;var d=0;if((a|0)!=0?(d=a+7062384|0,(c[d>>2]|0)==0):0){c[d>>2]=b;d=0}else d=-1;return d|0}function ze(a){a=a|0;var b=0;if((a|0)!=0?(b=a+7062384|0,(c[b>>2]|0)!=0):0){c[b>>2]=0;b=0}else b=-1;return b|0}function Ae(){return Be(16,50)|0}function Be(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+64|0;q=r+56|0;p=r+48|0;j=r+40|0;h=r+32|0;g=r+24|0;f=r+16|0;e=r+8|0;d=r;a:do if(!((a+-16|0)>>>0>48|(b|0)<1)){n=Uj(32)|0;if(!n){Me(3,5472,d);rb(1)}c[n>>2]=0;c[n+4>>2]=b;c[n+28>>2]=a;m=Uj(b<<2)|0;c[n+8>>2]=m;if(!m){Me(3,5472,e);rb(1)}d=b<<4;l=Uj(d)|0;c[n+12>>2]=l;if(!l){Me(3,5472,f);rb(1)}f=Uj(d)|0;k=n+20|0;c[k>>2]=f;if(!f){Me(3,5472,g);rb(1)}d=b<<5;g=Uj(d)|0;c[n+16>>2]=g;if(!g){Me(3,5472,h);rb(1)}h=Uj(d)|0;c[n+24>>2]=h;if(!h){Me(3,5472,j);rb(1)}e=$(a,a)|0;d=e*12|0;e=e<<2;if((b|0)>0){a=0;b:while(1){c[m+(a<<2)>>2]=0;f=a<<2;h=0;while(1){if((h|0)>=4)break;j=Uj(d)|0;g=h+f|0;c[l+(g<<2)>>2]=j;if(!j){d=18;break b}j=Uj(e)|0;c[(c[k>>2]|0)+(g<<2)>>2]=j;if(!j){d=20;break b}else h=h+1|0}a=a+1|0;if((a|0)>=(b|0)){o=n;break a}}if((d|0)==18){Me(3,5472,p);rb(1)}else if((d|0)==20){Me(3,5472,q);rb(1)}}else o=n}else o=0;while(0);i=r;return o|0}function Ce(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;if(!a)b=-1;else{b=a+4|0;d=a+8|0;e=a+12|0;f=a+20|0;if((c[b>>2]|0)>0){g=0;do{if(c[(c[d>>2]|0)+(g<<2)>>2]|0)Le(a,g)|0;h=g<<2;Vj(c[(c[e>>2]|0)+(h<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(h<<2)>>2]|0);i=1+h|0;Vj(c[(c[e>>2]|0)+(i<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(i<<2)>>2]|0);i=2+h|0;Vj(c[(c[e>>2]|0)+(i<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(i<<2)>>2]|0);h=3+h|0;Vj(c[(c[e>>2]|0)+(h<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(h<<2)>>2]|0);g=g+1|0}while((g|0)<(c[b>>2]|0))}Vj(a);b=0}return b|0}function De(b,e,f,g,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=+o;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;var y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=i;i=i+12448|0;A=L+12440|0;z=L+8|0;J=L;I=L+12312|0;K=L+24|0;do if((f+-2|0)>>>0<3){if((v|0)!=2830){y=v&255;if((Ee(e,2,y,y*3|0,g,j,k,l,m,n,o,K)|0)<0){c[s>>2]=-1;y=-6;break}y=Fe(K,y,s,t,u,v,w)|0;if(!x)break;c[x>>2]=0;c[x+4>>2]=0;break}if((Ee(e,2,14,42,g,j,k,l,m,n,.875,K)|0)<0){c[s>>2]=-1;y=-6;break}c[z>>2]=0;c[z+4>>2]=182;c[z+8>>2]=195;c[z+12>>2]=13;v=a[K+(c[z>>2]|0)>>0]|0;y=(v&255)>0?v:0;v=(v&255)<255?v:-1;H=a[K+(c[z+4>>2]|0)>>0]|0;y=(H&255)>(y&255)?H:y;v=(H&255)<(v&255)?H:v;H=a[K+(c[z+8>>2]|0)>>0]|0;y=(H&255)>(y&255)?H:y;v=(H&255)<(v&255)?H:v;H=a[K+(c[z+12>>2]|0)>>0]|0;y=((H&255)>(y&255)?H:y)&255;v=((H&255)<(v&255)?H:v)&255;a:do if((y-v|0)>=30){H=(y+v|0)>>>1;a[A>>0]=(d[K+(c[z>>2]|0)>>0]|0)>>>0<H>>>0&1;a[A+1>>0]=(d[K+(c[z+4>>2]|0)>>0]|0)>>>0<H>>>0&1;a[A+2>>0]=(d[K+(c[z+8>>2]|0)>>0]|0)>>>0<H>>>0&1;a[A+3>>0]=(d[K+(c[z+12>>2]|0)>>0]|0)>>>0<H>>>0&1;v=0;while(1){y=v+1|0;if(((a[A+v>>0]|0)==1?(a[A+((y|0)%4|0)>>0]|0)==1:0)?(a[A+((v+2|0)%4|0)>>0]|0)==0:0){G=v;break}if((y|0)<4)v=y;else{G=y;break}}switch(G|0){case 4:{c[t>>2]=0;h[u>>3]=-1.0;y=-3;v=0;z=0;break a}case 0:{z=119;y=255;v=0;do{D=v+-3|0;B=(v&-2|0)==12;C=v*14|0;A=0;do{if(((A+-3|D)>>>0>=8?(F=A&-2,(A|v)>>>0>=2):0)?!(B&((F|0)==0|(F|0)==12)):0){E=(d[K+(A+C)>>0]|0)-H|0;a[I+z>>0]=E>>>31;E=(E|0)>-1?E:0-E|0;z=z+-1|0;y=(E|0)<(y|0)?E:y}A=A+1|0}while((A|0)!=14);v=v+1|0}while((v|0)!=14);break}case 1:{z=119;y=255;v=0;do{D=v+-3|0;C=v&-2;B=(C|0)==0;C=(C|0)==12;A=13;while(1){if(((A+-3|D)>>>0>=8?(E=(A&-2|0)==12,!(B&E)):0)?!(C&(A>>>0<2|E)):0){F=(d[K+((A*14|0)+v)>>0]|0)-H|0;a[I+z>>0]=F>>>31;F=(F|0)>-1?F:0-F|0;z=z+-1|0;y=(F|0)<(y|0)?F:y}if((A|0)>0)A=A+-1|0;else break}v=v+1|0}while((v|0)!=14);break}case 2:{v=119;y=255;D=13;while(1){B=D+-3|0;C=D>>>0<2|(D&-2|0)==12;A=D*14|0;z=13;while(1){if((z+-3|B)>>>0>=8?!((z|D)>>>0<2|C&(z&-2|0)==12):0){F=(d[K+(z+A)>>0]|0)-H|0;
a[I+v>>0]=F>>>31;F=(F|0)>-1?F:0-F|0;v=v+-1|0;y=(F|0)<(y|0)?F:y}if((z|0)>0)z=z+-1|0;else break}if((D|0)>0)D=D+-1|0;else break}break}case 3:{v=119;y=255;D=13;while(1){C=D+-3|0;B=D&-2;A=(B|0)==12;B=(B|0)==0;z=0;do{if(((z+-3|C)>>>0>=8?!(A&z>>>0<2|(z|D)>>>0<2):0)?!(B&(z&-2|0)==12):0){F=(d[K+((z*14|0)+D)>>0]|0)-H|0;a[I+v>>0]=F>>>31;F=(F|0)>-1?F:0-F|0;v=v+-1|0;y=(F|0)<(y|0)?F:y}z=z+1|0}while((z|0)!=14);if((D|0)>0)D=D+-1|0;else break}break}default:y=255}c[t>>2]=G;h[u>>3]=(y|0)>30?1.0:+(y|0)/30.0;y=Ie(2830,0,0,I,J)|0;if((y|0)<0){y=-4;v=0;z=0}else{if(w)c[w>>2]=y;z=J;y=0;v=c[z>>2]|0;z=c[z+4>>2]|0}}else{c[t>>2]=0;h[u>>3]=-1.0;y=-2;v=0;z=0}while(0);if((y|0)<0){c[s>>2]=-1;break}if((v|0)==-1&(z|0)==-1){c[s>>2]=-1;y=-5;break}c[s>>2]=(v&-32768|0)==0&0==0?v&32767:0;if(!x)y=0;else{y=x;c[y>>2]=v;c[y+4>>2]=z;y=0}}else y=1;while(0);b:do switch(f|0){case 0:case 1:case 3:case 4:{if(!b){c[p>>2]=-1;v=-1;break b}v=b+28|0;z=c[v>>2]|0;A=z<<2;switch(f|0){case 0:case 3:if((Ee(e,0,z,A,g,j,k,l,m,n,o,K)|0)<0){c[p>>2]=-1;v=-6;break b}else{v=Ge(b,0,K,c[v>>2]|0,p,q,r)|0;break b}default:if((Ee(e,1,z,A,g,j,k,l,m,n,o,K)|0)<0){c[p>>2]=-1;v=-6;break b}else{v=Ge(b,1,K,c[v>>2]|0,p,q,r)|0;break b}}}default:v=1}while(0);if((y|0)!=1){if((v|0)!=1)y=(v&y|0)<0?v:0}else y=v;i=L;return y|0}function _j(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+16|0;b=k+8|0;h=k+4|0;d=k;c[h>>2]=a;do if(a>>>0>=212){g=(a>>>0)/210|0;e=g*210|0;c[d>>2]=a-e;b=($j(3712,3904,d,b)|0)-3712>>2;f=b;b=(c[3712+(b<<2)>>2]|0)+e|0;a:while(1){e=5;while(1){if(e>>>0>=47){e=211;j=8;break}d=c[3520+(e<<2)>>2]|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=106;break a}if((b|0)==($(a,d)|0))break;else e=e+1|0}b:do if((j|0)==8)while(1){j=0;d=(b>>>0)/(e>>>0)|0;if(d>>>0<e>>>0){j=105;break a}if((b|0)==($(d,e)|0))break b;d=e+10|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+12|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+16|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+18|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+22|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+28|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+30|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+36|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+40|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+42|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+46|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+52|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+58|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+60|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+66|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+70|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+72|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+78|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+82|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+88|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+96|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+100|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+102|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+106|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+108|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+112|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+120|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+126|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+130|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+136|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+138|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+142|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+148|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+150|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+156|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+162|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+166|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+168|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+172|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+178|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+180|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+186|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+190|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+192|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+196|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+198|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+208|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break;else{e=e+210|0;j=8}}while(0);e=f+1|0;b=(e|0)==48;e=b?0:e;b=(b&1)+g|0;f=e;g=b;b=(c[3712+(e<<2)>>2]|0)+(b*210|0)|0}if((j|0)==105){c[h>>2]=b;break}else if((j|0)==106){c[h>>2]=b;break}}else b=c[($j(3520,3712,h,b)|0)>>2]|0;while(0);i=k;return b|0}function $j(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[d>>2]|0;e=a;d=b-a>>2;a:while(1){while(1){if(!d)break a;a=(d|0)/2|0;if((c[e+(a<<2)>>2]|0)>>>0<f>>>0)break;else d=a}e=e+(a+1<<2)|0;d=d+-1-a|0}return e|0}function ak(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;if(e>>>0>4294967279)oi(b);if(e>>>0<11){a[b>>0]=e<<1;b=b+1|0}else{g=e+16&-16;f=Kh(g)|0;c[b+8>>2]=f;c[b>>2]=g|1;c[b+4>>2]=e;b=f}ik(b|0,d|0,e|0)|0;a[b+e>>0]=0;return}function bk(b){b=b|0;if(a[b>>0]&1)Lh(c[b+8>>2]|0);return}function ck(){}function dk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return(D=d,a-c>>>0|0)|0}function ek(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;h=b&3;i=d|d<<8|d<<16|d<<24;g=f&~3;if(h){h=b+4-h|0;while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return b-e|0}function fk(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}D=a<<c-32;return 0}function gk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return(D=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function hk(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=0;return b>>>c-32|0}function ik(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return Xa(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function jk(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=(b|0)<0?-1:0;return b>>c-32|0}function kk(b){b=b|0;var c=0;c=a[m+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return(a[m+(b>>>24)>>0]|0)+24|0}function lk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=$(e,f)|0;d=a>>>16;a=(c>>>16)+($(e,d)|0)|0;e=b>>>16;b=$(e,f)|0;return(D=(a>>>16)+($(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function mk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=dk(j^a,i^b,j,i)|0;g=D;a=f^j;b=e^i;return dk((rk(h,g,dk(f^c,e^d,f,e)|0,D,0)|0)^a,D^b,a,b)|0}function nk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;j=f|0;h=b>>31|((b|0)<0?-1:0)<<1;g=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;l=e>>31|((e|0)<0?-1:0)<<1;k=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=dk(h^a,g^b,h,g)|0;b=D;rk(a,b,dk(l^d,k^e,l,k)|0,D,j)|0;e=dk(c[j>>2]^h,c[j+4>>2]^g,h,g)|0;d=D;i=f;return(D=d,e)|0}function ok(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=lk(e,f)|0;a=D;return(D=($(b,f)|0)+($(d,e)|0)+a|a&0,c|0|0)|0}function pk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return rk(a,b,c,d,0)|0}function qk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=i;i=i+16|0;f=g|0;rk(a,b,d,e,f)|0;i=g;return(D=c[f+4>>2]|0,c[f>>2]|0)|0}function rk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return(D=n,f)|0}else{if(!g){n=0;f=0;return(D=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return(D=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(ba(i|0)|0)-(ba(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!f){n=0;f=0;return(D=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return(D=n,f)|0}g=h-1|0;if(g&h){i=(ba(h|0)|0)+33-(ba(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return(D=o,p)|0}else{p=kk(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return(D=o,p)|0}}else{if(g){if(f){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return(D=o,p)|0}if(!l){if(f){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return(D=o,p)|0}g=i-1|0;if(!(g&i)){if(f){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((kk(i|0)|0)>>>0);return(D=o,p)|0}g=(ba(i|0)|0)-(ba(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return(D=o,p)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return(D=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=gk(m|0,l|0,-1,-1)|0;d=D;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;dk(k,d,e,n)|0;p=D;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=dk(e,n,o&m,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l)|0;b=D;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return(D=o,p)|0}function sk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Qb[a&15](b|0,c|0,d|0)|0}function tk(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Rb[a&3](b|0,c|0,d|0,e|0,f|0)}function uk(a,b,c){a=a|0;b=b|0;c=c|0;return+Sb[a&1](b|0,c|0)}function vk(a,b,c){a=a|0;b=b|0;c=+c;Tb[a&3](b|0,+c)}function wk(a,b){a=a|0;b=b|0;return+Ub[a&3](b|0)}function xk(a){a=a|0;return Vb[a&1]()|0}function yk(a,b){a=a|0;b=b|0;Wb[a&15](b|0)}function zk(a,b,c){a=a|0;b=b|0;c=c|0;Xb[a&7](b|0,c|0)}function Ak(a,b){a=a|0;b=b|0;return Yb[a&31](b|0)|0}function Bk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Zb[a&1](b|0,c|0,d|0)}function Ck(a){a=a|0;_b[a&0]()}function Dk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;$b[a&3](b|0,c|0,+d)}function Ek(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return ac[a&1](b|0,c|0,d|0,e|0)|0}function Fk(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;bc[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function Gk(a,b,c){a=a|0;b=b|0;c=c|0;return cc[a&15](b|0,c|0)|0}function Hk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;dc[a&3](b|0,c|0,d|0,e|0)}function Ik(a,b,c){a=a|0;b=b|0;c=c|0;ca(0);return 0}function Jk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ca(1)}function Kk(a,b){a=a|0;b=b|0;ca(2);return 0.0}function Lk(a,b){a=a|0;b=+b;ca(3)}function Mk(a){a=a|0;ca(4);return 0.0}function Nk(){ca(5);return 0}function Ok(a){a=a|0;ca(6)}function Pk(a,b){a=a|0;b=b|0;ca(7)}function Qk(a){a=a|0;ca(8);return 0}function Rk(a,b,c){a=a|0;b=b|0;c=c|0;ca(9)}function Sk(){ca(10)}function Tk(a,b,c){a=a|0;b=b|0;c=+c;ca(11)}function Uk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ca(12);return 0}function Vk(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ca(13)}function Wk(a,b){a=a|0;b=b|0;ca(14);return 0}function Xk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ca(15)}var Qb=[Ik,Zh,_h,Qj,Qi,Pi,Ri,Ag,sg,qg,rg,yg,kh,jh,Oi,Mj];var Rb=[Jk,ki,ji,gi];var Sb=[Kk,dh];var Tb=[Lk,Wf,Yf,ag];var Ub=[Mk,Xf,Zf,bg];var Vb=[Nk,Nf];var Wb=[Ok,Mh,Nh,Sh,Vh,Th,Uh,Wh,Xh,Yh,Mf,Xg,Yg,Ij,Jj,Ok];var Xb=[Pk,ig,gg,_f,cg,eg,ng,gh];var Yb=[Qk,Oh,Ni,Pf,Vf,Qf,wg,xg,mg,lg,jg,hg,$f,dg,fg,og,fh,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk];var Zb=[Rk,ch];var _b=[Sk];var $b=[Tk,eh,bh,Tk];var ac=[Uk,mh];var bc=[Vk,ni,mi,li];var cc=[Wk,Df,Sf,Tf,Uf,tg,vg,ug,zg,kg,lh,hh,Wk,Wk,Wk,Wk];var dc=[Xk,ai,bi,di];return{_i64Subtract:dk,_fflush:Yi,_i64Add:gk,_memset:ek,_malloc:Uj,_memcpy:ik,___getTypeName:Ah,_bitshift64Lshr:hk,_free:Vj,___errno_location:qi,_bitshift64Shl:fk,__GLOBAL__sub_I_ARToolKitJS_cpp:Wg,__GLOBAL__sub_I_bind_cpp:Ch,runPostSets:ck,stackAlloc:ec,stackSave:fc,stackRestore:gc,establishStackSpace:hc,setThrew:ic,setTempRet0:lc,getTempRet0:mc,dynCall_iiii:sk,dynCall_viiiii:tk,dynCall_dii:uk,dynCall_vid:vk,dynCall_di:wk,dynCall_i:xk,dynCall_vi:yk,dynCall_vii:zk,dynCall_ii:Ak,dynCall_viii:Bk,dynCall_v:Ck,dynCall_viid:Dk,dynCall_iiiii:Ek,dynCall_viiiiii:Fk,dynCall_iii:Gk,dynCall_viiii:Hk}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=asm["__GLOBAL__sub_I_bind_cpp"];var _fflush=Module["_fflush"]=asm["_fflush"];var __GLOBAL__sub_I_ARToolKitJS_cpp=Module["__GLOBAL__sub_I_ARToolKitJS_cpp"]=asm["__GLOBAL__sub_I_ARToolKitJS_cpp"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _memset=Module["_memset"]=asm["_memset"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___getTypeName=Module["___getTypeName"]=asm["___getTypeName"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_dii=Module["dynCall_dii"]=asm["dynCall_dii"];var dynCall_vid=Module["dynCall_vid"]=asm["dynCall_vid"];var dynCall_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viid=Module["dynCall_viid"]=asm["dynCall_viid"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var ret=Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{if(e&&typeof e==="object"&&e.stack)Module.printErr("exception thrown: "+[e,e.stack]);throw e}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",function(){process["exit"](status)});console.log(" ");setTimeout(function(){process["exit"](status)},500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach(function(decorator){output=decorator(output,what)})}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run();(function(){"use strict";var ARController=function(width,height,camera){var id;var w=width,h=height;this.orientation="landscape";this.listeners={};if(typeof width!=="number"){var image=width;camera=height;w=image.videoWidth||image.width;h=image.videoHeight||image.height;this.image=image}this.defaultMarkerWidth=1;this.patternMarkers={};this.barcodeMarkers={};this.transform_mat=new Float32Array(16);this.canvas=document.createElement("canvas");this.canvas.width=w;this.canvas.height=h;this.ctx=this.canvas.getContext("2d");this.videoWidth=w;this.videoHeight=h;if(typeof camera==="string"){var self=this;this.cameraParam=new ARCameraParam(camera,function(){self._initialize()},function(err){console.error("ARController: Failed to load ARCameraParam",err)})}else{this.cameraParam=camera;this._initialize()}};ARController.prototype.dispose=function(){artoolkit.teardown(this.id);for(var t in this){this[t]=null}};ARController.prototype.process=function(image){this.detectMarker(image);var markerNum=this.getMarkerNum();var k,o;for(k in this.patternMarkers){o=this.patternMarkers[k];o.inPrevious=o.inCurrent;o.inCurrent=false}for(k in this.barcodeMarkers){o=this.barcodeMarkers[k];o.inPrevious=o.inCurrent;o.inCurrent=false}for(var i=0;i<markerNum;i++){var markerInfo=this.getMarker(i);var markerType=artoolkit.UNKNOWN_MARKER;var visible=this.trackPatternMarkerId(-1);if(markerInfo.idPatt>-1&&(markerInfo.id===markerInfo.idPatt||markerInfo.idMatrix===-1)){visible=this.trackPatternMarkerId(markerInfo.idPatt);markerType=artoolkit.PATTERN_MARKER;if(markerInfo.dir!==markerInfo.dirPatt){this.setMarkerInfoDir(i,markerInfo.dirPatt)}}else if(markerInfo.idMatrix>-1){visible=this.trackBarcodeMarkerId(markerInfo.idMatrix);markerType=artoolkit.BARCODE_MARKER;if(markerInfo.dir!==markerInfo.dirMatrix){this.setMarkerInfoDir(i,markerInfo.dirMatrix)}}if(markerType!==artoolkit.UNKNOWN_MARKER&&visible.inPrevious){this.getTransMatSquareCont(i,visible.markerWidth,visible.matrix,visible.matrix)}else{this.getTransMatSquare(i,visible.markerWidth,visible.matrix)}visible.inCurrent=true;this.transMatToGLMat(visible.matrix,this.transform_mat);this.dispatchEvent({name:"getMarker",target:this,data:{index:i,type:markerType,marker:markerInfo,matrix:this.transform_mat}})}var multiMarkerCount=this.getMultiMarkerCount();for(var i=0;i<multiMarkerCount;i++){var subMarkerCount=this.getMultiMarkerPatternCount(i);var visible=false;artoolkit.getTransMatMultiSquareRobust(this.id,i);this.transMatToGLMat(this.marker_transform_mat,this.transform_mat);for(var j=0;j<subMarkerCount;j++){var multiEachMarkerInfo=this.getMultiEachMarker(i,j);if(multiEachMarkerInfo.visible>=0){visible=true;this.dispatchEvent({name:"getMultiMarker",target:this,data:{multiMarkerId:i,matrix:this.transform_mat}});break}}if(visible){for(var j=0;j<subMarkerCount;j++){var multiEachMarkerInfo=this.getMultiEachMarker(i,j);this.transMatToGLMat(this.marker_transform_mat,this.transform_mat);this.dispatchEvent({name:"getMultiMarkerSub",target:this,data:{multiMarkerId:i,markerIndex:j,marker:multiEachMarkerInfo,matrix:this.transform_mat}})}}}if(this._bwpointer){this.debugDraw()}};ARController.prototype.trackPatternMarkerId=function(id,markerWidth){var obj=this.patternMarkers[id];if(!obj){this.patternMarkers[id]=obj={inPrevious:false,inCurrent:false,matrix:new Float32Array(12),markerWidth:markerWidth||this.defaultMarkerWidth}}if(markerWidth){obj.markerWidth=markerWidth}return obj};ARController.prototype.trackBarcodeMarkerId=function(id,markerWidth){var obj=this.barcodeMarkers[id];if(!obj){this.barcodeMarkers[id]=obj={inPrevious:false,inCurrent:false,matrix:new Float32Array(12),markerWidth:markerWidth||this.defaultMarkerWidth}}if(markerWidth){obj.markerWidth=markerWidth}return obj};ARController.prototype.getMultiMarkerCount=function(){return artoolkit.getMultiMarkerCount(this.id)};ARController.prototype.getMultiMarkerPatternCount=function(multiMarkerId){return artoolkit.getMultiMarkerNum(this.id,multiMarkerId)};ARController.prototype.addEventListener=function(name,callback){if(!this.listeners[name]){this.listeners[name]=[]}this.listeners[name].push(callback)};ARController.prototype.removeEventListener=function(name,callback){if(this.listeners[name]){var index=this.listeners[name].indexOf(callback);if(index>-1){this.listeners[name].splice(index,1)}}};ARController.prototype.dispatchEvent=function(event){var listeners=this.listeners[event.name];if(listeners){for(var i=0;i<listeners.length;i++){listeners[i].call(this,event)}}};ARController.prototype.debugSetup=function(){document.body.appendChild(this.canvas);this.setDebugMode(1);this._bwpointer=this.getProcessingImage()};ARController.prototype.loadMarker=function(markerURL,onSuccess,onError){return artoolkit.addMarker(this.id,markerURL,onSuccess,onError)};ARController.prototype.loadMultiMarker=function(markerURL,onSuccess,onError){return artoolkit.addMultiMarker(this.id,markerURL,onSuccess,onError)};ARController.prototype.getTransMatSquare=function(markerIndex,markerWidth,dst){artoolkit.getTransMatSquare(this.id,markerIndex,markerWidth);dst.set(this.marker_transform_mat);return dst};ARController.prototype.getTransMatSquareCont=function(markerIndex,markerWidth,previousMarkerTransform,dst){this.marker_transform_mat.set(previousMarkerTransform);artoolkit.getTransMatSquareCont(this.id,markerIndex,markerWidth);dst.set(this.marker_transform_mat);return dst};ARController.prototype.getTransMatMultiSquare=function(multiMarkerId,dst){artoolkit.getTransMatMultiSquare(this.id,multiMarkerId);dst.set(this.marker_transform_mat);return dst};ARController.prototype.getTransMatMultiSquareRobust=function(multiMarkerId,dst){artoolkit.getTransMatMultiSquare(this.id,multiMarkerId);dst.set(this.marker_transform_mat);return dst};ARController.prototype.transMatToGLMat=function(transMat,glMat,scale){glMat[0+0*4]=transMat[0];glMat[0+1*4]=transMat[1];glMat[0+2*4]=transMat[2];glMat[0+3*4]=transMat[3];glMat[1+0*4]=transMat[4];glMat[1+1*4]=transMat[5];glMat[1+2*4]=transMat[6];glMat[1+3*4]=transMat[7];glMat[2+0*4]=transMat[8];glMat[2+1*4]=transMat[9];glMat[2+2*4]=transMat[10];glMat[2+3*4]=transMat[11];glMat[3+0*4]=0;glMat[3+1*4]=0;glMat[3+2*4]=0;glMat[3+3*4]=1;if(scale!=undefined&&scale!==0){glMat[12]*=scale;glMat[13]*=scale;glMat[14]*=scale}return glMat};ARController.prototype.detectMarker=function(image){if(this._copyImageToHeap(image)){return artoolkit.detectMarker(this.id)}return-99};ARController.prototype.getMarkerNum=function(){return artoolkit.getMarkerNum(this.id)};ARController.prototype.getMarker=function(markerIndex){if(0===artoolkit.getMarker(this.id,markerIndex)){return artoolkit.markerInfo}};ARController.prototype.setMarkerInfoVertex=function(markerIndex,vertexData){for(var i=0;i<vertexData.length;i++){this.marker_transform_mat[i*2+0]=vertexData[i][0];this.marker_transform_mat[i*2+1]=vertexData[i][1]}return artoolkit.setMarkerInfoVertex(this.id,markerIndex)};ARController.prototype.cloneMarkerInfo=function(markerInfo){return JSON.parse(JSON.stringify(markerInfo))};ARController.prototype.getMultiEachMarker=function(multiMarkerId,markerIndex){if(0===artoolkit.getMultiEachMarker(this.id,multiMarkerId,markerIndex)){return artoolkit.multiEachMarkerInfo}};ARController.prototype.getTransformationMatrix=function(){return this.transform_mat};ARController.prototype.getCameraMatrix=function(){return this.camera_mat};ARController.prototype.getMarkerTransformationMatrix=function(){return this.marker_transform_mat};ARController.prototype.setDebugMode=function(mode){return artoolkit.setDebugMode(this.id,mode)};ARController.prototype.getDebugMode=function(){return artoolkit.getDebugMode(this.id)};ARController.prototype.getProcessingImage=function(){return artoolkit.getProcessingImage(this.id)};ARController.prototype.setLogLevel=function(mode){return artoolkit.setLogLevel(mode)};ARController.prototype.getLogLevel=function(){return artoolkit.getLogLevel()};ARController.prototype.setMarkerInfoDir=function(markerIndex,dir){return artoolkit.setMarkerInfoDir(this.id,markerIndex,dir)};ARController.prototype.setProjectionNearPlane=function(value){return artoolkit.setProjectionNearPlane(this.id,value)};ARController.prototype.getProjectionNearPlane=function(){return artoolkit.getProjectionNearPlane(this.id)};ARController.prototype.setProjectionFarPlane=function(value){return artoolkit.setProjectionFarPlane(this.id,value)};ARController.prototype.getProjectionFarPlane=function(){return artoolkit.getProjectionFarPlane(this.id)};ARController.prototype.setThresholdMode=function(mode){return artoolkit.setThresholdMode(this.id,mode)};ARController.prototype.getThresholdMode=function(){return artoolkit.getThresholdMode(this.id)};ARController.prototype.setThreshold=function(threshold){return artoolkit.setThreshold(this.id,threshold)};ARController.prototype.getThreshold=function(){return artoolkit.getThreshold(this.id)};ARController.prototype.setPatternDetectionMode=function(value){return artoolkit.setPatternDetectionMode(this.id,value)};ARController.prototype.getPatternDetectionMode=function(){return artoolkit.getPatternDetectionMode(this.id)};ARController.prototype.setMatrixCodeType=function(value){return artoolkit.setMatrixCodeType(this.id,value)};ARController.prototype.getMatrixCodeType=function(){return artoolkit.getMatrixCodeType(this.id)};ARController.prototype.setLabelingMode=function(value){return artoolkit.setLabelingMode(this.id,value)};ARController.prototype.getLabelingMode=function(){return artoolkit.getLabelingMode(this.id)};ARController.prototype.setPattRatio=function(value){return artoolkit.setPattRatio(this.id,value)};ARController.prototype.getPattRatio=function(){return artoolkit.getPattRatio(this.id)};ARController.prototype.setImageProcMode=function(value){return artoolkit.setImageProcMode(this.id,value)};ARController.prototype.getImageProcMode=function(){return artoolkit.getImageProcMode(this.id)};ARController.prototype.debugDraw=function(){var debugBuffer=new Uint8ClampedArray(Module.HEAPU8.buffer,this._bwpointer,this.framesize);var id=new ImageData(debugBuffer,this.canvas.width,this.canvas.height);this.ctx.putImageData(id,0,0);var marker_num=this.getMarkerNum();for(var i=0;i<marker_num;i++){this._debugMarker(this.getMarker(i))}};ARController.prototype._initialize=function(){this.id=artoolkit.setup(this.canvas.width,this.canvas.height,this.cameraParam.id);var params=artoolkit.frameMalloc;this.framepointer=params.framepointer;this.framesize=params.framesize;this.dataHeap=new Uint8Array(Module.HEAPU8.buffer,this.framepointer,this.framesize);this.camera_mat=new Float64Array(Module.HEAPU8.buffer,params.camera,16);this.marker_transform_mat=new Float64Array(Module.HEAPU8.buffer,params.transform,12);this.setProjectionNearPlane(.1);this.setProjectionFarPlane(1e3);var self=this;setTimeout(function(){if(self.onload){self.onload()}self.dispatchEvent({name:"load",target:self})},1)};ARController.prototype._copyImageToHeap=function(image){if(!image){image=this.image}if(this.orientation==="portrait"){this.ctx.save();this.ctx.translate(this.canvas.width,0);this.ctx.rotate(Math.PI/2);this.ctx.drawImage(image,0,0,this.canvas.height,this.canvas.width);this.ctx.restore()}else{this.ctx.drawImage(image,0,0,this.canvas.width,this.canvas.height)}var imageData=this.ctx.getImageData(0,0,this.canvas.width,this.canvas.height);var data=imageData.data;if(this.dataHeap){this.dataHeap.set(data);return true}return false};ARController.prototype._debugMarker=function(marker){var vertex,pos;vertex=marker.vertex;var ctx=this.ctx;ctx.strokeStyle="red";ctx.beginPath();ctx.moveTo(vertex[0][0],vertex[0][1]);ctx.lineTo(vertex[1][0],vertex[1][1]);ctx.stroke();ctx.beginPath();ctx.moveTo(vertex[2][0],vertex[2][1]);ctx.lineTo(vertex[3][0],vertex[3][1]);ctx.stroke();ctx.strokeStyle="green";ctx.beginPath();ctx.lineTo(vertex[1][0],vertex[1][1]);ctx.lineTo(vertex[2][0],vertex[2][1]);ctx.stroke();ctx.beginPath();ctx.moveTo(vertex[3][0],vertex[3][1]);ctx.lineTo(vertex[0][0],vertex[0][1]);ctx.stroke();pos=marker.pos;ctx.beginPath();ctx.arc(pos[0],pos[1],8,0,Math.PI*2);ctx.fillStyle="red";ctx.fill()};ARController.getUserMedia=function(configuration){var facing=configuration.facingMode||"environment";var onSuccess=configuration.onSuccess;var onError=configuration.onError||function(err){console.error("ARController.getUserMedia",err)};var video=document.createElement("video");var initProgress=function(){if(this.videoWidth!==0){onSuccess(video)}};var readyToPlay=false;var eventNames=["touchstart","touchend","touchmove","touchcancel","click","mousedown","mouseup","mousemove","keydown","keyup","keypress","scroll"];var play=function(ev){if(readyToPlay){video.play();if(!video.paused){eventNames.forEach(function(eventName){window.removeEventListener(eventName,play,true)})}}};eventNames.forEach(function(eventName){window.addEventListener(eventName,play,true)});var success=function(stream){video.addEventListener("loadedmetadata",initProgress,false);video.src=window.URL.createObjectURL(stream);readyToPlay=true;play()};var constraints={};var mediaDevicesConstraints={};
if(configuration.width){mediaDevicesConstraints.width=configuration.width;if(typeof configuration.width==="object"){if(configuration.width.max){constraints.maxWidth=configuration.width.max}if(configuration.width.min){constraints.minWidth=configuration.width.max}}else{constraints.maxWidth=configuration.width}}if(configuration.height){mediaDevicesConstraints.height=configuration.height;if(typeof configuration.height==="object"){if(configuration.height.max){constraints.maxHeight=configuration.height.max}if(configuration.height.min){constraints.minHeight=configuration.height.max}}else{constraints.maxHeight=configuration.height}}mediaDevicesConstraints.facingMode=facing;navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia;var hdConstraints={audio:false,video:{mandatory:constraints}};if(false){if(navigator.mediaDevices){navigator.mediaDevices.getUserMedia({audio:false,video:mediaDevicesConstraints}).then(success,onError)}else{MediaStreamTrack.getSources(function(sources){var facingDir=mediaDevicesConstraints.facingMode;if(facing&&facing.exact){facingDir=facing.exact}for(var i=0;i<sources.length;i++){if(sources[i].kind==="video"&&sources[i].facing===facingDir){hdConstraints.video.mandatory.sourceId=sources[i].id;break}}if(facing&&facing.exact&&!hdConstraints.video.mandatory.sourceId){onError("Failed to get camera facing the wanted direction")}else{if(navigator.getUserMedia){navigator.getUserMedia(hdConstraints,success,onError)}else{onError("navigator.getUserMedia is not supported on your browser")}}})}}else{if(navigator.getUserMedia){navigator.getUserMedia(hdConstraints,success,onError)}else{onError("navigator.getUserMedia is not supported on your browser")}}return video};ARController.getUserMediaARController=function(configuration){var obj={};for(var i in configuration){obj[i]=configuration[i]}var onSuccess=configuration.onSuccess;var cameraParamURL=configuration.cameraParam;obj.onSuccess=function(){new ARCameraParam(cameraParamURL,function(){var arCameraParam=this;var maxSize=configuration.maxARVideoSize||Math.max(video.videoWidth,video.videoHeight);var f=maxSize/Math.max(video.videoWidth,video.videoHeight);var w=f*video.videoWidth;var h=f*video.videoHeight;if(video.videoWidth<video.videoHeight){var tmp=w;w=h;h=tmp}var arController=new ARController(w,h,arCameraParam);arController.image=video;if(video.videoWidth<video.videoHeight){arController.orientation="portrait";arController.videoWidth=video.videoHeight;arController.videoHeight=video.videoWidth}else{arController.orientation="landscape";arController.videoWidth=video.videoWidth;arController.videoHeight=video.videoHeight}onSuccess(arController,arCameraParam)},function(err){console.error("ARController: Failed to load ARCameraParam",err)})};var video=this.getUserMedia(obj);return video};var ARCameraParam=function(src,onload,onerror){this.id=-1;this._src="";this.complete=false;this.onload=onload;this.onerror=onerror;if(src){this.load(src)}};ARCameraParam.prototype.load=function(src){if(this._src!==""){throw"ARCameraParam: Trying to load camera parameters twice."}this._src=src;if(src){var self=this;artoolkit.loadCamera(src,function(id){self.id=id;self.complete=true;self.onload()},function(err){self.onerror(err)})}};Object.defineProperty(ARCameraParam.prototype,"src",{set:function(src){this.load(src)},get:function(){return this._src}});ARCameraParam.prototype.dispose=function(){if(this.id!==-1){artoolkit.deleteCamera(this.id)}this.id=-1;this._src="";this.complete=false};var artoolkit={UNKNOWN_MARKER:-1,PATTERN_MARKER:0,BARCODE_MARKER:1,loadCamera:loadCamera,addMarker:addMarker,addMultiMarker:addMultiMarker};var FUNCTIONS=["setup","teardown","setLogLevel","getLogLevel","setDebugMode","getDebugMode","getProcessingImage","setMarkerInfoDir","setMarkerInfoVertex","getTransMatSquare","getTransMatSquareCont","getTransMatMultiSquare","getTransMatMultiSquareRobust","getMultiMarkerNum","getMultiMarkerCount","detectMarker","getMarkerNum","getMarker","getMultiEachMarker","setProjectionNearPlane","getProjectionNearPlane","setProjectionFarPlane","getProjectionFarPlane","setThresholdMode","getThresholdMode","setThreshold","getThreshold","setPatternDetectionMode","getPatternDetectionMode","setMatrixCodeType","getMatrixCodeType","setLabelingMode","getLabelingMode","setPattRatio","getPattRatio","setImageProcMode","getImageProcMode"];function runWhenLoaded(){FUNCTIONS.forEach(function(n){artoolkit[n]=Module[n]});for(var m in Module){if(m.match(/^AR/))artoolkit[m]=Module[m]}}var marker_count=0;function addMarker(arId,url,callback){var filename="/marker_"+marker_count++;ajax(url,filename,function(){var id=Module._addMarker(arId,filename);if(callback)callback(id)})}function bytesToString(array){return String.fromCharCode.apply(String,array)}function parseMultiFile(bytes){var str=bytesToString(bytes);var lines=str.split("\n");var files=[];var state=0;var markers=0;lines.forEach(function(line){line=line.trim();if(!line||line.startsWith("#"))return;switch(state){case 0:markers=+line;state=1;return;case 1:if(!line.match(/^\d+$/)){files.push(line)}case 2:case 3:case 4:state++;return;case 5:state=1;return}});return files}var multi_marker_count=0;function addMultiMarker(arId,url,callback){var filename="/multi_marker_"+multi_marker_count++;ajax(url,filename,function(bytes){var files=parseMultiFile(bytes);function ok(){var markerID=Module._addMultiMarker(arId,filename);var markerNum=Module.getMultiMarkerNum(arId,markerID);if(callback)callback(markerID,markerNum)}if(!files.length)return ok();var path=url.split("/").slice(0,-1).join("/");files=files.map(function(file){if(file==="patt.hiro"||file==="patt.kanji"||file==="patt2.hiro"||file==="patt2.kanji"){return["http://127.0.0.1:8080/data/data/"+file,file]}return[path+"/"+file,file]});ajaxDependencies(files,ok)})}var camera_count=0;function loadCamera(url,callback){var filename="/camera_param_"+camera_count++;var writeCallback=function(){var id=Module._loadCamera(filename);if(callback)callback(id)};if(typeof url==="object"){writeByteArrayToFS(filename,url,writeCallback)}else if(url.indexOf("\n")>-1){writeStringToFS(filename,url,writeCallback)}else{ajax(url,filename,writeCallback)}}function writeStringToFS(target,string,callback){var byteArray=new Uint8Array(string.length);for(var i=0;i<byteArray.length;i++){byteArray[i]=string.charCodeAt(i)&255}writeByteArrayToFS(target,byteArray,callback)}function writeByteArrayToFS(target,byteArray,callback){FS.writeFile(target,byteArray,{encoding:"binary"});callback(byteArray)}function ajax(url,target,callback){var oReq=new XMLHttpRequest;oReq.open("GET",url,true);oReq.responseType="arraybuffer";oReq.onload=function(oEvent){var arrayBuffer=oReq.response;var byteArray=new Uint8Array(arrayBuffer);writeByteArrayToFS(target,byteArray,callback)};oReq.send()}function ajaxDependencies(files,callback){var next=files.pop();if(next){ajax(next[0],next[1],function(){ajaxDependencies(files,callback)})}else{callback()}}window.artoolkit=artoolkit;window.ARController=ARController;window.ARCameraParam=ARCameraParam;if(window.Module){runWhenLoaded()}else{window.Module={onRuntimeInitialized:function(){runWhenLoaded()}}}})();var THREEx=THREEx||{};THREEx.ArBaseControls=function(object3d){this.id=THREEx.ArBaseControls.id++;this.object3d=object3d;this.object3d.matrixAutoUpdate=false;this.object3d.visible=false};THREEx.ArBaseControls.id=0;Object.assign(THREEx.ArBaseControls.prototype,THREE.EventDispatcher.prototype);THREEx.ArBaseControls.prototype.update=function(){console.assert(false,"you need to implement your own update")};THREEx.ArBaseControls.prototype.name=function(){console.assert(false,"you need to implement your own .name()");return"Not yet implemented - name()"};var THREEx=THREEx||{};THREEx.ARClickability=function(sourceElement){this._sourceElement=sourceElement;var fullWidth=parseInt(sourceElement.style.width);var fullHeight=parseInt(sourceElement.style.height);this._cameraPicking=new THREE.PerspectiveCamera(42,fullWidth/fullHeight,.1,100)};THREEx.ARClickability.prototype.onResize=function(){var sourceElement=this._sourceElement;var cameraPicking=this._cameraPicking;var fullWidth=parseInt(sourceElement.style.width);var fullHeight=parseInt(sourceElement.style.height);cameraPicking.aspect=fullWidth/fullHeight;cameraPicking.updateProjectionMatrix()};THREEx.ARClickability.prototype.computeIntersects=function(domEvent,objects){var sourceElement=this._sourceElement;var cameraPicking=this._cameraPicking;var eventCoords=new THREE.Vector3;eventCoords.x=domEvent.layerX/parseInt(sourceElement.style.width)*2-1;eventCoords.y=-(domEvent.layerY/parseInt(sourceElement.style.height))*2+1;var raycaster=new THREE.Raycaster;raycaster.setFromCamera(eventCoords,cameraPicking);var intersects=raycaster.intersectObjects(objects);return intersects};THREEx.ARClickability.prototype.update=function(){};var THREEx=THREEx||{};THREEx.ArMarkerCloak=function(videoTexture){var updateInShaderEnabled=true;var geometry=new THREE.PlaneGeometry(1.3+.25,1.85+.25,1,8).translate(0,-.3,0);var material=new THREE.ShaderMaterial({vertexShader:THREEx.ArMarkerCloak.vertexShader,fragmentShader:THREEx.ArMarkerCloak.fragmentShader,transparent:true,uniforms:{texture:{value:videoTexture},opacity:{value:.5}},defines:{updateInShaderEnabled:updateInShaderEnabled?1:0}});var cloakMesh=new THREE.Mesh(geometry,material);cloakMesh.rotation.x=-Math.PI/2;this.object3d=cloakMesh;var xMin=-.65;var xMax=.65;var yMin=.65+.1;var yMax=.95+.1;var originalsFaceVertexUvs=[[]];for(var faceIndex=0;faceIndex<cloakMesh.geometry.faces.length;faceIndex++){originalsFaceVertexUvs[0][faceIndex]=[];originalsFaceVertexUvs[0][faceIndex][0]=new THREE.Vector2;originalsFaceVertexUvs[0][faceIndex][1]=new THREE.Vector2;originalsFaceVertexUvs[0][faceIndex][2]=new THREE.Vector2}for(var i=0;i<cloakMesh.geometry.parameters.heightSegments/2;i++){originalsFaceVertexUvs[0][i*4+0][0].set(xMin/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+0][1].set(xMin/2+.5,yMin/2+.5);originalsFaceVertexUvs[0][i*4+0][2].set(xMax/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+1][0].set(xMin/2+.5,yMin/2+.5);originalsFaceVertexUvs[0][i*4+1][1].set(xMax/2+.5,yMin/2+.5);originalsFaceVertexUvs[0][i*4+1][2].set(xMax/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+2][0].set(xMin/2+.5,yMin/2+.5);originalsFaceVertexUvs[0][i*4+2][1].set(xMin/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+2][2].set(xMax/2+.5,yMin/2+.5);originalsFaceVertexUvs[0][i*4+3][0].set(xMin/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+3][1].set(xMax/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+3][2].set(xMax/2+.5,yMin/2+.5)}if(updateInShaderEnabled===true){cloakMesh.geometry.faceVertexUvs=originalsFaceVertexUvs;cloakMesh.geometry.uvsNeedUpdate=true}var originalOrthoVertices=[];originalOrthoVertices.push(new THREE.Vector3(xMin,yMax,0));originalOrthoVertices.push(new THREE.Vector3(xMax,yMax,0));originalOrthoVertices.push(new THREE.Vector3(xMin,yMin,0));originalOrthoVertices.push(new THREE.Vector3(xMax,yMin,0));var material=new THREE.MeshNormalMaterial({transparent:true,opacity:.5,side:THREE.DoubleSide});var geometry=new THREE.PlaneGeometry(1,1);var orthoMesh=new THREE.Mesh(geometry,material);this.orthoMesh=orthoMesh;this.update=function(modelViewMatrix,cameraProjectionMatrix){updateOrtho(modelViewMatrix,cameraProjectionMatrix);if(updateInShaderEnabled===false){updateUvs(modelViewMatrix,cameraProjectionMatrix)}};return;function updateUvs(modelViewMatrix,cameraProjectionMatrix){var transformedUv=new THREE.Vector3;originalsFaceVertexUvs[0].forEach(function(faceVertexUvs,faceIndex){faceVertexUvs.forEach(function(originalUv,uvIndex){transformedUv.x=originalUv.x*2-1;transformedUv.y=originalUv.y*2-1;transformedUv.z=0;transformedUv.applyMatrix4(modelViewMatrix);transformedUv.applyMatrix4(cameraProjectionMatrix);transformedUv.x/=transformedUv.z;transformedUv.y/=transformedUv.z;transformedUv.x=transformedUv.x/2+.5;transformedUv.y=transformedUv.y/2+.5;cloakMesh.geometry.faceVertexUvs[0][faceIndex][uvIndex].set(transformedUv.x,transformedUv.y)})});cloakMesh.geometry.uvsNeedUpdate=true}function updateOrtho(modelViewMatrix,cameraProjectionMatrix){var transformedUvs=[];originalOrthoVertices.forEach(function(originalOrthoVertices,index){var transformedUv=originalOrthoVertices.clone();transformedUv.applyMatrix4(modelViewMatrix);transformedUv.applyMatrix4(cameraProjectionMatrix);transformedUv.x/=transformedUv.z;transformedUv.y/=transformedUv.z;transformedUvs.push(transformedUv)});for(var i=0;i<transformedUvs.length;i++){orthoMesh.geometry.vertices[i].copy(transformedUvs[i])}orthoMesh.geometry.computeBoundingSphere();orthoMesh.geometry.verticesNeedUpdate=true}};THREEx.ArMarkerCloak.markerSpaceShaderFunction="\n"+" vec2 transformUvToMarkerSpace(vec2 originalUv){\n"+" vec3 transformedUv;\n"+" // set transformedUv - from UV coord to clip coord\n"+" transformedUv.x = originalUv.x * 2.0 - 1.0;\n"+" transformedUv.y = originalUv.y * 2.0 - 1.0;\n"+" transformedUv.z = 0.0;\n"+"\n"+" // apply modelViewMatrix and projectionMatrix\n"+" transformedUv = (projectionMatrix * modelViewMatrix * vec4( transformedUv, 1.0 ) ).xyz;\n"+"\n"+" // apply perspective\n"+" transformedUv.x /= transformedUv.z;\n"+" transformedUv.y /= transformedUv.z;\n"+"\n"+" // set back from clip coord to Uv coord\n"+" transformedUv.x = transformedUv.x / 2.0 + 0.5;\n"+" transformedUv.y = transformedUv.y / 2.0 + 0.5;\n"+"\n"+" // return the result\n"+" return transformedUv.xy;\n"+" }";THREEx.ArMarkerCloak.vertexShader=THREEx.ArMarkerCloak.markerSpaceShaderFunction+" varying vec2 vUv;\n"+"\n"+" void main(){\n"+" // pass the UV to the fragment\n"+" #if (updateInShaderEnabled == 1)\n"+" vUv = transformUvToMarkerSpace(uv);\n"+" #else\n"+" vUv = uv;\n"+" #endif\n"+"\n"+" // compute gl_Position\n"+" vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n"+" gl_Position = projectionMatrix * mvPosition;\n"+" }";THREEx.ArMarkerCloak.fragmentShader="\n"+" varying vec2 vUv;\n"+" uniform sampler2D texture;\n"+" uniform float opacity;\n"+"\n"+" void main(void){\n"+" vec3 color = texture2D( texture, vUv ).rgb;\n"+"\n"+" gl_FragColor = vec4( color, opacity);\n"+" }";var THREEx=THREEx||{};THREEx.ArMarkerControls=function(context,object3d,parameters){var _this=this;THREEx.ArBaseControls.call(this,object3d);this.context=context;this.parameters={size:parameters.size!==undefined?parameters.size:1,type:parameters.type!==undefined?parameters.type:"unknown",patternUrl:parameters.patternUrl!==undefined?parameters.patternUrl:null,barcodeValue:parameters.barcodeValue!==undefined?parameters.barcodeValue:null,changeMatrixMode:parameters.changeMatrixMode!==undefined?parameters.changeMatrixMode:"modelViewMatrix",minConfidence:parameters.minConfidence!==undefined?parameters.minConfidence:.6};var possibleValues=["pattern","barcode","unknown"];console.assert(possibleValues.indexOf(this.parameters.type)!==-1,"illegal value",this.parameters.type);var possibleValues=["modelViewMatrix","cameraTransformMatrix"];console.assert(possibleValues.indexOf(this.parameters.changeMatrixMode)!==-1,"illegal value",this.parameters.changeMatrixMode);this.object3d=object3d;this.object3d.matrixAutoUpdate=false;this.object3d.visible=false;context.addMarker(this);if(_this.context.parameters.trackingBackend==="artoolkit"){this._initArtoolkit()}else if(_this.context.parameters.trackingBackend==="aruco"){this._arucoPosit=new POS.Posit(this.parameters.size,_this.context.arucoContext.canvas.width)}else if(_this.context.parameters.trackingBackend==="tango"){this._initTango()}else console.assert(false)};THREEx.ArMarkerControls.prototype=Object.create(THREEx.ArBaseControls.prototype);THREEx.ArMarkerControls.prototype.constructor=THREEx.ArMarkerControls;THREEx.ArMarkerControls.prototype.dispose=function(){this.context.removeMarker(this)};THREEx.ArMarkerControls.prototype.updateWithModelViewMatrix=function(modelViewMatrix){var markerObject3D=this.object3d;markerObject3D.visible=true;if(this.context.parameters.trackingBackend==="artoolkit"){var tmpMatrix=(new THREE.Matrix4).copy(this.context._artoolkitProjectionAxisTransformMatrix);tmpMatrix.multiply(modelViewMatrix);modelViewMatrix.copy(tmpMatrix)}else if(this.context.parameters.trackingBackend==="aruco"){}else if(this.context.parameters.trackingBackend==="tango"){}else console.assert(false);if(this.context.parameters.trackingBackend!=="tango"){var markerAxisTransformMatrix=(new THREE.Matrix4).makeRotationX(Math.PI/2);modelViewMatrix.multiply(markerAxisTransformMatrix)}if(this.parameters.changeMatrixMode==="modelViewMatrix"){markerObject3D.matrix.copy(modelViewMatrix)}else if(this.parameters.changeMatrixMode==="cameraTransformMatrix"){markerObject3D.matrix.getInverse(modelViewMatrix)}else{console.assert(false)}markerObject3D.matrix.decompose(markerObject3D.position,markerObject3D.quaternion,markerObject3D.scale);this.dispatchEvent({type:"markerFound"})};THREEx.ArMarkerControls.prototype.name=function(){var name="";name+=this.parameters.type;if(this.parameters.type==="pattern"){var url=this.parameters.patternUrl;var basename=url.replace(/^.*\//g,"");name+=" - "+basename}else if(this.parameters.type==="barcode"){name+=" - "+this.parameters.barcodeValue}else{console.assert(false,"no .name() implemented for this marker controls")}return name};THREEx.ArMarkerControls.prototype._initArtoolkit=function(){var _this=this;var artoolkitMarkerId=null;var delayedInitTimerId=setInterval(function(){var arController=_this.context.arController;if(arController===null)return;clearInterval(delayedInitTimerId);delayedInitTimerId=null;postInit()},1e3/50);return;function postInit(){var arController=_this.context.arController;console.assert(arController!==null);if(_this.parameters.type==="pattern"){arController.loadMarker(_this.parameters.patternUrl,function(markerId){artoolkitMarkerId=markerId;arController.trackPatternMarkerId(artoolkitMarkerId,_this.parameters.size)})}else if(_this.parameters.type==="barcode"){artoolkitMarkerId=_this.parameters.barcodeValue;arController.trackBarcodeMarkerId(artoolkitMarkerId,_this.parameters.size)}else if(_this.parameters.type==="unknown"){artoolkitMarkerId=null}else{console.log(false,"invalid marker type",_this.parameters.type)}arController.addEventListener("getMarker",function(event){if(event.data.type===artoolkit.PATTERN_MARKER&&_this.parameters.type==="pattern"){if(artoolkitMarkerId===null)return;if(event.data.marker.idPatt===artoolkitMarkerId)onMarkerFound(event)}else if(event.data.type===artoolkit.BARCODE_MARKER&&_this.parameters.type==="barcode"){if(artoolkitMarkerId===null)return;if(event.data.marker.idMatrix===artoolkitMarkerId)onMarkerFound(event)}else if(event.data.type===artoolkit.UNKNOWN_MARKER&&_this.parameters.type==="unknown"){onMarkerFound(event)}})}function onMarkerFound(event){if(event.data.type===artoolkit.PATTERN_MARKER&&event.data.marker.cfPatt<_this.parameters.minConfidence)return;if(event.data.type===artoolkit.BARCODE_MARKER&&event.data.marker.cfMatt<_this.parameters.minConfidence)return;var modelViewMatrix=(new THREE.Matrix4).fromArray(event.data.matrix);_this.updateWithModelViewMatrix(modelViewMatrix)}};THREEx.ArMarkerControls.prototype._initAruco=function(){this._arucoPosit=new POS.Posit(this.parameters.size,_this.context.arucoContext.canvas.width)};THREEx.ArMarkerControls.prototype._initTango=function(){var _this=this;console.log("init tango ArMarkerControls")};var THREEx=THREEx||{};THREEx.ArMarkerHelper=function(markerControls){this.object3d=new THREE.Group;var mesh=new THREE.AxisHelper;this.object3d.add(mesh);var text=markerControls.id;var canvas=document.createElement("canvas");canvas.width=64;canvas.height=64;var context=canvas.getContext("2d");var texture=new THREE.CanvasTexture(canvas);context.font="48px monospace";context.fillStyle="rgba(192,192,255, 0.5)";context.fillRect(0,0,canvas.width,canvas.height);context.fillStyle="darkblue";context.fillText(text,canvas.width/4,3*canvas.height/4);texture.needsUpdate=true;var geometry=new THREE.PlaneGeometry(1,1);var material=new THREE.MeshBasicMaterial({map:texture,transparent:true});var mesh=new THREE.Mesh(geometry,material);mesh.rotation.x=-Math.PI/2;this.object3d.add(mesh)};var THREEx=THREEx||{};THREEx.ArSmoothedControls=function(object3d,parameters){var _this=this;THREEx.ArBaseControls.call(this,object3d);this.object3d.visible=false;this._lastLerpStepAt=null;this._visibleStartedAt=null;this._unvisibleStartedAt=null;parameters=parameters||{};this.parameters={lerpPosition:parameters.lerpPosition!==undefined?parameters.lerpPosition:.8,lerpQuaternion:parameters.lerpQuaternion!==undefined?parameters.lerpQuaternion:.2,lerpScale:parameters.lerpScale!==undefined?parameters.lerpScale:.7,lerpStepDelay:parameters.fixStepDelay!==undefined?parameters.fixStepDelay:1/60,minVisibleDelay:parameters.minVisibleDelay!==undefined?parameters.minVisibleDelay:0,minUnvisibleDelay:parameters.minUnvisibleDelay!==undefined?parameters.minUnvisibleDelay:.2}};THREEx.ArSmoothedControls.prototype=Object.create(THREEx.ArBaseControls.prototype);THREEx.ArSmoothedControls.prototype.constructor=THREEx.ArSmoothedControls;THREEx.ArSmoothedControls.prototype.update=function(targetObject3d){var object3d=this.object3d;var parameters=this.parameters;var wasVisible=object3d.visible;var present=performance.now()/1e3;if(targetObject3d.visible===false)this._visibleStartedAt=null;if(targetObject3d.visible===true)this._unvisibleStartedAt=null;if(wasVisible===false&&targetObject3d.visible===true){if(this._visibleStartedAt===null)this._visibleStartedAt=present;var visibleFor=present-this._visibleStartedAt;if(visibleFor>=this.parameters.minVisibleDelay){object3d.visible=true;this._visibleStartedAt=null}console.log("visibleFor",visibleFor)}if(wasVisible===true&&targetObject3d.visible===false){if(this._unvisibleStartedAt===null)this._unvisibleStartedAt=present;var unvisibleFor=present-this._unvisibleStartedAt;if(unvisibleFor>=this.parameters.minUnvisibleDelay){object3d.visible=false}}if(this._lastLerpStepAt===null){applyOneSlepStep();this._lastLerpStepAt=present}else{var nStepsToDo=Math.floor((present-this._lastLerpStepAt)/this.parameters.lerpStepDelay);for(var i=0;i<nStepsToDo;i++){applyOneSlepStep();this._lastLerpStepAt+=this.parameters.lerpStepDelay}}this.object3d.updateMatrix();if(false){this.object3d.position.copy(targetObject3d.position);this.object3d.quaternion.copy(targetObject3d.quaternion);this.object3d.scale.copy(targetObject3d.scale);this.object3d.updateMatrix()}if(wasVisible===false&&object3d.visible===true){this.dispatchEvent({type:"becameVisible"})}if(wasVisible===true&&object3d.visible===false){this.dispatchEvent({type:"becameUnVisible"})}return;function applyOneSlepStep(){object3d.position.lerp(targetObject3d.position,parameters.lerpPosition);object3d.quaternion.slerp(targetObject3d.quaternion,parameters.lerpQuaternion);object3d.scale.lerp(targetObject3d.scale,parameters.lerpScale)}};var THREEx=THREEx||{};THREEx.ArSmoothedControls=function(object3d,parameters){var _this=this;THREEx.ArBaseControls.call(this,object3d);this.object3d.visible=false;this._lastLerpStepAt=null;this._visibleStartedAt=null;this._unvisibleStartedAt=null;parameters=parameters||{};this.parameters={lerpPosition:parameters.lerpPosition!==undefined?parameters.lerpPosition:.8,lerpQuaternion:parameters.lerpQuaternion!==undefined?parameters.lerpQuaternion:.2,lerpScale:parameters.lerpScale!==undefined?parameters.lerpScale:.7,lerpStepDelay:parameters.fixStepDelay!==undefined?parameters.fixStepDelay:1/60,minVisibleDelay:parameters.minVisibleDelay!==undefined?parameters.minVisibleDelay:0,minUnvisibleDelay:parameters.minUnvisibleDelay!==undefined?parameters.minUnvisibleDelay:.2}};THREEx.ArSmoothedControls.prototype=Object.create(THREEx.ArBaseControls.prototype);THREEx.ArSmoothedControls.prototype.constructor=THREEx.ArSmoothedControls;THREEx.ArSmoothedControls.prototype.update=function(targetObject3d){var object3d=this.object3d;var parameters=this.parameters;var wasVisible=object3d.visible;var present=performance.now()/1e3;if(targetObject3d.visible===false)this._visibleStartedAt=null;if(targetObject3d.visible===true)this._unvisibleStartedAt=null;if(targetObject3d.visible===true&&this._visibleStartedAt===null)this._visibleStartedAt=present;if(targetObject3d.visible===false&&this._unvisibleStartedAt===null)this._unvisibleStartedAt=present;if(wasVisible===false&&targetObject3d.visible===true){var visibleFor=present-this._visibleStartedAt;if(visibleFor>=this.parameters.minVisibleDelay){object3d.visible=true;snapDirectlyToTarget()}}if(wasVisible===true&&targetObject3d.visible===false){var unvisibleFor=present-this._unvisibleStartedAt;if(unvisibleFor>=this.parameters.minUnvisibleDelay){object3d.visible=false}}if(this._lastLerpStepAt===null){applyOneSlerpStep();this._lastLerpStepAt=present}else{var nStepsToDo=Math.floor((present-this._lastLerpStepAt)/this.parameters.lerpStepDelay);for(var i=0;i<nStepsToDo;i++){applyOneSlerpStep();this._lastLerpStepAt+=this.parameters.lerpStepDelay}}if(false){snapDirectlyToTarget()}this.object3d.updateMatrix();if(wasVisible===false&&object3d.visible===true){this.dispatchEvent({type:"becameVisible"})}if(wasVisible===true&&object3d.visible===false){this.dispatchEvent({type:"becameUnVisible"})}return;function snapDirectlyToTarget(){object3d.position.copy(targetObject3d.position);object3d.quaternion.copy(targetObject3d.quaternion);object3d.scale.copy(targetObject3d.scale)}function applyOneSlerpStep(){object3d.position.lerp(targetObject3d.position,parameters.lerpPosition);object3d.quaternion.slerp(targetObject3d.quaternion,parameters.lerpQuaternion);object3d.scale.lerp(targetObject3d.scale,parameters.lerpScale)}};var THREEx=THREEx||{};THREEx.ArToolkitContext=function(parameters){var _this=this;_this._updatedAt=null;this.parameters={trackingBackend:parameters.trackingBackend!==undefined?parameters.trackingBackend:"artoolkit",debug:parameters.debug!==undefined?parameters.debug:false,detectionMode:parameters.detectionMode!==undefined?parameters.detectionMode:"color_and_matrix",matrixCodeType:parameters.matrixCodeType!==undefined?parameters.matrixCodeType:"3x3",cameraParametersUrl:parameters.cameraParametersUrl!==undefined?parameters.cameraParametersUrl:THREEx.ArToolkitContext.baseURL+"parameters/camera_para.dat",maxDetectionRate:parameters.maxDetectionRate!==undefined?parameters.maxDetectionRate:60,canvasWidth:parameters.canvasWidth!==undefined?parameters.canvasWidth:640,canvasHeight:parameters.canvasHeight!==undefined?parameters.canvasHeight:480,imageSmoothingEnabled:parameters.imageSmoothingEnabled!==undefined?parameters.imageSmoothingEnabled:false};console.assert(["artoolkit","aruco","tango"].indexOf(this.parameters.trackingBackend)!==-1,"invalid parameter trackingBackend",this.parameters.trackingBackend);console.assert(["color","color_and_matrix","mono","mono_and_matrix"].indexOf(this.parameters.detectionMode)!==-1,"invalid parameter detectionMode",this.parameters.detectionMode);this.arController=null;this.arucoContext=null;this._arMarkersControls=[]};Object.assign(THREEx.ArToolkitContext.prototype,THREE.EventDispatcher.prototype);THREEx.ArToolkitContext.baseURL="https://jeromeetienne.github.io/AR.js/three.js/";THREEx.ArToolkitContext.REVISION="1.0.1-dev";THREEx.ArToolkitContext.prototype.init=function(onCompleted){if(this.parameters.trackingBackend==="artoolkit"){this._initArtoolkit(onCompleted)}else if(this.parameters.trackingBackend==="aruco"){this._initAruco(onCompleted)}else if(this.parameters.trackingBackend==="tango"){this._initTango(onCompleted)}else console.assert(false)};THREEx.ArToolkitContext.prototype.update=function(srcElement){if(this.parameters.trackingBackend==="artoolkit"&&this.arController===null)return false;var present=performance.now();if(this._updatedAt!==null&&present-this._updatedAt<1e3/this.parameters.maxDetectionRate){return false}this._updatedAt=present;this._arMarkersControls.forEach(function(markerControls){markerControls.object3d.visible=false});if(this.parameters.trackingBackend==="artoolkit"){this._updateArtoolkit(srcElement)}else if(this.parameters.trackingBackend==="aruco"){this._updateAruco(srcElement)}else if(this.parameters.trackingBackend==="tango"){this._updateTango(srcElement)}else{console.assert(false)}this.dispatchEvent({type:"sourceProcessed"});return true};THREEx.ArToolkitContext.prototype.addMarker=function(arMarkerControls){console.assert(arMarkerControls instanceof THREEx.ArMarkerControls);this._arMarkersControls.push(arMarkerControls)};THREEx.ArToolkitContext.prototype.removeMarker=function(arMarkerControls){console.assert(arMarkerControls instanceof THREEx.ArMarkerControls);var index=this.arMarkerControlss.indexOf(artoolkitMarker);console.assert(index!==index);this._arMarkersControls.splice(index,1)};THREEx.ArToolkitContext.prototype._initArtoolkit=function(onCompleted){var _this=this;this._artoolkitProjectionAxisTransformMatrix=new THREE.Matrix4;this._artoolkitProjectionAxisTransformMatrix.multiply((new THREE.Matrix4).makeRotationY(Math.PI));this._artoolkitProjectionAxisTransformMatrix.multiply((new THREE.Matrix4).makeRotationZ(Math.PI));var cameraParameters=new ARCameraParam(_this.parameters.cameraParametersUrl,function(){var arController=new ARController(_this.parameters.canvasWidth,_this.parameters.canvasHeight,cameraParameters);_this.arController=arController;arController.ctx.mozImageSmoothingEnabled=_this.parameters.imageSmoothingEnabled;arController.ctx.webkitImageSmoothingEnabled=_this.parameters.imageSmoothingEnabled;arController.ctx.msImageSmoothingEnabled=_this.parameters.imageSmoothingEnabled;arController.ctx.imageSmoothingEnabled=_this.parameters.imageSmoothingEnabled;if(_this.parameters.debug===true){arController.debugSetup();arController.canvas.style.position="absolute";arController.canvas.style.top="0px";arController.canvas.style.opacity="0.6";arController.canvas.style.pointerEvents="none";arController.canvas.style.zIndex="-1"}var detectionModes={color:artoolkit.AR_TEMPLATE_MATCHING_COLOR,color_and_matrix:artoolkit.AR_TEMPLATE_MATCHING_COLOR_AND_MATRIX,mono:artoolkit.AR_TEMPLATE_MATCHING_MONO,mono_and_matrix:artoolkit.AR_TEMPLATE_MATCHING_MONO_AND_MATRIX};var detectionMode=detectionModes[_this.parameters.detectionMode];console.assert(detectionMode!==undefined);arController.setPatternDetectionMode(detectionMode);var matrixCodeTypes={"3x3":artoolkit.AR_MATRIX_CODE_3x3,"3x3_HAMMING63":artoolkit.AR_MATRIX_CODE_3x3_HAMMING63,"3x3_PARITY65":artoolkit.AR_MATRIX_CODE_3x3_PARITY65,"4x4":artoolkit.AR_MATRIX_CODE_4x4,"4x4_BCH_13_9_3":artoolkit.AR_MATRIX_CODE_4x4_BCH_13_9_3,"4x4_BCH_13_5_5":artoolkit.AR_MATRIX_CODE_4x4_BCH_13_5_5};var matrixCodeType=matrixCodeTypes[_this.parameters.matrixCodeType];console.assert(matrixCodeType!==undefined);arController.setMatrixCodeType(matrixCodeType);onCompleted&&onCompleted()});return this};THREEx.ArToolkitContext.prototype.getProjectionMatrix=function(srcElement){if(this.parameters.trackingBackend==="aruco"){console.assert(false,"dont call this function with aruco")}else if(this.parameters.trackingBackend==="artoolkit"){console.assert(this.arController,"arController MUST be initialized to call this function");var projectionMatrixArr=this.arController.getCameraMatrix();var projectionMatrix=(new THREE.Matrix4).fromArray(projectionMatrixArr)}else console.assert(false);projectionMatrix.multiply(this._artoolkitProjectionAxisTransformMatrix);return projectionMatrix};THREEx.ArToolkitContext.prototype._updateArtoolkit=function(srcElement){this.arController.process(srcElement)};THREEx.ArToolkitContext.prototype._initAruco=function(onCompleted){this.arucoContext=new THREEx.ArucoContext;this.arucoContext.canvas.width=this.parameters.canvasWidth;this.arucoContext.canvas.height=this.parameters.canvasHeight;
var context=this.arucoContext.canvas.getContext("2d");context.webkitImageSmoothingEnabled=this.parameters.imageSmoothingEnabled;context.msImageSmoothingEnabled=this.parameters.imageSmoothingEnabled;context.imageSmoothingEnabled=this.parameters.imageSmoothingEnabled;setTimeout(function(){onCompleted&&onCompleted()},0)};THREEx.ArToolkitContext.prototype._updateAruco=function(srcElement){var _this=this;var arMarkersControls=this._arMarkersControls;var detectedMarkers=this.arucoContext.detect(srcElement);detectedMarkers.forEach(function(detectedMarker){var foundControls=null;for(var i=0;i<arMarkersControls.length;i++){console.assert(arMarkersControls[i].parameters.type==="barcode");if(arMarkersControls[i].parameters.barcodeValue===detectedMarker.id){foundControls=arMarkersControls[i];break}}if(foundControls===null)return;var tmpObject3d=new THREE.Object3D;_this.arucoContext.updateObject3D(tmpObject3d,foundControls._arucoPosit,foundControls.parameters.size,detectedMarker);tmpObject3d.updateMatrix();foundControls.updateWithModelViewMatrix(tmpObject3d.matrix)})};THREEx.ArToolkitContext.prototype._initTango=function(onCompleted){var _this=this;if(navigator.getVRDisplays){}else if(navigator.getVRDevices){alert("Your browser supports WebVR but not the latest version. See <a href='http://webvr.info'>webvr.info</a> for more info.")}else{alert("Your browser does not support WebVR. See <a href='http://webvr.info'>webvr.info</a> for assistance.")}this._tangoContext={vrDisplay:null,frameData:new VRFrameData};navigator.getVRDisplays().then(function(vrDisplays){if(vrDisplays.length===0)alert("no vrDisplays available");var vrDisplay=vrDisplays[0];_this._tangoContext.vrDisplay=vrDisplay;console.log("vrDisplays.displayName :",vrDisplay.displayName);var canvasElement=document.createElement("canvas");document.body.appendChild(canvasElement);var layers=[{source:canvasElement}];onCompleted&&onCompleted()})};THREEx.ArToolkitContext.prototype._updateTango=function(srcElement){var _this=this;var arMarkersControls=this._arMarkersControls;var tangoContext=this._tangoContext;if(tangoContext.vrDisplay===null)return;if(this._arMarkersControls.length===0)return;var foundControls=this._arMarkersControls[0];var frameData=this._tangoContext.frameData;tangoContext.vrDisplay.getFrameData(frameData);var position=(new THREE.Vector3).fromArray(frameData.pose.position);var quaternion=(new THREE.Quaternion).fromArray(frameData.pose.orientation);var scale=new THREE.Vector3(1,1,1);var cameraTransformMatrix=(new THREE.Matrix4).compose(position,quaternion,scale);var modelViewMatrix=new THREE.Matrix4;modelViewMatrix.getInverse(cameraTransformMatrix);console.log("position",position);foundControls.updateWithModelViewMatrix(modelViewMatrix)};var THREEx=THREEx||{};THREEx.ArToolkitProfile=function(){this.reset();this.performance("default")};THREEx.ArToolkitProfile.prototype._guessPerformanceLabel=function(){var isMobile=navigator.userAgent.match(/Android/i)||navigator.userAgent.match(/webOS/i)||navigator.userAgent.match(/iPhone/i)||navigator.userAgent.match(/iPad/i)||navigator.userAgent.match(/iPod/i)||navigator.userAgent.match(/BlackBerry/i)||navigator.userAgent.match(/Windows Phone/i)?true:false;if(isMobile===true){return"phone-normal"}return"desktop-normal"};THREEx.ArToolkitProfile.prototype.reset=function(){this.sourceParameters={sourceType:"webcam"};this.contextParameters={cameraParametersUrl:THREEx.ArToolkitContext.baseURL+"../data/data/camera_para.dat",detectionMode:"mono"};this.defaultMarkerParameters={type:"pattern",patternUrl:THREEx.ArToolkitContext.baseURL+"../data/data/patt.hiro"};return this};THREEx.ArToolkitProfile.prototype.performance=function(label){if(label==="default"){label=this._guessPerformanceLabel()}if(label==="desktop-fast"){this.contextParameters.sourceWidth=640*3;this.contextParameters.sourceHeight=480*3;this.contextParameters.maxDetectionRate=30}else if(label==="desktop-normal"){this.contextParameters.sourceWidth=640;this.contextParameters.sourceHeight=480;this.contextParameters.maxDetectionRate=60}else if(label==="phone-normal"){this.contextParameters.sourceWidth=80*4;this.contextParameters.sourceHeight=60*4;this.contextParameters.maxDetectionRate=30}else if(label==="phone-slow"){this.contextParameters.sourceWidth=80*3;this.contextParameters.sourceHeight=60*3;this.contextParameters.maxDetectionRate=30}else{console.assert(false,"unknonwn label "+label)}};THREEx.ArToolkitProfile.prototype.kanjiMarker=function(){this.contextParameters.detectionMode="mono";this.defaultMarkerParameters.type="pattern";this.defaultMarkerParameters.patternUrl=THREEx.ArToolkitContext.baseURL+"../data/data/patt.kanji";return this};THREEx.ArToolkitProfile.prototype.hiroMarker=function(){this.contextParameters.detectionMode="mono";this.defaultMarkerParameters.type="pattern";this.defaultMarkerParameters.patternUrl=THREEx.ArToolkitContext.baseURL+"../data/data/patt.hiro";return this};THREEx.ArToolkitProfile.prototype.sourceWebcam=function(){this.sourceParameters.sourceType="webcam";delete this.sourceParameters.sourceUrl;return this};THREEx.ArToolkitProfile.prototype.sourceVideo=function(url){this.sourceParameters.sourceType="video";this.sourceParameters.sourceUrl=url;return this};THREEx.ArToolkitProfile.prototype.sourceImage=function(url){this.sourceParameters.sourceType="image";this.sourceParameters.sourceUrl=url;return this};THREEx.ArToolkitProfile.prototype.trackingBackend=function(trackingBackend){this.contextParameters.trackingBackend=trackingBackend};var THREEx=THREEx||{};THREEx.ArToolkitSource=function(parameters){this.parameters={sourceType:parameters.sourceType!==undefined?parameters.sourceType:"webcam",sourceUrl:parameters.sourceUrl!==undefined?parameters.sourceUrl:null,sourceWidth:parameters.sourceWidth!==undefined?parameters.sourceWidth:640,sourceHeight:parameters.sourceHeight!==undefined?parameters.sourceHeight:480,displayWidth:parameters.displayWidth!==undefined?parameters.displayWidth:640,displayHeight:parameters.displayHeight!==undefined?parameters.displayHeight:480};this.ready=false;this.domElement=null};THREEx.ArToolkitSource.prototype.init=function(onReady){var _this=this;if(this.parameters.sourceType==="image"){var domElement=this._initSourceImage(onSourceReady)}else if(this.parameters.sourceType==="video"){var domElement=this._initSourceVideo(onSourceReady)}else if(this.parameters.sourceType==="webcam"){var domElement=this._initSourceWebcam(onSourceReady)}else{console.assert(false)}this.domElement=domElement;this.domElement.style.position="absolute";this.domElement.style.top="0px";this.domElement.style.left="0px";this.domElement.style.zIndex="-2";return this;function onSourceReady(){document.body.appendChild(_this.domElement);_this.ready=true;onReady&&onReady()}};THREEx.ArToolkitSource.prototype._initSourceImage=function(onReady){var domElement=document.createElement("img");domElement.src=this.parameters.sourceUrl;domElement.width=this.parameters.sourceWidth;domElement.height=this.parameters.sourceHeight;domElement.style.width=this.parameters.displayWidth+"px";domElement.style.height=this.parameters.displayHeight+"px";var interval=setInterval(function(){if(!domElement.naturalWidth)return;onReady();clearInterval(interval)},1e3/50);return domElement};THREEx.ArToolkitSource.prototype._initSourceVideo=function(onReady){var domElement=document.createElement("video");domElement.src=this.parameters.sourceUrl;domElement.style.objectFit="initial";domElement.autoplay=true;domElement.webkitPlaysinline=true;domElement.controls=false;domElement.loop=true;domElement.muted=true;document.body.addEventListener("click",function onClick(){document.body.removeEventListener("click",onClick);domElement.play()});domElement.width=this.parameters.sourceWidth;domElement.height=this.parameters.sourceHeight;domElement.style.width=this.parameters.displayWidth+"px";domElement.style.height=this.parameters.displayHeight+"px";var interval=setInterval(function(){if(!domElement.videoWidth)return;onReady();clearInterval(interval)},1e3/50);return domElement};THREEx.ArToolkitSource.prototype._initSourceWebcam=function(onReady){var _this=this;var domElement=document.createElement("video");domElement.setAttribute("autoplay","");domElement.setAttribute("muted","");domElement.setAttribute("playsinline","");domElement.style.width=this.parameters.displayWidth+"px";domElement.style.height=this.parameters.displayHeight+"px";if(navigator.mediaDevices===undefined||navigator.mediaDevices.enumerateDevices===undefined||navigator.mediaDevices.getUserMedia===undefined){alert("WebRTC issue! navigator.mediaDevices.enumerateDevices not present in your browser")}navigator.mediaDevices.enumerateDevices().then(function(devices){var userMediaConstraints={audio:false,video:{facingMode:"environment",width:{ideal:_this.parameters.sourceWidth},height:{ideal:_this.parameters.sourceHeight}}};navigator.mediaDevices.getUserMedia(userMediaConstraints).then(function success(stream){domElement.srcObject=stream;document.body.addEventListener("click",function(){domElement.play()});var interval=setInterval(function(){if(!domElement.videoWidth)return;onReady();clearInterval(interval)},1e3/50)}).catch(function(error){console.log("Can't access user media",error);alert("Can't access user media :()")})}).catch(function(err){console.log(err.name+": "+err.message)});return domElement};THREEx.ArToolkitSource.prototype.hasMobileTorch=function(){var stream=arToolkitSource.domElement.srcObject;if(stream instanceof MediaStream===false)return false;if(this._currentTorchStatus===undefined){this._currentTorchStatus=false}var videoTrack=stream.getVideoTracks()[0];var capabilities=videoTrack.getCapabilities();return capabilities.torch?true:false};THREEx.ArToolkitSource.prototype.toggleMobileTorch=function(){var stream=arToolkitSource.domElement.srcObject;if(stream instanceof MediaStream===false){alert("enabling mobile torch is available only on webcam");return}if(this._currentTorchStatus===undefined){this._currentTorchStatus=false}var videoTrack=stream.getVideoTracks()[0];var capabilities=videoTrack.getCapabilities();if(!capabilities.torch){alert("no mobile torch is available on your camera");return}this._currentTorchStatus=this._currentTorchStatus===false?true:false;videoTrack.applyConstraints({advanced:[{torch:this._currentTorchStatus}]}).catch(function(error){console.log(error)})};THREEx.ArToolkitSource.prototype.onResize=function(mirrorDomElements){var _this=this;var screenWidth=window.innerWidth;var screenHeight=window.innerHeight;if(this.domElement.nodeName==="IMG"){var sourceWidth=this.domElement.naturalWidth;var sourceHeight=this.domElement.naturalHeight}else if(this.domElement.nodeName==="VIDEO"){var sourceWidth=this.domElement.videoWidth;var sourceHeight=this.domElement.videoHeight}else{console.assert(false)}var sourceAspect=sourceWidth/sourceHeight;var screenAspect=screenWidth/screenHeight;if(screenAspect<sourceAspect){var newWidth=sourceAspect*screenHeight;this.domElement.style.width=newWidth+"px";this.domElement.style.marginLeft=-(newWidth-screenWidth)/2+"px";this.domElement.style.height=screenHeight+"px";this.domElement.style.marginTop="0px"}else{var newHeight=1/(sourceAspect/screenWidth);this.domElement.style.height=newHeight+"px";this.domElement.style.marginTop=-(newHeight-screenHeight)/2+"px";this.domElement.style.width=screenWidth+"px";this.domElement.style.marginLeft="0px"}if(mirrorDomElements===undefined)mirrorDomElements=[];if(mirrorDomElements instanceof Array===false)mirrorDomElements=[mirrorDomElements];mirrorDomElements.forEach(function(domElement){_this.copySizeTo(domElement)})};THREEx.ArToolkitSource.prototype.copySizeTo=function(otherElement){otherElement.style.width=this.domElement.style.width;otherElement.style.height=this.domElement.style.height;otherElement.style.marginLeft=this.domElement.style.marginLeft;otherElement.style.marginTop=this.domElement.style.marginTop};var THREEx=THREEx||{};THREEx.ArVideoInWebgl=function(videoTexture){var _this=this;var geometry=new THREE.PlaneGeometry(2,2);var material=new THREE.MeshBasicMaterial({map:videoTexture});var seethruPlane=new THREE.Mesh(geometry,material);this.object3d=seethruPlane;this.update=function(camera){camera.updateMatrixWorld(true);var position=new THREE.Vector3(-0,0,-20);var position=new THREE.Vector3(-0,0,-20);seethruPlane.position.copy(position);camera.localToWorld(seethruPlane.position);camera.matrixWorld.decompose(camera.position,camera.quaternion,camera.scale);seethruPlane.quaternion.copy(camera.quaternion);var fov=THREE.Math.radToDeg(Math.atan(1/camera.projectionMatrix.elements[5]))*2;var elementWidth=parseFloat(arToolkitSource.domElement.style.width.replace(/px$/,""),10);var elementHeight=parseFloat(arToolkitSource.domElement.style.height.replace(/px$/,""),10);var aspect=elementWidth/elementHeight;seethruPlane.scale.y=Math.tan(THREE.Math.DEG2RAD*fov/2)*position.length();seethruPlane.scale.x=seethruPlane.scale.y*aspect}};function ARToolKitFrameData(arToolKitSourceOptions,arToolKitContextOptions,arMarkerControlsOptions){var _this=this;_this.started=false;var camera=new THREE.Camera;_this._camera=camera;this.update=function(){if(arToolkitSource.ready===false)return;arToolkitContext.update(arToolkitSource.domElement)};this.resetPose=function(){};this.dispose=function(){};this.updateFrameData=function(dstFrameData){dstFrameData.timestamp=Date.now();camera.projectionMatrix.toArray(dstFrameData.leftProjectionMatrix);camera.projectionMatrix.toArray(dstFrameData.rightProjectionMatrix);var modelViewMatrix=(new THREE.Matrix4).getInverse(camera.matrix);modelViewMatrix.toArray(dstFrameData.leftViewMatrix);modelViewMatrix.toArray(dstFrameData.rightViewMatrix);camera.position.toArray(dstFrameData.pose.position);camera.quaternion.toArray(dstFrameData.pose.orientation)};var arToolkitSource=new THREEx.ArToolkitSource(arToolKitSourceOptions);arToolkitSource.init(function onReady(){arToolkitSource.onResize()});window.addEventListener("resize",function(){arToolkitSource.onResize()});var arToolkitContext=new THREEx.ArToolkitContext(arToolKitContextOptions);arToolkitContext.init(function onCompleted(){var projectionMatrix=arToolkitContext.arController.getCameraMatrix();camera.projectionMatrix.fromArray(projectionMatrix);_this.started=true});var markerControls=new THREEx.ArMarkerControls(arToolkitContext,camera,arMarkerControlsOptions)}var WebVRPolyfill=function(){};WebVRPolyfill.prototype.install=function(){var framedataProvider=null;this.setFrameDataProvider=function(newFrameDataProvider){framedataProvider=newFrameDataProvider};navigator.getVRDisplays=function(){var vrDisplays=[new VRDisplay];return new Promise(function(resolve,reject){resolve(vrDisplays)})};window.VRFrameData=function(){var frameData=this;this.timestamp=Date.now();this.leftProjectionMatrix=new Float32Array(16);this.leftViewMatrix=new Float32Array(16);this.rightProjectionMatrix=new Float32Array(16);this.rightViewMatrix=new Float32Array(16);this.pose={};this.pose.position=new Float32Array([0,0,0]);this.pose.orientation=new Float32Array([0,0,0,1])};window.VREyeParameters=function(whichEye){this.offset=new Float32Array([0,0,0]);if(whichEye==="right"){this.offset[0]=+.03}else if(whichEye==="left"){this.offset[0]=-.03}else{console.assert(false)}this.fieldOfView={upDegrees:+30,rightDegrees:+30,downDegrees:-30,leftDegrees:-30};this.renderWidth=window.innerWidth/2;this.renderHeight=window.innerHeight};window.VRDisplay=function(){this.isConnected=true;this.isPresenting=false;this.displayId=0;this.displayName="Generic WebVR Polyfill";this.depthNear=.1;this.depthFar=1e4;this.capabilities={hasPosition:true,hasOrientation:true,hasExternalDisplay:false,canPresent:true,maxLayers:1};this.stageParameters={sittingToStandingTransform:new Float32Array(16),sizeX:3,sizeY:3}};VRDisplay.prototype.getFrameData=function(frameData){if(!framedataProvider)return;framedataProvider.updateFrameData(frameData)};VRDisplay.prototype.getEyeParameters=function(whichEye){return new VREyeParameters(whichEye)};VRDisplay.prototype.getPose=function(){console.assert("not yet implemented, Deprecated anyway")};VRDisplay.prototype.resetPose=function(frameData){console.assert("not yet implemented");if(!framedataProvider)return;framedataProvider.resetPose()};VRDisplay.prototype.requestAnimationFrame=function(callback){return window.requestAnimationFrame(callback)};VRDisplay.prototype.cancelAnimationFrame=function(handle){return window.cancelAnimationFrame(handle)};VRDisplay.prototype.getLayers=function(){return[]};VRDisplay.prototype.requestPresent=function(layers){var _this=this;this._layers=layers;console.log("requestPresent");return new Promise(function(resolve,reject){loop();return;function loop(){if(framedataProvider.started===true){completed();return}setTimeout(loop,1e3/10)}function completed(){_this.isPresenting=true;console.log("dispatch vrdisplaypresentchange on requestPresent");var event=new Event("vrdisplaypresentchange");window.dispatchEvent(event);resolve()}})};VRDisplay.prototype.exitPresent=function(){var _this=this;console.log("exitPresent");return new Promise(function(resolve,reject){_this.isPresenting=false;console.log("dispatch vrdisplaypresentchange on exitPresent");var event=new Event("vrdisplaypresentchange");window.dispatchEvent(event);resolve()})};VRDisplay.prototype.submitFrame=function(){};return this};(function(){var arToolkitSourceOptions={sourceType:"video",sourceUrl:"../../data/videos/headtracking.mp4",displayWidth:640,displayHeight:480};var arToolKitContextOptions={cameraParametersUrl:"../../data/data/camera_para.dat",detectionMode:"mono"};var arMarkerControlsOptions={type:"pattern",patternUrl:"../../data/data/patt.kanji",changeMatrixMode:"cameraTransformMatrix"};var arToolKitFrameData=new ARToolKitFrameData(arToolkitSourceOptions,arToolKitContextOptions,arMarkerControlsOptions);requestAnimationFrame(function loop(){requestAnimationFrame(loop);arToolKitFrameData.update()});var webvrPolyfill=(new WebVRPolyfill).install();webvrPolyfill.setFrameDataProvider(arToolKitFrameData);requestAnimationFrame(function loop(){requestAnimationFrame(loop);var camera=window.camera;if(camera===undefined)return;camera.projectionMatrix.copy(arToolKitFrameData._camera.projectionMatrix)})})();
if(configuration.width){mediaDevicesConstraints.width=configuration.width;if(typeof configuration.width==="object"){if(configuration.width.max){constraints.maxWidth=configuration.width.max}if(configuration.width.min){constraints.minWidth=configuration.width.max}}else{constraints.maxWidth=configuration.width}}if(configuration.height){mediaDevicesConstraints.height=configuration.height;if(typeof configuration.height==="object"){if(configuration.height.max){constraints.maxHeight=configuration.height.max}if(configuration.height.min){constraints.minHeight=configuration.height.max}}else{constraints.maxHeight=configuration.height}}mediaDevicesConstraints.facingMode=facing;navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia;var hdConstraints={audio:false,video:{mandatory:constraints}};if(false){if(navigator.mediaDevices){navigator.mediaDevices.getUserMedia({audio:false,video:mediaDevicesConstraints}).then(success,onError)}else{MediaStreamTrack.getSources(function(sources){var facingDir=mediaDevicesConstraints.facingMode;if(facing&&facing.exact){facingDir=facing.exact}for(var i=0;i<sources.length;i++){if(sources[i].kind==="video"&&sources[i].facing===facingDir){hdConstraints.video.mandatory.sourceId=sources[i].id;break}}if(facing&&facing.exact&&!hdConstraints.video.mandatory.sourceId){onError("Failed to get camera facing the wanted direction")}else{if(navigator.getUserMedia){navigator.getUserMedia(hdConstraints,success,onError)}else{onError("navigator.getUserMedia is not supported on your browser")}}})}}else{if(navigator.getUserMedia){navigator.getUserMedia(hdConstraints,success,onError)}else{onError("navigator.getUserMedia is not supported on your browser")}}return video};ARController.getUserMediaARController=function(configuration){var obj={};for(var i in configuration){obj[i]=configuration[i]}var onSuccess=configuration.onSuccess;var cameraParamURL=configuration.cameraParam;obj.onSuccess=function(){new ARCameraParam(cameraParamURL,function(){var arCameraParam=this;var maxSize=configuration.maxARVideoSize||Math.max(video.videoWidth,video.videoHeight);var f=maxSize/Math.max(video.videoWidth,video.videoHeight);var w=f*video.videoWidth;var h=f*video.videoHeight;if(video.videoWidth<video.videoHeight){var tmp=w;w=h;h=tmp}var arController=new ARController(w,h,arCameraParam);arController.image=video;if(video.videoWidth<video.videoHeight){arController.orientation="portrait";arController.videoWidth=video.videoHeight;arController.videoHeight=video.videoWidth}else{arController.orientation="landscape";arController.videoWidth=video.videoWidth;arController.videoHeight=video.videoHeight}onSuccess(arController,arCameraParam)},function(err){console.error("ARController: Failed to load ARCameraParam",err)})};var video=this.getUserMedia(obj);return video};var ARCameraParam=function(src,onload,onerror){this.id=-1;this._src="";this.complete=false;this.onload=onload;this.onerror=onerror;if(src){this.load(src)}};ARCameraParam.prototype.load=function(src){if(this._src!==""){throw"ARCameraParam: Trying to load camera parameters twice."}this._src=src;if(src){var self=this;artoolkit.loadCamera(src,function(id){self.id=id;self.complete=true;self.onload()},function(err){self.onerror(err)})}};Object.defineProperty(ARCameraParam.prototype,"src",{set:function(src){this.load(src)},get:function(){return this._src}});ARCameraParam.prototype.dispose=function(){if(this.id!==-1){artoolkit.deleteCamera(this.id)}this.id=-1;this._src="";this.complete=false};var artoolkit={UNKNOWN_MARKER:-1,PATTERN_MARKER:0,BARCODE_MARKER:1,loadCamera:loadCamera,addMarker:addMarker,addMultiMarker:addMultiMarker};var FUNCTIONS=["setup","teardown","setLogLevel","getLogLevel","setDebugMode","getDebugMode","getProcessingImage","setMarkerInfoDir","setMarkerInfoVertex","getTransMatSquare","getTransMatSquareCont","getTransMatMultiSquare","getTransMatMultiSquareRobust","getMultiMarkerNum","getMultiMarkerCount","detectMarker","getMarkerNum","getMarker","getMultiEachMarker","setProjectionNearPlane","getProjectionNearPlane","setProjectionFarPlane","getProjectionFarPlane","setThresholdMode","getThresholdMode","setThreshold","getThreshold","setPatternDetectionMode","getPatternDetectionMode","setMatrixCodeType","getMatrixCodeType","setLabelingMode","getLabelingMode","setPattRatio","getPattRatio","setImageProcMode","getImageProcMode"];function runWhenLoaded(){FUNCTIONS.forEach(function(n){artoolkit[n]=Module[n]});for(var m in Module){if(m.match(/^AR/))artoolkit[m]=Module[m]}}var marker_count=0;function addMarker(arId,url,callback){var filename="/marker_"+marker_count++;ajax(url,filename,function(){var id=Module._addMarker(arId,filename);if(callback)callback(id)})}function bytesToString(array){return String.fromCharCode.apply(String,array)}function parseMultiFile(bytes){var str=bytesToString(bytes);var lines=str.split("\n");var files=[];var state=0;var markers=0;lines.forEach(function(line){line=line.trim();if(!line||line.startsWith("#"))return;switch(state){case 0:markers=+line;state=1;return;case 1:if(!line.match(/^\d+$/)){files.push(line)}case 2:case 3:case 4:state++;return;case 5:state=1;return}});return files}var multi_marker_count=0;function addMultiMarker(arId,url,callback){var filename="/multi_marker_"+multi_marker_count++;ajax(url,filename,function(bytes){var files=parseMultiFile(bytes);function ok(){var markerID=Module._addMultiMarker(arId,filename);var markerNum=Module.getMultiMarkerNum(arId,markerID);if(callback)callback(markerID,markerNum)}if(!files.length)return ok();var path=url.split("/").slice(0,-1).join("/");files=files.map(function(file){if(file==="patt.hiro"||file==="patt.kanji"||file==="patt2.hiro"||file==="patt2.kanji"){return["http://127.0.0.1:8080/data/data/"+file,file]}return[path+"/"+file,file]});ajaxDependencies(files,ok)})}var camera_count=0;function loadCamera(url,callback){var filename="/camera_param_"+camera_count++;var writeCallback=function(){var id=Module._loadCamera(filename);if(callback)callback(id)};if(typeof url==="object"){writeByteArrayToFS(filename,url,writeCallback)}else if(url.indexOf("\n")>-1){writeStringToFS(filename,url,writeCallback)}else{ajax(url,filename,writeCallback)}}function writeStringToFS(target,string,callback){var byteArray=new Uint8Array(string.length);for(var i=0;i<byteArray.length;i++){byteArray[i]=string.charCodeAt(i)&255}writeByteArrayToFS(target,byteArray,callback)}function writeByteArrayToFS(target,byteArray,callback){FS.writeFile(target,byteArray,{encoding:"binary"});callback(byteArray)}function ajax(url,target,callback){var oReq=new XMLHttpRequest;oReq.open("GET",url,true);oReq.responseType="arraybuffer";oReq.onload=function(oEvent){var arrayBuffer=oReq.response;var byteArray=new Uint8Array(arrayBuffer);writeByteArrayToFS(target,byteArray,callback)};oReq.send()}function ajaxDependencies(files,callback){var next=files.pop();if(next){ajax(next[0],next[1],function(){ajaxDependencies(files,callback)})}else{callback()}}window.artoolkit=artoolkit;window.ARController=ARController;window.ARCameraParam=ARCameraParam;if(window.Module){runWhenLoaded()}else{window.Module={onRuntimeInitialized:function(){runWhenLoaded()}}}})();var THREEx=THREEx||{};THREEx.ArBaseControls=function(object3d){this.id=THREEx.ArBaseControls.id++;this.object3d=object3d;this.object3d.matrixAutoUpdate=false;this.object3d.visible=false};THREEx.ArBaseControls.id=0;Object.assign(THREEx.ArBaseControls.prototype,THREE.EventDispatcher.prototype);THREEx.ArBaseControls.prototype.update=function(){console.assert(false,"you need to implement your own update")};THREEx.ArBaseControls.prototype.name=function(){console.assert(false,"you need to implement your own .name()");return"Not yet implemented - name()"};var THREEx=THREEx||{};THREEx.ARClickability=function(sourceElement){this._sourceElement=sourceElement;var fullWidth=parseInt(sourceElement.style.width);var fullHeight=parseInt(sourceElement.style.height);this._cameraPicking=new THREE.PerspectiveCamera(42,fullWidth/fullHeight,.1,100);console.warn("THREEx.ARClickability works only in modelViewMatrix")};THREEx.ARClickability.prototype.onResize=function(){var sourceElement=this._sourceElement;var cameraPicking=this._cameraPicking;var fullWidth=parseInt(sourceElement.style.width);var fullHeight=parseInt(sourceElement.style.height);cameraPicking.aspect=fullWidth/fullHeight;cameraPicking.updateProjectionMatrix()};THREEx.ARClickability.prototype.computeIntersects=function(domEvent,objects){var sourceElement=this._sourceElement;var cameraPicking=this._cameraPicking;var eventCoords=new THREE.Vector3;eventCoords.x=domEvent.layerX/parseInt(sourceElement.style.width)*2-1;eventCoords.y=-(domEvent.layerY/parseInt(sourceElement.style.height))*2+1;var raycaster=new THREE.Raycaster;raycaster.setFromCamera(eventCoords,cameraPicking);var intersects=raycaster.intersectObjects(objects);return intersects};THREEx.ARClickability.prototype.update=function(){};THREEx.ARClickability.tangoPickingPointCloud=function(artoolkitContext,mouseX,mouseY){var vrDisplay=artoolkitContext._tangoContext.vrDisplay;if(vrDisplay===null)return null;var pointAndPlane=vrDisplay.getPickingPointAndPlaneInPointCloud(mouseX,mouseY);if(pointAndPlane==null){console.warn("Could not retrieve the correct point and plane.");return null}var boundingSphereRadius=.01;var object3d=new THREE.Object3D;THREE.WebAR.positionAndRotateObject3DWithPickingPointAndPlaneInPointCloud(pointAndPlane,object3d,boundingSphereRadius);object3d.rotateZ(-Math.PI/2);var result={};result.position=object3d.position;result.quaternion=object3d.quaternion;return result};var THREEx=THREEx||{};THREEx.ArMarkerCloak=function(videoTexture){var updateInShaderEnabled=true;var geometry=new THREE.PlaneGeometry(1.3+.25,1.85+.25,1,8).translate(0,-.3,0);var material=new THREE.ShaderMaterial({vertexShader:THREEx.ArMarkerCloak.vertexShader,fragmentShader:THREEx.ArMarkerCloak.fragmentShader,transparent:true,uniforms:{texture:{value:videoTexture},opacity:{value:.5}},defines:{updateInShaderEnabled:updateInShaderEnabled?1:0}});var cloakMesh=new THREE.Mesh(geometry,material);cloakMesh.rotation.x=-Math.PI/2;this.object3d=cloakMesh;var xMin=-.65;var xMax=.65;var yMin=.65+.1;var yMax=.95+.1;var originalsFaceVertexUvs=[[]];for(var faceIndex=0;faceIndex<cloakMesh.geometry.faces.length;faceIndex++){originalsFaceVertexUvs[0][faceIndex]=[];originalsFaceVertexUvs[0][faceIndex][0]=new THREE.Vector2;originalsFaceVertexUvs[0][faceIndex][1]=new THREE.Vector2;originalsFaceVertexUvs[0][faceIndex][2]=new THREE.Vector2}for(var i=0;i<cloakMesh.geometry.parameters.heightSegments/2;i++){originalsFaceVertexUvs[0][i*4+0][0].set(xMin/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+0][1].set(xMin/2+.5,yMin/2+.5);originalsFaceVertexUvs[0][i*4+0][2].set(xMax/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+1][0].set(xMin/2+.5,yMin/2+.5);originalsFaceVertexUvs[0][i*4+1][1].set(xMax/2+.5,yMin/2+.5);originalsFaceVertexUvs[0][i*4+1][2].set(xMax/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+2][0].set(xMin/2+.5,yMin/2+.5);originalsFaceVertexUvs[0][i*4+2][1].set(xMin/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+2][2].set(xMax/2+.5,yMin/2+.5);originalsFaceVertexUvs[0][i*4+3][0].set(xMin/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+3][1].set(xMax/2+.5,yMax/2+.5);originalsFaceVertexUvs[0][i*4+3][2].set(xMax/2+.5,yMin/2+.5)}if(updateInShaderEnabled===true){cloakMesh.geometry.faceVertexUvs=originalsFaceVertexUvs;cloakMesh.geometry.uvsNeedUpdate=true}var originalOrthoVertices=[];originalOrthoVertices.push(new THREE.Vector3(xMin,yMax,0));originalOrthoVertices.push(new THREE.Vector3(xMax,yMax,0));originalOrthoVertices.push(new THREE.Vector3(xMin,yMin,0));originalOrthoVertices.push(new THREE.Vector3(xMax,yMin,0));var material=new THREE.MeshNormalMaterial({transparent:true,opacity:.5,side:THREE.DoubleSide});var geometry=new THREE.PlaneGeometry(1,1);var orthoMesh=new THREE.Mesh(geometry,material);this.orthoMesh=orthoMesh;this.update=function(modelViewMatrix,cameraProjectionMatrix){updateOrtho(modelViewMatrix,cameraProjectionMatrix);if(updateInShaderEnabled===false){updateUvs(modelViewMatrix,cameraProjectionMatrix)}};return;function updateUvs(modelViewMatrix,cameraProjectionMatrix){var transformedUv=new THREE.Vector3;originalsFaceVertexUvs[0].forEach(function(faceVertexUvs,faceIndex){faceVertexUvs.forEach(function(originalUv,uvIndex){transformedUv.x=originalUv.x*2-1;transformedUv.y=originalUv.y*2-1;transformedUv.z=0;transformedUv.applyMatrix4(modelViewMatrix);transformedUv.applyMatrix4(cameraProjectionMatrix);transformedUv.x/=transformedUv.z;transformedUv.y/=transformedUv.z;transformedUv.x=transformedUv.x/2+.5;transformedUv.y=transformedUv.y/2+.5;cloakMesh.geometry.faceVertexUvs[0][faceIndex][uvIndex].set(transformedUv.x,transformedUv.y)})});cloakMesh.geometry.uvsNeedUpdate=true}function updateOrtho(modelViewMatrix,cameraProjectionMatrix){var transformedUvs=[];originalOrthoVertices.forEach(function(originalOrthoVertices,index){var transformedUv=originalOrthoVertices.clone();transformedUv.applyMatrix4(modelViewMatrix);transformedUv.applyMatrix4(cameraProjectionMatrix);transformedUv.x/=transformedUv.z;transformedUv.y/=transformedUv.z;transformedUvs.push(transformedUv)});for(var i=0;i<transformedUvs.length;i++){orthoMesh.geometry.vertices[i].copy(transformedUvs[i])}orthoMesh.geometry.computeBoundingSphere();orthoMesh.geometry.verticesNeedUpdate=true}};THREEx.ArMarkerCloak.markerSpaceShaderFunction="\n"+" vec2 transformUvToMarkerSpace(vec2 originalUv){\n"+" vec3 transformedUv;\n"+" // set transformedUv - from UV coord to clip coord\n"+" transformedUv.x = originalUv.x * 2.0 - 1.0;\n"+" transformedUv.y = originalUv.y * 2.0 - 1.0;\n"+" transformedUv.z = 0.0;\n"+"\n"+" // apply modelViewMatrix and projectionMatrix\n"+" transformedUv = (projectionMatrix * modelViewMatrix * vec4( transformedUv, 1.0 ) ).xyz;\n"+"\n"+" // apply perspective\n"+" transformedUv.x /= transformedUv.z;\n"+" transformedUv.y /= transformedUv.z;\n"+"\n"+" // set back from clip coord to Uv coord\n"+" transformedUv.x = transformedUv.x / 2.0 + 0.5;\n"+" transformedUv.y = transformedUv.y / 2.0 + 0.5;\n"+"\n"+" // return the result\n"+" return transformedUv.xy;\n"+" }";THREEx.ArMarkerCloak.vertexShader=THREEx.ArMarkerCloak.markerSpaceShaderFunction+" varying vec2 vUv;\n"+"\n"+" void main(){\n"+" // pass the UV to the fragment\n"+" #if (updateInShaderEnabled == 1)\n"+" vUv = transformUvToMarkerSpace(uv);\n"+" #else\n"+" vUv = uv;\n"+" #endif\n"+"\n"+" // compute gl_Position\n"+" vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n"+" gl_Position = projectionMatrix * mvPosition;\n"+" }";THREEx.ArMarkerCloak.fragmentShader="\n"+" varying vec2 vUv;\n"+" uniform sampler2D texture;\n"+" uniform float opacity;\n"+"\n"+" void main(void){\n"+" vec3 color = texture2D( texture, vUv ).rgb;\n"+"\n"+" gl_FragColor = vec4( color, opacity);\n"+" }";var THREEx=THREEx||{};THREEx.ArMarkerControls=function(context,object3d,parameters){var _this=this;THREEx.ArBaseControls.call(this,object3d);this.context=context;this.parameters={size:parameters.size!==undefined?parameters.size:1,type:parameters.type!==undefined?parameters.type:"unknown",patternUrl:parameters.patternUrl!==undefined?parameters.patternUrl:null,barcodeValue:parameters.barcodeValue!==undefined?parameters.barcodeValue:null,changeMatrixMode:parameters.changeMatrixMode!==undefined?parameters.changeMatrixMode:"modelViewMatrix",minConfidence:parameters.minConfidence!==undefined?parameters.minConfidence:.6};var possibleValues=["pattern","barcode","unknown"];console.assert(possibleValues.indexOf(this.parameters.type)!==-1,"illegal value",this.parameters.type);var possibleValues=["modelViewMatrix","cameraTransformMatrix"];console.assert(possibleValues.indexOf(this.parameters.changeMatrixMode)!==-1,"illegal value",this.parameters.changeMatrixMode);this.object3d=object3d;this.object3d.matrixAutoUpdate=false;this.object3d.visible=false;context.addMarker(this);if(_this.context.parameters.trackingBackend==="artoolkit"){this._initArtoolkit()}else if(_this.context.parameters.trackingBackend==="aruco"){this._arucoPosit=new POS.Posit(this.parameters.size,_this.context.arucoContext.canvas.width)}else if(_this.context.parameters.trackingBackend==="tango"){this._initTango()}else console.assert(false)};THREEx.ArMarkerControls.prototype=Object.create(THREEx.ArBaseControls.prototype);THREEx.ArMarkerControls.prototype.constructor=THREEx.ArMarkerControls;THREEx.ArMarkerControls.prototype.dispose=function(){this.context.removeMarker(this)};THREEx.ArMarkerControls.prototype.updateWithModelViewMatrix=function(modelViewMatrix){var markerObject3D=this.object3d;markerObject3D.visible=true;if(this.context.parameters.trackingBackend==="artoolkit"){var tmpMatrix=(new THREE.Matrix4).copy(this.context._artoolkitProjectionAxisTransformMatrix);tmpMatrix.multiply(modelViewMatrix);modelViewMatrix.copy(tmpMatrix)}else if(this.context.parameters.trackingBackend==="aruco"){}else if(this.context.parameters.trackingBackend==="tango"){}else console.assert(false);if(this.context.parameters.trackingBackend!=="tango"){var markerAxisTransformMatrix=(new THREE.Matrix4).makeRotationX(Math.PI/2);modelViewMatrix.multiply(markerAxisTransformMatrix)}if(this.parameters.changeMatrixMode==="modelViewMatrix"){markerObject3D.matrix.copy(modelViewMatrix)}else if(this.parameters.changeMatrixMode==="cameraTransformMatrix"){markerObject3D.matrix.getInverse(modelViewMatrix)}else{console.assert(false)}markerObject3D.matrix.decompose(markerObject3D.position,markerObject3D.quaternion,markerObject3D.scale);this.dispatchEvent({type:"markerFound"})};THREEx.ArMarkerControls.prototype.name=function(){var name="";name+=this.parameters.type;if(this.parameters.type==="pattern"){var url=this.parameters.patternUrl;var basename=url.replace(/^.*\//g,"");name+=" - "+basename}else if(this.parameters.type==="barcode"){name+=" - "+this.parameters.barcodeValue}else{console.assert(false,"no .name() implemented for this marker controls")}return name};THREEx.ArMarkerControls.prototype._initArtoolkit=function(){var _this=this;var artoolkitMarkerId=null;var delayedInitTimerId=setInterval(function(){var arController=_this.context.arController;if(arController===null)return;clearInterval(delayedInitTimerId);delayedInitTimerId=null;postInit()},1e3/50);return;function postInit(){var arController=_this.context.arController;console.assert(arController!==null);if(_this.parameters.type==="pattern"){arController.loadMarker(_this.parameters.patternUrl,function(markerId){artoolkitMarkerId=markerId;arController.trackPatternMarkerId(artoolkitMarkerId,_this.parameters.size)})}else if(_this.parameters.type==="barcode"){artoolkitMarkerId=_this.parameters.barcodeValue;arController.trackBarcodeMarkerId(artoolkitMarkerId,_this.parameters.size)}else if(_this.parameters.type==="unknown"){artoolkitMarkerId=null}else{console.log(false,"invalid marker type",_this.parameters.type)}arController.addEventListener("getMarker",function(event){if(event.data.type===artoolkit.PATTERN_MARKER&&_this.parameters.type==="pattern"){if(artoolkitMarkerId===null)return;if(event.data.marker.idPatt===artoolkitMarkerId)onMarkerFound(event)}else if(event.data.type===artoolkit.BARCODE_MARKER&&_this.parameters.type==="barcode"){if(artoolkitMarkerId===null)return;if(event.data.marker.idMatrix===artoolkitMarkerId)onMarkerFound(event)}else if(event.data.type===artoolkit.UNKNOWN_MARKER&&_this.parameters.type==="unknown"){onMarkerFound(event)}})}function onMarkerFound(event){if(event.data.type===artoolkit.PATTERN_MARKER&&event.data.marker.cfPatt<_this.parameters.minConfidence)return;if(event.data.type===artoolkit.BARCODE_MARKER&&event.data.marker.cfMatt<_this.parameters.minConfidence)return;var modelViewMatrix=(new THREE.Matrix4).fromArray(event.data.matrix);_this.updateWithModelViewMatrix(modelViewMatrix)}};THREEx.ArMarkerControls.prototype._initAruco=function(){this._arucoPosit=new POS.Posit(this.parameters.size,_this.context.arucoContext.canvas.width)};THREEx.ArMarkerControls.prototype._initTango=function(){var _this=this;console.log("init tango ArMarkerControls")};var THREEx=THREEx||{};THREEx.ArMarkerHelper=function(markerControls){this.object3d=new THREE.Group;var mesh=new THREE.AxisHelper;this.object3d.add(mesh);var text=markerControls.id;var canvas=document.createElement("canvas");canvas.width=64;canvas.height=64;var context=canvas.getContext("2d");var texture=new THREE.CanvasTexture(canvas);context.font="48px monospace";context.fillStyle="rgba(192,192,255, 0.5)";context.fillRect(0,0,canvas.width,canvas.height);context.fillStyle="darkblue";context.fillText(text,canvas.width/4,3*canvas.height/4);texture.needsUpdate=true;var geometry=new THREE.PlaneGeometry(1,1);var material=new THREE.MeshBasicMaterial({map:texture,transparent:true});var mesh=new THREE.Mesh(geometry,material);mesh.rotation.x=-Math.PI/2;this.object3d.add(mesh)};var THREEx=THREEx||{};THREEx.ArSmoothedControls=function(object3d,parameters){var _this=this;THREEx.ArBaseControls.call(this,object3d);this.object3d.visible=false;this._lastLerpStepAt=null;this._visibleStartedAt=null;this._unvisibleStartedAt=null;parameters=parameters||{};this.parameters={lerpPosition:parameters.lerpPosition!==undefined?parameters.lerpPosition:.8,lerpQuaternion:parameters.lerpQuaternion!==undefined?parameters.lerpQuaternion:.2,lerpScale:parameters.lerpScale!==undefined?parameters.lerpScale:.7,lerpStepDelay:parameters.fixStepDelay!==undefined?parameters.fixStepDelay:1/60,minVisibleDelay:parameters.minVisibleDelay!==undefined?parameters.minVisibleDelay:0,minUnvisibleDelay:parameters.minUnvisibleDelay!==undefined?parameters.minUnvisibleDelay:.2}};THREEx.ArSmoothedControls.prototype=Object.create(THREEx.ArBaseControls.prototype);THREEx.ArSmoothedControls.prototype.constructor=THREEx.ArSmoothedControls;THREEx.ArSmoothedControls.prototype.update=function(targetObject3d){var object3d=this.object3d;var parameters=this.parameters;var wasVisible=object3d.visible;var present=performance.now()/1e3;if(targetObject3d.visible===false)this._visibleStartedAt=null;if(targetObject3d.visible===true)this._unvisibleStartedAt=null;if(targetObject3d.visible===true&&this._visibleStartedAt===null)this._visibleStartedAt=present;if(targetObject3d.visible===false&&this._unvisibleStartedAt===null)this._unvisibleStartedAt=present;if(wasVisible===false&&targetObject3d.visible===true){var visibleFor=present-this._visibleStartedAt;if(visibleFor>=this.parameters.minVisibleDelay){object3d.visible=true;snapDirectlyToTarget()}}if(wasVisible===true&&targetObject3d.visible===false){var unvisibleFor=present-this._unvisibleStartedAt;if(unvisibleFor>=this.parameters.minUnvisibleDelay){object3d.visible=false}}if(this._lastLerpStepAt===null){applyOneSlerpStep();this._lastLerpStepAt=present}else{var nStepsToDo=Math.floor((present-this._lastLerpStepAt)/this.parameters.lerpStepDelay);for(var i=0;i<nStepsToDo;i++){applyOneSlerpStep();this._lastLerpStepAt+=this.parameters.lerpStepDelay}}if(false){snapDirectlyToTarget()}this.object3d.updateMatrix();if(wasVisible===false&&object3d.visible===true){this.dispatchEvent({type:"becameVisible"})}if(wasVisible===true&&object3d.visible===false){this.dispatchEvent({type:"becameUnVisible"})}return;function snapDirectlyToTarget(){object3d.position.copy(targetObject3d.position);object3d.quaternion.copy(targetObject3d.quaternion);object3d.scale.copy(targetObject3d.scale)}function applyOneSlerpStep(){object3d.position.lerp(targetObject3d.position,parameters.lerpPosition);object3d.quaternion.slerp(targetObject3d.quaternion,parameters.lerpQuaternion);object3d.scale.lerp(targetObject3d.scale,parameters.lerpScale)}};var THREEx=THREEx||{};THREEx.ArToolkitContext=function(parameters){var _this=this;_this._updatedAt=null;this.parameters={trackingBackend:"artoolkit",debug:false,detectionMode:"mono",matrixCodeType:"3x3",cameraParametersUrl:THREEx.ArToolkitContext.baseURL+"parameters/camera_para.dat",maxDetectionRate:60,canvasWidth:640,canvasHeight:480,imageSmoothingEnabled:false};console.assert(["artoolkit","aruco","tango"].indexOf(this.parameters.trackingBackend)!==-1,"invalid parameter trackingBackend",this.parameters.trackingBackend);console.assert(["color","color_and_matrix","mono","mono_and_matrix"].indexOf(this.parameters.detectionMode)!==-1,"invalid parameter detectionMode",this.parameters.detectionMode);this.arController=null;this.arucoContext=null;_this.initialized=false;this._arMarkersControls=[];this._setParameters(parameters)};Object.assign(THREEx.ArToolkitContext.prototype,THREE.EventDispatcher.prototype);THREEx.ArToolkitContext.baseURL="https://jeromeetienne.github.io/AR.js/three.js/";THREEx.ArToolkitContext.REVISION="1.0.1-dev";THREEx.ArToolkitContext.prototype._setParameters=function(values){if(values===undefined)return;for(var key in values){var newValue=values[key];if(newValue===undefined){console.warn("THREEx.ArToolkitContext: '"+key+"' parameter is undefined.");continue}var currentValue=this.parameters[key];if(currentValue===undefined){console.warn("THREEx.ArToolkitContext: '"+key+"' is not a property of this material.");continue}this.parameters[key]=newValue}};THREEx.ArToolkitContext.createDefaultCamera=function(trackingBackend){console.assert(false,"use ARjs.Utils.createDefaultCamera instead");if(trackingBackend==="artoolkit"){var camera=new THREE.Camera}else if(trackingBackend==="aruco"){var camera=new THREE.PerspectiveCamera(42,renderer.domElement.width/renderer.domElement.height,.01,100)}else if(trackingBackend==="tango"){var camera=new THREE.PerspectiveCamera(42,renderer.domElement.width/renderer.domElement.height,.01,100)}else console.assert(false);return camera};THREEx.ArToolkitContext.prototype.init=function(onCompleted){var _this=this;if(this.parameters.trackingBackend==="artoolkit"){this._initArtoolkit(done)}else if(this.parameters.trackingBackend==="aruco"){this._initAruco(done)}else if(this.parameters.trackingBackend==="tango"){this._initTango(done)}else console.assert(false);return;function done(){_this.dispatchEvent({type:"initialized"});_this.initialized=true;onCompleted&&onCompleted()}};THREEx.ArToolkitContext.prototype.update=function(srcElement){if(this.parameters.trackingBackend==="artoolkit"&&this.arController===null)return false;var present=performance.now();if(this._updatedAt!==null&&present-this._updatedAt<1e3/this.parameters.maxDetectionRate){return false}this._updatedAt=present;this._arMarkersControls.forEach(function(markerControls){markerControls.object3d.visible=false});if(this.parameters.trackingBackend==="artoolkit"){this._updateArtoolkit(srcElement)}else if(this.parameters.trackingBackend==="aruco"){this._updateAruco(srcElement)}else if(this.parameters.trackingBackend==="tango"){this._updateTango(srcElement)}else{console.assert(false)}this.dispatchEvent({type:"sourceProcessed"});return true};THREEx.ArToolkitContext.prototype.addMarker=function(arMarkerControls){console.assert(arMarkerControls instanceof THREEx.ArMarkerControls);this._arMarkersControls.push(arMarkerControls)};THREEx.ArToolkitContext.prototype.removeMarker=function(arMarkerControls){console.assert(arMarkerControls instanceof THREEx.ArMarkerControls);var index=this.arMarkerControlss.indexOf(artoolkitMarker);console.assert(index!==index);this._arMarkersControls.splice(index,1)};THREEx.ArToolkitContext.prototype._initArtoolkit=function(onCompleted){var _this=this;this._artoolkitProjectionAxisTransformMatrix=new THREE.Matrix4;this._artoolkitProjectionAxisTransformMatrix.multiply((new THREE.Matrix4).makeRotationY(Math.PI));this._artoolkitProjectionAxisTransformMatrix.multiply((new THREE.Matrix4).makeRotationZ(Math.PI));var cameraParameters=new ARCameraParam(_this.parameters.cameraParametersUrl,function(){var arController=new ARController(_this.parameters.canvasWidth,_this.parameters.canvasHeight,cameraParameters);_this.arController=arController;arController.ctx.mozImageSmoothingEnabled=_this.parameters.imageSmoothingEnabled;arController.ctx.webkitImageSmoothingEnabled=_this.parameters.imageSmoothingEnabled;arController.ctx.msImageSmoothingEnabled=_this.parameters.imageSmoothingEnabled;arController.ctx.imageSmoothingEnabled=_this.parameters.imageSmoothingEnabled;if(_this.parameters.debug===true){arController.debugSetup();arController.canvas.style.position="absolute";arController.canvas.style.top="0px";arController.canvas.style.opacity="0.6";arController.canvas.style.pointerEvents="none";arController.canvas.style.zIndex="-1"}var detectionModes={color:artoolkit.AR_TEMPLATE_MATCHING_COLOR,color_and_matrix:artoolkit.AR_TEMPLATE_MATCHING_COLOR_AND_MATRIX,mono:artoolkit.AR_TEMPLATE_MATCHING_MONO,mono_and_matrix:artoolkit.AR_TEMPLATE_MATCHING_MONO_AND_MATRIX};var detectionMode=detectionModes[_this.parameters.detectionMode];console.assert(detectionMode!==undefined);arController.setPatternDetectionMode(detectionMode);var matrixCodeTypes={"3x3":artoolkit.AR_MATRIX_CODE_3x3,"3x3_HAMMING63":artoolkit.AR_MATRIX_CODE_3x3_HAMMING63,"3x3_PARITY65":artoolkit.AR_MATRIX_CODE_3x3_PARITY65,"4x4":artoolkit.AR_MATRIX_CODE_4x4,"4x4_BCH_13_9_3":artoolkit.AR_MATRIX_CODE_4x4_BCH_13_9_3,"4x4_BCH_13_5_5":artoolkit.AR_MATRIX_CODE_4x4_BCH_13_5_5};var matrixCodeType=matrixCodeTypes[_this.parameters.matrixCodeType];console.assert(matrixCodeType!==undefined);arController.setMatrixCodeType(matrixCodeType);onCompleted()});return this};THREEx.ArToolkitContext.prototype.getProjectionMatrix=function(srcElement){if(this.parameters.trackingBackend==="aruco"){console.assert(false,"dont call this function with aruco")}else if(this.parameters.trackingBackend==="artoolkit"){console.assert(this.arController,"arController MUST be initialized to call this function");var projectionMatrixArr=this.arController.getCameraMatrix();var projectionMatrix=(new THREE.Matrix4).fromArray(projectionMatrixArr)}else console.assert(false);projectionMatrix.multiply(this._artoolkitProjectionAxisTransformMatrix);return projectionMatrix};THREEx.ArToolkitContext.prototype._updateArtoolkit=function(srcElement){this.arController.process(srcElement)};THREEx.ArToolkitContext.prototype._initAruco=function(onCompleted){this.arucoContext=new THREEx.ArucoContext;this.arucoContext.canvas.width=this.parameters.canvasWidth;this.arucoContext.canvas.height=this.parameters.canvasHeight;var context=this.arucoContext.canvas.getContext("2d");context.webkitImageSmoothingEnabled=this.parameters.imageSmoothingEnabled;context.msImageSmoothingEnabled=this.parameters.imageSmoothingEnabled;context.imageSmoothingEnabled=this.parameters.imageSmoothingEnabled;setTimeout(function(){onCompleted()},0)};THREEx.ArToolkitContext.prototype._updateAruco=function(srcElement){var _this=this;var arMarkersControls=this._arMarkersControls;var detectedMarkers=this.arucoContext.detect(srcElement);detectedMarkers.forEach(function(detectedMarker){var foundControls=null;for(var i=0;i<arMarkersControls.length;i++){console.assert(arMarkersControls[i].parameters.type==="barcode");if(arMarkersControls[i].parameters.barcodeValue===detectedMarker.id){foundControls=arMarkersControls[i];break}}if(foundControls===null)return;var tmpObject3d=new THREE.Object3D;_this.arucoContext.updateObject3D(tmpObject3d,foundControls._arucoPosit,foundControls.parameters.size,detectedMarker);tmpObject3d.updateMatrix();foundControls.updateWithModelViewMatrix(tmpObject3d.matrix)})};THREEx.ArToolkitContext.prototype._initTango=function(onCompleted){var _this=this;if(navigator.getVRDisplays){}else if(navigator.getVRDevices){alert("Your browser supports WebVR but not the latest version. See <a href='http://webvr.info'>webvr.info</a> for more info.")}else{alert("Your browser does not support WebVR. See <a href='http://webvr.info'>webvr.info</a> for assistance.");
}this._tangoContext={vrDisplay:null,vrPointCloud:null,frameData:new VRFrameData};navigator.getVRDisplays().then(function(vrDisplays){if(vrDisplays.length===0)alert("no vrDisplays available");var vrDisplay=_this._tangoContext.vrDisplay=vrDisplays[0];console.log("vrDisplays.displayName :",vrDisplay.displayName);if(vrDisplay.displayName==="Tango VR Device"){_this._tangoContext.vrPointCloud=new THREE.WebAR.VRPointCloud(vrDisplay,true)}onCompleted()})};THREEx.ArToolkitContext.prototype._updateTango=function(srcElement){var _this=this;var arMarkersControls=this._arMarkersControls;var tangoContext=this._tangoContext;var vrDisplay=this._tangoContext.vrDisplay;if(vrDisplay===null)return;if(vrDisplay.displayName==="Tango VR Device"){var showPointCloud=true;var pointsToSkip=0;_this._tangoContext.vrPointCloud.update(showPointCloud,pointsToSkip,true)}if(this._arMarkersControls.length===0)return;var foundControls=this._arMarkersControls[0];var frameData=this._tangoContext.frameData;vrDisplay.getFrameData(frameData);if(frameData.pose.position===null)return;if(frameData.pose.orientation===null)return;var position=(new THREE.Vector3).fromArray(frameData.pose.position);var quaternion=(new THREE.Quaternion).fromArray(frameData.pose.orientation);var scale=new THREE.Vector3(1,1,1);var cameraTransformMatrix=(new THREE.Matrix4).compose(position,quaternion,scale);var modelViewMatrix=new THREE.Matrix4;modelViewMatrix.getInverse(cameraTransformMatrix);foundControls.updateWithModelViewMatrix(modelViewMatrix)};var ARjs=ARjs||{};var THREEx=THREEx||{};ARjs.Profile=THREEx.ArToolkitProfile=function(){this.reset();this.performance("default")};ARjs.Profile.prototype._guessPerformanceLabel=function(){var isMobile=navigator.userAgent.match(/Android/i)||navigator.userAgent.match(/webOS/i)||navigator.userAgent.match(/iPhone/i)||navigator.userAgent.match(/iPad/i)||navigator.userAgent.match(/iPod/i)||navigator.userAgent.match(/BlackBerry/i)||navigator.userAgent.match(/Windows Phone/i)?true:false;if(isMobile===true){return"phone-normal"}return"desktop-normal"};ARjs.Profile.prototype.reset=function(){this.sourceParameters={sourceType:"webcam"};this.contextParameters={cameraParametersUrl:THREEx.ArToolkitContext.baseURL+"../data/data/camera_para.dat",detectionMode:"mono"};this.defaultMarkerParameters={type:"pattern",patternUrl:THREEx.ArToolkitContext.baseURL+"../data/data/patt.hiro",changeMatrixMode:"modelViewMatrix"};return this};ARjs.Profile.prototype.performance=function(label){if(label==="default"){label=this._guessPerformanceLabel()}if(label==="desktop-fast"){this.contextParameters.canvasWidth=640*3;this.contextParameters.canvasHeight=480*3;this.contextParameters.maxDetectionRate=30}else if(label==="desktop-normal"){this.contextParameters.canvasWidth=640;this.contextParameters.canvasHeight=480;this.contextParameters.maxDetectionRate=60}else if(label==="phone-normal"){this.contextParameters.canvasWidth=80*4;this.contextParameters.canvasHeight=60*4;this.contextParameters.maxDetectionRate=30}else if(label==="phone-slow"){this.contextParameters.canvasWidth=80*3;this.contextParameters.canvasHeight=60*3;this.contextParameters.maxDetectionRate=30}else{console.assert(false,"unknonwn label "+label)}return this};ARjs.Profile.prototype.defaultMarker=function(trackingBackend){trackingBackend=trackingBackend||this.contextParameters.trackingBackend;if(trackingBackend==="artoolkit"){this.contextParameters.detectionMode="mono";this.defaultMarkerParameters.type="pattern";this.defaultMarkerParameters.patternUrl=THREEx.ArToolkitContext.baseURL+"../data/data/patt.hiro"}else if(trackingBackend==="aruco"){this.contextParameters.detectionMode="mono";this.defaultMarkerParameters.type="barcode";this.defaultMarkerParameters.barcodeValue=1001}else if(trackingBackend==="tango"){this.defaultMarkerParameters.type="barcode";this.defaultMarkerParameters.barcodeValue=1001}else console.assert(false);return this};ARjs.Profile.prototype.sourceWebcam=function(){this.sourceParameters.sourceType="webcam";delete this.sourceParameters.sourceUrl;return this};ARjs.Profile.prototype.sourceVideo=function(url){this.sourceParameters.sourceType="video";this.sourceParameters.sourceUrl=url;return this};ARjs.Profile.prototype.sourceImage=function(url){this.sourceParameters.sourceType="image";this.sourceParameters.sourceUrl=url;return this};ARjs.Profile.prototype.trackingBackend=function(trackingBackend){console.warn("stop profile.trackingBackend() obsolete function. use .trackingMethod instead");this.contextParameters.trackingBackend=trackingBackend;return this};ARjs.Profile.prototype.changeMatrixMode=function(changeMatrixMode){this.defaultMarkerParameters.changeMatrixMode=changeMatrixMode;return this};ARjs.Profile.prototype.trackingMethod=function(trackingMethod){var data=ARjs.Utils.parseTrackingMethod(trackingMethod);this.defaultMarkerParameters.markersAreaEnabled=data.markersAreaEnabled;this.contextParameters.trackingBackend=data.trackingBackend;return this};ARjs.Profile.prototype.checkIfValid=function(){if(this.contextParameters.trackingBackend==="tango"){this.sourceImage(THREEx.ArToolkitContext.baseURL+"../data/images/img.jpg")}return this};var THREEx=THREEx||{};THREEx.ArToolkitSource=function(parameters){this.parameters={sourceType:parameters.sourceType!==undefined?parameters.sourceType:"webcam",sourceUrl:parameters.sourceUrl!==undefined?parameters.sourceUrl:null,sourceWidth:parameters.sourceWidth!==undefined?parameters.sourceWidth:640,sourceHeight:parameters.sourceHeight!==undefined?parameters.sourceHeight:480,displayWidth:parameters.displayWidth!==undefined?parameters.displayWidth:640,displayHeight:parameters.displayHeight!==undefined?parameters.displayHeight:480};this.ready=false;this.domElement=null};THREEx.ArToolkitSource.prototype.init=function(onReady){var _this=this;if(this.parameters.sourceType==="image"){var domElement=this._initSourceImage(onSourceReady)}else if(this.parameters.sourceType==="video"){var domElement=this._initSourceVideo(onSourceReady)}else if(this.parameters.sourceType==="webcam"){var domElement=this._initSourceWebcam(onSourceReady)}else{console.assert(false)}this.domElement=domElement;this.domElement.style.position="absolute";this.domElement.style.top="0px";this.domElement.style.left="0px";this.domElement.style.zIndex="-2";return this;function onSourceReady(){document.body.appendChild(_this.domElement);_this.ready=true;onReady&&onReady()}};THREEx.ArToolkitSource.prototype._initSourceImage=function(onReady){var domElement=document.createElement("img");domElement.src=this.parameters.sourceUrl;domElement.width=this.parameters.sourceWidth;domElement.height=this.parameters.sourceHeight;domElement.style.width=this.parameters.displayWidth+"px";domElement.style.height=this.parameters.displayHeight+"px";var interval=setInterval(function(){if(!domElement.naturalWidth)return;onReady();clearInterval(interval)},1e3/50);return domElement};THREEx.ArToolkitSource.prototype._initSourceVideo=function(onReady){var domElement=document.createElement("video");domElement.src=this.parameters.sourceUrl;domElement.style.objectFit="initial";domElement.autoplay=true;domElement.webkitPlaysinline=true;domElement.controls=false;domElement.loop=true;domElement.muted=true;document.body.addEventListener("click",function onClick(){document.body.removeEventListener("click",onClick);domElement.play()});domElement.width=this.parameters.sourceWidth;domElement.height=this.parameters.sourceHeight;domElement.style.width=this.parameters.displayWidth+"px";domElement.style.height=this.parameters.displayHeight+"px";var interval=setInterval(function(){if(!domElement.videoWidth)return;onReady();clearInterval(interval)},1e3/50);return domElement};THREEx.ArToolkitSource.prototype._initSourceWebcam=function(onReady){var _this=this;var domElement=document.createElement("video");domElement.setAttribute("autoplay","");domElement.setAttribute("muted","");domElement.setAttribute("playsinline","");domElement.style.width=this.parameters.displayWidth+"px";domElement.style.height=this.parameters.displayHeight+"px";if(navigator.mediaDevices===undefined||navigator.mediaDevices.enumerateDevices===undefined||navigator.mediaDevices.getUserMedia===undefined){alert("WebRTC issue! navigator.mediaDevices.enumerateDevices not present in your browser")}navigator.mediaDevices.enumerateDevices().then(function(devices){var userMediaConstraints={audio:false,video:{facingMode:"environment",width:{ideal:_this.parameters.sourceWidth},height:{ideal:_this.parameters.sourceHeight}}};navigator.mediaDevices.getUserMedia(userMediaConstraints).then(function success(stream){domElement.srcObject=stream;document.body.addEventListener("click",function(){domElement.play()});var interval=setInterval(function(){if(!domElement.videoWidth)return;onReady();clearInterval(interval)},1e3/50)}).catch(function(error){console.log("Can't access user media",error);alert("Can't access user media :()")})}).catch(function(err){console.log(err.name+": "+err.message)});return domElement};THREEx.ArToolkitSource.prototype.hasMobileTorch=function(){var stream=arToolkitSource.domElement.srcObject;if(stream instanceof MediaStream===false)return false;if(this._currentTorchStatus===undefined){this._currentTorchStatus=false}var videoTrack=stream.getVideoTracks()[0];if(videoTrack.getCapabilities===undefined)return false;var capabilities=videoTrack.getCapabilities();return capabilities.torch?true:false};THREEx.ArToolkitSource.prototype.toggleMobileTorch=function(){console.assert(this.hasMobileTorch()===true);var stream=arToolkitSource.domElement.srcObject;if(stream instanceof MediaStream===false){alert("enabling mobile torch is available only on webcam");return}if(this._currentTorchStatus===undefined){this._currentTorchStatus=false}var videoTrack=stream.getVideoTracks()[0];var capabilities=videoTrack.getCapabilities();if(!capabilities.torch){alert("no mobile torch is available on your camera");return}this._currentTorchStatus=this._currentTorchStatus===false?true:false;videoTrack.applyConstraints({advanced:[{torch:this._currentTorchStatus}]}).catch(function(error){console.log(error)})};THREEx.ArToolkitSource.prototype.onResizeElement=function(mirrorDomElements){var _this=this;var screenWidth=window.innerWidth;var screenHeight=window.innerHeight;if(this.domElement.nodeName==="IMG"){var sourceWidth=this.domElement.naturalWidth;var sourceHeight=this.domElement.naturalHeight}else if(this.domElement.nodeName==="VIDEO"){var sourceWidth=this.domElement.videoWidth;var sourceHeight=this.domElement.videoHeight}else{console.assert(false)}var sourceAspect=sourceWidth/sourceHeight;var screenAspect=screenWidth/screenHeight;if(screenAspect<sourceAspect){var newWidth=sourceAspect*screenHeight;this.domElement.style.width=newWidth+"px";this.domElement.style.marginLeft=-(newWidth-screenWidth)/2+"px";this.domElement.style.height=screenHeight+"px";this.domElement.style.marginTop="0px"}else{var newHeight=1/(sourceAspect/screenWidth);this.domElement.style.height=newHeight+"px";this.domElement.style.marginTop=-(newHeight-screenHeight)/2+"px";this.domElement.style.width=screenWidth+"px";this.domElement.style.marginLeft="0px"}if(arguments.length!==0){debugger;console.warn("use bad signature for arToolkitSource.copyElementSizeTo")}if(mirrorDomElements===undefined)mirrorDomElements=[];if(mirrorDomElements instanceof Array===false)mirrorDomElements=[mirrorDomElements];mirrorDomElements.forEach(function(domElement){_this.copyElementSizeTo(domElement)})};THREEx.ArToolkitSource.prototype.copyElementSizeTo=function(otherElement){otherElement.style.width=this.domElement.style.width;otherElement.style.height=this.domElement.style.height;otherElement.style.marginLeft=this.domElement.style.marginLeft;otherElement.style.marginTop=this.domElement.style.marginTop};THREEx.ArToolkitSource.prototype.copySizeTo=function(){console.warn("obsolete function arToolkitSource.copySizeTo. Use arToolkitSource.copyElementSizeTo");this.copyElementSizeTo.apply(this,arguments)};THREEx.ArToolkitSource.prototype.onResize=function(){console.warn("obsolete function arToolkitSource.onResize. Use arToolkitSource.onResizeElement");this.onResizeElement.apply(this,arguments)};THREEx.ArToolkitSource.prototype.onResize2=function(arToolkitContext,renderer,camera){var trackingBackend=arToolkitContext.parameters.trackingBackend;if(trackingBackend==="artoolkit"){this.onResizeElement();var isAframe=renderer.domElement.dataset.aframeCanvas?true:false;if(isAframe===false){this.copyElementSizeTo(renderer.domElement)}else{}if(arToolkitContext.arController!==null){this.copyElementSizeTo(arToolkitContext.arController.canvas)}}else if(trackingBackend==="aruco"){this.onResizeElement();this.copyElementSizeTo(renderer.domElement);this.copyElementSizeTo(arToolkitContext.arucoContext.canvas)}else if(trackingBackend==="tango"){renderer.setSize(window.innerWidth,window.innerHeight)}else console.assert(false,"unhandled trackingBackend "+trackingBackend);if(trackingBackend==="artoolkit"){if(arToolkitContext.arController!==null){camera.projectionMatrix.copy(arToolkitContext.getProjectionMatrix())}}else if(trackingBackend==="aruco"){camera.aspect=renderer.domElement.width/renderer.domElement.height;camera.updateProjectionMatrix()}else if(trackingBackend==="tango"){var vrDisplay=arToolkitContext._tangoContext.vrDisplay;if(vrDisplay&&vrDisplay.displayName==="Tango VR Device")THREE.WebAR.resizeVRSeeThroughCamera(vrDisplay,camera)}else console.assert(false,"unhandled trackingBackend "+trackingBackend)};var THREEx=THREEx||{};THREEx.ArVideoInWebgl=function(videoTexture){var _this=this;var geometry=new THREE.PlaneGeometry(2,2);var material=new THREE.MeshBasicMaterial({map:videoTexture});var seethruPlane=new THREE.Mesh(geometry,material);this.object3d=seethruPlane;this.update=function(camera){camera.updateMatrixWorld(true);var position=new THREE.Vector3(-0,0,-20);var position=new THREE.Vector3(-0,0,-20);seethruPlane.position.copy(position);camera.localToWorld(seethruPlane.position);camera.matrixWorld.decompose(camera.position,camera.quaternion,camera.scale);seethruPlane.quaternion.copy(camera.quaternion);var fov=THREE.Math.radToDeg(Math.atan(1/camera.projectionMatrix.elements[5]))*2;var elementWidth=parseFloat(arToolkitSource.domElement.style.width.replace(/px$/,""),10);var elementHeight=parseFloat(arToolkitSource.domElement.style.height.replace(/px$/,""),10);var aspect=elementWidth/elementHeight;seethruPlane.scale.y=Math.tan(THREE.Math.DEG2RAD*fov/2)*position.length();seethruPlane.scale.x=seethruPlane.scale.y*aspect}};function ARToolKitFrameData(arToolKitSourceOptions,arToolKitContextOptions,arMarkerControlsOptions){var _this=this;_this.started=false;var camera=new THREE.Camera;_this._camera=camera;this.update=function(){if(arToolkitSource.ready===false)return;arToolkitContext.update(arToolkitSource.domElement)};this.resetPose=function(){};this.dispose=function(){};this.updateFrameData=function(dstFrameData){dstFrameData.timestamp=Date.now();camera.projectionMatrix.toArray(dstFrameData.leftProjectionMatrix);camera.projectionMatrix.toArray(dstFrameData.rightProjectionMatrix);var modelViewMatrix=(new THREE.Matrix4).getInverse(camera.matrix);modelViewMatrix.toArray(dstFrameData.leftViewMatrix);modelViewMatrix.toArray(dstFrameData.rightViewMatrix);camera.position.toArray(dstFrameData.pose.position);camera.quaternion.toArray(dstFrameData.pose.orientation)};var arToolkitSource=new THREEx.ArToolkitSource(arToolKitSourceOptions);arToolkitSource.init(function onReady(){arToolkitSource.onResize()});window.addEventListener("resize",function(){arToolkitSource.onResize()});var arToolkitContext=new THREEx.ArToolkitContext(arToolKitContextOptions);arToolkitContext.init(function onCompleted(){var projectionMatrix=arToolkitContext.arController.getCameraMatrix();camera.projectionMatrix.fromArray(projectionMatrix);_this.started=true});var markerControls=new THREEx.ArMarkerControls(arToolkitContext,camera,arMarkerControlsOptions)}var WebVRPolyfill=function(){};WebVRPolyfill.prototype.install=function(){var framedataProvider=null;this.setFrameDataProvider=function(newFrameDataProvider){framedataProvider=newFrameDataProvider};navigator.getVRDisplays=function(){var vrDisplays=[new VRDisplay];return new Promise(function(resolve,reject){resolve(vrDisplays)})};window.VRFrameData=function(){var frameData=this;this.timestamp=Date.now();this.leftProjectionMatrix=new Float32Array(16);this.leftViewMatrix=new Float32Array(16);this.rightProjectionMatrix=new Float32Array(16);this.rightViewMatrix=new Float32Array(16);this.pose={};this.pose.position=new Float32Array([0,0,0]);this.pose.orientation=new Float32Array([0,0,0,1])};window.VREyeParameters=function(whichEye){this.offset=new Float32Array([0,0,0]);if(whichEye==="right"){this.offset[0]=+.03}else if(whichEye==="left"){this.offset[0]=-.03}else{console.assert(false)}this.fieldOfView={upDegrees:+30,rightDegrees:+30,downDegrees:-30,leftDegrees:-30};this.renderWidth=window.innerWidth/2;this.renderHeight=window.innerHeight};window.VRDisplay=function(){this.isConnected=true;this.isPresenting=false;this.displayId=0;this.displayName="Generic WebVR Polyfill";this.depthNear=.1;this.depthFar=1e4;this.capabilities={hasPosition:true,hasOrientation:true,hasExternalDisplay:false,canPresent:true,maxLayers:1};this.stageParameters={sittingToStandingTransform:new Float32Array(16),sizeX:3,sizeY:3}};VRDisplay.prototype.getFrameData=function(frameData){if(!framedataProvider)return;framedataProvider.updateFrameData(frameData)};VRDisplay.prototype.getEyeParameters=function(whichEye){return new VREyeParameters(whichEye)};VRDisplay.prototype.getPose=function(){console.assert("not yet implemented, Deprecated anyway")};VRDisplay.prototype.resetPose=function(frameData){console.assert("not yet implemented");if(!framedataProvider)return;framedataProvider.resetPose()};VRDisplay.prototype.requestAnimationFrame=function(callback){return window.requestAnimationFrame(callback)};VRDisplay.prototype.cancelAnimationFrame=function(handle){return window.cancelAnimationFrame(handle)};VRDisplay.prototype.getLayers=function(){return[]};VRDisplay.prototype.requestPresent=function(layers){var _this=this;this._layers=layers;console.log("requestPresent");return new Promise(function(resolve,reject){loop();return;function loop(){if(framedataProvider.started===true){completed();return}setTimeout(loop,1e3/10)}function completed(){_this.isPresenting=true;console.log("dispatch vrdisplaypresentchange on requestPresent");var event=new Event("vrdisplaypresentchange");window.dispatchEvent(event);resolve()}})};VRDisplay.prototype.exitPresent=function(){var _this=this;console.log("exitPresent");return new Promise(function(resolve,reject){_this.isPresenting=false;console.log("dispatch vrdisplaypresentchange on exitPresent");var event=new Event("vrdisplaypresentchange");window.dispatchEvent(event);resolve()})};VRDisplay.prototype.submitFrame=function(){};return this};(function(){var arToolkitSourceOptions={sourceType:"video",sourceUrl:"../../data/videos/headtracking.mp4",displayWidth:640,displayHeight:480};var arToolKitContextOptions={cameraParametersUrl:"../../data/data/camera_para.dat",detectionMode:"mono"};var arMarkerControlsOptions={type:"pattern",patternUrl:"../../data/data/patt.kanji",changeMatrixMode:"cameraTransformMatrix"};var arToolKitFrameData=new ARToolKitFrameData(arToolkitSourceOptions,arToolKitContextOptions,arMarkerControlsOptions);requestAnimationFrame(function loop(){requestAnimationFrame(loop);arToolKitFrameData.update()});var webvrPolyfill=(new WebVRPolyfill).install();webvrPolyfill.setFrameDataProvider(arToolKitFrameData);requestAnimationFrame(function loop(){requestAnimationFrame(loop);var camera=window.camera;if(camera===undefined)return;camera.projectionMatrix.copy(arToolKitFrameData._camera.projectionMatrix)})})();
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册