From 6a136fe34a0b239fa7014c5568f30c897f319bb6 Mon Sep 17 00:00:00 2001 From: ButzYung Date: Sat, 20 Jan 2024 00:20:45 +0800 Subject: [PATCH] Update for v0.19.1 --- images/XR Animator/animate.js | 2 +- jThree/three.core.min.js | 2 +- js/SA_system_emulation.min.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/images/XR Animator/animate.js b/images/XR Animator/animate.js index 8fc2d49..ba125c0 100644 --- a/images/XR Animator/animate.js +++ b/images/XR Animator/animate.js @@ -8683,7 +8683,7 @@ MMD_SA_options.Dungeon.para_by_grid_id[2].ground_y = explorer_ground_y; ,[ { message: { - get content() { return 'XR Animator (v0.19.0)\n' + System._browser.translation.get('XR_Animator.UI.UI_options.about_XR_Animator.message'); } + get content() { return 'XR Animator (v0.19.1)\n' + System._browser.translation.get('XR_Animator.UI.UI_options.about_XR_Animator.message'); } ,bubble_index: 3 ,branch_list: [ { key:1, event_id: { diff --git a/jThree/three.core.min.js b/jThree/three.core.min.js index 5ed2663..bcb2db8 100644 --- a/jThree/three.core.min.js +++ b/jThree/three.core.min.js @@ -25,6 +25,6 @@ THREE.ShaderLib.mirror={uniforms:{mirrorSampler:{type:"t",value:null},mirrorPosi THREE.TrackballControls=function(e,t){var d=this,n={NONE:-1,ROTATE:0,ZOOM:1,PAN:2,TOUCH_ROTATE:3,TOUCH_ZOOM:4,TOUCH_PAN:5};this.object=e;this.domElement=t!==undefined?t:document;this.enabled=true;this.screen={left:0,top:0,width:0,height:0};this.rotateSpeed=1;this.zoomSpeed=1.2;this.panSpeed=.3;this.noRotate=this.noZoom=this.noPan=this.noRoll=false;this.damping=.2;this.minDistance=0;this.maxDistance=Infinity;this.target=e._lookAt;this.lastPosition=new THREE.Vector3;this._eye=new THREE.Vector3;var a=n.NONE,i=n.NONE,g=new THREE.Vector3,y=new THREE.Vector3,s=new THREE.Vector2,o=new THREE.Vector2,r=0,c=0,h=new THREE.Vector2,u=new THREE.Vector2;this.target0=this.target.clone();this.position0=this.object.position.clone();this.up0=this.object.up.clone();this._fixed=false;this.objectUp=new THREE.Vector3;var _=new THREE.Vector2;var E=new THREE.Vector2;var m=new THREE.Vector2;this.rotate_with_up_fixed=false;this.getMouseOnScreen_fixed_up=function(e,t,i){return this.getMouseOnScreen(e,t,i||new THREE.Vector2)};this.rotateCamera=function(){var n=new THREE.Vector3,a=new THREE.Quaternion;var r=new THREE.Vector3;var c=new THREE.Vector3;var h=new THREE.Vector3;var u=new THREE.Vector3;var l=new THREE.Quaternion;var i,o;function p(){i=o=null;if(!self.MMD_SA||!MMD_SA_options.trackball_camera_limit)return false;var e=MMD_SA_options.trackball_camera_limit;i=e.max;o=e.min;r.copy(this._eye).applyQuaternion(a);var t=e.adjust&&e.adjust(r);if(t){return t}if(i){if(r.x>i.x||r.y>i.y||r.z>i.z){return true}}if(o){if(r.xthis.EPS){r.subVectors(this.position0,this.target);h.set(0,r.y,-Math.sqrt(r.x*r.x+r.z*r.z));let e=Math.atan2(h.y,-h.z);let t=1.9-e/(Math.PI/4);let i=-1.9-e/(Math.PI/4);u.copy(m).add(E).sub(_);u.y=THREE.Math.clamp(u.y,i,t);a.setFromEuler(MMD_SA.TEMP_v3.set(u.y*45/180*Math.PI,-u.x*180/180*Math.PI,0),"YXZ");c.copy(this._eye);let s=h.angleTo(r);l.setFromAxisAngle(n.set(0,1,0),s);a.multiplyQuaternions(l,a);this._eye.copy(h);let o=p.call(this);if(o){this._eye.copy(c);_.copy(E);return}this._eye.applyQuaternion(a);if(f.call(this)){this._eye.copy(c);_.y=E.y}m.add(E).sub(_);m.y=THREE.Math.clamp(m.y,i,t);_.add(u.copy(E).sub(_).multiplyScalar(this.damping))}return}var e=g.angleTo(y);if(e){n.crossVectors(g,y).normalize();e*=d.rotateSpeed;a.setFromAxisAngle(n,-e);if(p.call(this)){g.copy(y);return}this._eye.applyQuaternion(a);!d._fixed&&d.object.up.applyQuaternion(a);y.applyQuaternion(a);a.setFromAxisAngle(n,e*(d.damping-1));g.applyQuaternion(a);if(f.call(this)){let e=u.crossVectors(r,c).normalize();let t=r.angleTo(c);l.setFromAxisAngle(e,t);this._eye.applyQuaternion(l);!d._fixed&&d.object.up.applyQuaternion(l);y.applyQuaternion(l);g.applyQuaternion(l)}}}}();var l=function(){var a=new THREE.Vector3;return function(e,t){if(!self.MMD_SA||!MMD_SA_options.trackball_camera_limit){e.multiplyScalar(t);return}var i=MMD_SA_options.trackball_camera_limit;var s=i.max;var o=i.min;var n=a.copy(e).multiplyScalar(t).length();if(s&&n>s.length||o&&ns.x)e.x=s.x;if(e.y>s.y)e.y=s.y;if(e.z>s.z)e.z=s.z}if(o){if(e.x0){l(this._eye,e);s.y+=(o.y-s.y)*this.damping}}};this.panCamera=function(){var e=new THREE.Vector2,t=new THREE.Vector3,i=new THREE.Vector3;return function(){e.copy(u).sub(h);if(e.lengthSq()){e.multiplyScalar(this._eye.length()*d.panSpeed);i.copy(this._eye).cross(d.object.up).setLength(e.x);i.add(t.copy(d.object.up).setLength(e.y));d.object.position.add(i);d.target.add(i);h.add(e.subVectors(u,h).multiplyScalar(d.damping))}}}();var b=new THREE.Vector3;var T=1;this.reset=function(){if(self.MMD_SA)System._browser._wallpaper_mousedown=false;b.set(0,0,0);T=1;_=new THREE.Vector2;E=new THREE.Vector2;m=new THREE.Vector2;g=new THREE.Vector3;y=new THREE.Vector3;a=i=n.NONE;this.object.position.copy(this.position0);this.object.up.copy(this.up0);this.object.lookAt(this.target0);this._eye.subVectors(this.object.position,this.target);this.lastPosition.copy(this.object.position);return this};if(self.MMD_SA){this.SA_adjust=function(){var y=new THREE.Vector3;var _=new THREE.Vector3;var E=new THREE.Vector3;var m=new THREE.Quaternion;var v={filter:function(e){return e.no_camera_collision}};return function(e,t){y.copy(this.object.position);var i,s;if(e){if(e instanceof Array){i=e[0];s=e[1]}else i=s=e;this.object.position.sub(this.target).multiplyScalar(1/T).add(this.target).add(i);this.target.add(s);T=1}if(t){b.add(t)}var o=10;var n=2;var a=1;var r=2;var c=0;var h;if(b.x||b.y||b.z)h=m.setFromEuler(b);for(var u=10;u>=n;u--){E.copy(_.copy(this.object.position).sub(this.target).multiplyScalar(1/T*(c+u/o)));if(h)_.applyQuaternion(h);var l={return_value:null};window.dispatchEvent(new CustomEvent("SA_camera_adjust",{detail:{rot_delta:b,pos_v3:_,result:l}}));if(!l.return_value){if(a1||u>n)){a++;c+=u/o;o=Math.pow(10,a);u=10;n=0;continue}if(a==r||a==1&&(u==10||u==n))b.set(0,0,0);this.object.position.copy(_).add(this.target);T=c+u/o;break}if(a==1&&u==n){this.object.position.copy(E).add(this.target);T=c+u/o}}var p=MMD_SA_options.Dungeon;if(p&&T>2/10){var f=!p.no_camera_collision&&p.check_ray_intersection(this.target,_.copy(this.object.position).sub(this.target),v);if(f){var d=_.length()/T;var g=Math.max(f.nearest.distance/d,2/10);this.object.position.sub(this.target).multiplyScalar(1/T*g).add(this.target);T=g}}if(s&&s.lengthSq()>.01*.01)MMD_SA._mouse_pos_3D=[];this.object.updateMatrixWorld();this.position0.add(this.object.position).sub(y)}}()}function p(e){if(!d.enabled)return;e.preventDefault();e.stopPropagation();if(a===n.NONE){a=e.ctrlKey?n.PAN:e.button}if(a===n.ROTATE&&!d.noRotate){g=d.getMouseProjectionOnBall(e.pageX,e.pageY,g);y.copy(g);d.rotate_with_up_fixed&&E.copy(d.getMouseOnScreen_fixed_up(e.pageX,e.pageY,_))}else if(a===n.ZOOM&&!d.noZoom){s=d.getMouseOnScreen(e.pageX,e.pageY,s);o.copy(s)}else if(a===n.PAN&&!d.noPan){h=d.getMouseOnScreen(e.pageX,e.pageY,h);u.copy(h)}document.addEventListener("mousemove",f,false);document.addEventListener("mouseup",v,false)}function f(e){if(!d.enabled)return;e.preventDefault();e.stopPropagation();if(a===n.ROTATE&&!d.noRotate){y=d.getMouseProjectionOnBall(e.pageX,e.pageY,y);d.rotate_with_up_fixed&&d.getMouseOnScreen_fixed_up(e.pageX,e.pageY,E)}else if(a===n.ZOOM&&!d.noZoom){o=d.getMouseOnScreen(e.pageX,e.pageY,o)}else if(a===n.PAN&&!d.noPan){u=d.getMouseOnScreen(e.pageX,e.pageY,u)}}function v(e){if(!d.enabled)return;e.preventDefault();e.stopPropagation();a=n.NONE;document.removeEventListener("mousemove",f);document.removeEventListener("mouseup",v)}function w(e){if(!d.enabled)return;e.preventDefault();e.stopPropagation();var t=0;if(e.deltaY){t=e.deltaY/(e.deltaMode==0?40:1)}else if(e.wheelDelta){t=e.wheelDelta/40}else if(e.detail){t=-e.detail/3}s.y+=t*.01}function M(e){if(d.enabled===false)return;var t=[];for(var i=0;i1){s.normalize()}else{s.z=Math.sqrt(1-o*o)}this._eye.copy(this.object.position).sub(this.target);i.copy(this.object.up).setLength(s.y);i.add(this.objectUp.copy(this.object.up).cross(this._eye).setLength(s.x));i.add(this._eye.setLength(s.z));return i},checkDistances:function(){if(!this.noZoom||!this.noPan){if(this._eye.lengthSq()>this.maxDistance*this.maxDistance){this.object.position.addVectors(this.target,this._eye.setLength(this.maxDistance))}if(this._eye.lengthSq()this.EPS){this.lastPosition.copy(this.object.position)}}};jThree.Trackball=function(e){var i=[];jThree(isFinite(e)?"rdr:eq("+e+")":e||"rdr").each(function(){var t=new THREE.TrackballControls(jThree.three(jThree.getCamera(this)),jThree.getCanvas(this));jThree.update(this,function(){t.callback&&t.callback();t.update()});jThree(this).resize(function(){t.resize()}).on("attrChange",function(e){if(e.attrName!=="camera")return;t.object=jThree.three(jThree.getCamera(this));t.target=t.object._lookAt});i.push(t)});if(self.MMD_SA)MMD_SA._trackball_camera=i[0];return i.length>1?i:i[0]}; (function(){function a(){d.call(this),this.type='AudioListener',this.context=j.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0}function b(k){d.call(this),this.type='Audio',this.listener=k,this.context=k.context,this.gain=this.context.createGain(),this.gain.connect(k.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.startTime=0,this.offset=0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.sourceType='empty',this.filters=[]}function c(k){b.call(this,k),this.panner=this.context.createPanner(),this.panner.connect(this.gain)}var d=THREE.Object3D,e=THREE.Vector3,f=THREE.Quaternion,g=THREE.Clock,h,j={getContext:function(){return void 0===h&&(h=new(window.AudioContext||window.webkitAudioContext)),h},setContext:function(k){h=k}};a.prototype=Object.assign(Object.create(d.prototype),{constructor:a,getInput:function(){return this.gain},removeFilter:function(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this},getFilter:function(){return this.filter},setFilter:function(k){return null===this.filter?this.gain.disconnect(this.context.destination):(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)),this.filter=k,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(k){return this.gain.gain.setTargetAtTime(k,this.context.currentTime,0.01),this},updateMatrixWorld:function(){var k=new e,m=new f,n=new e,o=new e,p=new g;return function(r){d.prototype.updateMatrixWorld.call(this,r);var s=this.context.listener,t=this.up;if(this.timeDelta=p.getDelta(),this.matrixWorld.decompose(k,m,n),o.set(0,0,-1).applyQuaternion(m),s.positionX){var u=this.context.currentTime+this.timeDelta;s.positionX.linearRampToValueAtTime(k.x,u),s.positionY.linearRampToValueAtTime(k.y,u),s.positionZ.linearRampToValueAtTime(k.z,u),s.forwardX.linearRampToValueAtTime(o.x,u),s.forwardY.linearRampToValueAtTime(o.y,u),s.forwardZ.linearRampToValueAtTime(o.z,u),s.upX.linearRampToValueAtTime(t.x,u),s.upY.linearRampToValueAtTime(t.y,u),s.upZ.linearRampToValueAtTime(t.z,u)}else s.setPosition(k.x,k.y,k.z),s.setOrientation(o.x,o.y,o.z,t.x,t.y,t.z)}}()}),b.prototype=Object.assign(Object.create(d.prototype),{constructor:b,getOutput:function(){return this.gain},setNodeSource:function(k){return this.hasPlaybackControl=!1,this.sourceType='audioNode',this.source=k,this.connect(),this},setMediaElementSource:function(k){return this.hasPlaybackControl=!1,this.sourceType='mediaNode',this.source=this.context.createMediaElementSource(k),this.connect(),this},setBuffer:function(k){return this.buffer=k,this.sourceType='buffer',this.autoplay&&this.play(),this},play:function(){if(!0===this.isPlaying)return void console.warn('THREE.Audio: Audio is already playing.');if(!1===this.hasPlaybackControl)return void console.warn('THREE.Audio: this Audio has no playback control.');this._player&&this._player._dispatchEvent('playing');var k=this.context.createBufferSource();return k.buffer=this.buffer,k.detune.value=this.detune,k.loop=this.loop,k.onended=this.onEnded.bind(this),k.playbackRate.setValueAtTime(this.playbackRate,this.startTime),this.startTime=this.context.currentTime,k.start(this.startTime,this.offset),this.isPlaying=!0,this.source=k,this.connect()},pause:function(){return!1===this.hasPlaybackControl?void console.warn('THREE.Audio: this Audio has no playback control.'):(!0===this.isPlaying&&(this.source.stop(),this.source.onended=null,this.offset+=(this.context.currentTime-this.startTime)*this.playbackRate,this.isPlaying=!1),this)},stop:function(){return!1===this.hasPlaybackControl?void console.warn('THREE.Audio: this Audio has no playback control.'):(this.source.stop(),this.source.onended=null,this.offset=0,this.isPlaying=!1,this)},connect:function(){if(0/\.fbx$/i.test(m.path)).length;if(this.lengthload_length+2){DEBUG_show("loading error(?)",0,1);console.log("loading error(?)",this.length+"/"+load_length)}}},x_object_init:function(){function _x_object_show(forced){if(!MMD_SA._x_object_displayed_once)return;if(!this.visible||forced){this.visible=true;if(!/^\#mikuPmx/.test(this.id)){MMD_SA.THREEX.mesh_obj.get(this.id).show();return true}}}function _x_object_hide(forced){if(!MMD_SA._x_object_displayed_once)return;if(this.visible||forced){this.visible=false;if(!/^\#mikuPmx/.test(this.id)){MMD_SA.THREEX.mesh_obj.get(this.id).hide();return true}}}return function(){MMD_SA_options.x_object.forEach(function(x_object,idx){MMD_SA_options.x_object_by_name[x_object.path.replace(/^.+[\/\\]/,"").replace(/\.x$/i,"")]=x_object;x_object.id=x_object.id||"#x_object"+idx;x_object.show=_x_object_show;x_object.hide=_x_object_hide;x_object._obj=MMD_SA.THREEX.mesh_obj.get_three(x_object.id);if(x_object.boundingBox_list!=null){const bb_host=MMD_SA.get_bounding_host(x_object._obj);bb_host.boundingBox_list=[];x_object.boundingBox_list.forEach(function(bb){if(bb==null){bb_host.boundingBox_list.push(bb_host.boundingBox)}else{var b3=(new THREE.Box3).set(bb.min,bb.max);b3.oncollide=bb.oncollide;b3.onaway=bb.onaway;bb_host.boundingBox_list.push(b3)}});if(x_object.bb_adjust){bb_host.boundingBox_list.forEach(function(bb){if(x_object.bb_adjust.min)bb.min.add(x_object.bb_adjust.min)})}}if(x_object.scale==null)x_object.scale=x_object._obj.scale.x==0?0:1;x_object.visible=x_object.hidden_on_start?false:x_object._obj.scale.x>0});MMD_SA_options.mesh_obj.forEach(function(x_object,idx){MMD_SA_options.mesh_obj_by_id[x_object.id]=MMD_SA_options.mesh_obj_by_id["#"+x_object.id]=x_object;x_object.id="#"+x_object.id;x_object.show=_x_object_show;x_object.hide=_x_object_hide;if(/^\#mikuPmx(\d+)$/.test(x_object.id)){x_object._obj=THREE.MMD.getModels()[parseInt(RegExp.$1)].mesh;Object.defineProperty(x_object,"visible",{get:function(){return this._obj.visible},set:function(v){this._obj.visible=v}});if(x_object.scale==null)x_object.scale=1;x_object.visible=true}else{if(!x_object._obj)x_object._obj=MMD_SA.THREEX.mesh_obj.get_three(x_object.id);var mesh=x_object._obj.children.length?x_object._obj.children[0]:x_object._obj;if(x_object.castShadow){mesh.castShadow=true}if(x_object.receiveShadow){mesh.receiveShadow=true}if(x_object.scale==null)x_object.scale=x_object._obj.scale.x==0?0:1;x_object.visible=x_object.hidden_on_start?false:x_object._obj.scale.x>0}});MMD_SA_options.mesh_obj_all=MMD_SA_options.x_object.concat(MMD_SA_options.mesh_obj)}}(),init:function(){var $=jThree;this.x_object_init();var fn=this;var model=THREE.MMD.getModels()[0];var _material_list=[];model.pmx.materials.forEach(function(m){_material_list.push(m.name)});MMD_SA._material_list=_material_list;var _model_list=[{path:MMD_SA_options.model_path_default}];for(var model_name in MMD_SA_options.MME_saved){var model_obj=MMD_SA_options.MME_saved[model_name];if(model_obj.path_full)_model_list.push({path:toLocalPath(model_obj.path_full)})}_model_list.forEach(function(obj){var model_path=obj.path;if(!/^(\w+\:|\/)/.test(model_path))model_path=System.Gadget.path+toLocalPath("\\"+model_path);obj.in_use=model_path==MMD_SA_options.model_path||MMD_SA_options.model_path_extra.indexOf(model_path)!=-1});MMD_SA._model_list=_model_list;THREE.MMD.getModels().forEach(function(_model){_model.skin_MMD_SA_extra=[MMD_SA.Animation_dummy];_model.morph_MMD_SA_extra=[MMD_SA.Animation_dummy]});MMD_SA.MMD={MotionManager:function(){this._model_index=0},setFrameNumber:function(){},play:function(){jThree.MMD.play()},pause:function(){jThree.MMD.pause()}};Object.defineProperty(MMD_SA.MMD.MotionManager.prototype,"lastFrame",{get:function(){var obj=THREE.MMD.getModels()[this._model_index]._MMD_SA_cache[this.para_SA._path];return obj.skin.duration*30}});Object.defineProperty(MMD_SA.MMD.MotionManager.prototype,"_timeMax",{get:function(){var obj=THREE.MMD.getModels()[this._model_index]._MMD_SA_cache[this.para_SA._path];return obj.skin._timeMax}});Object.defineProperty(MMD_SA.MMD.MotionManager.prototype,"lastFrame_",{get:function(){if(this._lastFrame_!=null)return this._lastFrame_;var m0=MMD_SA.MMD.motionManager;return m0.para_SA.multi_model_motion_list&&m0.para_SA.multi_model_motion_list.indexOf(this.filename)!=-1?m0._lastFrame_:this.lastFrame},set:function(v){this._lastFrame_=v}});Object.defineProperty(MMD_SA.MMD.MotionManager.prototype,"firstFrame_",{get:function(){if(this._firstFrame_!=null)return this._firstFrame_;var m0=MMD_SA.MMD.motionManager;return m0.para_SA.multi_model_motion_list&&m0.para_SA.multi_model_motion_list.indexOf(this.filename)!=-1?m0._firstFrame_:0},set:function(v){this._firstFrame_=v}});MMD_SA.motion=[];var motion_default=MMD_SA_options.motion_shuffle_list_default&&MMD_SA_options.motion_shuffle_list_default[0]||0;window.dispatchEvent(new CustomEvent("SA_MMD_before_motion_init"));for(var i=0,len=MMD_SA_options.motion.length;i0&&!model_para.is_PC_candidate&&(para||!model_para.mirror_motion_from_first_model)){motion_skipped=true}if(model_para.motion_name_default==filename){motion_skipped=false}if(motion_skipped){if(idx==MMD_SA_options.model_para_obj_all.length-1&&(!MMD_SA.motion.length||MMD_SA.motion[MMD_SA.motion.length-1].filename!=filename))MMD_SA.motion.push({});return}obj=model.setupMotion_MMD_SA(vmd,motion.match,para);para_SA=MMD_SA_options.motion_para[filename]||para_SA;skin=obj.skin;morph=obj.morph;if(para){skin._is_MMD_SA_custom_animation=morph._is_MMD_SA_custom_animation=MMD_SA.custom_action_index&&i>=MMD_SA.custom_action_index&&i0&&!model_para.mirror_motion_from_first_model)model_para.motion_name_default=filename}model._MMD_SA_cache_current=obj;model.skin=skin;model.morph=morph;THREE.MMD.adjustMotionDuration()}})}MMD_SA.motion_max_default=MMD_SA_options.motion.length;MMD_SA.MMD.motionManager=MMD_SA.motion[0];if(MMD_SA_options.use_speech_bubble){MMD_SA.SpeechBubble.onload()}MMD_SA._tray_updatable=true;System._browser.update_tray();setTimeout(function(){MMD_SA.MMD_started=true;resize();$.MMD.cameraMotion=true;MMD_SA._head_pos=new THREE.Vector3(0,15,0);MMD_SA_options.model_para_obj.onMotionChange&&MMD_SA_options.model_para_obj.onMotionChange();var simulateCallback=(()=>{const rot_filter={};const rot_filter_para={minCutOff:1,beta:1,dCutOff:1};return function(){var that=this;var mesh=this.mesh;var accessory_list=MMD_SA_options.Dungeon&&MMD_SA_options.Dungeon.accessory_list||MMD_SA_options.mesh_obj_all;accessory_list.forEach(function(x_object){var p_bone=x_object.parent_bone;if(!p_bone)return;var model_index=p_bone.model_index||0;if(that._model_index!=model_index)return;const obj=x_object._obj;if(MMD_SA_options.Dungeon){if(!mesh.visible||p_bone.disabled){if(!mesh.visible||!x_object.placement?.position||p_bone.attached&&!p_bone._detached_){x_object._obj_proxy.hidden=true;x_object._obj_proxy.visible=false}else{if(p_bone.attached){p_bone.attached=false;obj.matrixAutoUpdate=true;x_object._obj_proxy.hidden=false;x_object._obj_proxy.visible=true;obj.position.copy(p_bone._detached_.pos);obj.quaternion.copy(p_bone._detached_.rot)}else{if(!p_bone._detached_)p_bone._detached_={pos:new THREE.Vector3,rot:new THREE.Quaternion};p_bone._detached_.pos.copy(obj.position);p_bone._detached_.rot.copy(obj.quaternion)}}return}x_object._obj_proxy.hidden=false;x_object._obj_proxy.visible=true}if(p_bone.condition&&!p_bone.condition(x_object,model_index))return;var para_SA=MMD_SA.motion[that.skin._motion_index].para_SA;var x_para;x_para=para_SA.adjustment_per_model&&(para_SA.adjustment_per_model[MMD_SA_options.model_para_obj._filename]||para_SA.adjustment_per_model[MMD_SA_options.model_para_obj._filename_cleaned]);x_para=x_para&&x_para.accessory_default&&x_para.accessory_default[x_object.path.replace(/^.+[\/\\]/,"")];if(x_para)p_bone=x_para.parent_bone;var is_root=p_bone.name=="ROOT";var bone;if(!is_root){bone=mesh.bones_by_name[p_bone.name];if(!bone)return}x_object.parent_bone.attached=true;var pos,rot;var model_mesh,modelX;modelX=MMD_SA.THREEX.get_model(model_index);if(is_root){model_mesh=MMD_SA.THREEX._THREE.MMD.getModels()[model_index].mesh;rot=MMD_SA._q2.copy(model_mesh.bones_by_name["全ての親"].quaternion)}if(MMD_SA.THREEX.enabled){if(is_root){const hips=modelX.getBoneNode("hips");pos=MMD_SA.THREEX.v1.copy(hips.position);if(!p_bone.hips_as_root){pos.y=0}pos=modelX.process_position(pos).multiplyScalar(MMD_SA.THREEX.VRM.vrm_scale)}else{const boneX=modelX.get_bone_by_MMD_name(p_bone.name);if(!boneX)return;pos=MMD_SA.THREEX.v1;rot=MMD_SA.THREEX.q1;boneX.matrixWorld.decompose(MMD_SA.THREEX.v1,MMD_SA.THREEX.q1,MMD_SA.THREEX.v2);const mesh_rot_inv=MMD_SA.THREEX.q2.copy(modelX.mesh.quaternion).conjugate();pos.sub(modelX.mesh.position).applyQuaternion(mesh_rot_inv);rot.premultiply(mesh_rot_inv);if(modelX.type=="VRM"&&!modelX.is_VRM1){rot.premultiply(MMD_SA.THREEX.q2.set(0,1,0,0));rot.x*=-1;rot.z*=-1}}}else{obj.useQuaternion=true;if(is_root){bone=mesh.bones_by_name["センター"]}bone_objs=bone.skinMatrix.decompose();pos=bone_objs[0];if(is_root){if(p_bone.hips_as_root){pos.y=MMD_SA.TEMP_v3.setFromMatrixPosition(mesh.bones_by_name["下半身"].skinMatrix).y}else{pos.y=0}}if(!rot)rot=bone_objs[1]}obj.position.copy(pos);if(p_bone.position){const obj_pos_offset=MMD_SA.TEMP_v3.set(p_bone.position.x,p_bone.position.y,-p_bone.position.z);if(p_bone.position.scale_base)obj_pos_offset.multiply(obj.scale).multiplyScalar(1/p_bone.position.scale_base);if(is_root&&System._browser.camera.poseNet.enabled&&System._browser.camera.poseNet.frames.skin["センター"]?.[0]._hip_adjustment_offset){obj_pos_offset.sub(MMD_SA._v3a.copy(System._browser.camera.poseNet.frames.skin["センター"][0]._hip_adjustment_offset).setY(0))}obj_pos_offset.applyQuaternion(rot);obj.position.add(obj_pos_offset)}obj.quaternion.copy(rot);let obj_rot;if(p_bone.rotation){if(p_bone.rotation.fixed){obj.quaternion.set(0,0,0,1);obj_rot=MMD_SA._q1.setFromEuler(MMD_SA.TEMP_v3.set(-p_bone.rotation.fixed.x,-p_bone.rotation.fixed.y,p_bone.rotation.fixed.z).multiplyScalar(Math.PI/180),"YXZ")}else{obj_rot=MMD_SA._q1.setFromEuler(MMD_SA.TEMP_v3.set(-p_bone.rotation.x,-p_bone.rotation.y,p_bone.rotation.z).multiplyScalar(Math.PI/180),"YXZ")}obj.quaternion.multiply(obj_rot)}var m4_objs=MMD_SA.TEMP_m4.makeFromPositionQuaternionScale(obj.position,obj.quaternion,obj.scale).multiplyMatrices(mesh.matrixWorld,MMD_SA.TEMP_m4).decompose();obj.position.copy(m4_objs[0]);obj.quaternion.copy(m4_objs[1]);if(p_bone.rotation){let transfer_to_parent_bone;const rot_adjust=p_bone.rotation.align_with_external_point;if(rot_adjust)x_object.user_data._rot_default_=(x_object.user_data._rot_default_||new THREE.Quaternion).copy(obj.quaternion);if(rot_adjust&&(!rot_adjust.mocap_only||System._browser.camera.poseNet.enabled&&System._browser.camera.ML_warmed_up)){const rot_original=MMD_SA._q2.copy(obj.quaternion);transfer_to_parent_bone=rot_adjust.transfer_to_parent_bone&&(System._browser.camera.poseNet.enabled&&System._browser.camera.ML_warmed_up);if(transfer_to_parent_bone){const aa=obj_rot.toAxisAngle();obj.quaternion.setFromAxisAngle(aa[0].applyQuaternion(MMD_SA.TEMP_q.copy(MMD_SA_options.model_para_obj.rot_hand_adjust_base[p_bone.name.charAt(0)=="左"?1:-1]).conjugate()),-aa[1])}else if(rot_adjust.reset_rotation){obj.quaternion.set(0,0,0,1)}let reference_origin=MMD_SA._v3b_.set(0,0,0);let axis_origin=MMD_SA._v3a_.copy(obj.position);if(rot_adjust.reference_origin){if(rot_adjust.reference_origin=="parent_bone"){axis_origin=modelX.get_bone_position_by_MMD_name(p_bone.name)}else{const a=MMD_SA._v3a.copy(rot_adjust.reference_origin);const m=MMD_SA._v3b.copy(rot_adjust.reference_point);m.sub(a);const t=(0-(a.x*m.x+a.y*m.y+a.z*m.z))/m.lengthSq();reference_origin.set(a.x+m.x*t,a.y+m.y*t,a.z+m.z*t);axis_origin.copy(reference_origin).multiply(x_object._mesh.scale).applyQuaternion(obj.quaternion).add(obj.position)}}let axis_ext,bone_rot,d;if(rot_adjust.external_point.type=="bone"){d=rot_adjust.external_point.name.indexOf("left")!=-1?"左":rot_adjust.external_point.name.indexOf("right")!=-1?"右":"";let bone_pos;let bone_ext;if(rot_adjust.external_point.name.indexOf("hand")!=-1){if(System._browser.camera.poseNet.enabled&&(!MMD_SA.MMD.motionManager.para_SA.motion_tracking_upper_body_only||!System._browser.camera.poseNet.frames.get_blend_default_motion("skin",d+"腕IK"))){bone_pos=modelX.get_bone_position_by_MMD_name(d+"手首");bone_ext=MMD_SA.TEMP_v3.set(0,0,0);if(rot_adjust.external_point.offset)bone_ext.add(rot_adjust.external_point.offset);bone_rot=modelX.get_bone_rotation_by_MMD_name(d+"手首");bone_ext.applyQuaternion(MMD_SA_options.model_para_obj.rot_arm_adjust[d+"腕"].axis_rot).applyQuaternion(bone_rot)}}else if(rot_adjust.external_point.name.indexOf("arm")!=-1){bone_pos=modelX.get_bone_position_by_MMD_name(d+"腕");bone_ext=MMD_SA.TEMP_v3.set(0,0,0);if(rot_adjust.external_point.offset)bone_ext.add(rot_adjust.external_point.offset);bone_rot=modelX.get_bone_rotation_by_MMD_name(!rot_adjust.external_point.offset?.ignore_local_rotation?d+"腕":"上半身2");bone_ext.applyQuaternion(bone_rot)}else if(rot_adjust.external_point.name=="head"){bone_pos=modelX.get_bone_position_by_MMD_name("頭");bone_ext=MMD_SA.TEMP_v3.set(0,0,0);if(rot_adjust.external_point.offset)bone_ext.add(rot_adjust.external_point.offset);bone_rot=modelX.get_bone_rotation_by_MMD_name("頭");bone_ext.applyQuaternion(bone_rot)}if(bone_pos){if(bone_ext)bone_pos.add(bone_ext);axis_ext=bone_pos}}else if(rot_adjust.external_point.type=="object3D"){const object3d=MMD_SA.THREEX._XR_Animator_scene_.object3D_list.find(obj=>obj.id==rot_adjust.external_point.name);if(object3d){const _x_object=MMD_SA.THREEX._object3d_list_.find(obj=>obj.uuid==object3d._object3d_uuid);axis_ext=MMD_SA._v3b.copy(rot_adjust.external_point.reference_point).multiply(_x_object._mesh.scale).applyQuaternion(_x_object._mesh.quaternion).add(_x_object._mesh.position)}}if(axis_ext){let weight=1;if(rot_adjust.weight_by_distance){const v_ref=MMD_SA._v3a.copy(rot_adjust.reference_point).multiply(x_object._mesh.scale).applyQuaternion(rot_original).add(obj.position).sub(axis_ext);let v_ext=MMD_SA.THREEX.v3.copy(rot_adjust.external_point.normal||{x:0,y:0,z:1});if(bone_rot)v_ext.applyQuaternion(bone_rot);let dis=v_ref.length();let power=1-(rot_adjust.weight_by_distance.power||0);let v_dot=v_ref.normalize().dot(v_ext);if(v_dot<0){power*=1-Math.min(-v_dot*2,1)}let dis_ratio=1-dis/rot_adjust.weight_by_distance.radius;if(power){weight=dis_ratio<0?0:Math.pow(dis_ratio,power)}axis_ext.sub(axis_origin);if(transfer_to_parent_bone){let v_dot2=MMD_SA.TEMP_v3.copy(axis_ext).normalize().dot(v_ext);let dis2=axis_ext.length()}}else{axis_ext.sub(axis_origin)}let axis_ref=MMD_SA._v3a.copy(rot_adjust.reference_point).sub(reference_origin);axis_ref.normalize().applyQuaternion(obj.quaternion);axis_ref.multiplyScalar(axis_ext.length()).add(axis_origin).sub(obj.position);axis_ext=axis_ext.add(axis_origin).sub(obj.position);axis_ref.normalize();axis_ext.normalize();const obj_rot_aligned=MMD_SA.TEMP_q.setFromUnitVectors(axis_ref,axis_ext);obj.quaternion.premultiply(obj_rot_aligned);if(transfer_to_parent_bone){x_object._rot_aligned_=obj_rot_aligned.clone();x_object._rot_aligned_weight_=weight;obj.quaternion.copy(rot_original)}}}const data_filter=p_bone.rotation.data_filter;if(data_filter){if(!x_object.uuid)x_object.uuid=THREE.Math.generateUUID();let _rot_filter=rot_filter[x_object.uuid];if(!_rot_filter)_rot_filter=rot_filter[x_object.uuid]=new System._browser.data_filter([{type:"one_euro",id:"propr_rot",para:[30,1,1,1,4]}]);Object.assign(_rot_filter.filters[0].filter,rot_filter_para,data_filter);if(transfer_to_parent_bone&&x_object._rot_aligned_){x_object._rot_aligned_.fromArray(_rot_filter.filter(x_object._rot_aligned_.toArray()))}else{obj.quaternion.fromArray(_rot_filter.filter(obj.quaternion.toArray()))}}}if(obj.updateMatrix){obj.matrixAutoUpdate=false;obj.updateMatrix()}})}})();THREE.MMD.getModels().forEach(function(_model,idx){_model.simulateCallback=simulateCallback});var PPE=MMD_SA_options.MME.PostProcessingEffects;MMD_SA_options._PPE_enabled=PPE.enabled;if(MMD_SA_options.PPE_disabled_on_idle){if(MMD_SA_options._PPE_enabled){PPE.enabled=false}}MMD_SA.fadeout_opacity=.95;MMD_SA.fadeout_canvas.width=SL.width;MMD_SA.fadeout_canvas.height=SL.height;var context=MMD_SA.fadeout_canvas.getContext("2d");context.globalCompositeOperation="copy";context.globalAlpha=.01;context.fillRect(0,0,SL.width,SL.height);context.globalAlpha=1;MMD_SA_options.model_para_obj_all.forEach(function(model_para,idx){var mesh=THREE.MMD.getModels()[idx].mesh;if(model_para.position_loading||model_para.bone_connection||mesh.bones_by_name["全ての親"])mesh.position.set(0,0,0);if(model_para.scale)mesh.scale.set(model_para.scale,model_para.scale,model_para.scale)});THREE.MMD.getModels().forEach(function(){function matrixWorld_physics(mesh){this.mesh=mesh;this.m4=new THREE.Matrix4;this.pos=new THREE.Vector3;this.pos_world=new THREE.Vector3;this.reset()}matrixWorld_physics.prototype.reset=function(){this.pos.set(0,0,0);this.pos_world.set(0,0,0)};matrixWorld_physics.prototype.update=function(){this.m4.copy(this.mesh.matrixWorld);_v3a.getPositionFromMatrix(this.m4);_v3b.copy(_v3a).sub(this.pos_world);_v3b.multiplyScalar(MMD_SA_options.matrixWorld_physics_scale);this.pos.add(_v3b);this.pos_world.copy(_v3a);_v3b.y+=this.mesh._model_index*25;this.m4.setPosition(_v3b)};var _v3a=new THREE.Vector3;var _v3b=new THREE.Vector3;return function(_model){let mesh=_model.mesh;mesh.matrixWorld_physics=new matrixWorld_physics(mesh)}}());MMD_SA_options.onstart&&MMD_SA_options.onstart();window.dispatchEvent(new CustomEvent("MMDStarted"));MMD_SA.toggle_shadowMap();$.MMD.play(true);DEBUG_show("(MMD started)",2);if(MMD_SA.use_webgl2)DEBUG_show("Use WebGL2",2);if(MMD_SA.use_MSAA_FBO)DEBUG_show("Use MSAA FBO",2)},0);if(jThree.Trackball)jThree.trackball=jThree.Trackball;$.trackball();if(!returnBoolean("MMDTrackballCamera"))MMD_SA._trackball_camera.stop();MMD_SA_options.edgeScale=MMD_SA_options.model_para_obj.edgeScale>=0?MMD_SA_options.model_para_obj.edgeScale:MMD_SA_options.edgeScale>=0?MMD_SA_options.edgeScale:1;$.MMD.edgeScale=parseFloat(System.Gadget.Settings.readString("MMDEdgeScale")||Settings_default.MMDEdgeScale)*MMD_SA_options.edgeScale;jQuery("canvas").on("mousedown mousewheel DOMMouseScroll",function(){$.MMD.cameraMotion=false}).dblclick(function(){$.MMD.cameraMotion=true})}};(function(){MMD_SA.TEMP_q=new THREE.Quaternion;MMD_SA._q1=new THREE.Quaternion;MMD_SA._q2=new THREE.Quaternion;MMD_SA.TEMP_v3=new THREE.Vector3;MMD_SA._v3a=new THREE.Vector3;MMD_SA._v3b=new THREE.Vector3;MMD_SA.TEMP_m4=new THREE.Matrix4;MMD_SA._m4a=new THREE.Matrix4;MMD_SA._m4b=new THREE.Matrix4;MMD_SA.TEMP_b3=new THREE.Box3;MMD_SA._v3a_=new THREE.Vector3;MMD_SA._v3b_=new THREE.Vector3;MMD_SA.process_bone=function(bone,rotation,mod){const euler_order=MMD_SA.MMD.motionManager.para_SA.look_at_screen_euler_order||"XYZ";const bone_rotation=MMD_SA._v3a_.setEulerFromQuaternion(bone.quaternion,euler_order);if(mod){bone_rotation.x*=mod[0];bone_rotation.y*=mod[1];bone_rotation.z*=mod[2]}if(rotation instanceof THREE.Quaternion)rotation=MMD_SA._v3b_.setEulerFromQuaternion(rotation,euler_order);bone_rotation.add(rotation);bone.quaternion.setFromEuler(bone_rotation,euler_order)};MMD_SA.copy_first_bone_frame=function(index,skin,match){if(!match)match=MMD_SA_options.motion[index].match;var RE=match&&match.skin_jThree?match.skin_jThree:null;if(!skin._is_skin)skin=THREE.MMD.getModels()[0].skin_MMD_SA_extra[skin._motion_index_extra];var mesh=skin.mesh;skin.targets.forEach(function(v){var k0=v.keys[0];if(!k0||RE&&!RE.test(k0.name)||k0.time){return}var bone=mesh.bones_by_name[k0.name];var gbone=mesh.geometry.bones[bone._index];k0.pos[0]=bone.position.x-gbone.pos[0];k0.pos[1]=bone.position.y-gbone.pos[1];k0.pos[2]=bone.position.z-gbone.pos[2];k0.rot=bone.quaternion.toArray()})};MMD_SA.reset_skin=function(model_index){THREE.MMD.getModels().forEach(function(model,idx){if(model_index!=null&&idx!=model_index)return;var s=model.skin;if(!s||s._is_dummy){return}var mesh=s.mesh;var geom=mesh.geometry;for(var i=0,max=mesh.bones.length;i0){if(backfaceCulling)return null;sign=1}else if(DdN<0){sign=-1;DdN=-DdN}else{return null}diff.subVectors(this.origin,a);var DdQxE2=sign*this.direction.dot(edge2.crossVectors(diff,edge2));if(DdQxE2<0){return null}var DdE1xQ=sign*this.direction.dot(edge1.cross(diff));if(DdE1xQ<0){return null}if(DdQxE2+DdE1xQ>DdN){return null}var QdN=-sign*diff.dot(normal);if(QdN<0){return null}return this.at(QdN/DdN,optionalTarget)}}();MMD_SA.bone_to_position=function(){var bone_pos=new THREE.Vector3;var pos_delta=new THREE.Vector3;var bone_pos_adjusted=new THREE.Vector3;var _v3a=new THREE.Vector3;function BP(){this.by_bone_name=[];this.pos_delta=new THREE.Vector3;this.pos_delta_rotated=new THREE.Vector3;this.bone_pos_offset=new THREE.Vector3}BP.prototype.init=function(mesh,bone_name,path,motion_time){var para=this.by_bone_name[bone_name];if(!para){para=this.by_bone_name[bone_name]={gbone:{position:(new THREE.Vector3).fromArray(mesh.geometry.bones[mesh.bones_by_name[bone_name]._index].pos)},position:new THREE.Vector3,quaternion:new THREE.Quaternion,path:"",motion_time:0}}if(para.path!=path||para.motion_time>motion_time){para.position.set(0,0,0);para.quaternion.set(0,0,0,1);para.path=path}para.motion_time=motion_time;this.gbone=para.gbone;this.position=para.position;this.quaternion=para.quaternion};return function(para_SA){var that=this;if(!that.skin)return null;var mesh=this.mesh;if(mesh._bone_to_position_last){mesh._bone_to_position_last.pos_delta.set(0,0,0);mesh._bone_to_position_last.pos_delta_rotated.set(0,0,0);mesh._bone_to_position_last.bone_pos_offset.set(0,0,0)}else mesh._bone_to_position_last=new BP;if(!para_SA.bone_to_position)return null;var motion_para=para_SA.adjustment_per_model&&(para_SA.adjustment_per_model[MMD_SA_options.model_para_obj_all[this._model_index]._filename_cleaned]||para_SA.adjustment_per_model._default_)||{};para_SA.bone_to_position.forEach(function(bp){var bone_name=bp.name;var bone_scale=bp.scale||{x:1,y:1,z:1};var bone=mesh.bones_by_name[bone_name];var time=that.skin.time;var frame=time*30;mesh._bone_to_position_last.init(mesh,bone_name,para_SA._path,time);if(!bp.frame_range||bp.frame_range.some(function(r){return frame>=r[0]&&frame<=r[1]})){bone_pos.copy(bone.position).sub(mesh._bone_to_position_last.gbone.position).multiply(bone_scale)}else{bone_pos.set(0,0,0)}bone_pos_adjusted.copy(bone_pos);var rot_add;var use_bone_rotated_translation;if(motion_para.skin_default){let motion_adjust=motion_para.skin_default[bone_name]||{};rot_add=motion_adjust.rot_add||motion_adjust.rot;if(!rot_add&&!para_SA.bone_to_position.some(function(_bp){return _bp.name=="全ての親"})){motion_adjust=motion_para.skin_default["全ての親"]||{};rot_add=motion_adjust.rot_add||motion_adjust.rot;use_bone_rotated_translation=!!rot_add}if(rot_add){bone_pos_adjusted.applyEuler(_v3a.copy(rot_add).multiplyScalar(Math.PI/180))}}if(!bp.position_disabled){pos_delta.copy(bone_pos_adjusted).sub(mesh._bone_to_position_last.position);mesh._bone_to_position_last.position.copy(bone_pos_adjusted)}else{pos_delta.set(0,0,0);bone_pos_adjusted.set(0,0,0)}if(bone_name=="全ての親"){bone.position.sub(bone_pos);mesh._bone_to_position_last.bone_pos_offset.add(bone_pos)}else{let pos_offset=use_bone_rotated_translation?bone_pos.applyEuler(_v3a.copy(rot_add).multiplyScalar(Math.PI/180)):bone_pos;mesh.bones_by_name["全ての親"].position.sub(pos_offset);mesh._bone_to_position_last.bone_pos_offset.add(pos_offset)}mesh._bone_to_position_last.pos_delta.add(pos_delta)});mesh._bone_to_position_last.pos_delta_rotated.copy(mesh._bone_to_position_last.pos_delta).applyQuaternion(mesh.quaternion);return mesh._bone_to_position_last.pos_delta}}();if(MMD_SA.use_jThree_v1)jThree.goml("index.goml");var Misc={extractPathBase:function(path){var a=path.split("/");a.pop();return a.length===0?"":a.join("/")+"/"},extractPathExt:function(path){var ext=path.split(".").pop();if(ext===path){return""}return ext}}})(); +MMD_SA.fn={length:1+1,load_length_extra:MMD_SA_options.load_length_extra||0,_ready_for_model_creation:[],_model_creation_timerID:[],setupUI:function(e){this.length++;var t=MMD_SA_options.motion.length+(MMD_SA_options.x_object.length+MMD_SA.GOML_head_list.length)+1+this.load_length_extra;t+=MMD_SA_options.model_path_extra.length;if(!this._ready_for_model_creation[0])t-=MMD_SA_options.motion.filter(e=>/\.fbx$/i.test(e.path)).length;if(this.lengtht+2){DEBUG_show("loading error(?)",0,1);console.log("loading error(?)",this.length+"/"+t)}}},x_object_init:function(){function _(e){if(!MMD_SA._x_object_displayed_once)return;if(!this.visible||e){this.visible=true;if(!/^\#mikuPmx/.test(this.id)){MMD_SA.THREEX.mesh_obj.get(this.id).show();return true}}}function n(e){if(!MMD_SA._x_object_displayed_once)return;if(this.visible||e){this.visible=false;if(!/^\#mikuPmx/.test(this.id)){MMD_SA.THREEX.mesh_obj.get(this.id).hide();return true}}}return function(){MMD_SA_options.x_object.forEach(function(t,e){MMD_SA_options.x_object_by_name[t.path.replace(/^.+[\/\\]/,"").replace(/\.x$/i,"")]=t;t.id=t.id||"#x_object"+e;t.show=_;t.hide=n;t._obj=MMD_SA.THREEX.mesh_obj.get_three(t.id);if(t.boundingBox_list!=null){const o=MMD_SA.get_bounding_host(t._obj);o.boundingBox_list=[];t.boundingBox_list.forEach(function(e){if(e==null){o.boundingBox_list.push(o.boundingBox)}else{var t=(new THREE.Box3).set(e.min,e.max);t.oncollide=e.oncollide;t.onaway=e.onaway;o.boundingBox_list.push(t)}});if(t.bb_adjust){o.boundingBox_list.forEach(function(e){if(t.bb_adjust.min)e.min.add(t.bb_adjust.min)})}}if(t.scale==null)t.scale=t._obj.scale.x==0?0:1;t.visible=t.hidden_on_start?false:t._obj.scale.x>0});MMD_SA_options.mesh_obj.forEach(function(e,t){MMD_SA_options.mesh_obj_by_id[e.id]=MMD_SA_options.mesh_obj_by_id["#"+e.id]=e;e.id="#"+e.id;e.show=_;e.hide=n;if(/^\#mikuPmx(\d+)$/.test(e.id)){e._obj=THREE.MMD.getModels()[parseInt(RegExp.$1)].mesh;Object.defineProperty(e,"visible",{get:function(){return this._obj.visible},set:function(e){this._obj.visible=e}});if(e.scale==null)e.scale=1;e.visible=true}else{if(!e._obj)e._obj=MMD_SA.THREEX.mesh_obj.get_three(e.id);var o=e._obj.children.length?e._obj.children[0]:e._obj;if(e.castShadow){o.castShadow=true}if(e.receiveShadow){o.receiveShadow=true}if(e.scale==null)e.scale=e._obj.scale.x==0?0:1;e.visible=e.hidden_on_start?false:e._obj.scale.x>0}});MMD_SA_options.mesh_obj_all=MMD_SA_options.x_object.concat(MMD_SA_options.mesh_obj)}}(),init:function(){var _=jThree;this.x_object_init();var e=this;var t=THREE.MMD.getModels()[0];var o=[];t.pmx.materials.forEach(function(e){o.push(e.name)});MMD_SA._material_list=o;var n=[{path:MMD_SA_options.model_path_default}];for(var i in MMD_SA_options.MME_saved){var a=MMD_SA_options.MME_saved[i];if(a.path_full)n.push({path:toLocalPath(a.path_full)})}n.forEach(function(e){var t=e.path;if(!/^(\w+\:|\/)/.test(t))t=System.Gadget.path+toLocalPath("\\"+t);e.in_use=t==MMD_SA_options.model_path||MMD_SA_options.model_path_extra.indexOf(t)!=-1});MMD_SA._model_list=n;THREE.MMD.getModels().forEach(function(e){e.skin_MMD_SA_extra=[MMD_SA.Animation_dummy];e.morph_MMD_SA_extra=[MMD_SA.Animation_dummy]});MMD_SA.MMD={MotionManager:function(){this._model_index=0},setFrameNumber:function(){},play:function(){jThree.MMD.play()},pause:function(){jThree.MMD.pause()}};Object.defineProperty(MMD_SA.MMD.MotionManager.prototype,"lastFrame",{get:function(){var e=THREE.MMD.getModels()[this._model_index]._MMD_SA_cache[this.para_SA._path];return e.skin.duration*30}});Object.defineProperty(MMD_SA.MMD.MotionManager.prototype,"_timeMax",{get:function(){var e=THREE.MMD.getModels()[this._model_index]._MMD_SA_cache[this.para_SA._path];return e.skin._timeMax}});Object.defineProperty(MMD_SA.MMD.MotionManager.prototype,"lastFrame_",{get:function(){if(this._lastFrame_!=null)return this._lastFrame_;var e=MMD_SA.MMD.motionManager;return e.para_SA.multi_model_motion_list&&e.para_SA.multi_model_motion_list.indexOf(this.filename)!=-1?e._lastFrame_:this.lastFrame},set:function(e){this._lastFrame_=e}});Object.defineProperty(MMD_SA.MMD.MotionManager.prototype,"firstFrame_",{get:function(){if(this._firstFrame_!=null)return this._firstFrame_;var e=MMD_SA.MMD.motionManager;return e.para_SA.multi_model_motion_list&&e.para_SA.multi_model_motion_list.indexOf(this.filename)!=-1?e._firstFrame_:0},set:function(e){this._firstFrame_=e}});MMD_SA.motion=[];var M=MMD_SA_options.motion_shuffle_list_default&&MMD_SA_options.motion_shuffle_list_default[0]||0;window.dispatchEvent(new CustomEvent("SA_MMD_before_motion_init"));for(var l=0,r=MMD_SA_options.motion.length;l0&&!a.is_PC_candidate&&(o||!a.mirror_motion_from_first_model)){r=true}if(a.motion_name_default==m){r=false}if(r){if(t==MMD_SA_options.model_para_obj_all.length-1&&(!MMD_SA.motion.length||MMD_SA.motion[MMD_SA.motion.length-1].filename!=m))MMD_SA.motion.push({});return}_=e.setupMotion_MMD_SA(c,p.match,o);d=MMD_SA_options.motion_para[m]||d;n=_.skin;i=_.morph;if(o){n._is_MMD_SA_custom_animation=i._is_MMD_SA_custom_animation=MMD_SA.custom_action_index&&l>=MMD_SA.custom_action_index&&l0&&!a.mirror_motion_from_first_model)a.motion_name_default=m}e._MMD_SA_cache_current=_;e.skin=n;e.morph=i;THREE.MMD.adjustMotionDuration()}})}MMD_SA.motion_max_default=MMD_SA_options.motion.length;MMD_SA.MMD.motionManager=MMD_SA.motion[0];if(MMD_SA_options.use_speech_bubble){MMD_SA.SpeechBubble.onload()}MMD_SA._tray_updatable=true;System._browser.update_tray();setTimeout(function(){MMD_SA.MMD_started=true;resize();_.MMD.cameraMotion=true;MMD_SA._head_pos=new THREE.Vector3(0,15,0);MMD_SA_options.model_para_obj.onMotionChange&&MMD_SA_options.model_para_obj.onMotionChange();var o=(()=>{const H={};const P={minCutOff:1,beta:1,dCutOff:1};return function(){var j=this;var R=this.mesh;var e=MMD_SA_options.Dungeon&&MMD_SA_options.Dungeon.accessory_list||MMD_SA_options.mesh_obj_all;e.forEach(function(l){var e=l.parent_bone;if(!e)return;var t=e.model_index||0;if(j._model_index!=t)return;const p=l._obj;if(MMD_SA_options.Dungeon){if(!R.visible||e.disabled){if(!R.visible||!l.placement?.position||e.attached&&!e._detached_){l._obj_proxy.hidden=true;l._obj_proxy.visible=false}else{if(e.attached){e.attached=false;p.matrixAutoUpdate=true;l._obj_proxy.hidden=false;l._obj_proxy.visible=true;p.position.copy(e._detached_.pos);p.quaternion.copy(e._detached_.rot)}else{if(!e._detached_)e._detached_={pos:new THREE.Vector3,rot:new THREE.Quaternion};e._detached_.pos.copy(p.position);e._detached_.rot.copy(p.quaternion)}}return}l._obj_proxy.hidden=false;l._obj_proxy.visible=true}if(e.condition&&!e.condition(l,t))return;var o=MMD_SA.motion[j.skin._motion_index].para_SA;var _;_=o.adjustment_per_model&&(o.adjustment_per_model[MMD_SA_options.model_para_obj._filename]||o.adjustment_per_model[MMD_SA_options.model_para_obj._filename_cleaned]);_=_&&_.accessory_default&&_.accessory_default[l.path.replace(/^.+[\/\\]/,"")];if(_)e=_.parent_bone;var n=e.name=="ROOT";var i;if(!n){i=R.bones_by_name[e.name];if(!i)return}l.parent_bone.attached=true;var a,r;var s,m;m=MMD_SA.THREEX.get_model(t);if(n){s=MMD_SA.THREEX._THREE.MMD.getModels()[t].mesh;r=MMD_SA._q2.copy(s.bones_by_name["全ての親"].quaternion)}if(MMD_SA.THREEX.enabled){if(n){const c=m.getBoneNode("hips");a=MMD_SA.THREEX.v1.copy(c.position);if(!e.hips_as_root){a.y=0}a=m.process_position(a).multiplyScalar(MMD_SA.THREEX.VRM.vrm_scale)}else{const u=m.get_bone_by_MMD_name(e.name);if(!u)return;a=MMD_SA.THREEX.v1;r=MMD_SA.THREEX.q1;u.matrixWorld.decompose(MMD_SA.THREEX.v1,MMD_SA.THREEX.q1,MMD_SA.THREEX.v2);const f=MMD_SA.THREEX.q2.copy(m.mesh.quaternion).conjugate();a.sub(m.mesh.position).applyQuaternion(f);r.premultiply(f);if(m.type=="VRM"&&!m.is_VRM1){r.premultiply(MMD_SA.THREEX.q2.set(0,1,0,0));r.x*=-1;r.z*=-1}}}else{p.useQuaternion=true;if(n){i=R.bones_by_name["センター"]}bone_objs=i.skinMatrix.decompose();a=bone_objs[0];if(n){if(e.hips_as_root){a.y=MMD_SA.TEMP_v3.setFromMatrixPosition(R.bones_by_name["下半身"].skinMatrix).y}else{a.y=0}}if(!r)r=bone_objs[1]}p.position.copy(a);if(e.position){const h=MMD_SA.TEMP_v3.set(e.position.x,e.position.y,-e.position.z);if(e.position.scale_base)h.multiply(p.scale).multiplyScalar(1/e.position.scale_base);if(n&&System._browser.camera.poseNet.enabled&&System._browser.camera.poseNet.frames.skin["センター"]?.[0]._hip_adjustment_offset){h.sub(MMD_SA._v3a.copy(System._browser.camera.poseNet.frames.skin["センター"][0]._hip_adjustment_offset).setY(0))}h.applyQuaternion(r);p.position.add(h)}p.quaternion.copy(r);let d;if(e.rotation){if(e.rotation.fixed){p.quaternion.set(0,0,0,1);d=MMD_SA._q1.setFromEuler(MMD_SA.TEMP_v3.set(-e.rotation.fixed.x,-e.rotation.fixed.y,e.rotation.fixed.z).multiplyScalar(Math.PI/180),"YXZ")}else{d=MMD_SA._q1.setFromEuler(MMD_SA.TEMP_v3.set(-e.rotation.x,-e.rotation.y,e.rotation.z).multiplyScalar(Math.PI/180),"YXZ")}p.quaternion.multiply(d)}var M=MMD_SA.TEMP_m4.makeFromPositionQuaternionScale(p.position,p.quaternion,p.scale).multiplyMatrices(R.matrixWorld,MMD_SA.TEMP_m4).decompose();p.position.copy(M[0]);p.quaternion.copy(M[1]);if(e.rotation){let M;const D=e.rotation.align_with_external_point;if(D)l.user_data._rot_default_=(l.user_data._rot_default_||new THREE.Quaternion).copy(p.quaternion);if(D&&(!D.mocap_only||System._browser.camera.poseNet.enabled&&System._browser.camera.ML_warmed_up)){const A=MMD_SA._q2.copy(p.quaternion);M=D.transfer_to_parent_bone&&(System._browser.camera.poseNet.enabled&&System._browser.camera.ML_warmed_up);if(M){const b=d.toAxisAngle();p.quaternion.setFromAxisAngle(b[0].applyQuaternion(MMD_SA.TEMP_q.copy(MMD_SA_options.model_para_obj.rot_hand_adjust_base[e.name.charAt(0)=="左"?1:-1]).conjugate()),-b[1])}else if(D.reset_rotation){p.quaternion.set(0,0,0,1)}let t=MMD_SA._v3b_.set(0,0,0);let a=MMD_SA._v3a_.copy(p.position);if(D.reference_origin){if(D.reference_origin=="parent_bone"){a=m.get_bone_position_by_MMD_name(e.name)}else{const E=MMD_SA._v3a.copy(D.reference_origin);const y=MMD_SA._v3b.copy(D.reference_point);y.sub(E);const g=(0-(E.x*y.x+E.y*y.y+E.z*y.z))/y.lengthSq();t.set(E.x+y.x*g,E.y+y.y*g,E.z+y.z*g);a.copy(t).multiply(l._mesh.scale).applyQuaternion(p.quaternion).add(p.position)}}let r,s,o;if(D.external_point.type=="bone"){o=D.external_point.name.indexOf("left")!=-1?"左":D.external_point.name.indexOf("right")!=-1?"右":"";let e;let t;if(D.external_point.name.indexOf("hand")!=-1){if(System._browser.camera.poseNet.enabled&&(!MMD_SA.MMD.motionManager.para_SA.motion_tracking_upper_body_only||!System._browser.camera.poseNet.frames.get_blend_default_motion("skin",o+"腕IK"))){e=m.get_bone_position_by_MMD_name(o+"手首");t=MMD_SA.TEMP_v3.set(0,0,0);if(D.external_point.offset)t.add(D.external_point.offset);s=m.get_bone_rotation_by_MMD_name(o+"手首");t.applyQuaternion(MMD_SA_options.model_para_obj.rot_arm_adjust[o+"腕"].axis_rot).applyQuaternion(s)}}else if(D.external_point.name.indexOf("arm")!=-1){e=m.get_bone_position_by_MMD_name(o+"腕");t=MMD_SA.TEMP_v3.set(0,0,0);if(D.external_point.offset)t.add(D.external_point.offset);s=m.get_bone_rotation_by_MMD_name(!D.external_point.offset?.ignore_local_rotation?o+"腕":"上半身2");t.applyQuaternion(s)}else if(D.external_point.name=="head"){e=m.get_bone_position_by_MMD_name("頭");t=MMD_SA.TEMP_v3.set(0,0,0);if(D.external_point.offset)t.add(D.external_point.offset);s=m.get_bone_rotation_by_MMD_name("頭");t.applyQuaternion(s)}if(e){if(t)e.add(t);r=e}}else if(D.external_point.type=="object3D"){const x=MMD_SA.THREEX._XR_Animator_scene_.object3D_list.find(e=>e.id==D.external_point.name);if(x){const v=MMD_SA.THREEX._object3d_list_.find(e=>e.uuid==x._object3d_uuid);r=MMD_SA._v3b.copy(D.external_point.reference_point).multiply(v._mesh.scale).applyQuaternion(v._mesh.quaternion).add(v._mesh.position)}}if(r){let i=1;if(D.weight_by_distance){const w=MMD_SA._v3a.copy(D.reference_point).multiply(l._mesh.scale).applyQuaternion(A).add(p.position).sub(r);let o=MMD_SA.THREEX.v3.copy(D.external_point.normal||{x:0,y:0,z:1});if(s)o.applyQuaternion(s);let e=w.length();let t=1-(D.weight_by_distance.power||0);let _=w.normalize().dot(o);if(_<0){t*=1-Math.min(-_*2,1)}let n=1-e/D.weight_by_distance.radius;if(t){i=n<0?0:Math.pow(n,t)}r.sub(a);if(M){let e=MMD_SA.TEMP_v3.copy(r).normalize().dot(o);let t=r.length()}}else{r.sub(a)}let e=MMD_SA._v3a.copy(D.reference_point).sub(t);e.normalize().applyQuaternion(p.quaternion);e.multiplyScalar(r.length()).add(a).sub(p.position);r=r.add(a).sub(p.position);e.normalize();r.normalize();const T=MMD_SA.TEMP_q.setFromUnitVectors(e,r);p.quaternion.premultiply(T);if(M){l._rot_aligned_=T.clone();l._rot_aligned_weight_=i;p.quaternion.copy(A)}}}const S=e.rotation.data_filter;if(S){if(!l.uuid)l.uuid=THREE.Math.generateUUID();let e=H[l.uuid];if(!e)e=H[l.uuid]=new System._browser.data_filter([{type:"one_euro",id:"propr_rot",para:[30,1,1,1,4]}]);Object.assign(e.filters[0].filter,P,S);if(M&&l._rot_aligned_){l._rot_aligned_.fromArray(e.filter(l._rot_aligned_.toArray()))}else{p.quaternion.fromArray(e.filter(p.quaternion.toArray()))}}}if(p.updateMatrix){p.matrixAutoUpdate=false;p.updateMatrix()}})}})();THREE.MMD.getModels().forEach(function(e,t){e.simulateCallback=o});var e=MMD_SA_options.MME.PostProcessingEffects;MMD_SA_options._PPE_enabled=e.enabled;if(MMD_SA_options.PPE_disabled_on_idle){if(MMD_SA_options._PPE_enabled){e.enabled=false}}MMD_SA.fadeout_opacity=.95;MMD_SA.fadeout_canvas.width=SL.width;MMD_SA.fadeout_canvas.height=SL.height;var t=MMD_SA.fadeout_canvas.getContext("2d");t.globalCompositeOperation="copy";t.globalAlpha=.01;t.fillRect(0,0,SL.width,SL.height);t.globalAlpha=1;MMD_SA_options.model_para_obj_all.forEach(function(e,t){var o=THREE.MMD.getModels()[t].mesh;if(e.position_loading||e.bone_connection||o.bones_by_name["全ての親"])o.position.set(0,0,0);if(e.scale)o.scale.set(e.scale,e.scale,e.scale)});THREE.MMD.getModels().forEach(function(){function o(e){this.mesh=e;this.m4=new THREE.Matrix4;this.pos=new THREE.Vector3;this.pos_world=new THREE.Vector3;this.reset()}o.prototype.reset=function(){this.pos.set(0,0,0);this.pos_world.set(0,0,0)};o.prototype.update=function(){this.m4.copy(this.mesh.matrixWorld);e.getPositionFromMatrix(this.m4);t.copy(e).sub(this.pos_world);t.multiplyScalar(MMD_SA_options.matrixWorld_physics_scale);this.pos.add(t);this.pos_world.copy(e);t.y+=this.mesh._model_index*25;this.m4.setPosition(t)};var e=new THREE.Vector3;var t=new THREE.Vector3;return function(e){let t=e.mesh;t.matrixWorld_physics=new o(t)}}());MMD_SA_options.onstart&&MMD_SA_options.onstart();window.dispatchEvent(new CustomEvent("MMDStarted"));MMD_SA.toggle_shadowMap();_.MMD.play(true);DEBUG_show("(MMD started)",2);if(MMD_SA.use_webgl2)DEBUG_show("Use WebGL2",2);if(MMD_SA.use_MSAA_FBO)DEBUG_show("Use MSAA FBO",2)},0);if(jThree.Trackball)jThree.trackball=jThree.Trackball;_.trackball();if(!returnBoolean("MMDTrackballCamera"))MMD_SA._trackball_camera.stop();MMD_SA_options.edgeScale=MMD_SA_options.model_para_obj.edgeScale>=0?MMD_SA_options.model_para_obj.edgeScale:MMD_SA_options.edgeScale>=0?MMD_SA_options.edgeScale:1;_.MMD.edgeScale=parseFloat(System.Gadget.Settings.readString("MMDEdgeScale")||Settings_default.MMDEdgeScale)*MMD_SA_options.edgeScale;jQuery("canvas").on("mousedown mousewheel DOMMouseScroll",function(){_.MMD.cameraMotion=false}).dblclick(function(){_.MMD.cameraMotion=true})}};(function(){MMD_SA.TEMP_q=new THREE.Quaternion;MMD_SA._q1=new THREE.Quaternion;MMD_SA._q2=new THREE.Quaternion;MMD_SA.TEMP_v3=new THREE.Vector3;MMD_SA._v3a=new THREE.Vector3;MMD_SA._v3b=new THREE.Vector3;MMD_SA.TEMP_m4=new THREE.Matrix4;MMD_SA._m4a=new THREE.Matrix4;MMD_SA._m4b=new THREE.Matrix4;MMD_SA.TEMP_b3=new THREE.Box3;MMD_SA._v3a_=new THREE.Vector3;MMD_SA._v3b_=new THREE.Vector3;MMD_SA.process_bone=function(e,t,o){const _=MMD_SA.MMD.motionManager.para_SA.look_at_screen_euler_order||"XYZ";const n=MMD_SA._v3a_.setEulerFromQuaternion(e.quaternion,_);if(o){n.x*=o[0];n.y*=o[1];n.z*=o[2]}if(t instanceof THREE.Quaternion)t=MMD_SA._v3b_.setEulerFromQuaternion(t,_);n.add(t);e.quaternion.setFromEuler(n,_)};MMD_SA.copy_first_bone_frame=function(e,t,o){if(!o)o=MMD_SA_options.motion[e].match;var n=o&&o.skin_jThree?o.skin_jThree:null;if(!t._is_skin)t=THREE.MMD.getModels()[0].skin_MMD_SA_extra[t._motion_index_extra];var i=t.mesh;t.targets.forEach(function(e){var t=e.keys[0];if(!t||n&&!n.test(t.name)||t.time){return}var o=i.bones_by_name[t.name];var _=i.geometry.bones[o._index];t.pos[0]=o.position.x-_.pos[0];t.pos[1]=o.position.y-_.pos[1];t.pos[2]=o.position.z-_.pos[2];t.rot=o.quaternion.toArray()})};MMD_SA.reset_skin=function(M){THREE.MMD.getModels().forEach(function(e,t){if(M!=null&&t!=M)return;var o=e.skin;if(!o||o._is_dummy){return}var _=o.mesh;var n=_.geometry;for(var i=0,a=_.bones.length;i0){if(_)return null;a=1}else if(i<0){a=-1;i=-i}else{return null}l.subVectors(this.origin,e);var r=a*this.direction.dot(m.crossVectors(l,m));if(r<0){return null}var s=a*this.direction.dot(p.cross(l));if(s<0){return null}if(r+s>i){return null}var M=-a*l.dot(d);if(M<0){return null}return this.at(M/i,n)}}();MMD_SA.bone_to_position=function(){var m=new THREE.Vector3;var d=new THREE.Vector3;var c=new THREE.Vector3;var u=new THREE.Vector3;function e(){this.by_bone_name=[];this.pos_delta=new THREE.Vector3;this.pos_delta_rotated=new THREE.Vector3;this.bone_pos_offset=new THREE.Vector3}e.prototype.init=function(e,t,o,_){var n=this.by_bone_name[t];if(!n){n=this.by_bone_name[t]={gbone:{position:(new THREE.Vector3).fromArray(e.geometry.bones[e.bones_by_name[t]._index].pos)},position:new THREE.Vector3,quaternion:new THREE.Quaternion,path:"",motion_time:0}}if(n.path!=o||n.motion_time>_){n.position.set(0,0,0);n.quaternion.set(0,0,0,1);n.path=o}n.motion_time=_;this.gbone=n.gbone;this.position=n.position;this.quaternion=n.quaternion};return function(s){var M=this;if(!M.skin)return null;var l=this.mesh;if(l._bone_to_position_last){l._bone_to_position_last.pos_delta.set(0,0,0);l._bone_to_position_last.pos_delta_rotated.set(0,0,0);l._bone_to_position_last.bone_pos_offset.set(0,0,0)}else l._bone_to_position_last=new e;if(!s.bone_to_position)return null;var p=s.adjustment_per_model&&(s.adjustment_per_model[MMD_SA_options.model_para_obj_all[this._model_index]._filename_cleaned]||s.adjustment_per_model._default_)||{};s.bone_to_position.forEach(function(e){var t=e.name;var o=e.scale||{x:1,y:1,z:1};var _=l.bones_by_name[t];var n=M.skin.time;var i=n*30;l._bone_to_position_last.init(l,t,s._path,n);if(!e.frame_range||e.frame_range.some(function(e){return i>=e[0]&&i<=e[1]})){m.copy(_.position).sub(l._bone_to_position_last.gbone.position).multiply(o)}else{m.set(0,0,0)}c.copy(m);var a;var r;if(p.skin_default){let e=p.skin_default[t]||{};a=e.rot_add||e.rot;if(!a&&!s.bone_to_position.some(function(e){return e.name=="全ての親"})){e=p.skin_default["全ての親"]||{};a=e.rot_add||e.rot;r=!!a}if(a){c.applyEuler(u.copy(a).multiplyScalar(Math.PI/180))}}if(!e.position_disabled){d.copy(c).sub(l._bone_to_position_last.position);l._bone_to_position_last.position.copy(c)}else{d.set(0,0,0);c.set(0,0,0)}if(t=="全ての親"){_.position.sub(m);l._bone_to_position_last.bone_pos_offset.add(m)}else{let e=r?m.applyEuler(u.copy(a).multiplyScalar(Math.PI/180)):m;l.bones_by_name["全ての親"].position.sub(e);l._bone_to_position_last.bone_pos_offset.add(e)}l._bone_to_position_last.pos_delta.add(d)});l._bone_to_position_last.pos_delta_rotated.copy(l._bone_to_position_last.pos_delta).applyQuaternion(l.quaternion);return l._bone_to_position_last.pos_delta}}();if(MMD_SA.use_jThree_v1)jThree.goml("index.goml");var e={extractPathBase:function(e){var t=e.split("/");t.pop();return t.length===0?"":t.join("/")+"/"},extractPathExt:function(e){var t=e.split(".").pop();if(t===e){return""}return t}}})(); class LowPassFilter{constructor(t,i){this.setAlpha(t);this.y=null;this.s=null;this.type=i;LowPassFilter.#init()}static#q1;static#q2;static#initialized=false;static#init(){if(LowPassFilter.#initialized)return;LowPassFilter.#initialized=true;if(self.THREE){LowPassFilter.#q1=new THREE.Quaternion;LowPassFilter.#q2=new THREE.Quaternion}}setAlpha(t){if(t<=0||t>1){throw new Error}this.alpha=t}filter(t,i,e){if(e){this.setAlpha(e)}let s;if(!this.y){s=t}else{if(Array.isArray(t)){if(this.type==4){s=LowPassFilter.#q1.fromArray(this.s).slerp(LowPassFilter.#q2.fromArray(t),this.alpha).toArray()}else s=t.map((t,i)=>this.alpha*t+(1-this.alpha)*this.s[i])}else{s=this.alpha*t+(1-this.alpha)*this.s}}this.y=t;this.s=s;return s}lastValue(){return this.y}}class OneEuroFilter{constructor(t=30,i=1,e=0,s=1,r=0){if(t<=0||i<=0||s<=0){throw new Error}this.freq=t;this.minCutOff=i;this.beta=e;this.dCutOff=s;this.x=new LowPassFilter(this.alpha(this.minCutOff),r);this.dx=new LowPassFilter(this.alpha(this.dCutOff),r);this.lasttime=null;this.type=r;OneEuroFilter.#init()}static#q1_dx;static#q2_dx;static#initialized=false;static#init(){if(OneEuroFilter.#initialized)return;OneEuroFilter.#initialized=true;if(self.THREE){OneEuroFilter.#q1_dx=new THREE.Quaternion;OneEuroFilter.#q2_dx=new THREE.Quaternion}}computeDerivative(t){const e=this.x.lastValue();let i;if(!e){switch(this.type){case 3:i=[0,0,0];break;case 4:i=[0,0,0,1];break;default:i=0}}else{if(this.type==3){const s=1/this.freq;i=t.map((t,i)=>(t-e[i])/s)}else if(this.type==4){const s=1/this.freq;const r=1/s;OneEuroFilter.#q1_dx.fromArray(e).conjugate();i=OneEuroFilter.#q2_dx.fromArray(t).multiply(OneEuroFilter.#q1_dx);i=OneEuroFilter.#q1_dx.set(0,0,0,1).slerp(i,r).toArray()}else{i=(t-e)*this.freq}}return i}computeDerivativeMagnitude(t){let e;if(this.type==3){let i=0;t.forEach(t=>{i+=t*t});e=Math.sqrt(i)}else if(this.type==4){e=2*Math.acos(t[3])}else{e=Math.abs(t)}return e}alpha(t){const i=1/this.freq;const e=1/(2*Math.PI*t);return 1/(1+e/i)}filter(t,i=null){if(this.lasttime&&i){this.freq=1/Math.max((i-this.lasttime)/1e3,1/60)}this.lasttime=i;const e=this.computeDerivative(t);const s=this.computeDerivativeMagnitude(this.dx.filter(e,i,this.alpha(this.dCutOff)));const r=this.minCutOff+this.beta*s;return this.x.filter(t,i,this.alpha(r))}} diff --git a/js/SA_system_emulation.min.js b/js/SA_system_emulation.min.js index 214fa5e..555b0b1 100644 --- a/js/SA_system_emulation.min.js +++ b/js/SA_system_emulation.min.js @@ -1,2 +1,2 @@ -// (2024-01-15) -var System=function(){var System={_init:function(){try{if(!Shell_OBJ)Shell_OBJ=new ActiveXObject("Shell.Application");if(!FSO_OBJ)FSO_OBJ=new ActiveXObject("Scripting.FileSystemObject");if(!oShell)oShell=new ActiveXObject("WScript.Shell")}catch(err){alert(err.message)}this._child_html_filename=xul_mode?"SystemAnimator_xul.html":webkit_mode?WallpaperEngine_CEF_mode&&!browser_native_mode?"SystemAnimator_cef.html":"SystemAnimator_webkit.html":"SystemAnimator_ie.html";this.Gadget._init();this.Machine._init();if(!is_SA_child_animation){SA_top_window.getScreenBounds=function(){var last_updated=-1;var bounds;return function(x,y,force_update){if(force_update||last_updated!=RAF_timestamp){last_updated=RAF_timestamp;bounds=webkit_electron_mode?webkit_electron_screen.getDisplayNearestPoint({x:~~x,y:~~y}).bounds:{x:0,y:0,width:parent.screen.width,height:parent.screen.height}}return bounds}}()}else{SA_top_window.getScreenBounds=function(x,y,force_update){return SA_topmost_window.getScreenBounds(x,y,force_update)}}if(webkit_electron_mode){if(!is_SA_child_animation){SA_top_window.getPos=function(){var last_updated=-1;var pos;return function(force_update){if(force_update||last_updated!=RAF_timestamp){last_updated=RAF_timestamp;pos=webkit_window.getPosition()}return pos}}();SA_top_window.getCursorPos=function(){var last_updated=-1;var pos;return function(force_update){if(force_update||last_updated!=RAF_timestamp){last_updated=RAF_timestamp;pos=webkit_electron_screen.getCursorScreenPoint()}return pos}}()}else{SA_top_window.getPos=function(force_update){return SA_topmost_window.getPos(force_update)};SA_top_window.getCursorPos=function(force_update){return SA_topmost_window.getCursorPos(force_update)}}}SA_top_window.resizeToAbsolute=function(){var resized;return function(w,h){webkit_window.setContentSize(w,h);resized=true;if(absolute_screen_mode&&!System._browser._window_move_timerID){System._browser._window_move_timerID=setInterval(function(){var x=SA_top_window.screenLeftAbsolute;var y=SA_top_window.screenTopAbsolute;var loop=0;return function(){var xy=SA_top_window.getPos(true);if(x!=xy[0]||y!=xy[1]){DEBUG_show("(window position adjusted)",3);webkit_window.setPosition(x,y);System._browser.moveWallpaper(x,y);loop=999}if(++loop>10){clearInterval(System._browser._window_move_timerID);System._browser._window_move_timerID=null}}}(),100)}}}();(()=>{function adjust_window_size(){function f(){const bs=document.body.style;webkit_window.setContentSize(bs.pixelWidth,bs.pixelHeight)}if(webkit_electron_mode&&window.devicePixelRatio!=1){window.removeEventListener("resize",f);window.addEventListener("resize",f,{once:true})}}SA_top_window.moveToAbsolute=function(x,y,restricted){adjust_window_size();if(absolute_screen_mode&&!restricted){webkit_window.setPosition(~~x,~~y)}else{this.moveTo(x,y)}};SA_top_window.moveByAbsolute=function(x,y){adjust_window_size();if(absolute_screen_mode){let pos=SA_top_window.getPos(true);x+=~~pos[0];y+=~~pos[1];webkit_window.setPosition(x,y)}else{this.moveBy(x,y)}}})();Object.defineProperty(SA_top_window,"screenLeftAbsolute",{get:function(){return absolute_screen_mode?SA_top_window.getPos()[0]:this.screenLeft}});Object.defineProperty(SA_top_window,"screenTopAbsolute",{get:function(){return absolute_screen_mode?SA_top_window.getPos()[1]:this.screenTop}})},Gadget:{_init:function(){this.Settings.read=this.Settings.readString;this.Settings.write=this.Settings.writeString;Object.defineProperty(this,"onSettingsClosing",{get:function(){return this._onSettingsClosing},set:function(func){this._onSettingsClosing=func;this.settings_window.onbeforeunload=function(){func({closeAction:!!this.returnValue,Action:{commit:true}});System.Gadget.settings_window.System=null;System.Gadget.settings_window.onbeforeunload=null;System.Gadget.settings_window=null}}});var doc=new ActiveXObject("Microsoft.XMLDOM");doc["async"]=false;doc.resolveExternals=false;doc.validateOnParse=false;doc.load("gadget.xml");this.version=doc.selectSingleNode("//version").text},path:xul_mode?XPCOM_object._SA_root:use_SA_browser_mode?toLocalPath(self.location.href).replace(/[\/\\][^\/\\]+$/,""):"",_path_folder:function(){return this.path.replace(/[\/\\][^\/\\]+$/,"")},document:document,version:"1.0.0.0",docked:is_SA_child_animation,visible:true,Settings:{_settings_need_update:false,_settings:{},_changed:{},readString:function(name,raw_read){var v=this._settings[name];v=v?raw_read?decodeURIComponent(v):decodeURIComponent(v).replace(/\$([^\$]+)\$/g,function($0,$1,$2){return eval($1)}):Settings_default._custom_[name]||"";return v},writeString:function(name,value){var v_old=this._settings[name]||"";var v_new=encodeURIComponent(value);this._settings[name]=v_new;if(WallpaperEngine_CEF_mode){var Settings_by_path=JSON.parse(localStorage.Settings_by_path);if(!SA_HTA_folder||!Settings_by_path[SA_HTA_folder]){console.error(SA_HTA_folder)}else{if(Settings_by_path[SA_HTA_folder][name]!=v_new){Settings_by_path[SA_HTA_folder][name]=v_new;localStorage.Settings_by_path=JSON.stringify(Settings_by_path)}}}if(v_old!=v_new)this._changed[name]=this._settings_need_update=true},_writeSettings:function(always_write,save_settings_only){if(!always_write&&!this._settings_need_update)return;this._settings_need_update=false;SystemEXT._save_settings_only=save_settings_only;try{this._writeSettings_CORE()}catch(err){}SystemEXT._save_settings_only=false},_writeSettings_CORE:function(){var saved_settings=[];var settings=this._settings;settings._screenLeft=settings._screenTop="";for(var s in settings){var v=System.Gadget.Settings.readString(s);if(!v)continue;if(s=="_screenLeft"){v=SA_top_window.screenLeftAbsolute}else if(s=="_screenTop"){v=SA_top_window.screenTopAbsolute}saved_settings.push('"'+s+'":"'+encodeURIComponent(v)+'"')}SystemEXT.SaveLocalSettings(saved_settings)}}},Environment:{win32_env:null,getEnvironmentVariable:function(name){return oShell.ExpandEnvironmentStrings("%"+name+"%")}},Machine:{_init:function(){this._init_memory=function(){if(webkit_mode)return;if(this._WMI_obj_memory)return;try{this._WMI_obj_memory=new WMI_Refresher("Win32_PerfFormattedData_PerfOS_Memory","EV");this._WMI_obj_memory.init()}catch(err){}};Object.defineProperty(this,"availableMemory",{get:function(){if(webkit_mode)return SA_require("os").freemem()/(1024*1024);this._init_memory();var c=this._WMI_obj_memory.update();return c.length?parseInt(c[c.length-1].AvailableMBytes):0}});Object.defineProperty(this,"totalMemory",{get:function(){if(webkit_mode)return SA_require("os").totalmem()/(1024*1024);if(!this._totalMemory){try{var obj=new WMI_Refresher("Win32_OperatingSystem");obj.init();this._totalMemory=parseInt(obj.update()[0].TotalVisibleMemorySize)/1024}catch(err){}}return this._totalMemory}});this.totalMemory=0;var CPUs={_WMI_obj:null,_cpu_obj:null,_get_cpu_obj:null,_init:function(){if(webkit_mode){if(this._get_cpu_obj)return;this._cpu_obj=[{count:-1,cpus:SA_require("os").cpus()}];this._get_cpu_obj=function(){var cpus=this._cpu_obj;if(cpus[0].count!=PC_count_absolute){if(cpus.unshift({count:PC_count_absolute,cpus:SA_require("os").cpus()})==3)cpus.pop()}return cpus};return}if(this._WMI_obj)return;try{this._WMI_obj=new WMI_Refresher("Win32_PerfFormattedData_PerfOS_Processor","EV");this._WMI_obj.init()}catch(err){}},item:function(index){if(webkit_mode){var cpus=this._get_cpu_obj();var core_time=[];for(var i=0;i<2;i++){var times=cpus[i].cpus[index].times;var total=0;for(var type in times)total+=times[type];core_time[i]={total:total,idle:times.idle}}var idle=core_time[0].idle-core_time[1].idle;var total=core_time[0].total-core_time[1].total;return{usagePercentage:total?(1-idle/total)*100:0}}return{usagePercentage:parseFloat(this._WMI_obj.update()[index].PercentProcessorTime)}}};Object.defineProperty(CPUs,"count",{get:function(){if(webkit_mode){return this._get_cpu_obj()[0].cpus.length}return this._WMI_obj.update().length-1}});this._CPUs=CPUs;Object.defineProperty(this,"CPUs",{get:function(){this._CPUs._init();return this._CPUs}});var PowerStatus={_WMI_obj:null,_init:function(){if(this._battery)return;this._battery={level:1,charging:false};if("getBattery"in navigator){var that=this;navigator.getBattery().then(function(b){DEBUG_show("Use Battery Status API",2);that._battery=b})}}};Object.defineProperty(PowerStatus,"batteryPercentRemaining",{get:function(){return this._battery.level*100}});Object.defineProperty(PowerStatus,"isPowerLineConnected",{get:function(){return this._battery.level==1||this._battery.charging}});Object.defineProperty(PowerStatus,"isBatteryCharging",{get:function(){return this._battery.charging}});this._PowerStatus=PowerStatus;Object.defineProperty(this,"PowerStatus",{get:function(){this._PowerStatus._init();return this._PowerStatus}})}},Shell:{itemFromFileDrop:function(dataTransfer,index){return{path:""}},itemFromPath:function(path){path=toLocalPath(path);var f=path.replace(/[\/\\][^\/\\]+$/,"");var p=path.replace(/^.+[\/\\]/,"");var obj=Shell_OBJ.NameSpace(f);if(obj)obj=obj.ParseName(p);return obj?new this._FolderItem(obj):null},execute:function(path,para){Shell_OBJ.ShellExecute(path,para)},chooseFolder:function(title,iOptions){var f=Shell_OBJ.BrowseForFolder(0,title,iOptions);return f?new this._FolderItem(f.Self):null},_FolderItem:function(obj){if(!this._constructor_initialized){this.constructor.prototype._constructor_initialized=true;this.constructor.prototype.metadata=function(name){var meta_dim=this.obj.ExtendedProperty("Dimensions");if(!meta_dim){var f=this.obj.Path.replace(/[\/\\][^\/\\]+$/,"");var dir=Shell_OBJ.NameSpace(f);meta_dim=dir.GetDetailsOf(this.obj,26)}return meta_dim};Object.defineProperty(this.constructor.prototype,"isFolder",{get:function(){return this.obj.IsFolder}});Object.defineProperty(this.constructor.prototype,"isFileSystem",{get:function(){return(ie9_native?!this.obj.IsFolder:true)&&this.obj.IsFileSystem}});Object.defineProperty(this.constructor.prototype,"isLink",{get:function(){return this.obj.IsLink}});Object.defineProperty(this.constructor.prototype,"link",{get:function(){return new System.Shell._FolderItem(this.obj.GetLink)}});Object.defineProperty(this.constructor.prototype,"path",{get:function(){return this.obj.Path}});Object.defineProperty(this.constructor.prototype,"type",{get:function(){return this.obj.Type}});Object.defineProperty(this.constructor.prototype,"SHFolder",{get:function(){return new System.Shell._Folder(this.obj.GetFolder)}})}this.obj=obj},_Folder:function(obj){if(!this._constructor_initialized){this.constructor.prototype._constructor_initialized=true;Object.defineProperty(this.constructor.prototype,"Items",{get:function(){return new System.Shell._FolderItems(this.obj.Items())}})}this.obj=obj},_FolderItems:function(obj){if(!this._constructor_initialized){this.constructor.prototype._constructor_initialized=true;this.constructor.prototype.item=function(index){return new System.Shell._FolderItem(this.obj.Item(index))};Object.defineProperty(this.constructor.prototype,"count",{get:function(){return this.obj.Count}})}this.obj=obj}},Debug:{outputString:function(str){}},_browser:{init:function(){document.ondragstart=document.onselectstart=function(e){return false};document.onmousedown=function(e){System._browser.onmousedown(e)};document.onmouseup=function(e){System._browser.onmouseup(e)};document.onmousemove=function(e){System._browser.onmousemove(e)};document.onkeydown=function(e){System._browser.onkeydown(e)};if(!WallpaperEngine_CEF_mode||!is_SA_child_animation||browser_native_mode){document.addEventListener("mouseover",function(e){System._browser.onmouseover(e)},false);document.addEventListener("mouseout",function(e){System._browser.onmouseout_waiting(e)},false)}Object.defineProperty(document,"onmouseover",{set:function(v){System._browser.onmouseover_custom=v}});Object.defineProperty(document,"onmouseout",{set:function(v){System._browser.onmouseout_waiting_custom=v}});var s=w3c_mode?CSSStyleDeclaration.prototype:document.body.style.constructor.prototype;this.document_body_style_pixelWidth=Object.getOwnPropertyDescriptor(s,"pixelWidth");this.document_body_style_pixelHeight=Object.getOwnPropertyDescriptor(s,"pixelHeight");var _set=function(){if(System._browser.resize_timerID)clearTimeout(System._browser.resize_timerID);if(System._browser._window_move_timerID){let xy=SA_top_window.getPos();System._browser.resize_timerID=setInterval(function(){var loop=0;return function(){let _xy=SA_top_window.getPos(true);if(++loop>10||xy[0]!=_xy[0]||xy[1]!=_xy[1]){clearInterval(System._browser.resize_timerID);System._browser.resize_timerID=setTimeout("System._browser.resize()",0)}}}(),10)}else System._browser.resize_timerID=setTimeout("System._browser.resize()",0)};Object.defineProperty(s,"_set",{get:function(){return _set}});if(ie9_native){Object.defineProperty(document.body.style,"pixelWidth",{get:function(){return System._browser.document_body_style_pixelWidth.get.call(this)},set:function(v){this._set();System._browser.document_body_style_pixelWidth.set.call(this,v)}});Object.defineProperty(document.body.style,"pixelHeight",{get:function(){return System._browser.document_body_style_pixelHeight.get.call(this)},set:function(v){this._set();System._browser.document_body_style_pixelHeight.set.call(this,v)}})}Object.defineProperty(this,"overlay_mode",function(){var overlay_mode=0;var bg_display_default=null;var bg_color_default=null;return{get:function(){return overlay_mode},set:function(v){if(v==overlay_mode)return;switch(v){case 2:if(bg_display_default==null)bg_display_default=LdesktopBG_host.style.display;LdesktopBG_host.style.display="none";if(bg_color_default==null)bg_color_default=document.body.style.backgroundColor;document.body.style.backgroundColor="#00FF00";case 1:Lmenu_host.style.visibility="hidden";if(this.camera.video_host){this.camera.video_host.style.visibility="hidden";this.camera.video_host.style.display="none"}if(document.getElementById("Ldungeon_UI")){document.getElementById("Ldungeon_UI").style.visibility="hidden";document.getElementById("Ldungeon_inventory").style.visibility="hidden";document.getElementById("Ldungeon_inventory_backpack").style.visibility="hidden";DEBUG_show("(Press Esc to toggle "+(this.overlay_mode_TEMP?"UI":"bottom menu")+" display)",5)}break;default:if(bg_display_default!=null)LdesktopBG_host.style.display=bg_display_default;if(bg_color_default!=null)document.body.style.backgroundColor=bg_color_default;bg_display_default=bg_color_default=null;Lmenu_host.style.visibility="inherit";if(this.camera.video_host){this.camera.video_host.style.visibility="inherit";this.camera.video_host.style.display="block"}if(document.getElementById("Ldungeon_UI")){document.getElementById("Ldungeon_UI").style.visibility="inherit";document.getElementById("Ldungeon_inventory").style.visibility="inherit";document.getElementById("Ldungeon_inventory_backpack").style.visibility="hidden"}}overlay_mode=v}}}());var child_animation_as_texture=is_SA_child_animation&&parent.MMD_SA_options&&parent.MMD_SA_options.child_animation_as_texture;if(child_animation_as_texture){this.onkeydown({keyCode:97+SA_child_animation_id})}var d=System.Gadget.Settings.readString("SA_docked");if(d)System.Gadget.docked=!!parseInt(d);else{if(child_animation_as_texture)System.Gadget.docked=false}var d=document.createElement("div");d.id="Ldrag_dummy";var ds=d.style;ds.position="absolute";ds.posLeft=ds.posTop=0;ds.zIndex=999;ds.border="1px solid rgba(128,128,128,0.5)";ds.visibility="hidden";document.body.appendChild(d);this.body=document.getElementById("Lbody_host")||document.body;if(w3c_mode)this.body.style.transition="opacity 0.5s";this.Opacity=1;var WallpaperAsBG=document.getElementById("LdesktopBG")&&!is_SA_BG_transparent;if(WallpaperAsBG){if(!self.SA_wallpaper_src){var SA_wallpaper_path=System.Gadget.path+toLocalPath("\\TEMP\\SA_wallpaper_src.txt");if(FSO_OBJ.FileExists(SA_wallpaper_path)){try{var f=FSO_OBJ.OpenTextFile(SA_wallpaper_path,1);self.SA_wallpaper_src=f.ReadLine();f.Close()}catch(err){}}}if(!self.SA_wallpaper_mask_src){var SA_wallpaper_mask_path=System.Gadget.path+toLocalPath("\\TEMP\\SA_wallpaper_mask_src.txt");if(FSO_OBJ.FileExists(SA_wallpaper_mask_path)){try{var f=FSO_OBJ.OpenTextFile(SA_wallpaper_mask_path,1);self.SA_wallpaper_mask_src=f.ReadLine();f.Close()}catch(err){}}}}if(WallpaperAsBG)WallpaperAsBG=System.Gadget.Settings.readString("WallpaperAsBG")||self.SA_wallpaper_src;var WallpaperAsBG_custom;if(self.CANVAS_Video_Overlay&&CANVAS_Video_Overlay.use_wallpaper_as_bg||self.EQP_use_wallpaper){WallpaperAsBG_custom=WallpaperAsBG=true}var wallpaper_mask;var s_left,s_top;this.Opacity=is_SA_child_animation?parent.document.getElementById("Ichild_animation"+SA_child_animation_id).style.opacity||1:parseFloat(System.Gadget.Settings.readString("Opacity")||1);if(is_SA_child_animation&&!self.SA_wallpaper_src&&!WallpaperAsBG_custom){WallpaperAsBG=WallpaperAsBG&&parent.WMP_wallpaper_mask&&parent.use_HTML5&&!parent.System.Gadget.Settings.readString("CSSTransform3D")&&!System.Gadget.Settings.readString("DisableWallpaperMask");if(WallpaperAsBG&&self.EQP_video_options&&EQP_video_options.use_canvas_video){WallpaperAsBG=false;this.C_WMP_wallpaper_mask_resized=document.createElement("canvas");this.C_WMP_wallpaper_mask_mixed_resized=document.createElement("canvas");this.WMPMask_Draw()}this.wallpaper_mask_disabled=!WallpaperAsBG;if(WallpaperAsBG)wallpaper_mask=parent.WMP_wallpaper_mask}else{var use_body_opacity;if(!is_SA_child_animation){s_left=System.Gadget.Settings.readString("_screenLeft");s_top=System.Gadget.Settings.readString("_screenTop")}s_left=s_left?parseInt(s_left):null;s_top=s_top?parseInt(s_top):null;if(WallpaperAsBG){const video_wallpaper=w3c_mode&&self.SA_wallpaper_src&&/\.(mp4|mkv|webm)$/i.test(SA_wallpaper_src)&&SA_wallpaper_src;this.wallpaper_mask_disabled=WallpaperEngine_CEF_mode||!!System.Gadget.Settings.readString("DisableWallpaperMask");var desktop_reg,wallpaper,wallpaper_style;var ds=LdesktopBG.style;try{ds.pixelWidth=parent.screen.width;ds.pixelHeight=parent.screen.height;var wcolor_reg=oShell.RegRead("HKCU\\Control Panel\\Colors\\Background");ds.backgroundColor=/^\#/.test(wcolor_reg)?wcolor_reg:"rgb("+wcolor_reg.replace(/\W+/g,",")+")";desktop_reg="HKCU\\Control Panel\\Desktop\\";if(WallpaperEngine_CEF_mode)wallpaper=oShell.RegRead(desktop_reg+"Wallpaper")||self.SA_wallpaper_src&&/\.(png|bpm|jpg|jpeg)$/i.test(SA_wallpaper_src)&&SA_wallpaper_src;else wallpaper=self.SA_wallpaper_src==""?"":self.SA_wallpaper_src&&/\.(png|bpm|jpg|jpeg)$/i.test(SA_wallpaper_src)&&SA_wallpaper_src||oShell.RegRead(desktop_reg+"Wallpaper");if(wallpaper){if(!this.wallpaper_mask_disabled){wallpaper_mask=self.SA_wallpaper_mask_src||wallpaper.replace(/\.\w{3,4}$/,"_mask.png");if(!ValidatePath(wallpaper_mask))wallpaper_mask=null}wallpaper_style=oShell.RegRead(desktop_reg+"WallpaperStyle");this.updateWallpaper(wallpaper,wallpaper_style)}if(video_wallpaper){this.updateWallpaper(video_wallpaper)}this.moveWallpaper(s_left||0,s_top||0);if(!is_SA_child_animation||self.SA_wallpaper_src)LdesktopBG_host.style.display="block"}catch(err){console.error(err);LdesktopBG_host.style.display="none"}if(wallpaper_mask){if(!this.bg_mask)this.bg_mask="(blank)"}else{use_body_opacity=true}}else{use_body_opacity=true}if(use_body_opacity&&this.Opacity<1&&(w3c_mode||HTA_use_GPU_acceleration)){this.body.style.opacity=this.Opacity;DEBUG_show("Opacity:"+this.Opacity*100+"%",2)}}if(WallpaperAsBG_custom&&!wallpaper_mask)this.bg_mask="(blank)";if(WallpaperAsBG&&(wallpaper_mask||this.bg_mask)){var c=document.createElement("canvas");c.id="C_wallpaper_mask";c._WallpaperAsBG_custom=WallpaperAsBG_custom;c.onmousedown=function(){return false};if(!is_SA_child_animation||WallpaperAsBG_custom){try{var w=c.width=parent.screen.width;var h=c.height=parent.screen.height;var context=c.getContext("2d");var wallpaper_img;if(!this.wallpaper_canvas_update){this.wallpaper_canvas_update=function(wallpaper,wallpaper_style){context.fillStyle=ds.backgroundColor;context.fillRect(0,0,w,h);if(!wallpaper){if(self.CANVAS_Video_Overlay&&CANVAS_Video_Overlay._canvas_wall)CANVAS_Video_Overlay._canvas_wall._match_str=null;if(self.EQP_use_wallpaper){EQP_ps.forEach(function(ps){if(ps.is_wallpaper)ps.img.img_obj._match_str=null})}return}var wallpaper_onload;if(wallpaper_style=="0"){wallpaper_onload=function(){var w=this.width;var h=this.height;var sw=parent.screen.width;var sh=parent.screen.height;var x_source,y_source,w_source,h_source,x_target,y_target,w_target,h_target;if(sw>w){x_source=0;x_target=(sw-w)/2;w_source=w_target=w}else{x_source=(w-sw)/2;x_target=0;w_source=w_target=sw}if(sh>h){y_source=0;y_target=(sh-h)/2;h_source=h_target=h}else{y_source=(h-sh)/2;y_target=0;h_source=h_target=sh}var context=C_wallpaper_mask.getContext("2d");context.drawImage(this,x_source,y_source,w_source,h_source,x_target,y_target,w_target,h_target);System._browser.BGMask_Create(!wallpaper_mask);if(!wallpaper_mask)return;var mask_img=new Image;mask_img.onload=function(){var context=C_wallpaper_mask.getContext("2d");context.globalCompositeOperation="destination-in";context.drawImage(this,x_source,y_source,w_source,h_source,x_target,y_target,w_target,h_target);C_wallpaper_mask.style.visibility="inherit";DEBUG_show("Use wallpaper mask",2)};mask_img.src=toFileProtocol(wallpaper_mask)}}else{wallpaper_onload=function(){var w=this.width;var h=this.height;var sw=parent.screen.width;var sh=parent.screen.height;var ratio,ww,hh,x,y;var context=C_wallpaper_mask.getContext("2d");if(wallpaper_style=="6"){ratio=Math.max(w/sw,h/sh);x=Math.round((sw-w/ratio)/2);y=Math.round((sh-h/ratio)/2);ww=Math.round(w/ratio);hh=Math.round(h/ratio);context.drawImage(this,0,0,w,h,x,y,ww,hh)}else{ratio=Math.min(w/sw,h/sh);x=Math.round((w/ratio-sw)/2*ratio);y=Math.round((h/ratio-sh)/2*ratio);ww=Math.round(sw*ratio);hh=Math.round(sh*ratio);context.drawImage(this,x,y,ww,hh,0,0,C_wallpaper_mask.width,C_wallpaper_mask.height)}System._browser.BGMask_Create(!wallpaper_mask);if(!wallpaper_mask)return;var mask_img=new Image;mask_img.onload=function(){var context=C_wallpaper_mask.getContext("2d");context.globalCompositeOperation="destination-in";context.drawImage(this,x,y,ww,hh);C_wallpaper_mask.style.visibility="inherit";DEBUG_show("Use wallpaper mask",2)};mask_img.src=toFileProtocol(wallpaper_mask)}}if(wallpaper_img)wallpaper_img.onload=null;wallpaper_img=new Image;wallpaper_img.onload=wallpaper_onload;wallpaper_img.src=toFileProtocol(wallpaper)}}this.wallpaper_canvas_update(wallpaper,wallpaper_style);if(!wallpaper){setTimeout("System._browser.BGMask_Create(true)",0)}}catch(err){}}var cs=c.style;cs.position="absolute";cs.posLeft=-(s_left||0);cs.posTop=-(s_top||0);cs.zIndex=60;cs.visibility="hidden";document.body.appendChild(c);this.mouseover_hide_list.push(c);if(is_SA_child_animation){this.C_WMP_wallpaper_mask_resized=document.createElement("canvas");this.C_WMP_wallpaper_mask_mixed_resized=document.createElement("canvas");if(this.bg_mask)System._browser.BGMask_Create(!wallpaper_mask);this.WMPMask_Draw()}}this._s_left=s_left;this._s_top=s_top},updateWallpaper:function(wallpaper,wallpaper_style){let v_bg=document.getElementById("VdesktopBG");if(wallpaper&&/\.(mp4|mkv|webm)$/i.test(wallpaper)){if(!v_bg){v_bg=document.createElement("video");v_bg.id="VdesktopBG";const vs=v_bg.style;vs.position="absolute";vs.top=vs.left="0px";vs.width=parent.screen.width+"px";vs.height=parent.screen.height+"px";vs.objectFit="cover";LdesktopBG.appendChild(v_bg);v_bg.autoplay=v_bg.loop=true}v_bg.src=toFileProtocol(wallpaper);v_bg.style.visibility="inherit";return}if(v_bg){v_bg.pause();v_bg.style.visibility="hidden"}var ds=LdesktopBG.style;var wallpaper_changed;if(wallpaper!=null){wallpaper=decodeURIComponent(wallpaper);if(this._wallpaper_last!=wallpaper){wallpaper_changed=true;this._wallpaper_last=wallpaper;ds.backgroundImage=wallpaper?"url("+toFileProtocol(/^(\/|[\w\-]+\:)/.test(wallpaper)?wallpaper:System.Gadget.path+"/"+wallpaper).replace(/\s/g,encodeURIComponent(" "))+")":"";if(this.wallpaper_opacity)ds.opacity=this.wallpaper_opacity;if(this.wallpaper_bg_color)LdesktopBG_host.style.backgroundColor=this.wallpaper_bg_color}}else wallpaper=this._wallpaper_last;var desktop_reg="HKCU\\Control Panel\\Desktop\\";if(wallpaper_style==null){wallpaper_style=oShell.RegRead(desktop_reg+"WallpaperStyle")}if(this._wallpaper_style!=wallpaper_style){wallpaper_changed=true;this._wallpaper_style=wallpaper_style}if(wallpaper_style=="0"){ds.backgroundSize="";ds.backgroundPosition="center center";if(oShell.RegRead(desktop_reg+"TileWallpaper")=="0"){ds.backgroundRepeat="no-repeat"}else{ds.backgroundRepeat=""}}else if(wallpaper_style=="2"){ds.backgroundSize="100% 100%";ds.backgroundPosition="";ds.backgroundRepeat=""}else if(wallpaper_style=="6"){ds.backgroundSize="contain";ds.backgroundPosition="center center";ds.backgroundRepeat="no-repeat"}else{ds.backgroundSize="cover";ds.backgroundPosition="center center";ds.backgroundRepeat="no-repeat";if(browser_native_mode){ds.width="100%";ds.height="100%"}else{ds.pixelWidth=parent.screen.width;ds.pixelHeight=parent.screen.height}if(windows_mode&&wallpaper){var dim=loadImageDim(/^(\/|[\w\-]+\:)/.test(wallpaper)?wallpaper:System.Gadget.path+toLocalPath("\\")+wallpaper);if(dim.w){var desk_ar=parent.screen.width/parent.screen.height;var desk_ar_ext=(parent.screen.width*2-parent.screen.availWidth)/(parent.screen.height*2-parent.screen.availHeight);var wall_ar=dim.w/dim.h;if(wall_ardesk_ar){ds.pixelWidth=wall_ar>desk_ar_ext?parent.screen.width*2-parent.screen.availWidth:Math.round(parent.screen.height*wall_ar)}}}}if(this.wallpaper_canvas_update&&wallpaper_changed){this.wallpaper_canvas_update(wallpaper,wallpaper_style);DEBUG_show("(Wallpaper canvas updated)",2)}},WMPMask_Draw:function(c_source){if(!this.C_WMP_wallpaper_mask_resized)return;if(!c_source)c_source=parent.SL;if(!c_source||!c_source.width)return;var bs=document.body.style;var w=bs.pixelWidth;var h=bs.pixelHeight;if(!w)return;var x_source=0;var y_source=0;var w_source=c_source.width;var h_source=c_source.height;var c_wall_mask_resized=this.C_WMP_wallpaper_mask_resized;if(c_wall_mask_resized.width!=w_source){c_wall_mask_resized.width=w_source;c_wall_mask_resized.height=h_source;var c_wall=parent.C_WMP_wallpaper_mask;c_wall_mask_resized.getContext("2d").drawImage(c_wall,0,0,c_wall.width,c_wall.height,0,0,w_source,h_source)}var bg_mask_image_resized=this.bg_mask_image_resized;if(bg_mask_image_resized&&bg_mask_image_resized.width!=w){bg_mask_image_resized.width=w;bg_mask_image_resized.height=h;var bg_mask_image=this.bg_mask_image;bg_mask_image_resized.getContext("2d").drawImage(bg_mask_image,0,0,bg_mask_image.width,bg_mask_image.height,0,0,w,h)}var w,h;w=self.B_content_width?B_content_width:document.body.style.pixelWidth;h=self.B_content_height?B_content_height:document.body.style.pixelHeight;var ani=parent.SA_child_animation[SA_child_animation_id];var x=ani.x;var y=ani.y;if(is_SA_child_animation&&parent.EQP_border_width){x-=parent.EQP_border_width;y-=parent.EQP_border_width}var x_target1=x-x_source;var x_target2=x_target1;if(x_target1<0)x_target1=0;if(x_target2<0)x_target2=-x_target2;else x_target2=0;var y_target1=y-y_source;var y_target2=y_target1;if(y_target1<0)y_target1=0;if(y_target2<0)y_target2=-y_target2;else y_target2=0;var w_target=w_source+x_source-x;if(w_target>w)w_target=w;var h_target=h_source+y_source-y;if(h_target>h)h_target=h;var c_wall_mask_mixed_resized=this.C_WMP_wallpaper_mask_mixed_resized;if(c_wall_mask_mixed_resized.width!=w||c_wall_mask_mixed_resized._x!=x_target1||c_wall_mask_mixed_resized._y!=y_target1){c_wall_mask_mixed_resized.width=w;c_wall_mask_mixed_resized.height=h;var context=c_wall_mask_mixed_resized.getContext("2d");context.drawImage(c_wall_mask_resized,x_target1,y_target1,w_target,h_target,x_target2,y_target2,w_target,h_target);if(bg_mask_image_resized)context.drawImage(bg_mask_image_resized,0,0);c_wall_mask_mixed_resized._x=x_target1;c_wall_mask_mixed_resized._y=y_target1}var c=document.getElementById("C_wallpaper_mask");if(!c)return;c.width=w;c.height=h;var context=c.getContext("2d");context.globalCompositeOperation="copy";context.drawImage(c_source,x_target1,y_target1,w_target,h_target,x_target2,y_target2,w_target,h_target);context.globalCompositeOperation="destination-in";context.drawImage(c_wall_mask_mixed_resized,0,0)},BGMask_CreateCanvas:function(bg_mask,empty_base){if(!bg_mask)return null;if(!/^\((.+)\)$/.test(bg_mask)){return null}var paras=RegExp.$1.split("|");var mask_name=paras[0];var c;if(mask_name=="circle"){var w=parseInt(paras[1]);var h=parseInt(paras[2]);c=document.createElement("canvas");c.width=w;c.height=h;var dim=w=w-feather)mod_x=(w-x)/(feather+1);mod_x=1-(1-mod_x)*f_mod;if(mod_x<0)mod_x=0;var mod_y=1;if(y=h-feather)mod_y=(h-y)/(feather+1);mod_y=1-(1-mod_y)*f_mod;if(mod_y<0)mod_y=0;var mod=mod_xfy?fy/fx:fx/fy;var diagonal=Math.sqrt(1+ff*ff);mod=1-(1-mod)*diagonal;if(mod<0)mod=0}data[a]=empty_base?Math.round(255*(1-mod)):Math.round(255*mod)}context.putImageData(image_data,0,0)}return c},BGMask_Create:function(no_wallpaper_mask){var bg_mask=this.bg_mask;if(!bg_mask)return;if(no_wallpaper_mask){this.wallpaper_canvas=C_wallpaper_mask;C_wallpaper_mask.style.display="none"}else{var wallpaper=this.wallpaper_canvas=document.createElement("canvas");if(!is_SA_child_animation){wallpaper.width=parent.screen.width;wallpaper.height=parent.screen.height;wallpaper.getContext("2d").drawImage(C_wallpaper_mask,0,0)}}if(self.CANVAS_Video_Overlay&&CANVAS_Video_Overlay._canvas_wall)CANVAS_Video_Overlay._canvas_wall._match_str=null;if(self.EQP_use_wallpaper){EQP_ps.forEach(function(ps){if(ps.is_wallpaper&&ps.img)ps.img.img_obj._match_str=null})}if(/^\((.+)\)$/.test(bg_mask)){this.bg_mask_image=this.BGMask_CreateCanvas(bg_mask,is_SA_child_animation);this.BGMask_onload();return}var mask_img=this.bg_mask_image=new Image;mask_img.onload=this.BGMask_onload;mask_img.src=toFileProtocol(bg_mask)},BGMask_onload:function(){var bg=document.getElementById("C_BG_mask");if(!bg){bg=document.createElement("canvas");bg.id="C_BG_mask";var bs=bg.style;bs.position="absolute";bs.posTop=bs.posLeft=0;bs.zIndex=60+1;document.body.appendChild(bg)}if(System._browser.mouseover_hide_list.indexOf(bg)==-1)System._browser.mouseover_hide_list.push(bg);if(is_SA_child_animation){System._browser.bg_mask_image_resized=document.createElement("canvas")}else{System._browser.BGMask_Draw()}},BGMask_Draw:function(target_canvas){if(is_SA_child_animation&&(!document.getElementById("C_wallpaper_mask")||!C_wallpaper_mask._WallpaperAsBG_custom)){this.WMPMask_Draw();return}if(!document.getElementById("C_BG_mask"))return;var cw,ch,w,h;cw=w=self.B_content_width?B_content_width:document.body.style.pixelWidth;ch=h=self.B_content_height?B_content_height:document.body.style.pixelHeight;if(w>parent.screen.width)w=parent.screen.width;if(h>parent.screen.height)h=parent.screen.height;var x_source,y_source,x_target,y_target;var cs=C_wallpaper_mask.style;if(cs.posLeft>0){x_source=0;x_target=cs.posLeft}else{x_source=-cs.posLeft;x_target=0}if(cs.posTop>0){y_source=0;y_target=cs.posTop}else{y_source=-cs.posTop;y_target=0}if(target_canvas){var match_str=x_source+","+y_source+","+w+","+h+","+x_target+","+y_target+","+w+","+h;if(target_canvas._match_str==match_str)return;target_canvas._match_str=match_str;target_canvas.width=cw;target_canvas.height=ch;var context=target_canvas.getContext("2d");context.globalCompositeOperation="copy";context.drawImage(this.wallpaper_canvas,x_source,y_source,w,h,x_target,y_target,w,h);return}if(!this.bg_mask_image&&this.Opacity==1){document.getElementById("C_BG_mask").style.display="none";return}C_BG_mask.width=cw;C_BG_mask.height=ch;var context=C_BG_mask.getContext("2d");context.globalCompositeOperation="copy";context.globalAlpha=this.bg_mask_image?1:1-this.Opacity;context.drawImage(this.wallpaper_canvas,x_source,y_source,w,h,x_target,y_target,w,h);if(this.bg_mask_image){context.globalCompositeOperation="destination-out";context.globalAlpha=this.Opacity;context.drawImage(this.bg_mask_image,0,0,w,h)}else C_BG_mask.style.display="block"},resize_timerID:null,resize_cooling_timestamp:0,resize:function(){var resized_once=false;function on_first_resize(){if(!resized_once){resized_once=true;setTimeout(function(){window.dispatchEvent(new CustomEvent("SA_resized_once"))},0)}}return function(){this.resize_timerID=null;if(use_SA_browser_mode){let oBody=document.body.style;if(is_SA_child_animation){let i_obj=parent.document.getElementById("Ichild_animation"+SA_child_animation_id).style;i_obj.width=oBody.pixelWidth+"px";i_obj.height=oBody.pixelHeight+"px";on_first_resize()}else{if(webkit_electron_mode){if(webkit_electron_mode&&SA_topmost_window.System._browser.capturePage_in_process){this.resize_timerID=setTimeout("System._browser.resize()",50);return}if(webkit_electron_mode)System._browser.resize_cooling_timestamp=performance.now();SA_top_window.resizeToAbsolute(oBody.pixelWidth+(xul_mode?SA_top_window.outerWidth-SA_top_window.innerWidth:0),oBody.pixelHeight+(xul_mode?SA_top_window.outerHeight-SA_top_window.innerHeight:0))}on_first_resize()}}}}(),drag_mouse_x:-1,drag_mouse_y:-1,drag_timerID:null,is_dragging:false,mouseout_timerID:null,mouseover_hide_list:[],onmouseover_custom:null,onmouseover:function(event){if(webkit_electron_mode&&(SA_topmost_window.returnBoolean("IgnoreMouseEvents")||SA_topmost_window.returnBoolean("AutoItStayOnDesktop"))&&!SA_topmost_window.webkit_IgnoreMouseEvents_disabled)return;if(this.onmouseover_custom&&this.onmouseover_custom(event))return;if(this.mouseout_timerID){clearTimeout(this.mouseout_timerID);this.mouseout_timerID=null}var list=this.mouseover_hide_list;for(var i=0;i0&&x0&&y20||event.clientYb.is_closing_event);if(MMD_SA_options.Dungeon.dialogue_branch_mode&&!branch)return false;new Promise(resolve=>{if(branch){const key=Array.isArray(branch.key)?branch.key[0]:branch.key;let code,keyCode;if(typeof key=="number"){keyCode=key+96}else if(key=="Esc"){code="Escape"}else{code="Key"+key}document.dispatchEvent(new KeyboardEvent("keydown",{code:code,keyCode:keyCode}));System._browser.on_animation_update.add(resolve,0,0)}else{resolve()}}).then(()=>{new Promise(resolve=>{MMD_SA_options.Dungeon.run_event([[{message:{content:System._browser.translation.get("XR_Animator.settings.confirm"),branch_list:[{key:1,func:()=>{resolve()},ended:true},{key:2}]}}]])}).then(()=>{this.onSettings(true)})});return false}if(!System.Gadget.settingsUI)return false;if(use_inline_dialog){if(document.getElementById("Idialog").style.visibility=="hidden"){document.getElementById("Idialog").contentWindow.location.replace("settings.html")}return true}System._browser.showFocus(true,true);var v=showModalDialog(System.Gadget.settingsUI,self);v=xul_mode?self.returnValue:v;System._browser.showFocus(false);this.onSettingsClosed(v);return true},onSettingsClosed:function(v){if(System.Gadget.onSettingsClosed)System.Gadget.onSettingsClosed({closeAction:!!v,Action:{commit:true}})},onkeydown:function(event){var have_child=(is_SA_child_animation||document.getElementById("Lchild_animation_parent"))&&!is_SA_child_animation_host;const is_altKey=event.altKey;const is_safe_key=is_altKey||!self.MMD_SA||!MMD_SA_options.Dungeon_options||!event.preventDefault;var k=event.keyCode;if(k==67&&is_altKey){this.confirmClose();return true}else if(k==69&&is_safe_key){return this.onSettings()}else if(k==79&&is_safe_key){var o;if(is_SA_child_animation){var ds=parent.document.getElementById("Ichild_animation"+SA_child_animation_id).style;o=this.Opacity;if("_opacity_"in event){o=event._opacity_}else{o-=.25;if(o<.25)o=1}parent.System.Gadget.Settings._settings_need_update=true;parent.SA_child_animation[SA_child_animation_id].opacity=o;ds.opacity=o}else if(this.bg_mask){o=this.Opacity;if("_opacity_"in event){o=event._opacity_}else{o-=.25;if(o<.25)o=1}System.Gadget.Settings.writeString("Opacity",o);this.Opacity=o;this.BGMask_Draw()}else if(w3c_mode||HTA_use_GPU_acceleration){var ds=this.body.style;o=this.Opacity;if("_opacity_"in event){o=event._opacity_}else{o-=.25;if(o<.25)o=1}System.Gadget.Settings.writeString("Opacity",o);ds.opacity=o}else return false;this.Opacity=o;DEBUG_show("Opacity:"+o*100+"%",2);this.update_tray();return true}else if(k==83&&is_safe_key){var f=System.Gadget.docked?System.Gadget.onUndock:System.Gadget.onDock;if(!f)return false;setTimeout(System._browser.ondockundock,0);return true}else if(have_child&&(k>=49&&k<49+SA_child_animation_max)&&is_safe_key){var id=k-49;var p=is_SA_child_animation?parent:self;var d=p.document.getElementById("Ichild_animation"+id);if(!d||!d.contentWindow.is_SA_child_animation){DEBUG_show("(child animation "+(id+1)+" not found)",2);return true}var cw=d.contentWindow;var cp=cw.parent;var cp_browser=cp.System._browser;if(cw.System.Gadget.Settings.readString("CSSTransform3D")||cp.System.Gadget.Settings.readString("CSSTransform3D")){if(cp_browser._child_selected==id){cp_browser._child_selected=null;cw.DEBUG_show("(deselected)",2);cp.DEBUG_show("(child"+(id+1)+" deselected)",2);return true}cp_browser._child_selected=id}cw.DEBUG_show("(selected)",2);cp.DEBUG_show("(child"+(id+1)+" selected)",2);cp_browser.arrangeChildZ(id);cw.focus();return true}else if(have_child&&k==96&&is_safe_key){var p=is_SA_child_animation?parent:self;var ds=p.Lchild_animation_parent.style;ds.visibility=ds.visibility=="hidden"?"visible":"hidden";if(webkit_mode)ds.display=ds.visibility=="hidden"?"none":"block";p.System._browser._child_selected=null;return true}else if(have_child&&(k>=97&&k<97+SA_child_animation_max)&&is_safe_key){var id=k-97;var p=is_SA_child_animation?parent:self;var d=p.document.getElementById("Ichild_animation"+id);if(!d||!d.contentWindow.is_SA_child_animation){DEBUG_show("(child animation "+(id+1)+" not found)",2);return true}var ds=d.style;ds.visibility=ds.visibility=="hidden"?"visible":"hidden";if(webkit_mode)ds.display=ds.visibility=="hidden"?"none":"block";p.System._browser._child_selected=null;var child_visible=false;for(var i=0;i=96&&k<96+10){if(self.MMD_SA&&MMD_SA_options.motion_shuffle&&MMD_SA.use_jThree&&MMD_SA.MMD_started){if(this.camera.ML_enabled){}else if(k==96){if(MMD_SA_options._motion_shuffle){if(!MMD_SA_options.motion_shuffle_list_default&&MMD_SA_options._motion_shuffle_list_default){MMD_SA_options.motion_shuffle_list_default=MMD_SA_options._motion_shuffle_list_default.slice();MMD_SA._force_motion_shuffle=true}else{MMD_SA_options.motion_shuffle=MMD_SA_options._motion_shuffle.slice(0);MMD_SA_options.motion_shuffle_list_default=null;MMD_SA._force_motion_shuffle=true;DEBUG_show("(MMD motions shuffled)",2)}}}else{var id=k-97;if(MMD_SA_options.motion_by_song_name){if(MMD_SA_options.motion_by_song_name._loading_){DEBUG_show("(music/motion loading)",2);return true}let entry=Object.keys(MMD_SA_options.motion_by_song_name).find(p=>{return MMD_SA_options.motion_by_song_name[p].key==id+1});if(entry){let song_path=MMD_SA_options.motion_by_song_name[entry].song_path;if(/\.zip\#/i.test(song_path)){MMD_SA_options.motion_by_song_name._loading_=true;song_path=song_path.replace(/^.+[\/\\]([^\/\\]+\.zip)/i,"$1");let xhr=new self.XMLHttpRequestZIP;xhr.onload=function(){MMD_SA_options.motion_by_song_name._loading_=false;let blob=this.response;blob.name=song_path.replace(/^.+[\/\\]/,"");blob.isFileSystem=true;SA_DragDropEMU(blob)};xhr.open("GET",song_path,true);xhr.responseType="blob";xhr.send()}else SA_DragDropEMU(song_path);return true}}if(id>=MMD_SA.normal_action_length){DEBUG_show("(MMD motion not found)",2);return true}if(!MMD_SA_options._motion_shuffle)MMD_SA_options._motion_shuffle=MMD_SA_options.motion_shuffle.slice(0);MMD_SA_options.motion_shuffle=[id];MMD_SA_options.motion_shuffle_list_default=null;MMD_SA._force_motion_shuffle=true;DEBUG_show("(MMD motion changed)",2)}return true}}return false},ondockundock:function(){DEBUG_show("Dock state changed",2);var d=!System.Gadget.docked;System.Gadget.docked=d;System.Gadget.Settings.writeString("SA_docked",!!d==!!is_SA_child_animation?"":d?"1":"0");var f=!d?System.Gadget.onUndock:System.Gadget.onDock;if(!f)return;f()},onmousemove_custom:null,onmousemove:function(event){var ex,ey;ex=this._WE_mouse_x=event.x;ey=this._WE_mouse_y=event.y;if(this.onmousemove_custom&&this.onmousemove_custom(event))return;if(!this.is_dragging){if(is_SA_child_animation&&parent.System._browser.is_dragging){parent.System._browser.onmousemove(event)}return}if(!WallpaperEngine_mode){if(absolute_screen_mode){ex=SA_top_window.getCursorPos().x;ey=SA_top_window.getCursorPos().y}else{ex=event.screenX;ey=event.screenY}}if(is_SA_child_animation||this._child_selected!=null){var cw,cp,id;if(is_SA_child_animation){id=SA_child_animation_id;cw=self;cp=parent}else{id=this._child_selected;cw=document.getElementById("Ichild_animation"+id).contentWindow;cp=self}cp.System.Gadget.Settings._settings_need_update=true;var ani=cp.SA_child_animation[id];var i_obj=cp.document.getElementById("Ichild_animation"+id).style;var oBody=cw.document.body.style;var PBody=cp.document.body.style;var x=ani.x+ex-this.drag_mouse_x;var y=ani.y+ey-this.drag_mouse_y;i_obj.posLeft=ani.x=x;i_obj.posTop=ani.y=y;cw.document.getElementById("Ldebug").innerText=cp.document.getElementById("Ldebug").innerText="(moving)";cw.DEBUG_hide_sec=cp.DEBUG_hide_sec=0;cw.DEBUG_show("("+x+","+y+")",2)}else{System.Gadget.Settings._settings_need_update=true;this.moveBy(ex-this.drag_mouse_x,ey-this.drag_mouse_y,event)}this.moveWallpaper();this.drag_mouse_x=ex;this.drag_mouse_y=ey},moveWallpaper:function(x,y){if(is_SA_child_animation&&(!document.getElementById("C_wallpaper_mask")||!C_wallpaper_mask._WallpaperAsBG_custom))return;if(is_SA_child_animation||document.getElementById("LdesktopBG")&&LdesktopBG.style.display!="none"){if(WallpaperEngine_mode){x=0;y=0}else{if(absolute_screen_mode){if(x==null)x=SA_top_window.screenLeftAbsolute;if(y==null)y=SA_top_window.screenTopAbsolute;var b=SA_top_window.getScreenBounds(x,y);x=-(x-b.x);y=-(y-b.y)}else{if(x==null)x=SA_top_window.screenLeft;if(y==null)y=SA_top_window.screenTop;x=-(x%parent.screen.width);y=-(y%parent.screen.height)}}if(is_SA_child_animation){var ani=parent.SA_child_animation[SA_child_animation_id];x-=ani.x;y-=ani.y}else{var ds=(is_SA_child_animation_host&&Ichild_animation0.contentWindow.document.getElementById("LdesktopBG")||LdesktopBG).style;ds.posLeft=x;ds.posTop=y}if(document.getElementById("C_wallpaper_mask")){var cs=C_wallpaper_mask.style;cs.posLeft=x;cs.posTop=y}}},moveBy:function(x,y,event){SA_top_window.moveByAbsolute(x,y)},update_tray:function(para){try{if(!webkit_electron_mode||IPC.active_window!=self)return;if(this._tray_last_updated==RAF_timestamp){return}this._tray_last_updated=RAF_timestamp;if(!para){para={active_window_id:IPC.active_window_id,click_thru:SA_topmost_window.returnBoolean("IgnoreMouseEvents"),click_thru_partial:SA_topmost_window.returnBoolean("IgnoreMouseEventsPartial"),always_on_top:SA_topmost_window.returnBoolean("AutoItAlwaysOnTop"),stay_on_desktop:SA_topmost_window.returnBoolean("AutoItStayOnDesktop"),use_electron_as_wallpaper:SA_topmost_window.WebKit_object.use_electron_as_wallpaper,auto_pause:SA_topmost_window.returnBoolean("AutoItAutoPause"),opacity:is_SA_child_animation?parent.SA_child_animation[SA_child_animation_id].opacity:parseFloat(System.Gadget.Settings.readString("Opacity")||1),opacity_on_hover:parseFloat(System.Gadget.Settings.readString("OpacityOnHover")||1),size:Settings.CSSTransformFullscreen?-1:Settings.CSSTransformScale,animation_path:Settings.f_path_folder,media_control:self.SL&&SL._mouse_event_main&&SL._mouse_event_main(),MMD:null};var w_list=[true];for(var i=0;i{if(e.func==func)e.canceled=true})},run:function(phase){var e_index_list=[];var ep=events[phase];if(!ep.length)return;var ep_new=[];for(let i=0;i=0){ep_new.push(e)}else{e.func();if(e.loop&&--e.loop!=0)ep_new.push(e)}}events[phase]=ep_new}}}(),get css_scale(){return window.devicePixelRatio>=2?.5:1},virtual_numpad_toggle:function(visible){if(visible==null)visible=Lnumpad_row0.style.display=="none";Lnumpad_row0.style.display=visible?"inline":"none";Lnumpad_rows.style.display=visible?"block":"none";if(visible&&self.ChatboxAT)ChatboxAT.chatW_minimize(0,true)},virtual_numpad:function(){var key_objs={};var key_map={A:1,B:2,C:3,D:4,E:5,F:6,G:7,H:8,X:9};return function(ev,e_type){ev.preventDefault();ev.stopPropagation();var combat_mode=MMD_SA_options.Dungeon&&MMD_SA_options.Dungeon.character.combat_mode;var key=ev.target.textContent;var key_obj=key_objs[key]=key_objs[key]||{};var keyCode,shiftKey,code;switch(key){case"S":keyCode=16;key_obj.pressed=!key_obj.pressed;const buttons=document.getElementsByClassName("Lnumpad_button");if(key_obj.pressed&&MMD_SA_options.Dungeon&&MMD_SA_options.Dungeon.event_mode){for(let i=0;iv[1]==RegExp.$1)[0]}}else{for(let i=0;iv[0]==RegExp.$1)[1]}}e_type=key_obj.pressed?"keydown":"keyup";break;case"+":keyCode=107;if(combat_mode){if(e_type=="keyup")return;key_obj.pressed=!key_obj.pressed;e_type=key_obj.pressed?"keydown":"keyup"}break;case"-":keyCode=109;break;case"*":keyCode=106;break;case"/":keyCode=111;break;case"⏎":keyCode=13;break;case"J":keyCode=32;break;case"↑":keyCode=38;code="ArrowUp";break;case"↓":keyCode=40;code="ArrowDown";break;case"←":keyCode=37;code="ArrowLeft";break;case"→":keyCode=39;code="ArrowRight";break;default:if(/([0-9])/.test(key))keyCode=parseInt(key)+96;else code="Key"+key}if(key_obj.timeoutID)clearTimeout(key_obj.timeoutID);if(key_obj.intervalID)clearTimeout(key_obj.intervalID);key_obj.timeoutID=key_obj.intervalID=null;let e=new KeyboardEvent(e_type,{bubbles:true,cancelable:true,key:key,keyCode:keyCode,code:code,shiftKey:key_objs["S"]&&key_objs["S"].pressed});document.dispatchEvent(e);if(e_type=="keydown"){if(/[\+S]/.test(key)&&(key!="+"||combat_mode)){ev.target.style.opacity="0.75"}else{key_obj.timeoutID=setTimeout(function(){key_obj.intervalID=setInterval(function(){document.dispatchEvent(e)},100)},400)}}else{ev.target.style.opacity=""}}}(),P2P_network:function(){var peer_default;var peer_count=0;var peer_para_default={events:{peer:{},connection:{handshake_request:function(peer,connection){console.log("P2P_network: Remote Peer"+"("+connection.peer+"/"+connection.label+"/host) responding handshake request from Peer-"+peer.index+"("+peer.id+")");connection.send({handshake:{request:true}})},handshake_respond:function(peer,connection,handshake){if(handshake.request){connection.status="connected";console.log("P2P_network: Remote Peer"+"("+connection.peer+"/"+connection.label+"/client)'s handshake request accepted from Peer-"+peer.index+"("+peer.id+")");connection.send({handshake:{accepted:true}})}else if(handshake.accepted){connection.status="connected";console.log("P2P_network: Remote Peer"+"("+connection.peer+"/"+connection.label+"/host) accepted handshake request from Peer-"+peer.index+"("+peer.id+")");if(peer.para.events.connection.handshake_request_accecpted&&peer.para.events.connection.handshake_request_accecpted[connection.label]){peer.para.events.connection.handshake_request_accecpted[connection.label]({peer:peer,connection:connection,handshake:handshake});delete peer.para.events.connection.handshake_request_accecpted[connection.label]}}else{console.log("P2P_network: Remote Peer"+"("+connection.peer+"/"+connection.label+"/host) rejected handshake request from Peer-"+peer.index+"("+peer.id+")");if(peer.para.events.connection.handshake_request_rejected&&peer.para.events.connection.handshake_request_rejected[connection.label]){peer.para.events.connection.handshake_request_rejected[connection.label]({peer:peer,connection:connection,handshake:handshake});delete peer.para.events.connection.handshake_request_rejected[connection.label]}}},data:function(peer,connection,data){}},send_message:function(para){if(!para.command)net.content_window.ChatboxAT.ChatShow([para.name+": "+para.msg]);return null}}};function P2P_Connection(peer,connection){this._connection=connection;this.status="connecting";peer.connections[connection.label]=this;var that=this;connection.on("data",function(data){if(data.handshake){peer.para.events.connection.handshake_respond(peer,that,data.handshake)}else{peer.para.events.connection.data(peer,that,data)}});connection.on("close",function(data){console.log("P2P_network: DataConnection"+"("+connection.peer+"/"+connection.label+"/host) closed");that.close(peer)})}P2P_Connection.prototype.send=function(data){this._connection.send(data)};P2P_Connection.prototype.close=function(peer){if(!peer.connections[this.label])return;if(peer.para.events.connection.close&&peer.para.events.connection.close(peer,this))return;delete peer.connections[this.label];var that=this;setTimeout(function(){that._connection.close();that._connection=null},1e3)};Object.defineProperty(P2P_Connection.prototype,"peer",{get:function(){return this._connection.peer}});Object.defineProperty(P2P_Connection.prototype,"label",{get:function(){return this._connection.label}});function P2P_Peer_connections(){}Object.defineProperty(P2P_Peer_connections.prototype,"length",{get:function(){return Object.keys(this).length}});function P2P_Peer(para=Object.clone(peer_para_default)){this.para=para;this.id=null;var _peer=this._peer=new Peer;this.index=peer_count;this.connections=new P2P_Peer_connections;this.status="connecting";var that=this;_peer.on("open",function(id){peer_count++;if(!peer_default)peer_default=that;that.id=id;that.status="connected";console.log("P2P_network: Peer-"+that.index+"("+id+") connected");that.para.events.peer.open&&that.para.events.peer.open(that)});_peer.on("error",function(err){console.log("P2P_network: Peer-"+that.index+" error",err);if(that.para.events.peer.error_by_connection){that.para.events.peer.error_by_connection(err);delete that.para.events.peer.error_by_connection}else that.para.events.peer.error&&that.para.events.peer.error(that,err)});_peer.on("connection",function(connection){if(para.events.peer.connection&¶.events.peer.connection(that,connection))return;console.log("P2P_network: Remote Peer"+"("+connection.peer+"/"+connection.label+"/client) connecting to Peer-"+that.index+"("+that.id+")");connection.on("open",function(){console.log("P2P_network: Remote Peer"+"("+connection.peer+"/"+connection.label+"/client) connected to Peer-"+that.index+"("+that.id+")");new P2P_Connection(that,connection)})})}P2P_Peer.prototype.connect=function(id,options){var that=this;return new Promise(function(resolve,reject){var on_peer_connect=function(){var connect_options={serialization:"json"};var connection=that._peer.connect(id,connect_options);connection.on("open",function(){console.log("P2P_network: Remote Peer"+"("+connection.peer+"/"+connection.label+"/host) connecting to Peer-"+that.index+"("+that.id+")");var connection_obj=new P2P_Connection(that,connection);that.para.events.connection.handshake_request(that,connection_obj);that.para.events.connection.handshake_request_accecpted=that.para.events.connection.handshake_request_accecpted||{};that.para.events.connection.handshake_request_rejected=that.para.events.connection.handshake_request_rejected||{};that.para.events.connection.handshake_request_accecpted[connection.label]=resolve;that.para.events.connection.handshake_request_rejected[connection.label]=reject;delete that.para.events.peer.error_by_connection});connection.on("error",function(err){console.log("P2P_network: Remote connection failed",err);reject(err)});that.para.events.peer.error_by_connection=reject};switch(that.status){case"connected":on_peer_connect();break;default:setTimeout(function(){reject(that)},0)}})};var net={peer:P2P_Peer,get peer_default(){return peer_default},status:"off",get content_window(){return is_SA_child_animation_host?document.getElementById("Ichild_animation0").contentWindow:self},process_message:function(msg,is_auto){var peer=this.peer_default;if(!peer)return msg;var id=this.content_window.document.getElementById("Flogin").id.value;var pass=this.content_window.document.getElementById("Flogin").pass.value;var options=this.content_window.MMD_SA_options;var name=(id||options&&options.model_para_obj.character&&options.model_para_obj.character.name||"Anonymous").substring(0,16);var online=peer&&peer.connections.length;var return_value;if(!/^\//.test(msg)){return_value=peer.para.events.send_message({name:name,msg:msg,id:id,pass:pass})}else{var command,para1,para2;var obj=this.content_window.ChatboxAT.checkChatCommand(msg);command=obj.command;para1=obj.para1;para2=obj.para2;return_value=peer.para.events.send_message({name:name,msg:msg,command:command,para1:para1,para2:para2,id:id,pass:pass})}if(!is_auto)this.content_window.document.getElementById("Fchat").msg.value="";if(return_value!=null)return return_value;return msg}};return net}(),camera:function(){var camera;var face_detection,fd_worker;var _bodyPix;var _facemesh,fm_worker;var _poseNet;var _handpose;var use_imagebitmap=true;var url_search_params=new URLSearchParams(self.location.search.substring(1));var _info_extra="";var DEBUG_msg="";var double_flip_mode=true;var video_flipped;var camera_video_timestamp=0;var camera_video_frame_id="";function update_video_canvas(){var video=camera.video;if(!video.videoWidth||video.readyState<2){return}if(_bodyPix.busy||RAF_animation_frame_unlimited&&!MMD_SA.WebXR.session&&camera_video_frame_id==camera.video_frame_id&&!_poseNet.bb_clear){return}camera_video_frame_id=camera.video_frame_id;camera_video_timestamp=RAF_timestamp;var video_canvas=camera.video_canvas;var context=video_canvas.getContext("2d");if(_poseNet.bb_clear){if(video.pause&&!video.paused||--_poseNet.bb_clear<=0||_poseNet._bb&&_poseNet._bb_waiting){_poseNet.bb_clear=_poseNet._bb=_poseNet._bb_waiting=null;context.globalCompositeOperation="copy"}else{if(_poseNet._bb){context.globalCompositeOperation="source-over";context.fillStyle="black";let x=_poseNet._bb[3];let y=_poseNet._bb[0];let w=_poseNet._bb[1]-x;let h=_poseNet._bb[2]-y;x=Math.max(x-w*.25,0);y=Math.max(y-h*.25,0);w=Math.min(w*1.5,video_canvas.width);h=Math.min(h*1.5,video_canvas.height);if(camera.video_flipped){x=video_canvas.width-(x+w)}context.fillRect(x,y,w,h);_poseNet._bb=null;_poseNet._bb_waiting=true}return}}var w,h;if(MMD_SA_options.user_camera.pixel_limit.disabled){w=video.videoWidth;h=video.videoHeight}else if(camera.is_local_media){w=video.videoWidth;h=video.videoHeight;const limit=MMD_SA_options.user_camera.pixel_limit.current||MMD_SA_options.user_camera.pixel_limit._default_;if(w*h>limit[0]*limit[1]){const target_ratio=Math.sqrt(w*h/(limit[0]*limit[1]));w=Math.round(w/target_ratio);h=Math.round(h/target_ratio)}}else{w=camera.target_width;h=camera.target_height}var vo=MMD_SA_options.user_camera.display.webcam_as_bg?{scale:1,top:0}:MMD_SA_options.user_camera.display.video;if(!vo.scale){if(video_canvas.style.pixelWidth!=window.innerWidth||video_canvas.style.pixelHeight!=window.innerHeight){video_canvas.style.width=window.innerWidth+"px";video_canvas.style.height=window.innerHeight+"px"}}else{let scale=vo.scale*(camera.display_floating?MMD_SA_options.user_camera.display.floating_scale||MMD_SA_options.user_camera.display.floating&&1||.5:1);let _w=~~(window.innerWidth*scale);let _h=~~(window.innerHeight*scale);if(video_canvas.style.pixelWidth!=_w||video_canvas.style.pixelHeight!=_h){video_canvas.style.width=_w+"px";video_canvas.style.height=_h+"px";let w_space=(window.innerWidth-_w)/2;let h_space=(window.innerHeight-_h)/2;video_canvas.style.left=w_space*(1+(vo.left!=null?vo.left:-1))+"px";video_canvas.style.top=h_space*(1+(vo.top!=null?vo.top:0))+"px"}video_canvas.style.objectFit="contain"}if(video_canvas.width!=w||video_canvas.height!=h){video_canvas.width=w;video_canvas.height=h;context.globalCompositeOperation="copy";if(camera.video_flipped){context.translate(w,0);context.scale(-1,1)}}if(w==video.videoWidth&&h==video.videoHeight){context.drawImage(video,0,0)}else{let ar=w/h;let ar_video=video.videoWidth/video.videoHeight;let xx,yy,ww,hh;if(ar<=ar_video){ww=video.videoHeight*ar;xx=(video.videoWidth-ww)/2;hh=video.videoHeight;yy=0}else{ww=video.videoWidth;xx=0;hh=video.videoWidth/ar;yy=(video.videoHeight-hh)/2}context.drawImage(video,xx,yy,ww,hh,0,0,w,h)}video_canvas.style.visibility=!camera.visible||_bodyPix.enabled||face_detection.initialized&&face_detection.worker_initialized&&!face_detection.dets||camera.hidden_enforced?"hidden":"inherit"}function video_capture(){if(_bodyPix.enabled){_bodyPix.update_frame()}else{if(_facemesh.enabled){_facemesh.update_frame(true)}else if(face_detection.enabled){face_detection.update_frame(true)}if(_poseNet.enabled||_handpose.enabled){pose_update_frame(true)}}const cs=camera.video_canvas_facemesh.style;const vs=camera.video_canvas.style;const scale=MMD_SA_options.user_camera.display.wireframe.align_with_video?1:MMD_SA_options.user_camera.display.wireframe.scale||(is_mobile?.25:1);const w=~~(vs.pixelWidth*scale);const h=~~(vs.pixelHeight*scale);if(cs.pixelWidth!=w||cs.pixelHeight!=h){cs.pixelWidth=w;cs.pixelHeight=h;if(MMD_SA_options.user_camera.display.wireframe.align_with_video){cs.posLeft=vs.posLeft;cs.posTop=vs.posTop}else{let w_space=(window.innerWidth-w)/2;let h_space=(window.innerHeight-h)/2;cs.left=w_space*(1+(MMD_SA_options.user_camera.display.wireframe.left!=null?MMD_SA_options.user_camera.display.wireframe.left:1))+"px";cs.top=h_space*(1+(MMD_SA_options.user_camera.display.wireframe.top!=null?MMD_SA_options.user_camera.display.wireframe.top:-1))+"px"}}cs.objectFit=vs.objectFit;cs.visibility=camera.ML_enabled&&!MMD_SA_options.user_camera.display.wireframe.hidden&&!MMD_SA_options.user_camera.display.webcam_as_bg?"inherit":"hidden"}var video_capture_active;function add_video_capture(){if(camera.initialized){SL.style.transform=SL_2D_front.style.transform=camera.mirror_3D?"scaleX(-1)":"none";camera.video_canvas.style.transform=camera.display_flipped?"scaleX(-1)":"none";camera.reset_video_canvas()}if(!video_capture_active&&camera.initialized){video_capture_active=true;System._browser.on_animation_update.add(update_video_canvas,0,0,-1);System._browser.on_animation_update.add(video_capture,2,1,-1)}}function remove_video_capture(){SL.style.transform=SL_2D_front.style.transform=camera.mirror_3D?"scaleX(-1)":"none";camera.video_canvas.style.transform="none";camera.reset_video_canvas();if(camera.visible)return;if(video_capture_active&&!camera.ML_enabled){video_capture_active=false;System._browser.on_animation_update.remove(update_video_canvas,0);System._browser.on_animation_update.remove(video_capture,1);camera.video_canvas_facemesh.style.visibility="hidden"}}var video_brightness=100;function adjust_video_brightness(e){if(!camera.visible)return;var keyCode=e.detail.keyCode;if(keyCode==107)video_brightness+=10;else if(keyCode==109)video_brightness-=10;else return;video_brightness=Math.max(Math.min(video_brightness,180),20);var context=camera.video_canvas.getContext("2d");if(video_brightness==1){context.filter="none";DEBUG_show("Brightness:100%",2)}else{context.filter="brightness("+video_brightness+"%) contrast("+(100+(video_brightness-100)*.25)+"%)";DEBUG_show("Brightness:"+video_brightness+"%",2)}e.detail.result.return_value=true}var target_devicePixelRatio=0;function video_fallback(src){if(!src)src=camera.local_src||(webkit_electron_mode?"C:\\Users\\user\\Documents\\_.mp4":System.Gadget.path+"/js/headtrackr.mp4");if(/\.(png|jpg|jpeg|bmp|webp)$/i.test(src)){if(!camera._image){camera._image=new Image;Object.defineProperty(camera._image,"videoWidth",{get:function(){return this.width}});Object.defineProperty(camera._image,"videoHeight",{get:function(){return this.height}});Object.defineProperty(camera._image,"readyState",{get:function(){return this.complete?4:0}})}if(camera.video&&camera.video.pause)camera.video.pause();camera.video=camera._image;camera._image.src=toFileProtocol(src)}else{camera.video=camera._video;camera.video.loop=true;if(!camera.video._initialized){camera.video._initialized=true;camera.video.addEventListener("canplaythrough",function(e){camera.media_control_enabled=true;SL_MC_simple_mode=true;SL_MC_video_obj=camera.video;SL_MC_Place(1,0,-64);var speed=motion_recorder.speed;if(speed){camera.video.playbackRate=speed;if(speed<1)camera.video.muted=true}else{camera.video.playbackRate=1}});camera.video.addEventListener("timeupdate",function(e){SL_MC_Timeupdate(this)},true);camera.video.addEventListener("ended",function(e){if(motion_recorder.speed)motion_recorder.stop()})}camera.video.src=toFileProtocol(src)}camera.video_id=src;camera.local_src=src}window.addEventListener("MMDStarted",()=>{function switch_arm_leg_control(e){if(!System._browser.camera.poseNet.enabled)return;const motion_para=MMD_SA.MMD.motionManager.para_SA;if(!motion_para.motion_tracking_upper_body_only||!motion_para.motion_tracking?.arm_as_leg)return;window.addEventListener("SA_camera_poseNet_update",()=>{motion_para.motion_tracking.arm_as_leg.enabled=!motion_para.motion_tracking.arm_as_leg.enabled;frames.reset_to_default_motion_once=true;DEBUG_show("Arm-as-leg control:"+(motion_para.motion_tracking.arm_as_leg.enabled?"ON":"OFF"),3)},{once:true})}const config={id:"arm_to_leg_control_mode",accelerator:["Alt+Q"],process:switch_arm_leg_control};if(System._browser.hotkeys._hotkey_config){System._browser.hotkeys._hotkey_config.push(config)}else{System._browser.hotkeys.add(config)}});var ML_enabled=false;function ML_init(){var enabled=_facemesh.enabled||_poseNet.enabled;if(ML_enabled==!!enabled)return;ML_enabled=!!enabled;if(enabled){add_video_capture();frames.reset();frames.add_events();DEBUG_show("(Camera ML Mode:ON)",2)}else{if(camera.initialized){camera.video_canvas_face_detection.style.visibility="hidden";camera.video_canvas_facemesh.style.visibility="hidden";remove_video_capture()}frames.remove_events();camera._info="";DEBUG_show("(Camera ML Mode:OFF)",2)}}var pose_initialized,pose_worker_initialized,pose_busy;var v3a,v3b,v3c,v3d;var q1,q2,q3,q4,q5,q6;var rot_m4,q_m4;var v2a,v2b;var pos_offset_last;var rot_parent_upper_body_inv;var shoulder_rot_filter={};var finger_list=["親","人","中","薬","小"];var finger_list_en=["thumb","index","middle","ring","pinky"];var nj_list=["0","1","2","3"];window.addEventListener("jThree_ready",()=>{v3a=new THREE.Vector3;v3b=new THREE.Vector3;v3c=new THREE.Vector3;v3d=new THREE.Vector3;pos_offset_last=new THREE.Vector3;q1=new THREE.Quaternion;q2=new THREE.Quaternion;q3=new THREE.Quaternion;q4=new THREE.Quaternion;q5=new THREE.Quaternion;q6=new THREE.Quaternion;rot_m4=new THREE.Matrix4;q_m4=new THREE.Quaternion;v2a=new THREE.Vector2;v2b=new THREE.Vector2;rot_parent_upper_body_inv=new THREE.Quaternion;["左","右"].forEach(d=>{shoulder_rot_filter[d]=new System._browser.data_filter([{type:"one_euro",id:"shoulder_rot",para:[30,1,5,1,1]}])})});var use_human;var use_mixed_human;var use_tfjs_posenet;var use_movenet=true;var use_blazepose=true;var use_mediapipe;var use_holistic=true;var use_human_only,use_human_pose,use_human_hands;var _no_pose_data=false;var posenet_part_name=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"];var blazepose_translated=[0,2,5,7,8,11,12,13,14,15,16,23,24,25,26,27,28];var posenet_part_dummy=[];posenet_part_name.forEach(name=>{posenet_part_dummy.push({part:name,score:0})});var rot_arm_adjust,rot_hand_adjust;var pose_core_initialized;function pose_init_core(){if(pose_core_initialized)return;pose_core_initialized=true;const model=THREE.MMD.getModels()[0];const bones_by_name=model.mesh.bones_by_name;const armL=bones_by_name["左腕"].pmxBone.origin;const elbowL=bones_by_name["左ひじ"].pmxBone.origin;MMD_SA_options.model_para_obj.left_arm_z_rot=Math.PI/2+Math.atan2(elbowL[1]-armL[1],elbowL[0]-armL[0]);const armIKL=bones_by_name["左腕IK"].pmxBone.origin;MMD_SA_options.model_para_obj.left_arm_to_IK_xy=[armL[0]-armIKL[0],armL[1]-armIKL[1],armL[2]-armIKL[2]];MMD_SA_options.model_para_obj.left_arm_length=MMD_SA.TEMP_v3.fromArray(MMD_SA_options.model_para_obj.left_arm_to_IK_xy).length();MMD_SA_options.model_para_obj.arm_IK_offset={"左":(new THREE.Vector3).fromArray(bones_by_name["左腕"].pmxBone.origin).sub(v3b.fromArray(bones_by_name["左腕IK"].parent.pmxBone.origin)),"右":(new THREE.Vector3).fromArray(bones_by_name["右腕"].pmxBone.origin).sub(v3b.fromArray(bones_by_name["右腕IK"].parent.pmxBone.origin))};let armR=bones_by_name["右腕"].pmxBone.origin;MMD_SA_options.model_para_obj.shoulder_width=Math.abs(armL[0]-armR[0]);MMD_SA_options.model_para_obj.arm_axis={"左":(new THREE.Vector3).fromArray(armIKL).sub(MMD_SA.TEMP_v3.fromArray(armL)).normalize()};MMD_SA_options.model_para_obj.arm_axis["右"]=MMD_SA_options.model_para_obj.arm_axis["左"].clone().setX(-MMD_SA_options.model_para_obj.arm_axis["左"].x);const legL=bones_by_name["左足"].pmxBone.origin;const footL=bones_by_name["左足首"].pmxBone.origin;MMD_SA_options.model_para_obj.hip_center=(new THREE.Vector3).fromArray(legL).setX(0);MMD_SA_options.model_para_obj.spine_length=bones_by_name["首"].pmxBone.origin[1]-MMD_SA_options.model_para_obj.hip_center.y;MMD_SA_options.model_para_obj.left_heel_height=footL[1];MMD_SA_options.model_para_obj.leg_IK_offset={"左":(new THREE.Vector3).fromArray(bones_by_name["左足"].pmxBone.origin).sub(v3b.fromArray(bones_by_name["左足IK"].parent?.pmxBone?.origin||[0,0,0]).setY(0)),"右":(new THREE.Vector3).fromArray(bones_by_name["右足"].pmxBone.origin).sub(v3b.fromArray(bones_by_name["右足IK"].parent?.pmxBone?.origin||[0,0,0]).setY(0))};MMD_SA_options.model_para_obj.left_leg_upper_length=legL[1]-bones_by_name["左ひざ"].pmxBone.origin[1];MMD_SA_options.model_para_obj.left_leg_lower_length=bones_by_name["左ひざ"].pmxBone.origin[1]-footL[1];MMD_SA_options.model_para_obj.left_leg_length=MMD_SA_options.model_para_obj.left_leg_upper_length+MMD_SA_options.model_para_obj.left_leg_lower_length;MMD_SA_options.model_para_obj.left_leg_IK=[legL[0]-footL[0],legL[1]-footL[1],legL[2]-footL[2]];let LR=["左","右"];rot_arm_adjust={};LR.forEach(d=>{["腕","ひじ"].forEach((n,idx)=>{let name_full=d+n;let r=MMD_SA.get_bone_axis_rotation(model.mesh,name_full);rot_arm_adjust[name_full]={name:name_full,axis_rot:r,parent:idx==0?{axis_rot:new THREE.Quaternion}:rot_arm_adjust[d+"腕"]};rot_arm_adjust[name_full].axis_rot_offset_inv=(new THREE.Quaternion).multiplyQuaternions(rot_arm_adjust[name_full].parent.axis_rot,MMD_SA.TEMP_q.copy(rot_arm_adjust[name_full].axis_rot).conjugate())})});const rot_hand_adjust_base={};rot_hand_adjust_base[1]=(new THREE.Quaternion).setFromEuler(MMD_SA.TEMP_v3.set(0,-Math.PI/2*1,Math.PI/2*1),"YZX");rot_hand_adjust_base[-1]=(new THREE.Quaternion).setFromEuler(MMD_SA.TEMP_v3.set(0,-Math.PI/2*-1,Math.PI/2*-1),"YZX");rot_hand_adjust={};rot_hand_adjust[1]=(new THREE.Quaternion).multiplyQuaternions(rot_hand_adjust_base[1],MMD_SA._q1.copy(rot_arm_adjust["左腕"].axis_rot).conjugate());rot_hand_adjust[-1]=(new THREE.Quaternion).multiplyQuaternions(rot_hand_adjust_base[-1],MMD_SA._q1.copy(rot_arm_adjust["右腕"].axis_rot).conjugate());MMD_SA_options.model_para_obj.rot_hand_adjust_base=rot_hand_adjust_base;MMD_SA_options.model_para_obj.rot_hand_adjust=rot_hand_adjust;MMD_SA_options.model_para_obj.finger_base={};LR.forEach(d=>{finger_list.forEach((f,f_idx)=>{let name=d+f+"指";let f_base_index=f_idx==0&&bones_by_name[name+nj_list[0]]?0:1;if(!bones_by_name[name+nj_list[f_base_index+0]])return;let f_obj=MMD_SA_options.model_para_obj.finger_base[d+f_idx]={base_index:f_base_index};for(let _f_base_index=f_obj.base_index+(f_idx==0?0:-1),idx=_f_base_index;idx<3;idx++){let name_full=name+nj_list[f_obj.base_index+(idx-_f_base_index)];let r=MMD_SA.get_bone_axis_rotation(model.mesh,name_full,true);rot_arm_adjust[name_full]={name:name_full,axis_rot:r,parent:idx==_f_base_index?rot_arm_adjust[d+"ひじ"]:rot_arm_adjust[name+nj_list[f_obj.base_index+(idx-1-_f_base_index)]]};rot_arm_adjust[name_full].axis_rot_offset_inv=(new THREE.Quaternion).multiplyQuaternions(rot_arm_adjust[name_full].parent.axis_rot,MMD_SA.TEMP_q.copy(rot_arm_adjust[name_full].axis_rot).conjugate())}})});for(const name in rot_arm_adjust){if(name.indexOf("指")!=-1){MMD_SA.TEMP_v3.setEulerFromQuaternion(rot_arm_adjust[name].axis_rot,"ZYX");MMD_SA.TEMP_v3.z*=-1;rot_arm_adjust[name].axis_rot.setFromEuler(MMD_SA.TEMP_v3,"ZYX")}rot_arm_adjust[name].axis_rot_inv=rot_arm_adjust[name].axis_rot.clone().conjugate()}for(const name in rot_arm_adjust){if(name.indexOf("指")!=-1){rot_arm_adjust[name]._axis_rot_offset_inv_z=MMD_SA.TEMP_v3.setEulerFromQuaternion(MMD_SA.TEMP_q.copy(rot_arm_adjust[name].axis_rot_offset_inv).premultiply(rot_arm_adjust[name].parent.axis_rot_inv).multiply(rot_arm_adjust[name].parent.axis_rot),"ZYX").z}}MMD_SA_options.model_para_obj.rot_arm_adjust=rot_arm_adjust;console.log(rot_arm_adjust)}const pose_workers={};let pose_worker;let pose_worker_id;let pose_worker_url;class PoseWorker{constructor(id,worker){this.id=id;this.worker=worker}initialized=false}async function pose_init(){if(pose_initialized)return;pose_initialized=true;pose_init_core();var para=[];if(is_mobile){para.push("use_mobilenet=1")}if(use_holistic){para.push("use_holistic=1");use_human=use_mixed_human=false;use_blazepose=use_mediapipe=true}if(use_human){para.push("use_human=1");use_human_only=true;use_human=true;use_mixed_human=false;use_tfjs_posenet=false;use_human_pose=true;use_human_hands=true}else if(use_mixed_human){para.push("use_mixed_human=1");use_human=true;use_mixed_human=true;use_tfjs_posenet=true;use_human_hands=true}else{use_human=false;use_mixed_human=false;use_tfjs_posenet=true}if(use_blazepose){para.push("use_blazepose=1");use_mediapipe=true}if(use_mediapipe){para.push("use_mediapipe=1");if(use_human){use_human_pose=true;use_human_hands=false}use_movenet=true}if(use_movenet){para.push("use_movenet=1")}if(MMD_SA_options.user_camera.ML_models.worker_disabled&&_facemesh.initialized&&!_facemesh.worker_initialized){await new Promise(function(resolve,reject){var timerID=setInterval(()=>{if(_facemesh.worker_initialized){clearInterval(timerID);resolve()}},100)})}else{await _facemesh.init()}if(MMD_SA_options.user_camera.ML_models.worker_disabled){pose_worker={postMessage:function(msg,transfer){PoseAT.onmessage({data:msg})}};let script=document.createElement("script");script.onload=function(){PoseAT.init(pose_worker,para)};script.src="js/pose_lib.js";document.head.appendChild(script)}else{pose_worker_url="js/pose_worker.js"+(para.length?"?"+para.join("&"):"");pose_worker_id=_poseNet.use_holistic?"legacy_holistic":"tasks_vision";console.log("Web worker ID:"+pose_worker_id);pose_worker=new Worker(pose_worker_url);pose_workers[pose_worker_id]=new PoseWorker(pose_worker_id,pose_worker)}pose_worker.onmessage=pose_worker_onmessage}var process_head_rotation=function(){let head_rot_filter,head_chest_rot_filter;window.addEventListener("jThree_ready",()=>{head_rot_filter=new System._browser.data_filter([{type:"one_euro",id:"head_rot",para:[30,1,2,1,4]}]);head_chest_rot_filter=new System._browser.data_filter([{type:"one_euro",id:"head_chest_rot",para:[30,.25,.5,1,3]}])});return function(mesh,name){const bone=mesh.bones_by_name[name];const s=this.skin[name];let ratio=Math.max(Math.min(s[0].t_delta/s[0].t_delta_frame,1),0);const q_identity=MMD_SA.TEMP_q.set(0,0,0,1);var rot=s[0].no_blending?MMD_SA._q2.copy(s[0].rot):MMD_SA._q2.copy(s[1].rot).slerp(s[0].rot,ratio);if(!bone){s[0]._rot_from_pose.copy(rot);return}const motion_para=MMD_SA.MMD.motionManager.para_SA;const use_motion_tracking_para=_poseNet.enabled||motion_para.motion_tracking_upper_body_only;var rot_parent=s[0].rot_parent;if(!rot_parent){const head_rotation_weight=use_motion_tracking_para&&motion_para.motion_tracking?.head_rotation_weight||0;if(head_rotation_weight==1){rot_parent=new THREE.Quaternion}else{rot_parent=MMD_SA.get_bone_rotation_parent(mesh,name,mesh).conjugate();if(use_motion_tracking_para)rot_parent.premultiply(q2.copy(this._rot_body_offset).multiply(this._rot_body_camera));if(head_rotation_weight)rot_parent.slerp(q_identity,head_rotation_weight)}}s[0]._rot_parent=rot_parent;if(s[0].info[1]=="facemesh"&&this.skin[name+"_DUMMY_"]){let _ratio=Math.min(Math.max(.25-s[0]._rot_ratio,0)*5,1);rot.slerp(this.skin[name+"_DUMMY_"][0]._rot_from_pose,_ratio*_ratio*.667);s[0]._rot_mixed=rot.clone()}var angle=rot.toAxisAngle()[1]%(Math.PI*2);if(angle>Math.PI)angle=Math.PI*2-angle;else if(angle<0&&angle<-Math.PI)angle+=Math.PI*2;angle=Math.abs(angle);ratio=_poseNet.use_3D_pose?.5:.3+Math.max(angle-Math.PI/2,0)/(Math.PI/2)*.2;var rot_head=q1.multiplyQuaternions(rot_parent,rot);rot_head.fromArray(head_rot_filter.filter(rot_head.toArray()));var rot_head_v3=v3a.setEulerFromQuaternion(rot_head,"YZX");var rot_head_ratio=[rot_head_v3.x<0?ratio+(.5-ratio)*.5:ratio,ratio,ratio];rot_head.setFromEuler(v3b.fromArray(rot_head_v3.toArray().map((a,i)=>Math.sign(a)*Math.min(Math.abs(a),Math.PI/2)*rot_head_ratio[i])),"YZX");if(use_motion_tracking_para){const motion_tracking=motion_para.motion_tracking;const rot0_ratio=1-(motion_tracking?.motion_default_weight?.head||0)*this.camera_weight;if(rot0_ratio){const rot0=q2.copy(bone.quaternion).premultiply(q3.copy(this._body_motion_rot[0]["首"]).conjugate());bone.quaternion.slerp(rot0,rot0_ratio);rot0.copy(mesh.bones_by_name["頭"].quaternion).premultiply(q3.copy(this._body_motion_rot[0]["頭"]).conjugate());mesh.bones_by_name["頭"].quaternion.slerp(rot0,rot0_ratio)}}bone.quaternion.multiply(rot_head);mesh.bones_by_name["頭"].quaternion.premultiply(rot_head);s[0]._rot_neck=bone.quaternion.clone();s[0]._rot_head=mesh.bones_by_name["頭"].quaternion.clone();if(motion_recorder.active){motion_recorder.set_boneKey(name,null,bone.quaternion,true);motion_recorder.set_boneKey("頭",null,mesh.bones_by_name["頭"].quaternion,false)}if(ratio<.5){const bone=mesh.bones_by_name["上半身2"];const rot_torso=q1.setFromEuler(v3a.fromArray(head_chest_rot_filter.filter(v3a.setEulerFromQuaternion(rot,"YZX").multiply(v3b.fromArray(rot_head_ratio.map(r=>1-r*2))).toArray())),"YZX");if(!_poseNet.enabled){frames.add("skin","上半身2",{no_blending:true,rot:rot_torso.clone()})}else{bone.quaternion.multiply(rot_torso)}}}}();var camera_depth_scale=1*10;var camera_depth=function(){var camera_depth_data=[];var camera_depth_filter;var v_hip,v_hip_filter;window.addEventListener("jThree_ready",()=>{camera_depth_filter=new System._browser.data_filter([{type:"one_euro",id:"camera_depth",para:[30,1,1/5,1,1]}]);camera_depth.v_hip=v_hip=new THREE.Vector3;v_hip_filter=new System._browser.data_filter([{type:"one_euro",id:"v_hip",para:[30,1,1/2,1,3]}])});function prepare(pose){var armL=pose.keypoints[5];var armR=pose.keypoints[6];var hipL=pose.keypoints[11];var hipR=pose.keypoints[12];if(armL.score<=0||armR.score<=0)return;let armL3D,armR3D;if(pose.keypoints3D_raw){armL3D=pose.keypoints3D_raw[11];armR3D=pose.keypoints3D_raw[12]}else{armL3D=pose.keypoints3D[5];armR3D=pose.keypoints3D[6]}camera_depth_data=[{point2D:[{position:new THREE.Vector3},{position:new THREE.Vector3}],data3D:{length:0,z_diff:0}}];const spine_length_ref=_poseNet.spine_length_ref;let shoulder_reference_ratio=1;if(hipL.score>0&&hipR.score>0){let spine=MMD_SA._v3a.addVectors(armL3D,armR3D).multiplyScalar(.5);let spine3D_length=spine.length();let y_axis=MMD_SA.TEMP_v3.set(0,1,0);y_axis.y*=-1;let _ax=MMD_SA._v3b.setEulerFromQuaternion(MMD_SA.TEMP_q.setFromUnitVectors(y_axis,spine.normalize()),"ZXY").x;shoulder_reference_ratio=Math.abs(_ax)/(Math.PI/2);shoulder_reference_ratio=shoulder_reference_ratio<=1?Math.max(shoulder_reference_ratio-.5,0)/.5:Math.max(2-shoulder_reference_ratio,0);let hip2D=v2a.copy(hipL.position).add(hipR.position).multiplyScalar(.5);let shoulder2D=v2b.copy(armL.position).add(armR.position).multiplyScalar(.5);let spine2D_length=hip2D.distanceTo(shoulder2D);shoulder2D.copy(hip2D);shoulder2D.y=shoulder2D.y-spine2D_length/Math.abs(Math.cos(_ax));camera_depth_data[0].point2D[0].position.copy(shoulder2D);camera_depth_data[0].point2D[1].position.copy(hip2D);camera_depth_data[0].data3D.length=spine_length_ref*(spine3D_length*2)}if(shoulder_reference_ratio){let shoulder=MMD_SA._v3b.copy(armL3D).sub(armR3D);let shoulder3D_length=shoulder.length();let x_axis=MMD_SA.TEMP_v3.set(1,0,0);let _ay=MMD_SA._v3b.setEulerFromQuaternion(MMD_SA.TEMP_q.setFromUnitVectors(x_axis,shoulder.normalize()),"ZYX").y;let hip2D=v2b.copy(armL.position).add(armR.position).multiplyScalar(.5);let shoulder2D=hip2D.clone();let shoulder2D_length=v2a.copy(armL.position).distanceTo(armR.position);hip2D.y=hip2D.y+shoulder2D_length*1.5/Math.abs(Math.cos(_ay));if(hip2D.y>camera.video_canvas.height){shoulder2D.y=Math.max(shoulder2D.y-(hip2D.y-camera.video_canvas.height),0);hip2D.y=camera.video_canvas.height}if(camera_depth_data[0].data3D.length!=0){let spine_reference_ratio=Math.abs(_ay)/(Math.PI/2);spine_reference_ratio=spine_reference_ratio<=1?Math.max(spine_reference_ratio-.5,0)/.5:Math.max(2-spine_reference_ratio,0);shoulder_reference_ratio*=1-spine_reference_ratio}camera_depth_data[0].point2D[0].position.lerp(shoulder2D,shoulder_reference_ratio);camera_depth_data[0].point2D[1].position.lerp(hip2D,shoulder_reference_ratio);camera_depth_data[0].data3D.length=camera_depth_data[0].data3D.length*(1-shoulder_reference_ratio)+spine_length_ref*(shoulder3D_length*3)*shoulder_reference_ratio}}function estimate(){if(!camera_depth_data.length)return;var camera=System._browser.camera;var w=camera.video_canvas.width;var h=camera.video_canvas.height;var v3_screen=v3a;var camera_depth=[];const ar=w/h;const ar_3D=SL.width/SL.height;const w_ar=ar{v3_screen.set((data.point2D[0].position.x/w*2-1)*w_ar,(-(data.point2D[0].position.y/h)*2+1)*h_ar,.5);var v3_armL=MMD_SA._v3a.copy(v3_screen.unproject(camera._camera_reset).sub(camera._camera_reset.position).normalize());v3_screen.set((data.point2D[1].position.x/w*2-1)*w_ar,(-(data.point2D[1].position.y/h)*2+1)*h_ar,.5);var v3_hipR=MMD_SA._v3b.copy(v3_screen.unproject(camera._camera_reset).sub(camera._camera_reset.position).normalize());var length,z_diff;length=data.data3D.length;z_diff=data.data3D.z_diff;let a=Math.sqrt(Math.pow(v3_armL.x-v3_hipR.x*v3_armL.z/v3_hipR.z,2)+Math.pow(v3_armL.y-v3_hipR.y*v3_armL.z/v3_hipR.z,2)+0);let b=v3_armL.x-v3_hipR.x*v3_armL.z/v3_hipR.z+(v3_armL.y-v3_hipR.y*v3_armL.z/v3_hipR.z)+0;let c=b/a;let _z_=1;let s_armL=(Math.sqrt(length*length+1)-1)/(a/c);v3_armL.multiplyScalar(s_armL);camera_depth.push({z:-v3_armL.z*1.5,id:data.id})});camera_depth.sort((a,b)=>b.z-a.z);var _z=camera_depth[0].z;this.z=_z;z=camera_depth_filter.filter(_z);this.z_smoothed=z;camera_depth_data=[]}function get_hip_center(pose){if(MMD_SA.WebXR.session){v_hip.set(0,0,0);return}const w=camera.video_canvas.width;const h=camera.video_canvas.height;const hipL=pose.keypoints[11];const hipR=pose.keypoints[12];const armL=pose.keypoints[5];const armR=pose.keypoints[6];const arm_center=armL.score>0&&armR.score>0?v2a.copy(armL.position).add(armR.position).multiplyScalar(.5):null;const ar=w/h;const ar_3D=SL.width/SL.height;const w_ar=ar0&&hipR.score>0){hip_center=v2b.copy(hipL.position).add(hipR.position).multiplyScalar(.5);const x=hip_center.x;const y=hip_center.y;hip_ratio=1;if(arm_center){if(y<0||y>h){hip_ratio=1-Math.min((y<0?-y:y-h)/Math.abs(arm_center.y-y),1)}if(x<0||x>w){hip_ratio=Math.min(hip_ratio,1-Math.min((x<0?-x:x-w)/Math.abs(arm_center.x-x),1))}hip_ratio=Math.max(hip_ratio-.5,0)/.5}v_hip.set(((hipL.position.x+hipR.position.x)/2/w*2-1)*w_ar,(-((hipL.position.y+hipR.position.y)/2/h)*2+1)*h_ar,.5).unproject(camera._camera_reset).sub(camera._camera_reset.position).normalize()}let v_hip_from_shoulder;if(hip_ratio<1){v_hip_from_shoulder=v3c.set(((armL.position.x+armR.position.x)/2/w*2-1)*w_ar,(-((armL.position.y+armR.position.y)/2/h)*2+1)*h_ar,.5).unproject(camera._camera_reset).sub(camera._camera_reset.position).normalize()}if(camera_depth_scale)camera_depth.estimate();const cam_distance_default=camera._camera_reset.position.z-THREE.MMD.getModels()[0].mesh.position.z;let cam_distance=cam_distance_default;if(camera_depth_scale&&camera_depth.z)cam_distance=camera_depth.z_smoothed||camera_depth.z;if(hip_ratio>0)v_hip.multiplyScalar(-cam_distance/v_hip.z);if(v_hip_from_shoulder){const spine_length=_poseNet.spine_length_ref;const v_hip_offset=MMD_SA.TEMP_v3.set(0,-spine_length,0);v_hip.lerp(v_hip_from_shoulder.multiplyScalar(-cam_distance/v_hip_from_shoulder.z).add(v_hip_offset),1-hip_ratio)}const filter=v_hip_filter.filters[0].filter;const f=Math.max(Math.abs(v_hip.z)-10,0)/10;const v=.2+f*.8;filter.minCutOff=Math.min(v,10);filter.beta=Math.min(v,1);v_hip.fromArray(v_hip_filter.filter(v_hip.toArray()))}return{prepare:prepare,estimate:estimate,get_hip_center:get_hip_center}}();var lock_elbow=(()=>{function findCircleLineIntersections(r,h,k,m,n){function sq(v){return v*v}const sqrt=Math.sqrt;var a=1+sq(m);var b=-h*2+m*(n-k)*2;var c=sq(h)+sq(n-k)-sq(r);var d=sq(b)-4*a*c;if(d>=0){var intersections=[(-b+sqrt(sq(b)-4*a*c))/(2*a),(-b-sqrt(sq(b)-4*a*c))/(2*a)];if(d==0){return[intersections[0]]}return intersections}return[]}var v3b,v3c,v3d;var q2;window.addEventListener("jThree_ready",()=>{v3b=new THREE.Vector3;v3c=new THREE.Vector3;v3d=new THREE.Vector3;q2=new THREE.Quaternion});return function(elbow_lock,mesh,d){const py=elbow_lock._elbow_y;const b_elbow=MMD_SA.get_bone_position(mesh,d+"ひじ",mesh);if(b_elbow.y>py)return;const b_hand=MMD_SA.get_bone_position(mesh,d+"手首",mesh);const b_arm=MMD_SA.get_bone_position(mesh,d+"腕",mesh);const a=b_arm;const m=v3d.copy(b_hand).sub(a);const p=b_elbow;const t=(p.x*m.x+p.y*m.y+p.z*m.z-(a.x*m.x+a.y*m.y+a.z*m.z))/m.lengthSq();const q=MMD_SA._v3b.set(a.x+m.x*t,a.y+m.y*t,a.z+m.z*t);const x_axis=m.normalize();const y_axis=v3c.copy(b_elbow).sub(q).normalize().negate();const z_axis=v3b.crossVectors(x_axis,y_axis).normalize();const p1=(new THREE.Plane).setFromNormalAndCoplanarPoint(x_axis,b_elbow);const p2=(new THREE.Plane).setFromNormalAndCoplanarPoint(MMD_SA.TEMP_v3.set(0,1,0),MMD_SA._v3a.set(0,py,0));const line=p1.intersectPlane(p2);if(!line)return;rot_m4.set(x_axis.x,x_axis.y,x_axis.z,0,y_axis.x,y_axis.y,y_axis.z,0,z_axis.x,z_axis.y,z_axis.z,0,0,0,0,1);q_m4.setFromBasis(rot_m4);const r=MMD_SA.TEMP_v3.copy(b_elbow).sub(q).length();let y_intercept=p2.intersectLine(new THREE.Line3(b_elbow,q),v3d);if(!y_intercept)return;y_intercept=-y_intercept.sub(b_elbow).length();line[1].applyQuaternion(q_m4);const slope=line[1].y/line[1].z;b_elbow.sub(b_arm);b_elbow.applyQuaternion(q_m4);const intersections=findCircleLineIntersections(r,b_elbow.z,b_elbow.y,slope,y_intercept);if(!intersections.length)return;const angle=intersections.map(x=>{x-=b_elbow.z;return Math.asin(x/r)});const sign_LR=d=="左"?1:-1;const rot_chest=MMD_SA.get_bone_rotation(mesh,"上半身2",null,mesh);const rot_arm_parent=q2.copy(rot_chest).conjugate();const axis=v3c.copy(b_hand).sub(b_arm).normalize().applyQuaternion(rot_arm_parent);const _angle=elbow_lock.use_smallest_angle?angle.sort((a,b)=>Math.abs(a)-Math.abs(b))[0]:angle[sign_LR==-1?angle.length-1:0];const rot_adjust=MMD_SA.TEMP_q.setFromAxisAngle(axis,_angle);mesh.bones_by_name[d+"腕"].quaternion.premultiply(rot_adjust)}})();const shoulder_z_angle=[0,0,0];var pose_worker_onmessage=function(){function rotate_arm(rot_arm,name){let r=rot_arm_adjust[name];rot_arm.premultiply(r.axis_rot).multiply(r.axis_rot_inv);rot_arm.multiplyQuaternions(r.axis_rot_offset_inv,rot_arm)}function adjust_leg_IK(mesh,name){if(_poseNet.IK_disabled_check(name))return;var bone=mesh.bones_by_name[name];var s=this.skin[name];var d=name.charAt(0);var hip_pmx=MMD_SA.TEMP_v3.fromArray(mesh.bones_by_name[d+"足"].pmxBone.origin);var hip_offset=MMD_SA.get_bone_position(mesh,d+"足","全ての親").sub(hip_pmx);bone.position.add(hip_offset);mesh.bones_by_name[d+"ひざ"].quaternion.set(0,0,0,1);if(motion_recorder.active){if(MMD_SA_options.user_camera.ML_models.pose.use_legIK){const pos_IK=MMD_SA.TEMP_v3.copy(bone.position);pos_IK.sub(v3a.fromArray(mesh.bones_by_name[name].pmxBone.origin).sub(v3b.fromArray(mesh.bones_by_name[name].parent?.pmxBone?.origin||[0,0,0])));motion_recorder.set_boneKey(name,pos_IK,s[0].rot?bone.quaternion:null,true)}window.addEventListener("SA_MMD_model"+mesh._model_index+"_process_bones_after_IK",()=>{motion_recorder.set_boneKey(d+"足",null,mesh.bones_by_name[d+"足"].quaternion,false);motion_recorder.set_boneKey(d+"ひざ",null,mesh.bones_by_name[d+"ひざ"].quaternion,false)},{once:true})}bone.quaternion.set(0,0,0,1)}function process_arm(mesh,name){const d=name.charAt(0);const bones=mesh.bones_by_name;const q=bones[name].quaternion;if(MMD_SA.MMD.motionManager.para_SA.motion_tracking_upper_body_only){q.multiplyQuaternions(rot_parent_upper_body_inv,q)}process_arm_from_shoulder.call(this,mesh,name)}function process_arm_from_shoulder(mesh,name){const d=name.charAt(0);const bones=mesh.bones_by_name;const q=bones[name].quaternion;const s=this.skin[d+"肩"];if(s){let ratio=Math.max(Math.min(s[0].t_delta/s[0].t_delta_frame,1),0);q.premultiply(MMD_SA.TEMP_q.copy(s[1].rot).slerp(s[0].rot,ratio).conjugate())}}var adjust_hip_center=(()=>{var shoulder_y_offset_filter;window.addEventListener("jThree_ready",()=>{});return function(mesh,name){var bone=mesh.bones_by_name[name];var s=this.skin[name];var ratio=Math.max(Math.min(s[0].t_delta/s[0].t_delta_frame,1),0);const v_hip=v3a.copy(camera_depth.v_hip);if(MMD_SA.WebXR.session){v_hip.set(0,0,0)}else{const cam_distance_default=camera._camera_reset.position.z-THREE.MMD.getModels()[0].mesh.position.z;v_hip.z=MMD_SA_options.user_camera.ML_models.pose.estimate_z_depth===false?0:cam_distance_default+v_hip.z}if(MMD_SA_options.user_camera.ML_models.pose.position_offset)v_hip.add(MMD_SA_options.user_camera.ML_models.pose.position_offset);s[0].pos.copy(v_hip);var pos_offset=(new THREE.Vector3).copy(s[1].pos).lerp(s[0].pos,ratio);var hipL=MMD_SA.get_bone_position(mesh,"左足","全ての親");var hipR=MMD_SA.get_bone_position(mesh,"右足","全ての親");var hip_offset=MMD_SA.TEMP_v3.copy(hipL).add(hipR).multiplyScalar(.5).sub(MMD_SA_options.model_para_obj.hip_center).negate();if(_poseNet.auto_grounding){let legL=MMD_SA.get_bone_position(mesh,"左足首","全ての親");let legR=MMD_SA.get_bone_position(mesh,"右足首","全ての親");let leg_on_ground=legL.y0){THREE.MMD.getModels()[mesh._model_index].resetPhysics(15+dis_offset*2)}pos_offset_last.copy(pos_offset)}})();function transform_position(name,pos,p,transform_default){function get_value(v,axis,len){if(typeof v=="number")return v;if(/^(\w+)([\+\-])([\d\.])$/.test(v)){const f=(RegExp.$2=="+"?1:-1)*parseFloat(RegExp.$3);const _pos=MMD_SA.TEMP_v3.copy(pos);const pos_name=RegExp.$1;if(pos_name=="default"){_pos.copy(frames._skin[name].pos).sub(name.indexOf("腕")!=-1?MMD_SA_options.model_para_obj.arm_IK_offset[d]:MMD_SA_options.model_para_obj.leg_IK_offset[d]).applyQuaternion(frames._skin[name].rot_parent_inv)}else if(pos_name=="elbow"){if(axis=="y"){const elbow_y=motion_para?.motion_tracking?.arm_tracking?.elbow_lock?.[d=="左"?"left":"right"]?._elbow_y;if(elbow_y!=null&&elbow_y!=0){_pos.y=elbow_y-MMD_SA.get_bone_position(mesh,d+"腕",mesh).y}}}return(_pos[axis]+f)/len}return 0}const d=name.charAt(0);const pos_length_unit=name.indexOf("腕")!=-1?MMD_SA_options.model_para_obj.left_arm_length:MMD_SA_options.model_para_obj.left_leg_length;const dir=d=="左"?"left":"right";const model=THREE.MMD.getModels()[0];const mesh=model.mesh;const motion_para=MMD_SA.motion[model.skin._motion_index].para_SA;let rot_upper_leg;if(p){for(const axis of["x","y","z"]){const a=p[axis];if(!a)continue;const len=a.unit_length||pos_length_unit;if(a.scale!=null)pos[axis]*=typeof a.scale?.[dir]=="number"&&a.scale[dir]||a.scale;if(a.add)pos[axis]+=get_value(a.add?.[dir]||a.add,axis,len)*len;if(a.min!=null)pos[axis]=Math.max(pos[axis],get_value(a.min?.[dir]||a.min,axis,len)*len);if(a.max!=null)pos[axis]=Math.min(pos[axis],get_value(a.max?.[dir]||a.max,axis,len)*len)}if(p.rotation)pos.applyEuler(MMD_SA.TEMP_v3.copy(p.rotation).multiplyScalar(Math.PI/180));if(p.camera_weight&&name.indexOf("腕")==-1)pos.applyQuaternion(MMD_SA.TEMP_q.set(0,0,0,1).slerp(frames._rot_camera,p.camera_weight));const pp=p.position_to_rotation;if(pp){const bones=mesh.bones_by_name;const pos_rot=v3c.set(Math.atan2(pos.z,pos.y),0,-Math.atan2(pos.x,pos.z));const rot_motion={upper:{q:q1},lower:{q:q2}};for(const part of["upper","lower"]){const bone_name=d+(part=="upper"?"足":"ひざ");const bone=bones[bone_name];rot_motion[part].name=bone_name;rot_motion[part].q.copy(bone.quaternion);bone.quaternion.set(0,0,0,1);if(!pp[part])continue;const rot=v3d.set(0,0,0);for(const axis of["x","y","z"]){const a=pp[part][axis];if(!a)continue;let angle=0;const rot_formula=a.rot_formula?.[dir]||a.rot_formula;if(rot_formula?.length==1){angle=pos_rot[rot_formula]*180/Math.PI}if(a.add)angle+=a.add?.[dir]||a.add;if(a.scale!=null)angle*=typeof a.scale?.[dir]=="number"&&a.scale[dir]||a.scale;if(a.curve){const ac=a.curve?.[dir]||a.curve;const v=(angle-ac.ini)/(ac.end-ac.ini);if(v>0&&v<1)angle=Math.pow(v,ac.pow_factor)*(ac.end-ac.ini)+ac.ini}if(a.min!=null)angle=Math.max(angle,a.min?.[dir]||a.min);if(a.max!=null)angle=Math.min(angle,a.max?.[dir]||a.max);rot[axis]=angle/180*Math.PI}bone.quaternion.setFromEuler(rot,"XZY");if(part=="upper")rot_upper_leg=bone.quaternion.clone()}const leg0=MMD_SA.get_bone_position(mesh,d+"足","全ての親");const pos0=MMD_SA.get_bone_position(mesh,d+"足首","全ての親");const x_dir=camera.x_flipped?-1:1;const hip_pmx=v3c.fromArray(bones[d+"足"].pmxBone.origin);const hip_offset=hip_pmx.sub(leg0).negate();const IK_pos=leg0.sub(pos0);IK_pos.x*=x_dir;IK_pos.y*=-1;IK_pos.z*=-1;IK_pos.add(MMD_SA_options.model_para_obj.leg_IK_offset[d]);IK_pos.add(hip_offset);IK_pos.y-=MMD_SA_options.model_para_obj.left_leg_IK[1]+(bones["センター"].position.y-bones["センター"].pmxBone.origin[1]);pos.copy(IK_pos);for(const part in rot_motion)bones[rot_motion[part].name].quaternion.copy(rot_motion[part].q)}}else{if(transform_default)transform_default(pos)}p?.magnet?.forEach(m=>{const hand=m.hand_affected[dir];if(!hand)return;if(!frames.skin[name]?.[0]._hand_visible)return;const modelX=MMD_SA.THREEX.get_model(0);let reference_point=MMD_SA._v3a.set(0,0,0);let pos_local;let rot_local=MMD_SA._q1.set(0,0,0,1);let x_object;if(m.type=="object3D"){const object3d=MMD_SA.THREEX._XR_Animator_scene_?.object3D_list.find(obj=>obj.id==m.id);if(!object3d)return;x_object=MMD_SA.THREEX._object3d_list_.find(obj=>obj.uuid==object3d._object3d_uuid);reference_point.copy(m.reference_point).multiply(x_object._mesh.scale);rot_local=MMD_SA._q1.copy(mesh.quaternion).conjugate().multiply(x_object._mesh.quaternion);reference_point.applyQuaternion(rot_local);pos_local=MMD_SA._v3b.copy(x_object._mesh.position).sub(mesh.position).applyQuaternion(MMD_SA.TEMP_q.copy(mesh.quaternion).conjugate());reference_point.add(pos_local)}else if(m.type=="bone"){const name_MMD=MMD_SA.THREEX.VRM.bone_map_VRM_to_MMD[m.name];reference_point=modelX.get_bone_position_by_MMD_name(name_MMD,true);if(m.offset){rot_local=modelX.get_bone_rotation_by_MMD_name(name_MMD,true);reference_point.add(MMD_SA._v3a.copy(m.offset).applyQuaternion(rot_local))}}else{reference_point.copy(m.position)}const bone_pos_local=modelX.get_bone_position_by_MMD_name(name.substring(0,2),true);reference_point.sub(bone_pos_local);let arm_scale=1;if(MMD_SA.THREEX.enabled){arm_scale=MMD_SA_options.model_para_obj.left_arm_length/modelX.para.left_arm_length;reference_point.multiplyScalar(arm_scale)}let pos_offset=MMD_SA._v3a_.set(0,0,0);if(hand.offset){if(hand.offset=="parent_bone"){pb=MMD_SA.THREEX._object3d_list_.find(obj=>obj.parent_bone?.name==d+"手首"&&!obj.parent_bone.disabled)?.parent_bone;if(pb)pos_offset.set(pb.position.x,pb.position.y,-pb.position.z)}else{pos_offset.copy(hand.offset);if(!modelX.is_T_pose)pos_offset.applyQuaternion(MMD_SA_options.model_para_obj.rot_arm_adjust[d+"腕"].axis_rot)}pos_offset.applyQuaternion(modelX.get_bone_rotation_by_MMD_name(d+"手首",true))}pos.add(pos_offset);let ratio=0;let peak;if(m.magnet_type=="line"){const line=MMD_SA.THREEX.l1;line.start.copy(reference_point);if(m.line_end){line.end.copy(m.line_end).multiply(x_object._mesh.scale).applyQuaternion(rot_local);line.end.add(pos_local)}else{line.end.copy(pos_local||MMD_SA.TEMP_v3.set(0,0,0))}line.end.sub(bone_pos_local).multiplyScalar(arm_scale);if(m.line_offset){const offset=MMD_SA.TEMP_v3.copy(m.line_offset).multiply(x_object._mesh.scale).applyQuaternion(rot_local).multiplyScalar(arm_scale);line.start.add(offset);line.end.add(offset)}line.closestPointToPoint(pos,true,reference_point);let dis=pos.distanceTo(reference_point);if(dislen_unit*len_limit)len=len_unit*len_limit}else{if(len{var armIK_data_filter;window.addEventListener("jThree_ready",()=>{armIK_data_filter=new System._browser.data_filter([{type:"one_euro",id:"armIK",para:[30,1,1/5,1,3]}])});return function(mesh,name){if(_poseNet.IK_disabled_check(name))return;var bone=mesh.bones_by_name[name];var s=this.skin[name];var ratio=Math.max(Math.min(s[0].t_delta/s[0].t_delta_frame,1),0);var d=name.charAt(0);var pos=v3a.copy(s[1].pos).lerp(s[0].pos,ratio);const motion_para=MMD_SA.MMD.motionManager.para_SA;const dir=d=="左"?"left":"right";const t=motion_para?.motion_tracking?.arm_tracking?.transformation;if(t){const p=t.position;transform_position(d+"腕IK",pos,p);let root_rotation=t.root_rotation?.[dir];if(root_rotation){const root_bone=d+"腕";const rot=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.set(root_rotation.x,root_rotation.y,root_rotation.z).multiplyScalar(Math.PI/180),root_rotation.order);let r=rot_arm_adjust[root_bone];rot.premultiply(r.axis_rot).multiply(r.axis_rot_inv);mesh.bones_by_name[root_bone].quaternion.premultiply(rot)}}if(s[0].data_filter||s[1].data_filter){pos.fromArray(armIK_data_filter.filter(pos.toArray()))}const body_rot=MMD_SA.get_bone_rotation_parent(mesh,name,mesh);if(!s[0]._IK_absolute){pos.applyQuaternion(this.offset_upper_body_camera_rotation(q1.copy(body_rot).conjugate(),motion_para?.motion_tracking?.arm_tracking?.transformation?.position?.camera_weight||1))}const _arm_IK_adjust=_poseNet._arm_IK_adjust?.[d];if(_arm_IK_adjust){const len=MMD_SA_options.model_para_obj.left_arm_length;const axis=["x","y","z"];if(_arm_IK_adjust.min){if(typeof _arm_IK_adjust.min=="number"){}else{for(const a of axis){if(_arm_IK_adjust.min[a]){if(pos[a]<_arm_IK_adjust.min[a]*len)pos[a]=_arm_IK_adjust.min[a]*len}}}}if(_arm_IK_adjust.scale){if(typeof _arm_IK_adjust.scale=="number"){}else{for(const a of axis){if(_arm_IK_adjust.scale[a]){pos.multiplyScalar(_arm_IK_adjust.scale[a])}}}}}var arm_pmx=v3b.fromArray(mesh.bones_by_name[d+"腕"].pmxBone.origin).sub(v3c.fromArray(bone.parent.pmxBone.origin));var arm_offset=MMD_SA.get_bone_position(mesh,d+"腕",bone.parent.name).sub(arm_pmx);pos.add(arm_offset);const a=this.arm_IK_constraint[d];if(a.enabled){arm0=MMD_SA.get_bone_position(mesh,d+"腕",mesh);const IK_pos=v3b.copy(pos).applyQuaternion(body_rot).add(a.arm_pos);const target=v3c.copy(a.target).sub(IK_pos);if(!a.target_radius||target.length()>a.target_radius){const IK_offset=IK_pos.sub(a.target).add(target.normalize().multiplyScalar(a.target_radius));pos.sub(IK_offset.applyQuaternion(body_rot.conjugate()))}}pos.add(MMD_SA_options.model_para_obj.arm_IK_offset[d]);bone.position.copy(pos)}})();var process_arm_as_leg=function(){let hand_rot_filter={};let finger_x_filter={};window.addEventListener("jThree_ready",()=>{hand_rot_filter["左"]=new System._browser.data_filter([{type:"one_euro",para:[30,1,1,1,4]}]);hand_rot_filter["右"]=new System._browser.data_filter([{type:"one_euro",para:[30,1,1,1,4]}]);finger_x_filter["左"]=[];finger_x_filter["右"]=[];for(let i=0;i<5;i++){finger_x_filter["左"][i]=new System._browser.data_filter([{type:"one_euro",para:[30,1,1,1,1]}]);finger_x_filter["右"][i]=new System._browser.data_filter([{type:"one_euro",para:[30,1,1,1,1]}])}});return function(mesh,name){var model=THREE.MMD.getModels()[mesh._model_index];var bone=mesh.bones_by_name[name];var d=name.charAt(0);var rot=bone.quaternion;const s=this.skin[name];const ratio=Math.max(Math.min(s[0].t_delta/s[0].t_delta_frame,1),0);rot.copy(s[1].rot).slerp(s[0].rot,ratio);rot.fromArray(hand_rot_filter[d].filter(rot.toArray()));const euler_order="YXZ";const rot_euler=MMD_SA.TEMP_v3.setEulerFromQuaternion(rot,euler_order);const rot_para=MMD_SA.MMD.motionManager.para_SA.motion_tracking.arm_as_leg.transformation?.rotation||{};let rot_y=Math.sign(rot_euler.y)*Math.min(Math.abs(rot_euler.y*(rot_para.y?.scale||1)),Math.PI/2);const rot_y_ratio=rot_para.y?.foot_ratio||.25;rot_euler.y=rot_y*rot_y_ratio;rot_euler.z=Math.sign(rot_euler.z)*Math.min(Math.abs(rot_euler.z*(rot_para.z?.scale||.5)),Math.PI/3);rot_euler.x*=rot_para.x?.scale||.5;let finger_x=[];let foot_x=0;let _finger_x;if(s[0]._finger_x){if(s[1]._finger_x){_finger_x=s[0]._finger_x.map((f,i)=>f*ratio+s[1]._finger_x[i]*(1-ratio))}else{_finger_x=s[0]._finger_x}}if(_finger_x){for(let i=0;i<5;i++)finger_x[i]=finger_x_filter[d][i].filter(_finger_x[i]);finger_x[0]=(finger_x[0]+finger_x[1])/2;finger_x.forEach(x=>{foot_x+=x});foot_x/=5;rot_euler.x-=foot_x}rot_euler.x=Math.sign(rot_euler.x)*Math.min(Math.abs(rot_euler.x),Math.PI/2);rot.setFromEuler(rot_euler,euler_order);this._rot_=rot.clone();this._rot_y=rot_y;const blend_ratio=this.get_blend_default_motion("skin",d+"足IK",true);if(blend_ratio)rot_y*=1-blend_ratio;const b_leg=MMD_SA.get_bone_position(mesh,d+"足",mesh);const rot_leg_parent=MMD_SA.get_bone_rotation_parent(mesh,d+"足",mesh).conjugate();const axis=MMD_SA.get_bone_position(mesh,name,mesh).sub(b_leg).negate().normalize().applyQuaternion(rot_leg_parent);const rot_adjust=MMD_SA.TEMP_q.setFromAxisAngle(axis,rot_y*(1-rot_y_ratio));if(0&&mesh.bones_by_name[d+"足D"]){mesh.bones_by_name[d+"足"].quaternion.premultiply(rot_adjust);mesh.bones_by_name[d+"足D"].quaternion.premultiply(rot_adjust)}else{model._update_IK_and_AddTrans(false,d+"足","下半身",true);if(this.skin[d+"足"]&&this.skin[d+"足"][0]._rot_){mesh.bones_by_name[d+"足"].quaternion.copy(this.skin[d+"足"][0]._rot_)}else{const axis_upper_leg=MMD_SA.get_bone_position(mesh,d+"ひざ",mesh).sub(b_leg).negate().normalize().applyQuaternion(rot_leg_parent);const rot_upper_leg=q1.setFromUnitVectors(v3a.set(0,1,0),axis);mesh.bones_by_name[d+"足"].quaternion.copy(rot_upper_leg).multiply(q2.setFromEuler(v3a.set(-axis_upper_leg.angleTo(axis),0,0)))}mesh.bones_by_name[d+"足"].quaternion.premultiply(rot_adjust);model._update_IK_and_AddTrans(false,d+"足","下半身")}if(foot_x&&mesh.bones_by_name[d+"足先EX"]){const name=d+"足人指";const b=!MMD_SA.MMD.motionManager.para_SA.motion_tracking.arm_as_leg.toes_disabled&&(mesh.bones_by_name[name]||mesh.bones_by_name[name+nj_list[1]]);if(!b){let x=0;for(let i=1;i<4;i++){x+=finger_x[i]}x/=4;const z=(finger_x[1]-x)/2;mesh.bones_by_name[d+"足先EX"].quaternion.setFromEuler(v3a.set(-foot_x*.5,0,z),"XZY")}else{mesh.bones_by_name[d+"足先EX"].quaternion.setFromEuler(v3a.set(-foot_x*.5,0,0))}model._update_IK_and_AddTrans(false,d+"足先EX")}if(_finger_x){finger_list.forEach((f,i)=>{const name=d+"足"+f+"指";const b=mesh.bones_by_name[name]||mesh.bones_by_name[name+nj_list[1]];if(b)b.quaternion.multiply(q1.setFromEuler(v3a.set(-finger_x[i]*.5,0,0)))})}}}();var process_hand=function(){let hand_rot_filter={};window.addEventListener("jThree_ready",()=>{for(const d of["左","右"]){hand_rot_filter[d]=new System._browser.data_filter([{type:"one_euro",id:"hand_rot_filter",para:[30,1,1,1,4]}])}});return function(mesh,name){var model=THREE.MMD.getModels()[mesh._model_index];var is_T_pose=MMD_SA.THREEX.get_model(mesh._model_index).is_T_pose;var bone=mesh.bones_by_name[name];var d=name.charAt(0);var rot_axis,rot,fixedAxis,angle;var _bone=mesh.bones_by_name[d+"手捩"];var _rot;var s=this.skin[name];var ratio=Math.max(Math.min(s[0].t_delta/s[0].t_delta_frame,1),0);const motion_para=MMD_SA.motion[model.skin._motion_index].para_SA;rot=q1.set(0,0,0,1);if(_bone){if(_bone.quaternion.x||_bone.quaternion.y||_bone.quaternion.z){_bone.quaternion.conjugate();model._update_IK_and_AddTrans(false,d+"手捩")}_bone.quaternion.set(0,0,0,1)}const sign_LR=d=="左"?1:-1;var rot_parent=s[0].rot_parent;if(!rot_parent){rot_parent=MMD_SA.get_bone_rotation(mesh,"上半身2",null,mesh);rot_parent.premultiply(q2.copy(this._rot_body_offset).multiply(this._rot_camera).conjugate());rot_parent.multiply(MMD_SA.get_bone_rotation_parent(mesh,d+"手首","上半身2")).conjugate()}s[0]._rot_parent=rot_parent;const rot_hand=s[0].no_blending?q3.copy(s[0].rot):q3.copy(s[1].rot).slerp(s[0].rot,ratio);if(s[0]._rot_pose&&s[0]._rot_pose_ratio){let _ratio=s[0]._rot_pose_ratio;if(s[0]._rot_pose_ratio_by_angle_difference){let a=MMD_SA.TEMP_q.copy(rot_hand).conjugate().multiply(s[0]._rot_pose).toAxisAngle()[1]%(Math.PI*2);if(a>Math.PI){a-=Math.PI*2}else if(a<-Math.PI){a+=Math.PI*2}const f=Math.pow(1-Math.abs(a)/Math.PI,1-s[0]._rot_pose_ratio_by_angle_difference);_ratio*=f}if(s[0]._rot_pose_constrained){const e_rot_hand=v3a.setEulerFromQuaternion(rot_hand,"YXZ");const e_rot_pose=v3b.setEulerFromQuaternion(s[0]._rot_pose,"YXZ");let y_diff=Math.abs(e_rot_hand.y-e_rot_pose.y);if(y_diff>Math.PI)y_diff=Math.PI*2-y_diff;if(y_diff>Math.PI*2/3&&Math.abs(e_rot_hand.x)e_rot_pose.y?Math.PI*2:0)-e_rot_hand.y:-(e_rot_hand.y+(e_rot_hand.yMath.PI/4){const weight=arm_z{torso_rot_filter=new System._browser.data_filter([{type:"one_euro",id:"torso_rot",para:[30,.5,1,1,3]}]);chest_rot_filter=new System._browser.data_filter([{type:"one_euro",id:"chest_rot",para:[30,.5,1,1,3]}]);shoulder_rot_z_filter=new System._browser.data_filter([{type:"one_euro",id:"shoulder_rot_z_filter",para:[30,1,1,1,1]}]);hand_depth_weight_filter=new System._browser.data_filter([{type:"one_euro",id:"hand_depth_weight",para:[30,.5,.1,1,1]}]);for(const d of["左","右"]){arm_IK_filter[d]=new System._browser.data_filter([{type:"one_euro",id:"arm_IK"+d,para:[30,.5,1/2,1,3]}]);arm_rot_filter[d]=new System._browser.data_filter([{type:"one_euro",id:"arm_IK"+d,para:[30,.5,1/2,1,4]}]);hand_depth_filter[d]=new System._browser.data_filter([{type:"one_euro",id:"hand_depth"+d,para:[30,.5,.1,1,1]}]);rot_pose_ratio_filter[d]=new System._browser.data_filter([{type:"one_euro",id:"rot_pose_ratio"+d,para:[30,.5,.1,1,1]}])}});return function(e){var data=typeof e.data=="string"&&e.data.charAt(0)==="{"?JSON.parse(e.data):e.data;if(typeof data==="string"){if(data=="OK"){_poseNet.worker_initialized=true}else{DEBUG_show(data,2);System._browser.console.log(data)}}else if(_poseNet.enabled){window.dispatchEvent(new CustomEvent("SA_camera_poseNet_update"));camera._needs_RAF=true;_poseNet._bb=null;const warmed_up_status=ML_warmed_up_status[_poseNet.use_holistic?1:0];let on_warmed_up;if(_poseNet.enabled&&!warmed_up_status.poseNet){on_warmed_up=true;warmed_up_status.poseNet=true}if(_handpose.enabled&&!warmed_up_status.handpose){on_warmed_up=true;warmed_up_status.handpose=true}if(on_warmed_up)DEBUG_show("Pose ML ready",2);_info_extra=(_facemesh.enabled?"\n":"")+camera.video_canvas.width+"x"+camera.video_canvas.height+"("+_poseNet.camera_video_frame_id+")\n";let t_now=camera.video_timestamp;let _t=0;if(fps_timestamp){_t=Math.max(Math.min(t_now-fps_timestamp,1e3),10);fps_ms+=_t;if(++fps_count>=20){fps=1e3/(fps_ms/fps_count);fps_count=fps_ms=0}}fps_timestamp=t_now;_poseNet._t=data._t;frames.t_delta=((frames.t_delta||_t)+_t)/2;if(data.handpose){_t=0;if(fps_timestamp_hands){_t=Math.max(Math.min(t_now-fps_timestamp_hands,1e3),10);fps_ms_hands+=_t;if(++fps_count_hands>=20){fps_hands=1e3/(fps_ms_hands/fps_count_hands);fps_count_hands=fps_ms_hands=0}}fps_timestamp_hands=t_now;_poseNet._t_hands=data._t_hands;frames.t_delta_hands=((frames.t_delta_hands||_t)+_t)/2}if(_poseNet.use_holistic){warmed_up_status.facemesh=true;if(!data.facemesh){_facemesh.data_detected=0}}let arms=[];let hands=[];let sign_flip=camera.x_flipped?1:-1;let upper_body_only_mode;const model=THREE.MMD.getModels()[0];const bones_by_name=model.mesh.bones_by_name;const is_T_pose=MMD_SA.THREEX.get_model(0).is_T_pose;const motion_para=MMD_SA.MMD.motionManager.para_SA;const _arm_as_leg=motion_para.motion_tracking&&motion_para.motion_tracking.arm_as_leg;const arm_as_leg={"左":_arm_as_leg&&_arm_as_leg.enabled&&(!_arm_as_leg.linked_side||_arm_as_leg.linked_side=="left"),"右":_arm_as_leg&&_arm_as_leg.enabled&&(!_arm_as_leg.linked_side||_arm_as_leg.linked_side=="right")};let tilt_adjustment;let _q_tilt_angle,_tilt_angle;let pose;if(_poseNet.enabled){if(data.posenet&&data.posenet.score>.3){_poseNet.data_detected++;_poseNet.initial_data_detected=true;if(_poseNet.data_detected_stable){if(_no_pose_data){_no_pose_data=false;model.mesh.visible=true}tilt_adjustment=motion_para.motion_tracking?.camera?.tilt_adjustment||camera.tilt_adjustment;if(tilt_adjustment.enabled){_tilt_angle=tilt_adjustment.angle*tilt_adjustment.pose_weight*Math.PI/180;_q_tilt_angle=(new THREE.Quaternion).set(Math.sin(_tilt_angle/2),0,0,Math.cos(_tilt_angle/2))}pose=data.posenet;let use_3D_pose=_poseNet.use_3D_pose;if(use_blazepose){pose._keypoints=pose.keypoints;pose._keypoints3D=pose.keypoints3D;let _keypoints=[];let _keypoints3D=[];blazepose_translated.forEach((i,idx)=>{let kp=pose.keypoints[i];kp.part=posenet_part_name[idx];_keypoints.push(kp);kp=pose.keypoints3D[i];kp.part=posenet_part_name[idx];_keypoints3D.push(kp)});pose.keypoints=_keypoints;pose.keypoints3D=_keypoints3D}const score_threshold=use_movenet?.3:!use_human_pose?.5:.1;pose.keypoints.forEach(p=>{p.score-=score_threshold});if(use_3D_pose){pose._keypoints3D.forEach(p=>{p.score-=score_threshold})}if(use_human_pose){let _keypoints_map={};pose.keypoints.forEach(kp=>{_keypoints_map[kp.part]=kp});let _keypoints=[];for(let i=0;i<=16;i++){let kp=pose.keypoints[i];if(!kp)_keypoints.push(posenet_part_dummy[i]);else if(kp.part!=posenet_part_name[i])_keypoints.push(_keypoints_map[posenet_part_name[i]]||posenet_part_dummy[i]);else _keypoints.push(kp)}pose.keypoints=_keypoints}let kp_bb=pose._keypoints||pose.keypoints;let kp_x=kp_bb.map(p=>p.position.x);let kp_y=kp_bb.map(p=>p.position.y);const bb_body=[Math.min(...kp_y),Math.max(...kp_x),Math.max(...kp_y),Math.min(...kp_x)];kp_bb=pose.keypoints.slice(0,5);kp_x=kp_bb.map(p=>p.position.x);kp_y=kp_bb.map(p=>p.position.y);const bb_head=[Math.min(...kp_y),Math.max(...kp_x),Math.max(...kp_y),Math.min(...kp_x)];const dim_head=Math.max(bb_head[1]-bb_head[3],bb_head[2]-bb_head[0])/2;bb_body[0]=Math.min(bb_body[0],bb_head[0]-dim_head);bb_body[1]=Math.max(bb_body[1],bb_head[1]+dim_head);bb_body[2]=Math.max(bb_body[2],bb_head[2]-dim_head);bb_body[3]=Math.min(bb_body[3],bb_head[3]-dim_head);_poseNet._bb=bb_body;if(!_facemesh.head_pose_enabled){_facemesh.bb_center[0]=pose.keypoints[0].position.x/camera.video_canvas.width;_facemesh.bb_center[1]=pose.keypoints[0].position.y/camera.video_canvas.height}if(use_3D_pose){let _nose=pose._keypoints[0].position;let _eyeL=pose._keypoints[3].position;let _eyeR=pose._keypoints[6].position;const a=v3a.copy(_eyeR);const m=v3b.copy(_eyeL);m.sub(a);const p=MMD_SA._v3a_.copy(_nose);const t=(p.x*m.x+p.y*m.y+p.z*m.z-(a.x*m.x+a.y*m.y+a.z*m.z))/m.lengthSq();const q=MMD_SA._v3b.set(a.x+m.x*t,a.y+m.y*t,a.z+m.z*t);let y_axis=p.sub(q).normalize();let x_axis=MMD_SA._v3b_.copy(_eyeL).sub(MMD_SA._v3b.copy(_eyeR));x_axis.normalize();let z_axis=MMD_SA.TEMP_v3.crossVectors(x_axis,y_axis).normalize();x_axis.crossVectors(y_axis,z_axis);rot_m4.set(x_axis.x,x_axis.y,x_axis.z,0,y_axis.x,y_axis.y,y_axis.z,0,z_axis.x,z_axis.y,z_axis.z,0,0,0,0,1);q_m4.setFromBasis(rot_m4);let rot=q_m4.conjugate();rot=rot.clone().multiply(MMD_SA.TEMP_q.set(Math.sin(Math.PI/3.5/2),0,0,Math.cos(Math.PI/3.5/2)));_facemesh._neck.shoulder_center=v3b.copy(pose._keypoints[11].position).add(MMD_SA.TEMP_v3.copy(pose._keypoints[12].position)).multiplyScalar(.5).toArray();if(_q_tilt_angle)rot.premultiply(_q_tilt_angle);if(!_facemesh.head_pose_enabled){frames.add("skin","首",{after_IK:true,rot:rot,onProcessRotation:process_head_rotation});frames.skin["首"][1]._rot_mixed&&frames.skin["首"][1].rot.copy(frames.skin["首"][1]._rot_mixed)}frames.add("skin","首_DUMMY_",{rot:rot,_rot_from_pose:rot.clone(),onProcessRotation:process_head_rotation})}let armL=pose.keypoints[5];let armR=pose.keypoints[6];let rot_center=new THREE.Quaternion;upper_body_only_mode=motion_para.motion_tracking_upper_body_only;_info_extra+="\n"+(upper_body_only_mode?(motion_para.motion_tracking?.arm_as_leg?.enabled?"🦶":"🙋")+"upper body":"💃full body");const hand_camera=MMD_SA_options.Dungeon_options?.item_base.hand_camera;if(hand_camera&&hand_camera._hand_camera_side){_info_extra+="/"+(hand_camera.selfie_mode?"🤳selfie":"📷handcam")+(hand_camera._hand_camera_side=="左"?"-L":"-R")}_info_extra+="\n";if(use_3D_pose&&camera_depth_scale)camera_depth.prepare(pose);let hip_z=0,hip_x=0;if(_handpose.enabled&&data.handpose)_handpose.hand_visible_timestamp={};shoulder_z_angle[0]=shoulder_z_angle[1]=0;let body_rot_parent;if(armL.score>0&&armR.score>0){let armL3D,armR3D;let rot_torso,rot_chest;if(use_3D_pose){armL3D=pose.keypoints3D[5];armR3D=pose.keypoints3D[6];let hipL3D=pose.keypoints3D[11];let hipR3D=pose.keypoints3D[12];let rot_center_euler;if(upper_body_only_mode||hipL3D.score<=0||hipR3D.score<=0){upper_body_only_mode=true}else{if(pose.keypoints[11].position.y>camera.video_canvas.height||pose.keypoints[12].position.y>camera.video_canvas.height){upper_body_only_mode=true}let hip=MMD_SA._v3b.copy(hipL3D).sub(hipR3D).normalize();let x_axis=MMD_SA.TEMP_v3.set(1,0,0);rot_center_euler=v3c.setFromVectorSpherical(x_axis,hip);hip_z=rot_center_euler.z;if(1||upper_body_only_mode)rot_center_euler.z=0;rot_center.setFromEuler(rot_center_euler,"YZX")}let y_axis=MMD_SA.TEMP_v3.set(0,1,0);y_axis.y*=-1;let spine=MMD_SA._v3a.addVectors(armL3D,armR3D).multiplyScalar(.5);if(spine.z<0){spine.normalize();if(_poseNet.body_bend_reduction_power==1){spine.z=0}else{spine_yz=MMD_SA._v3b.set(0,spine.y,spine.z).normalize();spine.z*=Math.pow(-spine_yz.z,Math.pow(1.6,(_poseNet.body_bend_reduction_power||0)/.25))/-spine_yz.z}}spine.normalize();_facemesh.calculate_neck_data({is_pose:true,timestamp:_poseNet.camera_video_frame_id,shoulder_center:_facemesh._neck.shoulder_center,spine_rot_absolute:v3b.setFromVectorSpherical(y_axis,spine).toArray()});spine.applyQuaternion(MMD_SA.TEMP_q.copy(rot_center).conjugate());const rot_torso_euler=v3b.setFromVectorSpherical(y_axis,spine);if(motion_para.motion_tracking_upper_body_only){rot_torso_euler.fromArray(torso_rot_filter.filter(rot_torso_euler.toArray()));rot_torso=(new THREE.Quaternion).setFromEuler(rot_torso_euler,"XZY")}else{if(upper_body_only_mode){if(rot_center_euler){rot_torso_euler.add(rot_center_euler)}rot_center.set(0,0,0,1);rot_torso_euler.fromArray(torso_rot_filter.filter(rot_torso_euler.toArray()));rot_torso=(new THREE.Quaternion).setFromEuler(rot_torso_euler,"YXZ")}else{rot_torso=(new THREE.Quaternion).setFromEuler(rot_torso_euler,"XZY")}}hip_x=rot_torso_euler.x;let shoulder=MMD_SA._v3b.copy(armL3D).sub(armR3D).normalize();shoulder.applyQuaternion(MMD_SA.TEMP_q.multiplyQuaternions(rot_center,rot_torso).conjugate());x_axis=MMD_SA.TEMP_v3.set(1,0,0);let rot_chest_euler=v3b.setFromVectorSpherical(x_axis,shoulder);let sf=_poseNet.shoulder_tracking?.5:0;let sz=shoulder_rot_z_filter.filter(rot_chest_euler.z*(MMD_SA_options.user_camera.ML_models.pose.model_quality=="Best"?3:5))*sf;let _sf=Math.min(Math.PI/12/Math.abs(sz),1);sz*=_sf;if(upper_body_only_mode){rot_chest_euler.fromArray(chest_rot_filter.filter(rot_chest_euler.toArray()))}shoulder_z_angle[0]=sz;shoulder_z_angle[1]=sz;rot_chest_euler.z*=1-sf;rot_chest=(new THREE.Quaternion).setFromEuler(rot_chest_euler,"YZX");let y_angle_torso=0;let y_angle_chest=rot_chest_euler.y;let y_angle=(y_angle_torso+y_angle_chest)%(Math.PI*2);if(y_angle>Math.PI)y_angle=Math.PI*2-y_angle;else if(y_angle<0&&y_angle<-Math.PI)y_angle+=Math.PI*2;rot_torso.multiply(q1.set(0,Math.sin((y_angle/2-y_angle_torso)/2),0,Math.cos((y_angle/2-y_angle_torso)/2)));rot_chest.multiply(q1.set(0,Math.sin((y_angle/2-y_angle_chest)/2),0,Math.cos((y_angle/2-y_angle_chest)/2)));frames.add("skin","センター",{rot:rot_center.clone(),priority:9});if(motion_recorder.active){if(!frames.skin["センター"][0].pos&&frames.skin["センター"][1].pos)frames.skin["センター"][0].pos=frames.skin["センター"][1].pos}const _rot_torso=rot_torso.clone();if(_q_tilt_angle){const _q=q1.copy(_q_tilt_angle);const _pose=motion_para.motion_tracking?.ML_models?.pose||MMD_SA_options.user_camera.ML_models.pose;if(_pose.upper_rotation_offset){const y=-(_pose.upper_rotation_offset-y_angle)*2/3*Math.PI/180;const aa=_q_tilt_angle.toAxisAngle();_q.setFromAxisAngle(aa[0].applyQuaternion(MMD_SA.TEMP_q.set(0,Math.sin(y/2),0,Math.cos(y/2))),aa[1])}q1.premultiply(MMD_SA.TEMP_q.copy(rot_center).conjugate()).multiply(rot_center);_rot_torso.premultiply(_q)}frames.add("skin","上半身",{rot:_rot_torso});frames.add("skin","上半身2",{rot:rot_chest.clone()});body_rot_parent=q1.copy(rot_center).multiply(rot_torso).multiply(rot_chest);body_rot_parent.conjugate()}const shoulder_width_scale=MMD_SA.TEMP_v3.set(1,1,1/3);_poseNet.shoulder_width=v3a.copy(armL.position).multiply(shoulder_width_scale).distanceTo(v3b.copy(armR.position).multiply(shoulder_width_scale));let shoulder_width=Math.sqrt(Math.pow(armL.position.x-armR.position.x,2)+Math.pow(armL.position.y-armR.position.y,2));let a_shoulder=0;if(!use_3D_pose){a_shoulder=Math.asin((armL.position.y-armR.position.y)/shoulder_width);a_shoulder=Math.max(Math.min(a_shoulder/(Math.PI/4),1),-1)*Math.PI/4*sign_flip}let LR=sign_flip==1?[1,0]:[0,1];shoulder_width=_facemesh.face_width*2||shoulder_width;_poseNet._upper_body_only_mode=upper_body_only_mode;const arm_z_angle=[0,0];const q_shoulder=[];LR.forEach(function(dir,idx){let x,y,z;let z_posenet;let d=idx==0?"左":"右";let arm=pose.keypoints[5+dir];let elbow=pose.keypoints[7+dir];let hand=pose.keypoints[9+dir];let IK_disabled=(motion_para.motion_tracking?.arm_tracking?.use_IK!=null?!motion_para.motion_tracking.arm_tracking.use_IK:MMD_SA_options.user_camera.ML_models.pose.use_armIK==null?!upper_body_only_mode&&MMD_SA_options.Dungeon_options?.item_base.hand_camera?._hand_camera_side!=d:!MMD_SA_options.user_camera.ML_models.pose.use_armIK)&&!arm_as_leg[d];let IK_absolute=false;let hand_visible=hand.score>0&&hand.position.x>=0&&hand.position.x<=camera.video_canvas.width&&hand.position.y>=0&&hand.position.y<=camera.video_canvas.height;if(motion_para.motion_tracking_upper_body_only&&!hand_visible){IK_disabled=false}q_shoulder[idx]=new THREE.Quaternion;if(is_T_pose)q_shoulder[idx].fromArray(MMD_SA.THREEX.utils.convert_A_pose_rotation_to_T_pose(d+"肩",q_shoulder[idx].toArray()));let arm3D,elbow3D,hand3D;if(use_3D_pose){arm3D=pose.keypoints3D[5+dir];elbow3D=pose.keypoints3D[7+dir];hand3D=pose.keypoints3D[9+dir]}let x_dir=sign_flip*(dir==0?-1:1);if(use_3D_pose&&hand.score>0&&_handpose.enabled&&_handpose.stabilize_hand_percent&&_poseNet.shoulder_width){const w=camera.video_canvas.width;const h=camera.video_canvas.height;const hand_last=_handpose._hand_last[d];let _hand;if(data.handpose&&data.handpose.length){const handpose=data.handpose.find(h=>h.label==(d=="左"?"Left":"Right"));if(handpose){_hand=hand_last.hand=handpose.annotations.palm[0];hand_last.timestamp=RAF_timestamp;hand_last.w=w;hand_last.h=h}}if(!_hand){_hand=hand_last.hand}const time_limit=1e3*(_handpose.stabilize_hand_percent/100)*(upper_body_only_mode||!IK_disabled?1:.5);let time_diff=RAF_timestamp-hand_last.timestamp;if(_hand&&hand_last.w==w&&hand_last.h==h&&time_diff0){v_arm_upper=MMD_SA._v3b.copy(arm3D).sub(elbow3D).normalize().applyQuaternion(body_rot_parent);axis=MMD_SA.TEMP_v3.set(x_dir,0,0);rot_arm_upper=(new THREE.Quaternion).setFromUnitVectors(axis,v_arm_upper);arm_z_angle[idx]=v3b.setFromVectorSpherical(axis,v_arm_upper).z}let arm_IK_f=arm_IK_filter[d].filters[0].filter;if(hand.score>0){let handpose_worker;if(upper_body_only_mode&&_handpose.enabled&&_handpose.use_hands_worker&&!data.handpose){if(_handpose.hand_visible_timestamp[d]+200>RAF_timestamp)hand_visible=handpose_worker=true}let handpose,palm_offset;if(_handpose.enabled&&data.handpose){handpose=data.handpose.find(h=>h.label==(d=="左"?"Left":"Right"));if(handpose){hand_visible=true}}if(handpose){_handpose.hand_visible_timestamp[d]=RAF_timestamp;if(!upper_body_only_mode)_handpose.hand_visible_session[d]=RAF_timestamp}if(_handpose.enabled&&upper_body_only_mode){let adjust_filter;let reset_hand;let hand_visible_session=_handpose.hand_visible_session[d]||0;if(handpose||handpose_worker){if(hand_visible_session<1e3){_handpose.hand_visible_session[d]=1e3;if(!_handpose.stabilize_arm_time){adjust_filter=true}else{reset_hand=true}}else if(hand_visible_session<1200){_handpose.hand_visible_session[d]+=_poseNet._t_hands;if(_handpose.hand_visible_session[d]>1e3+_handpose.stabilize_arm_time){adjust_filter=true}else{reset_hand=true}}else{_handpose.hand_visible_session[d]=RAF_timestamp}}else{_handpose.hand_visible_timestamp[d]=0;let fade_out=!hand_visible;if(hand_visible&&hand_visible_session<1e3+_handpose.stabilize_arm_time){if(hand_visible_session>=1e3)hand_visible_session=_handpose.hand_visible_session[d]=201;fade_out=true;reset_hand=true}if(fade_out){adjust_filter=hand_visible;if(!hand_visible_session){_handpose.hand_visible_session[d]=0;reset_hand=true}else if(hand_visible_session>200){_handpose.hand_visible_session[d]=200}else{_handpose.hand_visible_session[d]-=_poseNet._t_hands;if(_handpose.hand_visible_session[d]<0)_handpose.hand_visible_session[d]=0}}}if(adjust_filter){arm_IK_f.beta=1/10;arm_IK_f=null}if((motion_para.motion_tracking?.hand_tracking?.stabilize_arm_disabled?0:_handpose.stabilize_arm)>(motion_para.motion_tracking_upper_body_only?0:1)){if(reset_hand){hand_visible=false;handpose=null;hand.score=0;if(frames.skin[d+"手首"]?.[0].rot.w!=1){const q0=new THREE.Quaternion;frames.add("skin",d+"ひじ",{absolute:true,no_blending:true,rot:q0});frames.add("skin",d+"手首",{after_IK:true,absolute:true,no_blending:true,rot:q0});frames.add("skin",d+"手捩",{after_IK:true,absolute:true,no_blending:true,rot:q0})}}}}hands.push({pos:hand.position,dir:dir,d:d,visible:hand_visible,handpose:handpose,palm_offset:palm_offset})}else{_handpose.hand_visible_session[d]=0}let data_filter_weight=0;const data_filter=motion_para.motion_tracking?.arm_tracking?.data_filter?.[d=="左"?"left":"right"];if(data_filter){data_filter_weight=1;if(data_filter.weight_by_magnet){const magnet=motion_para.motion_tracking.arm_tracking?.transformation?.position?.magnet?.find(m=>m.magnet_id==data_filter.weight_by_magnet.id);data_filter_weight=magnet&&magnet._frame_count_>=EV_sync_update.count_frame-1-(_handpose.use_hands_worker?6:0)?magnet._weight_:0}}if(arm_IK_f){arm_IK_f.beta=.5*(1-data_filter_weight)+(data_filter?.beta||.5)*data_filter_weight}if(hand.score>0){if(use_3D_pose){let rot_arm_lower;if(elbow.score>0){let v_arm_lower=v3a.copy(elbow3D).sub(hand3D).normalize().applyQuaternion(body_rot_parent).applyQuaternion(MMD_SA.TEMP_q.copy(rot_arm_upper).conjugate());axis=MMD_SA.TEMP_v3.set(x_dir,0,0);rot_arm_lower=(new THREE.Quaternion).setFromUnitVectors(axis,v_arm_lower)}if(!IK_disabled||elbow.score<=0){IK_disabled=false;let v_arm=MMD_SA._v3a.copy(arm3D).sub(hand3D);if(_q_tilt_angle)v_arm.applyQuaternion(_q_tilt_angle);let arm_length=elbow.score>0?MMD_SA.TEMP_v3.copy(arm3D).distanceTo(elbow3D)+MMD_SA.TEMP_v3.copy(elbow3D).distanceTo(hand3D):.5;let v_arm_length=Math.min(v_arm.length()/arm_length,1);v_arm.normalize().multiplyScalar(v_arm_length*MMD_SA_options.model_para_obj.left_arm_length);x=v_arm.x;y=v_arm.y;z=z_posenet=v_arm.z;if(rot_arm_upper){let rot_hand_parent;if(arm_as_leg[d]){rot_hand_parent=body_rot_parent.clone().conjugate().multiply(rot_arm_upper).multiply(rot_arm_lower).conjugate()}rotate_arm(rot_arm_upper,d+"腕");if(upper_body_only_mode)rot_arm_upper.fromArray(arm_rot_filter[d].filter(rot_arm_upper.toArray()));frames.add("skin",d+"腕",{absolute:true,rot:rot_arm_upper,_rot_hand_parent:rot_hand_parent,onFinish:process_arm_from_shoulder});if(rot_arm_lower){rotate_arm(rot_arm_lower,d+"ひじ");frames.add("skin",d+"ひじ",{absolute:true,rot:rot_arm_lower})}}}else{rotate_arm(rot_arm_lower,d+"ひじ");rotate_arm(rot_arm_upper,d+"腕");frames.add("skin",d+"腕",{absolute:true,rot:rot_arm_upper,priority:-1,onFinish:process_arm});frames.add("skin",d+"ひじ",{absolute:true,rot:rot_arm_lower})}}else{IK_absolute=true;let x_diff=arm.position.x-hand.position.x;let y_diff=arm.position.y-hand.position.y;x=x_diff/shoulder_width*MMD_SA_options.model_para_obj.shoulder_width*sign_flip;y=y_diff/shoulder_width*MMD_SA_options.model_para_obj.shoulder_width;if(elbow.score>0){let arm_upper_length=Math.min(Math.sqrt(Math.pow(hand.position.x-elbow.position.x,2)+Math.pow(hand.position.y-elbow.position.y,2))/shoulder_width,1);let arm_lower_length=Math.min(Math.sqrt(Math.pow(arm.position.x-elbow.position.x,2)+Math.pow(arm.position.y-elbow.position.y,2))/shoulder_width,1);z_posenet=(.25+(Math.sin(Math.acos(arm_upper_length))+Math.sin(Math.acos(arm_lower_length)))/2*.75)*MMD_SA_options.model_para_obj.left_arm_length}}}else{if(arm_as_leg[d]){frames.add("skin",d+"手首",{rot:new THREE.Quaternion});frames.remove("skin",d+"足首")}if(elbow.score>0){if(use_3D_pose){if(!IK_disabled){IK_disabled=false;v_arm_upper=MMD_SA._v3a.copy(arm3D).sub(elbow3D).normalize();v_arm_upper.multiplyScalar(MMD_SA_options.model_para_obj.left_arm_length);x=v_arm_upper.x*sign_flip;y=v_arm_upper.y;z=z_posenet=v_arm_upper.z}else{IK_disabled=true;rotate_arm(rot_arm_upper,d+"腕");frames.add("skin",d+"腕",{absolute:true,rot:rot_arm_upper,priority:-1,onFinish:process_arm})}}else{IK_disabled=false;IK_absolute=true;let x_diff=arm.position.x-elbow.position.x;let y_diff=arm.position.y-elbow.position.y;let dis=Math.sqrt(x_diff*x_diff+y_diff*y_diff);let a=Math.asin(x_diff/dis);x=Math.sin(a)*MMD_SA_options.model_para_obj.left_arm_length*sign_flip;y=Math.cos(a)*MMD_SA_options.model_para_obj.left_arm_length*Math.sign(y_diff)}}else{if(use_3D_pose){if(!motion_para.motion_tracking_upper_body_only)return;z=z_posenet=0}else{IK_absolute=true}if(x==null){IK_disabled=false;x=MMD_SA_options.model_para_obj.left_arm_to_IK_xy[1]*(d=="左"?1:-1)*.2;y=-Math.sqrt(MMD_SA_options.model_para_obj.left_arm_length*MMD_SA_options.model_para_obj.left_arm_length-x*x)}}}if(!IK_disabled&&(motion_para.motion_tracking?.arm_tracking?.use_IK||upper_body_only_mode)&&!data_filter?.disabled){let arm_IK_f=arm_IK_filter[d].filters[0].filter;arm_IK_f.minCutOff=.5*(1-data_filter_weight)+(data_filter?.minCutOff||.5)*data_filter_weight;const xyz=arm_IK_filter[d].filter([x,y,z]);x=xyz[0];y=xyz[1];z=xyz[2]}arms.push({pos:{x:x,y:y,z:z,z_posenet:z_posenet},dir:dir,d:d,IK_disabled:IK_disabled,IK_absolute:IK_absolute})});arm_z_angle[0]=arm_z_angle[0]==null?0:Math.max(arm_z_angle[0]+Math.PI/2,0);arm_z_angle[1]=arm_z_angle[1]==null?0:Math.max(Math.PI/2-arm_z_angle[1],0);const idx_to_adjust=arm_z_angle[0]>arm_z_angle[1]?1:0;const scale_to_adjust=Math.min(Math.abs(arm_z_angle[0]-arm_z_angle[1])/(Math.PI/2),1);arm_z_angle[idx_to_adjust==0?1:0]=1;arm_z_angle[idx_to_adjust]=1-scale_to_adjust*scale_to_adjust*.5;LR.forEach(function(dir,idx){let d=idx==0?"左":"右";if(q_shoulder[idx]){shoulder_z_angle[idx]*=arm_z_angle[idx];let _rot_shrug=shoulder_z_angle[2]*(idx==0?1:-1);let a=shoulder_z_angle[idx]+_rot_shrug;const a_limit=Math.PI/6;if(Math.abs(a)>a_limit){_rot_shrug=Math.sign(_rot_shrug)*(a_limit-Math.abs(shoulder_z_angle[idx]));a=shoulder_z_angle[idx]+_rot_shrug}a=shoulder_rot_filter[d].filter(a);q_shoulder[idx].multiply(MMD_SA.TEMP_q.set(0,0,Math.sin(a/2),Math.cos(a/2)));frames.add("skin",d+"肩",{priority:-2,absolute:!(motion_para.motion_tracking_upper_body_only&&motion_para.motion_tracking?.motion_default_weight?.shoulder),rot:q_shoulder[idx],_rot_z:shoulder_z_angle[idx],_rot_shrug:_rot_shrug,_rot_total:a,onFinish:shoulder_adjust})}})}else{upper_body_only_mode=true}if(use_3D_pose&&!upper_body_only_mode){const _hip_z=hip_z;if(_q_tilt_angle){rot_center.premultiply(MMD_SA.TEMP_q.copy(_q_tilt_angle).conjugate());hip_z=_hip_z-MMD_SA.TEMP_v3.setEulerFromQuaternion(rot_center,"YZX").z}camera_depth.get_hip_center(pose);let LR=sign_flip==1?[1,0]:[0,1];let legs=[];let feet=[];let hip_angle=0;let leg_offset=[];LR.forEach(function(dir,idx){let d=idx==0?"左":"右";let hip=pose.keypoints3D[11+dir];let knee=pose.keypoints3D[13+dir];let ankle=pose.keypoints3D[15+dir];let v_leg,v_leg_length,leg_length;if(ankle.score>0){v_leg=MMD_SA._v3a.copy(hip).sub(ankle);v_leg_length=v_leg.length();leg_length=knee.score>0?MMD_SA.TEMP_v3.copy(hip).distanceTo(knee)+MMD_SA.TEMP_v3.copy(knee).distanceTo(ankle):.7;v_leg.normalize().multiplyScalar(Math.min(v_leg_length/leg_length,1)*MMD_SA_options.model_para_obj.left_leg_length)}if(_poseNet.leg_scale_adjustment&&ankle.score>0){let leg_scale=1;let pq_scale=1;let leg_scale2,pq_scale2,over_limit;let pq_length,hip_to_knee,hip_to_q;const a=v3c.copy(hip);const m=v3d.copy(ankle).sub(a);let q,pq;if(knee.score>0){const p=v3b.copy(knee);const t=(p.x*m.x+p.y*m.y+p.z*m.z-(a.x*m.x+a.y*m.y+a.z*m.z))/m.lengthSq();q=v3a.set(a.x+m.x*t,a.y+m.y*t,a.z+m.z*t);pq=p.sub(q);hip_to_knee=v3c.copy(hip).sub(knee).length();hip_to_q=v3c.copy(hip).sub(q).length();pq_length=pq.length()}else{hip_to_knee=leg_length/2;hip_to_q=Math.min(m.length()/2,hip_to_knee);pq_length=Math.sqrt(hip_to_knee*hip_to_knee-hip_to_q*hip_to_q)}const pq_ratio=pq_length/leg_length;const w=camera.video_canvas.width;const h=camera.video_canvas.height;const v3_screen=MMD_SA.TEMP_v3;const v_hip=camera_depth.v_hip;const hip2D=pose.keypoints[11+dir];const ankle2D=pose.keypoints[15+dir];const leg_length_ref=MMD_SA_options.model_para_obj.left_leg_length;const ar=w/h;const ar_3D=SL.width/SL.height;const w_ar=ar0){pq_scale=Math.sqrt((hip_to_knee*hip_to_knee-leg_scale*leg_scale*hip_to_q*hip_to_q)/(pq_length*pq_length))||0;if(pq_scale){}else{pq_scale2=0;over_limit=true;leg_scale2=hip_to_knee/hip_to_q}if(pq_scale2!=null){_info_extra+="\n"+d+":"+leg_scale2+"(x"+pq_scale2+")"+(over_limit?"<>":"")+"\n";leg_scale=leg_scale2;pq_scale=pq_scale2}else _info_extra+="\n"+d+":"+leg_scale+"(x"+pq_scale+")\n";if(leg_scale!=1){const ankle_offset=v3c.copy(hip).add(m.multiplyScalar(leg_scale)).sub(ankle);for(const index of[27,29,31]){const p=pose._keypoints3D[index+dir];Object.assign(p,MMD_SA.TEMP_v3.copy(p).add(ankle_offset))}ankle=pose.keypoints3D[15+dir];const knee2=q.sub(hip).multiplyScalar(leg_scale).add(hip).add(pq.multiplyScalar(pq_scale));knee=pose.keypoints3D[13+dir]=Object.assign(knee,knee2);v_leg.multiplyScalar(leg_scale)}}else{v_leg.multiplyScalar(leg_scale);_info_extra+="\n"+d+"(IK):"+leg_scale+"(x"+pq_scale+")\n"}}let rot_leg_upper,rot_leg_upper_euler;let v_leg_upper;if(knee.score>0){v_leg_upper=MMD_SA._v3b.copy(hip).sub(knee).normalize().applyQuaternion(MMD_SA.TEMP_q.copy(rot_center).conjugate());let y_axis=MMD_SA.TEMP_v3.set(0,1,0);y_axis.y*=-1;rot_leg_upper_euler=v3b.setFromVectorSpherical(y_axis,v_leg_upper);rot_leg_upper=(new THREE.Quaternion).setFromEuler(rot_leg_upper_euler,"XZY");const a=v3a.setFromVectorSpherical(y_axis,MMD_SA._v3b.copy(hip).sub(knee).normalize().applyQuaternion(MMD_SA.TEMP_q.copy(rot_center).multiply(MMD_SA._q2.set(0,0,Math.sin(_hip_z/2),Math.cos(_hip_z/2))).multiply(MMD_SA._q1.set(Math.sin(hip_x/2),0,0,Math.cos(hip_x/2))).conjugate()));hip_angle+=a.x}let IK_disabled=!MMD_SA_options.user_camera.ML_models.pose.use_legIK;if(ankle.score>0){let v_leg_lower_,v_leg_lower;if(knee.score>0){v_leg_lower_=v3a.copy(knee).sub(ankle).normalize().applyQuaternion(MMD_SA.TEMP_q.copy(rot_center).conjugate());v_leg_lower=v3c.copy(v_leg_lower_).applyQuaternion(MMD_SA.TEMP_q.copy(rot_leg_upper).conjugate());v_leg_lower.z=Math.max(-v_leg_lower.z,0);v_leg_lower.x*=-1;let sc=v_leg_lower.normalize().toSphericalCoords();let rot_y_ratio=Math.sqrt(Math.min((Math.PI-sc[2])/(Math.PI/2),1));rot_leg_upper_euler.y=sc[1]*rot_y_ratio;rot_leg_upper.setFromEuler(rot_leg_upper_euler,"XZY")}if(!IK_disabled||knee.score<=0){_poseNet.enable_IK(d+"足IK",true);legs.push({pos:v_leg.clone(),rot:[rot_leg_upper],dir:dir,d:d})}else{v_leg_lower=v3c.copy(v_leg_lower_).applyQuaternion(MMD_SA.TEMP_q.copy(rot_leg_upper).conjugate());let y_axis=MMD_SA.TEMP_v3.set(0,1,0);y_axis.y*=-1;let rot_leg_lower=(new THREE.Quaternion).setFromVectorSpherical(y_axis,v_leg_lower);_poseNet.enable_IK(d+"足IK",false);legs.push({rot:[rot_leg_upper,rot_leg_lower],dir:dir,d:d})}const heel=pose._keypoints3D[29+dir];const foot=pose._keypoints3D[31+dir];if(heel.score>0&&foot.score>0){let y_axis=MMD_SA._v3a_.copy(heel).sub(ankle).normalize();let z_axis=MMD_SA._v3b_.copy(heel).sub(foot).normalize();let x_axis=v3a.crossVectors(y_axis,z_axis).normalize();y_axis.crossVectors(z_axis,x_axis);rot_m4.set(x_axis.x,x_axis.y,x_axis.z,0,y_axis.x,y_axis.y,y_axis.z,0,z_axis.x,z_axis.y,z_axis.z,0,0,0,0,1);q_m4.setFromBasis(rot_m4);let rot=q_m4.conjugate();const foot_angle_x=-Math.PI/(MMD_SA_options.user_camera.ML_models.pose.model_quality=="Best"?10:8);rot=rot.clone().multiply(MMD_SA.TEMP_q.set(Math.sin(foot_angle_x/2),0,0,Math.cos(foot_angle_x/2)));if(_q_tilt_angle)rot.premultiply(_q_tilt_angle);const _rot_center=q1.copy(rot_center);if(_q_tilt_angle)_rot_center.premultiply(_q_tilt_angle);const rot_center_YZX=MMD_SA.TEMP_v3.setEulerFromQuaternion(_rot_center,"YZX");const rot_center_y=Math.abs(rot_center_YZX.y)%Math.PI;let ratio=rot_center_y>Math.PI/2?1-(rot_center_y-Math.PI/2)/(Math.PI/2):1;if(MMD_SA_options.user_camera.ML_models.pose.use_legIK){const rot_IK=rot.clone();if(ratio<1){rot_center_YZX.x=rot_center_YZX.z=0;rot_IK.slerp(q2.setFromEuler(rot_center_YZX,"YZX"),1-ratio)}legs[legs.length-1].rot[2]=rot_IK}frames.add("skin",d+"足首",{after_IK:true,absolute:true,parent_based:true,motion_recorder_disabled:MMD_SA_options.user_camera.ML_models.pose.use_legIK,rot:rot,ratio:ratio,ratio_euler:MMD_SA_options.user_camera.ML_models.pose.model_quality=="Best"?{x:1,y:1,z:.5,order:"YXZ"}:null})}}else{if(knee.score>0){if(!IK_disabled){v_leg=MMD_SA._v3a.copy(hip).sub(knee).normalize().multiplyScalar(MMD_SA_options.model_para_obj.left_leg_length);if(_q_tilt_angle)v_leg.applyQuaternion(_q_tilt_angle);_poseNet.enable_IK(d+"足IK",true);legs.push({pos:v_leg.clone(),rot:[rot_leg_upper],dir:dir,d:d})}else{_poseNet.enable_IK(d+"足IK",false);legs.push({rot:[rot_leg_upper],dir:dir,d:d})}}if(frames.skin[d+"足首"]?.[0].rot.w!=1)frames.add("skin",d+"足首",{after_IK:true,absolute:true,no_blending:true,rot:new THREE.Quaternion})}});let leg_offset_y=0;leg_offset.forEach(offset=>{const y=offset.y*(1-offset.scale);if(y>0){leg_offset_y=Math.max(y,leg_offset_y)}else if(leg_offset.length>1){leg_offset_y=Math.max(y,leg_offset_y||y)}});if(leg_offset_y){camera_depth.v_hip.y+=leg_offset_y;_info_extra+="\nleg_offset_y:"+leg_offset_y+"\n"}hip_angle*=.5*.5;hip_angle+=hip_x;let rot_hip=(new THREE.Quaternion).setFromEuler(MMD_SA.TEMP_v3.set(hip_angle,0,hip_z),"YZX");frames.add("skin","下半身",{absolute:true,rot:rot_hip.clone()});if(!upper_body_only_mode){frames.add("skin","全ての親",{pos:new THREE.Vector3,after_IK:true,priority:999,onProcessPosition:adjust_hip_center})}rot_hip.conjugate();legs.forEach(leg=>{var d=leg.d;if(leg.rot[0]){leg.rot[0].multiplyQuaternions(rot_hip,leg.rot[0]);frames.add("skin",d+"足",{absolute:true,rot:leg.rot[0]})}if(leg.pos){leg.pos.add(MMD_SA_options.model_para_obj.leg_IK_offset[d]);const rot=leg.rot[2]||frames.skin[d+"足IK"]&&frames.skin[d+"足IK"][0].rot;frames.add("skin",d+"足IK",{absolute:true,pos:leg.pos,rot:rot,priority:999,onFinish:adjust_leg_IK})}else{if(leg.rot[1]){frames.add("skin",d+"ひざ",{absolute:true,rot:leg.rot[1]})}else if(frames.skin[d+"ひざ"]?.[0].rot.w!=1){frames.add("skin",d+"ひざ",{absolute:true,no_blending:true,rot:new THREE.Quaternion})}}})}else{if(motion_para.motion_tracking_upper_body_only){frames.add("skin","全ての親",{is_dummy:true,pos:true,after_IK:true,priority:999})}else if(use_3D_pose&&armL.score>0&&armR.score>0&&camera.video_canvas.width){camera_depth.get_hip_center(pose);frames.add("skin","全ての親",{pos:new THREE.Vector3,after_IK:true,priority:999,onProcessPosition:adjust_hip_center})}if(!arm_as_leg["左"]||!arm_as_leg["右"])frames.add("skin","下半身",{is_dummy:true,rot:true});for(const d of["左","右"]){if(!arm_as_leg[d]){frames.add("skin",d+"足IK",{is_dummy:true,pos:true,priority:999});frames.add("skin",d+"足",{is_dummy:true,rot:true});frames.add("skin",d+"ひざ",{is_dummy:true,rot:true});frames.add("skin",d+"足首",{is_dummy:true,after_IK:true,rot:true})}}}}}else{_poseNet.data_detected=0}}if(_poseNet.enabled&&!_poseNet.data_detected_stable&&!_no_pose_data){_no_pose_data=true;if(!motion_para.motion_tracking_upper_body_only&&_poseNet.initial_data_detected)model.mesh.visible=false}let hand_data;let hand_info=[];const request_hand_pose_rot=!_handpose.enabled&&pose&&_poseNet.use_3D_pose;const _LR=sign_flip==1?[1,0]:[0,1];const _rot_pose={};const _rot_pose_ratio_=_handpose.enabled&&_poseNet.shoulder_width?Math.min(Math.max(Math.max(camera.video_canvas.width,camera.video_canvas.height)/_poseNet.shoulder_width-5,0)/5,1)*.5:0;const _rot_pose_ratio={"左":_rot_pose_ratio_,"右":_rot_pose_ratio_};if(request_hand_pose_rot||!motion_para.motion_tracking_upper_body_only&&_rot_pose_ratio_){_LR.forEach(function(dir,idx){let d=idx==0?"左":"右";if(!hands.find(h=>h.d==d)?.visible)return;let wrist=pose._keypoints3D[15+dir];let pinky=pose._keypoints3D[17+dir];let index=pose._keypoints3D[19+dir];if(wrist.score<=0||pinky.score<=0||index.score<=0)return;let LR=dir==1?[index,pinky]:[pinky,index];let y_axis=MMD_SA._v3a_.copy(wrist).sub(MMD_SA._v3b.copy(pinky).add(index).multiplyScalar(.5)).normalize();y_axis.x=y_axis.x*sign_flip;let x_axis=MMD_SA._v3b_.copy(LR[0]).sub(LR[1]).normalize();x_axis.z=x_axis.z*sign_flip;x_axis.y=x_axis.y*sign_flip;let z_axis=MMD_SA.TEMP_v3.crossVectors(x_axis,y_axis).normalize();x_axis.crossVectors(y_axis,z_axis);rot_m4.set(x_axis.x,x_axis.y,x_axis.z,0,y_axis.x,y_axis.y,y_axis.z,0,z_axis.x,z_axis.y,z_axis.z,0,0,0,0,1);q_m4.setFromBasis(rot_m4);let rot=new THREE.Quaternion;rot.copy(q_m4).conjugate();if(_q_tilt_angle)rot.premultiply(_q_tilt_angle);_rot_pose[d]=rot})}if(_handpose.enabled&&data.handpose&&data.handpose.length&&hands.length){const z_scale=use_mediapipe?1:2;data.handpose.forEach(handpose=>{handpose._offset={};hand_data=handpose.annotations;if(z_scale>1){for(let name in hand_data){hand_data[name].forEach(xyz=>{xyz[2]*=z_scale})}}});hands.forEach((hand,hand_idx)=>{var hand_dir=hand.dir;let handpose=hand.handpose;if(handpose&&hand.visible){hand.visible=true;handpose._used=true;let d=hand.d;handpose._d=d;hand_data=handpose.annotations;let arm=arms.find(arm=>arm.dir==hand_dir);const palm_scale=v3d.set(1,1,handpose.z_adjust_ratio||1);let hand_depth_weight=motion_para.motion_tracking?.hand_tracking?.depth_adjustment_disabled?0:MMD_SA_options.user_camera.ML_models.hands.depth_adjustment_percent/100;if(hand_depth_weight&&upper_body_only_mode&&arm.pos.z>0&&MMD_SA_options.Dungeon_options?.item_base.hand_camera?._hand_camera_side!=d){const palm_size=(MMD_SA._v3a.fromArray(hand_data.palm[0]).multiply(palm_scale).distanceTo(MMD_SA._v3b.fromArray(hand_data.middle[0]).multiply(palm_scale))+MMD_SA._v3a.fromArray(hand_data.index[0]).multiply(palm_scale).distanceTo(MMD_SA._v3b.fromArray(hand_data.pinky[0]).multiply(palm_scale)))/2/_poseNet.shoulder_width;const palm_shoulder_scale=MMD_SA_options.user_camera.ML_models.hands.palm_shoulder_scale_percent/100;const shoulder_scale=Math.max(camera.video_canvas.width,camera.video_canvas.height)/_poseNet.shoulder_width;hand_depth_weight_filter.filter(Math.max(3-Math.max(shoulder_scale-5,0),0)/3);palm_far_scale=(1.8+(1-Math.min(Math.max(shoulder_scale-4,0),1))*.4)*((1-MMD_SA_options.user_camera.ML_models.hands.depth_scale_percent/100)*2);hand_depth_filter[d].filter(Math.min(Math.max(palm_size-palm_shoulder_scale,0)/Math.max(palm_shoulder_scale*palm_far_scale-palm_shoulder_scale,.1),1))}if(handpose.worldLandmarks){hand_data=handpose.worldLandmarks.annotations;palm_scale.set(1,1,1)}hand_info.push(d+"手");let LR=hand_dir==1?[hand_data.index[0],hand_data.ring[0]]:[hand_data.ring[0],hand_data.index[0]];let x_rot,y_rot,z_rot;let y_axis=MMD_SA._v3a_.fromArray(hand_data.palm[0]).multiply(palm_scale).sub(MMD_SA._v3b.fromArray(hand_data.middle[0]).multiply(palm_scale)).normalize();y_axis.x=y_axis.x*sign_flip;let x_axis=MMD_SA._v3b_.fromArray(LR[0]).multiply(palm_scale).sub(MMD_SA._v3b.fromArray(LR[1]).multiply(palm_scale)).normalize();x_axis.z=x_axis.z*sign_flip;x_axis.y=x_axis.y*sign_flip;let z_axis=MMD_SA.TEMP_v3.crossVectors(x_axis,y_axis).normalize();x_axis.crossVectors(y_axis,z_axis);rot_m4.set(x_axis.x,x_axis.y,x_axis.z,0,y_axis.x,y_axis.y,y_axis.z,0,z_axis.x,z_axis.y,z_axis.z,0,0,0,0,1);q_m4.setFromBasis(rot_m4);let rot=new THREE.Quaternion;rot.copy(q_m4).conjugate();if(tilt_adjustment.enabled){const tilt_angle=tilt_adjustment.angle*Math.PI/180;const q_tilt=MMD_SA._q2.set(Math.sin(tilt_angle/2),0,0,Math.cos(tilt_angle/2));rot.premultiply(q_tilt)}frames.add("skin",d+"手首",{after_IK:true,rot:rot,onProcessRotation:process_hand});frames.add("skin",d+"手捩",{after_IK:true,absolute:true,priority:1,no_blending:true,rot:new THREE.Quaternion});const hand_ry=MMD_SA.TEMP_v3.setEulerFromQuaternion(rot,"YXZ").y;const hand_facing_sign=1;const hand_facing=(Math.abs(hand_ry){let f_obj=f_base[(sign_flip==1?d:d=="左"?"右":"左")+f_idx];let f_base_index=f_obj.base_index+(f_idx==0?0:-1);let finger=hand_data[finger_list_en[f_idx]];let rot_parent=q2.copy(hand_rot_inv);const euler_order="XZY";if(hand_facing&&f_idx>0){const ref_length=Math.max(MMD_SA._v3a.fromArray(finger[2]).sub(MMD_SA._v3b.fromArray(finger[1])).length()*1.2,MMD_SA._v3a.fromArray(hand_data.palm[0]).sub(MMD_SA._v3b.fromArray(finger[0])).length()*(hand_facing==1?.2:.3));const f1=MMD_SA._v3a.fromArray(finger[1]).sub(MMD_SA._v3b.fromArray(finger[0]));if(ref_length/f1.length()>1){const z_mod=-hand_facing*Math.sqrt(ref_length*ref_length-(f1.x*f1.x+f1.y*f1.y))-f1.z;for(let i=1;i<3;i++)finger[i][2]+=z_mod}}const name_base=d+f+"指"+nj_list[f_obj.base_index];const f_base_active_index=f_idx==0?1:0;for(let idx=f_base_index;idx<3;idx++){let name=d+f+"指"+nj_list[f_obj.base_index+(idx-f_base_index)];let f0=MMD_SA._v3a.fromArray(finger[idx+0]);let f1=MMD_SA._v3b.fromArray(finger[idx+1]);let _f=MMD_SA.TEMP_v3.fromArray(idx==f_base_index?hand_data.palm[0]:finger[idx-1]);f0.y=-f0.y;f1.y=-f1.y;_f.y=-_f.y;let v0=MMD_SA._v3a_.copy(f0).sub(_f);let v1=MMD_SA._v3b_.copy(f1).sub(f0);v0.normalize();v1.normalize();let angle,axis;let rot_v3;v0.applyQuaternion(rot_parent);v1.applyQuaternion(rot_parent);if(idx==f_base_index){let rot_to_y=MMD_SA.TEMP_q.set(0,0,0,1);rot_to_y.setFromVectorSpherical(MMD_SA.TEMP_v3.set(0,1,0),v0).conjugate();v1.applyQuaternion(rot_to_y);rot_parent.multiplyQuaternions(rot_to_y,rot_parent)}let rot=MMD_SA._q1.set(0,0,0,1);let rot_mirror=MMD_SA._q2.set(0,0,0,1);v0.set(0,1,0);rot_v3=v3b.setFromVectorSpherical(v0,v1);rot.setFromEuler(rot_v3,euler_order);rot_mirror.copy(rot);if(Math.abs(rot_v3.z)>Math.PI/(f_idx==0?1.1:2.5)||rot_v3.x>Math.PI/(f_idx==0?1.1:3)){rot_v3.set(-Math.abs(v0.angleTo(v1)),0,0)}if(f_idx==0&&idx>f_base_index+1){rot_v3.x=0}else if(rot_v3.x>0){rot_v3.x*=f_idx==0?0:idx>f_base_index?0:.75}else{rot_v3.x=Math.max(rot_v3.x,-Math.PI/(f_idx==0?1.25:2))}if(f_idx==0||idx==f_base_index){rot_v3.z+=(f_idx-2)/2*Math.PI/8*sign_LR*(f_idx>0?1:.5);rot_v3.z*=f_idx>0?Math.min(Math.max(Math.PI/2-Math.abs(rot_v3.x),0)/(Math.PI/2.5),1):1}else{rot_v3.z=0}if(hand_back_ratio&&f_idx>0&&idx==f_base_index){const f1=MMD_SA._v3a.fromArray(finger[idx+1]);f1.y*=-1;f1.applyQuaternion(hand_rot_inv);const f2=MMD_SA._v3b.fromArray(finger[idx+3]);f2.y*=-1;f2.applyQuaternion(hand_rot_inv);if(f1.y>f2.y){rot_v3.x-=Math.abs(rot_v3.z)*hand_back_ratio;rot_v3.z*=1-hand_back_ratio}}rot_v3.y=0;if(f_idx==0&&idx==f_base_active_index)rot_v3.multiplyScalar(1.5);if(f_idx==0)rot_parent.multiplyQuaternions(rot.conjugate(),rot_parent);rot.setFromEuler(rot_v3,euler_order);if(f_idx>0){rot_parent.multiplyQuaternions(rot.conjugate(),rot_parent);rot.conjugate()}let name_adjust=name;let aa=rot.toAxisAngle();axis=aa[0];angle=aa[1];axis.z*=-1;const f_thumb=!MMD_SA.THREEX.enabled&&f_idx==0?Math.min((Math.PI/8-rot_arm_adjust[name_base]._axis_rot_offset_inv_z*sign_LR)/(Math.PI/8),1.5):1;if(!MMD_SA.THREEX.enabled&&f_idx==0)axis.applyEuler(MMD_SA.TEMP_v3.set(0,Math.PI/4*sign_LR*f_thumb,0));axis.applyEuler(v3a.set(MMD_SA.THREEX.enabled?Math.PI/2:0,-Math.PI/2*sign_LR,0),"YXZ");if(MMD_SA.THREEX.enabled){rot.setFromAxisAngle(axis,angle)}else{axis.applyQuaternion(rot_arm_adjust[name_adjust].axis_rot);rot.setFromAxisAngle(axis,angle)}if(idx==f_base_active_index)rot.premultiply(MMD_SA.TEMP_q.set(0,0,0,1).slerp(rot_arm_adjust[name_base].axis_rot_offset_inv,f_idx==0?.5*f_thumb:1));if(arm_as_leg[d]){if(idx==f_base_index){const hand=frames.skin[d+"手首"][0];if(!hand._finger_x)hand._finger_x=[];hand._finger_x[f_idx]=rot_v3.x}}else{frames.add("skin",name,{absolute:true,rot:rot.clone()})}}})}else{const d=hand.d;if(motion_para.motion_tracking_upper_body_only&&(!motion_para.motion_tracking?.hand_tracking?.stabilize_arm_disabled&&_handpose.stabilize_arm)&&frames.get_blend_default_motion("skin",d+(arm_as_leg[d]?"足首":"手首"))!=0){hand.visible=false}}})}else if(request_hand_pose_rot){_LR.forEach(function(dir,idx){let d=idx==0?"左":"右";if(_rot_pose[d]){frames.add("skin",d+"手首",{after_IK:true,rot:_rot_pose[d],onProcessRotation:process_hand});frames.add("skin",d+"手捩",{after_IK:true,absolute:true,priority:1,no_blending:true,rot:new THREE.Quaternion})}})}const _rot_pose_constrained={};const _rot_pose_ratio_by_angle_difference={};_LR.forEach(function(dir,idx){let d=idx==0?"左":"右";const rot_ref=motion_para.motion_tracking?.hand_tracking?.rotation_reference?.[d=="左"?"left":"right"];if(rot_ref){let weight=rot_ref.weight||1;if(rot_ref.type=="object3D"){const object3d=MMD_SA.THREEX._XR_Animator_scene_.object3D_list.find(obj=>obj.id==rot_ref.name);if(!object3d)return;const x_object=MMD_SA.THREEX._object3d_list_.find(obj=>obj.uuid==object3d._object3d_uuid);if(x_object._rot_aligned_&&x_object.parent_bone.name==d+"手首"){if(x_object._rot_aligned_weight_!=null)weight=x_object._rot_aligned_weight_}_rot_pose_ratio_by_angle_difference[d]=rot_ref.weight_by_angle_difference;_rot_pose_constrained[d]=rot_ref.constrained_direction}if(rot_ref.weight_by_magnet){const magnet=motion_para.motion_tracking.arm_tracking?.transformation?.position?.magnet?.find(m=>m.magnet_id==rot_ref.weight_by_magnet.id);weight=magnet&&magnet._frame_count_>=EV_sync_update.count_frame-1-(_handpose.use_hands_worker?6:0)?magnet._weight_*(rot_ref.weight_by_magnet.max||weight):0}if(!hands.find(h=>h.d==d)?.handpose?._used){weight=1}weight=rot_pose_ratio_filter[d].filter(weight);_rot_pose_ratio[d]=weight;if(weight){if(!frames.skin[d+"手首"]){const rot=new THREE.Quaternion;frames.add("skin",d+"手首",{after_IK:true,rot:rot,onProcessRotation:process_hand});frames.add("skin",d+"手捩",{after_IK:true,absolute:true,priority:1,no_blending:true,rot:new THREE.Quaternion})}else if(frames.skin[d+"手首"][0].timestamp{nj_list.forEach(i=>{const f_name=d+f+"指"+i;const f_name_opposite=d_opposite+f+"指"+i;let rot_opposite=frames.skin[f_name_opposite]?.[0].rot;if(rot_opposite){rot_opposite=MMD_SA.TEMP_q.copy(rot_opposite);rot_opposite.y*=-1;rot_opposite.z*=-1;if(!frames.skin[f_name]){frames.add("skin",f_name,{absolute:true,rot:rot_opposite.clone()})}else{frames.skin[f_name][0].rot.slerp(rot_opposite,weight)}}})})}else if(rot_ref.fingers){for(const name in rot_ref.fingers){let[f_name,f_index]=name.split("|");f_name=f_name_map[f_name];f_index=nj_list[parseInt(f_index)+(f_name=="親"?-1:0)];f_name=d+f_name+"指"+f_index;const f=frames.skin[f_name];if(f&&f[0].timestamp==RAF_timestamp){const f_rot=rot_ref.fingers[name];let q=MMD_SA.TEMP_q;if(f_rot.w==null){q=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.copy(f_rot).multiplyScalar(Math.PI/180));f_rot.x=q.x;f_rot.y=q.y;f_rot.z=q.z;f_rot.w=q.w}else{q.copy(f_rot)}f[0].rot.slerp(q,weight)}}}}}}});for(const d of["左","右"]){const hand=frames.skin[d+"手首"];if(hand){hand[0]._rot_pose=_rot_pose[d];hand[0]._rot_pose_ratio=_rot_pose_ratio[d];hand[0]._rot_pose_constrained=_rot_pose_constrained[d];hand[0]._rot_pose_ratio_by_angle_difference=_rot_pose_ratio_by_angle_difference[d];if(!hand[0]._finger_x)hand[0]._finger_x=hand[1]._finger_x}}const arm_as_leg_process=[];arms.forEach(function(arm){var d=arm.d;let hand_depth_weight=motion_para.motion_tracking?.hand_tracking?.depth_adjustment_disabled?0:MMD_SA_options.user_camera.ML_models.hands.depth_adjustment_percent/100;if(hand_depth_weight&&_handpose.enabled&&upper_body_only_mode&&MMD_SA_options.Dungeon_options?.item_base.hand_camera?._hand_camera_side!=d){let hand_depth=hand_depth_filter[d].filter();let _time_delta=(RAF_timestamp-hand_depth_filter[d].timestamp)/1e3;let _weight=1-Math.min(Math.max(_time_delta-.2,0)/(1-.2),1);if(_weight){let _hand_depth_weight=hand_depth_weight_filter.filter();hand_depth_weight*=_weight*_hand_depth_weight;let hand_z=hand_depth*MMD_SA_options.model_para_obj.left_arm_length*hand_depth_weight+arm.pos.z*(1-hand_depth_weight);const hand_z_max=Math.sqrt(MMD_SA_options.model_para_obj.left_arm_length*MMD_SA_options.model_para_obj.left_arm_length-arm.pos.x*arm.pos.x-arm.pos.y*arm.pos.y);hand_z=Math.min(hand_z,hand_z_max);arm.pos.z=hand_z}}if(arm_as_leg[d]){if(arm.IK_disabled)return;_poseNet.enable_IK(d+"足IK",true);if(frames.skin[d+"手首"]&&frames.skin[d+"腕"]&&frames.skin[d+"手首"][0].timestamp==frames.skin[d+"腕"][0].timestamp){let rot_hand_parent;if(rot_hand_parent){}else{const axis_rot=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.set(Math.PI/2,0,0));const rot_foot=frames.skin[d+"手首"][0].rot.premultiply(axis_rot).multiply(axis_rot.conjugate());frames.add("skin",d+"足首",{after_IK:true,rot:rot_foot,_finger_x:frames.skin[d+"手首"][0]._finger_x,absolute:true,onFinish:process_arm_as_leg})}}else{const foot=frames.skin[d+"足首"];if(foot){foot[0].rot_parent=foot[0]._rot_parent}}frames.remove("skin",d+"手首");frames.remove("skin",d+"腕");frames.remove("skin",d+"ひじ");frames.remove("skin",d+"手捩");frames.remove("skin",d+"腕IK");if(_handpose.enabled){finger_list.forEach((f,i)=>{let ini=i==0?0:1;for(let n=ini;n{const pos_length_unit=MMD_SA_options.model_para_obj.left_leg_length;pos.y+=pos_length_unit*1/3;pos.z+=pos_length_unit*.25;pos.multiplyScalar(1.5)});arm_as_leg_process.push({d:d,pos:pos,rot:pos_and_rot[1]})}else{_poseNet.enable_IK(d+"腕IK",!arm.IK_disabled);if(!arm.IK_disabled){if(arm.pos.z==null)arm.pos.z=arm.pos.z_posenet||(_poseNet.use_3D_pose?0:MMD_SA_options.model_para_obj.left_arm_length*.2);const hand_visible=hands.find(h=>h.d==d)?.visible;const IK_pos=(new THREE.Vector3).copy(arm.pos);frames.add("skin",d+"腕IK",{priority:999,pos:IK_pos,_IK_absolute:arm.IK_absolute,_hand_visible:hand_visible,onProcessPosition:process_armIK})}const hand=frames.skin[d+"手首"];if(hand){hand[0].rot_parent=hand[0]._rot_parent}}});if(arm_as_leg_process.length&&_arm_as_leg.transformation?.position?.process)_arm_as_leg.transformation.position.process(arm_as_leg_process);arm_as_leg_process.forEach(leg=>{const d=leg.d;const pos=leg.pos;pos.y+=MMD_SA_options.model_para_obj.left_leg_IK[1]+(bones_by_name["センター"].position.y-bones_by_name["センター"].pmxBone.origin[1]);if(leg.rot){frames.add("skin",d+"足",{absolute:true,rot:leg.rot,onFinish:function(mesh,name){this.skin[name][0]._rot_=mesh.bones_by_name[name].quaternion.clone()}})}else{frames.remove("skin",d+"足")}frames.remove("skin",d+"ひざ");frames.add("skin",d+"足IK",{absolute:true,priority:999,pos:pos})});if(_no_pose_data){if(motion_para.motion_tracking_upper_body_only){for(const d of["左","右"]){_poseNet.enable_IK(d+"腕IK",motion_para.has_arm_IK)}}}else if(motion_para.motion_tracking_upper_body_only){for(const d of["左","右"]){const state=!hands.find(h=>h.d==d)?.visible;if(arm_as_leg[d]){frames.set_blend_default_motion("skin",d+"足IK",state);frames.set_blend_default_motion("skin",d+"足",state);frames.set_blend_default_motion("skin",d+"ひざ",state);frames.set_blend_default_motion("skin",d+"足首",state)}else{if(motion_para.has_leg_IK){frames.set_blend_default_motion("skin",d+"足IK",true);frames.remove("skin",d+"足首")}else{frames.set_blend_default_motion("skin",d+"足",true);frames.set_blend_default_motion("skin",d+"ひざ",true);frames.set_blend_default_motion("skin",d+"足首",true)}_poseNet.enable_IK(d+"足IK",motion_para.has_leg_IK);_poseNet.enable_IK(d+"つま先IK",motion_para.has_leg_IK);frames.set_blend_default_motion("skin",d+"肩",state);frames.set_blend_default_motion("skin",d+"腕",state);frames.set_blend_default_motion("skin",d+"ひじ",state);frames.set_blend_default_motion("skin",d+"手捩",state);frames.set_blend_default_motion("skin",d+"手首",state);frames.set_blend_default_motion("skin",d+"腕IK",state);if(_handpose.enabled){finger_list.forEach((f,i)=>{let ini=i==0?0:1;for(let n=ini;n{DEBUG_show((_poseNet.use_holistic&&"(no facemesh data)\n"||"")+(DEBUG_msg?"\n"+DEBUG_msg+"\n":"")+_info_extra+"\n"+"FPS:"+EV_sync_update.fps_last)},0,0)}if(data.facemesh){_facemesh.worker_onmessage({data:data.facemesh})}if(pose&&_facemesh.worker_initialized){let _data={posenet:pose,w:camera.video_canvas.width,h:camera.video_canvas.height,flip_canvas:camera.display_flipped};if(data.handpose&&data.handpose.length)_data.handpose=data.handpose;if(data.facemesh)_data.facemesh=data.facemesh.faces;if(_poseNet.use_holistic||!_facemesh.enabled){_data.draw_canvas=true;if(self.FacemeshAT){_data.canvas=camera.video_canvas_facemesh}else if(!camera.video_canvas_facemesh._offscreen&&self.OffscreenCanvas){_data.canvas=camera.video_canvas_facemesh.transferControlToOffscreen();camera.video_canvas_facemesh._offscreen=true;console.log("(Facemesh: use offscreen canvas)")}}fm_worker.postMessage(_data,_data.canvas?[_data.canvas]:undefined)}pose_busy=0}pose_update_frame()}}();function pose_update_frame(delay_update){async function update_worker(){var pose_ready=_poseNet.enabled&&_poseNet.worker_initialized&&camera_video_timestamp&&!_poseNet.busy&&video_capture_active&&_poseNet.camera_video_timestamp!=camera_video_timestamp;if(!pose_ready)return;pose_busy=RAF_timestamp;_poseNet.camera_video_timestamp=camera_video_timestamp;_poseNet.camera_video_frame_id=camera_video_frame_id;if(_poseNet.use_holistic&&_facemesh.blink_detection){MMD_SA_options.auto_blink=_facemesh.auto_blink||false}let video_canvas,w,h;video_canvas=camera.video_canvas;w=video_canvas.width;h=video_canvas.height;let rgba=self.PoseAT?video_canvas:use_imagebitmap?await createImageBitmap(video_canvas):video_canvas.getContext("2d").getImageData(0,0,w,h).data.buffer;_poseNet._timestamp=camera.video_timestamp;let data={rgba:rgba,w:w,h:h,options:{video_flipped:camera.video_flipped,use_canvas_hands:!MMD_SA.MMD.motionManager.para_SA.motion_tracking_upper_body_only&&!_poseNet.use_holistic,use_holistic:_poseNet.use_holistic,use_posenet:true,use_handpose:_handpose.enabled,use_hands_worker:_handpose.use_hands_worker,skip_hand_countdown_max:_poseNet.skip_hand_countdown_max,model_quality:MMD_SA_options.user_camera.ML_models.pose.model_quality||"",z_depth_scale:MMD_SA_options.user_camera.ML_models.pose.z_depth_scale,timestamp:_poseNet._timestamp}};Object.assign(data.options,MMD_SA.MMD.motionManager.para_SA.motion_tracking?.hand_tracking?.mocap_options);let data_to_transfer=[data.rgba];if(!_poseNet.canvas_hands){const c=_poseNet.canvas_hands=document.createElement("canvas");c.width=c.height=768;data.canvas_hands=c.transferControlToOffscreen();data_to_transfer.push(data.canvas_hands)}if(_handpose.use_hands_worker&&!_handpose.canvas_hands_worker){const c=_handpose.canvas_hands_worker=document.createElement("canvas");c.width=c.height=768;data.canvas_hands_worker=c.transferControlToOffscreen();data_to_transfer.push(data.canvas_hands_worker)}pose_worker.postMessage(data,data_to_transfer);data_to_transfer.length=0;data_to_transfer=undefined;data.rgba=rgba=undefined;data=undefined}if(delay_update||self.PoseAT){setTimeout(()=>{update_worker()},0)}else{update_worker()}}var frames_object=function(){const func_dummy=()=>{};var pos_dummy,rot_dummy;var _body_rot_updated={};var _IK_links={},_IK_links_result={},_IK_links_result_final={};var _arm_IK_constraint={};var hip_rot_filter,hip_mov_filter;window.addEventListener("jThree_ready",e=>{pos_dummy=new THREE.Vector3;rot_dummy=new THREE.Quaternion;for(const name of["センター","上半身","上半身2","首","頭"]){_body_rot_updated[name]=new THREE.Quaternion}for(const d of["左","右"]){_arm_IK_constraint[d]={target:new THREE.Vector3,arm_pos:new THREE.Vector3};_IK_links[d]={target:new THREE.Vector3,effector:new THREE.Quaternion,links:[]};_IK_links_result[d]={effector:new THREE.Quaternion,links:[]};_IK_links_result_final[d]={effector:new THREE.Quaternion,parent:new THREE.Quaternion,links:[]};for(let i=0;i<2;i++){_IK_links[d].links[i]=new THREE.Quaternion;_IK_links_result[d].links[i]=new THREE.Quaternion;_IK_links_result_final[d].links[i]=new THREE.Quaternion}}hip_rot_filter=new System._browser.data_filter([{type:"one_euro",id:"hip_rot",para:[30,1,.2,.2,4]}]);hip_mov_filter=new System._browser.data_filter([{type:"one_euro",id:"hip_mov",para:[30,1,.2,.2,3]}])});const fadein_blend_default_motion=250;const fadeout_blend_default_motion=500;const idle_blend_default_motion=0;function get_blend_default_motion(type,name,non_linear){if(!this[type][name])return 0;const obj=this[type][name][0];let ratio;if(obj._blend_default_motion>0){ratio=Math.min((RAF_timestamp-obj._blend_default_motion)/fadeout_blend_default_motion,1)}else if(obj._blend_default_motion<0){ratio=1-Math.min((RAF_timestamp+obj._blend_default_motion)/fadein_blend_default_motion,1)}else{ratio=0}if(ratio==0){this[type][name].forEach(obj=>{obj._blend_default_motion=0})}else if(non_linear){const f=2;ratio=ratio<.5?Math.pow(ratio*2,f)*.5:.5+Math.pow((ratio-.5)*2,1/f)*.5}return ratio}function set_blend_default_motion(type,name,v,idle_duration){if(!this[type][name]){if(!v)return;const is_pos=name.indexOf("IK")!=-1;const para={_blend_default_motion:v?1:0};if(is_pos)para.pos=new THREE.Vector3;else para.rot=new THREE.Quaternion;this.add("skin",name,para)}else{const obj_last=this[type][name][1];const _blend_default_motion=this[type][name][1]._blend_default_motion;if(v){if(this.reset_to_default_motion_once){obj_last._idle_blend_default_motion=0;obj_last._blend_default_motion=1}else if(!obj_last._blend_default_motion){if(!obj_last._idle_blend_default_motion)obj_last._idle_blend_default_motion=RAF_timestamp;if(RAF_timestamp-obj_last._idle_blend_default_motion>=(typeof idle_duration=="number"?idle_duration:idle_blend_default_motion)){obj_last._idle_blend_default_motion=0;obj_last._blend_default_motion=RAF_timestamp-RAF_timestamp_delta}}else if(obj_last._blend_default_motion<0){obj_last._blend_default_motion=RAF_timestamp-this.get_blend_default_motion(type,name)*fadeout_blend_default_motion}}else{obj_last._idle_blend_default_motion=0;if(obj_last._blend_default_motion>0){obj_last._blend_default_motion=-(RAF_timestamp-(1-this.get_blend_default_motion(type,name))*fadein_blend_default_motion)}}this[type][name][0]._blend_default_motion=obj_last._blend_default_motion;this[type][name][0]._idle_blend_default_motion=obj_last._idle_blend_default_motion}if(!this["_"+type][name])this["_"+type][name]={pos:new THREE.Vector3,rot:new THREE.Quaternion}}const RE_arm=new RegExp("("+toRegExp(["腕"],"|")+")$");function process_bones_core(mesh,name){const model=THREE.MMD.getModels()[mesh._model_index];const motion_para=MMD_SA.motion[model.skin._motion_index].para_SA;let update_IK_and_AddTrans;const bones=mesh.bones_by_name;const bone=bones[name];const s=this.skin[name];if(_poseNet.enabled&&!_poseNet.data_detected_stable)return;if(s[0].info[1]=="facemesh"){}let record_rot,record_pos;s[0].t_delta+=RAF_timestamp_delta;let ratio=Math.max(Math.min(s[0].t_delta/s[0].t_delta_frame,1),0);if(s[0].rot){if(s[0].after_IK){update_IK_and_AddTrans=!bone._update_IK_and_AddTrans||bone._update_IK_and_AddTrans.length;if(update_IK_and_AddTrans){if(bone.quaternion.x||bone.quaternion.y||bone.quaternion.z){bone.quaternion.conjugate();model._update_IK_and_AddTrans(false,name);bone.quaternion.conjugate()}}}if(s[0].onProcessRotation){s[0].onProcessRotation.call(this,mesh,name)}else{let rot=q1.set(0,0,0,1);if(s[0].absolute){bone.quaternion.set(0,0,0,1)}else{let motion_weight;if(motion_para.motion_tracking_upper_body_only){if(name.indexOf("上半身")!=-1){motion_weight=motion_para.motion_tracking?.motion_default_weight?.upper_body}else if(name.indexOf("肩")!=-1){motion_weight=motion_para.motion_tracking?.motion_default_weight?.shoulder}}if(motion_weight==null)motion_weight=1;if(motion_weight<1)bone.quaternion.slerp(MMD_SA.TEMP_q.set(0,0,0,1),1-motion_weight)}if(s[0].parent_based){let rot_parent=s[0].rot_parent;if(!rot_parent){rot_parent=MMD_SA.get_bone_rotation_parent(mesh,name,mesh).conjugate()}s[0]._rot_parent=rot_parent;rot.copy(rot_parent)}rot.multiply(s[0].no_blending?s[0].rot:MMD_SA.TEMP_q.copy(s[1].rot).slerp(s[0].rot,ratio));const ratio_euler=s[0].ratio_euler;if(ratio_euler){const rot_euler=MMD_SA.TEMP_v3.setEulerFromQuaternion(rot,ratio_euler.order);const r=s[0].ratio<1?s[0].ratio:1;rot_euler.x*=ratio_euler.x*r;rot_euler.y*=ratio_euler.y*r;rot_euler.z*=ratio_euler.z*r;rot.setFromEuler(rot_euler,ratio_euler.order)}else if(s[0].ratio<1){rot.slerp(q2.set(0,0,0,1),1-s[0].ratio)}const sd=MMD_SA_options.model_para_obj_all[mesh._model_index].skin_default[name];if(sd&&sd.rot_scale){if(typeof sd.rot_scale=="number")sd.rot_scale={x:sd.rot_scale,y:sd.rot_scale,z:sd.rot_scale};rot.setFromEuler(MMD_SA.TEMP_v3.setEulerFromQuaternion(rot,"YXZ").multiply(sd.rot_scale),"YXZ")}bone.quaternion.multiply(rot);record_rot=motion_recorder.active&&!s[0].motion_recorder_disabled&&name.indexOf("IK")==-1}}if(s[0].pos){if(s[0].onProcessPosition){s[0].onProcessPosition.call(this,mesh,name)}else{if(s[0].absolute)bone.position.set(0,0,0);const pos=MMD_SA.TEMP_v3.copy(s[1].pos).lerp(s[0].pos,ratio);bone.position.add(pos);record_pos=motion_recorder.active&&!s[0].motion_recorder_disabled&&name.indexOf("IK")==-1}}s[0].onFinish&&s[0].onFinish.call(this,mesh,name);if(record_rot)motion_recorder.set_boneKey(name,null,bone.quaternion,true);if(record_pos)motion_recorder.set_boneKey(name,v3a.copy(bone.position).sub(v3b.fromArray(bone.pmxBone.origin)),null,true);const _ratio=this.get_blend_default_motion("skin",name,true);if(_ratio){if(s[0].rot&&this._skin[name]?.rot){const rot=MMD_SA.TEMP_q.copy(this._skin[name].rot);bone.quaternion.slerp(this._skin[name].onProcessRotation&&this._skin[name].onProcessRotation.call(this,mesh,name,rot)||rot,_ratio)}if(s[0].pos&&this._skin[name]?.pos){bone.position.lerp(this._skin[name].pos,_ratio)}if(motion_recorder.active&&!s[0].motion_recorder_disabled){if(name.indexOf("IK")!=-1)motion_recorder.set_boneKey(name,s[0].pos&&bone.position,s[0].rot&&bone.quaternion,false)}}update_IK_and_AddTrans&&model._update_IK_and_AddTrans(false,name)}var _poseNet_data_detected_last=0;function process_bones(e){function get_mocap_body_rot(){if(body_rot_updated)return;body_rot_updated=_body_rot_updated;for(const name of["センター","上半身","上半身2","首"]){const s=this.skin[name];if(!s){body_rot_updated[name].set(0,0,0,1);continue}if(name=="首"){body_rot_updated[name].copy(s[0]._rot_neck||s[1]._rot_neck||MMD_SA._q1.set(0,0,0,1));body_rot_updated["頭"].copy(s[0]._rot_head||s[1]._rot_head||MMD_SA._q1.set(0,0,0,1))}else{const rot=MMD_SA._q1.set(0,0,0,1);const ratio=Math.max(Math.min((s[0].t_delta+RAF_timestamp_delta)/s[0].t_delta_frame,1),0);rot.multiply(s[0].no_blending?s[0].rot:MMD_SA.TEMP_q.copy(s[1].rot).slerp(s[0].rot,ratio));if(s[0].ratio<1)rot.slerp(MMD_SA._q2.set(0,0,0,1),1-s[0].ratio);body_rot_updated[name].copy(rot)}}rot_body_parent=MMD_SA._q1.copy(body_rot_updated["センター"]).multiply(body_rot_updated["上半身"]).multiply(body_rot_updated["上半身2"]).conjugate()}function get_arm_IK(d){const b_list=["センター","上半身","上半身2","首","頭"];let dependent;const d_parent=arm_default_stickiness&&arm_default_stickiness.parent;const IK_offset=v3a.set(0,0,0);if(d_parent){const name=d_parent.name||d+"足";const _d=name.charAt(0);const ratio=1-this.get_blend_default_motion("skin",name.indexOf("足")!=-1?_d+"足IK":name,true);let pos0,pos1;switch(name){case"頭":dependent=ratio&&this.skin["首"];if(dependent){for(const name of["首","頭"])bones[name].quaternion.copy(body_rot_updated[name]);pos0=MMD_SA.get_bone_position(mesh,"頭","首").add(v3b.set(0,.75,.75).applyQuaternion(MMD_SA.TEMP_q.copy(bones["首"].quaternion).multiply(bones["頭"].quaternion)));bones["首"].quaternion.copy(this._body_motion_rot[0]["首"]);bones["頭"].quaternion.copy(this._body_motion_rot[0]["頭"]);pos1=MMD_SA.get_bone_position(mesh,"頭","首").add(v3b.set(0,.75,.75).applyQuaternion(MMD_SA.TEMP_q.copy(bones["首"].quaternion).multiply(bones["頭"].quaternion)))}break;case"左足":case"右足":dependent=ratio;if(dependent){if(!_IK_links_result[_d].updated){_IK_links[_d].enabled=true;dependent=false}}else{_IK_links[_d].enabled=false;_IK_links_result[_d].updated=0}if(dependent){const leg=v3b.fromArray(bones[d+"ひざ"].pmxBone.origin).sub(v3c.fromArray(bones[name].pmxBone.origin));pos0=v3c.copy(leg).applyQuaternion(q1.copy(_IK_links_result_final[_d].parent).multiply(_IK_links_result_final[_d].links[1]));pos1=leg.applyQuaternion(q1.copy(_IK_links_result_final[_d].parent).multiply(_IK_links_result[_d].links[1]))}break}if(dependent){dependent=name;IK_offset.copy(pos0).sub(pos1);let weight=d_parent.weight||.5;if(typeof weight=="object"){IK_offset.x*=IK_offset.x<0?weight.x.left:weight.x.right;IK_offset.y*=IK_offset.y<0?weight.y.down:weight.y.up;IK_offset.z*=IK_offset.z<0?weight.z.backward:weight.z.forward}else{IK_offset.multiplyScalar(weight)}IK_offset.multiplyScalar(ratio)}}let arm0,pos0,body_rot_inv0;for(const name of b_list)bones[name].quaternion.copy(this._body_motion_rot[0][name]);const elbow_lock=motion_para.motion_tracking?.arm_tracking?.elbow_lock?.[d=="左"?"left":"right"];if(elbow_lock){elbow_lock._elbow_y=elbow_lock.y_absolute!=null?elbow_lock.y_absolute:MMD_SA.get_bone_position(mesh,d+"ひじ",mesh).y+(elbow_lock.y||0)}if(!dependent||dependent!="頭"){arm0=MMD_SA.get_bone_position(mesh,d+"腕",mesh);body_rot_inv0=MMD_SA.get_bone_rotation_parent(mesh,d+"腕IK",mesh);pos0=!motion_para.has_arm_IK?MMD_SA.get_bone_position(mesh,d+"手首",mesh):(new THREE.Vector3).copy(bones[d+"腕IK"].position).sub(MMD_SA_options.model_para_obj.arm_IK_offset[d]).applyQuaternion(body_rot_inv0).add(arm0);body_rot_inv0.conjugate()}for(const name of b_list)bones[name].quaternion.copy(this._body_motion_rot[1][name]);if(!arm0){arm0=MMD_SA.get_bone_position(mesh,d+"腕",mesh);body_rot_inv0=MMD_SA.get_bone_rotation_parent(mesh,d+"腕IK",mesh);pos0=!motion_para.has_arm_IK?MMD_SA.get_bone_position(mesh,d+"手首",mesh):(new THREE.Vector3).copy(bones[d+"腕IK"].position).sub(MMD_SA_options.model_para_obj.arm_IK_offset[d]).applyQuaternion(body_rot_inv0).add(arm0);body_rot_inv0.conjugate()}for(const name of["センター","上半身","上半身2"]){let motion_weight;if(name.indexOf("上半身")!=-1)motion_weight=motion_para.motion_tracking?.motion_default_weight?.upper_body;if(motion_weight==null)motion_weight=1;if(this.skin[name]){if(motion_weight<1)bones[name].quaternion.slerp(MMD_SA.TEMP_q.set(0,0,0,1),1-motion_weight);bones[name].quaternion.multiply(body_rot_updated[name])}}let default_position_weight=arm_default_stickiness&&arm_default_stickiness.default_position_weight;if(typeof default_position_weight!="number")default_position_weight=.5;const body_rot_inv1=MMD_SA.get_bone_rotation_parent(mesh,d+"腕IK",mesh).conjugate();let arm1;let arm_IK_constraint=motion_para.motion_tracking?.arm_tracking?.IK_constraint;if(arm_IK_constraint)arm_IK_constraint=arm_IK_constraint[d=="左"?"left":"right"]||arm_IK_constraint;if(arm_IK_constraint&&this.skin[d+"腕IK"]&&this.get_blend_default_motion("skin",d+"腕IK")<1){const a=_arm_IK_constraint[d];a.enabled=true;a.target.copy(pos0);a.target_radius=0;if(arm_IK_constraint.target_offset){const target_offset=v3a.fromArray(arm_IK_constraint.target_offset);a.target.add(target_offset);a.target_radius=target_offset.length()}if(arm_IK_constraint.target_radius)a.target_radius+=arm_IK_constraint.target_radius;arm1=MMD_SA.get_bone_position(mesh,d+"腕",mesh);a.arm_pos.copy(arm1)}arm1=default_position_weight==0?arm0:(arm1||MMD_SA.get_bone_position(mesh,d+"腕",mesh)).lerp(arm0,1-default_position_weight);const IK_pos=arm1.sub(pos0);if(default_position_weight<1)body_rot_inv1.slerp(body_rot_inv0,1-default_position_weight);if(dependent&&dependent.indexOf("足")!=-1){IK_offset.applyQuaternion(body_rot_inv1)}const x_dir=camera.x_flipped?-1:1;IK_pos.x*=x_dir;IK_pos.y*=-1;IK_pos.z*=-1;if(dependent&&dependent=="頭"){IK_pos.applyQuaternion(body_rot_inv1)}else{IK_pos.applyQuaternion(body_rot_inv1)}if(!this._skin[d+"腕IK"])this._skin[d+"腕IK"]={pos:new THREE.Vector3,rot:new THREE.Quaternion};if(!this._skin[d+"腕IK"].rot_parent_inv)this._skin[d+"腕IK"].rot_parent_inv=new THREE.Quaternion;this._skin[d+"腕IK"].rot_parent_inv.copy(body_rot_inv1).conjugate();IK_pos.add(MMD_SA_options.model_para_obj.arm_IK_offset[d]);IK_pos.add(IK_offset);for(const name of b_list)bones[name].quaternion.copy(this._body_motion_rot[1][name]);const hand=this.skin[d+"手首"];if(hand){if(hand_default_rotation_weight){hand[0].after_IK=true;if(this._skin[d+"手首"])this._skin[d+"手首"]._rot_absolute=MMD_SA.get_bone_rotation(mesh,d+"手首",false,mesh)}if(this._skin[d+"手首"])this._skin[d+"手首"].onProcessRotation=fix_hand_rotation;if(this._skin[d+"手捩"])this._skin[d+"手捩"].onProcessRotation=fix_hand_twist_rotation}return IK_pos}function fix_hand_rotation(mesh,name,rot){const d=name.charAt(0);const hand_default_rotation_weight=motion_para.motion_tracking&&motion_para.motion_tracking.arm_default_stickiness&&(motion_para.motion_tracking.arm_default_stickiness[d]||motion_para.motion_tracking.arm_default_stickiness).default_rotation_weight;if(!hand_default_rotation_weight)return rot;const rot_parent=MMD_SA.get_bone_rotation_parent(mesh,name,mesh).conjugate();const _rot=rot_parent.multiply(this._skin[name]._rot_absolute);return _rot.slerp(rot,1-hand_default_rotation_weight)}function fix_hand_twist_rotation(mesh,name,rot){return rot.set(0,0,0,1)}function wait_for_data(){if(_poseNet.data_detected){add_events();System._browser.on_animation_update.remove(wait_for_data,0)}}const model=e.detail.model;const is_T_pose=MMD_SA.THREEX.get_model(model._model_index).is_T_pose;const mesh=model.mesh;const bones=mesh.bones_by_name;const motion_para=MMD_SA.motion[model.skin._motion_index].para_SA;for(const d of["左","右"]){const rot_ref=motion_para.motion_tracking?.hand_tracking?.rotation_reference?.[d=="左"?"left":"right"];if(!rot_ref)continue;hand_f=frames.skin[d+"手首"]?.[0];if(!hand_f||!hand_f._rot_pose_ratio)continue;let rot_pose;if(rot_ref.type=="object3D"){const object3d=MMD_SA.THREEX._XR_Animator_scene_.object3D_list.find(obj=>obj.id==rot_ref.name);if(!object3d)return;const x_object=MMD_SA.THREEX._object3d_list_.find(obj=>obj.uuid==object3d._object3d_uuid);if(x_object._rot_aligned_&&x_object.parent_bone.name==d+"手首"){rot_pose=x_object._rot_aligned_}else{rot_pose=x_object._mesh.quaternion.clone()}if(rot_ref.offset){if(rot_ref.offset=="parent_bone"){const aa=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.set(-x_object.parent_bone.rotation.x,-x_object.parent_bone.rotation.y,x_object.parent_bone.rotation.z).multiplyScalar(Math.PI/180),"YXZ").toAxisAngle();rot_pose.multiply(MMD_SA.TEMP_q.setFromAxisAngle(aa[0].applyQuaternion(q1.copy(rot_hand_adjust[d=="左"?1:-1]).conjugate()),aa[1]))}else{if(rot_ref.offset.w==null){const q=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.copy(rot_ref.offset).multiplyScalar(Math.PI/180));rot_ref.offset.x=q.x;rot_ref.offset.y=q.y;rot_ref.offset.z=q.z;rot_ref.offset.w=q.w}rot_pose.multiply(MMD_SA.TEMP_q.copy(rot_ref.offset))}}}else{if(rot_ref.rotation){if(rot_ref.rotation.w==null){const q=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.copy(rot_ref.rotation).multiplyScalar(Math.PI/180));rot_ref.rotation.x=q.x;rot_ref.rotation.y=q.y;rot_ref.rotation.z=q.z;rot_ref.rotation.w=q.w}rot_pose=MMD_SA.TEMP_q.copy(rot_ref.rotation)}}if(!hand_f._rot_pose)hand_f._rot_pose=new THREE.Quaternion;if(rot_pose){hand_f._rot_pose.copy(rot_pose)}else{hand_f._rot_pose.set(0,0,0,1)}}if(!this._reset_disabled&&this._motion_path&&(this._motion_path!=motion_para._path||this._motion_tracking_upper_body_only!=!!motion_para.motion_tracking_upper_body_only)){this._motion_path=motion_para._path;this._motion_tracking_upper_body_only=!!motion_para.motion_tracking_upper_body_only;this.reset();remove_events();_poseNet.data_detected=0;_poseNet.initial_data_detected=false;System._browser.on_animation_update.remove(wait_for_data,0);System._browser.on_animation_update.add(wait_for_data,0,0,-1);return}this._motion_path=motion_para._path;this._motion_tracking_upper_body_only=!!motion_para.motion_tracking_upper_body_only;if(motion_recorder.enabled&&_poseNet_data_detected_last!=_poseNet.data_detected){_poseNet_data_detected_last=_poseNet.data_detected;motion_recorder.timestamp_for_recording=RAF_timestamp;if(motion_recorder.active)window.dispatchEvent(new CustomEvent("SA_motion_recorder_on_active",e))}for(const d of["左","右"]){this.arm_IK_constraint[d].enabled=false}rot_parent_upper_body_inv.copy(this.get_upper_body_rotation()).multiply(this._rot_body_camera_offset);this.upper_body_rotation_limiter(rot_parent_upper_body_inv);let body_rot_updated,rot_body_parent,arm_default_stickiness,hand_default_rotation_weight;if((_poseNet.enabled||_facemesh.enabled)&&motion_para.motion_tracking_upper_body_only){const _arm_as_leg=motion_para.motion_tracking&&motion_para.motion_tracking.arm_as_leg;const arm_as_leg={"左":_arm_as_leg&&_arm_as_leg.enabled&&(!_arm_as_leg.linked_side||_arm_as_leg.linked_side=="left"),"右":_arm_as_leg&&_arm_as_leg.enabled&&(!_arm_as_leg.linked_side||_arm_as_leg.linked_side=="right")};for(const name in this._skin){this._skin[name].pos.copy(bones[name].position);this._skin[name].rot.copy(bones[name].quaternion)}const hip_adjustment_weight_percent=_poseNet.hip_adjustment_weight_percent/100;let adjust_lower_body=hip_adjustment_weight_percent&&(_poseNet.data_detected||!_poseNet.enabled&&_facemesh.data_detected);let rot_lower_body,pos_lower_body;if(adjust_lower_body){get_mocap_body_rot.call(this);const body_rot=q1.copy(rot_body_parent);const _pose=motion_para.motion_tracking?.ML_models?.pose||MMD_SA_options.user_camera.ML_models.pose;if(_pose.upper_rotation_offset){const y=_pose.upper_rotation_offset*Math.PI/180;body_rot.premultiply(MMD_SA.TEMP_q.set(0,Math.sin(y/2),0,Math.cos(y/2)))}body_rot.conjugate();const rotation_weight=motion_para.motion_tracking?.hip_adjustment?.rotation_weight;rot_lower_body=(new THREE.Quaternion).copy(body_rot).slerp(q2.set(0,0,0,1),1-(typeof rotation_weight=="number"?rotation_weight:.5)*hip_adjustment_weight_percent);let hip_adjustment_smoothing=_poseNet.hip_adjustment_smoothing_percent/100;if(hip_adjustment_smoothing)hip_adjustment_smoothing=.1+(1-hip_adjustment_smoothing)*(1-hip_adjustment_smoothing)*.9;if(hip_adjustment_smoothing){hip_rot_filter.filters[0].filter.minCutOff=hip_adjustment_smoothing;rot_lower_body.fromArray(hip_rot_filter.filter(rot_lower_body.toArray()))}this.remove("skin","下半身");this.add("skin","下半身",{no_blending:true,rot:rot_lower_body});if(this.skin["センター"]){let hip_displacement=motion_para.motion_tracking?.hip_adjustment?.displacement_weight;if(hip_displacement==null)hip_displacement=.25;const axis=v3a;const scale=v3b;if(typeof hip_displacement=="number"){if(hip_displacement){hip_displacement*=hip_adjustment_weight_percent;axis.set(0,MMD_SA_options.model_para_obj.left_leg_length/3*hip_displacement,0);scale.set(-1,1,-1)}}else{axis.copy(hip_displacement.axis||MMD_SA.TEMP_v3.set(0,hip_displacement.weight,0)).multiplyScalar(MMD_SA_options.model_para_obj.left_leg_length/3*hip_adjustment_weight_percent);scale.copy(hip_displacement.scale)}scale.x*=_poseNet.hip_adjustment_scale_x_percent/100;scale.y*=_poseNet.hip_adjustment_scale_y_percent/100;scale.z*=_poseNet.hip_adjustment_scale_z_percent/100;const hip_adjustment_adjust_y_axis_percent=_poseNet.hip_adjustment_adjust_y_axis_percent/100;if(hip_adjustment_adjust_y_axis_percent&&!hip_displacement.axis){const a=Math.PI/4*hip_adjustment_adjust_y_axis_percent;const m=axis.y;axis.y=m*Math.cos(a);axis.z=m*Math.sin(a)}if(hip_displacement){axis_default=v3c.copy(axis);body_rot.multiply(MMD_SA.TEMP_q.set(0,0,0,1).slerp(body_rot_updated["首"],_poseNet.hip_adjustment_head_weight_percent/100));axis.applyQuaternion(body_rot);axis.sub(axis_default).multiply(scale);if(hip_adjustment_smoothing){hip_mov_filter.filters[0].filter.minCutOff=hip_adjustment_smoothing;axis.fromArray(hip_mov_filter.filter(axis.toArray()))}this.skin["センター"][0].pos=(this.skin["センター"][0].pos||new THREE.Vector3).copy(axis);this.skin["センター"][0]._hip_adjustment_offset=(this.skin["センター"][0]._hip_adjustment_offset||new THREE.Vector3).copy(axis);this.skin["センター"][1].pos=this.skin["センター"][0].pos;pos_lower_body=this.skin["センター"][0].pos}}}for(const d of["左","右"]){const dir=d=="左"?"left":"right";arm_default_stickiness=motion_para.motion_tracking&&motion_para.motion_tracking.arm_default_stickiness&&(motion_para.motion_tracking.arm_default_stickiness[dir]||motion_para.motion_tracking.arm_default_stickiness);hand_default_rotation_weight=arm_default_stickiness&&arm_default_stickiness.default_rotation_weight;let feet_fixed_weight=motion_para.motion_tracking?.hip_adjustment?.[dir]?motion_para.motion_tracking.hip_adjustment[dir].feet_fixed_weight:motion_para.motion_tracking?.hip_adjustment?.feet_fixed_weight;if(typeof feet_fixed_weight!="number")feet_fixed_weight=1;if(feet_fixed_weight<1||(adjust_lower_body||arm_as_leg[d])&&!motion_para.has_leg_IK){const name=d+"足IK";let _rot_lower_body,_pos_lower_body;if(rot_lower_body){_rot_lower_body=q1.copy(bones["下半身"].quaternion);bones["下半身"].quaternion.multiply(rot_lower_body)}if(pos_lower_body){_pos_lower_body=v3a.copy(bones["センター"].position);bones["センター"].position.add(pos_lower_body)}const leg0=motion_para.has_leg_IK?null:MMD_SA.get_bone_position(mesh,d+"足","全ての親");const pos0=feet_fixed_weight<1?MMD_SA.get_bone_position(mesh,d+"足首","全ての親"):v3b;if(_rot_lower_body)bones["下半身"].quaternion.copy(_rot_lower_body);if(pos_lower_body)bones["センター"].position.copy(_pos_lower_body);const pos1=motion_para.has_leg_IK||feet_fixed_weight>0?MMD_SA.get_bone_position(mesh,d+"足首","全ての親"):pos0;const x_dir=camera.x_flipped?-1:1;if(motion_para.has_leg_IK){const IK_pos=v3a.copy(pos1).sub(pos0.lerp(pos1,feet_fixed_weight));IK_pos.x*=x_dir;IK_pos.y*=-1;IK_pos.z*=-1;if(!this._skin[name])this._skin[name]={pos:new THREE.Vector3,rot:new THREE.Quaternion};this._skin[name].pos.add(IK_pos);bones[name].position.add(IK_pos)}else{const hip_pmx=v3a.fromArray(bones[d+"足"].pmxBone.origin);const hip_offset=hip_pmx.sub(leg0).negate();const IK_pos=leg0.sub(pos0.lerp(pos1,feet_fixed_weight));IK_pos.x*=x_dir;IK_pos.y*=-1;IK_pos.z*=-1;IK_pos.add(MMD_SA_options.model_para_obj.leg_IK_offset[d]);IK_pos.add(hip_offset);if(!this._skin[name])this._skin[name]={pos:new THREE.Vector3,rot:new THREE.Quaternion};this._skin[name].pos.copy(IK_pos);if(!arm_as_leg[d]){_poseNet.enable_IK(name,true);if(!this.skin[name])this.add("skin",name,{absolute:true,is_dummy:true,pos:true,priority:999})}bones[name].position.copy(IK_pos);if(_poseNet.data_detected)bones[d+"ひざ"].quaternion.set(0,0,0,1)}bones[name].position.y+=this._skin[name]._offset_y_||0}if(arm_as_leg[d]){get_mocap_body_rot.call(this);const IK_pos=get_arm_IK.call(this,d);bones[d+"腕IK"].position.copy(IK_pos);_poseNet.enable_IK(d+"腕IK",true)}else{const name=d+"腕IK";let IK_pos;const hand=this.skin[d+"手首"];if(hand){get_mocap_body_rot.call(this);if(!_poseNet.IK_disabled_check(name)){IK_pos=get_arm_IK.call(this,d)}else{if(this._skin[d+"腕"])this._skin[d+"腕"].rot.premultiply(rot_body_parent);if(this._skin[d+"手首"])this._skin[d+"手首"].rot.premultiply(MMD_SA.TEMP_q.copy(rot_body_parent).conjugate())}}if(IK_pos)this._skin[name].pos.copy(IK_pos)}if(_IK_links[d].enabled){const b=bones[d+"足IK"];const obj=_IK_links[d];obj.target.copy(b.position);const ik=b.pmxBone.IK;obj.effector.copy(mesh.bones[ik.effector].quaternion);for(let i=0;i{e.detail.result.links=obj;e.detail.result.links_result=_IK_links_result[d]},{once:true});window.addEventListener("SA_camera_poseNet_process_bones_onended",e=>{const obj=_IK_links_result_final[d];obj.parent.copy(MMD_SA.get_bone_rotation_parent(mesh,d+"足","全ての親"));obj.effector.copy(mesh.bones[ik.effector].quaternion);for(let i=0;i{const model=e.detail.model;const bones=model.mesh.bones_by_name;let y=_pose.upper_rotation_offset*Math.PI/180;const q_offset=MMD_SA.TEMP_q.set(0,Math.sin(y/2*-.5),0,Math.cos(y/2*-.5));bones["上半身"].quaternion.premultiply(q_offset);bones["上半身2"].quaternion.premultiply(q_offset);q_offset.set(0,Math.sin(y/2),0,Math.cos(y/2));bones["全ての親"].quaternion.premultiply(q_offset);if(motion_recorder.active){motion_recorder.set_boneKey("上半身",null,bones["上半身"].quaternion,false);motion_recorder.set_boneKey("上半身2",null,bones["上半身2"].quaternion,false);motion_recorder.set_boneKey("全ての親",null,bones["全ての親"].quaternion,false)}},{once:true})}if(motion_recorder.active){window.addEventListener("SA_camera_poseNet_process_bones_onended",e=>{const model=e.detail.model;const bones=model.mesh.bones_by_name;for(const d of["左","右"]){motion_recorder.set_boneKey(d+"足",null,bones[d+"足"].quaternion,false);motion_recorder.set_boneKey(d+"ひざ",null,bones[d+"ひざ"].quaternion,false);motion_recorder.set_boneKey(d+"足首",null,bones[d+"足首"].quaternion,false);if(bones[d+"足先EX"])motion_recorder.set_boneKey(d+"足先EX",null,bones[d+"足先EX"].quaternion,false);for(const name of[d+"肩",d+"腕",d+"ひじ",d+"手首"]){if(bones[name])motion_recorder.set_boneKey(name,null,bones[name].quaternion,false)}finger_list.forEach((f,i)=>{let ini=i==0?0:1;for(let n=ini;n!skin[n][0].after_IK).sort((a,b)=>{let _a=skin[a][0].priority||0;let _b=skin[b][0].priority||0;return _a-_b});skin_sorted.forEach(name=>{let bone=bones[name];if(!bone&&!/_DUMMY_/.test(name))return;var info=skin[name][0].info[1];if((!info||/pose/.test(info))&&!motion_para.motion_tracking_enabled)return;process_bones_core.call(this,mesh,name)})}function process_bones_after_IK(e){var model=e.detail.model;var mesh=model.mesh;var motion_para=MMD_SA.motion[model.skin._motion_index].para_SA;if(motion_para.motion_tracking_upper_body_only){for(const d of["左","右"]){const elbow_lock=motion_para.motion_tracking?.arm_tracking?.elbow_lock?.[d=="左"?"left":"right"];if(elbow_lock){const elbow_y=elbow_lock._elbow_y!=null?elbow_lock._elbow_y:null;if(elbow_y!=null)lock_elbow(elbow_lock,mesh,d)}}}var skin=this.skin;var skin_sorted=Object.keys(skin).filter(n=>skin[n][0].after_IK).sort((a,b)=>{let _a=skin[a][0].priority||0;let _b=skin[b][0].priority||0;return _a-_b});skin_sorted.forEach(name=>{let bone=mesh.bones_by_name[name];if(!bone&&!/_DUMMY_/.test(name))return;var info=skin[name][0].info[1];if((!info||/pose/.test(info))&&!motion_para.motion_tracking_enabled)return;process_bones_core.call(this,mesh,name)});window.dispatchEvent(new CustomEvent("SA_camera_poseNet_process_bones_onended",e))}function process_morphs(e){if(_poseNet.enabled&&!_poseNet.data_detected_stable)return;var model=e.detail.model;var mesh=model.mesh;var targets=model.morph.targets;model.pmx.morphs.forEach(function(m){if(m.panel!=3)return;var name=m.name;if(!model.pmx.morphs_weight_by_name[name])return;var morph_index=model.morph.target_index_by_name[name];if(morph_index==null)return;var target=targets[morph_index];var key0=target.keys[0];if(key0.morph_type==1){mesh.morphTargetInfluences[morph_index]=0}else{let key_new={name:name,weight:0,morph_type:key0.morph_type,morph_index:key0.morph_index};model.morph.onupdate(key_new,key_new,0,morph_index)}});var facemesh_morph=MMD_SA_options.model_para_obj.facemesh_morph;var morph=this.morph;var morph_weight={};var morph_weight_non_zero_count=0;Object.keys(morph).forEach(function(name){let m=morph[name];if(m.disabled)return;m[0].t_delta+=RAF_timestamp_delta;let ratio=Math.max(Math.min(m[0].t_delta/m[0].t_delta_frame,1),0);let weight=m[0].weight*ratio+m[1].weight*(1-ratio);morph_weight[name]=weight;if(weight)morph_weight_non_zero_count++});Object.keys(morph_weight).forEach(function(name){let m=morph[name];let weight=morph_weight[name];if(weight<0){motion_recorder.morph_active&&motion_recorder.set_morphKey(name,0,true);switch(name){case"にやり":name="ω";break;case"口角上げ":name="口角下げ";break;case"上":name="下";break}weight=-weight}if(motion_recorder.morph_active){let name_MR=name;if(name=="まばたきL")name_MR="ウィンク";else if(name=="まばたきR")name_MR="ウィンク右";motion_recorder.set_morphKey(name_MR,weight,true)}let fm=facemesh_morph[name];let m_name=fm&&fm.name||name;let morph_index=model.morph.target_index_by_name[m_name];if(morph_index==null)return;weight*=fm&&fm.weight||1;let target=targets[morph_index];let key0=target.keys[0];if(key0.morph_type==1){mesh.morphTargetInfluences[morph_index]=weight}else{let key_new={name:m_name,weight:weight,morph_type:key0.morph_type,morph_index:key0.morph_index};model.morph.onupdate(key_new,key_new,0,morph_index)}})}function add(info,name,obj){obj.name=name;obj.info=info.split("|");var type=obj.info[0];var target=this[type][name];if(obj.is_dummy){if(target&&target[0].is_dummy)return;obj.no_blending=true;obj.onProcessPosition=obj.onProcessRotation=func_dummy;if(obj.pos)obj.pos=pos_dummy;if(obj.rot)obj.rot=rot_dummy}const is_hand=name.indexOf("指")!=-1||name.indexOf("手首")!=-1;obj.timestamp=RAF_timestamp;obj.t_delta=0;obj.t_delta_frame=_handpose.enabled&&is_hand&&this.t_delta_hands||this.t_delta||0;obj.t_delta_frame=Math.max(Math.min(obj.t_delta_frame,200),16.6667);if(target){if(RAF_timestamp==target[0].timestamp){target[0]=Object.assign(target[0],obj)}else{if(!obj.no_blending&&!camera.video.paused){let blending_ratio=_poseNet.use_3D_pose||obj.info[1]=="facemesh"?.5+Math.max(Math.min((Math.max(obj.t_delta_frame,RAF_timestamp-target[0].timestamp)-50)/150,1),0)*.5:1;if(obj.pos&&target[0].pos){obj.pos.lerp(target[0].pos,1-blending_ratio)}if(obj.rot&&target[0].rot){obj.rot.slerp(target[0].rot,1-blending_ratio)}if(obj.weight!=null&&target[0].weight!=null){obj.weight=obj.weight*blending_ratio+target[0].weight*(1-blending_ratio)}}this[type][name]=[obj,target[0]]}obj._blend_default_motion=target[1]._blend_default_motion;obj._idle_blend_default_motion=target[1]._idle_blend_default_motion}else{this[type][name]=[obj,obj]}if(motion_recorder.speed&&camera.is_local_video&&motion_recorder.speed<1)obj.no_blending=true}function remove(type,name){delete this[type][name]}function reset(){this.skin={};this.morph={};this._skin={};this._morph={};this.reset_to_default_motion_once=true;this._motion_path=""}function add_events(){window.addEventListener("SA_MMD_model"+this.model_num+"_process_morphs",this.process_morphs);window.addEventListener("SA_MMD_model"+this.model_num+"_process_bones_before_IK",this.process_bones);window.addEventListener("SA_MMD_model"+this.model_num+"_process_bones_after_IK",this.process_bones_after_IK)}function remove_events(){window.removeEventListener("SA_MMD_model"+this.model_num+"_process_morphs",this.process_morphs);window.removeEventListener("SA_MMD_model"+this.model_num+"_process_bones_before_IK",this.process_bones);window.removeEventListener("SA_MMD_model"+this.model_num+"_process_bones_after_IK",this.process_bones_after_IK)}var f=function(model_num){this.model_num=model_num;this.reset();this._body_motion_rot=[{},{}];this._rot_body_motion=new THREE.Quaternion;this._rot_body_camera=new THREE.Quaternion;this._rot_body_camera_offset=new THREE.Quaternion;this._rot_head_camera=new THREE.Quaternion;this._rot_head_camera_offset=new THREE.Quaternion;this._rot_body_offset=new THREE.Quaternion;this._rot_camera=new THREE.Quaternion;this._rot_camera_angle=0;this.process_bones=process_bones.bind(this);this.process_bones_after_IK=process_bones_after_IK.bind(this);this.process_morphs=process_morphs.bind(this)};f.prototype.set_upper_body_rotation=function(model_num,stage){if(!camera.ML_enabled||this.model_num!=model_num)return;const bones=THREE.MMD.getModels()[this.model_num].mesh.bones_by_name;for(const name of["センター","上半身","上半身2","首","頭"]){if(!bones[name])continue;let _rot=this._body_motion_rot[stage][name];if(!_rot)_rot=this._body_motion_rot[stage][name]=new THREE.Quaternion;_rot.copy(bones[name].quaternion)}};f.prototype.get_upper_body_rotation=function(){const bones=THREE.MMD.getModels()[this.model_num].mesh.bones_by_name;this._rot_camera.setFromEuler(MMD_SA.TEMP_v3.set(MMD_SA._rx_last,MMD_SA._ry_last,0));this._rot_camera_angle=this._rot_camera.toAxisAngle()[1];const rot_motion=q1.set(0,0,0,1);const rot_motion_and_camera=q2.set(0,0,0,1);for(const name of["センター","上半身","上半身2"]){rot_motion.multiply(this._body_motion_rot[0][name]||bones[name].quaternion);rot_motion_and_camera.multiply(this._body_motion_rot[1][name]||bones[name].quaternion)}this._rot_body_camera.copy(rot_motion).conjugate().multiply(rot_motion_and_camera);this._rot_body_camera_offset.copy(this._rot_body_camera).conjugate().multiply(this._rot_camera);this._rot_body_motion.copy(rot_motion);const body_rot=q3.copy(rot_motion).conjugate();return body_rot};f.prototype.upper_body_rotation_limiter=function(rot_parent,angle_limit=Math.PI/3){var aa=rot_parent.toAxisAngle();var angle=aa[1];this._rot_body_offset.set(0,0,0,1);if(Math.abs(angle)>angle_limit){let angle_adjusted;if(Math.abs(angle){frames_object.prototype._q1=new THREE.Quaternion;frames_object.prototype._q2=new THREE.Quaternion;frames=new frames_object(0)});var motion_recorder=function(){function BoneKey(name,pos,rot,time){this.name=name;this.pos=pos&&pos.toArray()||[0,0,0];this.rot=rot&&rot.toArray()||[0,0,0,1];this.time=time;boneKey_f[name].index=vmd.boneKeys.length}function MorphKey(name,weight,time){this.name=name;this.weight=weight;this.time=time;morphKey_f[name].index=vmd.morphKeys.length}var vmd;var boneKey_f,morphKey_f;var frame_count=0;var frame_dropped=0;var boneKey_saved=0;var morphKey_saved=0;var _frame_id;var _timestamp=0;var _speed=0;const morphKey_interval=2;return{timestamp_for_recording:0,get enabled(){return _speed&&!camera.video.paused},get morph_active(){return _poseNet.enabled?this.enabled:this.active},get active(){if(!this.enabled)return false;if(this.timestamp_for_recording&&this.timestamp_for_recording!=RAF_timestamp)return false;if(_frame_id!=camera_video_frame_id){let f_offset=1;if(_frame_id){f_offset=this.get_frame(camera_video_frame_id)-this.get_frame(_frame_id);if(f_offset<0||f_offset>30)f_offset=1;if(f_offset>1){const _f=f_offset-1;frame_dropped+=_f;for(const name in boneKey_f){boneKey_f[name].frame_length+=_f}for(const name in morphKey_f){morphKey_f[name].frame_length+=_f}}}frame_count+=f_offset;_frame_id=camera_video_frame_id;_timestamp=RAF_timestamp}if(_timestamp==RAF_timestamp){return true}return false},get_frame:function(frame_id){var parts=frame_id.split(":");return parseInt(parts[0])*30+(parseInt(parts[1])-1)},get frame_count(){return frame_count},get stats(){return[frame_dropped,vmd.boneKeys.length,vmd.morphKeys.length,boneKey_saved,morphKey_saved]},get time(){return Math.floor(frame_count/30)+":"+(frame_count%30+1)},get speed(){return _speed},set speed(speed){_speed=speed;if(speed)this.start(speed);else this.stop()},get vmd(){return _speed?null:vmd},set vmd(v){vmd=null},set_boneKey:function(name,pos,rot,check_timestamp){let bkf=boneKey_f[name];if(bkf==null){bkf=boneKey_f[name]={frame_length:1};if(frame_count>0)vmd.boneKeys.push(new BoneKey(name,null,null,0))}if(check_timestamp&&frames.skin[name]&&bkf.timestamp==frames.skin[name][0].timestamp){let data_identical;if(bkf.frame_count==frame_count){const k=vmd.boneKeys[bkf.index];data_identical=(!pos||k.pos)&&(!rot||k.rot)}else data_identical=true;if(data_identical){if(bkf.frame_count!=frame_count){bkf.frame_length++;boneKey_saved++}return}}if(!pos&&rot&&bkf.is_rot_identity&&rot.w==1){boneKey_saved++;return}bkf.is_rot_identity=rot?rot.w==1:bkf.is_rot_identity;if(bkf.frame_count==frame_count){const k=vmd.boneKeys[bkf.index];if(pos)k.pos=pos.toArray();if(rot)k.rot=rot.toArray()}else{if(bkf.index!=null&&name.indexOf("手")==-1&&name.indexOf("指")==-1){const k=vmd.boneKeys[bkf.index];const frame_length=Math.round(frame_count-k.time*30);if(frame_length>bkf.frame_length||frame_length>10){const k_copy=new BoneKey(name,null,null,(frame_count-1)/30);k_copy.pos=k.pos;k_copy.rot=k.rot;vmd.boneKeys.push(k_copy);boneKey_saved--}}bkf.timestamp=frames.skin[name]&&frames.skin[name][0].timestamp||0;vmd.boneKeys.push(new BoneKey(name,pos,rot,frame_count/30))}bkf.frame_length=1;bkf.frame_count=frame_count;return true},set_morphKey:(()=>{function _set_morphKey(name,weight,check_timestamp){let mkf=morphKey_f[name];if(mkf==null){mkf=morphKey_f[name]={frame_length:1};if(frame_count>0)vmd.morphKeys.push(new MorphKey(name,0,0))}if(check_timestamp&&frames.morph[name]&&mkf.timestamp==frames.morph[name][0].timestamp){if(mkf.frame_count!=frame_count){mkf.frame_length++;morphKey_saved++}return}weight=Math.round(weight*20)/20;if(weight==mkf.weight){morphKey_saved++;return}mkf.weight=weight;if(mkf.frame_count==frame_count){const k=vmd.morphKeys[mkf.index];k.weight=weight}else{if(mkf.index!=null){const k=vmd.morphKeys[mkf.index];const frame_length=Math.round(frame_count-k.time*30);if(frame_lengthmkf.frame_length||frame_length>10){vmd.morphKeys.push(new MorphKey(name,k.weight,(frame_count-morphKey_interval)/30));morphKey_saved--}}mkf.timestamp=frames.morph[name]&&frames.morph[name][0].timestamp||0;vmd.morphKeys.push(new MorphKey(name,weight,frame_count/30))}mkf.frame_length=1;mkf.frame_count=frame_count;return true}return function(name,weight,check_timestamp){if(_poseNet.enabled){window.addEventListener("SA_motion_recorder_on_active",()=>{_set_morphKey.call(this,name,weight,check_timestamp)},{once:true})}}})(),start:function(speed){_speed=speed;if(MMD_SA.THREEX.get_model(0).use_faceBlendshapes){MMD_SA.THREEX.get_model(0)._disable_faceBlendshapes=true;for(const name of _facemesh.faceBlendshapes_list){frames.remove("morph",name)}}_frame_id="";_timestamp=0;if(camera.is_local_video){camera.video.playbackRate=speed;if(speed<1)camera.video.muted=true;camera.video.loop=false;camera.video.pause();MMD_SA.SpeechBubble.message(0,System._browser.translation.get("XR_Animator.UI.motion_capture.ML_on.record_motion.choose_speed.begin_recording"),5*1e3);C_media_control.style.visibility="inherit"}frame_count=-1;frame_dropped=0;boneKey_saved=0;morphKey_saved=0;boneKey_f={};morphKey_f={};vmd={boneKeys:[],morphKeys:[]}},stop:function(){_speed=0;MMD_SA.THREEX.get_model(0)._disable_faceBlendshapes=false;if(camera.is_local_video){camera.video.playbackRate=1;camera.video.muted=false;camera.video.loop=true;camera.video.pause();MMD_SA.SpeechBubble.message(0,System._browser.translation.get("XR_Animator.UI.motion_capture.ML_on.record_motion.choose_speed.begin_recording.recording_stopped"),5*1e3)}else if(camera.is_local_photo){vmd.boneKeys=vmd.boneKeys.filter(k=>k.time==0);vmd.morphKeys=vmd.morphKeys.filter(k=>k.time==0);vmd.boneKeys=vmd.boneKeys.concat(vmd.boneKeys.map(k=>{const _k={name:k.name,pos:k.pos.slice(),rot:k.rot.slice(),time:60};return _k}));vmd.morphKeys=vmd.morphKeys.concat(vmd.morphKeys.map(k=>{const _k={name:k.name,weight:k.weight,time:60};return _k}))}}}}();const streamer_mode=(()=>{function show_status(){msgs=msgs.slice(Math.max(msgs.length-8,0),msgs.length);MMD_SA_options.Dungeon.run_event([[{message:{content:msgs.join("\n")+"\n("+System._browser.translation.get("XR_Animator.UI.streamer_mode.press_x_to_abort")+")",para:sb_para,branch_list:[{key:"X",is_closing_event:true,event_id:{func:()=>{_x_quit=true;if(_resolve)_resolve()},ended:true}}]}}]])}function check_model(){if(--_mocap_step_count==0){msgs.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_model_loaded"));if(_resolve)_resolve()}}function facemesh_loaded(e){if(!_facemesh.calibrated){_mocap_step_count++;window.addEventListener("SA_camera_facemesh_calibrating",check_calibration);msgs.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.face_data_calibrating")+"...");show_status()}check_model(e)}function check_calibration(e){const percent=e.detail.percent;if(percent>=100){window.removeEventListener("SA_camera_facemesh_calibrating",check_calibration);MMD_SA.SpeechBubble.list[1].message(0,"("+System._browser.translation.get("XR_Animator.UI.streamer_mode.calibrating_face_data")+" - 100%)",0,sb_para);msgs.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.face_data_calibrated"));check_model()}else{MMD_SA.SpeechBubble.list[1].message(0,"("+System._browser.translation.get("XR_Animator.UI.streamer_mode.calibrating_face_data")+" - "+percent+"%)\n"+System._browser.translation.get("XR_Animator.UI.streamer_mode.face_data_calibrating_message"),0,sb_para)}}let running;let msgs=[];let _mocap_step_count;let _resolve;let _x_quit;const sb_para={font_scale:1,font:'"Segoe UI",Roboto,Ubuntu,"SF Pro"'};const _streamer_mode={get running(){return running},init_mocap:function(type){function change_motion(){if(running){if(MMD_SA_options.user_camera.streamer_mode.motion_id!=null){const motion_index=typeof MMD_SA_options.user_camera.streamer_mode.motion_id=="number"?MMD_SA_options.user_camera.streamer_mode.motion_id+(System._browser.camera.facemesh.enabled&&!System._browser.camera.poseNet.enabled?1:0):MMD_SA_options._XRA_pose_list?.[2].findIndex(m=>m.name==MMD_SA_options.user_camera.streamer_mode.motion_id);if(typeof motion_index=="number"&&motion_index>=0)MMD_SA_options.Dungeon_options.item_base.pose?._change_motion_(motion_index,true);return new Promise(resolve=>{window.addEventListener("SA_MMD_model0_onmotionchange",e=>{msgs.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.motion_changed")+" ("+e.detail.motion_new.filename+")");resolve()},{once:true})})}}if(MMD_SA.WebXR.user_camera.poseNet.enabled){if(!MMD_SA.MMD.motionManager.para_SA.motion_tracking_enabled)MMD_SA_options.Dungeon_options.item_base.pose?._change_motion_(0,true)}}switch(type){case"Face":MMD_SA.WebXR.user_camera.poseNet.use_holistic=false;MMD_SA.WebXR.user_camera.facemesh.enabled=true;MMD_SA.WebXR.user_camera.poseNet.enabled=false;MMD_SA.WebXR.user_camera.handpose.enabled=false;DEBUG_show("Facemesh AI:ON",2);_mocap_step_count=1;break;case"Body":MMD_SA.WebXR.user_camera.poseNet.use_holistic=false;MMD_SA.WebXR.user_camera.poseNet.enabled=true;MMD_SA.WebXR.user_camera.handpose.enabled=false;MMD_SA.WebXR.user_camera.facemesh.enabled=false;DEBUG_show("Pose AI:ON",3);_mocap_step_count=1;break;case"Body+Hands":MMD_SA.WebXR.user_camera.poseNet.use_holistic=false;MMD_SA.WebXR.user_camera.poseNet.enabled=true;MMD_SA.WebXR.user_camera.handpose.enabled=true;MMD_SA.WebXR.user_camera.facemesh.enabled=false;DEBUG_show("Pose/Hands AI:ON",3);_mocap_step_count=1;break;case"Face+Body":MMD_SA.WebXR.user_camera.poseNet.use_holistic=false;MMD_SA.WebXR.user_camera.facemesh.enabled=true;MMD_SA.WebXR.user_camera.poseNet.enabled=true;MMD_SA.WebXR.user_camera.handpose.enabled=false;DEBUG_show("Facemesh/Pose AI:ON",3);_mocap_step_count=2;break;case"Full Body":MMD_SA.WebXR.user_camera.poseNet.use_holistic=false;MMD_SA.WebXR.user_camera.facemesh.enabled=true;MMD_SA.WebXR.user_camera.poseNet.enabled=true;MMD_SA.WebXR.user_camera.handpose.enabled=true;DEBUG_show("Facemesh/Pose/Hands AI:ON",4);_mocap_step_count=2;break;case"Full Body Holistic":MMD_SA.WebXR.user_camera.poseNet.use_holistic=true;MMD_SA.WebXR.user_camera.facemesh.enabled=true;MMD_SA.WebXR.user_camera.poseNet.enabled=true;MMD_SA.WebXR.user_camera.handpose.enabled=true;DEBUG_show("Facemesh/Pose/Hands AI:ON",4);_mocap_step_count=2;break;default:return}MMD_SA_options.user_camera.streamer_mode.mocap_type=type;return change_motion()},start:async function(){function reset(){msgs.length=0;_resolve=null;_x_quit=false;running=false}function quit(){reset();MMD_SA_options.Dungeon.event_mode=false}if(running){DEBUG_show("(Streamer mode running)");return}reset();running=true;MMD_SA_options.Dungeon.event_mode=true;const label_current=camera.stream&&MMD_SA_options.user_camera.streamer_mode.camera_preference.label;MMD_SA.WebXR.user_camera.video_flipped=!!MMD_SA_options.user_camera.streamer_mode.camera_preference.video_flipped;const camera_result=await camera.start();if(!camera_result){MMD_SA.SpeechBubble.message(0,System._browser.translation.get("XR_Animator.UI.streamer_mode.webcam_not_accessible"),5*1e3);quit();return}if(label_current!=MMD_SA_options.user_camera.streamer_mode.camera_preference.label)msgs.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.webcam_on")+" ("+MMD_SA_options.user_camera.streamer_mode.camera_preference.label+")");let VMC_mode;if(webkit_electron_mode&&MMD_SA.THREEX.enabled){VMC_mode=!!MMD_SA_options.user_camera.streamer_mode.VMC_sender_enabled;if(VMC_mode){if(!MMD_SA.OSC.VMC.sender_enabled){MMD_SA_options.user_camera.streamer_mode.VMC_sender_enabled=MMD_SA.OSC.VMC.sender_enabled=true;msgs.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.VMC_protocol_on"));MMD_SA.OSC.VMC.send_camera_data=!!MMD_SA_options.user_camera.streamer_mode.VMC_send_camera_data;if(MMD_SA.OSC.VMC.send_camera_data)msgs.push("✅- "+System._browser.translation.get("XR_Animator.UI.streamer_mode.VMC_protocol_on.send_camera_data"));System._browser.update_tray()}}}if(!camera.ML_enabled){const mocap_type_raw=MMD_SA_options.user_camera.streamer_mode.mocap_type||(is_mobile?System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_initializing.face","en"):System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_initializing.full_body","en"));const mocap_type=MMD_SA_options.user_camera.streamer_mode.mocap_type||(is_mobile?System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_initializing.face"):System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_initializing.full_body"));msgs.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_initializing")+" ("+mocap_type+")...");show_status();await new Promise(resolve=>{_resolve=resolve;if(/Face|Full Body/.test(mocap_type_raw))window.addEventListener("SA_camera_facemesh_update",facemesh_loaded,{once:true});if(/Body/.test(mocap_type_raw))window.addEventListener("SA_camera_poseNet_update",check_model,{once:true});const promise=streamer_mode.init_mocap(mocap_type_raw);if(promise)promise.then(show_status)})}if(_x_quit){window.removeEventListener("SA_camera_poseNet_update",check_model);window.removeEventListener("SA_camera_facemesh_update",facemesh_loaded);window.removeEventListener("SA_camera_facemesh_calibrating",check_calibration);MMD_SA.SpeechBubble.list.forEach(sb=>{sb.hide()});quit();return}_resolve=null;MMD_SA.SpeechBubble.hide();if(VMC_mode){if(msgs.length){await new Promise(resolve=>{MMD_SA_options.Dungeon.run_event([[{message:{content:System._browser.translation.get("XR_Animator.UI.streamer_mode.finish_VMC"),para:sb_para,index:1,branch_list:[{key:1,event_id:{func:()=>{MMD_SA.hide_3D_avatar=true;System._browser.update_tray();resolve()},ended:true}},{key:"X",is_closing_event:true,event_id:{func:()=>{resolve()},ended:true}}]}}]])})}}else{if(msgs.length){await new Promise(resolve=>{MMD_SA_options.Dungeon.run_event([[{message:{content:System._browser.translation.get("XR_Animator.UI.streamer_mode.finish"),para:sb_para,index:1,branch_list:[{key:1,event_id:{func:()=>{System._browser.overlay_mode=1;resolve()},ended:true}},{key:"X",is_closing_event:true,event_id:{func:()=>{resolve()},ended:true}}]}}]])})}}if(!msgs.length)MMD_SA.SpeechBubble.message(0,"XR Animator is ready!",3e3);if(camera.initialized&&camera.visible)camera.hide();quit()}};return _streamer_mode})();var ML_warmed_up_status=[{},{}];var hidden_enforced=url_search_params.get("camera_hidden");var _display_floating;camera={initialized:false,get ML_enabled(){return ML_enabled},get ML_busy(){return _facemesh.busy||_poseNet.busy},get ML_fps(){return 1e3/(_poseNet.enabled&&_poseNet._t||_facemesh.enabled&&_facemesh._t||1e3)},get ML_warmed_up(){var warmed_up_status=ML_warmed_up_status[_poseNet.use_holistic?1:0];var facemesh_ready=!_facemesh.enabled||warmed_up_status.facemesh;var poseNet_ready=!_poseNet.enabled||warmed_up_status.poseNet;var handpose_ready=!_handpose.enabled||warmed_up_status.handpose;return facemesh_ready&&poseNet_ready&&handpose_ready},get target_devicePixelRatio(){return target_devicePixelRatio||window.devicePixelRatio},set target_devicePixelRatio(v){target_devicePixelRatio=v==window.devicePixelRatio?0:v},get double_flip_mode(){return double_flip_mode&&!camera.mirror_3D},set double_flip_mode(v){double_flip_mode=v},get video_flipped(){return!ML_enabled?video_flipped:!!video_flipped^!!camera.double_flip_mode},set video_flipped(v){video_flipped=v;this.reset_video_canvas()},get display_flipped(){return camera.mirror_3D?false:video_flipped!=camera.video_flipped},get mirror_3D(){return!ML_enabled||!MMD_SA_options.user_camera.mirror_3D?false:MMD_SA_options.user_camera.mirror_3D==1?camera.visible:true},get x_flipped(){return camera.double_flip_mode||camera.mirror_3D},get hidden_enforced(){return hidden_enforced||(MMD_SA_options.user_camera.display.video.hidden==null?!!this.stream:MMD_SA_options.user_camera.display.video.hidden)||System._browser.overlay_mode>0||this.stream&&MMD_SA_options.user_camera.display.video.hidden_on_webcam},get display_floating(){return MMD_SA_options.user_camera.display.floating||_display_floating},set display_floating(v){_display_floating=v;if(this.video_host)this.video_host.style.zIndex=this.display_floating?2:0},get video_timestamp(){return camera.video.currentTime==null?performance.now()/2:camera.video.currentTime*1e3},get video_frame_id(){const t=this.video_timestamp/1e3;const t_int=Math.floor(t);return t_int+":"+Math.floor((t-t_int)*30+1)},get is_local_media(){return this.local_src&&!this.stream},get is_local_video(){return this.is_local_media&&this.video.currentTime!=null},get is_local_photo(){return this.is_local_media&&this.video.currentTime==null},DEBUG_show:(()=>{let msg_last="";let _DEBUG_msg="";let timestamp=0;let msg_list=[];window.addEventListener("MMDStarted",()=>{System._browser.on_animation_update.add(()=>{msg_list=msg_list.filter(m=>RAF_timestampm.msg).join("\n")+"\n":"";DEBUG_msg=_DEBUG_msg+msg_last},0,0,-1)});return function(msg,hide_sec,always_visible){if(!camera.ML_enabled||!_poseNet.data_detected&&!_facemesh.data_detected){DEBUG_show(msg,hide_sec,always_visible);return}if(hide_sec){msg_list.push({msg:msg,duration:hide_sec*1e3,timestamp:RAF_timestamp});return}if(timestamp!=RAF_timestamp){timestamp=RAF_timestamp;msg_last=""}msg_last=(msg_last?msg_last+"\n":msg_last)+msg;DEBUG_msg=_DEBUG_msg+msg_last}})(),motion_recorder:motion_recorder,tilt_adjustment:{enabled:false,angle:0,pose_weight:.5},camera_list:null,deviceId:null,start:async function(src){async function request_camera(){try{stream=await navigator.mediaDevices.getUserMedia(constraints);return stream}catch(err){console.error(err)}}var AR_options=MMD_SA_options.WebXR&&MMD_SA_options.WebXR.AR;MMD_SA.reset_camera();this._camera_reset=MMD_SA._trackball_camera.object.clone();if(this.initialized&&!streamer_mode.running){if(this.visible){this.hide();DEBUG_show("User camera:HIDDEN",2);return}}var constraints={video:this.set_constraints()};try{if(src){this.init_stream(src)}else{if(is_mobile){constraints.video.facingMode="user"}if(MMD_SA_options.Dungeon){MMD_SA_options.Dungeon.run_event([[{message:{get content(){return System._browser.translation.get("XR_Animator.UI.webcam_media.finding_camera")}}},{goto_branch:0}]])}let stream;if(is_mobile){if(!this.stream)stream=await request_camera();if(MMD_SA_options.Dungeon)MMD_SA_options.Dungeon.run_event(null,0,2);if(!this.stream&&!stream){DEBUG_show("(Camera not accessible)",3);return}}else{let list=this.camera_list;if(!list){try{list=await navigator.mediaDevices.enumerateDevices();list=list.filter(d=>d.kind=="videoinput");const preference=MMD_SA_options.user_camera.streamer_mode.camera_preference&&{label:{test:s=>s.indexOf(MMD_SA_options.user_camera.streamer_mode.camera_preference.label)!=-1}}||MMD_SA_options.user_camera.preference;list.sort((a,b)=>preference?.label?.test(a.label)&&-1||preference?.label?.test(b.label)&&1||/warudo/i.test(a.label)&&1||/warudo/i.test(b.label)&&-1||0);this.camera_list=list=list.slice(0,7);if(streamer_mode.running&&!list.length)throw new Error("(No camera detected)")}catch(err){console.error(err);if(MMD_SA_options.Dungeon)MMD_SA_options.Dungeon.run_event(null,0,2);DEBUG_show("(No camera detected)",3);return}}let canceled;if(MMD_SA_options.Dungeon){await new Promise(resolve=>{MMD_SA_options.Dungeon.run_event([[{message:{get content(){return(list.length?System._browser.translation.get("XR_Animator.UI.webcam_media.choose_an_input")+list.map((d,idx)=>"\n"+(idx+1)+". "+d.label.substring(0,25)).join(""):System._browser.translation.get("XR_Animator.UI.webcam_media.no_camera"))+"\n"+(list.length+1)+". "+System._browser.translation.get("XR_Animator.UI.webcam_media.local_media_file")+"\n"+(list.length+2)+". "+System._browser.translation.get("Misc.cancel")},para:{row_max:11,no_word_break:true},bubble_index:3,branch_list:list.map((d,idx)=>{return{key:idx+1,branch_index:idx+1}}).concat([{key:Math.min(list.length+1,8),branch_index:Math.min(list.length+1,8)},{key:Math.min(list.length+2,9),is_closing_event:true,branch_index:Math.min(list.length+2,9)}])}}]].concat(list.map(d=>[{func:()=>{const label=d.label;MMD_SA_options.user_camera.streamer_mode.camera_preference=Object.assign(MMD_SA_options.user_camera.streamer_mode.camera_preference||{},{label:label,video_flipped:!!video_flipped});list.sort((a,b)=>a.label==label&&-1||b.label==label&&1||0);constraints.video.deviceId=d.deviceId;resolve()},ended:true}]).concat([[{func:()=>{if(camera.local_src){src=camera.local_src;resolve();return true}else{DEBUG_show("(No local media file found)",3);MMD_SA_options.Dungeon.run_event(null,0,0)}}}],[{func:()=>{canceled=true;resolve()},ended:true}]])));if(streamer_mode.running&&MMD_SA_options.user_camera.streamer_mode.camera_preference?.label){MMD_SA_options.Dungeon.run_event(null,1,0)}})}if(canceled){DEBUG_show("(Canceled)",2);return}if(!src&&constraints.video.deviceId!=this.deviceId){stream=await request_camera();if(!stream){DEBUG_show("(Camera not accessible)",3);return}}}if(src){camera.init_stream(src)}else if(stream){camera.init_stream(stream);this.deviceId=constraints.video.deviceId}if(AR_options&&AR_options.dom_overlay)AR_options.dom_overlay.use_dummy_webgl=true;DEBUG_show("(User camera:ON)",2)}if(!this.visible){this.show();DEBUG_show("User camera:VISIBLE",2)}return streamer_mode.running}catch(err){if(MMD_SA_options.Dungeon&&MMD_SA_options.Dungeon.event_mode)MMD_SA_options.Dungeon.run_event({ended:true});camera.init_stream();console.error(err);DEBUG_show("(ERROR: Camera unavailable, using fallback video instead)",3)}},init_stream:function(stream){if(!this.initialized){this.video=this._video=document.createElement("video");this.video.autoplay=true;let vs;this.video_host=document.createElement("div");vs=this.video_host.style;vs.position="absolute";vs.left="0px";vs.top="0px";vs.zIndex=this.display_floating?2:0;vs.visibility=System._browser.overlay_mode?"hidden":"inherit";vs.display=System._browser.overlay_mode?"none":"block";SL_Host.appendChild(this.video_host);this.video_canvas=document.createElement("canvas");vs=this.video_canvas.style;vs.position="absolute";vs.left="0px";vs.top="0px";vs.zIndex=0;vs.visibility="hidden";this.video_host.appendChild(this.video_canvas);this.video_canvas_bodyPix=document.createElement("canvas");vs=this.video_canvas_bodyPix.style;vs.position="absolute";vs.left="0px";vs.top="0px";vs.zIndex=0;vs.visibility="hidden";this.video_host.appendChild(this.video_canvas_bodyPix);this.video_canvas_face_detection=document.createElement("canvas");vs=this.video_canvas_face_detection.style;vs.position="absolute";vs.left="0px";vs.top="0px";vs.zIndex=0;vs.visibility="hidden";this.video_host.appendChild(this.video_canvas_face_detection);this.video_canvas_facemesh=document.createElement("canvas");vs=this.video_canvas_facemesh.style;vs.position="absolute";vs.left="0px";vs.top="0px";vs.zIndex=0;vs.visibility="hidden";this.video_host.appendChild(this.video_canvas_facemesh);is_mobile&&window.addEventListener("resize",function(){camera.video_track?.applyConstraints(camera.set_constraints()).then(function(){DEBUG_show("(camera size updated)",2)})["catch"](function(err){DEBUG_show("ERROR:camera size failed to update")})});navigator.mediaDevices.addEventListener("devicechange",()=>{console.log("mediaDevices: new device detected");this.camera_list=null})}this.initialized=true;this.show();if(this.stream){this.stream.getTracks().forEach(track=>{track.stop()});this.video.srcObject=this.stream=this.video_track=this.deviceId=null;console.log("(Previous stream stopped)")}if(!stream||typeof stream=="string"){video_fallback(stream)}else{this.stream=stream;this.video_id=stream.id;this.video_track=stream.getVideoTracks()[0];this.video=this._video;this.video.srcObject=stream;console.log("(New stream started)");setTimeout(function(){let capabilities=camera.video_track.getCapabilities?.();if(!capabilities)return;System._browser.console.log(Object.entries(capabilities).map(s=>s[0]+":"+JSON.stringify(s[1])).join("\n"));let settings=camera.video_track.getSettings();const para=Object.entries(settings).map(s=>s[0]+":"+JSON.stringify(s[1])).join("\n");console.log("MediaTrackCapabilities",para);if(is_mobile)System._browser.console.log()},2e3)}if(_facemesh.enabled)_facemesh.reset_calibration()},get use_armIK(){return _poseNet.enabled||_handpose.enabled||_facemesh.enabled},bodyPix:function(){var net;var enabled=false;_bodyPix={get enabled(){return enabled},set enabled(v){if(enabled==!!v)return;enabled=!!v;const SL=MMD_SA.THREEX.SL;if(enabled){MMD_SA._renderer.devicePixelRatio=1;MMD_SA._renderer.__resize(EV_width,EV_height);SL.style.visibility="hidden"}else{MMD_SA._renderer.devicePixelRatio=window.devicePixelRatio;MMD_SA._renderer.__resize(EV_width,EV_height);SL.style.visibility="inherit";camera.video_canvas_bodyPix.style.visibility="hidden"}},busy:0,mask:null,allPoses:null,use_bodySegmentation:true,load:async function(options){this.enabled=true;if(net)return;if(!this.mask){this.mask=document.createElement("canvas");face_detection.load_face_cover()}if(this.use_bodySegmentation){const model=bodySegmentation.SupportedModels.MediaPipeSelfieSegmentation;const segmenterConfig={runtime:"mediapipe",solutionPath:"https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation"};net=await bodySegmentation.createSegmenter(model,segmenterConfig)}else{net=await bodyPix.load(options||(1||is_mobile)?{architecture:"MobileNetV1",outputStride:16,multiplier:.5,quantBytes:2}:{architecture:"ResNet50",outputStride:32,quantBytes:2})}console.log("bodyPix loaded")},segmentPerson:async function(image,options){await this.load();if(this.use_bodySegmentation){return await net.segmentPeople(image)}else{return await net.segmentPerson(image,options||{flipHorizontal:false,internalResolution:"medium",segmentationThreshold:.7})}},toMask:async function(image,options_seg,options){const seg=await this.segmentPerson(image,options_seg);options=options||{foregroundColor:{r:0,g:0,b:0,a:255},backgroundColor:{r:0,g:0,b:0,a:0}};if(this.use_bodySegmentation){return await bodySegmentation.toBinaryMask(seg,options.foregroundColor,options.backgroundColor)}else{this.allPoses=seg.allPoses;return bodyPix.toMask(seg,options.foregroundColor,options.backgroundColor)}},update_frame:async function(image=camera.video_canvas,options_seg,options_mask,options_draw){const SL=MMD_SA.THREEX.SL;if(System._browser.snapshot.check_bodyPix()){camera.video_canvas.style.visibility="inherit";camera.video_canvas_bodyPix.style.visibility="hidden";SL.style.visibility="inherit";return}if(this.busy)return;this.busy=RAF_timestamp;const mask=await this.toMask(image,options_seg,options_mask);this.busy=0;if(!this.enabled)return;if(this.mask.width!=mask.width||this.mask.height!=mask.height){this.mask.width=mask.width;this.mask.height=mask.height}this.mask.getContext("2d").putImageData(mask,0,0);const w=SL.width;const h=SL.height;if(camera.video_canvas_bodyPix.width!=w||camera.video_canvas_bodyPix.height!=h){camera.video_canvas_bodyPix.width=w;camera.video_canvas_bodyPix.height=h}const ar=w/h/(image.width/image.height);const ww=Math.round(w*Math.min(1/ar,1));const hh=Math.round(h*Math.min(ar,1));const xx=(w-ww)/2;const yy=(h-hh)/2;const context=camera.video_canvas_bodyPix.getContext("2d");context.globalCompositeOperation="copy";context.filter="blur("+Math.ceil(3/window.devicePixelRatio)+"px)";context.drawImage(this.mask,0,0,mask.width,mask.height,xx,yy,ww,hh);context.globalCompositeOperation="source-out";context.filter="none";context.save();if(camera.mirror_3D){context.translate(w,0);context.scale(-1,1)}context.drawImage(SL,0,0);context.restore();context.globalCompositeOperation="destination-over";context.drawImage(image,0,0,image.width,image.height,xx,yy,ww,hh);camera.video_canvas_bodyPix.style.visibility="inherit";SL.style.visibility="hidden";this.update_frame_for_face_detection();System._browser.snapshot.check_bodyPix()},update_frame_for_face_detection:function(){let face_cover=face_detection.face_cover;if(!face_detection.enabled||!face_cover.complete)return;camera.video_canvas_face_detection.style.visibility="hidden";let cw=face_cover.width;let ch=face_cover.height;let dets=[];this.allPoses.forEach(function(pose){let keypoints=pose.keypoints;let nose=keypoints.find(kp=>kp.part=="nose");if(!nose)return;let leftEye=keypoints.find(kp=>kp.part=="leftEye");let rightEye=keypoints.find(kp=>kp.part=="rightEye");let dim;if(leftEye&&rightEye){let x_diff=leftEye.position.x-rightEye.position.x;let y_diff=leftEye.position.y-rightEye.position.y;dim=Math.sqrt(x_diff*x_diff+y_diff*y_diff)*4}else{dim=ch}dets.push([nose.position.y,nose.position.x,Math.max(dim,ch/2),100])});this.allPoses=undefined;face_detection.update_frame_local(camera.video_canvas_bodyPix,dets)}};return _bodyPix}(),face_detection:function(){var enabled=false;function init(){face_detection.initialized=true;if(!self.OffscreenCanvas)face_detection.load_face_cover();fd_worker=new Worker("js/pico.worker.js");fd_worker.onmessage=function(e){var data=typeof e.data=="string"&&e.data.charAt(0)==="{"?JSON.parse(e.data):e.data;if(typeof data==="string"){DEBUG_show(data,2);face_detection.worker_initialized=true}else{camera._needs_RAF=true;if(data._t)DEBUG_show(data._t);face_detection.dets=data.dets;face_detection.busy=0;camera.video_canvas_face_detection.style.left=camera.video_canvas.style.left;camera.video_canvas_face_detection.style.top=camera.video_canvas.style.top;if(!self.OffscreenCanvas){System._browser.on_animation_update.add(function(){face_detection.update_frame_local(null,face_detection.dets)},0,0)}}face_detection.update_frame()}}face_detection={initialized:false,worker_initialized:false,get enabled(){return enabled},set enabled(v){if(enabled==!!v)return;enabled=!!v;if(enabled){this.dets=null;if(!this.initialized)init()}else{if(camera.initialized)camera.video_canvas_face_detection.style.visibility="hidden"}},load_face_cover:function(){if(!this.face_cover){this.face_cover=new Image;this.face_cover.src="images/laughing_man_134x120.png"}},dets:null,camera_video_timestamp:0,update_frame:function(delay_update){function update_worker(){var ready=face_detection.enabled&&face_detection.worker_initialized&&camera_video_timestamp&&!face_detection.busy&&video_capture_active&&face_detection.camera_video_timestamp!=camera_video_timestamp;if(!ready)return;face_detection.busy=RAF_timestamp;face_detection.camera_video_timestamp=camera_video_timestamp;face_detection.camera_video_frame_id=camera_video_frame_id;camera.video_canvas_face_detection.style.visibility="inherit";let video_canvas,w,h;video_canvas=camera.video_canvas;w=video_canvas.width;h=video_canvas.height;let rgba=video_canvas.getContext("2d").getImageData(0,0,w,h).data.buffer;let cs=camera.video_canvas_face_detection.style;if(cs.width!=video_canvas.style.width||cs.height!=video_canvas.style.height){cs.width=video_canvas.style.width;cs.height=video_canvas.style.height}let data={rgba:rgba,w:w,h:h};if(!camera.video_canvas_face_detection._offscreen&&self.OffscreenCanvas){data.canvas=camera.video_canvas_face_detection.transferControlToOffscreen();camera.video_canvas_face_detection._offscreen=true;console.log("(Face detection: use offscreen canvas)")}fd_worker.postMessage(data,data.canvas?[data.canvas,data.rgba]:[data.rgba]);data.rgba=rgba=undefined;data=undefined}if(delay_update||self.PoseAT){setTimeout(()=>{update_worker()},0)}else{update_worker()}},update_frame_local:function(canvas,dets){let ww=camera.video_canvas.width;let hh=camera.video_canvas.height;let context;if(!canvas){canvas=camera.video_canvas_face_detection;if(canvas.width!=ww||canvas.height!=hh){canvas.width=ww;canvas.height=hh}context=canvas.getContext("2d");context.clearRect(0,0,ww,hh)}else{context=canvas.getContext("2d")}context.globalCompositeOperation="source-over";let face_cover=this.face_cover;let cw=face_cover.width;let ch=face_cover.height;let h,w,x,y;if(dets.length){let scale=1;dets.forEach(function(det){h=det[2]*scale;w=h*cw/ch;x=det[1]*scale-w/2;y=det[0]*scale-h/2;context.drawImage(face_cover,0,0,cw,ch,x,y,w,h)})}else{h=Math.min(ww,hh);w=h*cw/ch;x=(ww-w)/2;y=(hh-h)/2;context.drawImage(face_cover,0,0,cw,ch,x,y,w,h)}}};return face_detection}(),streamer_mode:streamer_mode,facemesh:function(){var enabled=false;var calibration_timestamp=0;var calibration_percent=0;var calibrating=true;var lips_width_average=0;var lips_width_data=[];var eyebrow_data;var eye_data;var neck_length_average;var neck_length_data=[];var blink_detection;var auto_blink=false;var blendshape_accumulated;var facemesh_type=-1;var video_id;function reset_calibration(enforced){if(!enforced&&video_id&&video_id==camera.video_id)return;video_id=camera.video_id;calibration_timestamp=0;calibration_percent=0;calibrating=true;lips_width_average=0;lips_width_data=[];eyebrow_data={};eye_data={L:[],R:[]};neck_length_average=0;neck_length_data=[];var eye_data_height_ref_pts={L:[159,145],R:[386,374]};["L","R"].forEach(function(dir){for(var i=0;i<1;i++){let data=eye_data[dir][i]={};data.index=i;data._eye_open_average=0;data.eye_open_average=0;data.eye_open_lower=999;data.eye_open_data=[];data.height_ref_pts=eye_data_height_ref_pts[dir]}eyebrow_data[dir]={_height_average:0,height_average:0,height_data:[],height_ref_pts:dir=="R"?[334,330]:[105,101]}});blendshape_accumulated={sad:0,angry:0,surprise:0,blush:0,tongue_out:0}}var auto_blink_default;var _v3=[];var use_faceLandmarksDetection,use_human_facemesh,use_mediapipe_facemesh;use_faceLandmarksDetection=!is_mobile;use_mediapipe_facemesh=!is_chrome||is_mobile;var TRIANGULATION;function init(){if(_facemesh.initialized)return;_facemesh.initialized=true;for(var i=0;i<4;i++)_v3[i]=new THREE.Vector3;var params=[];if(System._browser.use_WASM_SIMD){params.push("simd=1")}if(use_holistic){use_faceLandmarksDetection=true}if(use_mediapipe_facemesh){use_faceLandmarksDetection=true;params.push("use_mediapipe_facemesh=1")}if(use_faceLandmarksDetection){use_faceLandmarksDetection=true;if(_facemesh.blink_detection==null)_facemesh.blink_detection=true;params.push("use_face_landmarks=1")}if(use_human_facemesh){params.push("use_human_facemesh=1")}var promise;if(MMD_SA_options.user_camera.ML_models.facemesh.worker_disabled){promise=new Promise((resolve,reject)=>{fm_worker={postMessage:function(msg,transfer){FacemeshAT.onmessage({data:msg})}};let script=document.createElement("script");script.onload=async function(){await FacemeshAT.init(fm_worker,params);resolve()};script.src="js/facemesh_lib.js";document.head.appendChild(script)})}else{fm_worker=new Worker("js/facemesh_worker.js"+(params.length?"?"+params.join("&"):""))}fm_worker.onmessage=facemesh_worker_onmessage;return promise}function drawPath(ctx,points,closePath){const region=new Path2D;region.moveTo(points[0][0]/2,points[0][1]/2);for(let i=1;i<3;i++){const point=points[i];region.lineTo(point[0]/2,point[1]/2)}if(closePath){region.closePath()}ctx.stroke(region)}const faceBlendshapes_list=["_neutral","BrowInnerUp","BrowDownLeft","BrowDownRight","BrowOuterUpLeft","BrowOuterUpRight","EyeLookUpLeft","EyeLookUpRight","EyeLookDownLeft","EyeLookDownRight","EyeLookInLeft","EyeLookInRight","EyeLookOutLeft","EyeLookOutRight","EyeBlinkLeft","EyeBlinkRight","EyeSquintRight","EyeSquintLeft","EyeWideLeft","EyeWideRight","CheekPuff","CheekSquintLeft","CheekSquintRight","NoseSneerLeft","NoseSneerRight","JawOpen","JawForward","JawLeft","JawRight","MouthFunnel","MouthPucker","MouthLeft","MouthRight","MouthRollUpper","MouthRollLower","MouthShrugUpper","MouthShrugLower","MouthClose","MouthSmileLeft","MouthSmileRight","MouthFrownLeft","MouthFrownRight","MouthDimpleLeft","MouthDimpleRight","MouthUpperUpLeft","MouthUpperUpRight","MouthLowerDownLeft","MouthLowerDownRight","MouthPressLeft","MouthPressRight","MouthStretchLeft","MouthStretchRight","TongueOut"];let faceBlendshapes_index;const MMD_morph_list=["あ","い","う","え","お","にやり","ω","口角上げ","口角下げ","ぺろっ","上","下","にこり","困る","怒り","照れ","まばたき","笑い","びっくり","まばたきL","まばたきR"];var facemesh_worker_onmessage=function(){function build_faceBlendshapes_index(b){if(!b||faceBlendshapes_index)return;faceBlendshapes_index={};b.categories.forEach((c,i)=>{const n=c.categoryName;faceBlendshapes_index[n.charAt(0)+n.substring(1)]=i})}var _info_extra_facemesh;var fps=0,fps_count=0,fps_ms=0,fps_timestamp=0;const facemesh_filter={};window.addEventListener("jThree_ready",()=>{for(const name of MMD_morph_list.concat(["両目"])){facemesh_filter[name]=new System._browser.data_filter([{type:"one_euro",id:name,para:name=="両目"?[30,1,5,1,4]:[30,1,1,1,1]}])}});return function(e){var data=typeof e.data=="string"&&e.data.charAt(0)==="{"?JSON.parse(e.data):e.data;if(typeof data==="string"){if(data=="OK"){_facemesh.worker_initialized=true}else{DEBUG_show(data,2);System._browser.console.log(data)}}else if(data.posenet){pose_worker_onmessage({data:data})}else if(_facemesh.enabled){window.dispatchEvent(new CustomEvent("SA_camera_facemesh_update"));camera._needs_RAF=true;const warmed_up_status=ML_warmed_up_status[_poseNet.use_holistic?1:0];if(!warmed_up_status.facemesh){warmed_up_status.facemesh=true;DEBUG_show("Facemesh ML ready",2)}let info="";if(data.faces.length){_facemesh.data_detected++}else{_facemesh.data_detected=0}if(data.faces.length&&data.faces[0].bb_center){bb_center=data.faces[0].bb_center}else if(!_poseNet.enabled){bb_center=[.5,.5]}if(data.faces.length&&_facemesh.data_detected_stable){let face=data.faces[0];build_faceBlendshapes_index(face.faceBlendshapes);let sign_flip=camera.x_flipped?1:-1;const motion_control_data={facemesh_data:face};let x_rot,y_rot,z_rot;if(face.rotation){const rm=face.rotation.matrix;rot_m4.set(rm[0],rm[1],rm[2],0,rm[3],rm[4],rm[5],0,rm[6],rm[7],rm[8],0,0,0,0,1)}else{let y_axis=MMD_SA._v3a_.fromArray(face.mesh[152]).sub(MMD_SA._v3b.fromArray(face.mesh[10])).normalize();let x_axis=MMD_SA._v3b_.fromArray(face.mesh[454]).sub(MMD_SA._v3b.fromArray(face.mesh[234])).normalize();let z_axis=MMD_SA.TEMP_v3.crossVectors(x_axis,y_axis).normalize();x_axis.crossVectors(y_axis,z_axis);rot_m4.set(x_axis.x,x_axis.y,x_axis.z,0,y_axis.x,y_axis.y,y_axis.z,0,z_axis.x,z_axis.y,z_axis.z,0,0,0,0,1)}let xyz=MMD_SA.TEMP_v3.setEulerFromRotationMatrix(rot_m4,"YZX");x_rot=-xyz.x;y_rot=-xyz.y;z_rot=-xyz.z;let _x_diff=face.scaledMesh[454][0]-face.scaledMesh[234][0];let _y_diff=face.scaledMesh[454][1]-face.scaledMesh[234][1];let _dis;if(data.recalculate_z_rotation_from_scaledMesh){_x_diff/=Math.cos(y_rot);_y_diff/=Math.cos(x_rot);_dis=Math.sqrt(_x_diff*_x_diff+_y_diff*_y_diff)}else{_x_diff/=Math.cos(z_rot);_dis=Math.abs(_x_diff/Math.cos(y_rot))}_facemesh.face_width=_dis;let _z_rot;if(data.recalculate_z_rotation_from_scaledMesh){_z_rot=Math.asin(_y_diff/_dis)}else{_z_rot=z_rot}let rot=new THREE.Quaternion;let rot_v3=MMD_SA._v3a.set(x_rot,y_rot*sign_flip,_z_rot*sign_flip);rot.setFromEuler(rot_v3,"YZX");_facemesh.calculate_neck_data({is_face:true,timestamp:_facemesh.camera_video_frame_id,f_axis:v3a.set(face.scaledMesh[454][0],face.scaledMesh[454][1],0).add(MMD_SA.TEMP_v3.set(face.scaledMesh[234][0],face.scaledMesh[234][1],0)).multiplyScalar(.5).setZ(0).toArray(),face_width:_facemesh.face_width,face_rot:rot.toArray()});const motion_para=MMD_SA.MMD.motionManager.para_SA;let tilt_angle=0;let tilt_adjustment=motion_para.motion_tracking?.camera?.tilt_adjustment||camera.tilt_adjustment;if(tilt_adjustment.enabled){tilt_angle=tilt_adjustment.angle*Math.PI/180;const q_tilt=MMD_SA._q2.set(Math.sin(tilt_angle/2),0,0,Math.cos(tilt_angle/2));rot.premultiply(q_tilt)}let t_now=camera.video_timestamp;let _t=0;if(fps_timestamp){_t=Math.max(Math.min(t_now-fps_timestamp,1e3),10);fps_ms+=_t;if(++fps_count>=20){fps=1e3/(fps_ms/fps_count);fps_count=fps_ms=0}}fps_timestamp=t_now;_facemesh._t=data._t;frames.t_delta=fps&&1e3/fps||_t||data.fps&&1e3/data.fps||data._t;_info_extra_facemesh="";if(_facemesh.head_pose_enabled){if(System._browser.motion_control.enabled)motion_control_data.head_rot=MMD_SA._v3a.clone();frames.add("skin|facemesh","首",{after_IK:true,rot:rot,_rot_ratio:_facemesh.face_width/Math.min(camera.video_canvas.width,camera.video_canvas.height),onProcessRotation:process_head_rotation})}calibration_timestamp+=Math.min(data._t,75);if(calibrating){calibration_percent=~~(Math.min(calibration_timestamp/5e3,lips_width_data.length/60,blink_detection?eye_data.L[0].eye_open_data.length/60:1,_poseNet.enabled?neck_length_data.length/60:1,1)*100);calibrating=calibration_percent<100;window.dispatchEvent(new CustomEvent("SA_camera_facemesh_calibrating",{detail:{percent:calibration_percent}}))}let calibration_condition=face.faceInViewConfidence>(use_human_facemesh?.75:.9)&&(camera.video==camera._image||!camera.video.paused&&Math.abs(y_rot)a-b).slice(edge_size,lips_width_data.length-edge_size).reduce((accumulator,currentValue)=>accumulator+currentValue)/(lips_width_data.length-edge_size*2);if(!calibrating){lips_width_average=_lips_width_average}}}let mouth_open_x=0;let mouth_wide=0;let eyebrow_up=0;let smile=0;["L","R"].forEach(function(dir){let e=eyebrow_data[dir];e.height=face.faceBlendshapes?Math.max(face.faceBlendshapes.categories[faceBlendshapes_index["eyeSquint"+(dir=="L"?"Left":"Right")]].score,.01):MMD_SA._v3a.fromArray(face.mesh[e.height_ref_pts[0]]).distanceTo(MMD_SA._v3b.fromArray(face.mesh[e.height_ref_pts[1]]));e._height_average=e.height_average;if(!e._height_average){if(calibration_condition)e.height_data.push(e.height);if(!e.height_data.length){e._height_average=e.height}else{let edge_size=parseInt(lips_width_data.length*.3);e._height_average=e.height_data.sort((a,b)=>a-b).slice(edge_size,e.height_data.length-edge_size).reduce((accumulator,currentValue)=>accumulator+currentValue)/(e.height_data.length-edge_size*2);if(!calibrating){e.height_average=e._height_average}}}eyebrow_up+=e.height/e._height_average});eyebrow_up/=2;eyebrow_up=(eyebrow_up-1)/.25*(eyebrow_up>1?2:1);if(_lips_width_average){if(lips_width>_lips_width_average*1.05){mouth_wide=Math.sqrt(Math.min((lips_width-_lips_width_average*1.05)/(_lips_width_average*.25),1))}else if(lips_width<_lips_width_average*.98){mouth_wide=-Math.sqrt(Math.min((_lips_width_average*.98-lips_width)/(_lips_width_average*.2),1))}if(lips_inner_height>2){mouth_open_x=Math.pow(Math.min((lips_inner_height-2)/(_lips_width_average*1/3),1),.5);if(mouth_wide>.25)smile=(mouth_wide-.25)/.75*.3}}let happy=0;let sad=0;let angry=0;let fear=0;let surprise=0;let tongue_out=0;const face_factor=_facemesh.face_width/Math.min(camera.video_canvas.width,camera.video_canvas.height);const _blink_factor=MMD_SA.MMD.motionManager.para_SA.motion_tracking_upper_body_only||face_factor>.2?1:Math.max(1-(.2-face_factor)*8,0);let blink={L:[0],R:[0]};if(use_faceLandmarksDetection){["L","R"].forEach(function(dir){let i=0;blink[dir][i]=0;let LR=eye_data[dir][i];let e_data=face.faceBlendshapes?Math.max(1-face.faceBlendshapes.categories[faceBlendshapes_index["eyeBlink"+(dir=="L"?"Left":"Right")]].score*.9,.2):MMD_SA._v3a.fromArray(face.mesh[LR.height_ref_pts[0]]).distanceTo(MMD_SA._v3b.fromArray(face.mesh[LR.height_ref_pts[1]]));let _eye_open_average=LR.eye_open_average;if(!_eye_open_average){if(calibration_condition){LR.eye_open_data.push(e_data);let edge_size=parseInt(LR.eye_open_data.length*.3);_eye_open_average=LR.eye_open_data.sort((a,b)=>a-b).slice(edge_size,LR.eye_open_data.length-edge_size).reduce((accumulator,currentValue)=>accumulator+currentValue)/(LR.eye_open_data.length-edge_size*2);if(!calibrating){LR.eye_open_average=_eye_open_average}}else{_eye_open_average=LR._eye_open_average}}if(calibration_condition){if(LR.eye_open_lower>e_data)LR.eye_open_lower=e_data}LR._eye_open_average=_eye_open_average;if(_eye_open_average){if(e_data>_eye_open_average){blink[dir][i]=Math.min(e_data/_eye_open_average,1.25)}else{let _eye_open_lower=Math.min(LR.eye_open_lower,_eye_open_average/2);blink[dir][i]=Math.max((e_data-_eye_open_lower)/(_eye_open_average-_eye_open_lower),0)}}})}const use_faceBlendshapes=MMD_SA.THREEX.get_model(0).use_faceBlendshapes;if(face.faceBlendshapes){const b=face.faceBlendshapes.categories;const blink=[b[faceBlendshapes_index["eyeBlinkLeft"]].score,b[faceBlendshapes_index["eyeBlinkRight"]].score];blink.forEach((v,i)=>{const d=i==0?"L":"R";const e_data=eye_data[d][0];const eyeBlink_upper=1-(1-Math.max(e_data._eye_open_average||0,.5))*.8;const eyeBlink_lower=Math.min(e_data.eye_open_lower,.3);const blink_range=eyeBlink_upper-eyeBlink_lower;v=Math.min(Math.max(v-(1-eyeBlink_upper),0)/blink_range,1);blink[i]=v<.5?Math.pow(v*2,1.5)/2:Math.pow((v-.5)*2,.667)/2+.5});const use_eye_LR=!_facemesh.blink_sync;const blink_factor=(use_eye_LR?Math.min(Math.abs(blink[0]-blink[1])/.4,1):0)*_blink_factor;let blink0=use_eye_LR?Math.min(...blink):(blink[0]+blink[1])/2;b[faceBlendshapes_index["eyeBlinkLeft"]].score=blink[0]*blink_factor+blink0*(1-blink_factor);b[faceBlendshapes_index["eyeBlinkRight"]].score=blink[1]*blink_factor+blink0*(1-blink_factor);for(const p of["eyeSquintLeft","eyeSquintRight"]){const d=p=="eyeSquintLeft"?"L":"R";const eyeSquint_factor=Math.min(Math.max((eyebrow_data[d]._height_average||0)*.8,.2),.5);b[faceBlendshapes_index[p]].score=Math.max(b[faceBlendshapes_index[p]].score-eyeSquint_factor,0)/(1-eyeSquint_factor)}const mouthPucker_factor=Math.min(Math.max((_lips_width_average||0)*.8,.2),.6);b[faceBlendshapes_index["mouthPucker"]].score=Math.pow(Math.max(b[faceBlendshapes_index["mouthPucker"]].score-mouthPucker_factor,0)/(1-mouthPucker_factor),2);if(use_faceBlendshapes){b.forEach(c=>{const n=c.categoryName;let name=n.charAt(0).toUpperCase()+n.substring(1);name=name.indexOf("Left")!=-1?name.replace("Left","Right"):name.replace("Right","Left");frames.add("morph|facemesh",name,{weight:c.score})})}}if(Array.isArray(face.emotion)){face.emotion.forEach(e=>{switch(e.emotion){case"happy":happy+=e.score;break;case"sad":sad+=e.score;break;case"angry":case"disgust":angry+=e.score;break;case"fear":fear+=e.score;break;case"surprise":surprise+=e.score;break}})}const modelX=MMD_SA.THREEX.get_model(0);if(face.faceBlendshapes){const is_VRM=modelX.type=="VRM";const b=face.faceBlendshapes.categories;let jawOpen=b[faceBlendshapes_index["jawOpen"]].score;let smile=(b[faceBlendshapes_index["mouthSmileLeft"]].score+b[faceBlendshapes_index["mouthSmileRight"]].score)/2;let mouth_up=(b[faceBlendshapes_index["mouthUpperUpLeft"]].score+b[faceBlendshapes_index["mouthUpperUpRight"]].score)/2;let mouth_down=(b[faceBlendshapes_index["mouthLowerDownLeft"]].score+b[faceBlendshapes_index["mouthLowerDownRight"]].score)/2;let mouthPucker=b[faceBlendshapes_index["mouthPucker"]].score;let mouthFunnel=b[faceBlendshapes_index["mouthFunnel"]].score;let mouthShrugLower=b[faceBlendshapes_index["mouthShrugLower"]].score;mouthShrugLower*=mouthShrugLower;const f_sad=.3*(x_rot>0?1-Math.min(x_rot/(Math.PI/12),1):1);sad=Math.min(Math.max(mouthShrugLower-f_sad,0)/.7,1);if(x_rot<0){const f=Math.min(Math.abs(x_rot)/(Math.PI/4),1);sad=Math.pow(Math.max(sad-f*.5,0)/(1-f*.5),f*3)}let browInnerUp=b[faceBlendshapes_index["browInnerUp"]].score;browInnerUp*=browInnerUp;let brow_up=(b[faceBlendshapes_index["browOuterUpLeft"]].score+b[faceBlendshapes_index["browOuterUpRight"]].score)/2;let brow_down=(b[faceBlendshapes_index["browDownLeft"]].score+b[faceBlendshapes_index["browDownRight"]].score)/2;let a=0,i=0,u=0,e=0,o=0;const jawOpen_max_ini=.3;if(jawOpen<.2){if(mouthPucker>.1){u=mouthPucker;if(mouthFunnel>.1)o=(mouthFunnel-.1)/2}else{i=Math.min(mouth_up+mouth_down/2,1);e=Math.min(smile+mouth_up/2,1);const f=Math.min(smile/(mouth_up+mouth_down||.1),1);i*=1-f;e*=f}const af=1-Math.min(Math.max(i,u,e,o),.2)/.2;a=Math.pow(jawOpen/.2,1-jawOpen/.2*.35-af*.3)*jawOpen_max_ini;if(use_faceBlendshapes){jawOpen=a;frames.morph["JawOpen"][0].weight=jawOpen}}else{jawOpen=jawOpen_max_ini+(jawOpen-.2)/.8*(1-jawOpen_max_ini);if(use_faceBlendshapes)frames.morph["JawOpen"][0].weight=jawOpen;o=Math.min(jawOpen+mouthFunnel/2,1);a=Math.min(jawOpen+(smile+mouth_up)/3,1);if(mouthPucker>.1){const f=Math.min((mouthPucker-.1)*5,1);o*=f;a*=1-f}else{o=0}}if(mouthFunnel>.1){mouth_wide=-(mouthFunnel-.1)*.75}else{mouth_wide=Math.min(Math.max(smile-.2,0)*1+Math.max(mouth_up-.5,0)*1.5,1);if(mouth_wide>.5)e*=1-(mouth_wide-.5)*2*.25}happy=Math.min(Math.max(mouth_wide,0)-sad,1);if(happy<0){sad=-happy;happy=0}else{sad=0}const angry_mod=.2+mouthPucker/2;angry=Math.max(b[faceBlendshapes_index["mouthLeft"]].score-angry_mod,b[faceBlendshapes_index["mouthRight"]].score-angry_mod,0);smile=Math.min(happy*.8,is_VRM?.7-Math.max(happy*.4-.3,0):.6);happy*=.4;sad*=.5;angry=Math.max(angry-happy,0);let blush=Math.max(Math.max((b[faceBlendshapes_index["mouthPressLeft"]].score+b[faceBlendshapes_index["mouthPressRight"]].score)/2,(b[faceBlendshapes_index["mouthRollLower"]].score+b[faceBlendshapes_index["mouthRollUpper"]].score)/2)-.2,0);if(brow_down>.1){brow_up=-(brow_down-.1)/.9}else if(browInnerUp>.1&&brow_up>.1){brow_up=((browInnerUp-.1)/.9+(brow_up-.1)/.9)/2}let blink=(b[faceBlendshapes_index["eyeBlinkRight"]].score+b[faceBlendshapes_index["eyeBlinkLeft"]].score)/2;surprise=Math.max(brow_up-blink-.1,0);surprise=surprise*surprise/2;if(is_VRM)surprise=Math.min(surprise*Math.max(jawOpen*3,1),1);let tongue_out_rot_factor=1;const use_tongue_out_expression=_facemesh.use_tongue_out&&modelX.blendshape_map_by_MMD_name?.["ぺろっ"];const use_tongue_out=_facemesh.use_tongue_out&&(modelX.use_tongue_out||use_tongue_out_expression);let mouth_down_min=Math.min(b[faceBlendshapes_index["mouthLowerDownLeft"]].score,b[faceBlendshapes_index["mouthLowerDownRight"]].score);if(use_tongue_out&&mouth_down_min>.2){let mouth_up_max=Math.max(b[faceBlendshapes_index["mouthUpperUpLeft"]].score,b[faceBlendshapes_index["mouthUpperUpRight"]].score);tongue_out=Math.max(mouth_down_min-mouth_up_max*1.2,0);if(Math.abs(y_rot)>Math.PI/18){tongue_out_rot_factor=Math.max(1-(Math.abs(y_rot)-Math.PI/18)/(Math.PI/4),1/3);tongue_out*=tongue_out_rot_factor}if(tongue_out<.1){tongue_out=0}else{tongue_out=Math.min(tongue_out*(1+(b[faceBlendshapes_index["mouthDimpleLeft"]].score+b[faceBlendshapes_index["mouthDimpleRight"]].score)/2),1)}}let emotion_weight=_facemesh.emotion_weight_percent/100;if(use_faceBlendshapes)emotion_weight*=emotion_weight;for(const name in blendshape_accumulated){let v=blendshape_accumulated[name];let ew=_facemesh.emotion_weight_by_name(name,emotion_weight);let mod=-1,mod_scale=1;let max=is_VRM?1:ew*.8;let max_low=ew*.75;let b=0;let b_threshold;switch(name){case"sad":b=sad;b_threshold=.25;break;case"angry":b=angry;b_threshold=.25;break;case"surprise":b=surprise;if(is_VRM){b_threshold=.25}break;case"blush":b=blush;b_threshold=.2;mod_scale=.5;max=1;break;case"tongue_out":b=tongue_out;b_threshold=.2;max_low=.6;max=1;break}if(b_threshold){let scale=Math.min(b/b_threshold,1);scale*=scale;max=Math.min(b+Math.max(max-b,0)*scale*(scale<1?max_low:1),max);mod=b*scale*mod_scale}blendshape_accumulated[name]=THREE.Math.clamp(Math.max(v,b)+mod*_facemesh._t/1e3*4,0,max)}({sad,angry,surprise,blush,tongue_out}=blendshape_accumulated);if(tongue_out){if(use_tongue_out_expression){tongue_out=tongue_out<.5?Math.pow(tongue_out*2,2)/2:Math.pow((tongue_out-.5)*2,.5)/2+.5}else{if(tongue_out<.5){tongue_out=0}else{tongue_out=Math.sqrt(tongue_out);a*=1-tongue_out+tongue_out/2}}}if(use_faceBlendshapes&&!use_tongue_out_expression)frames.add("morph|facemesh","TongueOut",{weight:tongue_out});if(!is_VRM){emotion_weight=Math.min(emotion_weight/.75,1);if(blush)sad+=blush*.25*emotion_weight}const smile_weight=_facemesh.emotion_weight_by_name("smile",Math.sqrt(emotion_weight));smile*=smile_weight;happy*=smile_weight;sad=Math.min(sad,_facemesh.emotion_weight_by_name("sad",emotion_weight));angry=Math.min(angry,_facemesh.emotion_weight_by_name("angry",emotion_weight));blush=Math.min(blush,Math.min(_facemesh.emotion_weight_by_name("blush",emotion_weight)/.75,1));surprise=Math.min(surprise,_facemesh.emotion_weight_by_name("surprise",emotion_weight));if(is_VRM)surprise*=surprise;frames.add("morph|facemesh","あ",{weight:a});frames.add("morph|facemesh","い",{weight:i});frames.add("morph|facemesh","う",{weight:u});frames.add("morph|facemesh","え",{weight:e});frames.add("morph|facemesh","お",{weight:o});frames.add("morph|facemesh","にやり",{weight:mouth_wide});frames.add("morph|facemesh","口角上げ",{weight:mouth_up-mouthShrugLower});frames.add("morph|facemesh","上",{weight:brow_up});frames.add("morph|facemesh","にこり",{weight:smile});frames.add("morph|facemesh","困る",{weight:sad});frames.add("morph|facemesh","怒り",{weight:angry});frames.add("morph|facemesh","笑い",{weight:happy});frames.add("morph|facemesh","びっくり",{weight:surprise});frames.add("morph|facemesh","照れ",{weight:blush});frames.add("morph|facemesh","ぺろっ",{weight:tongue_out});const use_eye_LR=!_facemesh.blink_sync&&THREE.MMD.getModels()[0].pmx.morphs_index_by_name["まばたきL"]!=null;if(use_eye_LR){frames.add("morph|facemesh","まばたきL",{weight:Math.max(b[faceBlendshapes_index["eyeBlinkRight"]].score-happy,0)});frames.add("morph|facemesh","まばたきR",{weight:Math.max(b[faceBlendshapes_index["eyeBlinkLeft"]].score-happy,0)});frames.add("morph|facemesh","まばたき",{weight:0})}else{frames.add("morph|facemesh","まばたきL",{weight:0});frames.add("morph|facemesh","まばたきR",{weight:0});frames.add("morph|facemesh","まばたき",{weight:Math.max(blink-happy,0)})}let eye_up,eye_right,two_eyes,eye_bone_rotation_weight;if(_facemesh.auto_look_at_camera){const mesh=THREE.MMD.getModels()[0].mesh;const eye_v3=MMD_SA.TEMP_v3.copy(MMD_SA._trackball_camera.object.position).sub(MMD_SA._head_pos).normalize().applyQuaternion(MMD_SA.get_bone_rotation(mesh,"頭").conjugate());const eye_rot=MMD_SA._v3b.setEulerFromQuaternion(MMD_SA.TEMP_q.setFromUnitVectors(MMD_SA._v3a.set(0,0,1),eye_v3));eye_up=-Math.sign(eye_rot.x)*Math.min(Math.abs(eye_rot.x/(Math.PI/4)),1);eye_right=-Math.sign(eye_rot.y)*Math.min(Math.abs(eye_rot.y/(Math.PI/4)),1);eye_bone_rotation_weight=1}else{eye_up=(b[faceBlendshapes_index["eyeLookUpLeft"]].score+b[faceBlendshapes_index["eyeLookUpRight"]].score)/2-(b[faceBlendshapes_index["eyeLookDownLeft"]].score+b[faceBlendshapes_index["eyeLookDownRight"]].score)/2;eye_right=(b[faceBlendshapes_index["eyeLookInRight"]].score+b[faceBlendshapes_index["eyeLookOutLeft"]].score)/2-(b[faceBlendshapes_index["eyeLookInLeft"]].score+b[faceBlendshapes_index["eyeLookOutRight"]].score)/2;eye_bone_rotation_weight=_facemesh.eye_bone_rotation_percent/100}two_eyes={absolute:true,rot:(new THREE.Quaternion).setFromEuler(MMD_SA._v3a.set(-eye_up*15/180*Math.PI,-eye_right*20/180*Math.PI,0).multiplyScalar(eye_bone_rotation_weight),"YZX")};frames.add("skin|facemesh","両目",two_eyes)}else{let happy_abs=happy-(sad+angry+fear+surprise*.5);if(happy_abs<0){smile*=Math.max(1+happy_abs*2,0)}else{smile=Math.min(happy_abs*.2+smile*(1+happy_abs*.5),.4)}frames.add("morph|facemesh","にこり",{weight:facemesh_filter["にこり"].filter(Math.min(smile+happy*.75,.75))});frames.add("morph|facemesh","困る",{weight:facemesh_filter["困る"].filter(Math.min((sad+fear)/2*.75+(eyebrow_up<0?Math.max(-eyebrow_up*1-Math.max(mouth_wide,0)*.5,0):0),.75))});frames.add("morph|facemesh","怒り",{weight:facemesh_filter["怒り"].filter(Math.min(angry*.75,.75))});eyebrow_up+=surprise*.2;frames.add("morph|facemesh","笑い",{weight:facemesh_filter["笑い"].filter(smile)});frames.add("morph|facemesh","びっくり",{weight:facemesh_filter["びっくり"].filter(surprise*.75)});frames.add("morph|facemesh","にやり",{weight:facemesh_filter["にやり"].filter(mouth_wide)});let rot_inv=MMD_SA.TEMP_q.setFromEuler(MMD_SA._v3a.set(x_rot,y_rot,z_rot),"YZX").conjugate();let L=[];[13,14,61,291].forEach(function(index,i){L[index]=_v3[i].fromArray(face.mesh[index]).applyQuaternion(rot_inv).setZ(0)});let L_center=MMD_SA._v3a.copy(L[61]).add(L[291]).multiplyScalar(.5);let L_half=L[61].distanceTo(L[291])*.5;let m_up=Math.atan2(L[13].y-L_center.y,L_half);let m_down=Math.atan2(L[14].y-L_center.y,L_half);let mouth_open_y=Math.max(-(m_up+m_down)*180/Math.PI+20*mouth_open_x,0);if(mouth_open_y)mouth_open_y=Math.min(mouth_open_y/20,.75);mouth_open_y=Math.min(mouth_open_y+sad*.25,1);mouth_open_y*=.5;mouth_open_x=mouth_open_x*(1-mouth_open_y);frames.add("morph|facemesh","あ",{weight:facemesh_filter["あ"].filter(mouth_open_x)});frames.add("morph|facemesh","お",{weight:facemesh_filter["お"].filter(mouth_open_y)});let _eye_data_order={L:[],R:[]};if(!_facemesh.eye_tracking){}else if(use_faceLandmarksDetection){let _eye_x_rot=[0,0];let _eye_y_rot=[0,0];face.eyes.forEach(function(eye,i){if(eye){_eye_x_rot[i]=Math.max(Math.min((eye[3]*2+x_rot/(Math.PI/2))*(1-Math.abs(x_rot)/Math.PI),1),-1);_eye_y_rot[i]=Math.max(Math.min((eye[2]*2-y_rot/(Math.PI/2))*(1-Math.abs(y_rot)/Math.PI),1),-1)}});let eyebrow_factor=(blink.L[0]+blink.R[0])/2;if(eyebrow_factor>1)eyebrow_up+=(eyebrow_factor-1)*2;else eyebrow_up-=(1-eyebrow_factor)*.5;eyebrow_up=Math.min(eyebrow_up,1);let rot_ratio=blink.L[0]+blink.R[0];if(rot_ratio)rot_ratio=blink.L[0]/rot_ratio;else rot_ratio=.5;let eye_x_rot=_eye_x_rot[0]*rot_ratio+_eye_x_rot[1]*(1-rot_ratio);let eye_y_rot=_eye_y_rot[0]*rot_ratio+_eye_y_rot[1]*(1-rot_ratio);let two_eyes={absolute:true,rot:(new THREE.Quaternion).fromArray(facemesh_filter["両目"].filter(MMD_SA.TEMP_q.setFromEuler(MMD_SA._v3a.set(-(eye_x_rot-.3)*15/180*Math.PI,eye_y_rot*sign_flip*20/180*Math.PI,0),"YZX").toArray()))};frames.add("skin|facemesh","両目",two_eyes);let use_eye_LR=!_facemesh.blink_sync&&THREE.MMD.getModels()[0].pmx.morphs_index_by_name["まばたきL"]!=null;let blink_factor=(use_eye_LR?Math.min(Math.max(Math.abs(blink.L[0]-blink.R[0])-(.25+(1-Math.min(Math.max((Math.PI/6-Math.abs(y_rot))/(Math.PI/12),0),1))*1),0)/.25,1):0)*_blink_factor;let blink0=use_eye_LR?Math.min(blink.L[0],blink.R[0]):(blink.L[0]+blink.R[0])/2;blink.L[0]=blink.L[0]*blink_factor+blink0*(1-blink_factor);blink.R[0]=blink.R[0]*blink_factor+blink0*(1-blink_factor);if(use_eye_LR){let blink_name="まばたき"+(sign_flip==1?"L":"R");frames.add("morph|facemesh",blink_name,{weight:facemesh_filter[blink_name].filter(Math.max(Math.min(1-blink.L[0]*.8-smile,1),0))});blink_name="まばたき"+(sign_flip==1?"R":"L");frames.add("morph|facemesh",blink_name,{weight:facemesh_filter[blink_name].filter(Math.max(Math.min(1-blink.R[0]*.8-smile,1),0))});frames.add("morph|facemesh","まばたき",{weight:0})}else{frames.add("morph|facemesh","まばたきL",{weight:0});frames.add("morph|facemesh","まばたきR",{weight:0});frames.add("morph|facemesh","まばたき",{weight:facemesh_filter["まばたき"].filter(Math.max(Math.min(1-blink.L[0]*.8-smile,1),0))})}}else{let eye=face.eyes[0];let eye_x_rot=0;let eye_y_rot=0;if(eye){eye_x_rot=Math.max(Math.min((eye[3]*2+x_rot/(Math.PI/2))*(1-Math.abs(x_rot)/Math.PI),1),-1);eye_y_rot=Math.max(Math.min((eye[2]*2-y_rot/(Math.PI/2))*(1-Math.abs(y_rot)/Math.PI),1),-1)}let eyebrow_factor=eyebrow_up*.25;if(eyebrow_factor<0)eyebrow_factor=Math.min(eyebrow_factor+smile,0);let weight=Math.max(Math.min(.1-eye_x_rot*(eye_x_rot<0?2:1)*.2-eyebrow_factor,.5),0);frames.add("morph|facemesh","まばたき",{weight:weight});let eye_rot_confidence=1.25+Math.pow((blink.L[0]+blink.R[0])/2,2)*1.75;eye_x_rot=Math.sign(eye_x_rot)*Math.pow(Math.abs(eye_x_rot),eye_rot_confidence);eye_y_rot=Math.sign(eye_y_rot)*Math.pow(Math.abs(eye_y_rot),eye_rot_confidence);let two_eyes={absolute:true,rot:(new THREE.Quaternion).setFromEuler(MMD_SA._v3a.set(-eye_x_rot*15/180*Math.PI,eye_y_rot*sign_flip*20/180*Math.PI,0),"YZX")};frames.add("skin|facemesh","両目",two_eyes)}if(_facemesh.eye_tracking)frames.add("morph|facemesh","上",{weight:facemesh_filter["上"].filter(Math.max(Math.min(eyebrow_up,1),-1))})}if(!_poseNet.enabled){if(!frames.skin["センター"])frames.add("skin","センター",{rot:new THREE.Quaternion});const motion_para=MMD_SA.MMD.motionManager.para_SA;if(motion_para.motion_tracking_upper_body_only){for(const d of["左","右"]){const state=true;if(motion_para.has_leg_IK){frames.set_blend_default_motion("skin",d+"足IK",true);frames.remove("skin",d+"足首")}else{frames.set_blend_default_motion("skin",d+"足",true);frames.set_blend_default_motion("skin",d+"ひざ",true);frames.set_blend_default_motion("skin",d+"足首",true)}_poseNet.enable_IK(d+"足IK",motion_para.has_leg_IK);_poseNet.enable_IK(d+"つま先IK",motion_para.has_leg_IK);frames.set_blend_default_motion("skin",d+"肩",state);frames.set_blend_default_motion("skin",d+"腕",state);frames.set_blend_default_motion("skin",d+"ひじ",state);frames.set_blend_default_motion("skin",d+"手捩",state);frames.set_blend_default_motion("skin",d+"手首",state);frames.set_blend_default_motion("skin",d+"腕IK",state);_poseNet.enable_IK(d+"腕IK",true)}}else{for(const d of["左","右"]){_poseNet.enable_IK(d+"腕IK",motion_para.has_arm_IK)}frames.remove("skin","センター")}}info=info||face.eyes.length&&[(!_poseNet.enabled?camera.video_canvas.width+"x"+camera.video_canvas.height+"("+_facemesh.camera_video_frame_id+")\n":"")+(calibrating?"Calibrating("+calibration_percent+"%):Make a calm face!":"(face data calibrated)")+"/"+Math.round(face.faceInViewConfidence*100)+"%",face.emotion?JSON.stringify(face.emotion):"Neutral"].join("\n");if(_info_extra_facemesh)info+="\n"+_info_extra_facemesh;info+=(_info_extra||!_poseNet.enabled?DEBUG_msg?"\n"+DEBUG_msg+"\n":"":"")+(_info_extra||"");System._browser.motion_control.process(motion_control_data)}else{info="(no facemesh data)\n"+_info_extra}if(!System._browser.overlay_mode&&!MMD_SA_options.user_camera.ML_models.debug_hidden){System._browser.on_animation_update.add(()=>{DEBUG_show(info&&info+(!_poseNet.enabled||!_poseNet.use_holistic?"\nF-FPS:"+Math.round(fps)+"/"+Math.round(data.fps||0):"")+"\n"+"FPS:"+EV_sync_update.fps_last||"")},0,0)}_facemesh.busy=0}_facemesh.update_frame()}}();var canvas_resized=document.createElement("canvas");var eye_tracking=true;var use_tongue_out;var emotion_weight_percent,emotion_joy_fun_percent,emotion_angry_percent,emotion_sorrow_percent,emotion_surprised_percent,emotion_others_percent;var eye_bone_rotation_percent;var bb_center=[];var _data_detected=0;var _data_detected_ini_timestamp=0;_facemesh={initialized:false,worker_initialized:false,faceBlendshapes_list:faceBlendshapes_list,MMD_morph_list:MMD_morph_list,get data_detected(){return _data_detected},set data_detected(v){if(v){if(!_data_detected){_data_detected_ini_timestamp=RAF_timestamp}}else{_data_detected_ini_timestamp=0}_data_detected=v},get data_detected_stable(){return enabled&&_data_detected_ini_timestamp&&RAF_timestamp-_data_detected_ini_timestamp>250},get head_pose_enabled(){return this.data_detected_stable||!_poseNet.enabled},get blink_detection(){return blink_detection},set blink_detection(v){blink_detection=v;if(enabled){if(blink_detection){reset_calibration()}else{MMD_SA_options.auto_blink=auto_blink_default!=null?auto_blink_default:MMD_SA_options.auto_blink}}},get auto_blink(){return auto_blink},set auto_blink(v){auto_blink=v},get eye_bone_rotation_percent(){return eye_bone_rotation_percent==null?100:eye_bone_rotation_percent},set eye_bone_rotation_percent(v){eye_bone_rotation_percent=v},get eye_tracking(){return eye_tracking},set eye_tracking(v){eye_tracking=v;if(eye_tracking){this.blink_detection=!!use_faceLandmarksDetection}else{this.blink_detection=false}if(enabled){if(!eye_tracking){frames.remove("skin","両目");frames.remove("morph","まばたきL");frames.remove("morph","まばたきR");frames.remove("morph","まばたき");frames.remove("morph","上");frames.remove("morph","下")}}},get use_faceLandmarksDetection(){return use_faceLandmarksDetection},set use_faceLandmarksDetection(v){if(!this.initialized)use_faceLandmarksDetection=v},get use_mediapipe(){return use_mediapipe_facemesh||_poseNet.enabled&&_poseNet.use_holistic},set use_mediapipe(v){return use_mediapipe_facemesh=v},get use_faceBlendshapes(){return!_poseNet.enabled||!_poseNet.use_holistic},get calibrated(){return!calibrating&&calibration_percent>=100},get use_tongue_out(){return use_tongue_out==null?1:use_tongue_out},set use_tongue_out(v){use_tongue_out=v},get emotion_weight_percent(){return emotion_weight_percent==null?75:emotion_weight_percent},set emotion_weight_percent(v){emotion_weight_percent=v},get emotion_joy_fun_percent(){return emotion_joy_fun_percent==null?100:emotion_joy_fun_percent},set emotion_joy_fun_percent(v){emotion_joy_fun_percent=v},get emotion_angry_percent(){return emotion_angry_percent==null?100:emotion_angry_percent},set emotion_angry_percent(v){emotion_angry_percent=v},get emotion_sorrow_percent(){return emotion_sorrow_percent==null?100:emotion_sorrow_percent},set emotion_sorrow_percent(v){emotion_sorrow_percent=v},get emotion_surprised_percent(){return emotion_surprised_percent==null?100:emotion_surprised_percent},set emotion_surprised_percent(v){emotion_surprised_percent=v},get emotion_others_percent(){return emotion_others_percent==null?100:emotion_others_percent},set emotion_others_percent(v){emotion_others_percent=v},emotion_weight_by_name:function(name,v=1){switch(name){case"smile":return v*this.emotion_joy_fun_percent/100;case"angry":return v*this.emotion_angry_percent/100;case"sad":return v*this.emotion_sorrow_percent/100;case"surprise":return v*this.emotion_surprised_percent/100;case"blush":return v*this.emotion_others_percent/100;default:return v}},export_calibration:function(){const c_json={facemesh_calibration_type:_poseNet.use_holistic?"holistic":"facemesh",lips_width_average:lips_width_average,eyebrow_data:{L:{height_average:eyebrow_data.L.height_average},R:{height_average:eyebrow_data.R.height_average}},eye_data:{L:{eye_open_average:eye_data.L[0].eye_open_average},R:{eye_open_average:eye_data.R[0].eye_open_average}},neck_length_average:neck_length_average};System._browser.save_file("facemesh_calibration.json",JSON.stringify(c_json,null,"\t"),"application/json")},import_calibration:function(json){this.reset_calibration();lips_width_average=json.lips_width_average;for(const dir of["L","R"]){Object.assign(eyebrow_data[dir],json.eyebrow_data[dir]);Object.assign(eye_data[dir][0],json.eye_data[dir])}neck_length_average=json.neck_length_average||1.25;calibration_percent=100;calibrating=false},face_width:0,_neck:{},calculate_neck_data:(()=>{let v3a,v3b,v3c;let q1;let neck_length_filter;window.addEventListener("jThree_ready",()=>{v3a=new THREE.Vector3;v3b=new THREE.Vector3;v3c=new THREE.Vector3;q1=new THREE.Quaternion;neck_length_filter=new System._browser.data_filter([{type:"one_euro",id:"neck_length",para:[30,1,1,1,1]}])});return function(para){if(!_poseNet.enabled||!_facemesh.enabled||!this._neck.data)return false;let p=this._neck.data.find(d=>d.timestamp===para.timestamp);if(!p){this._neck.data.unshift(para);return false}Object.assign(p,para);if(!(p.is_pose&&p.is_face))return false;const f_axis=v3a.fromArray(p.f_axis);const s_axis=v3b.fromArray(p.shoulder_center).setZ(0);const mod=v3c.set(0,0,p.face_width/3).applyQuaternion(q1.fromArray(p.face_rot).conjugate()).setZ(0).y;const motion_para=MMD_SA.MMD.motionManager.para_SA;let tilt_adjustment=motion_para.motion_tracking?.camera?.tilt_adjustment||camera.tilt_adjustment;let tilt_angle=tilt_adjustment.enabled?tilt_adjustment.angle*Math.PI/180:0;const _pose=motion_para.motion_tracking?.ML_models?.pose||MMD_SA_options.user_camera.ML_models.pose;if(_pose.upper_rotation_offset){const y=_pose.upper_rotation_offset*Math.PI/180;tilt_angle*=Math.cos(y)}const spine_rot_x=p.spine_rot_absolute[0]+tilt_angle;this._neck._spine_rot_absolute=p.spine_rot_absolute.slice();this._neck._spine_rot_absolute[0]+=tilt_angle;let neck_length=neck_length_filter.filter(f_axis.distanceTo(s_axis)+mod)/p.face_width/Math.max(Math.abs(Math.cos(spine_rot_x)));if(calibrating){window.addEventListener("SA_camera_facemesh_calibrating",()=>{neck_length_data.push(neck_length);let edge_size=parseInt(neck_length_data.length*.3);neck_length_average=neck_length_data.sort((a,b)=>a-b).slice(edge_size,neck_length_data.length-edge_size).reduce((accumulator,currentValue)=>accumulator+currentValue)/(neck_length_data.length-edge_size*2)},{once:true})}this._neck.data.length=0;if(!neck_length_average)return false;let r=neck_length/neck_length_average;shoulder_z_angle[2]=!_poseNet.shoulder_tracking||r>.95?0:(1-Math.max((r/.95-.8)/(1-.8),0))*Math.PI/8;if(para.is_pose)return true;return true}})(),get enabled(){return enabled},set enabled(v){if(enabled==!!v)return;enabled=!!v;pose_init_core();this.busy=0;this.data_detected=0;bb_center[0]=bb_center[1]=.5;this._neck={data:[]};if(enabled){if(!this.initialized)init();auto_blink_default=MMD_SA_options.auto_blink;const _facemesh_type=_poseNet.use_holistic?1:0;reset_calibration(facemesh_type!=_facemesh_type);facemesh_type=_facemesh_type}else{MMD_SA_options.auto_blink=auto_blink_default}ML_init()},get bb_center(){return bb_center},set bb_center(v){bb_center=v},reset_calibration:reset_calibration,get frames(){return frames},init:init,worker_onmessage:facemesh_worker_onmessage,camera_video_timestamp:0,update_frame:function(delay_update){async function update_worker(){var ready=_facemesh.enabled&&_facemesh.worker_initialized&&camera_video_timestamp&&!_facemesh.busy&&!(_poseNet.enabled&&_poseNet.use_holistic)&&video_capture_active&&_facemesh.camera_video_timestamp!=camera_video_timestamp;if(!ready)return;_facemesh.busy=RAF_timestamp;_facemesh.camera_video_timestamp=camera_video_timestamp;_facemesh.camera_video_frame_id=camera_video_frame_id;if(blink_detection){MMD_SA_options.auto_blink=auto_blink||false}let video_canvas;let cw,ch;let sw,sh;let sx,sy;let need_resize;video_canvas=camera.video_canvas;let vw=video_canvas.width,vh=video_canvas.height;sx=sy=0;cw=sw=vw;ch=sh=vh;let target_ratio=1;let limit=MMD_SA_options.user_camera.pixel_limit.facemesh;if(limit){if(cw*ch>limit[0]*limit[1]){target_ratio=Math.sqrt(cw*ch/(limit[0]*limit[1]));cw=sw=Math.round(cw/target_ratio);ch=sh=Math.round(ch/target_ratio);video_canvas=canvas_resized;need_resize=true}}let facemesh_bb_ratio,facemesh_bb_scale,d;if(MMD_SA_options.user_camera.pixel_limit.facemesh_bb_ratio){facemesh_bb_ratio=MMD_SA_options.user_camera.pixel_limit.facemesh_bb_ratio;d=Math.round(Math.min(cw,ch)*facemesh_bb_ratio);sw=d;sh=d;let bb_scale=1;const threshold=5*(use_mediapipe_facemesh?2:1);if(_facemesh.data_detected"+sw+"x"+sh+"):"+[_sx,_sy,d,d].join(",")+"=>"+[sx,sy,sw,sh].join(","))}}else{if(video_canvas.width!=sw||video_canvas.height!=sh){video_canvas.width=sw;video_canvas.height=sh;console.log("Facemesh canvas("+cw+"x"+ch+")")}}ctx.drawImage(camera.video_canvas,Math.round(_sx*target_ratio),Math.round(_sy*target_ratio),Math.round(_sw*target_ratio),Math.round(_sh*target_ratio),0,0,sw,sh)}let rgba=use_imagebitmap&&use_mediapipe_facemesh?await createImageBitmap(video_canvas,need_resize?0:sx,need_resize?0:sy,sw,sh):ctx.getImageData(need_resize?0:sx,need_resize?0:sy,sw,sh).data.buffer;_facemesh._timestamp=camera.video_timestamp;let data={rgba:rgba,w:cw*(facemesh_bb_scale||1),h:ch*(facemesh_bb_scale||1),options:{use_facemesh:true,draw_canvas:true,flip_canvas:camera.display_flipped,bb:{x:Math.round(sx),y:Math.round(sy),w:sw,h:sh,ratio:facemesh_bb_ratio||0,scale:facemesh_bb_scale||1,timestamp:_facemesh._timestamp}}};if(self.FacemeshAT){data.canvas=camera.video_canvas_facemesh}else if(!camera.video_canvas_facemesh._offscreen&&self.OffscreenCanvas){data.canvas=camera.video_canvas_facemesh.transferControlToOffscreen();camera.video_canvas_facemesh._offscreen=true;console.log("(Facemesh: use offscreen canvas)")}fm_worker.postMessage(data,data.canvas?[data.canvas,data.rgba]:[data.rgba]);data.rgba=rgba=undefined;data=undefined}if(delay_update||self.FacemeshAT){setTimeout(()=>{update_worker()},0)}else{update_worker()}}};return _facemesh}(),poseNet:function(){var enabled=false;var _use_3D_pose=true;var _IK_disabled=true;var _IK_enabled_list={};var _use_holistic=null;var _data_detected=0;var _data_detected_ini_timestamp=0;var _no_data_detected_ini_timestamp=0;var _auto_grounding=null;var _ground_plane_visible=null;var _spine_length_ref=0;var shoulder_tracking;var hip_adjustment_weight_percent,hip_adjustment_head_weight_percent,hip_adjustment_adjust_y_axis_percent,hip_adjustment_smoothing_percent;var hip_adjustment_scale_x_percent,hip_adjustment_scale_y_percent,hip_adjustment_scale_z_percent;_poseNet={get enabled(){return enabled},set enabled(v){if(enabled==!!v)return;enabled=!!v;pose_busy=0;_no_pose_data=false;this.data_detected=0;this.initial_data_detected=false;_no_data_detected_ini_timestamp=0;THREE.MMD.getModels()[0].mesh.visible=true;pos_offset_last.set(0,0,0);if(enabled){if(!this.initialized)pose_init();if(pose_worker_url){worker_id=_poseNet.use_holistic?"legacy_holistic":"tasks_vision";if(!pose_workers[worker_id]){ML_warmed_up_status=[{},{}];pose_worker.terminate();for(const id in pose_workers)delete pose_workers[id];pose_worker=new Worker(pose_worker_url);pose_worker.onmessage=pose_worker_onmessage;pose_worker_id=worker_id;pose_workers[pose_worker_id]=new PoseWorker(pose_worker_id,pose_worker)}console.log("Web worker ID:"+pose_worker_id);pose_worker=pose_workers[pose_worker_id].worker;pose_worker_initialized=pose_workers[pose_worker_id].initialized}MMD_SA_options.user_camera.ML_models.pose.events.enabled&&MMD_SA_options.user_camera.ML_models.pose.events.enabled()}else{THREE.MMD.getModels()[0].resetPhysics();MMD_SA_options.user_camera.ML_models.pose.events.disabled&&MMD_SA_options.user_camera.ML_models.pose.events.disabled()}ML_init();if(_poseNet.use_holistic){setTimeout(()=>{if(enabled)_facemesh.enabled=_handpose.enabled=true;else _handpose.enabled=false;DEBUG_show("(Holistic Mode:"+(enabled?"ON":"OFF")+")",2)},0)}},get data_detected(){return _data_detected},set data_detected(v){if(1){if(v){if(!_data_detected){_data_detected_ini_timestamp=RAF_timestamp}if(this.data_detected_stable){_no_data_detected_ini_timestamp=0}}else{_data_detected_ini_timestamp=0;if(!_no_data_detected_ini_timestamp){_no_data_detected_ini_timestamp=RAF_timestamp}if(RAF_timestamp-_no_data_detected_ini_timestamp>250){frames.reset()}}}_data_detected=v},get data_detected_stable(){return enabled&&(!_no_data_detected_ini_timestamp||RAF_timestamp-_no_data_detected_ini_timestamp<250||_data_detected_ini_timestamp&&RAF_timestamp-_data_detected_ini_timestamp>500)},get use_3D_pose(){return enabled&&_use_3D_pose&&use_blazepose},set use_3D_pose(v){_use_3D_pose=v},get use_holistic(){return _use_holistic==null?use_holistic:_use_holistic},set use_holistic(v){_use_holistic=v},get _use_holistic_(){return use_holistic},set _use_holistic_(v){use_holistic=v},get skip_hand_countdown_max(){return 0},set IK_disabled(v){_IK_disabled=v},get auto_grounding(){return _auto_grounding!=null?_auto_grounding:MMD_SA_options.user_camera.ML_models.pose.auto_grounding||MMD_SA.WebXR.session},set auto_grounding(v){_auto_grounding=v},get ground_plane_visible(){return _ground_plane_visible!=null?_ground_plane_visible:!enabled||!!MMD_SA_options.user_camera.ML_models.pose.auto_grounding||MMD_SA.MMD.motionManager.para_SA.motion_tracking_upper_body_only},set ground_plane_visible(v){_ground_plane_visible=v},get spine_length_ref(){if(_spine_length_ref)return _spine_length_ref;const spine_ratio=MMD_SA_options.model_para_obj.left_leg_length/MMD_SA_options.model_para_obj.spine_length;return _poseNet.leg_scale_adjustment?Math.max(4.97462,MMD_SA_options.model_para_obj.spine_length*(spine_ratio/1.83))*(21-_poseNet.leg_scale_adjustment)/20:Math.max(4.97462,MMD_SA_options.model_para_obj.spine_length)},set spine_length_ref(v){_spine_length_ref=v},get shoulder_tracking(){return shoulder_tracking==null?1:shoulder_tracking},set shoulder_tracking(v){shoulder_tracking=v},get hip_adjustment_weight_percent(){return hip_adjustment_weight_percent==null?100:hip_adjustment_weight_percent},set hip_adjustment_weight_percent(v){hip_adjustment_weight_percent=v},get hip_adjustment_head_weight_percent(){return hip_adjustment_head_weight_percent==null?100:hip_adjustment_head_weight_percent},set hip_adjustment_head_weight_percent(v){hip_adjustment_head_weight_percent=v},get hip_adjustment_adjust_y_axis_percent(){return hip_adjustment_adjust_y_axis_percent==null?66:hip_adjustment_adjust_y_axis_percent},set hip_adjustment_adjust_y_axis_percent(v){hip_adjustment_adjust_y_axis_percent=v},get hip_adjustment_scale_x_percent(){return hip_adjustment_scale_x_percent==null?100:hip_adjustment_scale_x_percent},set hip_adjustment_scale_x_percent(v){hip_adjustment_scale_x_percent=v},get hip_adjustment_scale_y_percent(){return hip_adjustment_scale_y_percent==null?100:hip_adjustment_scale_y_percent},set hip_adjustment_scale_y_percent(v){hip_adjustment_scale_y_percent=v},get hip_adjustment_scale_z_percent(){return hip_adjustment_scale_z_percent==null?100:hip_adjustment_scale_z_percent},set hip_adjustment_scale_z_percent(v){hip_adjustment_scale_z_percent=v},get hip_adjustment_smoothing_percent(){return hip_adjustment_smoothing_percent==null?0:hip_adjustment_smoothing_percent},set hip_adjustment_smoothing_percent(v){hip_adjustment_smoothing_percent=v},leg_scale_adjustment:0,IK_disabled_check:function(){var RE_default=new RegExp("("+toRegExp(["腕IK","足IK","つま先IK"],"|")+")$");var RE_default_upper_body=new RegExp("("+toRegExp(["腕IK"],"|")+")$");return function(name){const para_SA=MMD_SA.MMD.motionManager.para_SA;if(!_IK_disabled||!this.data_detected&&(this.enabled||!_facemesh.enabled||!_facemesh.data_detected)||!para_SA.motion_tracking_enabled)return null;let disabled=!name||RE_default.test(name);if(disabled&&name){if(_IK_enabled_list[name])disabled=false}return disabled}}(),enable_IK:function(name,enabled){_IK_enabled_list[name]=enabled},get frames(){return frames},camera_video_timestamp:0,get busy(){return pose_busy},get initialized(){return pose_initialized},get worker_initialized(){return pose_worker_initialized},set worker_initialized(v){pose_worker_initialized=v;if(!self.PoseAT)pose_workers[pose_worker_id].initialized=v}};return _poseNet}(),handpose:function(){var enabled=false;var hand_visible_timestamp={};var hand_visible_session={};var stabilize_arm,stabilize_arm_time;var stabilize_hand_percent;_handpose={get enabled(){return enabled},set enabled(v){if(enabled==!!v)return;enabled=!!v;if(enabled){hand_visible_timestamp={};hand_visible_session={};if(!this.initialized)pose_init()}},get hand_visible_timestamp(){return hand_visible_timestamp},get hand_visible_session(){return hand_visible_session},get frames(){return frames},get busy(){return pose_busy},get initialized(){return pose_initialized},get worker_initialized(){return pose_worker_initialized},set worker_initialized(v){pose_worker_initialized=pose_workers[pose_worker_id].initialized=v},get stabilize_arm(){return stabilize_arm==null?2:stabilize_arm},set stabilize_arm(v){stabilize_arm=v},get stabilize_arm_time(){return stabilize_arm_time==null?0:stabilize_arm_time},set stabilize_arm_time(v){stabilize_arm_time=v},get stabilize_hand_percent(){return stabilize_hand_percent==null?20:stabilize_hand_percent},set stabilize_hand_percent(v){stabilize_hand_percent=v},_hand_last:{"左":{},"右":{}}};return _handpose}(),reset_video_canvas:function(){if(this.video_canvas){this.video_canvas.width=this.video_canvas.height=camera_video_timestamp=0;camera_video_frame_id=""}},show:function(){if(!this.initialized||this.visible)return;this.visible=true;if(camera.target_devicePixelRatio!=window.devicePixelRatio){camera.target_devicePixelRatio=0;camera.video_track.applyConstraints(camera.set_constraints()).then(function(){DEBUG_show("(camera size updated)",2)})["catch"](function(err){DEBUG_show("ERROR:camera size failed to update")})}add_video_capture();if(this.hidden_enforced)this.hide()},hide:function(){if(!this.initialized||!this.visible)return;this.visible=false;this.video_canvas.style.visibility="hidden";face_detection.enabled=false;_bodyPix.enabled=false;remove_video_capture()},set_constraints:function(constraints_extra){var constraints={};const DPR=window.devicePixelRatio/this.target_devicePixelRatio;let w,h;const ratio=is_mobile?Math.min(270/Math.min(window.innerWidth,window.innerHeight),DPR):DPR;w=Math.round(window.innerWidth*ratio);h=Math.round(window.innerHeight*ratio);var limit=MMD_SA_options.user_camera.pixel_limit.current||MMD_SA_options.user_camera.pixel_limit._default_;if(!target_devicePixelRatio){if(MMD_SA_options.user_camera.pixel_limit.fixed){w=limit[0];h=limit[1]}else if(w*h>limit[0]*limit[1]){const target_ratio=Math.sqrt(w*h/(limit[0]*limit[1]));w=Math.round(w/target_ratio);h=Math.round(h/target_ratio)}}camera.target_width=w;camera.target_height=h;if(!MMD_SA_options.user_camera.pixel_limit.disabled){if(!is_mobile||!screen.orientation||/landscape/.test(screen.orientation.type)){constraints.width=w;constraints.height=h}else{constraints.width=h;constraints.height=w}}if(MMD_SA_options.user_camera.fps)constraints.frameRate=MMD_SA_options.user_camera;if(constraints_extra)constraints=Object.assign(constraints,constraints_extra);console.log("Camera constraints",constraints);return constraints}};return camera}(),data_filter:function(){class pass_through{constructor(){}filter(data){return data}}class data_filter{constructor(filters){this.filters=filters;filters.forEach(f=>{switch(f.type){case"one_euro":if(f.transition_time){f.para[1]=1/(1/(1/f.transition_time/60)-1)*60/(2*Math.PI);console.log("transition_time => minCutoff",f.para[1])}f.filter=new OneEuroFilter(...f.para||[]);break}if(f.id)f.filter.id=f.id})}filter(data,timestamp=System._browser.camera.initialized&&System._browser.camera.ML_enabled?System._browser.camera.video_timestamp:RAF_timestamp){if(data!=null){this.filters.forEach(f=>{if(!f.condition||f.condition()){this.data=f.filter.filter(data,timestamp);this.timestamp=RAF_timestamp}})}return this.data}}return data_filter}(),motion_control:function(){var getActiveWindow,Point,centerOf,mouse,keyboard,Key;var GE_common;var handedness;var keys=function(){var key_pressed={};var key_map={};return{pressed:key_pressed,map:key_map,temp:{},set_options:function(options){if(!initialized)return;if(!options.timeout_list){const list=["W","A","S","D"];for(const side of["L","R"]){for(const name in options[side]){const action=options[side][name];if(action.press)list.push(...action.press)}}options.timeout_list=list.map(k=>Key[k])}if(!options.clear_list)options.clear_list={};for(const side of["L","R"]){if(!options.clear_list[side]){const list=side=="L"?["W","A","S","D"]:[];for(const name in options[side]){const action=options[side][name];if(action.press)list.push(...action.press)}options.clear_list[side]=list.map(k=>[Key[k]])}}this.temp={};Object.assign(key_map,options);console.log(key_map)},action:function(ge,side,id){var obj=key_map[side][id]||{};return{press:obj.press&&(!obj.press_check||obj.press_check(ge))&&obj.press||[],release:obj.release||[],click:obj.click&&(!obj.click_check||obj.click_check(ge))&&obj.click||[]}},activate:async function(ge,side,id,k_to_release=[]){const action=this.action(ge,side,id);if(action.click.length)await keys.click(...action.click.map(k=>[Key[k]]));if(action.press.length){const k_to_press=action.press.map(k=>Key[k]);k_to_release=[...k_to_release.filter(k=>k_to_press.indexOf(k[0])==-1),...action.release.map(k=>[Key[k]])];if(k_to_release.length)await keys.releaseKey(...k_to_release);await keys.pressKey(...k_to_press.map(k=>[k]))}},clear_list:function(side){return key_map.clear_list[side]},pressKey:async function(...ks){let ks_filtered=Array.isArray(ks[0])&&ks||[ks];var promise_list=[];for(const _ks of ks_filtered){const ks_to_press=_ks.filter(k=>!key_pressed[k]);if(ks_to_press.length){for(const k of ks_to_press)key_pressed[k]=-1;await keyboard.pressKey(...ks_to_press);const ks_to_release=ks_to_press.filter(k=>key_pressed[k]==-2);if(ks_to_release.length){await keyboard.releaseKey(...ks_to_release);for(const k of ks_to_release)key_pressed[k]=0;console.log("key released enforced",ks_to_release.length)}}for(const k of _ks){if(key_pressed[k])key_pressed[k]=RAF_timestamp}}},releaseKey:async function(...ks){const ks_filtered=!ks.length?Object.keys(key_pressed).map(k=>[parseInt(k)]):Array.isArray(ks[0])&&ks||[ks];const promise_list=[];for(const _ks of ks_filtered){const ks_to_release=_ks.filter(k=>key_pressed[k]>0);if(ks_to_release.length){promise_list.push(keyboard.releaseKey(...ks_to_release).then(()=>{for(const k of ks_to_release)key_pressed[k]=0}))}const ks_waiting=_ks.filter(k=>key_pressed[k]<0);ks_waiting.forEach(k=>{key_pressed[k]=-2})}if(promise_list.length){await Promise.all(promise_list)}},releaseIdleKey:async function(...ks){const ks_filtered=!ks.length?Object.keys(key_pressed).map(k=>[parseInt(k)]):Array.isArray(ks[0])&&ks||[ks];const ks_to_release=ks_filtered.map(k_array=>k_array.filter(k=>key_pressed[k]&&(key_map.timeout_list.indexOf(k)==-1||RAF_timestamp-(key_pressed[k]>0?key_pressed[k]:RAF_timestamp)>500))).filter(k_array=>k_array.length);if(ks_to_release.length){await keys.releaseKey(...ks_to_release)}},click:async function(...ks){const ks_filtered=Array.isArray(ks[0])&&ks||[ks];await this.pressKey(...ks_filtered);await this.releaseKey(...ks_filtered)}}}();var gestures={custom:{},list:[],estimate:function(GE,handpose,score=9){const estimatedGestures=GE.estimate(handpose.keypoints,score);if(estimatedGestures.gestures.length){estimatedGestures.gestures.forEach(ge=>{ge._d=handpose._d;ge.hand_facing=this.list[0].hand_facing[handpose._d];ge.hand_rot_YXZ=this.list[0].hand_rot_YXZ[handpose._d];ge.thumb_out=this.list[0].thumb_out[handpose._d];ge.poseData=estimatedGestures.poseData});this.list[0].gestures=this.list[0].gestures.concat(estimatedGestures.gestures)}return estimatedGestures},search:function(name,para={}){function find(g){return g.gestures.find(ge=>name.split("|").some(name=>ge.name==name&&(!para.hand||para.hand._d==ge._d)&&(!para.hand_facing||para.hand_facing===ge.hand_facing)&&(para.thumb_out==null||para.thumb_out===ge.thumb_out)&&(!para.condition||ge._condition_passed||para.condition(ge)&&(ge._condition_passed=true))))}var time_limit=para.time_limit||0;var g_result;for(let i=0,i_max=this.list.length;i=para.duration)break}else break}if(duration{const list=gestures.list;for(let i=list.length-1;i>=0;i--){if(list[i].timestamp>RAF_timestamp-3e3){if(iMath.max(...pts_y);var info,angle;if(is_back){angle=gesture.hand_rot_YXZ[1];if(angle<=20)info="Horizontal Left";else if(angle>20&&angle<=50)info="Diagonal Down Left";else if(angle>130&&angle<=160)info="Diagonal Down Right";else if(angle>160)info="Horizontal Right";else info="Vertical Down";if(!gesture.thumb_out&&/Horizontal/.test(info)){info="";angle=0}}else{if(!gesture.thumb_out){info="";angle=0}else{const y=-(thumb[3][1]-thumb[1][1]);const x=thumb[3][0]-thumb[1][0];angle=Math.atan2(y,x)*180/Math.PI-90;if(angle<-180)angle+=360;angle=-angle;if(angle>20&&angle<=60)info="Diagonal Up Right";else if(angle>60&&angle<=120)info="Horizontal Right";else if(angle<-20&&angle>=-60)info="Diagonal Up Left";else if(angle<-60&&angle>=-120)info="Horizontal Left";else info="Vertical Up"}}return[info+"\n"+(thumb[1][1]>Math.max(...pts_y))+"\n"+gesture.hand_rot_YXZ.join("\n"),angle]}var get_active_window=function(){var w_active,title,region,timestamp,resolve_list;return function(){if(timestamp!=RAF_timestamp){timestamp=RAF_timestamp;w_active=null;resolve_list=[];getActiveWindow().then(async w=>{[title,region]=await Promise.all([w.title,w.region]);w_active=w;const result={w:w_active,title:title,region:region};resolve_list.forEach(resolve=>{resolve(result)})})}return new Promise((resolve,reject)=>{if(w_active){resolve({w:w_active,title:title,region:region})}else{resolve_list.push(resolve)}})}}();var nj_list=["0","1","2","3"];var debug_msg=[];var plugins=[];const motion_control={get enabled(){return enabled},set enabled(v){if(enabled==!!v)return;enabled=!!v;if(enabled){init()}else{this.setMousePosition(null)}DEBUG_show("Motion control:"+(enabled?"ON":"OFF"),3)},get enabled_nut(){return enabled_nut},get ready(){return enabled&&!busy},get handedness(){return handedness},get off_hand(){return handedness=="左"?"右":"左"},get window_active(){return window_active},get _debug_msg(){return debug_msg},get debug_msg(){return enabled&&debug_msg.length?debug_msg.join("\n")+"\n":""},get Key(){return Key},get key_pressed(){return keys.pressed},gestures:gestures,get plugins(){return plugins},add_plugin:function(p){if(plugins.indexOf(p)==-1)plugins.push(p)},process:async function(para){if(!this.ready)return;if(para.posenet_data){if(!gestures.list.length||gestures.list[0].timestamp!=RAF_timestamp){gestures.list.unshift({timestamp:RAF_timestamp,gestures:[]})}debug_msg=["Motion control"+(paused?"(PAUSED)":"")+":"];const handpose=para.posenet_data.handpose;if(handpose&&handpose.length){const hand_facing={};const hand_rot_YXZ={};const thumb_out={};handpose.forEach(hand=>{if(!hand._used)return;const f=System._browser.camera.poseNet.frames.skin[hand._d+"手首"];if(!f)return;const r=MMD_SA.TEMP_v3.setEulerFromQuaternion(f[0].rot,"YXZ");hand_rot_YXZ[hand._d]=r.toArray().map(a=>a*180/Math.PI);hand_facing[hand._d]=Math.abs(r.y)1.3*Math.abs(Math.abs(hand_rot_YXZ[hand._d][1])-90)/90+.2});gestures.list[0].hand_rot_YXZ=hand_rot_YXZ;gestures.list[0].hand_facing=hand_facing;gestures.list[0].thumb_out=thumb_out;handpose.forEach(hand=>{if(!enabled_nut)return;if(!hand._used)return;if(paused){gestures.estimate(GE_common,hand);const ge=gestures.search("index_up",{duration:1e3,hand_facing:"front",thumb_out:false});if(ge){paused=false;handedness=ge._d;DEBUG_show("Motion control:READY",2)}}else if(hand._d==handedness){gestures.estimate(GE_common,hand);const ge=gestures.search("index_up",{duration:1e3,hand_facing:"back",thumb_out:false});if(ge){paused=true;DEBUG_show("Motion control:PAUSED",2)}}})}}else if(para.facemesh_data){}plugins.forEach(p=>{p.process(para)});if(!enabled_nut)return;if(paused)return;this.virtual_mouse.process(para);this.game01.process(para)},setMousePosition:function(){var mouse_pt;return async function(pt){if(pt===null){mouse_pt=null;return}if(!enabled)return;if(!enabled_nut)return;if(pt){mouse_pt=pt}else if(!pt){return}await mouse.setPosition(mouse_pt)}}(),game01:function(){var _enabled,_initialized;var _key_map={id:"PSO2NGS",L:{thumb:{release:["Space","X"]},thumb_index:{press:["X"],release:["Space"]},thumb_palm:{press:["Space"],release:["X"]}},R:function(){function index_middle_click_check(ge){const click_state=keys.temp.index_middle||0;const clikc_state_new=ge.thumb_out?1:0;keys.temp.index_middle=clikc_state_new;return click_state!=clikc_state_new}return{index_thumb:{press:["Tab"],press_check:function(){if(!keys.temp.index_thumb)keys.temp.index_thumb={};keys.temp.index_thumb.clicked=true;return true}},index_up:{press:["Q"],press_check:function(){var index_thumb_active=keys.temp.index_thumb&&keys.temp.index_thumb.clicked;if(index_thumb_active)keys.temp.index_thumb.clicked=false;return index_thumb_active}},index_middle1:{press:["Period"],click:["Semicolon"],click_check:index_middle_click_check},index_middle2:{press:["Slash"],click:["Semicolon"],click_check:index_middle_click_check},index_middle3:{press:["Quote"],click:["Semicolon"],click_check:index_middle_click_check},thumb_palm:{press:["Backslash"]}}}()};var GE;var rot_x,rot_y;function init(){if(_initialized)return;GE=new fp.GestureEstimator([gestures.custom.index_up,gestures.custom.index_thumb,gestures.custom.index_middle,gestures.custom.index_pinky,gestures.custom.palm_open,gestures.custom.thumb,gestures.custom.thumb_index,gestures.custom.thumb_palm]);keys.set_options(_key_map);_initialized=true}return{get enabled(){return _enabled},set enabled(v){_enabled=v;if(_enabled){keys.set_options(_key_map)}else{}},process:async function(para){if(!this.enabled){await keys.releaseKey();return}init();const win=await get_active_window();const title=await win.title;if(para.facemesh_data&¶.head_rot){let rx=para.head_rot.x*180/Math.PI;let ry=para.head_rot.y*180/Math.PI;let my=Math.round(Math.sign(rx)*Math.pow(Math.min(Math.max((Math.abs(rx)-8)/15,0),1),2)*40);let mx=Math.round(Math.sign(ry)*Math.pow(Math.min(Math.max((Math.abs(ry)-10)/20,0),1),2)*40);debug_msg.push(rx,ry,mx,my);Promise.resolve(win.region).then(async region=>{const pt_center=await centerOf(region);const w_dim=region.width-1280<64?[1280,720]:[1920,1080];pt_center.y+=Math.round((region.height-w_dim[1]-(region.width-w_dim[0]))/2);pt_center.x+=mx;pt_center.y+=my;pt_center.y+=1;pt_center.x+=1;await motion_control.setMousePosition(pt_center)})}let handpose;if(para.posenet_data){handpose=para.posenet_data.handpose;let _debug_msg="";if(!handpose||!handpose.length){handpose=null;if(gestures.search("palm_open",{time_limit:500,hand_facing:"front",condition:()=>{}})){_debug_msg+="/CANCEL";await keys.releaseKey()}else{await keys.releaseIdleKey()}}debug_msg.push((handpose?"":"(no hand data)")+_debug_msg+"/key active:"+Object.keys(keys.pressed).filter(k=>keys.pressed[k]).join(","))}if(!handpose)return;for(const hand of handpose){if(!hand._used)continue;const action_side=hand._d==handedness?"R":"L";debug_msg.push(action_side+":");gestures.estimate(GE,hand);let ge;ge=gestures.search("palm_open",{hand:hand,hand_facing:"front",condition:function(ge){const hand=this.hand;const v1=v3a.fromArray(hand.annotations.index[0]).sub(v3b.fromArray(hand.annotations.index[3]));const v2=v3c.fromArray(hand.annotations.pinky[0]).sub(v3d.fromArray(hand.annotations.pinky[3]));return v1.angleTo(v2)*180/Math.PI>30}});if(ge){debug_msg.push("CANCEL");await keys.releaseKey(...keys.clear_list(action_side));continue}if(hand._d==handedness){ge=gestures.search("index_thumb",{hand:hand,hand_facing:"back",thumb_out:true});if(ge){await keys.activate(ge,action_side,ge.name,keys.clear_list(action_side));debug_msg.push("index_thumb");continue}ge=gestures.search("index_up",{hand:hand,hand_facing:"front",thumb_out:true});if(ge){await keys.activate(ge,action_side,ge.name,keys.clear_list(action_side));debug_msg.push("index_up");continue}ge=gestures.search("index_middle",{hand:hand});if(ge){let action_name=ge.name;switch(ge.poseData[1][2]){case"Vertical Up":action_name+=2;break;case"Diagonal Up Left":action_name+=handedness=="右"?1:3;break;case"Diagonal Up Right":action_name+=handedness=="右"?3:1;break}await keys.activate(ge,action_side,action_name,keys.clear_list(action_side));debug_msg.push(action_name);continue}ge=gestures.search("thumb_palm",{hand:hand,condition:function(ge){if(!/(Horizontal|Diagonal Up)/.test(ge.poseData[2][2]))return false;const hand=this.hand;const v1=v3a.fromArray(hand.annotations.index[0]).sub(v3b.fromArray(hand.annotations.index[3]));const v2=v3c.fromArray(hand.annotations.pinky[0]).sub(v3d.fromArray(hand.annotations.pinky[3]));return v1.angleTo(v2)*180/Math.PI<20}});if(ge){await keys.activate(ge,action_side,ge.name,keys.clear_list(action_side));debug_msg.push("thumb_palm");continue}ge=gestures.search("thumb",{hand:hand});if(ge){debug_msg.push("CANCEL");await keys.releaseKey(...keys.clear_list(action_side));continue}ge=gestures.search("index_pinky",{hand:hand});if(ge){debug_msg.push("index_pinky");continue}}else{ge=gestures.search("thumb_palm|thumb_index|thumb",{hand:hand,condition:function(ge){if(ge.name!="thumb_palm")return true;const hand=this.hand;const v1=v3a.fromArray(hand.annotations.index[0]).sub(v3b.fromArray(hand.annotations.index[3]));const v2=v3c.fromArray(hand.annotations.pinky[0]).sub(v3d.fromArray(hand.annotations.pinky[3]));return v1.angleTo(v2)*180/Math.PI<20}});if(ge){const dir_data=get_virtual_joystick_data(ge,hand);const dir=dir_data[0];let k_to_press=[];let k_to_release=[];switch(dir){case"Vertical Up":k_to_press.push("W");k_to_release.push("A","S","D");break;case"Diagonal Up Right":k_to_press.push("W","A");k_to_release.push("S","D");break;case"Horizontal Right":k_to_press.push("A");k_to_release.push("W","S","D");break;case"Diagonal Up Left":k_to_press.push("W","D");k_to_release.push("A","S");break;case"Horizontal Left":k_to_press.push("D");k_to_release.push("W","A","S");break;case"Diagonal Down Right":k_to_press.push("S","A");k_to_release.push("W","D");break;case"Diagonal Down Left":k_to_press.push("S","D");k_to_release.push("W","A");break;case"Vertical Down":k_to_press.push("S");k_to_release.push("W","A","D");break;default:k_to_release.push("W","A","S","D")}var action=keys.action(ge,action_side,ge.name);if(action.press.length)k_to_press.push(...action.press);if(action.release.length)k_to_release.push(...action.release);if(k_to_press.length)await keys.pressKey(...k_to_press.map(k=>[Key[k]]));if(k_to_release.length)await keys.releaseKey(...k_to_release.map(k=>[Key[k]]));debug_msg.push([ge.name,dir].join("/")+"/"+RAF_timestamp);continue}}if(!ge)await keys.releaseIdleKey(...keys.clear_list(action_side))}for(const hand_index of[[0,handpose.findIndex(hand=>hand._used&&hand._d==handedness)],[1,handpose.findIndex(hand=>hand._used&&hand._d!=handedness)]]){if(hand_index[1]!=-1)continue;const action_side=hand_index[0]==0?"R":"L";if(gestures.search("palm_open",{time_limit:500,hand:{_d:hand_index[0]==0?handedness:motion_control.off_hand},hand_facing:"front",condition:()=>{}})){await keys.releaseKey(...keys.clear_list(action_side))}else{await keys.releaseIdleKey(...keys.clear_list(action_side))}}}}}(),virtual_mouse:function(){var initialized;var GE;function init(){if(initialized)return;GE=new fp.GestureEstimator([fp.Gestures.VictoryGesture,fp.Gestures.ThumbsUpGesture,gestures.custom.index_up]);initialized=true}return{enabled:false,process:async function(para){if(!this.enabled)return;if(!para.posenet_data)return;init();const handpose=para.posenet_data.handpose;if(!handpose||!handpose.length)return;const hand_index=handpose[0]._d==handedness?0:1;const dir=handedness=="右"?0:1;if(!handpose[hand_index]||!handpose[hand_index]._used)return;const w_half=screen.width/2;const h_half=screen.height/2;const video_canvas=System._browser.camera.video_canvas;const AR=video_canvas.width/video_canvas.height/(w_half/h_half);const r=.5;const pointer=handpose[hand_index].annotations.index[0];const screen_pos={x:-(-video_canvas.width/2+pointer[0])/(video_canvas.width/2*r),y:(-video_canvas.height/2+pointer[1])/(video_canvas.height/2*r)};screen_pos.x=Math.round(w_half+THREE.Math.clamp(screen_pos.x*AR,-1,1)*w_half);screen_pos.y=Math.round(h_half+THREE.Math.clamp(screen_pos.y/AR,-1,1)*h_half);const target=new Point(screen_pos.x,screen_pos.y);await motion_control.setMousePosition(target)}}}()};return motion_control}(),snapshot:function(){var waiting=false;var waiting_for_bodyPix=false;var time_ini;var countdown;function countdown_to_snapshot(){const SL=MMD_SA.THREEX.SL;const camera=System._browser.camera;var countdown_now=Math.ceil(3-(Date.now()-time_ini)/1e3);if(countdown_now<=0){if(!camera.visible){canvas_capture(SL);return}DEBUG_show("Capturing...");if(!camera.stream){if(!camera.bodyPix.enabled){draw_video_and_3D();return}waiting_for_bodyPix=true}else{camera.target_devicePixelRatio=1;camera.video_track.applyConstraints(camera.set_constraints()).then(function(){System._browser.console.log("(Ready to capture)");System._browser.on_animation_update.add(function(){MMD_SA._renderer.devicePixelRatio=window.devicePixelRatio;MMD_SA._renderer.__resize(EV_width,EV_height);if(!camera.bodyPix.enabled){System._browser.on_animation_update.add(function(){draw_video_and_3D()},0,1);return}waiting_for_bodyPix=true},0,0)})["catch"](function(err){DEBUG_show("ERROR:camera size failed to update");clear()})}System._browser.on_animation_update.remove(countdown_to_snapshot,0)}else if(countdown!=countdown_now){countdown=countdown_now;DEBUG_show(countdown)}}function draw_video_and_3D(){const SL=MMD_SA.THREEX.SL;const camera=System._browser.camera;let canvas=camera.video_canvas_bodyPix;canvas.width=SL.width;canvas.height=SL.height;let context=canvas.getContext("2d");context.globalCompositeOperation="source-over";const w=camera.video_canvas.width;const h=camera.video_canvas.height;const scale=Math.min(SL.width/w,SL.height/h);const w2=Math.round(w*scale);const h2=Math.round(h*scale);context.drawImage(camera.video_canvas,0,0,w,h,(SL.width-w2)/2,(SL.height-h2)/2,w2,h2);if(camera.face_detection.enabled)context.drawImage(camera.video_canvas_face_detection,0,0);context.save();context.translate(canvas.width,0);context.scale(-1,1);context.drawImage(SL,0,0);context.restore();canvas_capture(canvas)}function canvas_capture(canvas){waiting=true;waiting_for_bodyPix=false;System._browser.on_animation_update.remove(countdown_to_snapshot,0);canvas.toBlob(function(blob){if(webkit_electron_mode){System._browser.save_file("snapshot_"+Date.now()+".png",blob)}else{const url=URL.createObjectURL(blob);window.open(url)}clear()})}function clear(){const camera=System._browser.camera;Ldebug.style.posLeft=Ldebug.style.posTop=0;Ldebug.style.transform=Ldebug.style.transformOrigin="";DEBUG_show();waiting_for_bodyPix=false;camera.target_devicePixelRatio=0;waiting=false}const snapshot={init:function(){if(waiting){return true}const SL=MMD_SA.THREEX.SL;const camera=System._browser.camera;if(MMD_SA.WebXR.session){let AR_options=MMD_SA_options.WebXR&&MMD_SA_options.WebXR.AR;if(!AR_options.dom_overlay||!AR_options.dom_overlay.use_dummy_webgl){DEBUG_show("(No snapshot in AR WebGL)",3);return true}}if(!camera.visible){canvas_capture(SL)}else{waiting=true;time_ini=Date.now();Ldebug.style.posLeft=Ldebug.style.posTop=50;Ldebug.style.transformOrigin="0 0";Ldebug.style.transform="scale(5,5)";countdown=3;DEBUG_show();DEBUG_show(countdown);System._browser.on_animation_update.add(countdown_to_snapshot,0,0,-1)}},check_bodyPix:function(){if(!waiting)return false;const camera=System._browser.camera;if(waiting_for_bodyPix){canvas_capture(camera.video_canvas_bodyPix)}return true}};return snapshot}(),video_capture:(()=>{const canvas=document.createElement("canvas");function init(){const specs=video_capture.get_specs();canvas.width=specs.width;canvas.height=specs.height;video_capture._fps=specs.fps;video_capture.mime_type=specs.mime_type;System._browser.on_animation_update.add(update_canvas,0,1,-1)}function update_canvas(){const SL=MMD_SA.THREEX.SL;const ctx=canvas.getContext("2d");if(MMD_SA.music_mode){const video=SL_MC_video_obj.vo.media_linked&&SL_MC_video_obj.vo.media_linked.find(m=>m.id=="motion_bg_video");if(video&&video.style.visibility!="hidden"){const ratio=Math.min(video.videoWidth/video.videoHeight,canvas.width/canvas.height);const dim=Math.round(Math.min(video.videoWidth,video.videoHeight)*ratio);const w=Math.min(dim,video.videoWidth);const h=Math.min(dim,video.videoHeight);const x=(video.videoWidth-w)/2;const y=(video.videoHeight-h)/2;ctx.drawImage(video,x,y,w,h,0,0,canvas.width,canvas.height)}}else{ctx.fillStyle=document.body.style.backgroundColor||"white";ctx.fillRect(0,0,canvas.width,canvas.height)}if(canvas.width==SL.width&&canvas.height==SL.height){ctx.drawImage(SL,0,0)}else{ctx.drawImage(SL,0,0,canvas.width,canvas.height)}}let start_recorder_resolve;function start_recorder(){if(!video_capture.media_recorder||video_capture.started)return;video_capture.started=true;video_capture.media_recorder.start();if(start_recorder_resolve&&video_capture.stream.getAudioTracks().length&&(MMD_SA.music_mode?SL_MC_video_obj.vo.audio_obj.paused:MMD_SA.motion_player_control.enabled&&MMD_SA.motion_player_control.paused)){SL_MC_Play()}}function event_video_capture_stop(){System._browser.video_capture.stop()}var data_chunks=[];const video_capture={enabled:false,started:false,fps:undefined,target_width:undefined,target_height:undefined,FFmpeg:(()=>{var initialized;var ffmpeg;var worker;var promise_for_encoded;const _FFmpeg={enabled:webkit_electron_mode,load:async function(){if(initialized)return;initialized=true;return new Promise(resolve=>{worker=new Worker("js/ffmpeg_worker.js");worker.onmessage=e=>{const data=e.data;if(typeof data==="string"){if(data=="OK"){resolve()}}else{const blob=new Blob([data.buffer],{type:data.output_type});return promise_for_encoded(blob)}}})},encode:async function(...inputs){await this.load();const data={inputs:[]};for(const input of inputs){if(input.blob)input.blob=await input.blob.arrayBuffer();data.inputs.push(input)}worker.postMessage(data,data.inputs.filter(input=>input.blob).map(input=>input.blob));return new Promise(resolve=>{promise_for_encoded=resolve})}};return _FFmpeg})(),get_specs:function(){const SL=MMD_SA.THREEX.SL;const SL_pixels=SL.width*SL.height;let w=this.target_width,h=this.target_height,fps=this.fps;if(!w){if(is_mobile){w=1280;h=720;if(SL.widthw*h){const scale=Math.min(w/SL.width,h/SL.height);w=Math.min(Math.round(SL.width*scale/4)*4,w);h=Math.min(Math.round(SL.height*scale/4)*4,h)}else{w=SL.width;h=SL.height}const video_types=["video/webm;codecs=h264","video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];let mime_type;for(const type of video_types){if(MediaRecorder.isTypeSupported(type)){mime_type=type;break}}return{width:w,height:h,fps:fps,mime_type:mime_type}},start:function(){if(this.busy){DEBUG_show("(Media recorder still in use)",3);return}if(this.enabled)return;this.enabled=true;init();const fps=this._fps==-1?undefined:this._fps;const video_stream=canvas.captureStream(fps);this.stream=new MediaStream;this.stream.addTrack(video_stream.getTracks()[0]);this.audio_src=MMD_SA.music_mode&&SL_MC_video_obj.vo.audio_obj.src;if(this.audio_src&&(!this.FFmpeg.enabled||this.target_mime_type||!SL_MC_video_obj.vo.motion_by_song_name_mode||SL_MC_video_obj.vo.audio_obj.currentTime)){const audio_stream=SL_MC_video_obj.vo.audio_obj.captureStream();this.stream.addTrack(audio_stream.getTracks()[0])}this.file_ext="."+(this.mime_type.indexOf("x-matroska")!=-1?"mkv":this.mime_type.replace(/^.+[\/]/,"").replace(/\;.+$/,""));this.media_recorder=new MediaRecorder(this.stream,{videoBitsPerSecond:canvas.width*canvas.height*4,mimeType:this.mime_type});data_chunks.length=0;this.media_recorder.addEventListener("dataavailable",async e=>{data_chunks.push(e.data);if(!this.enabled){let blob=new Blob(data_chunks,{type:this.mime_type});this.stream.getTracks().forEach(s=>{s.stop()});let file_ext=this.file_ext;this.busy=true;if(this.FFmpeg.enabled&&/h264/.test(this.mime_type)&&!this.target_mime_type){try{DEBUG_show("Encoding MP4...");const inputs=[{name:"video",blob:blob}];if(this.audio_src){const input_audio={name:"audio"};if(!this.stream.getAudioTracks().length)input_audio.blob=await fetch(this.audio_src).then(r=>r.blob());inputs.push(input_audio)}blob=await this.FFmpeg.encode(...inputs);file_ext=".mp4"}catch(err){console.error(err);this.FFmpeg.enabled=false}}this.busy=false;data_chunks.length=0;DEBUG_show("🔴Video Capture:OFF",5);System._browser.save_file("video_"+Date.now()+file_ext,blob)}});const promise=new Promise(resolve=>{start_recorder_resolve=resolve;this.media_recorder.addEventListener("start",()=>{DEBUG_show();DEBUG_show("🔴Video Capture:ON ("+(canvas.width+"x"+canvas.height+(video_capture._fps>-1?"/"+video_capture._fps+"fps":""))+"/"+video_capture.mime_type+")",10);if(MMD_SA.music_mode?SL_MC_video_obj.vo.audio_obj.paused:MMD_SA.motion_player_control.enabled&&MMD_SA.motion_player_control.paused){SL_MC_Play()}start_recorder_resolve();start_recorder_resolve=null},{once:true})});DEBUG_show();const time=MMD_SA.THREEX.get_model(0).animation.time;if(time||(MMD_SA.music_mode?!SL_MC_video_obj.vo.motion_by_song_name_mode||!SL_MC_video_obj.vo.audio_obj.paused:!MMD_SA.motion_player_control.enabled||!MMD_SA.motion_player_control.paused)){start_recorder()}else{if(video_capture.audio_src){window.addEventListener("SA_audio_onended",e=>{System._browser.video_capture.stop()},{once:true})}else if(MMD_SA.motion_player_control.enabled){const animation=MMD_SA.THREEX.get_model(0).animation;if(animation.enabled){animation.mixer.addEventListener("loop",event_video_capture_stop,{once:true});animation.mixer.addEventListener("finished",event_video_capture_stop,{once:true})}else{window.addEventListener("SA_MMD_model0_onmotionended",event_video_capture_stop,{once:true})}}const _reset_rigid_body_physics_step=MMD_SA_options.reset_rigid_body_physics_step;MMD_SA_options.reset_rigid_body_physics_step=0;new Promise(resolve=>{DEBUG_show("(Resetting physics)",3);let count=60*3;System._browser.on_animation_update.add(()=>{MMD_SA.seek_motion(time,true);if(MMD_SA.THREEX.get_model(0).animation.enabled)THREE.MMD.getModels()[0].seekMotion(0);if(--count==0)resolve()},0,0,count)}).then(()=>{MMD_SA.seek_motion(time);if(MMD_SA.motion_player_control.enabled){MMD_SA.motion_player_control.pause()}else{jThree.MMD.pause()}MMD_SA_options.reset_rigid_body_physics_step=_reset_rigid_body_physics_step;start_recorder()})}DEBUG_show("🔴Video Capture",3);return promise},stop:function(){if(!this.media_recorder)return;if(!this.enabled)return;this.enabled=false;System._browser.on_animation_update.remove(update_canvas,1);const animation=MMD_SA.THREEX.get_model(0).animation;if(animation.enabled){animation.mixer.removeEventListener("loop",event_video_capture_stop);animation.mixer.removeEventListener("finished",event_video_capture_stop)}else{window.removeEventListener("SA_MMD_model0_onmotionended",event_video_capture_stop)}this.media_recorder.stop();this.media_recorder=undefined;this.started=false},pause:function(){if(this.started&&this.media_recorder.state!="paused")this.media_recorder.pause()},resume:function(){if(this.started&&this.media_recorder.state=="paused")this.media_recorder.resume()}};return video_capture})(),hotkeys:(()=>{class Hotkey{constructor(config,index){this.id=config.id;this.index=index;this.config=Hotkey.config_by_id[this.id]=config;this.event={};this.accelerator=config.accelerator[index];const keys=this.accelerator.split("+");keys.forEach(key=>{if(/^(Cmd|Command|Ctrl|Control)$/.test(key)){this.event.ctrlKey=true}else if(key=="Shift"){this.event.shiftKey=true}else if(key=="Alt"){this.event.altKey=true}else if(/^[0-9]$/.test(key)){this.event.code="Digit"+key}else if(/^num([0-9])$/.test(key)){this.event.code="Numpad"+RegExp.$1}else if(/^[A-Z]$/.test(key)){this.event.code="Key"+key}})}static config_by_id={};static get_config(id){return Hotkey.config_by_id[id]}static accelerators={};static register(id,accelerator,para){if(!Hotkey.unregister(id))return false;const config_current=Hotkey.get_config(id);if(para)Object.assign(config_current,para);config_current.accelerator=accelerator;accelerator.forEach((acc,i)=>{Hotkey.accelerators[acc]=new Hotkey(config_current,i)});return Hotkey.enable_global(id)}static unregister(id){const config_current=Hotkey.get_config(id);if(!config_current)return false;config_current.accelerator.forEach(acc=>{if(Hotkey.accelerators[acc].is_global){try{webkit_electron_remote.globalShortcut.unregister(acc)}catch(err){}}delete Hotkey.accelerators[acc]});return true}static enable_global(id,is_global){if(!webkit_electron_mode)return true;const config_current=Hotkey.get_config(id);if(!config_current)return;let global_disabled=is_global==null?!!Hotkey.accelerators[config_current.accelerator[0]].config.global_disabled:!is_global;is_global=global_disabled?false:Hotkey.is_global;let registered=true;config_current.accelerator.forEach(acc=>{const hotkey=Hotkey.accelerators[acc];hotkey.config.global_disabled=global_disabled;try{if(is_global){if(!hotkey.is_global&&!hotkey.config.global_disabled)webkit_electron_remote.globalShortcut.register(acc,()=>{SA_topmost_window.SA_OnKeyDown(hotkey.event)})}else{if(hotkey.is_global)webkit_electron_remote.globalShortcut.unregister(acc)}hotkey.is_global=webkit_electron_remote.globalShortcut.isRegistered(hotkey.accelerator);if(registered&&is_global&&!hotkey.config.global_disabled)registered=hotkey.is_global}catch(err){}});return registered}static remove(id){if(Hotkey.unregister(id))delete Hotkey.config_by_id[id]}static add(acc_obj){Hotkey.remove(acc_obj.id);acc_obj.accelerator.forEach((acc,i)=>{Hotkey.accelerators[acc]=new Hotkey(acc_obj,i)});Hotkey.enable_global(acc_obj.id)}static _is_global=null;static get is_global(){return this._is_global==null?true:this._is_global}static set is_global(v){this._is_global=v}static register_global(is_global){if(browser_native_mode){DEBUG_show("(Global hotkey is for app mode only.)",5);return}Hotkey.is_global=is_global==null?Hotkey.is_global:is_global;DEBUG_show("Global hotkey:"+(is_global?"ON":"OFF"),3);Object.values(Hotkey.accelerators).forEach(hotkey=>{try{if(is_global){if(!hotkey.is_global&&!hotkey.config.global_disabled)webkit_electron_remote.globalShortcut.register(hotkey.accelerator,()=>{SA_topmost_window.SA_OnKeyDown(hotkey.event)})}else{if(hotkey.is_global)webkit_electron_remote.globalShortcut.unregister(hotkey.accelerator)}hotkey.is_global=webkit_electron_remote.globalShortcut.isRegistered(hotkey.accelerator)}catch(err){}})}}window.addEventListener("SA_keydown",ev=>{const e=ev.detail.e;Object.values(Hotkey.config_by_id).some(config=>{const acc_matched=config.accelerator.some(acc=>{const a=Hotkey.accelerators[acc].event;if(a.code&&a.code!=e.code)return false;if(a.ctrlKey&&!e.ctrlKey)return false;if(a.shiftKey&&!e.shiftKey)return false;if(a.altKey&&!e.altKey)return false;return true});if(acc_matched){const return_value=config.process(ev);if(return_value!==false)ev.detail.result.return_value=true;return true}})});return Hotkey})(),load_script:function(){var script_loader_cache={};var script_loader=function(url,is_module){this.url=url;this.name=url.replace(/^.+[\/\\]/,"");this.loaded=false;this.resolve_list=[];this.reject_list=[];if(is_module){const that=this;import(url).then(module=>{that.module=module;that.check_loaded()})}else{const script=document.createElement("script");script.onload=this.check_loaded.bind(this);script.src=url;document.head.appendChild(script)}};script_loader.prototype.check_loaded=function(){this.loaded=true;console.log(this.name+" loaded");this.resolve_list.forEach(resolve=>{resolve(this.module)})};script_loader.prototype.make_promise=function(resolve,reject){this.resolve_list.push(resolve);if(reject)this.reject_list.push(reject)};return function(url,is_module){var name=url.replace(/^.+[\/\\]/,"");var m=script_loader_cache[name]=script_loader_cache[name];if(m){if(m.loaded)return Promise.resolve(m.module)}else{m=script_loader_cache[name]=new script_loader(url,is_module)}return new Promise((resolve,reject)=>{m.make_promise(resolve,reject)})}}(),save_file:function(){var link_file;return function(filename,content,mime_type){const blob=!mime_type?content:new Blob([content],{type:mime_type});const objectURL=URL.createObjectURL(blob);if(!link_file){link_file=document.createElement("a");link_file.style.display="none";document.body.appendChild(link_file)}else{URL.revokeObjectURL(link_file.href)}link_file.href=objectURL;link_file.download=filename||"";link_file.click()}}(),update_obj_url:async function(src,type){if(/^(.+\.zip)\#[\/\\](.+)$/i.test(src)){const src_local=SA_topmost_window.DragDrop._obj_url[src];if(!src_local||src==src_local){const zip=XMLHttpRequestZIP.zip_by_url(RegExp.$1);let blob=await zip.file(RegExp.$2.replace(/\\/g,"/"))["async"]("blob");if(type)blob=new Blob([blob],{type:type});console.log("Object URL (inside zip) updated",src);SA_topmost_window.DragDrop._obj_url[src]=SA_topmost_window.URL.createObjectURL(blob)}}},skip_background_rendering:true,skip_rendering:false,rendering_check:function(){if(this.skip_rendering&&!this.hidden)return false;if(!returnBoolean("DisableBackgroundThrottling"))return true;const skip_rendering=this.skip_background_rendering&&this.hidden;let c_dummy=document.getElementById("canvas_DisableBackgroundThrottling");if(skip_rendering){if(!c_dummy){c_dummy=document.createElement("canvas");c_dummy.id="canvas_DisableBackgroundThrottling";c_dummy.width=c_dummy.height=1;c_dummy.style.position="absolute";c_dummy.style.posLeft=c_dummy.style.posTop="0px";c_dummy.style.zIndex=9999;document.getElementById("Lbody_host").appendChild(c_dummy)}c_dummy.getContext("2d").clearRect(0,0,c_dummy.width,c_dummy.height)}if(c_dummy)c_dummy.style.visibility=skip_rendering?"inherit":"hidden";return!skip_rendering},console:{content_list:[],log:function(){for(var i=0;i{var language_full,language,language_info;const language_default=navigator.language+"-default";var dictionary;var font={ja:'"Meiryo UI"'};const translation={get language(){return language},set language(v){language_full=v||language_default;language=language_full.split("-")[0].toLowerCase();if(language_full==language_default){language_info="System default"}else{switch(language){case"en":language_info="English";break;case"ja":language_info="Japanese";break;default:language_info="System default"}}},get language_full(){return language_full},get language_info(){return language_info},get language_default(){return language_default},get dictionary(){return dictionary},set dictionary(v){dictionary=Object.assign(dictionary||{},v)},get font(){return font[language]},get:function(path,language_now=language){if(!dictionary)return"(Now loading...)";let obj=dictionary;path.split(".").every(node=>{obj=obj[node];return obj});const result=obj&&(obj._translation_?.[language_now]||obj._translation_?._default_);return result!=null?result:"("+path+")"}};translation.language=null;return translation})(),DEBUG_show:function(){const _DEBUG_show=self.DEBUG_show;self.DEBUG_show=function(...args){if(System._browser.overlay_mode>0){if(!args.length)_DEBUG_show()}else{_DEBUG_show(...args)}};return _DEBUG_show}()},_hash_sha256:{_hash_cache:{},hash:function(str){if(webkit_electron_mode){var f=webkit_electron_remote.getGlobal("HASH_SHA256");if(f)return f.hash(str)}var cache=this._hash_cache[str];if(cache)return cache;var hash=require("crypto").createHash("sha256");hash.update(str);cache=this._hash_cache[str]=hash.digest("hex");return cache}},_media_objs_paused_:[],_gadget_resume:function(is_auto){if(is_auto&&!SA_topmost_window.EV_sync_update.RAF_auto_paused)return false;if(!SA_topmost_window.EV_sync_update.RAF_paused)return false;SA_topmost_window.EV_sync_update.RAF_paused=false;SA_topmost_window.EV_sync_update.RAF_auto_paused=false;SA_topmost_window.System._media_objs_paused_.forEach(function(v){if(v.SL_MC_Play)v.SL_MC_Play();else if(v.paused)v.play()});SA_topmost_window.System._media_objs_paused_=[];System._browser.update_tray();return true},_gadget_pause:function(is_auto){if(SA_topmost_window.EV_sync_update.RAF_paused)return false;SA_topmost_window.EV_sync_update.RAF_paused=true;SA_topmost_window.EV_sync_update.RAF_auto_paused=is_auto;var _media_objs_paused_=SA_topmost_window.System._media_objs_paused_;var wins=[top];for(var i=0;i10){clearInterval(System._browser._window_move_timerID);System._browser._window_move_timerID=null}}}(),100)}}}();(()=>{function o(){function e(){const e=document.body.style;webkit_window.setContentSize(e.pixelWidth,e.pixelHeight)}if(webkit_electron_mode&&window.devicePixelRatio!=1){window.removeEventListener("resize",e);window.addEventListener("resize",e,{once:true})}}SA_top_window.moveToAbsolute=function(e,t,i){o();if(absolute_screen_mode&&!i){webkit_window.setPosition(~~e,~~t)}else{this.moveTo(e,t)}};SA_top_window.moveByAbsolute=function(t,i){o();if(absolute_screen_mode){let e=SA_top_window.getPos(true);t+=~~e[0];i+=~~e[1];webkit_window.setPosition(t,i)}else{this.moveBy(t,i)}}})();Object.defineProperty(SA_top_window,"screenLeftAbsolute",{get:function(){return absolute_screen_mode?SA_top_window.getPos()[0]:this.screenLeft}});Object.defineProperty(SA_top_window,"screenTopAbsolute",{get:function(){return absolute_screen_mode?SA_top_window.getPos()[1]:this.screenTop}})},Gadget:{_init:function(){this.Settings.read=this.Settings.readString;this.Settings.write=this.Settings.writeString;Object.defineProperty(this,"onSettingsClosing",{get:function(){return this._onSettingsClosing},set:function(e){this._onSettingsClosing=e;this.settings_window.onbeforeunload=function(){e({closeAction:!!this.returnValue,Action:{commit:true}});System.Gadget.settings_window.System=null;System.Gadget.settings_window.onbeforeunload=null;System.Gadget.settings_window=null}}});var e=new ActiveXObject("Microsoft.XMLDOM");e["async"]=false;e.resolveExternals=false;e.validateOnParse=false;e.load("gadget.xml");this.version=e.selectSingleNode("//version").text},path:xul_mode?XPCOM_object._SA_root:use_SA_browser_mode?toLocalPath(self.location.href).replace(/[\/\\][^\/\\]+$/,""):"",_path_folder:function(){return this.path.replace(/[\/\\][^\/\\]+$/,"")},document:document,version:"1.0.0.0",docked:is_SA_child_animation,visible:true,Settings:{_settings_need_update:false,_settings:{},_changed:{},readString:function(name,raw_read){var v=this._settings[name];v=v?raw_read?decodeURIComponent(v):decodeURIComponent(v).replace(/\$([^\$]+)\$/g,function($0,$1,$2){return eval($1)}):Settings_default._custom_[name]||"";return v},writeString:function(e,t){var i=this._settings[e]||"";var o=encodeURIComponent(t);this._settings[e]=o;if(WallpaperEngine_CEF_mode){var n=JSON.parse(localStorage.Settings_by_path);if(!SA_HTA_folder||!n[SA_HTA_folder]){console.error(SA_HTA_folder)}else{if(n[SA_HTA_folder][e]!=o){n[SA_HTA_folder][e]=o;localStorage.Settings_by_path=JSON.stringify(n)}}}if(i!=o)this._changed[e]=this._settings_need_update=true},_writeSettings:function(e,t){if(!e&&!this._settings_need_update)return;this._settings_need_update=false;SystemEXT._save_settings_only=t;try{this._writeSettings_CORE()}catch(i){}SystemEXT._save_settings_only=false},_writeSettings_CORE:function(){var e=[];var t=this._settings;t._screenLeft=t._screenTop="";for(var i in t){var o=System.Gadget.Settings.readString(i);if(!o)continue;if(i=="_screenLeft"){o=SA_top_window.screenLeftAbsolute}else if(i=="_screenTop"){o=SA_top_window.screenTopAbsolute}e.push('"'+i+'":"'+encodeURIComponent(o)+'"')}SystemEXT.SaveLocalSettings(e)}}},Environment:{win32_env:null,getEnvironmentVariable:function(e){return oShell.ExpandEnvironmentStrings("%"+e+"%")}},Machine:{_init:function(){this._init_memory=function(){if(webkit_mode)return;if(this._WMI_obj_memory)return;try{this._WMI_obj_memory=new WMI_Refresher("Win32_PerfFormattedData_PerfOS_Memory","EV");this._WMI_obj_memory.init()}catch(e){}};Object.defineProperty(this,"availableMemory",{get:function(){if(webkit_mode)return SA_require("os").freemem()/(1024*1024);this._init_memory();var e=this._WMI_obj_memory.update();return e.length?parseInt(e[e.length-1].AvailableMBytes):0}});Object.defineProperty(this,"totalMemory",{get:function(){if(webkit_mode)return SA_require("os").totalmem()/(1024*1024);if(!this._totalMemory){try{var e=new WMI_Refresher("Win32_OperatingSystem");e.init();this._totalMemory=parseInt(e.update()[0].TotalVisibleMemorySize)/1024}catch(t){}}return this._totalMemory}});this.totalMemory=0;var e={_WMI_obj:null,_cpu_obj:null,_get_cpu_obj:null,_init:function(){if(webkit_mode){if(this._get_cpu_obj)return;this._cpu_obj=[{count:-1,cpus:SA_require("os").cpus()}];this._get_cpu_obj=function(){var e=this._cpu_obj;if(e[0].count!=PC_count_absolute){if(e.unshift({count:PC_count_absolute,cpus:SA_require("os").cpus()})==3)e.pop()}return e};return}if(this._WMI_obj)return;try{this._WMI_obj=new WMI_Refresher("Win32_PerfFormattedData_PerfOS_Processor","EV");this._WMI_obj.init()}catch(e){}},item:function(e){if(webkit_mode){var t=this._get_cpu_obj();var i=[];for(var o=0;o<2;o++){var n=t[o].cpus[e].times;var a=0;for(var s in n)a+=n[s];i[o]={total:a,idle:n.idle}}var r=i[0].idle-i[1].idle;var a=i[0].total-i[1].total;return{usagePercentage:a?(1-r/a)*100:0}}return{usagePercentage:parseFloat(this._WMI_obj.update()[e].PercentProcessorTime)}}};Object.defineProperty(e,"count",{get:function(){if(webkit_mode){return this._get_cpu_obj()[0].cpus.length}return this._WMI_obj.update().length-1}});this._CPUs=e;Object.defineProperty(this,"CPUs",{get:function(){this._CPUs._init();return this._CPUs}});var t={_WMI_obj:null,_init:function(){if(this._battery)return;this._battery={level:1,charging:false};if("getBattery"in navigator){var t=this;navigator.getBattery().then(function(e){DEBUG_show("Use Battery Status API",2);t._battery=e})}}};Object.defineProperty(t,"batteryPercentRemaining",{get:function(){return this._battery.level*100}});Object.defineProperty(t,"isPowerLineConnected",{get:function(){return this._battery.level==1||this._battery.charging}});Object.defineProperty(t,"isBatteryCharging",{get:function(){return this._battery.charging}});this._PowerStatus=t;Object.defineProperty(this,"PowerStatus",{get:function(){this._PowerStatus._init();return this._PowerStatus}})}},Shell:{itemFromFileDrop:function(e,t){return{path:""}},itemFromPath:function(e){e=toLocalPath(e);var t=e.replace(/[\/\\][^\/\\]+$/,"");var i=e.replace(/^.+[\/\\]/,"");var o=Shell_OBJ.NameSpace(t);if(o)o=o.ParseName(i);return o?new this._FolderItem(o):null},execute:function(e,t){Shell_OBJ.ShellExecute(e,t)},chooseFolder:function(e,t){var i=Shell_OBJ.BrowseForFolder(0,e,t);return i?new this._FolderItem(i.Self):null},_FolderItem:function(e){if(!this._constructor_initialized){this.constructor.prototype._constructor_initialized=true;this.constructor.prototype.metadata=function(e){var t=this.obj.ExtendedProperty("Dimensions");if(!t){var i=this.obj.Path.replace(/[\/\\][^\/\\]+$/,"");var o=Shell_OBJ.NameSpace(i);t=o.GetDetailsOf(this.obj,26)}return t};Object.defineProperty(this.constructor.prototype,"isFolder",{get:function(){return this.obj.IsFolder}});Object.defineProperty(this.constructor.prototype,"isFileSystem",{get:function(){return(ie9_native?!this.obj.IsFolder:true)&&this.obj.IsFileSystem}});Object.defineProperty(this.constructor.prototype,"isLink",{get:function(){return this.obj.IsLink}});Object.defineProperty(this.constructor.prototype,"link",{get:function(){return new System.Shell._FolderItem(this.obj.GetLink)}});Object.defineProperty(this.constructor.prototype,"path",{get:function(){return this.obj.Path}});Object.defineProperty(this.constructor.prototype,"type",{get:function(){return this.obj.Type}});Object.defineProperty(this.constructor.prototype,"SHFolder",{get:function(){return new System.Shell._Folder(this.obj.GetFolder)}})}this.obj=e},_Folder:function(e){if(!this._constructor_initialized){this.constructor.prototype._constructor_initialized=true;Object.defineProperty(this.constructor.prototype,"Items",{get:function(){return new System.Shell._FolderItems(this.obj.Items())}})}this.obj=e},_FolderItems:function(e){if(!this._constructor_initialized){this.constructor.prototype._constructor_initialized=true;this.constructor.prototype.item=function(e){return new System.Shell._FolderItem(this.obj.Item(e))};Object.defineProperty(this.constructor.prototype,"count",{get:function(){return this.obj.Count}})}this.obj=e}},Debug:{outputString:function(e){}},_browser:{init:function(){document.ondragstart=document.onselectstart=function(e){return false};document.onmousedown=function(e){System._browser.onmousedown(e)};document.onmouseup=function(e){System._browser.onmouseup(e)};document.onmousemove=function(e){System._browser.onmousemove(e)};document.onkeydown=function(e){System._browser.onkeydown(e)};if(!WallpaperEngine_CEF_mode||!is_SA_child_animation||browser_native_mode){document.addEventListener("mouseover",function(e){System._browser.onmouseover(e)},false);document.addEventListener("mouseout",function(e){System._browser.onmouseout_waiting(e)},false)}Object.defineProperty(document,"onmouseover",{set:function(e){System._browser.onmouseover_custom=e}});Object.defineProperty(document,"onmouseout",{set:function(e){System._browser.onmouseout_waiting_custom=e}});var e=w3c_mode?CSSStyleDeclaration.prototype:document.body.style.constructor.prototype;this.document_body_style_pixelWidth=Object.getOwnPropertyDescriptor(e,"pixelWidth");this.document_body_style_pixelHeight=Object.getOwnPropertyDescriptor(e,"pixelHeight");var t=function(){if(System._browser.resize_timerID)clearTimeout(System._browser.resize_timerID);if(System._browser._window_move_timerID){let i=SA_top_window.getPos();System._browser.resize_timerID=setInterval(function(){var t=0;return function(){let e=SA_top_window.getPos(true);if(++t>10||i[0]!=e[0]||i[1]!=e[1]){clearInterval(System._browser.resize_timerID);System._browser.resize_timerID=setTimeout("System._browser.resize()",0)}}}(),10)}else System._browser.resize_timerID=setTimeout("System._browser.resize()",0)};Object.defineProperty(e,"_set",{get:function(){return t}});if(ie9_native){Object.defineProperty(document.body.style,"pixelWidth",{get:function(){return System._browser.document_body_style_pixelWidth.get.call(this)},set:function(e){this._set();System._browser.document_body_style_pixelWidth.set.call(this,e)}});Object.defineProperty(document.body.style,"pixelHeight",{get:function(){return System._browser.document_body_style_pixelHeight.get.call(this)},set:function(e){this._set();System._browser.document_body_style_pixelHeight.set.call(this,e)}})}Object.defineProperty(this,"overlay_mode",function(){var t=0;var i=null;var o=null;return{get:function(){return t},set:function(e){if(e==t)return;switch(e){case 2:if(i==null)i=LdesktopBG_host.style.display;LdesktopBG_host.style.display="none";if(o==null)o=document.body.style.backgroundColor;document.body.style.backgroundColor="#00FF00";case 1:Lmenu_host.style.visibility="hidden";if(this.camera.video_host){this.camera.video_host.style.visibility="hidden";this.camera.video_host.style.display="none"}if(document.getElementById("Ldungeon_UI")){document.getElementById("Ldungeon_UI").style.visibility="hidden";document.getElementById("Ldungeon_inventory").style.visibility="hidden";document.getElementById("Ldungeon_inventory_backpack").style.visibility="hidden";DEBUG_show("(Press Esc to toggle "+(this.overlay_mode_TEMP?"UI":"bottom menu")+" display)",5)}break;default:if(i!=null)LdesktopBG_host.style.display=i;if(o!=null)document.body.style.backgroundColor=o;i=o=null;Lmenu_host.style.visibility="inherit";if(this.camera.video_host){this.camera.video_host.style.visibility="inherit";this.camera.video_host.style.display="block"}if(document.getElementById("Ldungeon_UI")){document.getElementById("Ldungeon_UI").style.visibility="inherit";document.getElementById("Ldungeon_inventory").style.visibility="inherit";document.getElementById("Ldungeon_inventory_backpack").style.visibility="hidden"}}t=e}}}());var i=is_SA_child_animation&&parent.MMD_SA_options&&parent.MMD_SA_options.child_animation_as_texture;if(i){this.onkeydown({keyCode:97+SA_child_animation_id})}var o=System.Gadget.Settings.readString("SA_docked");if(o)System.Gadget.docked=!!parseInt(o);else{if(i)System.Gadget.docked=false}var o=document.createElement("div");o.id="Ldrag_dummy";var n=o.style;n.position="absolute";n.posLeft=n.posTop=0;n.zIndex=999;n.border="1px solid rgba(128,128,128,0.5)";n.visibility="hidden";document.body.appendChild(o);this.body=document.getElementById("Lbody_host")||document.body;if(w3c_mode)this.body.style.transition="opacity 0.5s";this.Opacity=1;var a=document.getElementById("LdesktopBG")&&!is_SA_BG_transparent;if(a){if(!self.SA_wallpaper_src){var s=System.Gadget.path+toLocalPath("\\TEMP\\SA_wallpaper_src.txt");if(FSO_OBJ.FileExists(s)){try{var r=FSO_OBJ.OpenTextFile(s,1);self.SA_wallpaper_src=r.ReadLine();r.Close()}catch(A){}}}if(!self.SA_wallpaper_mask_src){var _=System.Gadget.path+toLocalPath("\\TEMP\\SA_wallpaper_mask_src.txt");if(FSO_OBJ.FileExists(_)){try{var r=FSO_OBJ.OpenTextFile(_,1);self.SA_wallpaper_mask_src=r.ReadLine();r.Close()}catch(A){}}}}if(a)a=System.Gadget.Settings.readString("WallpaperAsBG")||self.SA_wallpaper_src;var l;if(self.CANVAS_Video_Overlay&&CANVAS_Video_Overlay.use_wallpaper_as_bg||self.EQP_use_wallpaper){l=a=true}var p;var d,c;this.Opacity=is_SA_child_animation?parent.document.getElementById("Ichild_animation"+SA_child_animation_id).style.opacity||1:parseFloat(System.Gadget.Settings.readString("Opacity")||1);if(is_SA_child_animation&&!self.SA_wallpaper_src&&!l){a=a&&parent.WMP_wallpaper_mask&&parent.use_HTML5&&!parent.System.Gadget.Settings.readString("CSSTransform3D")&&!System.Gadget.Settings.readString("DisableWallpaperMask");if(a&&self.EQP_video_options&&EQP_video_options.use_canvas_video){a=false;this.C_WMP_wallpaper_mask_resized=document.createElement("canvas");this.C_WMP_wallpaper_mask_mixed_resized=document.createElement("canvas");this.WMPMask_Draw()}this.wallpaper_mask_disabled=!a;if(a)p=parent.WMP_wallpaper_mask}else{var m;if(!is_SA_child_animation){d=System.Gadget.Settings.readString("_screenLeft");c=System.Gadget.Settings.readString("_screenTop")}d=d?parseInt(d):null;c=c?parseInt(c):null;if(a){const D=w3c_mode&&self.SA_wallpaper_src&&/\.(mp4|mkv|webm)$/i.test(SA_wallpaper_src)&&SA_wallpaper_src;this.wallpaper_mask_disabled=WallpaperEngine_CEF_mode||!!System.Gadget.Settings.readString("DisableWallpaperMask");var u,h,f;var n=LdesktopBG.style;try{n.pixelWidth=parent.screen.width;n.pixelHeight=parent.screen.height;var M=oShell.RegRead("HKCU\\Control Panel\\Colors\\Background");n.backgroundColor=/^\#/.test(M)?M:"rgb("+M.replace(/\W+/g,",")+")";u="HKCU\\Control Panel\\Desktop\\";if(WallpaperEngine_CEF_mode)h=oShell.RegRead(u+"Wallpaper")||self.SA_wallpaper_src&&/\.(png|bpm|jpg|jpeg)$/i.test(SA_wallpaper_src)&&SA_wallpaper_src;else h=self.SA_wallpaper_src==""?"":self.SA_wallpaper_src&&/\.(png|bpm|jpg|jpeg)$/i.test(SA_wallpaper_src)&&SA_wallpaper_src||oShell.RegRead(u+"Wallpaper");if(h){if(!this.wallpaper_mask_disabled){p=self.SA_wallpaper_mask_src||h.replace(/\.\w{3,4}$/,"_mask.png");if(!ValidatePath(p))p=null}f=oShell.RegRead(u+"WallpaperStyle");this.updateWallpaper(h,f)}if(D){this.updateWallpaper(D)}this.moveWallpaper(d||0,c||0);if(!is_SA_child_animation||self.SA_wallpaper_src)LdesktopBG_host.style.display="block"}catch(A){console.error(A);LdesktopBG_host.style.display="none"}if(p){if(!this.bg_mask)this.bg_mask="(blank)"}else{m=true}}else{m=true}if(m&&this.Opacity<1&&(w3c_mode||HTA_use_GPU_acceleration)){this.body.style.opacity=this.Opacity;DEBUG_show("Opacity:"+this.Opacity*100+"%",2)}}if(l&&!p)this.bg_mask="(blank)";if(a&&(p||this.bg_mask)){var g=document.createElement("canvas");g.id="C_wallpaper_mask";g._WallpaperAsBG_custom=l;g.onmousedown=function(){return false};if(!is_SA_child_animation||l){try{var y=g.width=parent.screen.width;var b=g.height=parent.screen.height;var v=g.getContext("2d");var w;if(!this.wallpaper_canvas_update){this.wallpaper_canvas_update=function(e,c){v.fillStyle=n.backgroundColor;v.fillRect(0,0,y,b);if(!e){if(self.CANVAS_Video_Overlay&&CANVAS_Video_Overlay._canvas_wall)CANVAS_Video_Overlay._canvas_wall._match_str=null;if(self.EQP_use_wallpaper){EQP_ps.forEach(function(e){if(e.is_wallpaper)e.img.img_obj._match_str=null})}return}var t;if(c=="0"){t=function(){var e=this.width;var t=this.height;var i=parent.screen.width;var o=parent.screen.height;var n,a,s,r,_,l,d,c;if(i>e){n=0;_=(i-e)/2;s=d=e}else{n=(e-i)/2;_=0;s=d=i}if(o>t){a=0;l=(o-t)/2;r=c=t}else{a=(t-o)/2;l=0;r=c=o}var m=C_wallpaper_mask.getContext("2d");m.drawImage(this,n,a,s,r,_,l,d,c);System._browser.BGMask_Create(!p);if(!p)return;var u=new Image;u.onload=function(){var e=C_wallpaper_mask.getContext("2d");e.globalCompositeOperation="destination-in";e.drawImage(this,n,a,s,r,_,l,d,c);C_wallpaper_mask.style.visibility="inherit";DEBUG_show("Use wallpaper mask",2)};u.src=toFileProtocol(p)}}else{t=function(){var e=this.width;var t=this.height;var i=parent.screen.width;var o=parent.screen.height;var n,a,s,r,_;var l=C_wallpaper_mask.getContext("2d");if(c=="6"){n=Math.max(e/i,t/o);r=Math.round((i-e/n)/2);_=Math.round((o-t/n)/2);a=Math.round(e/n);s=Math.round(t/n);l.drawImage(this,0,0,e,t,r,_,a,s)}else{n=Math.min(e/i,t/o);r=Math.round((e/n-i)/2*n);_=Math.round((t/n-o)/2*n);a=Math.round(i*n);s=Math.round(o*n);l.drawImage(this,r,_,a,s,0,0,C_wallpaper_mask.width,C_wallpaper_mask.height)}System._browser.BGMask_Create(!p);if(!p)return;var d=new Image;d.onload=function(){var e=C_wallpaper_mask.getContext("2d");e.globalCompositeOperation="destination-in";e.drawImage(this,r,_,a,s);C_wallpaper_mask.style.visibility="inherit";DEBUG_show("Use wallpaper mask",2)};d.src=toFileProtocol(p)}}if(w)w.onload=null;w=new Image;w.onload=t;w.src=toFileProtocol(e)}}this.wallpaper_canvas_update(h,f);if(!h){setTimeout("System._browser.BGMask_Create(true)",0)}}catch(A){}}var S=g.style;S.position="absolute";S.posLeft=-(d||0);S.posTop=-(c||0);S.zIndex=60;S.visibility="hidden";document.body.appendChild(g);this.mouseover_hide_list.push(g);if(is_SA_child_animation){this.C_WMP_wallpaper_mask_resized=document.createElement("canvas");this.C_WMP_wallpaper_mask_mixed_resized=document.createElement("canvas");if(this.bg_mask)System._browser.BGMask_Create(!p);this.WMPMask_Draw()}}this._s_left=d;this._s_top=c},updateWallpaper:function(e,t){let i=document.getElementById("VdesktopBG");if(e&&/\.(mp4|mkv|webm)$/i.test(e)){if(!i){i=document.createElement("video");i.id="VdesktopBG";const d=i.style;d.position="absolute";d.top=d.left="0px";d.width=parent.screen.width+"px";d.height=parent.screen.height+"px";d.objectFit="cover";LdesktopBG.appendChild(i);i.autoplay=i.loop=true}i.src=toFileProtocol(e);i.style.visibility="inherit";return}if(i){i.pause();i.style.visibility="hidden"}var o=LdesktopBG.style;var n;if(e!=null){e=decodeURIComponent(e);if(this._wallpaper_last!=e){n=true;this._wallpaper_last=e;o.backgroundImage=e?"url("+toFileProtocol(/^(\/|[\w\-]+\:)/.test(e)?e:System.Gadget.path+"/"+e).replace(/\s/g,encodeURIComponent(" "))+")":"";if(this.wallpaper_opacity)o.opacity=this.wallpaper_opacity;if(this.wallpaper_bg_color)LdesktopBG_host.style.backgroundColor=this.wallpaper_bg_color}}else e=this._wallpaper_last;var a="HKCU\\Control Panel\\Desktop\\";if(t==null){t=oShell.RegRead(a+"WallpaperStyle")}if(this._wallpaper_style!=t){n=true;this._wallpaper_style=t}if(t=="0"){o.backgroundSize="";o.backgroundPosition="center center";if(oShell.RegRead(a+"TileWallpaper")=="0"){o.backgroundRepeat="no-repeat"}else{o.backgroundRepeat=""}}else if(t=="2"){o.backgroundSize="100% 100%";o.backgroundPosition="";o.backgroundRepeat=""}else if(t=="6"){o.backgroundSize="contain";o.backgroundPosition="center center";o.backgroundRepeat="no-repeat"}else{o.backgroundSize="cover";o.backgroundPosition="center center";o.backgroundRepeat="no-repeat";if(browser_native_mode){o.width="100%";o.height="100%"}else{o.pixelWidth=parent.screen.width;o.pixelHeight=parent.screen.height}if(windows_mode&&e){var s=loadImageDim(/^(\/|[\w\-]+\:)/.test(e)?e:System.Gadget.path+toLocalPath("\\")+e);if(s.w){var r=parent.screen.width/parent.screen.height;var _=(parent.screen.width*2-parent.screen.availWidth)/(parent.screen.height*2-parent.screen.availHeight);var l=s.w/s.h;if(lr){o.pixelWidth=l>_?parent.screen.width*2-parent.screen.availWidth:Math.round(parent.screen.height*l)}}}}if(this.wallpaper_canvas_update&&n){this.wallpaper_canvas_update(e,t);DEBUG_show("(Wallpaper canvas updated)",2)}},WMPMask_Draw:function(e){if(!this.C_WMP_wallpaper_mask_resized)return;if(!e)e=parent.SL;if(!e||!e.width)return;var t=document.body.style;var i=t.pixelWidth;var o=t.pixelHeight;if(!i)return;var n=0;var a=0;var s=e.width;var r=e.height;var _=this.C_WMP_wallpaper_mask_resized;if(_.width!=s){_.width=s;_.height=r;var l=parent.C_WMP_wallpaper_mask;_.getContext("2d").drawImage(l,0,0,l.width,l.height,0,0,s,r)}var d=this.bg_mask_image_resized;if(d&&d.width!=i){d.width=i;d.height=o;var c=this.bg_mask_image;d.getContext("2d").drawImage(c,0,0,c.width,c.height,0,0,i,o)}var i,o;i=self.B_content_width?B_content_width:document.body.style.pixelWidth;o=self.B_content_height?B_content_height:document.body.style.pixelHeight;var m=parent.SA_child_animation[SA_child_animation_id];var u=m.x;var p=m.y;if(is_SA_child_animation&&parent.EQP_border_width){u-=parent.EQP_border_width;p-=parent.EQP_border_width}var h=u-n;var f=h;if(h<0)h=0;if(f<0)f=-f;else f=0;var M=p-a;var g=M;if(M<0)M=0;if(g<0)g=-g;else g=0;var y=s+n-u;if(y>i)y=i;var b=r+a-p;if(b>o)b=o;var v=this.C_WMP_wallpaper_mask_mixed_resized;if(v.width!=i||v._x!=h||v._y!=M){v.width=i;v.height=o;var w=v.getContext("2d");w.drawImage(_,h,M,y,b,f,g,y,b);if(d)w.drawImage(d,0,0);v._x=h;v._y=M}var S=document.getElementById("C_wallpaper_mask");if(!S)return;S.width=i;S.height=o;var w=S.getContext("2d");w.globalCompositeOperation="copy";w.drawImage(e,h,M,y,b,f,g,y,b);w.globalCompositeOperation="destination-in";w.drawImage(v,0,0)},BGMask_CreateCanvas:function(e,t){if(!e)return null;if(!/^\((.+)\)$/.test(e)){return null}var i=RegExp.$1.split("|");var o=i[0];var n;if(o=="circle"){var a=parseInt(i[1]);var s=parseInt(i[2]);n=document.createElement("canvas");n.width=a;n.height=s;var r=a=a-l)g=(a-h)/(l+1);g=1-(1-g)*M;if(g<0)g=0;var y=1;if(f=s-l)y=(s-f)/(l+1);y=1-(1-y)*M;if(y<0)y=0;var b=gw?w/v:v/w;var A=Math.sqrt(1+S*S);b=1-(1-b)*A;if(b<0)b=0}c[m]=t?Math.round(255*(1-b)):Math.round(255*b)}_.putImageData(d,0,0)}return n},BGMask_Create:function(e){var t=this.bg_mask;if(!t)return;if(e){this.wallpaper_canvas=C_wallpaper_mask;C_wallpaper_mask.style.display="none"}else{var i=this.wallpaper_canvas=document.createElement("canvas");if(!is_SA_child_animation){i.width=parent.screen.width;i.height=parent.screen.height;i.getContext("2d").drawImage(C_wallpaper_mask,0,0)}}if(self.CANVAS_Video_Overlay&&CANVAS_Video_Overlay._canvas_wall)CANVAS_Video_Overlay._canvas_wall._match_str=null;if(self.EQP_use_wallpaper){EQP_ps.forEach(function(e){if(e.is_wallpaper&&e.img)e.img.img_obj._match_str=null})}if(/^\((.+)\)$/.test(t)){this.bg_mask_image=this.BGMask_CreateCanvas(t,is_SA_child_animation);this.BGMask_onload();return}var o=this.bg_mask_image=new Image;o.onload=this.BGMask_onload;o.src=toFileProtocol(t)},BGMask_onload:function(){var e=document.getElementById("C_BG_mask");if(!e){e=document.createElement("canvas");e.id="C_BG_mask";var t=e.style;t.position="absolute";t.posTop=t.posLeft=0;t.zIndex=60+1;document.body.appendChild(e)}if(System._browser.mouseover_hide_list.indexOf(e)==-1)System._browser.mouseover_hide_list.push(e);if(is_SA_child_animation){System._browser.bg_mask_image_resized=document.createElement("canvas")}else{System._browser.BGMask_Draw()}},BGMask_Draw:function(e){if(is_SA_child_animation&&(!document.getElementById("C_wallpaper_mask")||!C_wallpaper_mask._WallpaperAsBG_custom)){this.WMPMask_Draw();return}if(!document.getElementById("C_BG_mask"))return;var t,i,o,n;t=o=self.B_content_width?B_content_width:document.body.style.pixelWidth;i=n=self.B_content_height?B_content_height:document.body.style.pixelHeight;if(o>parent.screen.width)o=parent.screen.width;if(n>parent.screen.height)n=parent.screen.height;var a,s,r,_;var l=C_wallpaper_mask.style;if(l.posLeft>0){a=0;r=l.posLeft}else{a=-l.posLeft;r=0}if(l.posTop>0){s=0;_=l.posTop}else{s=-l.posTop;_=0}if(e){var d=a+","+s+","+o+","+n+","+r+","+_+","+o+","+n;if(e._match_str==d)return;e._match_str=d;e.width=t;e.height=i;var c=e.getContext("2d");c.globalCompositeOperation="copy";c.drawImage(this.wallpaper_canvas,a,s,o,n,r,_,o,n);return}if(!this.bg_mask_image&&this.Opacity==1){document.getElementById("C_BG_mask").style.display="none";return}C_BG_mask.width=t;C_BG_mask.height=i;var c=C_BG_mask.getContext("2d");c.globalCompositeOperation="copy";c.globalAlpha=this.bg_mask_image?1:1-this.Opacity;c.drawImage(this.wallpaper_canvas,a,s,o,n,r,_,o,n);if(this.bg_mask_image){c.globalCompositeOperation="destination-out";c.globalAlpha=this.Opacity;c.drawImage(this.bg_mask_image,0,0,o,n)}else C_BG_mask.style.display="block"},resize_timerID:null,resize_cooling_timestamp:0,resize:function(){var e=false;function i(){if(!e){e=true;setTimeout(function(){window.dispatchEvent(new CustomEvent("SA_resized_once"))},0)}}return function(){this.resize_timerID=null;if(use_SA_browser_mode){let t=document.body.style;if(is_SA_child_animation){let e=parent.document.getElementById("Ichild_animation"+SA_child_animation_id).style;e.width=t.pixelWidth+"px";e.height=t.pixelHeight+"px";i()}else{if(webkit_electron_mode){if(webkit_electron_mode&&SA_topmost_window.System._browser.capturePage_in_process){this.resize_timerID=setTimeout("System._browser.resize()",50);return}if(webkit_electron_mode)System._browser.resize_cooling_timestamp=performance.now();SA_top_window.resizeToAbsolute(t.pixelWidth+(xul_mode?SA_top_window.outerWidth-SA_top_window.innerWidth:0),t.pixelHeight+(xul_mode?SA_top_window.outerHeight-SA_top_window.innerHeight:0))}i()}}}}(),drag_mouse_x:-1,drag_mouse_y:-1,drag_timerID:null,is_dragging:false,mouseout_timerID:null,mouseover_hide_list:[],onmouseover_custom:null,onmouseover:function(e){if(webkit_electron_mode&&(SA_topmost_window.returnBoolean("IgnoreMouseEvents")||SA_topmost_window.returnBoolean("AutoItStayOnDesktop"))&&!SA_topmost_window.webkit_IgnoreMouseEvents_disabled)return;if(this.onmouseover_custom&&this.onmouseover_custom(e))return;if(this.mouseout_timerID){clearTimeout(this.mouseout_timerID);this.mouseout_timerID=null}var t=this.mouseover_hide_list;for(var i=0;i0&&t0&&i20||e.clientYe.is_closing_event);if(MMD_SA_options.Dungeon.dialogue_branch_mode&&!n)return false;new Promise(i=>{if(n){const o=Array.isArray(n.key)?n.key[0]:n.key;let e,t;if(typeof o=="number"){t=o+96}else if(o=="Esc"){e="Escape"}else{e="Key"+o}document.dispatchEvent(new KeyboardEvent("keydown",{code:e,keyCode:t}));System._browser.on_animation_update.add(i,0,0)}else{i()}}).then(()=>{new Promise(e=>{MMD_SA_options.Dungeon.run_event([[{message:{content:System._browser.translation.get("XR_Animator.settings.confirm"),branch_list:[{key:1,func:()=>{e()},ended:true},{key:2}]}}]])}).then(()=>{this.onSettings(true)})});return false}if(!System.Gadget.settingsUI)return false;if(use_inline_dialog){if(document.getElementById("Idialog").style.visibility=="hidden"){document.getElementById("Idialog").contentWindow.location.replace("settings.html")}return true}System._browser.showFocus(true,true);var t=showModalDialog(System.Gadget.settingsUI,self);t=xul_mode?self.returnValue:t;System._browser.showFocus(false);this.onSettingsClosed(t);return true},onSettingsClosed:function(e){if(System.Gadget.onSettingsClosed)System.Gadget.onSettingsClosed({closeAction:!!e,Action:{commit:true}})},onkeydown:function(e){var t=(is_SA_child_animation||document.getElementById("Lchild_animation_parent"))&&!is_SA_child_animation_host;const i=e.altKey;const o=i||!self.MMD_SA||!MMD_SA_options.Dungeon_options||!e.preventDefault;var n=e.keyCode;if(n==67&&i){this.confirmClose();return true}else if(n==69&&o){return this.onSettings()}else if(n==79&&o){var a;if(is_SA_child_animation){var s=parent.document.getElementById("Ichild_animation"+SA_child_animation_id).style;a=this.Opacity;if("_opacity_"in e){a=e._opacity_}else{a-=.25;if(a<.25)a=1}parent.System.Gadget.Settings._settings_need_update=true;parent.SA_child_animation[SA_child_animation_id].opacity=a;s.opacity=a}else if(this.bg_mask){a=this.Opacity;if("_opacity_"in e){a=e._opacity_}else{a-=.25;if(a<.25)a=1}System.Gadget.Settings.writeString("Opacity",a);this.Opacity=a;this.BGMask_Draw()}else if(w3c_mode||HTA_use_GPU_acceleration){var s=this.body.style;a=this.Opacity;if("_opacity_"in e){a=e._opacity_}else{a-=.25;if(a<.25)a=1}System.Gadget.Settings.writeString("Opacity",a);s.opacity=a}else return false;this.Opacity=a;DEBUG_show("Opacity:"+a*100+"%",2);this.update_tray();return true}else if(n==83&&o){var r=System.Gadget.docked?System.Gadget.onUndock:System.Gadget.onDock;if(!r)return false;setTimeout(System._browser.ondockundock,0);return true}else if(t&&(n>=49&&n<49+SA_child_animation_max)&&o){var _=n-49;var l=is_SA_child_animation?parent:self;var d=l.document.getElementById("Ichild_animation"+_);if(!d||!d.contentWindow.is_SA_child_animation){DEBUG_show("(child animation "+(_+1)+" not found)",2);return true}var c=d.contentWindow;var m=c.parent;var u=m.System._browser;if(c.System.Gadget.Settings.readString("CSSTransform3D")||m.System.Gadget.Settings.readString("CSSTransform3D")){if(u._child_selected==_){u._child_selected=null;c.DEBUG_show("(deselected)",2);m.DEBUG_show("(child"+(_+1)+" deselected)",2);return true}u._child_selected=_}c.DEBUG_show("(selected)",2);m.DEBUG_show("(child"+(_+1)+" selected)",2);u.arrangeChildZ(_);c.focus();return true}else if(t&&n==96&&o){var l=is_SA_child_animation?parent:self;var s=l.Lchild_animation_parent.style;s.visibility=s.visibility=="hidden"?"visible":"hidden";if(webkit_mode)s.display=s.visibility=="hidden"?"none":"block";l.System._browser._child_selected=null;return true}else if(t&&(n>=97&&n<97+SA_child_animation_max)&&o){var _=n-97;var l=is_SA_child_animation?parent:self;var d=l.document.getElementById("Ichild_animation"+_);if(!d||!d.contentWindow.is_SA_child_animation){DEBUG_show("(child animation "+(_+1)+" not found)",2);return true}var s=d.style;s.visibility=s.visibility=="hidden"?"visible":"hidden";if(webkit_mode)s.display=s.visibility=="hidden"?"none":"block";l.System._browser._child_selected=null;var p=false;for(var h=0;h=96&&n<96+10){if(self.MMD_SA&&MMD_SA_options.motion_shuffle&&MMD_SA.use_jThree&&MMD_SA.MMD_started){if(this.camera.ML_enabled){}else if(n==96){if(MMD_SA_options._motion_shuffle){if(!MMD_SA_options.motion_shuffle_list_default&&MMD_SA_options._motion_shuffle_list_default){MMD_SA_options.motion_shuffle_list_default=MMD_SA_options._motion_shuffle_list_default.slice();MMD_SA._force_motion_shuffle=true}else{MMD_SA_options.motion_shuffle=MMD_SA_options._motion_shuffle.slice(0);MMD_SA_options.motion_shuffle_list_default=null;MMD_SA._force_motion_shuffle=true;DEBUG_show("(MMD motions shuffled)",2)}}}else{var _=n-97;if(MMD_SA_options.motion_by_song_name){if(MMD_SA_options.motion_by_song_name._loading_){DEBUG_show("(music/motion loading)",2);return true}let e=Object.keys(MMD_SA_options.motion_by_song_name).find(e=>{return MMD_SA_options.motion_by_song_name[e].key==_+1});if(e){let t=MMD_SA_options.motion_by_song_name[e].song_path;if(/\.zip\#/i.test(t)){MMD_SA_options.motion_by_song_name._loading_=true;t=t.replace(/^.+[\/\\]([^\/\\]+\.zip)/i,"$1");let e=new self.XMLHttpRequestZIP;e.onload=function(){MMD_SA_options.motion_by_song_name._loading_=false;let e=this.response;e.name=t.replace(/^.+[\/\\]/,"");e.isFileSystem=true;SA_DragDropEMU(e)};e.open("GET",t,true);e.responseType="blob";e.send()}else SA_DragDropEMU(t);return true}}if(_>=MMD_SA.normal_action_length){DEBUG_show("(MMD motion not found)",2);return true}if(!MMD_SA_options._motion_shuffle)MMD_SA_options._motion_shuffle=MMD_SA_options.motion_shuffle.slice(0);MMD_SA_options.motion_shuffle=[_];MMD_SA_options.motion_shuffle_list_default=null;MMD_SA._force_motion_shuffle=true;DEBUG_show("(MMD motion changed)",2)}return true}}return false},ondockundock:function(){DEBUG_show("Dock state changed",2);var e=!System.Gadget.docked;System.Gadget.docked=e;System.Gadget.Settings.writeString("SA_docked",!!e==!!is_SA_child_animation?"":e?"1":"0");var t=!e?System.Gadget.onUndock:System.Gadget.onDock;if(!t)return;t()},onmousemove_custom:null,onmousemove:function(e){var t,i;t=this._WE_mouse_x=e.x;i=this._WE_mouse_y=e.y;if(this.onmousemove_custom&&this.onmousemove_custom(e))return;if(!this.is_dragging){if(is_SA_child_animation&&parent.System._browser.is_dragging){parent.System._browser.onmousemove(e)}return}if(!WallpaperEngine_mode){if(absolute_screen_mode){t=SA_top_window.getCursorPos().x;i=SA_top_window.getCursorPos().y}else{t=e.screenX;i=e.screenY}}if(is_SA_child_animation||this._child_selected!=null){var o,n,a;if(is_SA_child_animation){a=SA_child_animation_id;o=self;n=parent}else{a=this._child_selected;o=document.getElementById("Ichild_animation"+a).contentWindow;n=self}n.System.Gadget.Settings._settings_need_update=true;var s=n.SA_child_animation[a];var r=n.document.getElementById("Ichild_animation"+a).style;var _=o.document.body.style;var l=n.document.body.style;var d=s.x+t-this.drag_mouse_x;var c=s.y+i-this.drag_mouse_y;r.posLeft=s.x=d;r.posTop=s.y=c;o.document.getElementById("Ldebug").innerText=n.document.getElementById("Ldebug").innerText="(moving)";o.DEBUG_hide_sec=n.DEBUG_hide_sec=0;o.DEBUG_show("("+d+","+c+")",2)}else{System.Gadget.Settings._settings_need_update=true;this.moveBy(t-this.drag_mouse_x,i-this.drag_mouse_y,e)}this.moveWallpaper();this.drag_mouse_x=t;this.drag_mouse_y=i},moveWallpaper:function(e,t){if(is_SA_child_animation&&(!document.getElementById("C_wallpaper_mask")||!C_wallpaper_mask._WallpaperAsBG_custom))return;if(is_SA_child_animation||document.getElementById("LdesktopBG")&&LdesktopBG.style.display!="none"){if(WallpaperEngine_mode){e=0;t=0}else{if(absolute_screen_mode){if(e==null)e=SA_top_window.screenLeftAbsolute;if(t==null)t=SA_top_window.screenTopAbsolute;var i=SA_top_window.getScreenBounds(e,t);e=-(e-i.x);t=-(t-i.y)}else{if(e==null)e=SA_top_window.screenLeft;if(t==null)t=SA_top_window.screenTop;e=-(e%parent.screen.width);t=-(t%parent.screen.height)}}if(is_SA_child_animation){var o=parent.SA_child_animation[SA_child_animation_id];e-=o.x;t-=o.y}else{var n=(is_SA_child_animation_host&&Ichild_animation0.contentWindow.document.getElementById("LdesktopBG")||LdesktopBG).style;n.posLeft=e;n.posTop=t}if(document.getElementById("C_wallpaper_mask")){var a=C_wallpaper_mask.style;a.posLeft=e;a.posTop=t}}},moveBy:function(e,t,i){SA_top_window.moveByAbsolute(e,t)},update_tray:function(e){try{if(!webkit_electron_mode||IPC.active_window!=self)return;if(this._tray_last_updated==RAF_timestamp){return}this._tray_last_updated=RAF_timestamp;if(!e){e={active_window_id:IPC.active_window_id,click_thru:SA_topmost_window.returnBoolean("IgnoreMouseEvents"),click_thru_partial:SA_topmost_window.returnBoolean("IgnoreMouseEventsPartial"),always_on_top:SA_topmost_window.returnBoolean("AutoItAlwaysOnTop"),stay_on_desktop:SA_topmost_window.returnBoolean("AutoItStayOnDesktop"),use_electron_as_wallpaper:SA_topmost_window.WebKit_object.use_electron_as_wallpaper,auto_pause:SA_topmost_window.returnBoolean("AutoItAutoPause"),opacity:is_SA_child_animation?parent.SA_child_animation[SA_child_animation_id].opacity:parseFloat(System.Gadget.Settings.readString("Opacity")||1),opacity_on_hover:parseFloat(System.Gadget.Settings.readString("OpacityOnHover")||1),size:Settings.CSSTransformFullscreen?-1:Settings.CSSTransformScale,animation_path:Settings.f_path_folder,media_control:self.SL&&SL._mouse_event_main&&SL._mouse_event_main(),MMD:null};var t=[true];for(var i=0;i{if(e.func==t)e.canceled=true})},run:function(e){var t=[];var i=a[e];if(!i.length)return;var o=[];for(let e=0;e=0){o.push(n)}else{n.func();if(n.loop&&--n.loop!=0)o.push(n)}}a[e]=o}}}(),get css_scale(){return window.devicePixelRatio>=2?.5:1},virtual_numpad_toggle:function(e){if(e==null)e=Lnumpad_row0.style.display=="none";Lnumpad_row0.style.display=e?"inline":"none";Lnumpad_rows.style.display=e?"block":"none";if(e&&self.ChatboxAT)ChatboxAT.chatW_minimize(0,true)},virtual_numpad:function(){var c={};var m={A:1,B:2,C:3,D:4,E:5,F:6,G:7,H:8,X:9};return function(e,t){e.preventDefault();e.stopPropagation();var i=MMD_SA_options.Dungeon&&MMD_SA_options.Dungeon.character.combat_mode;var o=e.target.textContent;var n=c[o]=c[o]||{};var a,s,r;switch(o){case"S":a=16;n.pressed=!n.pressed;const l=document.getElementsByClassName("Lnumpad_button");if(n.pressed&&MMD_SA_options.Dungeon&&MMD_SA_options.Dungeon.event_mode){for(let e=0;ee[1]==RegExp.$1)[0]}}else{for(let e=0;ee[0]==RegExp.$1)[1]}}t=n.pressed?"keydown":"keyup";break;case"+":a=107;if(i){if(t=="keyup")return;n.pressed=!n.pressed;t=n.pressed?"keydown":"keyup"}break;case"-":a=109;break;case"*":a=106;break;case"/":a=111;break;case"⏎":a=13;break;case"J":a=32;break;case"↑":a=38;r="ArrowUp";break;case"↓":a=40;r="ArrowDown";break;case"←":a=37;r="ArrowLeft";break;case"→":a=39;r="ArrowRight";break;default:if(/([0-9])/.test(o))a=parseInt(o)+96;else r="Key"+o}if(n.timeoutID)clearTimeout(n.timeoutID);if(n.intervalID)clearTimeout(n.intervalID);n.timeoutID=n.intervalID=null;let _=new KeyboardEvent(t,{bubbles:true,cancelable:true,key:o,keyCode:a,code:r,shiftKey:c["S"]&&c["S"].pressed});document.dispatchEvent(_);if(t=="keydown"){if(/[\+S]/.test(o)&&(o!="+"||i)){e.target.style.opacity="0.75"}else{n.timeoutID=setTimeout(function(){n.intervalID=setInterval(function(){document.dispatchEvent(_)},100)},400)}}else{e.target.style.opacity=""}}}(),P2P_network:function(){var o;var n=0;var a={events:{peer:{},connection:{handshake_request:function(e,t){console.log("P2P_network: Remote Peer"+"("+t.peer+"/"+t.label+"/host) responding handshake request from Peer-"+e.index+"("+e.id+")");t.send({handshake:{request:true}})},handshake_respond:function(e,t,i){if(i.request){t.status="connected";console.log("P2P_network: Remote Peer"+"("+t.peer+"/"+t.label+"/client)'s handshake request accepted from Peer-"+e.index+"("+e.id+")");t.send({handshake:{accepted:true}})}else if(i.accepted){t.status="connected";console.log("P2P_network: Remote Peer"+"("+t.peer+"/"+t.label+"/host) accepted handshake request from Peer-"+e.index+"("+e.id+")");if(e.para.events.connection.handshake_request_accecpted&&e.para.events.connection.handshake_request_accecpted[t.label]){e.para.events.connection.handshake_request_accecpted[t.label]({peer:e,connection:t,handshake:i});delete e.para.events.connection.handshake_request_accecpted[t.label]}}else{console.log("P2P_network: Remote Peer"+"("+t.peer+"/"+t.label+"/host) rejected handshake request from Peer-"+e.index+"("+e.id+")");if(e.para.events.connection.handshake_request_rejected&&e.para.events.connection.handshake_request_rejected[t.label]){e.para.events.connection.handshake_request_rejected[t.label]({peer:e,connection:t,handshake:i});delete e.para.events.connection.handshake_request_rejected[t.label]}}},data:function(e,t,i){}},send_message:function(e){if(!e.command)t.content_window.ChatboxAT.ChatShow([e.name+": "+e.msg]);return null}}};function s(t,i){this._connection=i;this.status="connecting";t.connections[i.label]=this;var o=this;i.on("data",function(e){if(e.handshake){t.para.events.connection.handshake_respond(t,o,e.handshake)}else{t.para.events.connection.data(t,o,e)}});i.on("close",function(e){console.log("P2P_network: DataConnection"+"("+i.peer+"/"+i.label+"/host) closed");o.close(t)})}s.prototype.send=function(e){this._connection.send(e)};s.prototype.close=function(e){if(!e.connections[this.label])return;if(e.para.events.connection.close&&e.para.events.connection.close(e,this))return;delete e.connections[this.label];var t=this;setTimeout(function(){t._connection.close();t._connection=null},1e3)};Object.defineProperty(s.prototype,"peer",{get:function(){return this._connection.peer}});Object.defineProperty(s.prototype,"label",{get:function(){return this._connection.label}});function r(){}Object.defineProperty(r.prototype,"length",{get:function(){return Object.keys(this).length}});function e(t=Object.clone(a)){this.para=t;this.id=null;var e=this._peer=new Peer;this.index=n;this.connections=new r;this.status="connecting";var i=this;e.on("open",function(e){n++;if(!o)o=i;i.id=e;i.status="connected";console.log("P2P_network: Peer-"+i.index+"("+e+") connected");i.para.events.peer.open&&i.para.events.peer.open(i)});e.on("error",function(e){console.log("P2P_network: Peer-"+i.index+" error",e);if(i.para.events.peer.error_by_connection){i.para.events.peer.error_by_connection(e);delete i.para.events.peer.error_by_connection}else i.para.events.peer.error&&i.para.events.peer.error(i,e)});e.on("connection",function(e){if(t.events.peer.connection&&t.events.peer.connection(i,e))return;console.log("P2P_network: Remote Peer"+"("+e.peer+"/"+e.label+"/client) connecting to Peer-"+i.index+"("+i.id+")");e.on("open",function(){console.log("P2P_network: Remote Peer"+"("+e.peer+"/"+e.label+"/client) connected to Peer-"+i.index+"("+i.id+")");new s(i,e)})})}e.prototype.connect=function(n,e){var a=this;return new Promise(function(i,o){var e=function(){var e={serialization:"json"};var t=a._peer.connect(n,e);t.on("open",function(){console.log("P2P_network: Remote Peer"+"("+t.peer+"/"+t.label+"/host) connecting to Peer-"+a.index+"("+a.id+")");var e=new s(a,t);a.para.events.connection.handshake_request(a,e);a.para.events.connection.handshake_request_accecpted=a.para.events.connection.handshake_request_accecpted||{};a.para.events.connection.handshake_request_rejected=a.para.events.connection.handshake_request_rejected||{};a.para.events.connection.handshake_request_accecpted[t.label]=i;a.para.events.connection.handshake_request_rejected[t.label]=o;delete a.para.events.peer.error_by_connection});t.on("error",function(e){console.log("P2P_network: Remote connection failed",e);o(e)});a.para.events.peer.error_by_connection=o};switch(a.status){case"connected":e();break;default:setTimeout(function(){o(a)},0)}})};var t={peer:e,get peer_default(){return o},status:"off",get content_window(){return is_SA_child_animation_host?document.getElementById("Ichild_animation0").contentWindow:self},process_message:function(e,t){var i=this.peer_default;if(!i)return e;var o=this.content_window.document.getElementById("Flogin").id.value;var n=this.content_window.document.getElementById("Flogin").pass.value;var a=this.content_window.MMD_SA_options;var s=(o||a&&a.model_para_obj.character&&a.model_para_obj.character.name||"Anonymous").substring(0,16);var r=i&&i.connections.length;var _;if(!/^\//.test(e)){_=i.para.events.send_message({name:s,msg:e,id:o,pass:n})}else{var l,d,c;var m=this.content_window.ChatboxAT.checkChatCommand(e);l=m.command;d=m.para1;c=m.para2;_=i.para.events.send_message({name:s,msg:e,command:l,para1:d,para2:c,id:o,pass:n})}if(!t)this.content_window.document.getElementById("Fchat").msg.value="";if(_!=null)return _;return e}};return t}(),camera:function(){var Pe;var d,r;var c;var Ie,Re;var Te;var je;var I=true;var t=new URLSearchParams(self.location.search.substring(1));var Le="";var Fe="";var i=true;var _;var E=0;var x="";function n(){var s=Pe.video;if(!s.videoWidth||s.readyState<2){return}if(c.busy||RAF_animation_frame_unlimited&&!MMD_SA.WebXR.session&&x==Pe.video_frame_id&&!Te.bb_clear){return}x=Pe.video_frame_id;E=RAF_timestamp;var n=Pe.video_canvas;var r=n.getContext("2d");if(Te.bb_clear){if(s.pause&&!s.paused||--Te.bb_clear<=0||Te._bb&&Te._bb_waiting){Te.bb_clear=Te._bb=Te._bb_waiting=null;r.globalCompositeOperation="copy"}else{if(Te._bb){r.globalCompositeOperation="source-over";r.fillStyle="black";let e=Te._bb[3];let t=Te._bb[0];let i=Te._bb[1]-e;let o=Te._bb[2]-t;e=Math.max(e-i*.25,0);t=Math.max(t-o*.25,0);i=Math.min(i*1.5,n.width);o=Math.min(o*1.5,n.height);if(Pe.video_flipped){e=n.width-(e+i)}r.fillRect(e,t,i,o);Te._bb=null;Te._bb_waiting=true}return}}var _,l;if(MMD_SA_options.user_camera.pixel_limit.disabled){_=s.videoWidth;l=s.videoHeight}else if(Pe.is_local_media){_=s.videoWidth;l=s.videoHeight;const e=MMD_SA_options.user_camera.pixel_limit.current||MMD_SA_options.user_camera.pixel_limit._default_;if(_*l>e[0]*e[1]){const t=Math.sqrt(_*l/(e[0]*e[1]));_=Math.round(_/t);l=Math.round(l/t)}}else{_=Pe.target_width;l=Pe.target_height}var a=MMD_SA_options.user_camera.display.webcam_as_bg?{scale:1,top:0}:MMD_SA_options.user_camera.display.video;if(!a.scale){if(n.style.pixelWidth!=window.innerWidth||n.style.pixelHeight!=window.innerHeight){n.style.width=window.innerWidth+"px";n.style.height=window.innerHeight+"px"}}else{let e=a.scale*(Pe.display_floating?MMD_SA_options.user_camera.display.floating_scale||MMD_SA_options.user_camera.display.floating&&1||.5:1);let i=~~(window.innerWidth*e);let o=~~(window.innerHeight*e);if(n.style.pixelWidth!=i||n.style.pixelHeight!=o){n.style.width=i+"px";n.style.height=o+"px";let e=(window.innerWidth-i)/2;let t=(window.innerHeight-o)/2;n.style.left=e*(1+(a.left!=null?a.left:-1))+"px";n.style.top=t*(1+(a.top!=null?a.top:0))+"px"}n.style.objectFit="contain"}if(n.width!=_||n.height!=l){n.width=_;n.height=l;r.globalCompositeOperation="copy";if(Pe.video_flipped){r.translate(_,0);r.scale(-1,1)}}if(_==s.videoWidth&&l==s.videoHeight){r.drawImage(s,0,0)}else{let e=_/l;let t=s.videoWidth/s.videoHeight;let i,o,n,a;if(e<=t){n=s.videoHeight*e;i=(s.videoWidth-n)/2;a=s.videoHeight;o=0}else{n=s.videoWidth;i=0;a=s.videoWidth/e;o=(s.videoHeight-a)/2}r.drawImage(s,i,o,n,a,0,0,_,l)}n.style.visibility=!Pe.visible||c.enabled||d.initialized&&d.worker_initialized&&!d.dets||Pe.hidden_enforced?"hidden":"inherit"}function a(){if(c.enabled){c.update_frame()}else{if(Ie.enabled){Ie.update_frame(true)}else if(d.enabled){d.update_frame(true)}if(Te.enabled||je.enabled){W(true)}}const i=Pe.video_canvas_facemesh.style;const e=Pe.video_canvas.style;const t=MMD_SA_options.user_camera.display.wireframe.align_with_video?1:MMD_SA_options.user_camera.display.wireframe.scale||(is_mobile?.25:1);const o=~~(e.pixelWidth*t);const n=~~(e.pixelHeight*t);if(i.pixelWidth!=o||i.pixelHeight!=n){i.pixelWidth=o;i.pixelHeight=n;if(MMD_SA_options.user_camera.display.wireframe.align_with_video){i.posLeft=e.posLeft;i.posTop=e.posTop}else{let e=(window.innerWidth-o)/2;let t=(window.innerHeight-n)/2;i.left=e*(1+(MMD_SA_options.user_camera.display.wireframe.left!=null?MMD_SA_options.user_camera.display.wireframe.left:1))+"px";i.top=t*(1+(MMD_SA_options.user_camera.display.wireframe.top!=null?MMD_SA_options.user_camera.display.wireframe.top:-1))+"px"}}i.objectFit=e.objectFit;i.visibility=Pe.ML_enabled&&!MMD_SA_options.user_camera.display.wireframe.hidden&&!MMD_SA_options.user_camera.display.webcam_as_bg?"inherit":"hidden"}var P;function s(){if(Pe.initialized){SL.style.transform=SL_2D_front.style.transform=Pe.mirror_3D?"scaleX(-1)":"none";Pe.video_canvas.style.transform=Pe.display_flipped?"scaleX(-1)":"none";Pe.reset_video_canvas()}if(!P&&Pe.initialized){P=true;System._browser.on_animation_update.add(n,0,0,-1);System._browser.on_animation_update.add(a,2,1,-1)}}function l(){SL.style.transform=SL_2D_front.style.transform=Pe.mirror_3D?"scaleX(-1)":"none";Pe.video_canvas.style.transform="none";Pe.reset_video_canvas();if(Pe.visible)return;if(P&&!Pe.ML_enabled){P=false;System._browser.on_animation_update.remove(n,0);System._browser.on_animation_update.remove(a,1);Pe.video_canvas_facemesh.style.visibility="hidden"}}var o=100;function m(e){if(!Pe.visible)return;var t=e.detail.keyCode;if(t==107)o+=10;else if(t==109)o-=10;else return;o=Math.max(Math.min(o,180),20);var i=Pe.video_canvas.getContext("2d");if(o==1){i.filter="none";DEBUG_show("Brightness:100%",2)}else{i.filter="brightness("+o+"%) contrast("+(100+(o-100)*.25)+"%)";DEBUG_show("Brightness:"+o+"%",2)}e.detail.result.return_value=true}var u=0;function p(e){if(!e)e=Pe.local_src||(webkit_electron_mode?"C:\\Users\\user\\Documents\\_.mp4":System.Gadget.path+"/js/headtrackr.mp4");if(/\.(png|jpg|jpeg|bmp|webp)$/i.test(e)){if(!Pe._image){Pe._image=new Image;Object.defineProperty(Pe._image,"videoWidth",{get:function(){return this.width}});Object.defineProperty(Pe._image,"videoHeight",{get:function(){return this.height}});Object.defineProperty(Pe._image,"readyState",{get:function(){return this.complete?4:0}})}if(Pe.video&&Pe.video.pause)Pe.video.pause();Pe.video=Pe._image;Pe._image.src=toFileProtocol(e)}else{Pe.video=Pe._video;Pe.video.loop=true;if(!Pe.video._initialized){Pe.video._initialized=true;Pe.video.addEventListener("canplaythrough",function(e){Pe.media_control_enabled=true;SL_MC_simple_mode=true;SL_MC_video_obj=Pe.video;SL_MC_Place(1,0,-64);var t=Ze.speed;if(t){Pe.video.playbackRate=t;if(t<1)Pe.video.muted=true}else{Pe.video.playbackRate=1}});Pe.video.addEventListener("timeupdate",function(e){SL_MC_Timeupdate(this)},true);Pe.video.addEventListener("ended",function(e){if(Ze.speed)Ze.stop()})}Pe.video.src=toFileProtocol(e)}Pe.video_id=e;Pe.local_src=e}window.addEventListener("MMDStarted",()=>{function e(e){if(!System._browser.camera.poseNet.enabled)return;const t=MMD_SA.MMD.motionManager.para_SA;if(!t.motion_tracking_upper_body_only||!t.motion_tracking?.arm_as_leg)return;window.addEventListener("SA_camera_poseNet_update",()=>{t.motion_tracking.arm_as_leg.enabled=!t.motion_tracking.arm_as_leg.enabled;Ye.reset_to_default_motion_once=true;DEBUG_show("Arm-as-leg control:"+(t.motion_tracking.arm_as_leg.enabled?"ON":"OFF"),3)},{once:true})}const t={id:"arm_to_leg_control_mode",accelerator:["Alt+Q"],process:e};if(System._browser.hotkeys._hotkey_config){System._browser.hotkeys._hotkey_config.push(t)}else{System._browser.hotkeys.add(t)}});var h=false;function R(){var e=Ie.enabled||Te.enabled;if(h==!!e)return;h=!!e;if(e){s();Ye.reset();Ye.add_events();DEBUG_show("(Camera ML Mode:ON)",2)}else{if(Pe.initialized){Pe.video_canvas_face_detection.style.visibility="hidden";Pe.video_canvas_facemesh.style.visibility="hidden";l()}Ye.remove_events();Pe._info="";DEBUG_show("(Camera ML Mode:OFF)",2)}}var A,D,$e;var ze,Ce,Be,Je;var He,Oe,S,M,g,y;var qe,Ue;var k,T;var j;var et;var tt={};var Ke=["親","人","中","薬","小"];var it=["thumb","index","middle","ring","pinky"];var Ge=["0","1","2","3"];window.addEventListener("jThree_ready",()=>{ze=new THREE.Vector3;Ce=new THREE.Vector3;Be=new THREE.Vector3;Je=new THREE.Vector3;j=new THREE.Vector3;He=new THREE.Quaternion;Oe=new THREE.Quaternion;S=new THREE.Quaternion;M=new THREE.Quaternion;g=new THREE.Quaternion;y=new THREE.Quaternion;qe=new THREE.Matrix4;Ue=new THREE.Quaternion;k=new THREE.Vector2;T=new THREE.Vector2;et=new THREE.Quaternion;["左","右"].forEach(e=>{tt[e]=new System._browser.data_filter([{type:"one_euro",id:"shoulder_rot",para:[30,1,5,1,1]}])})});var e;var L;var F;var ot=true;var nt=true;var at;var C=true;var B,st,H;var Xe=false;var rt=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"];var _t=[0,2,5,7,8,11,12,13,14,15,16,23,24,25,26,27,28];var lt=[];rt.forEach(e=>{lt.push({part:e,score:0})});var We,Qe;var O;function q(){if(O)return;O=true;const r=THREE.MMD.getModels()[0];const o=r.mesh.bones_by_name;const e=o["左腕"].pmxBone.origin;const t=o["左ひじ"].pmxBone.origin;MMD_SA_options.model_para_obj.left_arm_z_rot=Math.PI/2+Math.atan2(t[1]-e[1],t[0]-e[0]);const i=o["左腕IK"].pmxBone.origin;MMD_SA_options.model_para_obj.left_arm_to_IK_xy=[e[0]-i[0],e[1]-i[1],e[2]-i[2]];MMD_SA_options.model_para_obj.left_arm_length=MMD_SA.TEMP_v3.fromArray(MMD_SA_options.model_para_obj.left_arm_to_IK_xy).length();MMD_SA_options.model_para_obj.arm_IK_offset={"左":(new THREE.Vector3).fromArray(o["左腕"].pmxBone.origin).sub(Ce.fromArray(o["左腕IK"].parent.pmxBone.origin)),"右":(new THREE.Vector3).fromArray(o["右腕"].pmxBone.origin).sub(Ce.fromArray(o["右腕IK"].parent.pmxBone.origin))};let n=o["右腕"].pmxBone.origin;MMD_SA_options.model_para_obj.shoulder_width=Math.abs(e[0]-n[0]);MMD_SA_options.model_para_obj.arm_axis={"左":(new THREE.Vector3).fromArray(i).sub(MMD_SA.TEMP_v3.fromArray(e)).normalize()};MMD_SA_options.model_para_obj.arm_axis["右"]=MMD_SA_options.model_para_obj.arm_axis["左"].clone().setX(-MMD_SA_options.model_para_obj.arm_axis["左"].x);const a=o["左足"].pmxBone.origin;const s=o["左足首"].pmxBone.origin;MMD_SA_options.model_para_obj.hip_center=(new THREE.Vector3).fromArray(a).setX(0);MMD_SA_options.model_para_obj.spine_length=o["首"].pmxBone.origin[1]-MMD_SA_options.model_para_obj.hip_center.y;MMD_SA_options.model_para_obj.left_heel_height=s[1];MMD_SA_options.model_para_obj.leg_IK_offset={"左":(new THREE.Vector3).fromArray(o["左足"].pmxBone.origin).sub(Ce.fromArray(o["左足IK"].parent?.pmxBone?.origin||[0,0,0]).setY(0)),"右":(new THREE.Vector3).fromArray(o["右足"].pmxBone.origin).sub(Ce.fromArray(o["右足IK"].parent?.pmxBone?.origin||[0,0,0]).setY(0))};MMD_SA_options.model_para_obj.left_leg_upper_length=a[1]-o["左ひざ"].pmxBone.origin[1];MMD_SA_options.model_para_obj.left_leg_lower_length=o["左ひざ"].pmxBone.origin[1]-s[1];MMD_SA_options.model_para_obj.left_leg_length=MMD_SA_options.model_para_obj.left_leg_upper_length+MMD_SA_options.model_para_obj.left_leg_lower_length;MMD_SA_options.model_para_obj.left_leg_IK=[a[0]-s[0],a[1]-s[1],a[2]-s[2]];let _=["左","右"];We={};_.forEach(n=>{["腕","ひじ"].forEach((e,t)=>{let i=n+e;let o=MMD_SA.get_bone_axis_rotation(r.mesh,i);We[i]={name:i,axis_rot:o,parent:t==0?{axis_rot:new THREE.Quaternion}:We[n+"腕"]};We[i].axis_rot_offset_inv=(new THREE.Quaternion).multiplyQuaternions(We[i].parent.axis_rot,MMD_SA.TEMP_q.copy(We[i].axis_rot).conjugate())})});const l={};l[1]=(new THREE.Quaternion).setFromEuler(MMD_SA.TEMP_v3.set(0,-Math.PI/2*1,Math.PI/2*1),"YZX");l[-1]=(new THREE.Quaternion).setFromEuler(MMD_SA.TEMP_v3.set(0,-Math.PI/2*-1,Math.PI/2*-1),"YZX");Qe={};Qe[1]=(new THREE.Quaternion).multiplyQuaternions(l[1],MMD_SA._q1.copy(We["左腕"].axis_rot).conjugate());Qe[-1]=(new THREE.Quaternion).multiplyQuaternions(l[-1],MMD_SA._q1.copy(We["右腕"].axis_rot).conjugate());MMD_SA_options.model_para_obj.rot_hand_adjust_base=l;MMD_SA_options.model_para_obj.rot_hand_adjust=Qe;MMD_SA_options.model_para_obj.finger_base={};_.forEach(s=>{Ke.forEach((e,t)=>{let n=s+e+"指";let i=t==0&&o[n+Ge[0]]?0:1;if(!o[n+Ge[i+0]])return;let a=MMD_SA_options.model_para_obj.finger_base[s+t]={base_index:i};for(let i=a.base_index+(t==0?0:-1),o=i;o<3;o++){let e=n+Ge[a.base_index+(o-i)];let t=MMD_SA.get_bone_axis_rotation(r.mesh,e,true);We[e]={name:e,axis_rot:t,parent:o==i?We[s+"ひじ"]:We[n+Ge[a.base_index+(o-1-i)]]};We[e].axis_rot_offset_inv=(new THREE.Quaternion).multiplyQuaternions(We[e].parent.axis_rot,MMD_SA.TEMP_q.copy(We[e].axis_rot).conjugate())}})});for(const d in We){if(d.indexOf("指")!=-1){MMD_SA.TEMP_v3.setEulerFromQuaternion(We[d].axis_rot,"ZYX");MMD_SA.TEMP_v3.z*=-1;We[d].axis_rot.setFromEuler(MMD_SA.TEMP_v3,"ZYX")}We[d].axis_rot_inv=We[d].axis_rot.clone().conjugate()}for(const d in We){if(d.indexOf("指")!=-1){We[d]._axis_rot_offset_inv_z=MMD_SA.TEMP_v3.setEulerFromQuaternion(MMD_SA.TEMP_q.copy(We[d].axis_rot_offset_inv).premultiply(We[d].parent.axis_rot_inv).multiply(We[d].parent.axis_rot),"ZYX").z}}MMD_SA_options.model_para_obj.rot_arm_adjust=We;console.log(We)}const b={};let v;let w;let U;class K{constructor(e,t){this.id=e;this.worker=t}initialized=false}async function G(){if(A)return;A=true;q();var t=[];if(is_mobile){t.push("use_mobilenet=1")}if(C){t.push("use_holistic=1");e=L=false;nt=at=true}if(e){t.push("use_human=1");B=true;e=true;L=false;F=false;st=true;H=true}else if(L){t.push("use_mixed_human=1");e=true;L=true;F=true;H=true}else{e=false;L=false;F=true}if(nt){t.push("use_blazepose=1");at=true}if(at){t.push("use_mediapipe=1");if(e){st=true;H=false}ot=true}if(ot){t.push("use_movenet=1")}if(MMD_SA_options.user_camera.ML_models.worker_disabled&&Ie.initialized&&!Ie.worker_initialized){await new Promise(function(e,t){var i=setInterval(()=>{if(Ie.worker_initialized){clearInterval(i);e()}},100)})}else{await Ie.init()}if(MMD_SA_options.user_camera.ML_models.worker_disabled){v={postMessage:function(e,t){PoseAT.onmessage({data:e})}};let e=document.createElement("script");e.onload=function(){PoseAT.init(v,t)};e.src="js/pose_lib.js";document.head.appendChild(e)}else{U="js/pose_worker.js"+(t.length?"?"+t.join("&"):"");w=Te.use_holistic?"legacy_holistic":"tasks_vision";console.log("Web worker ID:"+w);v=new Worker(U);b[w]=new K(w,v)}v.onmessage=xe}var dt=function(){let y,b;window.addEventListener("jThree_ready",()=>{y=new System._browser.data_filter([{type:"one_euro",id:"head_rot",para:[30,1,2,1,4]}]);b=new System._browser.data_filter([{type:"one_euro",id:"head_chest_rot",para:[30,.25,.5,1,3]}])});return function(e,t){const i=e.bones_by_name[t];const o=this.skin[t];let n=Math.max(Math.min(o[0].t_delta/o[0].t_delta_frame,1),0);const a=MMD_SA.TEMP_q.set(0,0,0,1);var s=o[0].no_blending?MMD_SA._q2.copy(o[0].rot):MMD_SA._q2.copy(o[1].rot).slerp(o[0].rot,n);if(!i){o[0]._rot_from_pose.copy(s);return}const r=MMD_SA.MMD.motionManager.para_SA;const _=Te.enabled||r.motion_tracking_upper_body_only;var l=o[0].rot_parent;if(!l){const p=_&&r.motion_tracking?.head_rotation_weight||0;if(p==1){l=new THREE.Quaternion}else{l=MMD_SA.get_bone_rotation_parent(e,t,e).conjugate();if(_)l.premultiply(Oe.copy(this._rot_body_offset).multiply(this._rot_body_camera));if(p)l.slerp(a,p)}}o[0]._rot_parent=l;if(o[0].info[1]=="facemesh"&&this.skin[t+"_DUMMY_"]){let e=Math.min(Math.max(.25-o[0]._rot_ratio,0)*5,1);s.slerp(this.skin[t+"_DUMMY_"][0]._rot_from_pose,e*e*.667);o[0]._rot_mixed=s.clone()}var d=s.toAxisAngle()[1]%(Math.PI*2);if(d>Math.PI)d=Math.PI*2-d;else if(d<0&&d<-Math.PI)d+=Math.PI*2;d=Math.abs(d);n=Te.use_3D_pose?.5:.3+Math.max(d-Math.PI/2,0)/(Math.PI/2)*.2;var c=He.multiplyQuaternions(l,s);c.fromArray(y.filter(c.toArray()));var m=ze.setEulerFromQuaternion(c,"YZX");var u=[m.x<0?n+(.5-n)*.5:n,n,n];c.setFromEuler(Ce.fromArray(m.toArray().map((e,t)=>Math.sign(e)*Math.min(Math.abs(e),Math.PI/2)*u[t])),"YZX");if(_){const h=r.motion_tracking;const f=1-(h?.motion_default_weight?.head||0)*this.camera_weight;if(f){const M=Oe.copy(i.quaternion).premultiply(S.copy(this._body_motion_rot[0]["首"]).conjugate());i.quaternion.slerp(M,f);M.copy(e.bones_by_name["頭"].quaternion).premultiply(S.copy(this._body_motion_rot[0]["頭"]).conjugate());e.bones_by_name["頭"].quaternion.slerp(M,f)}}i.quaternion.multiply(c);e.bones_by_name["頭"].quaternion.premultiply(c);o[0]._rot_neck=i.quaternion.clone();o[0]._rot_head=e.bones_by_name["頭"].quaternion.clone();if(Ze.active){Ze.set_boneKey(t,null,i.quaternion,true);Ze.set_boneKey("頭",null,e.bones_by_name["頭"].quaternion,false)}if(n<.5){const i=e.bones_by_name["上半身2"];const g=He.setFromEuler(ze.fromArray(b.filter(ze.setEulerFromQuaternion(s,"YZX").multiply(Ce.fromArray(u.map(e=>1-e*2))).toArray())),"YZX");if(!Te.enabled){Ye.add("skin","上半身2",{no_blending:true,rot:g.clone()})}else{i.quaternion.multiply(g)}}}}();var ct=1*10;var Ve=function(){var M=[];var o;var A,D;window.addEventListener("jThree_ready",()=>{o=new System._browser.data_filter([{type:"one_euro",id:"camera_depth",para:[30,1,1/5,1,1]}]);Ve.v_hip=A=new THREE.Vector3;D=new System._browser.data_filter([{type:"one_euro",id:"v_hip",para:[30,1,1/2,1,3]}])});function e(e){var r=e.keypoints[5];var _=e.keypoints[6];var l=e.keypoints[11];var d=e.keypoints[12];if(r.score<=0||_.score<=0)return;let c,m;if(e.keypoints3D_raw){c=e.keypoints3D_raw[11];m=e.keypoints3D_raw[12]}else{c=e.keypoints3D[5];m=e.keypoints3D[6]}M=[{point2D:[{position:new THREE.Vector3},{position:new THREE.Vector3}],data3D:{length:0,z_diff:0}}];const u=Te.spine_length_ref;let p=1;if(l.score>0&&d.score>0){let e=MMD_SA._v3a.addVectors(c,m).multiplyScalar(.5);let t=e.length();let i=MMD_SA.TEMP_v3.set(0,1,0);i.y*=-1;let o=MMD_SA._v3b.setEulerFromQuaternion(MMD_SA.TEMP_q.setFromUnitVectors(i,e.normalize()),"ZXY").x;p=Math.abs(o)/(Math.PI/2);p=p<=1?Math.max(p-.5,0)/.5:Math.max(2-p,0);let n=k.copy(l.position).add(d.position).multiplyScalar(.5);let a=T.copy(r.position).add(_.position).multiplyScalar(.5);let s=n.distanceTo(a);a.copy(n);a.y=a.y-s/Math.abs(Math.cos(o));M[0].point2D[0].position.copy(a);M[0].point2D[1].position.copy(n);M[0].data3D.length=u*(t*2)}if(p){let e=MMD_SA._v3b.copy(c).sub(m);let t=e.length();let i=MMD_SA.TEMP_v3.set(1,0,0);let o=MMD_SA._v3b.setEulerFromQuaternion(MMD_SA.TEMP_q.setFromUnitVectors(i,e.normalize()),"ZYX").y;let n=T.copy(r.position).add(_.position).multiplyScalar(.5);let a=n.clone();let s=k.copy(r.position).distanceTo(_.position);n.y=n.y+s*1.5/Math.abs(Math.cos(o));if(n.y>Pe.video_canvas.height){a.y=Math.max(a.y-(n.y-Pe.video_canvas.height),0);n.y=Pe.video_canvas.height}if(M[0].data3D.length!=0){let e=Math.abs(o)/(Math.PI/2);e=e<=1?Math.max(e-.5,0)/.5:Math.max(2-e,0);p*=1-e}M[0].point2D[0].position.lerp(a,p);M[0].point2D[1].position.lerp(n,p);M[0].data3D.length=M[0].data3D.length*(1-p)+u*(t*3)*p}}function t(){if(!M.length)return;var d=System._browser.camera;var c=d.video_canvas.width;var m=d.video_canvas.height;var u=ze;var p=[];const e=c/m;const t=SL.width/SL.height;const h=e{u.set((e.point2D[0].position.x/c*2-1)*h,(-(e.point2D[0].position.y/m)*2+1)*f,.5);var t=MMD_SA._v3a.copy(u.unproject(d._camera_reset).sub(d._camera_reset.position).normalize());u.set((e.point2D[1].position.x/c*2-1)*h,(-(e.point2D[1].position.y/m)*2+1)*f,.5);var i=MMD_SA._v3b.copy(u.unproject(d._camera_reset).sub(d._camera_reset.position).normalize());var o,n;o=e.data3D.length;n=e.data3D.z_diff;let a=Math.sqrt(Math.pow(t.x-i.x*t.z/i.z,2)+Math.pow(t.y-i.y*t.z/i.z,2)+0);let s=t.x-i.x*t.z/i.z+(t.y-i.y*t.z/i.z)+0;let r=s/a;let _=1;let l=(Math.sqrt(o*o+1)-1)/(a/r);t.multiplyScalar(l);p.push({z:-t.z*1.5,id:e.id})});p.sort((e,t)=>t.z-e.z);var i=p[0].z;this.z=i;z=o.filter(i);this.z_smoothed=z;M=[]}function i(e){if(MMD_SA.WebXR.session){A.set(0,0,0);return}const t=Pe.video_canvas.width;const i=Pe.video_canvas.height;const o=e.keypoints[11];const n=e.keypoints[12];const a=e.keypoints[5];const s=e.keypoints[6];const r=a.score>0&&s.score>0?k.copy(a.position).add(s.position).multiplyScalar(.5):null;const _=t/i;const l=SL.width/SL.height;const d=_0&&n.score>0){m=T.copy(o.position).add(n.position).multiplyScalar(.5);const b=m.x;const v=m.y;u=1;if(r){if(v<0||v>i){u=1-Math.min((v<0?-v:v-i)/Math.abs(r.y-v),1)}if(b<0||b>t){u=Math.min(u,1-Math.min((b<0?-b:b-t)/Math.abs(r.x-b),1))}u=Math.max(u-.5,0)/.5}A.set(((o.position.x+n.position.x)/2/t*2-1)*d,(-((o.position.y+n.position.y)/2/i)*2+1)*c,.5).unproject(Pe._camera_reset).sub(Pe._camera_reset.position).normalize()}let p;if(u<1){p=Be.set(((a.position.x+s.position.x)/2/t*2-1)*d,(-((a.position.y+s.position.y)/2/i)*2+1)*c,.5).unproject(Pe._camera_reset).sub(Pe._camera_reset.position).normalize()}if(ct)Ve.estimate();const h=Pe._camera_reset.position.z-THREE.MMD.getModels()[0].mesh.position.z;let f=h;if(ct&&Ve.z)f=Ve.z_smoothed||Ve.z;if(u>0)A.multiplyScalar(-f/A.z);if(p){const w=Te.spine_length_ref;const S=MMD_SA.TEMP_v3.set(0,-w,0);A.lerp(p.multiplyScalar(-f/p.z).add(S),1-u)}const M=D.filters[0].filter;const g=Math.max(Math.abs(A.z)-10,0)/10;const y=.2+g*.8;M.minCutOff=Math.min(y,10);M.beta=Math.min(y,1);A.fromArray(D.filter(A.toArray()))}return{prepare:e,estimate:t,get_hip_center:i}}();var X=(()=>{function P(e,t,i,o,n){function a(e){return e*e}const s=Math.sqrt;var r=1+a(o);var _=-t*2+o*(n-i)*2;var l=a(t)+a(n-i)-a(e);var d=a(_)-4*r*l;if(d>=0){var c=[(-_+s(a(_)-4*r*l))/(2*r),(-_-s(a(_)-4*r*l))/(2*r)];if(d==0){return[c[0]]}return c}return[]}var I,R,T;var j;window.addEventListener("jThree_ready",()=>{I=new THREE.Vector3;R=new THREE.Vector3;T=new THREE.Vector3;j=new THREE.Quaternion});return function(e,t,i){const o=e._elbow_y;const n=MMD_SA.get_bone_position(t,i+"ひじ",t);if(n.y>o)return;const a=MMD_SA.get_bone_position(t,i+"手首",t);const s=MMD_SA.get_bone_position(t,i+"腕",t);const r=s;const _=T.copy(a).sub(r);const l=n;const d=(l.x*_.x+l.y*_.y+l.z*_.z-(r.x*_.x+r.y*_.y+r.z*_.z))/_.lengthSq();const c=MMD_SA._v3b.set(r.x+_.x*d,r.y+_.y*d,r.z+_.z*d);const m=_.normalize();const u=R.copy(n).sub(c).normalize().negate();const p=I.crossVectors(m,u).normalize();const h=(new THREE.Plane).setFromNormalAndCoplanarPoint(m,n);const f=(new THREE.Plane).setFromNormalAndCoplanarPoint(MMD_SA.TEMP_v3.set(0,1,0),MMD_SA._v3a.set(0,o,0));const M=h.intersectPlane(f);if(!M)return;qe.set(m.x,m.y,m.z,0,u.x,u.y,u.z,0,p.x,p.y,p.z,0,0,0,0,1);Ue.setFromBasis(qe);const g=MMD_SA.TEMP_v3.copy(n).sub(c).length();let y=f.intersectLine(new THREE.Line3(n,c),T);if(!y)return;y=-y.sub(n).length();M[1].applyQuaternion(Ue);const b=M[1].y/M[1].z;n.sub(s);n.applyQuaternion(Ue);const v=P(g,n.z,n.y,b,y);if(!v.length)return;const w=v.map(e=>{e-=n.z;return Math.asin(e/g)});const S=i=="左"?1:-1;const A=MMD_SA.get_bone_rotation(t,"上半身2",null,t);const D=j.copy(A).conjugate();const k=R.copy(a).sub(s).normalize().applyQuaternion(D);const E=e.use_smallest_angle?w.sort((e,t)=>Math.abs(e)-Math.abs(t))[0]:w[S==-1?w.length-1:0];const x=MMD_SA.TEMP_q.setFromAxisAngle(k,E);t.bones_by_name[i+"腕"].quaternion.premultiply(x)}})();const Ne=[0,0,0];var xe=function(){function se(e,t){let i=We[t];e.premultiply(i.axis_rot).multiply(i.axis_rot_inv);e.multiplyQuaternions(i.axis_rot_offset_inv,e)}function re(e,t){if(Te.IK_disabled_check(t))return;var i=e.bones_by_name[t];var o=this.skin[t];var n=t.charAt(0);var a=MMD_SA.TEMP_v3.fromArray(e.bones_by_name[n+"足"].pmxBone.origin);var s=MMD_SA.get_bone_position(e,n+"足","全ての親").sub(a);i.position.add(s);e.bones_by_name[n+"ひざ"].quaternion.set(0,0,0,1);if(Ze.active){if(MMD_SA_options.user_camera.ML_models.pose.use_legIK){const r=MMD_SA.TEMP_v3.copy(i.position);r.sub(ze.fromArray(e.bones_by_name[t].pmxBone.origin).sub(Ce.fromArray(e.bones_by_name[t].parent?.pmxBone?.origin||[0,0,0])));Ze.set_boneKey(t,r,o[0].rot?i.quaternion:null,true)}window.addEventListener("SA_MMD_model"+e._model_index+"_process_bones_after_IK",()=>{Ze.set_boneKey(n+"足",null,e.bones_by_name[n+"足"].quaternion,false);Ze.set_boneKey(n+"ひざ",null,e.bones_by_name[n+"ひざ"].quaternion,false)},{once:true})}i.quaternion.set(0,0,0,1)}function _e(e,t){const i=t.charAt(0);const o=e.bones_by_name;const n=o[t].quaternion;if(MMD_SA.MMD.motionManager.para_SA.motion_tracking_upper_body_only){n.multiplyQuaternions(et,n)}le.call(this,e,t)}function le(e,t){const i=t.charAt(0);const o=e.bones_by_name;const n=o[t].quaternion;const a=this.skin[i+"肩"];if(a){let e=Math.max(Math.min(a[0].t_delta/a[0].t_delta_frame,1),0);n.premultiply(MMD_SA.TEMP_q.copy(a[1].rot).slerp(a[0].rot,e).conjugate())}}var de=(()=>{var e;window.addEventListener("jThree_ready",()=>{});return function(n,e){var t=n.bones_by_name[e];var i=this.skin[e];var o=Math.max(Math.min(i[0].t_delta/i[0].t_delta_frame,1),0);const a=ze.copy(Ve.v_hip);if(MMD_SA.WebXR.session){a.set(0,0,0)}else{const c=Pe._camera_reset.position.z-THREE.MMD.getModels()[0].mesh.position.z;a.z=MMD_SA_options.user_camera.ML_models.pose.estimate_z_depth===false?0:c+a.z}if(MMD_SA_options.user_camera.ML_models.pose.position_offset)a.add(MMD_SA_options.user_camera.ML_models.pose.position_offset);i[0].pos.copy(a);var s=(new THREE.Vector3).copy(i[1].pos).lerp(i[0].pos,o);var r=MMD_SA.get_bone_position(n,"左足","全ての親");var _=MMD_SA.get_bone_position(n,"右足","全ての親");var l=MMD_SA.TEMP_v3.copy(r).add(_).multiplyScalar(.5).sub(MMD_SA_options.model_para_obj.hip_center).negate();if(Te.auto_grounding){let e=MMD_SA.get_bone_position(n,"左足首","全ての親");let t=MMD_SA.get_bone_position(n,"右足首","全ての親");let i=e.y0){THREE.MMD.getModels()[n._model_index].resetPhysics(15+d*2)}j.copy(s)}})();function q(y,b,i,e){function t(e,t,i){if(typeof e=="number")return e;if(/^(\w+)([\+\-])([\d\.])$/.test(e)){const o=(RegExp.$2=="+"?1:-1)*parseFloat(RegExp.$3);const n=MMD_SA.TEMP_v3.copy(b);const a=RegExp.$1;if(a=="default"){n.copy(Ye._skin[y].pos).sub(y.indexOf("腕")!=-1?MMD_SA_options.model_para_obj.arm_IK_offset[v]:MMD_SA_options.model_para_obj.leg_IK_offset[v]).applyQuaternion(Ye._skin[y].rot_parent_inv)}else if(a=="elbow"){if(t=="y"){const s=r?.motion_tracking?.arm_tracking?.elbow_lock?.[v=="左"?"left":"right"]?._elbow_y;if(s!=null&&s!=0){n.y=s-MMD_SA.get_bone_position(S,v+"腕",S).y}}}return(n[t]+o)/i}return 0}const v=y.charAt(0);const o=y.indexOf("足")==-1?MMD_SA_options.model_para_obj.left_arm_length:MMD_SA_options.model_para_obj.left_leg_length;const w=v=="左"?"left":"right";const n=THREE.MMD.getModels()[0];const S=n.mesh;const r=MMD_SA.motion[n.skin._motion_index].para_SA;let a;if(i){for(const c of["x","y","z"]){const m=i[c];if(!m)continue;const _=m.unit_length||o;if(m.scale!=null)b[c]*=typeof m.scale?.[w]=="number"&&m.scale[w]||m.scale;if(m.add)b[c]+=t(m.add?.[w]||m.add,c,_)*_;if(m.min!=null)b[c]=Math.max(b[c],t(m.min?.[w]||m.min,c,_)*_);if(m.max!=null)b[c]=Math.min(b[c],t(m.max?.[w]||m.max,c,_)*_)}if(i.rotation)b.applyEuler(MMD_SA.TEMP_v3.copy(i.rotation).multiplyScalar(Math.PI/180));if(i.camera_weight&&y.indexOf("腕")==-1)b.applyQuaternion(MMD_SA.TEMP_q.set(0,0,0,1).slerp(Ye._rot_camera,i.camera_weight));const d=i.position_to_rotation;if(d){const u=S.bones_by_name;const p=Be.set(Math.atan2(b.z,b.y),0,-Math.atan2(b.x,b.z));const h={upper:{q:He},lower:{q:Oe}};for(const E of["upper","lower"]){const x=v+(E=="upper"?"足":"ひざ");const P=u[x];h[E].name=x;h[E].q.copy(P.quaternion);P.quaternion.set(0,0,0,1);if(!d[E])continue;const I=Je.set(0,0,0);for(const c of["x","y","z"]){const m=d[E][c];if(!m)continue;let e=0;const R=m.rot_formula?.[w]||m.rot_formula;if(R?.length==1){e=p[R]*180/Math.PI}if(m.add)e+=m.add?.[w]||m.add;if(m.scale!=null)e*=typeof m.scale?.[w]=="number"&&m.scale[w]||m.scale;if(m.curve){const T=m.curve?.[w]||m.curve;const j=(e-T.ini)/(T.end-T.ini);if(j>0&&j<1)e=Math.pow(j,T.pow_factor)*(T.end-T.ini)+T.ini}if(m.min!=null)e=Math.max(e,m.min?.[w]||m.min);if(m.max!=null)e=Math.min(e,m.max?.[w]||m.max);I[c]=e/180*Math.PI}P.quaternion.setFromEuler(I,"XZY");if(E=="upper")a=P.quaternion.clone()}const f=MMD_SA.get_bone_position(S,v+"足","全ての親");const M=MMD_SA.get_bone_position(S,v+"足首","全ての親");const g=Pe.x_flipped?-1:1;const A=Be.fromArray(u[v+"足"].pmxBone.origin);const D=A.sub(f).negate();const k=f.sub(M);k.x*=g;k.y*=-1;k.z*=-1;k.add(MMD_SA_options.model_para_obj.leg_IK_offset[v]);k.add(D);k.y-=MMD_SA_options.model_para_obj.left_leg_IK[1]+(u["センター"].position.y-u["センター"].pmxBone.origin[1]);b.copy(k);for(const E in h)u[h[E].name].quaternion.copy(h[E].q)}}else{if(e)e(b)}i?.magnet?.forEach(t=>{const e=t.hand_affected[w];if(!e)return;if(!Ye.skin[y]?.[0]._hand_visible)return;const i=MMD_SA.THREEX.get_model(0);let o=MMD_SA._v3a.set(0,0,0);let n;let a=MMD_SA._q1.set(0,0,0,1);let s;if(t.type=="object3D"){const m=MMD_SA.THREEX._XR_Animator_scene_?.object3D_list.find(e=>e.id==t.id);if(!m)return;s=MMD_SA.THREEX._object3d_list_.find(e=>e.uuid==m._object3d_uuid);o.copy(t.reference_point).multiply(s._mesh.scale);a=MMD_SA._q1.copy(S.quaternion).conjugate().multiply(t.use_default_rotation&&s.user_data._rot_default_||s._mesh.quaternion);o.applyQuaternion(a);n=MMD_SA._v3b.copy(s._mesh.position).sub(S.position).applyQuaternion(MMD_SA.TEMP_q.copy(S.quaternion).conjugate());o.add(n)}else if(t.type=="bone"){const u=MMD_SA.THREEX.VRM.bone_map_VRM_to_MMD[t.name];o=i.get_bone_position_by_MMD_name(u,true);if(t.offset){a=i.get_bone_rotation_by_MMD_name(u,true);o.add(MMD_SA._v3a.copy(t.offset).applyQuaternion(a))}}else{o.copy(t.position)}const r=i.get_bone_position_by_MMD_name(y.substring(0,2),true);o.sub(r);let _=1;if(MMD_SA.THREEX.enabled){_=MMD_SA_options.model_para_obj.left_arm_length/i.para.left_arm_length;o.multiplyScalar(_)}let l=MMD_SA._v3a_.set(0,0,0);if(e.offset){if(e.offset=="parent_bone"){pb=MMD_SA.THREEX._object3d_list_.find(e=>e.parent_bone?.name==v+"手首"&&!e.parent_bone.disabled)?.parent_bone;if(pb)l.set(pb.position.x,pb.position.y,-pb.position.z)}else{l.copy(e.offset);if(!i.is_T_pose)l.applyQuaternion(MMD_SA_options.model_para_obj.rot_arm_adjust[v+"腕"].axis_rot)}l.applyQuaternion(i.get_bone_rotation_by_MMD_name(v+"手首",true))}b.add(l);let d=0;let c;if(t.magnet_type=="line"){const p=MMD_SA.THREEX.l1;p.start.copy(o);if(t.line_end){p.end.copy(t.line_end).multiply(s._mesh.scale).applyQuaternion(a);p.end.add(n)}else{p.end.copy(n||MMD_SA.TEMP_v3.set(0,0,0))}p.end.sub(r).multiplyScalar(_);if(t.line_offset){const h=MMD_SA.TEMP_v3.copy(t.line_offset).multiply(s._mesh.scale).applyQuaternion(a).multiplyScalar(_);p.start.add(h);p.end.add(h)}p.closestPointToPoint(b,true,o);let e=b.distanceTo(o);if(et*e)_=t*e}else{if(_{var S;window.addEventListener("jThree_ready",()=>{S=new System._browser.data_filter([{type:"one_euro",id:"armIK",para:[30,1,1/5,1,3]}])});return function(i,e){if(Te.IK_disabled_check(e))return;var t=i.bones_by_name[e];var o=this.skin[e];var n=Math.max(Math.min(o[0].t_delta/o[0].t_delta_frame,1),0);var a=e.charAt(0);var s=ze.copy(o[1].pos).lerp(o[0].pos,n);const r=MMD_SA.MMD.motionManager.para_SA;const _=a=="左"?"left":"right";const l=r?.motion_tracking?.arm_tracking?.transformation;if(l){const h=l.position;q(a+"腕IK",s,h);let t=l.root_rotation?.[_];if(t){const f=a+"腕";const M=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.set(t.x,t.y,t.z).multiplyScalar(Math.PI/180),t.order);let e=We[f];M.premultiply(e.axis_rot).multiply(e.axis_rot_inv);i.bones_by_name[f].quaternion.premultiply(M)}}if(o[0].data_filter||o[1].data_filter){s.fromArray(S.filter(s.toArray()))}const d=MMD_SA.get_bone_rotation_parent(i,e,i);if(!o[0]._IK_absolute){s.applyQuaternion(this.offset_upper_body_camera_rotation(He.copy(d).conjugate(),r?.motion_tracking?.arm_tracking?.transformation?.position?.camera_weight||1))}const c=Te._arm_IK_adjust?.[a];if(c){const g=MMD_SA_options.model_para_obj.left_arm_length;const y=["x","y","z"];if(c.min){if(typeof c.min=="number"){}else{for(const p of y){if(c.min[p]){if(s[p]p.target_radius){const w=b.sub(p.target).add(v.normalize().multiplyScalar(p.target_radius));s.sub(w.applyQuaternion(d.conjugate()))}}s.add(MMD_SA_options.model_para_obj.arm_IK_offset[a]);t.position.copy(s)}})();var K=function(){let D={};let k={};window.addEventListener("jThree_ready",()=>{D["左"]=new System._browser.data_filter([{type:"one_euro",para:[30,1,1,1,4]}]);D["右"]=new System._browser.data_filter([{type:"one_euro",para:[30,1,1,1,4]}]);k["左"]=[];k["右"]=[];for(let e=0;e<5;e++){k["左"][e]=new System._browser.data_filter([{type:"one_euro",para:[30,1,1,1,1]}]);k["右"][e]=new System._browser.data_filter([{type:"one_euro",para:[30,1,1,1,1]}])}});return function(n,e){var t=THREE.MMD.getModels()[n._model_index];var i=n.bones_by_name[e];var a=e.charAt(0);var o=i.quaternion;const s=this.skin[e];const r=Math.max(Math.min(s[0].t_delta/s[0].t_delta_frame,1),0);o.copy(s[1].rot).slerp(s[0].rot,r);o.fromArray(D[a].filter(o.toArray()));const _="YXZ";const l=MMD_SA.TEMP_v3.setEulerFromQuaternion(o,_);const d=MMD_SA.MMD.motionManager.para_SA.motion_tracking.arm_as_leg.transformation?.rotation||{};let c=Math.sign(l.y)*Math.min(Math.abs(l.y*(d.y?.scale||1)),Math.PI/2);const m=d.y?.foot_ratio||.25;l.y=c*m;l.z=Math.sign(l.z)*Math.min(Math.abs(l.z*(d.z?.scale||.5)),Math.PI/3);l.x*=d.x?.scale||.5;let u=[];let p=0;let h;if(s[0]._finger_x){if(s[1]._finger_x){h=s[0]._finger_x.map((e,t)=>e*r+s[1]._finger_x[t]*(1-r))}else{h=s[0]._finger_x}}if(h){for(let e=0;e<5;e++)u[e]=k[a][e].filter(h[e]);u[0]=(u[0]+u[1])/2;u.forEach(e=>{p+=e});p/=5;l.x-=p}l.x=Math.sign(l.x)*Math.min(Math.abs(l.x),Math.PI/2);o.setFromEuler(l,_);this._rot_=o.clone();this._rot_y=c;const f=this.get_blend_default_motion("skin",a+"足IK",true);if(f)c*=1-f;const M=MMD_SA.get_bone_position(n,a+"足",n);const g=MMD_SA.get_bone_rotation_parent(n,a+"足",n).conjugate();const y=MMD_SA.get_bone_position(n,e,n).sub(M).negate().normalize().applyQuaternion(g);const b=MMD_SA.TEMP_q.setFromAxisAngle(y,c*(1-m));if(0&&n.bones_by_name[a+"足D"]){n.bones_by_name[a+"足"].quaternion.premultiply(b);n.bones_by_name[a+"足D"].quaternion.premultiply(b)}else{t._update_IK_and_AddTrans(false,a+"足","下半身",true);if(this.skin[a+"足"]&&this.skin[a+"足"][0]._rot_){n.bones_by_name[a+"足"].quaternion.copy(this.skin[a+"足"][0]._rot_)}else{const v=MMD_SA.get_bone_position(n,a+"ひざ",n).sub(M).negate().normalize().applyQuaternion(g);const w=He.setFromUnitVectors(ze.set(0,1,0),y);n.bones_by_name[a+"足"].quaternion.copy(w).multiply(Oe.setFromEuler(ze.set(-v.angleTo(y),0,0)))}n.bones_by_name[a+"足"].quaternion.premultiply(b);t._update_IK_and_AddTrans(false,a+"足","下半身")}if(p&&n.bones_by_name[a+"足先EX"]){const e=a+"足人指";const S=!MMD_SA.MMD.motionManager.para_SA.motion_tracking.arm_as_leg.toes_disabled&&(n.bones_by_name[e]||n.bones_by_name[e+Ge[1]]);if(!S){let t=0;for(let e=1;e<4;e++){t+=u[e]}t/=4;const A=(u[1]-t)/2;n.bones_by_name[a+"足先EX"].quaternion.setFromEuler(ze.set(-p*.5,0,A),"XZY")}else{n.bones_by_name[a+"足先EX"].quaternion.setFromEuler(ze.set(-p*.5,0,0))}t._update_IK_and_AddTrans(false,a+"足先EX")}if(h){Ke.forEach((e,t)=>{const i=a+"足"+e+"指";const o=n.bones_by_name[i]||n.bones_by_name[i+Ge[1]];if(o)o.quaternion.multiply(He.setFromEuler(ze.set(-u[t]*.5,0,0)))})}}}();var ce=function(){let w={};window.addEventListener("jThree_ready",()=>{for(const e of["左","右"]){w[e]=new System._browser.data_filter([{type:"one_euro",id:"hand_rot_filter",para:[30,1,1,1,4]}])}});return function(e,t){var i=THREE.MMD.getModels()[e._model_index];var o=MMD_SA.THREEX.get_model(e._model_index).is_T_pose;var n=e.bones_by_name[t];var a=t.charAt(0);var s,r,_,l;var d=e.bones_by_name[a+"手捩"];var c;var m=this.skin[t];var u=Math.max(Math.min(m[0].t_delta/m[0].t_delta_frame,1),0);const p=MMD_SA.motion[i.skin._motion_index].para_SA;r=He.set(0,0,0,1);if(d){if(d.quaternion.x||d.quaternion.y||d.quaternion.z){d.quaternion.conjugate();i._update_IK_and_AddTrans(false,a+"手捩")}d.quaternion.set(0,0,0,1)}const h=a=="左"?1:-1;var f=m[0].rot_parent;if(!f){f=MMD_SA.get_bone_rotation(e,"上半身2",null,e);f.premultiply(Oe.copy(this._rot_body_offset).multiply(this._rot_camera).conjugate());f.multiply(MMD_SA.get_bone_rotation_parent(e,a+"手首","上半身2")).conjugate()}m[0]._rot_parent=f;const M=m[0].no_blending?S.copy(m[0].rot):S.copy(m[1].rot).slerp(m[0].rot,u);if(m[0]._rot_pose&&m[0]._rot_pose_ratio){let t=m[0]._rot_pose_ratio;if(m[0]._rot_pose_ratio_by_angle_difference){let e=MMD_SA.TEMP_q.copy(M).conjugate().multiply(m[0]._rot_pose).toAxisAngle()[1]%(Math.PI*2);if(e>Math.PI){e-=Math.PI*2}else if(e<-Math.PI){e+=Math.PI*2}const g=Math.pow(1-Math.abs(e)/Math.PI,1-m[0]._rot_pose_ratio_by_angle_difference);t*=g}if(m[0]._rot_pose_constrained){const y=ze.setEulerFromQuaternion(M,"YXZ");const b=Ce.setEulerFromQuaternion(m[0]._rot_pose,"YXZ");let e=Math.abs(y.y-b.y);if(e>Math.PI)e=Math.PI*2-e;if(e>Math.PI*2/3&&Math.abs(y.x)b.y?Math.PI*2:0)-y.y:-(y.y+(y.yMath.PI/4){const l=r{ve=new System._browser.data_filter([{type:"one_euro",id:"torso_rot",para:[30,.5,1,1,3]}]);we=new System._browser.data_filter([{type:"one_euro",id:"chest_rot",para:[30,.5,1,1,3]}]);Se=new System._browser.data_filter([{type:"one_euro",id:"shoulder_rot_z_filter",para:[30,1,1,1,1]}]);Ee=new System._browser.data_filter([{type:"one_euro",id:"hand_depth_weight",para:[30,.5,.1,1,1]}]);for(const e of["左","右"]){Ae[e]=new System._browser.data_filter([{type:"one_euro",id:"arm_IK"+e,para:[30,.5,1/2,1,3]}]);De[e]=new System._browser.data_filter([{type:"one_euro",id:"arm_IK"+e,para:[30,.5,1/2,1,4]}]);ke[e]=new System._browser.data_filter([{type:"one_euro",id:"hand_depth"+e,para:[30,.5,.1,1,1]}]);xe[e]=new System._browser.data_filter([{type:"one_euro",id:"rot_pose_ratio"+e,para:[30,.5,.1,1,1]}])}});return function(e){var Y=typeof e.data=="string"&&e.data.charAt(0)==="{"?JSON.parse(e.data):e.data;if(typeof Y==="string"){if(Y=="OK"){Te.worker_initialized=true}else{DEBUG_show(Y,2);System._browser.console.log(Y)}}else if(Te.enabled){window.dispatchEvent(new CustomEvent("SA_camera_poseNet_update"));Pe._needs_RAF=true;Te._bb=null;const te=MMD_SA.THREEX.get_model(0).model_para;const o=mt[Te.use_holistic?1:0];let e;if(Te.enabled&&!o.poseNet){e=true;o.poseNet=true}if(je.enabled&&!o.handpose){e=true;o.handpose=true}if(e)DEBUG_show("Pose ML ready",2);Le=(Ie.enabled?"\n":"")+Pe.video_canvas.width+"x"+Pe.video_canvas.height+"("+Te.camera_video_frame_id+")\n";let t=Pe.video_timestamp;let i=0;if(fe){i=Math.max(Math.min(t-fe,1e3),10);he+=i;if(++pe>=20){ue=1e3/(he/pe);pe=he=0}}fe=t;Te._t=Y._t;Ye.t_delta=((Ye.t_delta||i)+i)/2;if(Y.handpose){i=0;if(be){i=Math.max(Math.min(t-be,1e3),10);ye+=i;if(++ge>=20){Me=1e3/(ye/ge);ge=ye=0}}be=t;Te._t_hands=Y._t_hands;Ye.t_delta_hands=((Ye.t_delta_hands||i)+i)/2}if(Te.use_holistic){o.facemesh=true;if(!Y.facemesh){Ie.data_detected=0}}let G=[];let X=[];let W=Pe.x_flipped?1:-1;let Q;const s=THREE.MMD.getModels()[0];const n=s.mesh.bones_by_name;const ie=MMD_SA.THREEX.get_model(0).is_T_pose;const Z=MMD_SA.MMD.motionManager.para_SA;const m=Z.motion_tracking&&Z.motion_tracking.arm_as_leg;const $={"左":m&&m.enabled&&(!m.linked_side||m.linked_side=="left"),"右":m&&m.enabled&&(!m.linked_side||m.linked_side=="right")};let S;let V,a;let N;if(Te.enabled){if(Y.posenet&&Y.posenet.score>.3){Te.data_detected++;Te.initial_data_detected=true;if(Te.data_detected_stable){if(Xe){Xe=false;s.mesh.visible=true}S=Z.motion_tracking?.camera?.tilt_adjustment||Pe.tilt_adjustment;if(S.enabled){a=S.angle*S.pose_weight*Math.PI/180;V=(new THREE.Quaternion).set(Math.sin(a/2),0,0,Math.cos(a/2))}N=Y.posenet;let O=Te.use_3D_pose;if(nt){N._keypoints=N.keypoints;N._keypoints3D=N.keypoints3D;let o=[];let n=[];_t.forEach((e,t)=>{let i=N.keypoints[e];i.part=rt[t];o.push(i);i=N.keypoints3D[e];i.part=rt[t];n.push(i)});N.keypoints=o;N.keypoints3D=n}const d=ot?.3:!st?.5:.1;N.keypoints.forEach(e=>{e.score-=d});if(O){N._keypoints3D.forEach(e=>{e.score-=d})}if(st){let i={};N.keypoints.forEach(e=>{i[e.part]=e});let o=[];for(let t=0;t<=16;t++){let e=N.keypoints[t];if(!e)o.push(lt[t]);else if(e.part!=rt[t])o.push(i[rt[t]]||lt[t]);else o.push(e)}N.keypoints=o}let e=N._keypoints||N.keypoints;let t=e.map(e=>e.position.x);let i=e.map(e=>e.position.y);const g=[Math.min(...i),Math.max(...t),Math.max(...i),Math.min(...t)];e=N.keypoints.slice(0,5);t=e.map(e=>e.position.x);i=e.map(e=>e.position.y);const y=[Math.min(...i),Math.max(...t),Math.max(...i),Math.min(...t)];const b=Math.max(y[1]-y[3],y[2]-y[0])/2;g[0]=Math.min(g[0],y[0]-b);g[1]=Math.max(g[1],y[1]+b);g[2]=Math.max(g[2],y[2]-b);g[3]=Math.min(g[3],y[3]-b);Te._bb=g;if(!Ie.head_pose_enabled){Ie.bb_center[0]=N.keypoints[0].position.x/Pe.video_canvas.width;Ie.bb_center[1]=N.keypoints[0].position.y/Pe.video_canvas.height}if(O){let e=N._keypoints[0].position;let t=N._keypoints[3].position;let i=N._keypoints[6].position;const w=ze.copy(i);const D=Ce.copy(t);D.sub(w);const k=MMD_SA._v3a_.copy(e);const E=(k.x*D.x+k.y*D.y+k.z*D.z-(w.x*D.x+w.y*D.y+w.z*D.z))/D.lengthSq();const z=MMD_SA._v3b.set(w.x+D.x*E,w.y+D.y*E,w.z+D.z*E);let o=k.sub(z).normalize();let n=MMD_SA._v3b_.copy(t).sub(MMD_SA._v3b.copy(i));n.normalize();let a=MMD_SA.TEMP_v3.crossVectors(n,o).normalize();n.crossVectors(o,a);qe.set(n.x,n.y,n.z,0,o.x,o.y,o.z,0,a.x,a.y,a.z,0,0,0,0,1);Ue.setFromBasis(qe);let s=Ue.conjugate();s=s.clone().multiply(MMD_SA.TEMP_q.set(Math.sin(Math.PI/3.5/2),0,0,Math.cos(Math.PI/3.5/2)));Ie._neck.shoulder_center=Ce.copy(N._keypoints[11].position).add(MMD_SA.TEMP_v3.copy(N._keypoints[12].position)).multiplyScalar(.5).toArray();if(V)s.premultiply(V);if(!Ie.head_pose_enabled){Ye.add("skin","首",{after_IK:true,rot:s,onProcessRotation:dt});Ye.skin["首"][1]._rot_mixed&&Ye.skin["首"][1].rot.copy(Ye.skin["首"][1]._rot_mixed)}Ye.add("skin","首_DUMMY_",{rot:s,_rot_from_pose:s.clone(),onProcessRotation:dt})}let o=N.keypoints[5];let n=N.keypoints[6];let q=new THREE.Quaternion;Q=Z.motion_tracking_upper_body_only;Le+="\n"+(Q?(Z.motion_tracking?.arm_as_leg?.enabled?"🦶":"🙋")+"upper body":"💃full body");const v=MMD_SA_options.Dungeon_options?.item_base.hand_camera;if(v&&v._hand_camera_side){Le+="/"+(v.selfie_mode?"🤳selfie":"📷handcam")+(v._hand_camera_side=="左"?"-L":"-R")}Le+="\n";if(O&&ct)Ve.prepare(N);let M=0,U=0;if(je.enabled&&Y.handpose)je.hand_visible_timestamp={};Ne[0]=Ne[1]=0;let K;if(o.score>0&&n.score>0){let u,p;let h,f;if(O){u=N.keypoints3D[5];p=N.keypoints3D[6];let i=N.keypoints3D[11];let o=N.keypoints3D[12];let n;if(Q||i.score<=0||o.score<=0){Q=true}else{if(N.keypoints[11].position.y>Pe.video_canvas.height||N.keypoints[12].position.y>Pe.video_canvas.height){Q=true}let e=MMD_SA._v3b.copy(i).sub(o).normalize();let t=MMD_SA.TEMP_v3.set(1,0,0);n=Be.setFromVectorSpherical(t,e);M=n.z;if(1||Q)n.z=0;q.setFromEuler(n,"YZX")}let e=MMD_SA.TEMP_v3.set(0,1,0);e.y*=-1;let t=MMD_SA._v3a.addVectors(u,p).multiplyScalar(.5);if(t.z<0){t.normalize();if(Te.body_bend_reduction_power==1){t.z=0}else{spine_yz=MMD_SA._v3b.set(0,t.y,t.z).normalize();t.z*=Math.pow(-spine_yz.z,Math.pow(1.6,(Te.body_bend_reduction_power||0)/.25))/-spine_yz.z}}t.normalize();Ie.calculate_neck_data({is_pose:true,timestamp:Te.camera_video_frame_id,shoulder_center:Ie._neck.shoulder_center,spine_rot_absolute:Ce.setFromVectorSpherical(e,t).toArray()});t.applyQuaternion(MMD_SA.TEMP_q.copy(q).conjugate());const T=Ce.setFromVectorSpherical(e,t);if(Z.motion_tracking_upper_body_only){T.fromArray(ve.filter(T.toArray()));h=(new THREE.Quaternion).setFromEuler(T,"XZY")}else{if(Q){if(n){T.add(n)}q.set(0,0,0,1);T.fromArray(ve.filter(T.toArray()));h=(new THREE.Quaternion).setFromEuler(T,"YXZ")}else{h=(new THREE.Quaternion).setFromEuler(T,"XZY")}}U=T.x;let a=MMD_SA._v3b.copy(u).sub(p).normalize();a.applyQuaternion(MMD_SA.TEMP_q.multiplyQuaternions(q,h).conjugate());x_axis=MMD_SA.TEMP_v3.set(1,0,0);let s=Ce.setFromVectorSpherical(x_axis,a);let r=Te.shoulder_tracking?.5:0;let _=Se.filter(s.z*(MMD_SA_options.user_camera.ML_models.pose.model_quality=="Best"?3:5))*r;let l=Math.min(Math.PI/12/Math.abs(_),1);_*=l;if(Q){s.fromArray(we.filter(s.toArray()))}Ne[0]=_;Ne[1]=_;s.z*=1-r;f=(new THREE.Quaternion).setFromEuler(s,"YZX");let d=0;let c=s.y;let m=(d+c)%(Math.PI*2);if(m>Math.PI)m=Math.PI*2-m;else if(m<0&&m<-Math.PI)m+=Math.PI*2;h.multiply(He.set(0,Math.sin((m/2-d)/2),0,Math.cos((m/2-d)/2)));f.multiply(He.set(0,Math.sin((m/2-c)/2),0,Math.cos((m/2-c)/2)));Ye.add("skin","センター",{rot:q.clone(),priority:9});if(Ze.active){if(!Ye.skin["センター"][0].pos&&Ye.skin["センター"][1].pos)Ye.skin["センター"][0].pos=Ye.skin["センター"][1].pos}const C=h.clone();if(V){const B=He.copy(V);const oe=Z.motion_tracking?.ML_models?.pose||MMD_SA_options.user_camera.ML_models.pose;if(oe.upper_rotation_offset){const ne=-(oe.upper_rotation_offset-m)*2/3*Math.PI/180;const ae=V.toAxisAngle();B.setFromAxisAngle(ae[0].applyQuaternion(MMD_SA.TEMP_q.set(0,Math.sin(ne/2),0,Math.cos(ne/2))),ae[1])}He.premultiply(MMD_SA.TEMP_q.copy(q).conjugate()).multiply(q);C.premultiply(B)}Ye.add("skin","上半身",{rot:C});Ye.add("skin","上半身2",{rot:f.clone()});K=He.copy(q).multiply(h).multiply(f);K.conjugate()}const x=MMD_SA.TEMP_v3.set(1,1,1/3);Te.shoulder_width=ze.copy(o.position).multiply(x).distanceTo(Ce.copy(n.position).multiply(x));let H=Math.sqrt(Math.pow(o.position.x-n.position.x,2)+Math.pow(o.position.y-n.position.y,2));let e=0;if(!O){e=Math.asin((o.position.y-n.position.y)/H);e=Math.max(Math.min(e/(Math.PI/4),1),-1)*Math.PI/4*W}let t=W==1?[1,0]:[0,1];H=Ie.face_width*2||H;Te._upper_body_only_mode=Q;const J=[0,0];const ee=[];t.forEach(function(i,e){let n,a,s;let r;let _=e==0?"左":"右";let l=N.keypoints[5+i];let d=N.keypoints[7+i];let c=N.keypoints[9+i];let m=(Z.motion_tracking?.arm_tracking?.use_IK!=null?!Z.motion_tracking.arm_tracking.use_IK:MMD_SA_options.user_camera.ML_models.pose.use_armIK==null?!Q&&MMD_SA_options.Dungeon_options?.item_base.hand_camera?._hand_camera_side!=_:!MMD_SA_options.user_camera.ML_models.pose.use_armIK)&&!$[_];let u=false;let p=c.score>0&&c.position.x>=0&&c.position.x<=Pe.video_canvas.width&&c.position.y>=0&&c.position.y<=Pe.video_canvas.height;if(Z.motion_tracking_upper_body_only&&!p){m=false}ee[e]=new THREE.Quaternion;if(ie)ee[e].fromArray(MMD_SA.THREEX.utils.convert_A_pose_rotation_to_T_pose(_+"肩",ee[e].toArray()));let h,f,M;if(O){h=N.keypoints3D[5+i];f=N.keypoints3D[7+i];M=N.keypoints3D[9+i];let e=(te.camera?.poseNet?.arm_horizontal_offset_percent||0)/100+(Te.arm_horizontal_offset_percent||0)/100;if(e){const S=e>0?1/(1+e):1-e;const A=MMD_SA.TEMP_v3.copy(N.keypoints3D[5]).add(N.keypoints3D[6]).multiplyScalar(.5);const D=Be.copy(h).sub(A);const k=Je.copy(D).multiplyScalar(S).add(A);h={x:k.x,y:k.y,z:k.z};D.copy(k).sub(h).multiplyScalar(.5);k.copy(f).add(D);f={x:k.x,y:k.y,z:k.z}}}let t=W*(i==0?-1:1);if(O&&c.score>0&&je.enabled&&je.stabilize_hand_percent&&Te.shoulder_width){const E=Pe.video_canvas.width;const x=Pe.video_canvas.height;const P=je._hand_last[_];let o;if(Y.handpose&&Y.handpose.length){const R=Y.handpose.find(e=>e.label==(_=="左"?"Left":"Right"));if(R){o=P.hand=R.annotations.palm[0];P.timestamp=RAF_timestamp;P.w=E;P.h=x}}if(!o){o=P.hand}const I=1e3*(je.stabilize_hand_percent/100)*(Q||!m?1:.5);let n=RAF_timestamp-P.timestamp;if(o&&P.w==E&&P.h==x&&n0){o=MMD_SA._v3b.copy(h).sub(f).normalize().applyQuaternion(K);g=MMD_SA.TEMP_v3.set(t,0,0);y=(new THREE.Quaternion).setFromUnitVectors(g,o);J[e]=Ce.setFromVectorSpherical(g,o).z}let b=Ae[_].filters[0].filter;if(c.score>0){let e;if(Q&&je.enabled&&je.use_hands_worker&&!Y.handpose){if(je.hand_visible_timestamp[_]+200>RAF_timestamp)p=e=true}let n,t;if(je.enabled&&Y.handpose){n=Y.handpose.find(e=>e.label==(_=="左"?"Left":"Right"));if(n){p=true}}if(n){je.hand_visible_timestamp[_]=RAF_timestamp;if(!Q)je.hand_visible_session[_]=RAF_timestamp}if(je.enabled&&Q){let t;let i;let o=je.hand_visible_session[_]||0;if(n||e){if(o<1e3){je.hand_visible_session[_]=1e3;if(!je.stabilize_arm_time){t=true}else{i=true}}else if(o<1200){je.hand_visible_session[_]+=Te._t_hands;if(je.hand_visible_session[_]>1e3+je.stabilize_arm_time){t=true}else{i=true}}else{je.hand_visible_session[_]=RAF_timestamp}}else{je.hand_visible_timestamp[_]=0;let e=!p;if(p&&o<1e3+je.stabilize_arm_time){if(o>=1e3)o=je.hand_visible_session[_]=201;e=true;i=true}if(e){t=p;if(!o){je.hand_visible_session[_]=0;i=true}else if(o>200){je.hand_visible_session[_]=200}else{je.hand_visible_session[_]-=Te._t_hands;if(je.hand_visible_session[_]<0)je.hand_visible_session[_]=0}}}if(t){b.beta=1/10;b=null}if((Z.motion_tracking?.hand_tracking?.stabilize_arm_disabled?0:je.stabilize_arm)>(Z.motion_tracking_upper_body_only?0:1)){if(i){p=false;n=null;c.score=0;if(Ye.skin[_+"手首"]?.[0].rot.w!=1){const j=new THREE.Quaternion;Ye.add("skin",_+"ひじ",{absolute:true,no_blending:true,rot:j});Ye.add("skin",_+"手首",{after_IK:true,absolute:true,no_blending:true,rot:j});Ye.add("skin",_+"手捩",{after_IK:true,absolute:true,no_blending:true,rot:j})}}}}X.push({pos:c.position,dir:i,d:_,visible:p,handpose:n,palm_offset:t})}else{je.hand_visible_session[_]=0}let v=0;const w=Z.motion_tracking?.arm_tracking?.data_filter?.[_=="左"?"left":"right"];if(w){v=1;if(w.weight_by_magnet){const L=Z.motion_tracking.arm_tracking?.transformation?.position?.magnet?.find(e=>e.magnet_id==w.weight_by_magnet.id);v=L&&L._frame_count_>=EV_sync_update.count_frame-1-(je.use_hands_worker?6:0)?L._weight_:0}}if(b){b.beta=.5*(1-v)+(w?.beta||.5)*v}if(c.score>0){if(O){let o;if(d.score>0){let e=ze.copy(f).sub(M).normalize().applyQuaternion(K).applyQuaternion(MMD_SA.TEMP_q.copy(y).conjugate());g=MMD_SA.TEMP_v3.set(t,0,0);o=(new THREE.Quaternion).setFromUnitVectors(g,e)}if(!m||d.score<=0){m=false;let e=MMD_SA._v3a.copy(h).sub(M);if(V)e.applyQuaternion(V);let t=d.score>0?MMD_SA.TEMP_v3.copy(h).distanceTo(f)+MMD_SA.TEMP_v3.copy(f).distanceTo(M):.5;let i=Math.min(e.length()/t,1);e.normalize().multiplyScalar(i*MMD_SA_options.model_para_obj.left_arm_length);n=e.x;a=e.y;s=r=e.z;if(y){let e;if($[_]){e=K.clone().conjugate().multiply(y).multiply(o).conjugate()}se(y,_+"腕");if(Q)y.fromArray(De[_].filter(y.toArray()));Ye.add("skin",_+"腕",{absolute:true,rot:y,_rot_hand_parent:e,onFinish:le});if(o){se(o,_+"ひじ");Ye.add("skin",_+"ひじ",{absolute:true,rot:o})}}}else{se(o,_+"ひじ");se(y,_+"腕");Ye.add("skin",_+"腕",{absolute:true,rot:y,priority:-1,onFinish:_e});Ye.add("skin",_+"ひじ",{absolute:true,rot:o})}}else{u=true;let e=l.position.x-c.position.x;let t=l.position.y-c.position.y;n=e/H*MMD_SA_options.model_para_obj.shoulder_width*W;a=t/H*MMD_SA_options.model_para_obj.shoulder_width;if(d.score>0){let e=Math.min(Math.sqrt(Math.pow(c.position.x-d.position.x,2)+Math.pow(c.position.y-d.position.y,2))/H,1);let t=Math.min(Math.sqrt(Math.pow(l.position.x-d.position.x,2)+Math.pow(l.position.y-d.position.y,2))/H,1);r=(.25+(Math.sin(Math.acos(e))+Math.sin(Math.acos(t)))/2*.75)*MMD_SA_options.model_para_obj.left_arm_length}}}else{if($[_]){Ye.add("skin",_+"手首",{rot:new THREE.Quaternion});Ye.remove("skin",_+"足首")}if(d.score>0){if(O){if(!m){m=false;o=MMD_SA._v3a.copy(h).sub(f).normalize();o.multiplyScalar(MMD_SA_options.model_para_obj.left_arm_length);n=o.x*W;a=o.y;s=r=o.z}else{m=true;se(y,_+"腕");Ye.add("skin",_+"腕",{absolute:true,rot:y,priority:-1,onFinish:_e})}}else{m=false;u=true;let e=l.position.x-d.position.x;let t=l.position.y-d.position.y;let i=Math.sqrt(e*e+t*t);let o=Math.asin(e/i);n=Math.sin(o)*MMD_SA_options.model_para_obj.left_arm_length*W;a=Math.cos(o)*MMD_SA_options.model_para_obj.left_arm_length*Math.sign(t)}}else{if(O){if(!Z.motion_tracking_upper_body_only)return;s=r=0}else{u=true}if(n==null){m=false;n=MMD_SA_options.model_para_obj.left_arm_to_IK_xy[1]*(_=="左"?1:-1)*.2;a=-Math.sqrt(MMD_SA_options.model_para_obj.left_arm_length*MMD_SA_options.model_para_obj.left_arm_length-n*n)}}}if(!m&&(Z.motion_tracking?.arm_tracking?.use_IK||Q)&&!w?.disabled){let e=Ae[_].filters[0].filter;e.minCutOff=.5*(1-v)+(w?.minCutOff||.5)*v;const F=Ae[_].filter([n,a,s]);n=F[0];a=F[1];s=F[2]}G.push({pos:{x:n,y:a,z:s,z_posenet:r},dir:i,d:_,IK_disabled:m,IK_absolute:u})});J[0]=J[0]==null?0:Math.max(J[0]+Math.PI/2,0);J[1]=J[1]==null?0:Math.max(Math.PI/2-J[1],0);const P=J[0]>J[1]?1:0;const I=Math.min(Math.abs(J[0]-J[1])/(Math.PI/2),1);J[P==0?1:0]=1;J[P]=1-I*I*.5;t.forEach(function(e,i){let o=i==0?"左":"右";if(ee[i]){Ne[i]*=J[i];let e=Ne[2]*(i==0?1:-1);let t=Ne[i]+e;const n=Math.PI/6;if(Math.abs(t)>n){e=Math.sign(e)*(n-Math.abs(Ne[i]));t=Ne[i]+e}t=tt[o].filter(t);ee[i].multiply(MMD_SA.TEMP_q.set(0,0,Math.sin(t/2),Math.cos(t/2)));Ye.add("skin",o+"肩",{priority:-2,absolute:!(Z.motion_tracking_upper_body_only&&Z.motion_tracking?.motion_default_weight?.shoulder),rot:ee[i],_rot_z:Ne[i],_rot_shrug:e,_rot_total:t,onFinish:me})}})}else{Q=true}if(O&&!Q){const H=M;if(V){q.premultiply(MMD_SA.TEMP_q.copy(V).conjugate());M=H-MMD_SA.TEMP_v3.setEulerFromQuaternion(q,"YZX").z}Ve.get_hip_center(N);let e=W==1?[1,0]:[0,1];let B=[];let t=[];let o=0;let i=[];e.forEach(function(m,e){let u=e==0?"左":"右";let p=N.keypoints3D[11+m];let h=N.keypoints3D[13+m];let f=N.keypoints3D[15+m];let M,g,y;if(f.score>0){M=MMD_SA._v3a.copy(p).sub(f);g=M.length();y=h.score>0?MMD_SA.TEMP_v3.copy(p).distanceTo(h)+MMD_SA.TEMP_v3.copy(h).distanceTo(f):.7;M.normalize().multiplyScalar(Math.min(g/y,1)*MMD_SA_options.model_para_obj.left_leg_length)}if(Te.leg_scale_adjustment&&f.score>0){let e=1;let t=1;let i,o,n;let a,s,r;const _=Be.copy(p);const l=Je.copy(f).sub(_);let d,c;if(h.score>0){const e=Ce.copy(h);const t=(e.x*l.x+e.y*l.y+e.z*l.z-(_.x*l.x+_.y*l.y+_.z*l.z))/l.lengthSq();d=ze.set(_.x+l.x*t,_.y+l.y*t,_.z+l.z*t);c=e.sub(d);s=Be.copy(p).sub(h).length();r=Be.copy(p).sub(d).length();a=c.length()}else{s=y/2;r=Math.min(l.length()/2,s);a=Math.sqrt(s*s-r*r)}const C=a/y;const b=Pe.video_canvas.width;const v=Pe.video_canvas.height;const w=MMD_SA.TEMP_v3;const S=Ve.v_hip;const A=N.keypoints[11+m];const D=N.keypoints[15+m];const k=MMD_SA_options.model_para_obj.left_leg_length;const E=b/v;const x=SL.width/SL.height;const P=E0){t=Math.sqrt((s*s-e*e*r*r)/(a*a))||0;if(t){}else{o=0;n=true;i=s/r}if(o!=null){Le+="\n"+u+":"+i+"(x"+o+")"+(n?"<>":"")+"\n";e=i;t=o}else Le+="\n"+u+":"+e+"(x"+t+")\n";if(e!=1){const j=Be.copy(p).add(l.multiplyScalar(e)).sub(f);for(const F of[27,29,31]){const e=N._keypoints3D[F+m];Object.assign(e,MMD_SA.TEMP_v3.copy(e).add(j))}f=N.keypoints3D[15+m];const L=d.sub(p).multiplyScalar(e).add(p).add(c.multiplyScalar(t));h=N.keypoints3D[13+m]=Object.assign(h,L);M.multiplyScalar(e)}}else{M.multiplyScalar(e);Le+="\n"+u+"(IK):"+e+"(x"+t+")\n"}}let n,a;let i;if(h.score>0){i=MMD_SA._v3b.copy(p).sub(h).normalize().applyQuaternion(MMD_SA.TEMP_q.copy(q).conjugate());let e=MMD_SA.TEMP_v3.set(0,1,0);e.y*=-1;a=Ce.setFromVectorSpherical(e,i);n=(new THREE.Quaternion).setFromEuler(a,"XZY");const t=ze.setFromVectorSpherical(e,MMD_SA._v3b.copy(p).sub(h).normalize().applyQuaternion(MMD_SA.TEMP_q.copy(q).multiply(MMD_SA._q2.set(0,0,Math.sin(H/2),Math.cos(H/2))).multiply(MMD_SA._q1.set(Math.sin(U/2),0,0,Math.cos(U/2))).conjugate()));o+=t.x}let t=!MMD_SA_options.user_camera.ML_models.pose.use_legIK;if(f.score>0){let i,o;if(h.score>0){i=ze.copy(h).sub(f).normalize().applyQuaternion(MMD_SA.TEMP_q.copy(q).conjugate());o=Be.copy(i).applyQuaternion(MMD_SA.TEMP_q.copy(n).conjugate());o.z=Math.max(-o.z,0);o.x*=-1;let e=o.normalize().toSphericalCoords();let t=Math.sqrt(Math.min((Math.PI-e[2])/(Math.PI/2),1));a.y=e[1]*t;n.setFromEuler(a,"XZY")}if(!t||h.score<=0){Te.enable_IK(u+"足IK",true);B.push({pos:M.clone(),rot:[n],dir:m,d:u})}else{o=Be.copy(i).applyQuaternion(MMD_SA.TEMP_q.copy(n).conjugate());let e=MMD_SA.TEMP_v3.set(0,1,0);e.y*=-1;let t=(new THREE.Quaternion).setFromVectorSpherical(e,o);Te.enable_IK(u+"足IK",false);B.push({rot:[n,t],dir:m,d:u})}const s=N._keypoints3D[29+m];const r=N._keypoints3D[31+m];if(s.score>0&&r.score>0){let e=MMD_SA._v3a_.copy(s).sub(f).normalize();let t=MMD_SA._v3b_.copy(s).sub(r).normalize();let i=ze.crossVectors(e,t).normalize();e.crossVectors(t,i);qe.set(i.x,i.y,i.z,0,e.x,e.y,e.z,0,t.x,t.y,t.z,0,0,0,0,1);Ue.setFromBasis(qe);let o=Ue.conjugate();const _=-Math.PI/(MMD_SA_options.user_camera.ML_models.pose.model_quality=="Best"?10:8);o=o.clone().multiply(MMD_SA.TEMP_q.set(Math.sin(_/2),0,0,Math.cos(_/2)));if(V)o.premultiply(V);const l=He.copy(q);if(V)l.premultiply(V);const d=MMD_SA.TEMP_v3.setEulerFromQuaternion(l,"YZX");const c=Math.abs(d.y)%Math.PI;let n=c>Math.PI/2?1-(c-Math.PI/2)/(Math.PI/2):1;if(MMD_SA_options.user_camera.ML_models.pose.use_legIK){const z=o.clone();if(n<1){d.x=d.z=0;z.slerp(Oe.setFromEuler(d,"YZX"),1-n)}B[B.length-1].rot[2]=z}Ye.add("skin",u+"足首",{after_IK:true,absolute:true,parent_based:true,motion_recorder_disabled:MMD_SA_options.user_camera.ML_models.pose.use_legIK,rot:o,ratio:n,ratio_euler:MMD_SA_options.user_camera.ML_models.pose.model_quality=="Best"?{x:1,y:1,z:.5,order:"YXZ"}:null})}}else{if(h.score>0){if(!t){M=MMD_SA._v3a.copy(p).sub(h).normalize().multiplyScalar(MMD_SA_options.model_para_obj.left_leg_length);if(V)M.applyQuaternion(V);Te.enable_IK(u+"足IK",true);B.push({pos:M.clone(),rot:[n],dir:m,d:u})}else{Te.enable_IK(u+"足IK",false);B.push({rot:[n],dir:m,d:u})}}if(Ye.skin[u+"足首"]?.[0].rot.w!=1)Ye.add("skin",u+"足首",{after_IK:true,absolute:true,no_blending:true,rot:new THREE.Quaternion})}});let n=0;i.forEach(e=>{const t=e.y*(1-e.scale);if(t>0){n=Math.max(t,n)}else if(i.length>1){n=Math.max(t,n||t)}});if(n){Ve.v_hip.y+=n;Le+="\nleg_offset_y:"+n+"\n"}o*=.5*.5;o+=U;let a=(new THREE.Quaternion).setFromEuler(MMD_SA.TEMP_v3.set(o,0,M),"YZX");Ye.add("skin","下半身",{absolute:true,rot:a.clone()});if(!Q){Ye.add("skin","全ての親",{pos:new THREE.Vector3,after_IK:true,priority:999,onProcessPosition:de})}a.conjugate();B.forEach(e=>{var t=e.d;if(e.rot[0]){e.rot[0].multiplyQuaternions(a,e.rot[0]);Ye.add("skin",t+"足",{absolute:true,rot:e.rot[0]})}if(e.pos){e.pos.add(MMD_SA_options.model_para_obj.leg_IK_offset[t]);const i=e.rot[2]||Ye.skin[t+"足IK"]&&Ye.skin[t+"足IK"][0].rot;Ye.add("skin",t+"足IK",{absolute:true,pos:e.pos,rot:i,priority:999,onFinish:re})}else{if(e.rot[1]){Ye.add("skin",t+"ひざ",{absolute:true,rot:e.rot[1]})}else if(Ye.skin[t+"ひざ"]?.[0].rot.w!=1){Ye.add("skin",t+"ひざ",{absolute:true,no_blending:true,rot:new THREE.Quaternion})}}})}else{if(Z.motion_tracking_upper_body_only){Ye.add("skin","全ての親",{is_dummy:true,pos:true,after_IK:true,priority:999})}else if(O&&o.score>0&&n.score>0&&Pe.video_canvas.width){Ve.get_hip_center(N);Ye.add("skin","全ての親",{pos:new THREE.Vector3,after_IK:true,priority:999,onProcessPosition:de})}if(!$["左"]||!$["右"])Ye.add("skin","下半身",{is_dummy:true,rot:true});for(const j of["左","右"]){if(!$[j]){Ye.add("skin",j+"足IK",{is_dummy:true,pos:true,priority:999});Ye.add("skin",j+"足",{is_dummy:true,rot:true});Ye.add("skin",j+"ひざ",{is_dummy:true,rot:true});Ye.add("skin",j+"足首",{is_dummy:true,after_IK:true,rot:true})}}}}}else{Te.data_detected=0}}if(Te.enabled&&!Te.data_detected_stable&&!Xe){Xe=true;if(!Z.motion_tracking_upper_body_only&&Te.initial_data_detected)s.mesh.visible=false}let R;let A=[];const r=!je.enabled&&N&&Te.use_3D_pose;const _=W==1?[1,0]:[0,1];const c={};const l=je.enabled&&Te.shoulder_width?Math.min(Math.max(Math.max(Pe.video_canvas.width,Pe.video_canvas.height)/Te.shoulder_width-5,0)/5,1)*.5:0;const p={"左":l,"右":l};if(r||!Z.motion_tracking_upper_body_only&&l){_.forEach(function(e,t){let i=t==0?"左":"右";if(!X.find(e=>e.d==i)?.visible)return;let o=N._keypoints3D[15+e];let n=N._keypoints3D[17+e];let a=N._keypoints3D[19+e];if(o.score<=0||n.score<=0||a.score<=0)return;let s=e==1?[a,n]:[n,a];let r=MMD_SA._v3a_.copy(o).sub(MMD_SA._v3b.copy(n).add(a).multiplyScalar(.5)).normalize();r.x=r.x*W;let _=MMD_SA._v3b_.copy(s[0]).sub(s[1]).normalize();_.z=_.z*W;_.y=_.y*W;let l=MMD_SA.TEMP_v3.crossVectors(_,r).normalize();_.crossVectors(r,l);qe.set(_.x,_.y,_.z,0,r.x,r.y,r.z,0,l.x,l.y,l.z,0,0,0,0,1);Ue.setFromBasis(qe);let d=new THREE.Quaternion;d.copy(Ue).conjugate();if(V)d.premultiply(V);c[i]=d})}if(je.enabled&&Y.handpose&&Y.handpose.length&&X.length){const O=at?1:2;Y.handpose.forEach(e=>{e._offset={};R=e.annotations;if(O>1){for(let e in R){R[e].forEach(e=>{e[2]*=O})}}});X.forEach((m,e)=>{var u=m.dir;let p=m.handpose;if(p&&m.visible){m.visible=true;p._used=true;let k=m.d;p._d=k;R=p.annotations;let e=G.find(e=>e.dir==u);const h=Je.set(1,1,p.z_adjust_ratio||1);let t=Z.motion_tracking?.hand_tracking?.depth_adjustment_disabled?0:MMD_SA_options.user_camera.ML_models.hands.depth_adjustment_percent/100;if(t&&Q&&e.pos.z>0&&MMD_SA_options.Dungeon_options?.item_base.hand_camera?._hand_camera_side!=k){const g=(MMD_SA._v3a.fromArray(R.palm[0]).multiply(h).distanceTo(MMD_SA._v3b.fromArray(R.middle[0]).multiply(h))+MMD_SA._v3a.fromArray(R.index[0]).multiply(h).distanceTo(MMD_SA._v3b.fromArray(R.pinky[0]).multiply(h)))/2/Te.shoulder_width;const y=MMD_SA_options.user_camera.ML_models.hands.palm_shoulder_scale_percent/100;const b=Math.max(Pe.video_canvas.width,Pe.video_canvas.height)/Te.shoulder_width;Ee.filter(Math.max(3-Math.max(b-5,0),0)/3);palm_far_scale=(1.8+(1-Math.min(Math.max(b-4,0),1))*.4)*((1-MMD_SA_options.user_camera.ML_models.hands.depth_scale_percent/100)*2);ke[k].filter(Math.min(Math.max(g-y,0)/Math.max(y*palm_far_scale-y,.1),1))}if(p.worldLandmarks){R=p.worldLandmarks.annotations;h.set(1,1,1)}A.push(k+"手");let i=u==1?[R.index[0],R.ring[0]]:[R.ring[0],R.index[0]];let o,n,a;let s=MMD_SA._v3a_.fromArray(R.palm[0]).multiply(h).sub(MMD_SA._v3b.fromArray(R.middle[0]).multiply(h)).normalize();s.x=s.x*W;let r=MMD_SA._v3b_.fromArray(i[0]).multiply(h).sub(MMD_SA._v3b.fromArray(i[1]).multiply(h)).normalize();r.z=r.z*W;r.y=r.y*W;let _=MMD_SA.TEMP_v3.crossVectors(r,s).normalize();r.crossVectors(s,_);qe.set(r.x,r.y,r.z,0,s.x,s.y,s.z,0,_.x,_.y,_.z,0,0,0,0,1);Ue.setFromBasis(qe);let l=new THREE.Quaternion;l.copy(Ue).conjugate();if(S.enabled){const v=S.angle*Math.PI/180;const w=MMD_SA._q2.set(Math.sin(v/2),0,0,Math.cos(v/2));l.premultiply(w)}Ye.add("skin",k+"手首",{after_IK:true,rot:l,onProcessRotation:ce});Ye.add("skin",k+"手捩",{after_IK:true,absolute:true,priority:1,no_blending:true,rot:new THREE.Quaternion});const f=MMD_SA.TEMP_v3.setEulerFromQuaternion(l,"YXZ").y;const M=1;const P=(Math.abs(f){let f=c[(W==1?k:k=="左"?"右":"左")+h];let M=f.base_index+(h==0?0:-1);let g=R[it[h]];let y=Oe.copy(E);const b="XZY";if(P&&h>0){const e=Math.max(MMD_SA._v3a.fromArray(g[2]).sub(MMD_SA._v3b.fromArray(g[1])).length()*1.2,MMD_SA._v3a.fromArray(R.palm[0]).sub(MMD_SA._v3b.fromArray(g[0])).length()*(P==1?.2:.3));const S=MMD_SA._v3a.fromArray(g[1]).sub(MMD_SA._v3b.fromArray(g[0]));if(e/S.length()>1){const t=-P*Math.sqrt(e*e-(S.x*S.x+S.y*S.y))-S.z;for(let e=1;e<3;e++)g[e][2]+=t}}const v=k+p+"指"+Ge[f.base_index];const w=h==0?1:0;for(let u=M;u<3;u++){let e=k+p+"指"+Ge[f.base_index+(u-M)];let t=MMD_SA._v3a.fromArray(g[u+0]);let i=MMD_SA._v3b.fromArray(g[u+1]);let o=MMD_SA.TEMP_v3.fromArray(u==M?R.palm[0]:g[u-1]);t.y=-t.y;i.y=-i.y;o.y=-o.y;let n=MMD_SA._v3a_.copy(t).sub(o);let a=MMD_SA._v3b_.copy(i).sub(t);n.normalize();a.normalize();let s,r;let _;n.applyQuaternion(y);a.applyQuaternion(y);if(u==M){let e=MMD_SA.TEMP_q.set(0,0,0,1);e.setFromVectorSpherical(MMD_SA.TEMP_v3.set(0,1,0),n).conjugate();a.applyQuaternion(e);y.multiplyQuaternions(e,y)}let l=MMD_SA._q1.set(0,0,0,1);let d=MMD_SA._q2.set(0,0,0,1);n.set(0,1,0);_=Ce.setFromVectorSpherical(n,a);l.setFromEuler(_,b);d.copy(l);if(Math.abs(_.z)>Math.PI/(h==0?1.1:2.5)||_.x>Math.PI/(h==0?1.1:3)){_.set(-Math.abs(n.angleTo(a)),0,0)}if(h==0&&u>M+1){_.x=0}else if(_.x>0){_.x*=h==0?0:u>M?0:.75}else{_.x=Math.max(_.x,-Math.PI/(h==0?1.25:2))}if(h==0||u==M){_.z+=(h-2)/2*Math.PI/8*x*(h>0?1:.5);_.z*=h>0?Math.min(Math.max(Math.PI/2-Math.abs(_.x),0)/(Math.PI/2.5),1):1}else{_.z=0}if(I&&h>0&&u==M){const S=MMD_SA._v3a.fromArray(g[u+1]);S.y*=-1;S.applyQuaternion(E);const D=MMD_SA._v3b.fromArray(g[u+3]);D.y*=-1;D.applyQuaternion(E);if(S.y>D.y){_.x-=Math.abs(_.z)*I;_.z*=1-I}}_.y=0;if(h==0&&u==w)_.multiplyScalar(1.5);if(h==0)y.multiplyQuaternions(l.conjugate(),y);l.setFromEuler(_,b);if(h>0){y.multiplyQuaternions(l.conjugate(),y);l.conjugate()}let c=e;let m=l.toAxisAngle();r=m[0];s=m[1];r.z*=-1;const A=!MMD_SA.THREEX.enabled&&h==0?Math.min((Math.PI/8-We[v]._axis_rot_offset_inv_z*x)/(Math.PI/8),1.5):1;if(!MMD_SA.THREEX.enabled&&h==0)r.applyEuler(MMD_SA.TEMP_v3.set(0,Math.PI/4*x*A,0));r.applyEuler(ze.set(MMD_SA.THREEX.enabled?Math.PI/2:0,-Math.PI/2*x,0),"YXZ");if(MMD_SA.THREEX.enabled){l.setFromAxisAngle(r,s)}else{r.applyQuaternion(We[c].axis_rot);l.setFromAxisAngle(r,s)}if(u==w)l.premultiply(MMD_SA.TEMP_q.set(0,0,0,1).slerp(We[v].axis_rot_offset_inv,h==0?.5*A:1));if($[k]){if(u==M){const e=Ye.skin[k+"手首"][0];if(!e._finger_x)e._finger_x=[];e._finger_x[h]=_.x}}else{Ye.add("skin",e,{absolute:true,rot:l.clone()})}}})}else{const e=m.d;if(Z.motion_tracking_upper_body_only&&(!Z.motion_tracking?.hand_tracking?.stabilize_arm_disabled&&je.stabilize_arm)&&Ye.get_blend_default_motion("skin",e+($[e]?"足首":"手首"))!=0){m.visible=false}}})}else if(r){_.forEach(function(e,t){let i=t==0?"左":"右";if(c[i]){Ye.add("skin",i+"手首",{after_IK:true,rot:c[i],onProcessRotation:ce});Ye.add("skin",i+"手捩",{after_IK:true,absolute:true,priority:1,no_blending:true,rot:new THREE.Quaternion})}})}const h={};const f={};_.forEach(function(e,t){let s=t==0?"左":"右";const o=Z.motion_tracking?.hand_tracking?.rotation_reference?.[s=="左"?"left":"right"];if(o){let a=o.weight||1;if(o.type=="object3D"){const i=MMD_SA.THREEX._XR_Animator_scene_.object3D_list.find(e=>e.id==o.name);if(!i)return;const n=MMD_SA.THREEX._object3d_list_.find(e=>e.uuid==i._object3d_uuid);if(n._rot_aligned_&&n.parent_bone.name==s+"手首"){if(n._rot_aligned_weight_!=null)a=n._rot_aligned_weight_}f[s]=o.weight_by_angle_difference;h[s]=o.constrained_direction}if(o.weight_by_magnet){const r=Z.motion_tracking.arm_tracking?.transformation?.position?.magnet?.find(e=>e.magnet_id==o.weight_by_magnet.id);a=r&&r._frame_count_>=EV_sync_update.count_frame-1-(je.use_hands_worker?6:0)?r._weight_*(o.weight_by_magnet.max||a):0}if(!X.find(e=>e.d==s)?.handpose?._used){a=1}a=xe[s].filter(a);p[s]=a;if(a){if(!Ye.skin[s+"手首"]){const _=new THREE.Quaternion;Ye.add("skin",s+"手首",{after_IK:true,rot:_,onProcessRotation:ce});Ye.add("skin",s+"手捩",{after_IK:true,absolute:true,priority:1,no_blending:true,rot:new THREE.Quaternion})}else if(Ye.skin[s+"手首"][0].timestamp{i.forEach(e=>{const t=s+n+"指"+e;const i=d+n+"指"+e;let o=Ye.skin[i]?.[0].rot;if(o){o=MMD_SA.TEMP_q.copy(o);o.y*=-1;o.z*=-1;if(!Ye.skin[t]){Ye.add("skin",t,{absolute:true,rot:o.clone()})}else{Ye.skin[t][0].rot.slerp(o,a)}}})})}else if(o.fingers){for(const c in o.fingers){let[e,t]=c.split("|");e=l[e];t=i[parseInt(t)+(e=="親"?-1:0)];e=s+e+"指"+t;const m=Ye.skin[e];if(m&&m[0].timestamp==RAF_timestamp){const u=o.fingers[c];let e=MMD_SA.TEMP_q;if(u.w==null){e=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.copy(u).multiplyScalar(Math.PI/180));u.x=e.x;u.y=e.y;u.z=e.z;u.w=e.w}else{e.copy(u)}m[0].rot.slerp(e,a)}}}}}}});for(const j of["左","右"]){const M=Ye.skin[j+"手首"];if(M){M[0]._rot_pose=c[j];M[0]._rot_pose_ratio=p[j];M[0]._rot_pose_constrained=h[j];M[0]._rot_pose_ratio_by_angle_difference=f[j];if(!M[0]._finger_x)M[0]._finger_x=M[1]._finger_x}}const u=[];G.forEach(function(n){var a=n.d;let s=Z.motion_tracking?.hand_tracking?.depth_adjustment_disabled?0:MMD_SA_options.user_camera.ML_models.hands.depth_adjustment_percent/100;if(s&&je.enabled&&Q&&MMD_SA_options.Dungeon_options?.item_base.hand_camera?._hand_camera_side!=a){let i=ke[a].filter();let e=(RAF_timestamp-ke[a].timestamp)/1e3;let o=1-Math.min(Math.max(e-.2,0)/(1-.2),1);if(o){let e=Ee.filter();s*=o*e;let t=i*MMD_SA_options.model_para_obj.left_arm_length*s+n.pos.z*(1-s);const r=Math.sqrt(MMD_SA_options.model_para_obj.left_arm_length*MMD_SA_options.model_para_obj.left_arm_length-n.pos.x*n.pos.x-n.pos.y*n.pos.y);t=Math.min(t,r);n.pos.z=t}}if($[a]){if(n.IK_disabled)return;Te.enable_IK(a+"足IK",true);if(Ye.skin[a+"手首"]&&Ye.skin[a+"腕"]&&Ye.skin[a+"手首"][0].timestamp==Ye.skin[a+"腕"][0].timestamp){let e;if(e){}else{const o=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.set(Math.PI/2,0,0));const _=Ye.skin[a+"手首"][0].rot.premultiply(o).multiply(o.conjugate());Ye.add("skin",a+"足首",{after_IK:true,rot:_,_finger_x:Ye.skin[a+"手首"][0]._finger_x,absolute:true,onFinish:K})}}else{const l=Ye.skin[a+"足首"];if(l){l[0].rot_parent=l[0]._rot_parent}}Ye.remove("skin",a+"手首");Ye.remove("skin",a+"腕");Ye.remove("skin",a+"ひじ");Ye.remove("skin",a+"手捩");Ye.remove("skin",a+"腕IK");if(je.enabled){Ke.forEach((t,e)=>{let i=e==0?0:1;for(let e=i;e{const t=MMD_SA_options.model_para_obj.left_leg_length;e.y+=t*1/3;e.z+=t*.25;e.multiplyScalar(1.5)});u.push({d:a,pos:t,rot:i[1]})}else{Te.enable_IK(a+"腕IK",!n.IK_disabled);if(!n.IK_disabled){if(n.pos.z==null)n.pos.z=n.pos.z_posenet||(Te.use_3D_pose?0:MMD_SA_options.model_para_obj.left_arm_length*.2);const d=X.find(e=>e.d==a)?.visible;const c=(new THREE.Vector3).copy(n.pos);Ye.add("skin",a+"腕IK",{priority:999,pos:c,_IK_absolute:n.IK_absolute,_hand_visible:d,onProcessPosition:U})}const e=Ye.skin[a+"手首"];if(e){e[0].rot_parent=e[0]._rot_parent}}});if(u.length&&m.transformation?.position?.process)m.transformation.position.process(u);u.forEach(e=>{const t=e.d;const i=e.pos;i.y+=MMD_SA_options.model_para_obj.left_leg_IK[1]+(n["センター"].position.y-n["センター"].pmxBone.origin[1]);if(e.rot){Ye.add("skin",t+"足",{absolute:true,rot:e.rot,onFinish:function(e,t){this.skin[t][0]._rot_=e.bones_by_name[t].quaternion.clone()}})}else{Ye.remove("skin",t+"足")}Ye.remove("skin",t+"ひざ");Ye.add("skin",t+"足IK",{absolute:true,priority:999,pos:i})});if(Xe){if(Z.motion_tracking_upper_body_only){for(const j of["左","右"]){Te.enable_IK(j+"腕IK",Z.has_arm_IK)}}}else if(Z.motion_tracking_upper_body_only){for(const j of["左","右"]){const L=!X.find(e=>e.d==j)?.visible;if($[j]){Ye.set_blend_default_motion("skin",j+"足IK",L);Ye.set_blend_default_motion("skin",j+"足",L);Ye.set_blend_default_motion("skin",j+"ひざ",L);Ye.set_blend_default_motion("skin",j+"足首",L)}else{if(Z.has_leg_IK){Ye.set_blend_default_motion("skin",j+"足IK",true);Ye.remove("skin",j+"足首")}else{Ye.set_blend_default_motion("skin",j+"足",true);Ye.set_blend_default_motion("skin",j+"ひざ",true);Ye.set_blend_default_motion("skin",j+"足首",true)}Te.enable_IK(j+"足IK",Z.has_leg_IK);Te.enable_IK(j+"つま先IK",Z.has_leg_IK);Ye.set_blend_default_motion("skin",j+"肩",L);Ye.set_blend_default_motion("skin",j+"腕",L);Ye.set_blend_default_motion("skin",j+"ひじ",L);Ye.set_blend_default_motion("skin",j+"手捩",L);Ye.set_blend_default_motion("skin",j+"手首",L);Ye.set_blend_default_motion("skin",j+"腕IK",L);if(je.enabled){Ke.forEach((t,e)=>{let i=e==0?0:1;for(let e=i;e{DEBUG_show((Te.use_holistic&&"(no facemesh data)\n"||"")+(Fe?"\n"+Fe+"\n":"")+Le+"\n"+"FPS:"+EV_sync_update.fps_last)},0,0)}if(Y.facemesh){Ie.worker_onmessage({data:Y.facemesh})}if(N&&Ie.worker_initialized){let e={posenet:N,w:Pe.video_canvas.width,h:Pe.video_canvas.height,flip_canvas:Pe.display_flipped};if(Y.handpose&&Y.handpose.length)e.handpose=Y.handpose;if(Y.facemesh)e.facemesh=Y.facemesh.faces;if(Te.use_holistic||!Ie.enabled){e.draw_canvas=true;if(self.FacemeshAT){e.canvas=Pe.video_canvas_facemesh}else if(!Pe.video_canvas_facemesh._offscreen&&self.OffscreenCanvas){e.canvas=Pe.video_canvas_facemesh.transferControlToOffscreen();Pe.video_canvas_facemesh._offscreen=true;console.log("(Facemesh: use offscreen canvas)")}}Re.postMessage(e,e.canvas?[e.canvas]:undefined)}$e=0}W()}}();function W(e){async function t(){var e=Te.enabled&&Te.worker_initialized&&E&&!Te.busy&&P&&Te.camera_video_timestamp!=E;if(!e)return;$e=RAF_timestamp;Te.camera_video_timestamp=E;Te.camera_video_frame_id=x;if(Te.use_holistic&&Ie.blink_detection){MMD_SA_options.auto_blink=Ie.auto_blink||false}let t,i,o;t=Pe.video_canvas;i=t.width;o=t.height;let n=self.PoseAT?t:I?await createImageBitmap(t):t.getContext("2d").getImageData(0,0,i,o).data.buffer;Te._timestamp=Pe.video_timestamp;let a={rgba:n,w:i,h:o,options:{video_flipped:Pe.video_flipped,use_canvas_hands:!MMD_SA.MMD.motionManager.para_SA.motion_tracking_upper_body_only&&!Te.use_holistic,use_holistic:Te.use_holistic,use_posenet:true,use_handpose:je.enabled,use_hands_worker:je.use_hands_worker,skip_hand_countdown_max:Te.skip_hand_countdown_max,model_quality:MMD_SA_options.user_camera.ML_models.pose.model_quality||"",z_depth_scale:MMD_SA_options.user_camera.ML_models.pose.z_depth_scale,timestamp:Te._timestamp}};Object.assign(a.options,MMD_SA.MMD.motionManager.para_SA.motion_tracking?.hand_tracking?.mocap_options);let s=[a.rgba];if(!Te.canvas_hands){const r=Te.canvas_hands=document.createElement("canvas");r.width=r.height=768;a.canvas_hands=r.transferControlToOffscreen();s.push(a.canvas_hands)}if(je.use_hands_worker&&!je.canvas_hands_worker){const r=je.canvas_hands_worker=document.createElement("canvas");r.width=r.height=768;a.canvas_hands_worker=r.transferControlToOffscreen();s.push(a.canvas_hands_worker)}v.postMessage(a,s);s.length=0;s=undefined;a.rgba=n=undefined;a=undefined}if(e||self.PoseAT){setTimeout(()=>{t()},0)}else{t()}}var Q=function(){const s=()=>{};var r,_;var Y={};var Z={},$={},J={};var ee={};var te,ie;window.addEventListener("jThree_ready",e=>{r=new THREE.Vector3;_=new THREE.Quaternion;for(const t of["センター","上半身","上半身2","首","頭"]){Y[t]=new THREE.Quaternion}for(const i of["左","右"]){ee[i]={target:new THREE.Vector3,arm_pos:new THREE.Vector3};Z[i]={target:new THREE.Vector3,effector:new THREE.Quaternion,links:[]};$[i]={effector:new THREE.Quaternion,links:[]};J[i]={effector:new THREE.Quaternion,parent:new THREE.Quaternion,links:[]};for(let e=0;e<2;e++){Z[i].links[e]=new THREE.Quaternion;$[i].links[e]=new THREE.Quaternion;J[i].links[e]=new THREE.Quaternion}}te=new System._browser.data_filter([{type:"one_euro",id:"hip_rot",para:[30,1,.2,.2,4]}]);ie=new System._browser.data_filter([{type:"one_euro",id:"hip_mov",para:[30,1,.2,.2,3]}])});const l=250;const d=500;const c=0;function e(e,t,i){if(!this[e][t])return 0;const o=this[e][t][0];let n;if(o._blend_default_motion>0){n=Math.min((RAF_timestamp-o._blend_default_motion)/d,1)}else if(o._blend_default_motion<0){n=1-Math.min((RAF_timestamp+o._blend_default_motion)/l,1)}else{n=0}if(n==0){this[e][t].forEach(e=>{e._blend_default_motion=0})}else if(i){const e=2;n=n<.5?Math.pow(n*2,e)*.5:.5+Math.pow((n-.5)*2,1/e)*.5}return n}function t(e,t,i,o){if(!this[e][t]){if(!i)return;const n=t.indexOf("IK")!=-1;const a={_blend_default_motion:i?1:0};if(n)a.pos=new THREE.Vector3;else a.rot=new THREE.Quaternion;this.add("skin",t,a)}else{const s=this[e][t][1];const r=this[e][t][1]._blend_default_motion;if(i){if(this.reset_to_default_motion_once){s._idle_blend_default_motion=0;s._blend_default_motion=1}else if(!s._blend_default_motion){if(!s._idle_blend_default_motion)s._idle_blend_default_motion=RAF_timestamp;if(RAF_timestamp-s._idle_blend_default_motion>=(typeof o=="number"?o:c)){s._idle_blend_default_motion=0;s._blend_default_motion=RAF_timestamp-RAF_timestamp_delta}}else if(s._blend_default_motion<0){s._blend_default_motion=RAF_timestamp-this.get_blend_default_motion(e,t)*d}}else{s._idle_blend_default_motion=0;if(s._blend_default_motion>0){s._blend_default_motion=-(RAF_timestamp-(1-this.get_blend_default_motion(e,t))*l)}}this[e][t][0]._blend_default_motion=s._blend_default_motion;this[e][t][0]._idle_blend_default_motion=s._idle_blend_default_motion}if(!this["_"+e][t])this["_"+e][t]={pos:new THREE.Vector3,rot:new THREE.Quaternion}}const i=new RegExp("("+toRegExp(["腕"],"|")+")$");function oe(i,o){const e=THREE.MMD.getModels()[i._model_index];const n=MMD_SA.motion[e.skin._motion_index].para_SA;let t;const a=i.bones_by_name;const s=a[o];const r=this.skin[o];if(Te.enabled&&!Te.data_detected_stable)return;if(r[0].info[1]=="facemesh"){}let _,l;r[0].t_delta+=RAF_timestamp_delta;let d=Math.max(Math.min(r[0].t_delta/r[0].t_delta_frame,1),0);if(r[0].rot){if(r[0].after_IK){t=!s._update_IK_and_AddTrans||s._update_IK_and_AddTrans.length;if(t){if(s.quaternion.x||s.quaternion.y||s.quaternion.z){s.quaternion.conjugate();e._update_IK_and_AddTrans(false,o);s.quaternion.conjugate()}}}if(r[0].onProcessRotation){r[0].onProcessRotation.call(this,i,o)}else{let t=He.set(0,0,0,1);if(r[0].absolute){s.quaternion.set(0,0,0,1)}else{let e;if(n.motion_tracking_upper_body_only){if(o.indexOf("上半身")!=-1){e=n.motion_tracking?.motion_default_weight?.upper_body}else if(o.indexOf("肩")!=-1){e=n.motion_tracking?.motion_default_weight?.shoulder}}if(e==null)e=1;if(e<1)s.quaternion.slerp(MMD_SA.TEMP_q.set(0,0,0,1),1-e)}if(r[0].parent_based){let e=r[0].rot_parent;if(!e){e=MMD_SA.get_bone_rotation_parent(i,o,i).conjugate()}r[0]._rot_parent=e;t.copy(e)}t.multiply(r[0].no_blending?r[0].rot:MMD_SA.TEMP_q.copy(r[1].rot).slerp(r[0].rot,d));const m=r[0].ratio_euler;if(m){const p=MMD_SA.TEMP_v3.setEulerFromQuaternion(t,m.order);const h=r[0].ratio<1?r[0].ratio:1;p.x*=m.x*h;p.y*=m.y*h;p.z*=m.z*h;t.setFromEuler(p,m.order)}else if(r[0].ratio<1){t.slerp(Oe.set(0,0,0,1),1-r[0].ratio)}const u=MMD_SA_options.model_para_obj_all[i._model_index].skin_default[o];if(u&&u.rot_scale){if(typeof u.rot_scale=="number")u.rot_scale={x:u.rot_scale,y:u.rot_scale,z:u.rot_scale};t.setFromEuler(MMD_SA.TEMP_v3.setEulerFromQuaternion(t,"YXZ").multiply(u.rot_scale),"YXZ")}s.quaternion.multiply(t);_=Ze.active&&!r[0].motion_recorder_disabled&&o.indexOf("IK")==-1}}if(r[0].pos){if(r[0].onProcessPosition){r[0].onProcessPosition.call(this,i,o)}else{if(r[0].absolute)s.position.set(0,0,0);const f=MMD_SA.TEMP_v3.copy(r[1].pos).lerp(r[0].pos,d);s.position.add(f);l=Ze.active&&!r[0].motion_recorder_disabled&&o.indexOf("IK")==-1}}r[0].onFinish&&r[0].onFinish.call(this,i,o);if(_)Ze.set_boneKey(o,null,s.quaternion,true);if(l)Ze.set_boneKey(o,ze.copy(s.position).sub(Ce.fromArray(s.pmxBone.origin)),null,true);const c=this.get_blend_default_motion("skin",o,true);if(c){if(r[0].rot&&this._skin[o]?.rot){const M=MMD_SA.TEMP_q.copy(this._skin[o].rot);s.quaternion.slerp(this._skin[o].onProcessRotation&&this._skin[o].onProcessRotation.call(this,i,o,M)||M,c)}if(r[0].pos&&this._skin[o]?.pos){s.position.lerp(this._skin[o].pos,c)}if(Ze.active&&!r[0].motion_recorder_disabled){if(o.indexOf("IK")!=-1)Ze.set_boneKey(o,r[0].pos&&s.position,r[0].rot&&s.quaternion,false)}}t&&e._update_IK_and_AddTrans(false,o)}var ne=0;function o(e){function a(){if(D)return;D=Y;for(const e of["センター","上半身","上半身2","首"]){const t=this.skin[e];if(!t){D[e].set(0,0,0,1);continue}if(e=="首"){D[e].copy(t[0]._rot_neck||t[1]._rot_neck||MMD_SA._q1.set(0,0,0,1));D["頭"].copy(t[0]._rot_head||t[1]._rot_head||MMD_SA._q1.set(0,0,0,1))}else{const i=MMD_SA._q1.set(0,0,0,1);const o=Math.max(Math.min((t[0].t_delta+RAF_timestamp_delta)/t[0].t_delta_frame,1),0);i.multiply(t[0].no_blending?t[0].rot:MMD_SA.TEMP_q.copy(t[1].rot).slerp(t[0].rot,o));if(t[0].ratio<1)i.slerp(MMD_SA._q2.set(0,0,0,1),1-t[0].ratio);D[e].copy(i)}}s=MMD_SA._q1.copy(D["センター"]).multiply(D["上半身"]).multiply(D["上半身2"]).conjugate()}function z(e){const t=["センター","上半身","上半身2","首","頭"];let o;const n=k&&k.parent;const a=ze.set(0,0,0);if(n){const f=n.name||e+"足";const M=f.charAt(0);const g=1-this.get_blend_default_motion("skin",f.indexOf("足")!=-1?M+"足IK":f,true);let t,i;switch(f){case"頭":o=g&&this.skin["首"];if(o){for(const f of["首","頭"])S[f].quaternion.copy(D[f]);t=MMD_SA.get_bone_position(w,"頭","首").add(Ce.set(0,.75,.75).applyQuaternion(MMD_SA.TEMP_q.copy(S["首"].quaternion).multiply(S["頭"].quaternion)));S["首"].quaternion.copy(this._body_motion_rot[0]["首"]);S["頭"].quaternion.copy(this._body_motion_rot[0]["頭"]);i=MMD_SA.get_bone_position(w,"頭","首").add(Ce.set(0,.75,.75).applyQuaternion(MMD_SA.TEMP_q.copy(S["首"].quaternion).multiply(S["頭"].quaternion)))}break;case"左足":case"右足":o=g;if(o){if(!$[M].updated){Z[M].enabled=true;o=false}}else{Z[M].enabled=false;$[M].updated=0}if(o){const y=Ce.fromArray(S[e+"ひざ"].pmxBone.origin).sub(Be.fromArray(S[f].pmxBone.origin));t=Be.copy(y).applyQuaternion(He.copy(J[M].parent).multiply(J[M].links[1]));i=y.applyQuaternion(He.copy(J[M].parent).multiply($[M].links[1]))}break}if(o){o=f;a.copy(t).sub(i);let e=n.weight||.5;if(typeof e=="object"){a.x*=a.x<0?e.x.left:e.x.right;a.y*=a.y<0?e.y.down:e.y.up;a.z*=a.z<0?e.z.backward:e.z.forward}else{a.multiplyScalar(e)}a.multiplyScalar(g)}}let i,s,r;for(const f of t)S[f].quaternion.copy(this._body_motion_rot[0][f]);const _=A.motion_tracking?.arm_tracking?.elbow_lock?.[e=="左"?"left":"right"];if(_){_._elbow_y=_.y_absolute!=null?_.y_absolute:MMD_SA.get_bone_position(w,e+"ひじ",w).y+(_.y||0)}if(!o||o!="頭"){i=MMD_SA.get_bone_position(w,e+"腕",w);r=MMD_SA.get_bone_rotation_parent(w,e+"腕IK",w);s=!A.has_arm_IK?MMD_SA.get_bone_position(w,e+"手首",w):(new THREE.Vector3).copy(S[e+"腕IK"].position).sub(MMD_SA_options.model_para_obj.arm_IK_offset[e]).applyQuaternion(r).add(i);r.conjugate()}for(const f of t)S[f].quaternion.copy(this._body_motion_rot[1][f]);if(!i){i=MMD_SA.get_bone_position(w,e+"腕",w);r=MMD_SA.get_bone_rotation_parent(w,e+"腕IK",w);s=!A.has_arm_IK?MMD_SA.get_bone_position(w,e+"手首",w):(new THREE.Vector3).copy(S[e+"腕IK"].position).sub(MMD_SA_options.model_para_obj.arm_IK_offset[e]).applyQuaternion(r).add(i);r.conjugate()}for(const f of["センター","上半身","上半身2"]){let e;if(f.indexOf("上半身")!=-1)e=A.motion_tracking?.motion_default_weight?.upper_body;if(e==null)e=1;if(this.skin[f]){if(e<1)S[f].quaternion.slerp(MMD_SA.TEMP_q.set(0,0,0,1),1-e);S[f].quaternion.multiply(D[f])}}let l=k&&k.default_position_weight;if(typeof l!="number")l=.5;const d=MMD_SA.get_bone_rotation_parent(w,e+"腕IK",w).conjugate();let c;let m=A.motion_tracking?.arm_tracking?.IK_constraint;if(m)m=m[e=="左"?"left":"right"]||m;if(m&&this.skin[e+"腕IK"]&&this.get_blend_default_motion("skin",e+"腕IK")<1){const b=ee[e];b.enabled=true;b.target.copy(s);b.target_radius=0;if(m.target_offset){const v=ze.fromArray(m.target_offset);b.target.add(v);b.target_radius=v.length()}if(m.target_radius)b.target_radius+=m.target_radius;c=MMD_SA.get_bone_position(w,e+"腕",w);b.arm_pos.copy(c)}c=l==0?i:(c||MMD_SA.get_bone_position(w,e+"腕",w)).lerp(i,1-l);const u=c.sub(s);if(l<1)d.slerp(r,1-l);if(o&&o.indexOf("足")!=-1){a.applyQuaternion(d)}const p=Pe.x_flipped?-1:1;u.x*=p;u.y*=-1;u.z*=-1;if(o&&o=="頭"){u.applyQuaternion(d)}else{u.applyQuaternion(d)}if(!this._skin[e+"腕IK"])this._skin[e+"腕IK"]={pos:new THREE.Vector3,rot:new THREE.Quaternion};if(!this._skin[e+"腕IK"].rot_parent_inv)this._skin[e+"腕IK"].rot_parent_inv=new THREE.Quaternion;this._skin[e+"腕IK"].rot_parent_inv.copy(d).conjugate();u.add(MMD_SA_options.model_para_obj.arm_IK_offset[e]);u.add(a);for(const f of t)S[f].quaternion.copy(this._body_motion_rot[1][f]);const h=this.skin[e+"手首"];if(h){if(O){h[0].after_IK=true;if(this._skin[e+"手首"])this._skin[e+"手首"]._rot_absolute=MMD_SA.get_bone_rotation(w,e+"手首",false,w)}if(this._skin[e+"手首"])this._skin[e+"手首"].onProcessRotation=C;if(this._skin[e+"手捩"])this._skin[e+"手捩"].onProcessRotation=B}return u}function C(e,t,i){const o=t.charAt(0);const n=A.motion_tracking&&A.motion_tracking.arm_default_stickiness&&(A.motion_tracking.arm_default_stickiness[o]||A.motion_tracking.arm_default_stickiness).default_rotation_weight;if(!n)return i;const a=MMD_SA.get_bone_rotation_parent(e,t,e).conjugate();const s=a.multiply(this._skin[t]._rot_absolute);return s.slerp(i,1-n)}function B(e,t,i){return i.set(0,0,0,1)}function t(){if(Te.data_detected){ae();System._browser.on_animation_update.remove(t,0)}}const i=e.detail.model;const H=MMD_SA.THREEX.get_model(i._model_index).is_T_pose;const w=i.mesh;const S=w.bones_by_name;const A=MMD_SA.motion[i.skin._motion_index].para_SA;for(const r of["左","右"]){const o=A.motion_tracking?.hand_tracking?.rotation_reference?.[r=="左"?"left":"right"];if(!o)continue;hand_f=Ye.skin[r+"手首"]?.[0];if(!hand_f||!hand_f._rot_pose_ratio)continue;let e;if(o.type=="object3D"){const _=MMD_SA.THREEX._XR_Animator_scene_.object3D_list.find(e=>e.id==o.name);if(!_)return;const l=MMD_SA.THREEX._object3d_list_.find(e=>e.uuid==_._object3d_uuid);if(l._rot_aligned_&&l.parent_bone.name==r+"手首"){e=l._rot_aligned_}else{e=l._mesh.quaternion.clone()}if(o.offset){if(o.offset=="parent_bone"){const d=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.set(-l.parent_bone.rotation.x,-l.parent_bone.rotation.y,l.parent_bone.rotation.z).multiplyScalar(Math.PI/180),"YXZ").toAxisAngle();e.multiply(MMD_SA.TEMP_q.setFromAxisAngle(d[0].applyQuaternion(He.copy(Qe[r=="左"?1:-1]).conjugate()),d[1]))}else{if(o.offset.w==null){const c=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.copy(o.offset).multiplyScalar(Math.PI/180));o.offset.x=c.x;o.offset.y=c.y;o.offset.z=c.z;o.offset.w=c.w}e.multiply(MMD_SA.TEMP_q.copy(o.offset))}}}else{if(o.rotation){if(o.rotation.w==null){const c=MMD_SA.TEMP_q.setFromEuler(MMD_SA.TEMP_v3.copy(o.rotation).multiplyScalar(Math.PI/180));o.rotation.x=c.x;o.rotation.y=c.y;o.rotation.z=c.z;o.rotation.w=c.w}e=MMD_SA.TEMP_q.copy(o.rotation)}}if(!hand_f._rot_pose)hand_f._rot_pose=new THREE.Quaternion;if(e){hand_f._rot_pose.copy(e)}else{hand_f._rot_pose.set(0,0,0,1)}}if(!this._reset_disabled&&this._motion_path&&(this._motion_path!=A._path||this._motion_tracking_upper_body_only!=!!A.motion_tracking_upper_body_only)){this._motion_path=A._path;this._motion_tracking_upper_body_only=!!A.motion_tracking_upper_body_only;this.reset();se();Te.data_detected=0;Te.initial_data_detected=false;System._browser.on_animation_update.remove(t,0);System._browser.on_animation_update.add(t,0,0,-1);return}this._motion_path=A._path;this._motion_tracking_upper_body_only=!!A.motion_tracking_upper_body_only;if(Ze.enabled&&ne!=Te.data_detected){ne=Te.data_detected;Ze.timestamp_for_recording=RAF_timestamp;if(Ze.active)window.dispatchEvent(new CustomEvent("SA_motion_recorder_on_active",e))}for(const r of["左","右"]){this.arm_IK_constraint[r].enabled=false}et.copy(this.get_upper_body_rotation()).multiply(this._rot_body_camera_offset);this.upper_body_rotation_limiter(et);let D,s,k,O;if((Te.enabled||Ie.enabled)&&A.motion_tracking_upper_body_only){const m=A.motion_tracking&&A.motion_tracking.arm_as_leg;const u={"左":m&&m.enabled&&(!m.linked_side||m.linked_side=="left"),"右":m&&m.enabled&&(!m.linked_side||m.linked_side=="right")};for(const f in this._skin){this._skin[f].pos.copy(S[f].position);this._skin[f].rot.copy(S[f].quaternion)}const p=Te.hip_adjustment_weight_percent/100;let e=p&&(Te.data_detected||!Te.enabled&&Ie.data_detected);let o,n;if(e){a.call(this);const M=He.copy(s);const h=A.motion_tracking?.ML_models?.pose||MMD_SA_options.user_camera.ML_models.pose;if(h.upper_rotation_offset){const y=h.upper_rotation_offset*Math.PI/180;M.premultiply(MMD_SA.TEMP_q.set(0,Math.sin(y/2),0,Math.cos(y/2)))}M.conjugate();const g=A.motion_tracking?.hip_adjustment?.rotation_weight;o=(new THREE.Quaternion).copy(M).slerp(Oe.set(0,0,0,1),1-(typeof g=="number"?g:.5)*p);let t=Te.hip_adjustment_smoothing_percent/100;if(t)t=.1+(1-t)*(1-t)*.9;if(t){te.filters[0].filter.minCutOff=t;o.fromArray(te.filter(o.toArray()))}this.remove("skin","下半身");this.add("skin","下半身",{no_blending:true,rot:o});if(this.skin["センター"]){let e=A.motion_tracking?.hip_adjustment?.displacement_weight;if(e==null)e=.25;const b=ze;const v=Ce;if(typeof e=="number"){if(e){e*=p;b.set(0,MMD_SA_options.model_para_obj.left_leg_length/3*e,0);v.set(-1,1,-1)}}else{b.copy(e.axis||MMD_SA.TEMP_v3.set(0,e.weight,0)).multiplyScalar(MMD_SA_options.model_para_obj.left_leg_length/3*p);v.copy(e.scale)}v.x*=Te.hip_adjustment_scale_x_percent/100;v.y*=Te.hip_adjustment_scale_y_percent/100;v.z*=Te.hip_adjustment_scale_z_percent/100;const E=Te.hip_adjustment_adjust_y_axis_percent/100;if(E&&!e.axis){const x=Math.PI/4*E;const U=b.y;b.y=U*Math.cos(x);b.z=U*Math.sin(x)}if(e){axis_default=Be.copy(b);M.multiply(MMD_SA.TEMP_q.set(0,0,0,1).slerp(D["首"],Te.hip_adjustment_head_weight_percent/100));b.applyQuaternion(M);b.sub(axis_default).multiply(v);if(t){ie.filters[0].filter.minCutOff=t;b.fromArray(ie.filter(b.toArray()))}this.skin["センター"][0].pos=(this.skin["センター"][0].pos||new THREE.Vector3).copy(b);this.skin["センター"][0]._hip_adjustment_offset=(this.skin["センター"][0]._hip_adjustment_offset||new THREE.Vector3).copy(b);this.skin["センター"][1].pos=this.skin["センター"][0].pos;n=this.skin["センター"][0].pos}}}for(const r of["左","右"]){const P=r=="左"?"left":"right";k=A.motion_tracking&&A.motion_tracking.arm_default_stickiness&&(A.motion_tracking.arm_default_stickiness[P]||A.motion_tracking.arm_default_stickiness);O=k&&k.default_rotation_weight;let i=A.motion_tracking?.hip_adjustment?.[P]?A.motion_tracking.hip_adjustment[P].feet_fixed_weight:A.motion_tracking?.hip_adjustment?.feet_fixed_weight;if(typeof i!="number")i=1;if(i<1||(e||u[r])&&!A.has_leg_IK){const f=r+"足IK";let e,t;if(o){e=He.copy(S["下半身"].quaternion);S["下半身"].quaternion.multiply(o)}if(n){t=ze.copy(S["センター"].position);S["センター"].position.add(n)}const K=A.has_leg_IK?null:MMD_SA.get_bone_position(w,r+"足","全ての親");const I=i<1?MMD_SA.get_bone_position(w,r+"足首","全ての親"):Ce;if(e)S["下半身"].quaternion.copy(e);if(n)S["センター"].position.copy(t);const R=A.has_leg_IK||i>0?MMD_SA.get_bone_position(w,r+"足首","全ての親"):I;const G=Pe.x_flipped?-1:1;if(A.has_leg_IK){const T=ze.copy(R).sub(I.lerp(R,i));T.x*=G;T.y*=-1;T.z*=-1;if(!this._skin[f])this._skin[f]={pos:new THREE.Vector3,rot:new THREE.Quaternion};this._skin[f].pos.add(T);S[f].position.add(T)}else{const X=ze.fromArray(S[r+"足"].pmxBone.origin);const W=X.sub(K).negate();const T=K.sub(I.lerp(R,i));T.x*=G;T.y*=-1;T.z*=-1;T.add(MMD_SA_options.model_para_obj.leg_IK_offset[r]);T.add(W);if(!this._skin[f])this._skin[f]={pos:new THREE.Vector3,rot:new THREE.Quaternion};this._skin[f].pos.copy(T);if(!u[r]){Te.enable_IK(f,true);if(!this.skin[f])this.add("skin",f,{absolute:true,is_dummy:true,pos:true,priority:999})}S[f].position.copy(T);if(Te.data_detected)S[r+"ひざ"].quaternion.set(0,0,0,1)}S[f].position.y+=this._skin[f]._offset_y_||0}if(u[r]){a.call(this);const T=z.call(this,r);S[r+"腕IK"].position.copy(T);Te.enable_IK(r+"腕IK",true)}else{const f=r+"腕IK";let e;const Q=this.skin[r+"手首"];if(Q){a.call(this);if(!Te.IK_disabled_check(f)){e=z.call(this,r)}else{if(this._skin[r+"腕"])this._skin[r+"腕"].rot.premultiply(s);if(this._skin[r+"手首"])this._skin[r+"手首"].rot.premultiply(MMD_SA.TEMP_q.copy(s).conjugate())}}if(e)this._skin[f].pos.copy(e)}if(Z[r].enabled){const V=S[r+"足IK"];const j=Z[r];j.target.copy(V.position);const L=V.pmxBone.IK;j.effector.copy(w.bones[L.effector].quaternion);for(let e=0;e{e.detail.result.links=j;e.detail.result.links_result=$[r]},{once:true});window.addEventListener("SA_camera_poseNet_process_bones_onended",e=>{const t=J[r];t.parent.copy(MMD_SA.get_bone_rotation_parent(w,r+"足","全ての親"));t.effector.copy(w.bones[L.effector].quaternion);for(let e=0;e{const t=e.detail.model;const i=t.mesh.bones_by_name;let o=h.upper_rotation_offset*Math.PI/180;const n=MMD_SA.TEMP_q.set(0,Math.sin(o/2*-.5),0,Math.cos(o/2*-.5));i["上半身"].quaternion.premultiply(n);i["上半身2"].quaternion.premultiply(n);n.set(0,Math.sin(o/2),0,Math.cos(o/2));i["全ての親"].quaternion.premultiply(n);if(Ze.active){Ze.set_boneKey("上半身",null,i["上半身"].quaternion,false);Ze.set_boneKey("上半身2",null,i["上半身2"].quaternion,false);Ze.set_boneKey("全ての親",null,i["全ての親"].quaternion,false)}},{once:true})}if(Ze.active){window.addEventListener("SA_camera_poseNet_process_bones_onended",e=>{const t=e.detail.model;const a=t.mesh.bones_by_name;for(const n of["左","右"]){Ze.set_boneKey(n+"足",null,a[n+"足"].quaternion,false);Ze.set_boneKey(n+"ひざ",null,a[n+"ひざ"].quaternion,false);Ze.set_boneKey(n+"足首",null,a[n+"足首"].quaternion,false);if(a[n+"足先EX"])Ze.set_boneKey(n+"足先EX",null,a[n+"足先EX"].quaternion,false);for(const e of[n+"肩",n+"腕",n+"ひじ",n+"手首"]){if(a[e])Ze.set_boneKey(e,null,a[e].quaternion,false)}Ke.forEach((i,e)=>{let o=e==0?0:1;for(let t=o;t!n[e][0].after_IK).sort((e,t)=>{let i=n[e][0].priority||0;let o=n[t][0].priority||0;return i-o});q.forEach(e=>{let t=S[e];if(!t&&!/_DUMMY_/.test(e))return;var i=n[e][0].info[1];if((!i||/pose/.test(i))&&!A.motion_tracking_enabled)return;oe.call(this,w,e)})}function n(e){var t=e.detail.model;var o=t.mesh;var n=MMD_SA.motion[t.skin._motion_index].para_SA;if(n.motion_tracking_upper_body_only){for(const s of["左","右"]){const r=n.motion_tracking?.arm_tracking?.elbow_lock?.[s=="左"?"left":"right"];if(r){const _=r._elbow_y!=null?r._elbow_y:null;if(_!=null)X(r,o,s)}}}var a=this.skin;var i=Object.keys(a).filter(e=>a[e][0].after_IK).sort((e,t)=>{let i=a[e][0].priority||0;let o=a[t][0].priority||0;return i-o});i.forEach(e=>{let t=o.bones_by_name[e];if(!t&&!/_DUMMY_/.test(e))return;var i=a[e][0].info[1];if((!i||/pose/.test(i))&&!n.motion_tracking_enabled)return;oe.call(this,o,e)});window.dispatchEvent(new CustomEvent("SA_camera_poseNet_process_bones_onended",e))}function a(e){if(Te.enabled&&!Te.data_detected_stable)return;var _=e.detail.model;var l=_.mesh;var d=_.morph.targets;_.pmx.morphs.forEach(function(e){if(e.panel!=3)return;var t=e.name;if(!_.pmx.morphs_weight_by_name[t])return;var i=_.morph.target_index_by_name[t];if(i==null)return;var o=d[i];var n=o.keys[0];if(n.morph_type==1){l.morphTargetInfluences[i]=0}else{let e={name:t,weight:0,morph_type:n.morph_type,morph_index:n.morph_index};_.morph.onupdate(e,e,0,i)}});var c=MMD_SA_options.model_para_obj.facemesh_morph;var m=this.morph;var u={};var n=0;Object.keys(m).forEach(function(e){let t=m[e];if(t.disabled)return;t[0].t_delta+=RAF_timestamp_delta;let i=Math.max(Math.min(t[0].t_delta/t[0].t_delta_frame,1),0);let o=t[0].weight*i+t[1].weight*(1-i);u[e]=o;if(o)n++});Object.keys(u).forEach(function(t){let e=m[t];let i=u[t];if(i<0){Ze.morph_active&&Ze.set_morphKey(t,0,true);switch(t){case"にやり":t="ω";break;case"口角上げ":t="口角下げ";break;case"上":t="下";break}i=-i}if(Ze.morph_active){let e=t;if(t=="まばたきL")e="ウィンク";else if(t=="まばたきR")e="ウィンク右";Ze.set_morphKey(e,i,true)}let o=c[t];let n=o&&o.name||t;let a=_.morph.target_index_by_name[n];if(a==null)return;i*=o&&o.weight||1;let s=d[a];let r=s.keys[0];if(r.morph_type==1){l.morphTargetInfluences[a]=i}else{let e={name:n,weight:i,morph_type:r.morph_type,morph_index:r.morph_index};_.morph.onupdate(e,e,0,a)}})}function m(e,t,i){i.name=t;i.info=e.split("|");var o=i.info[0];var n=this[o][t];if(i.is_dummy){if(n&&n[0].is_dummy)return;i.no_blending=true;i.onProcessPosition=i.onProcessRotation=s;if(i.pos)i.pos=r;if(i.rot)i.rot=_}const a=t.indexOf("指")!=-1||t.indexOf("手首")!=-1;i.timestamp=RAF_timestamp;i.t_delta=0;i.t_delta_frame=je.enabled&&a&&this.t_delta_hands||this.t_delta||0;i.t_delta_frame=Math.max(Math.min(i.t_delta_frame,200),16.6667);if(n){if(RAF_timestamp==n[0].timestamp){n[0]=Object.assign(n[0],i)}else{if(!i.no_blending&&!Pe.video.paused){let e=Te.use_3D_pose||i.info[1]=="facemesh"?.5+Math.max(Math.min((Math.max(i.t_delta_frame,RAF_timestamp-n[0].timestamp)-50)/150,1),0)*.5:1;if(i.pos&&n[0].pos){i.pos.lerp(n[0].pos,1-e)}if(i.rot&&n[0].rot){i.rot.slerp(n[0].rot,1-e)}if(i.weight!=null&&n[0].weight!=null){i.weight=i.weight*e+n[0].weight*(1-e)}}this[o][t]=[i,n[0]]}i._blend_default_motion=n[1]._blend_default_motion;i._idle_blend_default_motion=n[1]._idle_blend_default_motion}else{this[o][t]=[i,i]}if(Ze.speed&&Pe.is_local_video&&Ze.speed<1)i.no_blending=true}function u(e,t){delete this[e][t]}function p(){this.skin={};this.morph={};this._skin={};this._morph={};this.reset_to_default_motion_once=true;this._motion_path=""}function ae(){window.addEventListener("SA_MMD_model"+this.model_num+"_process_morphs",this.process_morphs);window.addEventListener("SA_MMD_model"+this.model_num+"_process_bones_before_IK",this.process_bones);window.addEventListener("SA_MMD_model"+this.model_num+"_process_bones_after_IK",this.process_bones_after_IK)}function se(){window.removeEventListener("SA_MMD_model"+this.model_num+"_process_morphs",this.process_morphs);window.removeEventListener("SA_MMD_model"+this.model_num+"_process_bones_before_IK",this.process_bones);window.removeEventListener("SA_MMD_model"+this.model_num+"_process_bones_after_IK",this.process_bones_after_IK)}var h=function(e){this.model_num=e;this.reset();this._body_motion_rot=[{},{}];this._rot_body_motion=new THREE.Quaternion;this._rot_body_camera=new THREE.Quaternion;this._rot_body_camera_offset=new THREE.Quaternion;this._rot_head_camera=new THREE.Quaternion;this._rot_head_camera_offset=new THREE.Quaternion;this._rot_body_offset=new THREE.Quaternion;this._rot_camera=new THREE.Quaternion;this._rot_camera_angle=0;this.process_bones=o.bind(this);this.process_bones_after_IK=n.bind(this);this.process_morphs=a.bind(this)};h.prototype.set_upper_body_rotation=function(e,t){if(!Pe.ML_enabled||this.model_num!=e)return;const i=THREE.MMD.getModels()[this.model_num].mesh.bones_by_name;for(const o of["センター","上半身","上半身2","首","頭"]){if(!i[o])continue;let e=this._body_motion_rot[t][o];if(!e)e=this._body_motion_rot[t][o]=new THREE.Quaternion;e.copy(i[o].quaternion)}};h.prototype.get_upper_body_rotation=function(){const e=THREE.MMD.getModels()[this.model_num].mesh.bones_by_name;this._rot_camera.setFromEuler(MMD_SA.TEMP_v3.set(MMD_SA._rx_last,MMD_SA._ry_last,0));this._rot_camera_angle=this._rot_camera.toAxisAngle()[1];const t=He.set(0,0,0,1);const i=Oe.set(0,0,0,1);for(const n of["センター","上半身","上半身2"]){t.multiply(this._body_motion_rot[0][n]||e[n].quaternion);i.multiply(this._body_motion_rot[1][n]||e[n].quaternion)}this._rot_body_camera.copy(t).conjugate().multiply(i);this._rot_body_camera_offset.copy(this._rot_body_camera).conjugate().multiply(this._rot_camera);this._rot_body_motion.copy(t);const o=S.copy(t).conjugate();return o};h.prototype.upper_body_rotation_limiter=function(t,i=Math.PI/3){var o=t.toAxisAngle();var n=o[1];this._rot_body_offset.set(0,0,0,1);if(Math.abs(n)>i){let e;if(Math.abs(n){Q.prototype._q1=new THREE.Quaternion;Q.prototype._q2=new THREE.Quaternion;Ye=new Q(0)});var Ze=function(){function _(e,t,i,o){this.name=e;this.pos=t&&t.toArray()||[0,0,0];this.rot=i&&i.toArray()||[0,0,0,1];this.time=o;d[e].index=l.boneKeys.length}function s(e,t,i){this.name=e;this.weight=t;this.time=i;r[e].index=l.morphKeys.length}var l;var d,r;var c=0;var o=0;var m=0;var u=0;var n;var a=0;var i=0;const p=2;return{timestamp_for_recording:0,get enabled(){return i&&!Pe.video.paused},get morph_active(){return Te.enabled?this.enabled:this.active},get active(){if(!this.enabled)return false;if(this.timestamp_for_recording&&this.timestamp_for_recording!=RAF_timestamp)return false;if(n!=x){let e=1;if(n){e=this.get_frame(x)-this.get_frame(n);if(e<0||e>30)e=1;if(e>1){const t=e-1;o+=t;for(const i in d){d[i].frame_length+=t}for(const i in r){r[i].frame_length+=t}}}c+=e;n=x;a=RAF_timestamp}if(a==RAF_timestamp){return true}return false},get_frame:function(e){var t=e.split(":");return parseInt(t[0])*30+(parseInt(t[1])-1)},get frame_count(){return c},get stats(){return[o,l.boneKeys.length,l.morphKeys.length,m,u]},get time(){return Math.floor(c/30)+":"+(c%30+1)},get speed(){return i},set speed(e){i=e;if(e)this.start(e);else this.stop()},get vmd(){return i?null:l},set vmd(e){l=null},set_boneKey:function(e,t,i,o){let n=d[e];if(n==null){n=d[e]={frame_length:1};if(c>0)l.boneKeys.push(new _(e,null,null,0))}if(o&&Ye.skin[e]&&n.timestamp==Ye.skin[e][0].timestamp){let e;if(n.frame_count==c){const a=l.boneKeys[n.index];e=(!t||a.pos)&&(!i||a.rot)}else e=true;if(e){if(n.frame_count!=c){n.frame_length++;m++}return}}if(!t&&i&&n.is_rot_identity&&i.w==1){m++;return}n.is_rot_identity=i?i.w==1:n.is_rot_identity;if(n.frame_count==c){const a=l.boneKeys[n.index];if(t)a.pos=t.toArray();if(i)a.rot=i.toArray()}else{if(n.index!=null&&e.indexOf("手")==-1&&e.indexOf("指")==-1){const a=l.boneKeys[n.index];const s=Math.round(c-a.time*30);if(s>n.frame_length||s>10){const r=new _(e,null,null,(c-1)/30);r.pos=a.pos;r.rot=a.rot;l.boneKeys.push(r);m--}}n.timestamp=Ye.skin[e]&&Ye.skin[e][0].timestamp||0;l.boneKeys.push(new _(e,t,i,c/30))}n.frame_length=1;n.frame_count=c;return true},set_morphKey:(()=>{function o(e,t,i){let o=r[e];if(o==null){o=r[e]={frame_length:1};if(c>0)l.morphKeys.push(new s(e,0,0))}if(i&&Ye.morph[e]&&o.timestamp==Ye.morph[e][0].timestamp){if(o.frame_count!=c){o.frame_length++;u++}return}t=Math.round(t*20)/20;if(t==o.weight){u++;return}o.weight=t;if(o.frame_count==c){const n=l.morphKeys[o.index];n.weight=t}else{if(o.index!=null){const n=l.morphKeys[o.index];const a=Math.round(c-n.time*30);if(ao.frame_length||a>10){l.morphKeys.push(new s(e,n.weight,(c-p)/30));u--}}o.timestamp=Ye.morph[e]&&Ye.morph[e][0].timestamp||0;l.morphKeys.push(new s(e,t,c/30))}o.frame_length=1;o.frame_count=c;return true}return function(e,t,i){if(Te.enabled){window.addEventListener("SA_motion_recorder_on_active",()=>{o.call(this,e,t,i)},{once:true})}}})(),start:function(e){i=e;if(MMD_SA.THREEX.get_model(0).use_faceBlendshapes){MMD_SA.THREEX.get_model(0)._disable_faceBlendshapes=true;for(const t of Ie.faceBlendshapes_list){Ye.remove("morph",t)}}n="";a=0;if(Pe.is_local_video){Pe.video.playbackRate=e;if(e<1)Pe.video.muted=true;Pe.video.loop=false;Pe.video.pause();MMD_SA.SpeechBubble.message(0,System._browser.translation.get("XR_Animator.UI.motion_capture.ML_on.record_motion.choose_speed.begin_recording"),5*1e3);C_media_control.style.visibility="inherit"}c=-1;o=0;m=0;u=0;d={};r={};l={boneKeys:[],morphKeys:[]}},stop:function(){i=0;MMD_SA.THREEX.get_model(0)._disable_faceBlendshapes=false;if(Pe.is_local_video){Pe.video.playbackRate=1;Pe.video.muted=false;Pe.video.loop=true;Pe.video.pause();MMD_SA.SpeechBubble.message(0,System._browser.translation.get("XR_Animator.UI.motion_capture.ML_on.record_motion.choose_speed.begin_recording.recording_stopped"),5*1e3)}else if(Pe.is_local_photo){l.boneKeys=l.boneKeys.filter(e=>e.time==0);l.morphKeys=l.morphKeys.filter(e=>e.time==0);l.boneKeys=l.boneKeys.concat(l.boneKeys.map(e=>{const t={name:e.name,pos:e.pos.slice(),rot:e.rot.slice(),time:60};return t}));l.morphKeys=l.morphKeys.concat(l.morphKeys.map(e=>{const t={name:e.name,weight:e.weight,time:60};return t}))}}}}();const f=(()=>{function r(){m=m.slice(Math.max(m.length-8,0),m.length);MMD_SA_options.Dungeon.run_event([[{message:{content:m.join("\n")+"\n("+System._browser.translation.get("XR_Animator.UI.streamer_mode.press_x_to_abort")+")",para:h,branch_list:[{key:"X",is_closing_event:true,event_id:{func:()=>{p=true;if(u)u()},ended:true}}]}}]])}function _(){if(--i==0){m.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_model_loaded"));if(u)u()}}function l(e){if(!Ie.calibrated){i++;window.addEventListener("SA_camera_facemesh_calibrating",d);m.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.face_data_calibrating")+"...");r()}_(e)}function d(e){const t=e.detail.percent;if(t>=100){window.removeEventListener("SA_camera_facemesh_calibrating",d);MMD_SA.SpeechBubble.list[1].message(0,"("+System._browser.translation.get("XR_Animator.UI.streamer_mode.calibrating_face_data")+" - 100%)",0,h);m.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.face_data_calibrated"));_()}else{MMD_SA.SpeechBubble.list[1].message(0,"("+System._browser.translation.get("XR_Animator.UI.streamer_mode.calibrating_face_data")+" - "+t+"%)\n"+System._browser.translation.get("XR_Animator.UI.streamer_mode.face_data_calibrating_message"),0,h)}}let c;let m=[];let i;let u;let p;const h={font_scale:1,font:'"Segoe UI",Roboto,Ubuntu,"SF Pro"'};const e={get running(){return c},init_mocap:function(e){function t(){if(c){if(MMD_SA_options.user_camera.streamer_mode.motion_id!=null){const e=typeof MMD_SA_options.user_camera.streamer_mode.motion_id=="number"?MMD_SA_options.user_camera.streamer_mode.motion_id+(System._browser.camera.facemesh.enabled&&!System._browser.camera.poseNet.enabled?1:0):MMD_SA_options._XRA_pose_list?.[2].findIndex(e=>e.name==MMD_SA_options.user_camera.streamer_mode.motion_id);if(typeof e=="number"&&e>=0)MMD_SA_options.Dungeon_options.item_base.pose?._change_motion_(e,true);return new Promise(t=>{window.addEventListener("SA_MMD_model0_onmotionchange",e=>{m.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.motion_changed")+" ("+e.detail.motion_new.filename+")");t()},{once:true})})}}if(MMD_SA.WebXR.user_camera.poseNet.enabled){if(!MMD_SA.MMD.motionManager.para_SA.motion_tracking_enabled)MMD_SA_options.Dungeon_options.item_base.pose?._change_motion_(0,true)}}switch(e){case"Face":MMD_SA.WebXR.user_camera.poseNet.use_holistic=false;MMD_SA.WebXR.user_camera.facemesh.enabled=true;MMD_SA.WebXR.user_camera.poseNet.enabled=false;MMD_SA.WebXR.user_camera.handpose.enabled=false;DEBUG_show("Facemesh AI:ON",2);i=1;break;case"Body":MMD_SA.WebXR.user_camera.poseNet.use_holistic=false;MMD_SA.WebXR.user_camera.poseNet.enabled=true;MMD_SA.WebXR.user_camera.handpose.enabled=false;MMD_SA.WebXR.user_camera.facemesh.enabled=false;DEBUG_show("Pose AI:ON",3);i=1;break;case"Body+Hands":MMD_SA.WebXR.user_camera.poseNet.use_holistic=false;MMD_SA.WebXR.user_camera.poseNet.enabled=true;MMD_SA.WebXR.user_camera.handpose.enabled=true;MMD_SA.WebXR.user_camera.facemesh.enabled=false;DEBUG_show("Pose/Hands AI:ON",3);i=1;break;case"Face+Body":MMD_SA.WebXR.user_camera.poseNet.use_holistic=false;MMD_SA.WebXR.user_camera.facemesh.enabled=true;MMD_SA.WebXR.user_camera.poseNet.enabled=true;MMD_SA.WebXR.user_camera.handpose.enabled=false;DEBUG_show("Facemesh/Pose AI:ON",3);i=2;break;case"Full Body":MMD_SA.WebXR.user_camera.poseNet.use_holistic=false;MMD_SA.WebXR.user_camera.facemesh.enabled=true;MMD_SA.WebXR.user_camera.poseNet.enabled=true;MMD_SA.WebXR.user_camera.handpose.enabled=true;DEBUG_show("Facemesh/Pose/Hands AI:ON",4);i=2;break;case"Full Body Holistic":MMD_SA.WebXR.user_camera.poseNet.use_holistic=true;MMD_SA.WebXR.user_camera.facemesh.enabled=true;MMD_SA.WebXR.user_camera.poseNet.enabled=true;MMD_SA.WebXR.user_camera.handpose.enabled=true;DEBUG_show("Facemesh/Pose/Hands AI:ON",4);i=2;break;default:return}MMD_SA_options.user_camera.streamer_mode.mocap_type=e;return t()},start:async function(){function e(){m.length=0;u=null;p=false;c=false}function t(){e();MMD_SA_options.Dungeon.event_mode=false}if(MMD_SA.WebXR.user_camera.bodyPix.enabled){DEBUG_show("(You can't enable motion capture and Selfie Segmentation AI at the same time.)",5);return}if(c){DEBUG_show("(Streamer mode running)");return}e();c=true;MMD_SA_options.Dungeon.event_mode=true;const i=Pe.stream&&MMD_SA_options.user_camera.streamer_mode.camera_preference.label;MMD_SA.WebXR.user_camera.video_flipped=!!MMD_SA_options.user_camera.streamer_mode.camera_preference.video_flipped;const o=await Pe.start();if(!o){MMD_SA.SpeechBubble.message(0,System._browser.translation.get("XR_Animator.UI.streamer_mode.webcam_not_accessible"),5*1e3);t();return}if(i!=MMD_SA_options.user_camera.streamer_mode.camera_preference.label)m.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.webcam_on")+" ("+MMD_SA_options.user_camera.streamer_mode.camera_preference.label+")");let n;if(webkit_electron_mode&&MMD_SA.THREEX.enabled){n=!!MMD_SA_options.user_camera.streamer_mode.VMC_sender_enabled;if(n){if(!MMD_SA.OSC.VMC.sender_enabled){MMD_SA_options.user_camera.streamer_mode.VMC_sender_enabled=MMD_SA.OSC.VMC.sender_enabled=true;m.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.VMC_protocol_on"));MMD_SA.OSC.VMC.send_camera_data=!!MMD_SA_options.user_camera.streamer_mode.VMC_send_camera_data;if(MMD_SA.OSC.VMC.send_camera_data)m.push("✅- "+System._browser.translation.get("XR_Animator.UI.streamer_mode.VMC_protocol_on.send_camera_data"));System._browser.update_tray()}}}if(!Pe.ML_enabled){const a=MMD_SA_options.user_camera.streamer_mode.mocap_type||(is_mobile?System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_initializing.face","en"):System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_initializing.full_body","en"));const s=MMD_SA_options.user_camera.streamer_mode.mocap_type||(is_mobile?System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_initializing.face"):System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_initializing.full_body"));m.push("✅"+System._browser.translation.get("XR_Animator.UI.streamer_mode.mocap_initializing")+" ("+s+")...");r();await new Promise(e=>{u=e;if(/Face|Full Body/.test(a))window.addEventListener("SA_camera_facemesh_update",l,{once:true});if(/Body/.test(a))window.addEventListener("SA_camera_poseNet_update",_,{once:true});const t=f.init_mocap(a);if(t)t.then(r)})}if(p){window.removeEventListener("SA_camera_poseNet_update",_);window.removeEventListener("SA_camera_facemesh_update",l);window.removeEventListener("SA_camera_facemesh_calibrating",d);MMD_SA.SpeechBubble.list.forEach(e=>{e.hide()});t();return}u=null;MMD_SA.SpeechBubble.hide();if(n){if(m.length){await new Promise(e=>{MMD_SA_options.Dungeon.run_event([[{message:{content:System._browser.translation.get("XR_Animator.UI.streamer_mode.finish_VMC"),para:h,index:1,branch_list:[{key:1,event_id:{func:()=>{MMD_SA.hide_3D_avatar=true;System._browser.update_tray();e()},ended:true}},{key:"X",is_closing_event:true,event_id:{func:()=>{e()},ended:true}}]}}]])})}}else{if(m.length){await new Promise(e=>{MMD_SA_options.Dungeon.run_event([[{message:{content:System._browser.translation.get("XR_Animator.UI.streamer_mode.finish"),para:h,index:1,branch_list:[{key:1,event_id:{func:()=>{System._browser.overlay_mode=1;e()},ended:true}},{key:"X",is_closing_event:true,event_id:{func:()=>{e()},ended:true}}]}}]])})}}if(!m.length)MMD_SA.SpeechBubble.message(0,"XR Animator is ready!",3e3);if(Pe.initialized&&Pe.visible)Pe.hide();t()}};return e})();var mt=[{},{}];var V=t.get("camera_hidden");var N;Pe={initialized:false,get ML_enabled(){return h},get ML_busy(){return Ie.busy||Te.busy},get ML_fps(){return 1e3/(Te.enabled&&Te._t||Ie.enabled&&Ie._t||1e3)},get ML_warmed_up(){var e=mt[Te.use_holistic?1:0];var t=!Ie.enabled||e.facemesh;var i=!Te.enabled||e.poseNet;var o=!je.enabled||e.handpose;return t&&i&&o},get target_devicePixelRatio(){return u||window.devicePixelRatio},set target_devicePixelRatio(e){u=e==window.devicePixelRatio?0:e},get double_flip_mode(){return i&&!Pe.mirror_3D},set double_flip_mode(e){i=e},get video_flipped(){return!h?_:!!_^!!Pe.double_flip_mode},set video_flipped(e){_=e;this.reset_video_canvas()},get display_flipped(){return Pe.mirror_3D?false:_!=Pe.video_flipped},get mirror_3D(){return!h||!MMD_SA_options.user_camera.mirror_3D?false:MMD_SA_options.user_camera.mirror_3D==1?Pe.visible:true},get x_flipped(){return Pe.double_flip_mode||Pe.mirror_3D},get hidden_enforced(){return V||(MMD_SA_options.user_camera.display.video.hidden==null?!!this.stream:MMD_SA_options.user_camera.display.video.hidden)||System._browser.overlay_mode>0||this.stream&&MMD_SA_options.user_camera.display.video.hidden_on_webcam},get display_floating(){return MMD_SA_options.user_camera.display.floating||N},set display_floating(e){N=e;if(this.video_host)this.video_host.style.zIndex=this.display_floating?2:0},get video_timestamp(){return Pe.video.currentTime==null?performance.now()/2:Pe.video.currentTime*1e3},get video_frame_id(){const e=this.video_timestamp/1e3;const t=Math.floor(e);return t+":"+Math.floor((e-t)*30+1)},get is_local_media(){return this.local_src&&!this.stream},get is_local_video(){return this.is_local_media&&this.video.currentTime!=null},get is_local_photo(){return this.is_local_media&&this.video.currentTime==null},DEBUG_show:(()=>{let o="";let n="";let a=0;let s=[];window.addEventListener("MMDStarted",()=>{System._browser.on_animation_update.add(()=>{s=s.filter(e=>RAF_timestampe.msg).join("\n")+"\n":"";Fe=n+o},0,0,-1)});return function(e,t,i){if(!Pe.ML_enabled||!Te.data_detected&&!Ie.data_detected){DEBUG_show(e,t,i);return}if(t){s.push({msg:e,duration:t*1e3,timestamp:RAF_timestamp});return}if(a!=RAF_timestamp){a=RAF_timestamp;o=""}o=(o?o+"\n":o)+e;Fe=n+o}})(),motion_recorder:Ze,tilt_adjustment:{enabled:false,angle:0,pose_weight:.5},camera_list:null,deviceId:null,start:async function(i){async function n(){try{stream=await navigator.mediaDevices.getUserMedia(a);return stream}catch(e){console.error(e)}}var e=MMD_SA_options.WebXR&&MMD_SA_options.WebXR.AR;MMD_SA.reset_camera();this._camera_reset=MMD_SA._trackball_camera.object.clone();if(this.initialized&&!f.running){if(this.visible){this.hide();DEBUG_show("User camera:HIDDEN",2);return}}var a={video:this.set_constraints()};try{if(i){this.init_stream(i)}else{if(is_mobile){a.video.facingMode="user"}if(MMD_SA_options.Dungeon){MMD_SA_options.Dungeon.run_event([[{message:{get content(){return System._browser.translation.get("XR_Animator.UI.webcam_media.finding_camera")}}},{goto_branch:0}]])}let t;if(is_mobile){if(!this.stream)t=await n();if(MMD_SA_options.Dungeon)MMD_SA_options.Dungeon.run_event(null,0,2);if(!this.stream&&!t){DEBUG_show("(Camera not accessible)",3);return}}else{let o=this.camera_list;if(!o){try{o=await navigator.mediaDevices.enumerateDevices();o=o.filter(e=>e.kind=="videoinput");const r=MMD_SA_options.user_camera.streamer_mode.camera_preference&&{label:{test:e=>e.indexOf(MMD_SA_options.user_camera.streamer_mode.camera_preference.label)!=-1}}||MMD_SA_options.user_camera.preference;o.sort((e,t)=>r?.label?.test(e.label)&&-1||r?.label?.test(t.label)&&1||/warudo/i.test(e.label)&&1||/warudo/i.test(t.label)&&-1||0);this.camera_list=o=o.slice(0,7);if(f.running&&!o.length)throw new Error("(No camera detected)")}catch(s){console.error(s);if(MMD_SA_options.Dungeon)MMD_SA_options.Dungeon.run_event(null,0,2);DEBUG_show("(No camera detected)",3);return}}let e;if(MMD_SA_options.Dungeon){await new Promise(t=>{MMD_SA_options.Dungeon.run_event([[{message:{get content(){return(o.length?System._browser.translation.get("XR_Animator.UI.webcam_media.choose_an_input")+o.map((e,t)=>"\n"+(t+1)+". "+e.label.substring(0,25)).join(""):System._browser.translation.get("XR_Animator.UI.webcam_media.no_camera"))+"\n"+(o.length+1)+". "+System._browser.translation.get("XR_Animator.UI.webcam_media.local_media_file")+"\n"+(o.length+2)+". "+System._browser.translation.get("Misc.cancel")},para:{row_max:11,no_word_break:true},bubble_index:3,branch_list:o.map((e,t)=>{return{key:t+1,branch_index:t+1}}).concat([{key:Math.min(o.length+1,8),branch_index:Math.min(o.length+1,8)},{key:Math.min(o.length+2,9),is_closing_event:true,branch_index:Math.min(o.length+2,9)}])}}]].concat(o.map(e=>[{func:()=>{const i=e.label;MMD_SA_options.user_camera.streamer_mode.camera_preference=Object.assign(MMD_SA_options.user_camera.streamer_mode.camera_preference||{},{label:i,video_flipped:!!_});o.sort((e,t)=>e.label==i&&-1||t.label==i&&1||0);a.video.deviceId=e.deviceId;t()},ended:true}]).concat([[{func:()=>{if(Pe.local_src){i=Pe.local_src;t();return true}else{DEBUG_show("(No local media file found)",3);MMD_SA_options.Dungeon.run_event(null,0,0)}}}],[{func:()=>{e=true;t()},ended:true}]])));if(f.running&&MMD_SA_options.user_camera.streamer_mode.camera_preference?.label){MMD_SA_options.Dungeon.run_event(null,1,0)}})}if(e){DEBUG_show("(Canceled)",2);return}if(!i&&a.video.deviceId!=this.deviceId){t=await n();if(!t){DEBUG_show("(Camera not accessible)",3);return}}}if(i){Pe.init_stream(i)}else if(t){Pe.init_stream(t);this.deviceId=a.video.deviceId}if(e&&e.dom_overlay)e.dom_overlay.use_dummy_webgl=true;DEBUG_show("(User camera:ON)",2)}if(!this.visible){this.show();DEBUG_show("User camera:VISIBLE",2)}return f.running}catch(s){if(MMD_SA_options.Dungeon&&MMD_SA_options.Dungeon.event_mode)MMD_SA_options.Dungeon.run_event({ended:true});Pe.init_stream();console.error(s);DEBUG_show("(ERROR: Camera unavailable, using fallback video instead)",3)}},init_stream:function(e){if(!this.initialized){this.video=this._video=document.createElement("video");this.video.autoplay=true;let e;this.video_host=document.createElement("div");e=this.video_host.style;e.position="absolute";e.left="0px";e.top="0px";e.zIndex=this.display_floating?2:0;e.visibility=System._browser.overlay_mode?"hidden":"inherit";e.display=System._browser.overlay_mode?"none":"block";SL_Host.appendChild(this.video_host);this.video_canvas=document.createElement("canvas");e=this.video_canvas.style;e.position="absolute";e.left="0px";e.top="0px";e.zIndex=0;e.visibility="hidden";this.video_host.appendChild(this.video_canvas);this.video_canvas_bodyPix=document.createElement("canvas");e=this.video_canvas_bodyPix.style;e.position="absolute";e.left="0px";e.top="0px";e.zIndex=0;e.visibility="hidden";this.video_host.appendChild(this.video_canvas_bodyPix);this.video_canvas_face_detection=document.createElement("canvas");e=this.video_canvas_face_detection.style;e.position="absolute";e.left="0px";e.top="0px";e.zIndex=0;e.visibility="hidden";this.video_host.appendChild(this.video_canvas_face_detection);this.video_canvas_facemesh=document.createElement("canvas");e=this.video_canvas_facemesh.style;e.position="absolute";e.left="0px";e.top="0px";e.zIndex=0;e.visibility="hidden";this.video_host.appendChild(this.video_canvas_facemesh);is_mobile&&window.addEventListener("resize",function(){Pe.video_track?.applyConstraints(Pe.set_constraints()).then(function(){DEBUG_show("(camera size updated)",2)})["catch"](function(e){DEBUG_show("ERROR:camera size failed to update")})});navigator.mediaDevices.addEventListener("devicechange",()=>{console.log("mediaDevices: new device detected");this.camera_list=null})}this.initialized=true;this.show();if(this.stream){this.stream.getTracks().forEach(e=>{e.stop()});this.video.srcObject=this.stream=this.video_track=this.deviceId=null;console.log("(Previous stream stopped)")}if(!e||typeof e=="string"){p(e)}else{this.stream=e;this.video_id=e.id;this.video_track=e.getVideoTracks()[0];this.video=this._video;this.video.srcObject=e;console.log("(New stream started)");setTimeout(function(){let e=Pe.video_track.getCapabilities?.();if(!e)return;System._browser.console.log(Object.entries(e).map(e=>e[0]+":"+JSON.stringify(e[1])).join("\n"));let t=Pe.video_track.getSettings();const i=Object.entries(t).map(e=>e[0]+":"+JSON.stringify(e[1])).join("\n");console.log("MediaTrackCapabilities",i);if(is_mobile)System._browser.console.log()},2e3)}if(Ie.enabled)Ie.reset_calibration()},get use_armIK(){return Te.enabled||je.enabled||Ie.enabled},bodyPix:function(){var o;var i=false;c={get enabled(){return i},set enabled(e){if(i==!!e)return;i=!!e;const t=MMD_SA.THREEX.SL;if(i){MMD_SA._renderer.devicePixelRatio=1;MMD_SA._renderer.__resize(EV_width,EV_height);t.style.visibility="hidden"}else{MMD_SA._renderer.devicePixelRatio=window.devicePixelRatio;MMD_SA._renderer.__resize(EV_width,EV_height);t.style.visibility="inherit";Pe.video_canvas_bodyPix.style.visibility="hidden"}},busy:0,mask:null,allPoses:null,use_bodySegmentation:true,load:async function(e){this.enabled=true;if(o)return;if(!this.mask){this.mask=document.createElement("canvas");d.load_face_cover()}if(this.use_bodySegmentation){const t=bodySegmentation.SupportedModels.MediaPipeSelfieSegmentation;const i={runtime:"mediapipe",solutionPath:"https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation"};o=await bodySegmentation.createSegmenter(t,i)}else{o=await bodyPix.load(e||(1||is_mobile)?{architecture:"MobileNetV1",outputStride:16,multiplier:.5,quantBytes:2}:{architecture:"ResNet50",outputStride:32,quantBytes:2})}console.log("bodyPix loaded")},segmentPerson:async function(e,t){await this.load();if(this.use_bodySegmentation){return await o.segmentPeople(e)}else{return await o.segmentPerson(e,t||{flipHorizontal:false,internalResolution:"medium",segmentationThreshold:.7})}},toMask:async function(e,t,i){const o=await this.segmentPerson(e,t);i=i||{foregroundColor:{r:0,g:0,b:0,a:255},backgroundColor:{r:0,g:0,b:0,a:0}};if(this.use_bodySegmentation){return await bodySegmentation.toBinaryMask(o,i.foregroundColor,i.backgroundColor)}else{this.allPoses=o.allPoses;return bodyPix.toMask(o,i.foregroundColor,i.backgroundColor)}},update_frame:async function(e=Pe.video_canvas,t,i,o){const n=MMD_SA.THREEX.SL;if(System._browser.snapshot.check_bodyPix()){Pe.video_canvas.style.visibility="inherit";Pe.video_canvas_bodyPix.style.visibility="hidden";n.style.visibility="inherit";return}if(this.busy)return;this.busy=RAF_timestamp;const a=await this.toMask(e,t,i);this.busy=0;if(!this.enabled)return;if(this.mask.width!=a.width||this.mask.height!=a.height){this.mask.width=a.width;this.mask.height=a.height}this.mask.getContext("2d").putImageData(a,0,0);const s=n.width;const r=n.height;if(Pe.video_canvas_bodyPix.width!=s||Pe.video_canvas_bodyPix.height!=r){Pe.video_canvas_bodyPix.width=s;Pe.video_canvas_bodyPix.height=r}const _=s/r/(e.width/e.height);const l=Math.round(s*Math.min(1/_,1));const d=Math.round(r*Math.min(_,1));const c=(s-l)/2;const m=(r-d)/2;const u=Pe.video_canvas_bodyPix.getContext("2d");u.globalCompositeOperation="copy";u.filter="blur("+Math.ceil(3/window.devicePixelRatio)+"px)";u.drawImage(this.mask,0,0,a.width,a.height,c,m,l,d);u.globalCompositeOperation="source-out";u.filter="none";u.save();if(Pe.mirror_3D){u.translate(s,0);u.scale(-1,1)}u.drawImage(n,0,0);u.restore();u.globalCompositeOperation="destination-over";u.drawImage(e,0,0,e.width,e.height,c,m,l,d);Pe.video_canvas_bodyPix.style.visibility="inherit";n.style.visibility="hidden";this.update_frame_for_face_detection();System._browser.snapshot.check_bodyPix()},update_frame_for_face_detection:function(){let e=d.face_cover;if(!d.enabled||!e.complete)return;Pe.video_canvas_face_detection.style.visibility="hidden";let t=e.width;let s=e.height;let r=[];this.allPoses.forEach(function(e){let t=e.keypoints;let i=t.find(e=>e.part=="nose");if(!i)return;let o=t.find(e=>e.part=="leftEye");let n=t.find(e=>e.part=="rightEye");let a;if(o&&n){let e=o.position.x-n.position.x;let t=o.position.y-n.position.y;a=Math.sqrt(e*e+t*t)*4}else{a=s}r.push([i.position.y,i.position.x,Math.max(a,s/2),100])});this.allPoses=undefined;d.update_frame_local(Pe.video_canvas_bodyPix,r)}};return c}(),face_detection:function(){var t=false;function i(){d.initialized=true;if(!self.OffscreenCanvas)d.load_face_cover();r=new Worker("js/pico.worker.js");r.onmessage=function(e){var t=typeof e.data=="string"&&e.data.charAt(0)==="{"?JSON.parse(e.data):e.data;if(typeof t==="string"){DEBUG_show(t,2);d.worker_initialized=true}else{Pe._needs_RAF=true;if(t._t)DEBUG_show(t._t);d.dets=t.dets;d.busy=0;Pe.video_canvas_face_detection.style.left=Pe.video_canvas.style.left;Pe.video_canvas_face_detection.style.top=Pe.video_canvas.style.top;if(!self.OffscreenCanvas){System._browser.on_animation_update.add(function(){d.update_frame_local(null,d.dets)},0,0)}}d.update_frame()}}d={initialized:false,worker_initialized:false,get enabled(){return t},set enabled(e){if(t==!!e)return;t=!!e;if(t){this.dets=null;if(!this.initialized)i()}else{if(Pe.initialized)Pe.video_canvas_face_detection.style.visibility="hidden"}},load_face_cover:function(){if(!this.face_cover){this.face_cover=new Image;this.face_cover.src="images/laughing_man_134x120.png"}},dets:null,camera_video_timestamp:0,update_frame:function(e){function t(){var e=d.enabled&&d.worker_initialized&&E&&!d.busy&&P&&d.camera_video_timestamp!=E;if(!e)return;d.busy=RAF_timestamp;d.camera_video_timestamp=E;d.camera_video_frame_id=x;Pe.video_canvas_face_detection.style.visibility="inherit";let t,i,o;t=Pe.video_canvas;i=t.width;o=t.height;let n=t.getContext("2d").getImageData(0,0,i,o).data.buffer;let a=Pe.video_canvas_face_detection.style;if(a.width!=t.style.width||a.height!=t.style.height){a.width=t.style.width;a.height=t.style.height}let s={rgba:n,w:i,h:o};if(!Pe.video_canvas_face_detection._offscreen&&self.OffscreenCanvas){s.canvas=Pe.video_canvas_face_detection.transferControlToOffscreen();Pe.video_canvas_face_detection._offscreen=true;console.log("(Face detection: use offscreen canvas)")}r.postMessage(s,s.canvas?[s.canvas,s.rgba]:[s.rgba]);s.rgba=n=undefined;s=undefined}if(e||self.PoseAT){setTimeout(()=>{t()},0)}else{t()}},update_frame_local:function(e,i){let t=Pe.video_canvas.width;let o=Pe.video_canvas.height;let n;if(!e){e=Pe.video_canvas_face_detection;if(e.width!=t||e.height!=o){e.width=t;e.height=o}n=e.getContext("2d");n.clearRect(0,0,t,o)}else{n=e.getContext("2d")}n.globalCompositeOperation="source-over";let a=this.face_cover;let s=a.width;let r=a.height;let _,l,d,c;if(i.length){let t=1;i.forEach(function(e){_=e[2]*t;l=_*s/r;d=e[1]*t-l/2;c=e[0]*t-_/2;n.drawImage(a,0,0,s,r,d,c,l,_)})}else{_=Math.min(t,o);l=_*s/r;d=(t-l)/2;c=(o-_)/2;n.drawImage(a,0,0,s,r,d,c,l,_)}}};return d}(),streamer_mode:f,facemesh:function(){var i=false;var pe=0;var he=0;var fe=true;var Me=0;var ge=[];var ye;var be;var g;var ve=[];var we;var b=false;var Se;var o=-1;var t;function n(e){if(!e&&t&&t==Pe.video_id)return;t=Pe.video_id;pe=0;he=0;fe=true;Me=0;ge=[];ye={};be={L:[],R:[]};g=0;ve=[];var o={L:[159,145],R:[386,374]};["L","R"].forEach(function(t){for(var i=0;i<1;i++){let e=be[t][i]={};e.index=i;e._eye_open_average=0;e.eye_open_average=0;e.eye_open_lower=999;e.eye_open_data=[];e.height_ref_pts=o[t]}ye[t]={_height_average:0,height_average:0,height_data:[],height_ref_pts:t=="R"?[334,330]:[105,101]}});Se={sad:0,angry:0,surprise:0,blush:0,tongue_out:0}}var a;var Ae=[];var De,ke,v;De=!is_mobile;v=!is_chrome||is_mobile;var e;function s(){if(Ie.initialized)return;Ie.initialized=true;for(var e=0;e<4;e++)Ae[e]=new THREE.Vector3;var o=[];if(System._browser.use_WASM_SIMD){o.push("simd=1")}if(C){De=true}if(v){De=true;o.push("use_mediapipe_facemesh=1")}if(De){De=true;if(Ie.blink_detection==null)Ie.blink_detection=true;o.push("use_face_landmarks=1")}if(ke){o.push("use_human_facemesh=1")}var t;if(MMD_SA_options.user_camera.ML_models.facemesh.worker_disabled){t=new Promise((e,t)=>{Re={postMessage:function(e,t){FacemeshAT.onmessage({data:e})}};let i=document.createElement("script");i.onload=async function(){await FacemeshAT.init(Re,o);e()};i.src="js/facemesh_lib.js";document.head.appendChild(i)})}else{Re=new Worker("js/facemesh_worker.js"+(o.length?"?"+o.join("&"):""))}Re.onmessage=A;return t}function w(e,t,i){const o=new Path2D;o.moveTo(t[0][0]/2,t[0][1]/2);for(let e=1;e<3;e++){const n=t[e];o.lineTo(n[0]/2,n[1]/2)}if(i){o.closePath()}e.stroke(o)}const S=["_neutral","BrowInnerUp","BrowDownLeft","BrowDownRight","BrowOuterUpLeft","BrowOuterUpRight","EyeLookUpLeft","EyeLookUpRight","EyeLookDownLeft","EyeLookDownRight","EyeLookInLeft","EyeLookInRight","EyeLookOutLeft","EyeLookOutRight","EyeBlinkLeft","EyeBlinkRight","EyeSquintRight","EyeSquintLeft","EyeWideLeft","EyeWideRight","CheekPuff","CheekSquintLeft","CheekSquintRight","NoseSneerLeft","NoseSneerRight","JawOpen","JawForward","JawLeft","JawRight","MouthFunnel","MouthPucker","MouthLeft","MouthRight","MouthRollUpper","MouthRollLower","MouthShrugUpper","MouthShrugLower","MouthClose","MouthSmileLeft","MouthSmileRight","MouthFrownLeft","MouthFrownRight","MouthDimpleLeft","MouthDimpleRight","MouthUpperUpLeft","MouthUpperUpRight","MouthLowerDownLeft","MouthLowerDownRight","MouthPressLeft","MouthPressRight","MouthStretchLeft","MouthStretchRight","TongueOut"];let Ee;const r=["あ","い","う","え","お","にやり","ω","口角上げ","口角下げ","ぺろっ","上","下","にこり","困る","怒り","照れ","まばたき","笑い","びっくり","まばたきL","まばたきR"];var A=function(){function re(e){if(!e||Ee)return;Ee={};e.categories.forEach((e,t)=>{const i=e.categoryName;Ee[i.charAt(0)+i.substring(1)]=t})}var _e;var le=0,de=0,ce=0,me=0;const ue={};window.addEventListener("jThree_ready",()=>{for(const e of r.concat(["両目"])){ue[e]=new System._browser.data_filter([{type:"one_euro",id:e,para:e=="両目"?[30,1,5,1,4]:[30,1,1,1,1]}])}});return function(e){var S=typeof e.data=="string"&&e.data.charAt(0)==="{"?JSON.parse(e.data):e.data;if(typeof S==="string"){if(S=="OK"){Ie.worker_initialized=true}else{DEBUG_show(S,2);System._browser.console.log(S)}}else if(S.posenet){xe({data:S})}else if(Ie.enabled){window.dispatchEvent(new CustomEvent("SA_camera_facemesh_update"));Pe._needs_RAF=true;const t=mt[Te.use_holistic?1:0];if(!t.facemesh){t.facemesh=true;DEBUG_show("Facemesh ML ready",2)}let w="";if(S.faces.length){Ie.data_detected++}else{Ie.data_detected=0}if(S.faces.length&&S.faces[0].bb_center){D=S.faces[0].bb_center}else if(!Te.enabled){D=[.5,.5]}if(S.faces.length&&Ie.data_detected_stable){let D=S.faces[0];re(D.faceBlendshapes);let d=Pe.x_flipped?1:-1;const A={facemesh_data:D};let k,E,l;if(D.rotation){const H=D.rotation.matrix;qe.set(H[0],H[1],H[2],0,H[3],H[4],H[5],0,H[6],H[7],H[8],0,0,0,0,1)}else{let e=MMD_SA._v3a_.fromArray(D.mesh[152]).sub(MMD_SA._v3b.fromArray(D.mesh[10])).normalize();let t=MMD_SA._v3b_.fromArray(D.mesh[454]).sub(MMD_SA._v3b.fromArray(D.mesh[234])).normalize();let i=MMD_SA.TEMP_v3.crossVectors(t,e).normalize();t.crossVectors(e,i);qe.set(t.x,t.y,t.z,0,e.x,e.y,e.z,0,i.x,i.y,i.z,0,0,0,0,1)}let e=MMD_SA.TEMP_v3.setEulerFromRotationMatrix(qe,"YZX");k=-e.x;E=-e.y;l=-e.z;let t=D.scaledMesh[454][0]-D.scaledMesh[234][0];let i=D.scaledMesh[454][1]-D.scaledMesh[234][1];let o;if(S.recalculate_z_rotation_from_scaledMesh){t/=Math.cos(E);i/=Math.cos(k);o=Math.sqrt(t*t+i*i)}else{t/=Math.cos(l);o=Math.abs(t/Math.cos(E))}Ie.face_width=o;let n;if(S.recalculate_z_rotation_from_scaledMesh){n=Math.asin(i/o)}else{n=l}let a=new THREE.Quaternion;let s=MMD_SA._v3a.set(k,E*d,n*d);a.setFromEuler(s,"YZX");Ie.calculate_neck_data({is_face:true,timestamp:Ie.camera_video_frame_id,f_axis:ze.set(D.scaledMesh[454][0],D.scaledMesh[454][1],0).add(MMD_SA.TEMP_v3.set(D.scaledMesh[234][0],D.scaledMesh[234][1],0)).multiplyScalar(.5).setZ(0).toArray(),face_width:Ie.face_width,face_rot:a.toArray()});const L=MMD_SA.MMD.motionManager.para_SA;let r=0;let _=L.motion_tracking?.camera?.tilt_adjustment||Pe.tilt_adjustment;if(_.enabled){r=_.angle*Math.PI/180;const O=MMD_SA._q2.set(Math.sin(r/2),0,0,Math.cos(r/2));a.premultiply(O)}let c=Pe.video_timestamp;let m=0;if(me){m=Math.max(Math.min(c-me,1e3),10);ce+=m;if(++de>=20){le=1e3/(ce/de);de=ce=0}}me=c;Ie._t=S._t;Ye.t_delta=le&&1e3/le||m||S.fps&&1e3/S.fps||S._t;_e="";if(Ie.head_pose_enabled){if(System._browser.motion_control.enabled)A.head_rot=MMD_SA._v3a.clone();Ye.add("skin|facemesh","首",{after_IK:true,rot:a,_rot_ratio:Ie.face_width/Math.min(Pe.video_canvas.width,Pe.video_canvas.height),onProcessRotation:dt})}pe+=Math.min(S._t,75);if(fe){he=~~(Math.min(pe/5e3,ge.length/60,we?be.L[0].eye_open_data.length/60:1,Te.enabled?ve.length/60:1,1)*100);fe=he<100;window.dispatchEvent(new CustomEvent("SA_camera_facemesh_calibrating",{detail:{percent:he}}))}let u=D.faceInViewConfidence>(ke?.75:.9)&&(Pe.video==Pe._image||!Pe.video.paused&&Math.abs(E)e-t).slice(e,ge.length-e).reduce((e,t)=>e+t)/(ge.length-e*2);if(!fe){Me=f}}}let M=0;let x=0;let g=0;let y=0;["L","R"].forEach(function(e){let t=ye[e];t.height=D.faceBlendshapes?Math.max(D.faceBlendshapes.categories[Ee["eyeSquint"+(e=="L"?"Left":"Right")]].score,.01):MMD_SA._v3a.fromArray(D.mesh[t.height_ref_pts[0]]).distanceTo(MMD_SA._v3b.fromArray(D.mesh[t.height_ref_pts[1]]));t._height_average=t.height_average;if(!t._height_average){if(u)t.height_data.push(t.height);if(!t.height_data.length){t._height_average=t.height}else{let e=parseInt(ge.length*.3);t._height_average=t.height_data.sort((e,t)=>e-t).slice(e,t.height_data.length-e).reduce((e,t)=>e+t)/(t.height_data.length-e*2);if(!fe){t.height_average=t._height_average}}}g+=t.height/t._height_average});g/=2;g=(g-1)/.25*(g>1?2:1);if(f){if(h>f*1.05){x=Math.sqrt(Math.min((h-f*1.05)/(f*.25),1))}else if(h2){M=Math.pow(Math.min((p-2)/(f*1/3),1),.5);if(x>.25)y=(x-.25)/.75*.3}}let P=0;let I=0;let R=0;let b=0;let T=0;let j=0;const F=Ie.face_width/Math.min(Pe.video_canvas.width,Pe.video_canvas.height);const z=MMD_SA.MMD.motionManager.para_SA.motion_tracking_upper_body_only||F>.2?1:Math.max(1-(.2-F)*8,0);let v={L:[0],R:[0]};if(De){["L","R"].forEach(function(t){let i=0;v[t][i]=0;let o=be[t][i];let n=D.faceBlendshapes?Math.max(1-D.faceBlendshapes.categories[Ee["eyeBlink"+(t=="L"?"Left":"Right")]].score*.9,.2):MMD_SA._v3a.fromArray(D.mesh[o.height_ref_pts[0]]).distanceTo(MMD_SA._v3b.fromArray(D.mesh[o.height_ref_pts[1]]));let a=o.eye_open_average;if(!a){if(u){o.eye_open_data.push(n);let e=parseInt(o.eye_open_data.length*.3);a=o.eye_open_data.sort((e,t)=>e-t).slice(e,o.eye_open_data.length-e).reduce((e,t)=>e+t)/(o.eye_open_data.length-e*2);if(!fe){o.eye_open_average=a}}else{a=o._eye_open_average}}if(u){if(o.eye_open_lower>n)o.eye_open_lower=n}o._eye_open_average=a;if(a){if(n>a){v[t][i]=Math.min(n/a,1.25)}else{let e=Math.min(o.eye_open_lower,a/2);v[t][i]=Math.max((n-e)/(a-e),0)}}})}const C=MMD_SA.THREEX.get_model(0).use_faceBlendshapes;if(D.faceBlendshapes){const q=D.faceBlendshapes.categories;const r=[q[Ee["eyeBlinkLeft"]].score,q[Ee["eyeBlinkRight"]].score];r.forEach((e,t)=>{const i=t==0?"L":"R";const o=be[i][0];const n=1-(1-Math.max(o._eye_open_average||0,.5))*.8;const a=Math.min(o.eye_open_lower,.3);const s=n-a;e=Math.min(Math.max(e-(1-n),0)/s,1);r[t]=e<.5?Math.pow(e*2,1.5)/2:Math.pow((e-.5)*2,.667)/2+.5});const U=!Ie.blink_sync;const K=(U?Math.min(Math.abs(r[0]-r[1])/.4,1):0)*z;let e=U?Math.min(...r):(r[0]+r[1])/2;q[Ee["eyeBlinkLeft"]].score=r[0]*K+e*(1-K);q[Ee["eyeBlinkRight"]].score=r[1]*K+e*(1-K);for(const X of["eyeSquintLeft","eyeSquintRight"]){const W=X=="eyeSquintLeft"?"L":"R";const Q=Math.min(Math.max((ye[W]._height_average||0)*.8,.2),.5);q[Ee[X]].score=Math.max(q[Ee[X]].score-Q,0)/(1-Q)}const G=Math.min(Math.max((f||0)*.8,.2),.6);q[Ee["mouthPucker"]].score=Math.pow(Math.max(q[Ee["mouthPucker"]].score-G,0)/(1-G),2);if(C){q.forEach(e=>{const t=e.categoryName;let i=t.charAt(0).toUpperCase()+t.substring(1);i=i.indexOf("Left")!=-1?i.replace("Left","Right"):i.replace("Right","Left");Ye.add("morph|facemesh",i,{weight:e.score})})}}if(Array.isArray(D.emotion)){D.emotion.forEach(e=>{switch(e.emotion){case"happy":P+=e.score;break;case"sad":I+=e.score;break;case"angry":case"disgust":R+=e.score;break;case"fear":b+=e.score;break;case"surprise":T+=e.score;break}})}const B=MMD_SA.THREEX.get_model(0);if(D.faceBlendshapes){const V=B.type=="VRM";const q=D.faceBlendshapes.categories;let e=q[Ee["jawOpen"]].score;let t=(q[Ee["mouthSmileLeft"]].score+q[Ee["mouthSmileRight"]].score)/2;let i=(q[Ee["mouthUpperUpLeft"]].score+q[Ee["mouthUpperUpRight"]].score)/2;let o=(q[Ee["mouthLowerDownLeft"]].score+q[Ee["mouthLowerDownRight"]].score)/2;let n=q[Ee["mouthPucker"]].score;let a=q[Ee["mouthFunnel"]].score;let s=q[Ee["mouthShrugLower"]].score;s*=s;const N=.3*(k>0?1-Math.min(k/(Math.PI/12),1):1);I=Math.min(Math.max(s-N,0)/.7,1);if(k<0){const ee=Math.min(Math.abs(k)/(Math.PI/4),1);I=Math.pow(Math.max(I-ee*.5,0)/(1-ee*.5),ee*3)}let r=q[Ee["browInnerUp"]].score;r*=r;let _=(q[Ee["browOuterUpLeft"]].score+q[Ee["browOuterUpRight"]].score)/2;let l=(q[Ee["browDownLeft"]].score+q[Ee["browDownRight"]].score)/2;let d=0,c=0,m=0,u=0,p=0;const Y=.3;if(e<.2){if(n>.1){m=n;if(a>.1)p=(a-.1)/2}else{c=Math.min(i+o/2,1);u=Math.min(t+i/2,1);const ee=Math.min(t/(i+o||.1),1);c*=1-ee;u*=ee}const te=1-Math.min(Math.max(c,m,u,p),.2)/.2;d=Math.pow(e/.2,1-e/.2*.35-te*.3)*Y;if(C){e=d;Ye.morph["JawOpen"][0].weight=e}}else{e=Y+(e-.2)/.8*(1-Y);if(C)Ye.morph["JawOpen"][0].weight=e;p=Math.min(e+a/2,1);d=Math.min(e+(t+i)/3,1);if(n>.1){const ee=Math.min((n-.1)*5,1);p*=ee;d*=1-ee}else{p=0}}if(a>.1){x=-(a-.1)*.75}else{x=Math.min(Math.max(t-.2,0)*1+Math.max(i-.5,0)*1.5,1);if(x>.5)u*=1-(x-.5)*2*.25}P=Math.min(Math.max(x,0)-I,1);if(P<0){I=-P;P=0}else{I=0}const Z=.2+n/2;R=Math.max(q[Ee["mouthLeft"]].score-Z,q[Ee["mouthRight"]].score-Z,0);t=Math.min(P*.8,V?.7-Math.max(P*.4-.3,0):.6);P*=.4;I*=.5;R=Math.max(R-P,0);let h=Math.max(Math.max((q[Ee["mouthPressLeft"]].score+q[Ee["mouthPressRight"]].score)/2,(q[Ee["mouthRollLower"]].score+q[Ee["mouthRollUpper"]].score)/2)-.2,0);if(l>.1){_=-(l-.1)/.9}else if(r>.1&&_>.1){_=((r-.1)/.9+(_-.1)/.9)/2}let f=(q[Ee["eyeBlinkRight"]].score+q[Ee["eyeBlinkLeft"]].score)/2;T=Math.max(_-f-.1,0);T=T*T/2;if(V)T=Math.min(T*Math.max(e*3,1),1);let M=1;const $=Ie.use_tongue_out&&B.blendshape_map_by_MMD_name?.["ぺろっ"];const g=Ie.use_tongue_out&&(B.use_tongue_out||$);let y=Math.min(q[Ee["mouthLowerDownLeft"]].score,q[Ee["mouthLowerDownRight"]].score);if(g&&y>.2){let e=Math.max(q[Ee["mouthUpperUpLeft"]].score,q[Ee["mouthUpperUpRight"]].score);j=Math.max(y-e*1.2,0);if(Math.abs(E)>Math.PI/18){M=Math.max(1-(Math.abs(E)-Math.PI/18)/(Math.PI/4),1/3);j*=M}if(j<.1){j=0}else{j=Math.min(j*(1+(q[Ee["mouthDimpleLeft"]].score+q[Ee["mouthDimpleRight"]].score)/2),1)}}let b=Ie.emotion_weight_percent/100;if(C)b*=b;for(const ie in Se){let e=Se[ie];let t=Ie.emotion_weight_by_name(ie,b);let i=-1,o=1;let n=V?1:t*.8;let a=t*.75;let s=0;let r;switch(ie){case"sad":s=I;r=.25;break;case"angry":s=R;r=.25;break;case"surprise":s=T;if(V){r=.25}break;case"blush":s=h;r=.2;o=.5;n=1;break;case"tongue_out":s=j;r=.2;a=.6;n=1;break}if(r){let e=Math.min(s/r,1);e*=e;n=Math.min(s+Math.max(n-s,0)*e*(e<1?a:1),n);i=s*e*o}Se[ie]=THREE.Math.clamp(Math.max(e,s)+i*Ie._t/1e3*4,0,n)}({sad:I,angry:R,surprise:T,blush:h,tongue_out:j}=Se);if(j){if($){j=j<.5?Math.pow(j*2,2)/2:Math.pow((j-.5)*2,.5)/2+.5}else{if(j<.5){j=0}else{j=Math.sqrt(j);d*=1-j+j/2}}}if(C&&!$)Ye.add("morph|facemesh","TongueOut",{weight:j});if(!V){b=Math.min(b/.75,1);if(h)I+=h*.25*b}const J=Ie.emotion_weight_by_name("smile",Math.sqrt(b));t*=J;P*=J;I=Math.min(I,Ie.emotion_weight_by_name("sad",b));R=Math.min(R,Ie.emotion_weight_by_name("angry",b));h=Math.min(h,Math.min(Ie.emotion_weight_by_name("blush",b)/.75,1));T=Math.min(T,Ie.emotion_weight_by_name("surprise",b));if(V)T*=T;Ye.add("morph|facemesh","あ",{weight:d});Ye.add("morph|facemesh","い",{weight:c});Ye.add("morph|facemesh","う",{weight:m});Ye.add("morph|facemesh","え",{weight:u});Ye.add("morph|facemesh","お",{weight:p});Ye.add("morph|facemesh","にやり",{weight:x});Ye.add("morph|facemesh","口角上げ",{weight:i-s});Ye.add("morph|facemesh","上",{weight:_});Ye.add("morph|facemesh","にこり",{weight:t});Ye.add("morph|facemesh","困る",{weight:I});Ye.add("morph|facemesh","怒り",{weight:R});Ye.add("morph|facemesh","笑い",{weight:P});Ye.add("morph|facemesh","びっくり",{weight:T});Ye.add("morph|facemesh","照れ",{weight:h});Ye.add("morph|facemesh","ぺろっ",{weight:j});const U=!Ie.blink_sync&&THREE.MMD.getModels()[0].pmx.morphs_index_by_name["まばたきL"]!=null;if(U){Ye.add("morph|facemesh","まばたきL",{weight:Math.max(q[Ee["eyeBlinkRight"]].score-P,0)});Ye.add("morph|facemesh","まばたきR",{weight:Math.max(q[Ee["eyeBlinkLeft"]].score-P,0)});Ye.add("morph|facemesh","まばたき",{weight:0})}else{Ye.add("morph|facemesh","まばたきL",{weight:0});Ye.add("morph|facemesh","まばたきR",{weight:0});Ye.add("morph|facemesh","まばたき",{weight:Math.max(f-P,0)})}let v,w,S,A;if(Ie.auto_look_at_camera){const oe=THREE.MMD.getModels()[0].mesh;const ne=MMD_SA.TEMP_v3.copy(MMD_SA._trackball_camera.object.position).sub(MMD_SA._head_pos).normalize().applyQuaternion(MMD_SA.get_bone_rotation(oe,"頭").conjugate());const ae=MMD_SA._v3b.setEulerFromQuaternion(MMD_SA.TEMP_q.setFromUnitVectors(MMD_SA._v3a.set(0,0,1),ne));v=-Math.sign(ae.x)*Math.min(Math.abs(ae.x/(Math.PI/4)),1);w=-Math.sign(ae.y)*Math.min(Math.abs(ae.y/(Math.PI/4)),1);A=1}else{v=(q[Ee["eyeLookUpLeft"]].score+q[Ee["eyeLookUpRight"]].score)/2-(q[Ee["eyeLookDownLeft"]].score+q[Ee["eyeLookDownRight"]].score)/2;w=(q[Ee["eyeLookInRight"]].score+q[Ee["eyeLookOutLeft"]].score)/2-(q[Ee["eyeLookInLeft"]].score+q[Ee["eyeLookOutRight"]].score)/2;A=Ie.eye_bone_rotation_percent/100}S={absolute:true,rot:(new THREE.Quaternion).setFromEuler(MMD_SA._v3a.set(-v*15/180*Math.PI,-w*20/180*Math.PI,0).multiplyScalar(A),"YZX")};Ye.add("skin|facemesh","両目",S)}else{let e=P-(I+R+b+T*.5);if(e<0){y*=Math.max(1+e*2,0)}else{y=Math.min(e*.2+y*(1+e*.5),.4)}Ye.add("morph|facemesh","にこり",{weight:ue["にこり"].filter(Math.min(y+P*.75,.75))});Ye.add("morph|facemesh","困る",{weight:ue["困る"].filter(Math.min((I+b)/2*.75+(g<0?Math.max(-g*1-Math.max(x,0)*.5,0):0),.75))});Ye.add("morph|facemesh","怒り",{weight:ue["怒り"].filter(Math.min(R*.75,.75))});g+=T*.2;Ye.add("morph|facemesh","笑い",{weight:ue["笑い"].filter(y)});Ye.add("morph|facemesh","びっくり",{weight:ue["びっくり"].filter(T*.75)});Ye.add("morph|facemesh","にやり",{weight:ue["にやり"].filter(x)});let i=MMD_SA.TEMP_q.setFromEuler(MMD_SA._v3a.set(k,E,l),"YZX").conjugate();let o=[];[13,14,61,291].forEach(function(e,t){o[e]=Ae[t].fromArray(D.mesh[e]).applyQuaternion(i).setZ(0)});let t=MMD_SA._v3a.copy(o[61]).add(o[291]).multiplyScalar(.5);let n=o[61].distanceTo(o[291])*.5;let a=Math.atan2(o[13].y-t.y,n);let s=Math.atan2(o[14].y-t.y,n);let r=Math.max(-(a+s)*180/Math.PI+20*M,0);if(r)r=Math.min(r/20,.75);r=Math.min(r+I*.25,1);r*=.5;M=M*(1-r);Ye.add("morph|facemesh","あ",{weight:ue["あ"].filter(M)});Ye.add("morph|facemesh","お",{weight:ue["お"].filter(r)});let _={L:[],R:[]};if(!Ie.eye_tracking){}else if(De){let i=[0,0];let o=[0,0];D.eyes.forEach(function(e,t){if(e){i[t]=Math.max(Math.min((e[3]*2+k/(Math.PI/2))*(1-Math.abs(k)/Math.PI),1),-1);o[t]=Math.max(Math.min((e[2]*2-E/(Math.PI/2))*(1-Math.abs(E)/Math.PI),1),-1)}});let e=(v.L[0]+v.R[0])/2;if(e>1)g+=(e-1)*2;else g-=(1-e)*.5;g=Math.min(g,1);let t=v.L[0]+v.R[0];if(t)t=v.L[0]/t;else t=.5;let n=i[0]*t+i[1]*(1-t);let a=o[0]*t+o[1]*(1-t);let s={absolute:true,rot:(new THREE.Quaternion).fromArray(ue["両目"].filter(MMD_SA.TEMP_q.setFromEuler(MMD_SA._v3a.set(-(n-.3)*15/180*Math.PI,a*d*20/180*Math.PI,0),"YZX").toArray()))};Ye.add("skin|facemesh","両目",s);let r=!Ie.blink_sync&&THREE.MMD.getModels()[0].pmx.morphs_index_by_name["まばたきL"]!=null;let _=(r?Math.min(Math.max(Math.abs(v.L[0]-v.R[0])-(.25+(1-Math.min(Math.max((Math.PI/6-Math.abs(E))/(Math.PI/12),0),1))*1),0)/.25,1):0)*z;let l=r?Math.min(v.L[0],v.R[0]):(v.L[0]+v.R[0])/2;v.L[0]=v.L[0]*_+l*(1-_);v.R[0]=v.R[0]*_+l*(1-_);if(r){let e="まばたき"+(d==1?"L":"R");Ye.add("morph|facemesh",e,{weight:ue[e].filter(Math.max(Math.min(1-v.L[0]*.8-y,1),0))});e="まばたき"+(d==1?"R":"L");Ye.add("morph|facemesh",e,{weight:ue[e].filter(Math.max(Math.min(1-v.R[0]*.8-y,1),0))});Ye.add("morph|facemesh","まばたき",{weight:0})}else{Ye.add("morph|facemesh","まばたきL",{weight:0});Ye.add("morph|facemesh","まばたきR",{weight:0});Ye.add("morph|facemesh","まばたき",{weight:ue["まばたき"].filter(Math.max(Math.min(1-v.L[0]*.8-y,1),0))})}}else{let e=D.eyes[0];let t=0;let i=0;if(e){t=Math.max(Math.min((e[3]*2+k/(Math.PI/2))*(1-Math.abs(k)/Math.PI),1),-1);i=Math.max(Math.min((e[2]*2-E/(Math.PI/2))*(1-Math.abs(E)/Math.PI),1),-1)}let o=g*.25;if(o<0)o=Math.min(o+y,0);let n=Math.max(Math.min(.1-t*(t<0?2:1)*.2-o,.5),0);Ye.add("morph|facemesh","まばたき",{weight:n});let a=1.25+Math.pow((v.L[0]+v.R[0])/2,2)*1.75;t=Math.sign(t)*Math.pow(Math.abs(t),a);i=Math.sign(i)*Math.pow(Math.abs(i),a);let s={absolute:true,rot:(new THREE.Quaternion).setFromEuler(MMD_SA._v3a.set(-t*15/180*Math.PI,i*d*20/180*Math.PI,0),"YZX")};Ye.add("skin|facemesh","両目",s)}if(Ie.eye_tracking)Ye.add("morph|facemesh","上",{weight:ue["上"].filter(Math.max(Math.min(g,1),-1))})}if(!Te.enabled){if(!Ye.skin["センター"])Ye.add("skin","センター",{rot:new THREE.Quaternion});const L=MMD_SA.MMD.motionManager.para_SA;if(L.motion_tracking_upper_body_only){for(const W of["左","右"]){const se=true;if(L.has_leg_IK){Ye.set_blend_default_motion("skin",W+"足IK",true);Ye.remove("skin",W+"足首")}else{Ye.set_blend_default_motion("skin",W+"足",true);Ye.set_blend_default_motion("skin",W+"ひざ",true);Ye.set_blend_default_motion("skin",W+"足首",true)}Te.enable_IK(W+"足IK",L.has_leg_IK);Te.enable_IK(W+"つま先IK",L.has_leg_IK);Ye.set_blend_default_motion("skin",W+"肩",se);Ye.set_blend_default_motion("skin",W+"腕",se);Ye.set_blend_default_motion("skin",W+"ひじ",se);Ye.set_blend_default_motion("skin",W+"手捩",se);Ye.set_blend_default_motion("skin",W+"手首",se);Ye.set_blend_default_motion("skin",W+"腕IK",se);Te.enable_IK(W+"腕IK",true)}}else{for(const W of["左","右"]){Te.enable_IK(W+"腕IK",L.has_arm_IK)}Ye.remove("skin","センター")}}w=w||D.eyes.length&&[(!Te.enabled?Pe.video_canvas.width+"x"+Pe.video_canvas.height+"("+Ie.camera_video_frame_id+")\n":"")+(fe?"Calibrating("+he+"%):Make a calm face!":"(face data calibrated)")+"/"+Math.round(D.faceInViewConfidence*100)+"%",D.emotion?JSON.stringify(D.emotion):"Neutral"].join("\n");if(_e)w+="\n"+_e;w+=(Le||!Te.enabled?Fe?"\n"+Fe+"\n":"":"")+(Le||"");System._browser.motion_control.process(A)}else{w="(no facemesh data)\n"+Le}if(!System._browser.overlay_mode&&!MMD_SA_options.user_camera.ML_models.debug_hidden){System._browser.on_animation_update.add(()=>{DEBUG_show(w&&w+(!Te.enabled||!Te.use_holistic?"\nF-FPS:"+Math.round(le)+"/"+Math.round(S.fps||0):"")+"\n"+"FPS:"+EV_sync_update.fps_last||"")},0,0)}Ie.busy=0}Ie.update_frame()}}();var k=document.createElement("canvas");var _=true;var l;var d,c,m,u,p,h;var f;var D=[];var M=0;var y=0;Ie={initialized:false,worker_initialized:false,faceBlendshapes_list:S,MMD_morph_list:r,get data_detected(){return M},set data_detected(e){if(e){if(!M){y=RAF_timestamp}}else{y=0}M=e},get data_detected_stable(){return i&&y&&RAF_timestamp-y>250},get head_pose_enabled(){return this.data_detected_stable||!Te.enabled},get blink_detection(){return we},set blink_detection(e){we=e;if(i){if(we){n()}else{MMD_SA_options.auto_blink=a!=null?a:MMD_SA_options.auto_blink}}},get auto_blink(){return b},set auto_blink(e){b=e},get eye_bone_rotation_percent(){return f==null?100:f},set eye_bone_rotation_percent(e){f=e},get eye_tracking(){return _},set eye_tracking(e){_=e;if(_){this.blink_detection=!!De}else{this.blink_detection=false}if(i){if(!_){Ye.remove("skin","両目");Ye.remove("morph","まばたきL");Ye.remove("morph","まばたきR");Ye.remove("morph","まばたき");Ye.remove("morph","上");Ye.remove("morph","下")}}},get use_faceLandmarksDetection(){return De},set use_faceLandmarksDetection(e){if(!this.initialized)De=e},get use_mediapipe(){return v||Te.enabled&&Te.use_holistic},set use_mediapipe(e){return v=e},get use_faceBlendshapes(){return!Te.enabled||!Te.use_holistic},get calibrated(){return!fe&&he>=100},get use_tongue_out(){return l==null?1:l},set use_tongue_out(e){l=e},get emotion_weight_percent(){return d==null?75:d},set emotion_weight_percent(e){d=e},get emotion_joy_fun_percent(){return c==null?100:c},set emotion_joy_fun_percent(e){c=e},get emotion_angry_percent(){return m==null?100:m},set emotion_angry_percent(e){m=e},get emotion_sorrow_percent(){return u==null?100:u},set emotion_sorrow_percent(e){u=e},get emotion_surprised_percent(){return p==null?100:p},set emotion_surprised_percent(e){p=e},get emotion_others_percent(){return h==null?100:h},set emotion_others_percent(e){h=e},emotion_weight_by_name:function(e,t=1){switch(e){case"smile":return t*this.emotion_joy_fun_percent/100;case"angry":return t*this.emotion_angry_percent/100;case"sad":return t*this.emotion_sorrow_percent/100;case"surprise":return t*this.emotion_surprised_percent/100;case"blush":return t*this.emotion_others_percent/100;default:return t}},export_calibration:function(){const e={facemesh_calibration_type:Te.use_holistic?"holistic":"facemesh",lips_width_average:Me,eyebrow_data:{L:{height_average:ye.L.height_average},R:{height_average:ye.R.height_average}},eye_data:{L:{eye_open_average:be.L[0].eye_open_average},R:{eye_open_average:be.R[0].eye_open_average}},neck_length_average:g};System._browser.save_file("facemesh_calibration.json",JSON.stringify(e,null,"\t"),"application/json")},import_calibration:function(e){this.reset_calibration();Me=e.lips_width_average;for(const t of["L","R"]){Object.assign(ye[t],e.eyebrow_data[t]);Object.assign(be[t][0],e.eye_data[t])}g=e.neck_length_average||1.25;he=100;fe=false},face_width:0,_neck:{},calculate_neck_data:(()=>{let u,p,h;let f;let M;window.addEventListener("jThree_ready",()=>{u=new THREE.Vector3;p=new THREE.Vector3;h=new THREE.Vector3;f=new THREE.Quaternion;M=new System._browser.data_filter([{type:"one_euro",id:"neck_length",para:[30,1,1,1,1]}])});return function(t){if(!Te.enabled||!Ie.enabled||!this._neck.data)return false;let e=this._neck.data.find(e=>e.timestamp===t.timestamp);if(!e){this._neck.data.unshift(t);return false}Object.assign(e,t);if(!(e.is_pose&&e.is_face))return false;const i=u.fromArray(e.f_axis);const o=p.fromArray(e.shoulder_center).setZ(0);const n=h.set(0,0,e.face_width/3).applyQuaternion(f.fromArray(e.face_rot).conjugate()).setZ(0).y;const a=MMD_SA.MMD.motionManager.para_SA;let s=a.motion_tracking?.camera?.tilt_adjustment||Pe.tilt_adjustment;let r=s.enabled?s.angle*Math.PI/180:0;const _=a.motion_tracking?.ML_models?.pose||MMD_SA_options.user_camera.ML_models.pose;if(_.upper_rotation_offset){const m=_.upper_rotation_offset*Math.PI/180;r*=Math.cos(m)}const l=e.spine_rot_absolute[0]+r;this._neck._spine_rot_absolute=e.spine_rot_absolute.slice();this._neck._spine_rot_absolute[0]+=r;let d=M.filter(i.distanceTo(o)+n)/e.face_width/Math.max(Math.abs(Math.cos(l)));if(fe){window.addEventListener("SA_camera_facemesh_calibrating",()=>{ve.push(d);let e=parseInt(ve.length*.3);g=ve.sort((e,t)=>e-t).slice(e,ve.length-e).reduce((e,t)=>e+t)/(ve.length-e*2)},{once:true})}this._neck.data.length=0;if(!g)return false;let c=d/g;Ne[2]=!Te.shoulder_tracking||c>.95?0:(1-Math.max((c/.95-.8)/(1-.8),0))*Math.PI/8;if(t.is_pose)return true;return true}})(),get enabled(){return i},set enabled(e){if(i==!!e)return;i=!!e;q();this.busy=0;this.data_detected=0;D[0]=D[1]=.5;this._neck={data:[]};if(i){if(!this.initialized)s();a=MMD_SA_options.auto_blink;const t=Te.use_holistic?1:0;n(o!=t);o=t}else{MMD_SA_options.auto_blink=a}R()},get bb_center(){return D},set bb_center(e){D=e},reset_calibration:n,get frames(){return Ye},init:s,worker_onmessage:A,camera_video_timestamp:0,update_frame:function(e){async function t(){var e=Ie.enabled&&Ie.worker_initialized&&E&&!Ie.busy&&!(Te.enabled&&Te.use_holistic)&&P&&Ie.camera_video_timestamp!=E;if(!e)return;Ie.busy=RAF_timestamp;Ie.camera_video_timestamp=E;Ie.camera_video_frame_id=x;if(we){MMD_SA_options.auto_blink=b||false}let n;let a,s;let r,_;let l,d;let t;n=Pe.video_canvas;let i=n.width,o=n.height;l=d=0;a=r=i;s=_=o;let c=1;let m=MMD_SA_options.user_camera.pixel_limit.facemesh;if(m){if(a*s>m[0]*m[1]){c=Math.sqrt(a*s/(m[0]*m[1]));a=r=Math.round(a/c);s=_=Math.round(s/c);n=k;t=true}}let u,p,h;if(MMD_SA_options.user_camera.pixel_limit.facemesh_bb_ratio){u=MMD_SA_options.user_camera.pixel_limit.facemesh_bb_ratio;h=Math.round(Math.min(a,s)*u);r=h;_=h;let e=1;const y=5*(v?2:1);if(Ie.data_detected"+r+"x"+_+"):"+[e,t,h,h].join(",")+"=>"+[l,d,r,_].join(","))}}else{if(n.width!=r||n.height!=_){n.width=r;n.height=_;console.log("Facemesh canvas("+a+"x"+s+")")}}f.drawImage(Pe.video_canvas,Math.round(e*c),Math.round(t*c),Math.round(i*c),Math.round(o*c),0,0,r,_)}let M=I&&v?await createImageBitmap(n,t?0:l,t?0:d,r,_):f.getImageData(t?0:l,t?0:d,r,_).data.buffer;Ie._timestamp=Pe.video_timestamp;let g={rgba:M,w:a*(p||1),h:s*(p||1),options:{use_facemesh:true,draw_canvas:true,flip_canvas:Pe.display_flipped,bb:{x:Math.round(l),y:Math.round(d),w:r,h:_,ratio:u||0,scale:p||1,timestamp:Ie._timestamp}}};if(self.FacemeshAT){g.canvas=Pe.video_canvas_facemesh}else if(!Pe.video_canvas_facemesh._offscreen&&self.OffscreenCanvas){g.canvas=Pe.video_canvas_facemesh.transferControlToOffscreen();Pe.video_canvas_facemesh._offscreen=true;console.log("(Facemesh: use offscreen canvas)")}Re.postMessage(g,g.canvas?[g.canvas,g.rgba]:[g.rgba]);g.rgba=M=undefined;g=undefined}if(e||self.FacemeshAT){setTimeout(()=>{t()},0)}else{t()}}};return Ie}(),poseNet:function(){var i=false;var t=true;var n=true;var a={};var o=null;var s=0;var r=0;var _=0;var l=null;var d=null;var c=0;var m;var u,p,h,f;var M,g,y;Te={get enabled(){return i},set enabled(e){if(i==!!e)return;i=!!e;$e=0;Xe=false;this.data_detected=0;this.initial_data_detected=false;_=0;THREE.MMD.getModels()[0].mesh.visible=true;j.set(0,0,0);if(i){if(!this.initialized)G();if(U){worker_id=Te.use_holistic?"legacy_holistic":"tasks_vision";if(!b[worker_id]){mt=[{},{}];v.terminate();for(const t in b)delete b[t];v=new Worker(U);v.onmessage=xe;w=worker_id;b[w]=new K(w,v)}console.log("Web worker ID:"+w);v=b[w].worker;D=b[w].initialized}MMD_SA_options.user_camera.ML_models.pose.events.enabled&&MMD_SA_options.user_camera.ML_models.pose.events.enabled()}else{THREE.MMD.getModels()[0].resetPhysics();MMD_SA_options.user_camera.ML_models.pose.events.disabled&&MMD_SA_options.user_camera.ML_models.pose.events.disabled()}R();if(Te.use_holistic){setTimeout(()=>{if(i)Ie.enabled=je.enabled=true;else je.enabled=false;DEBUG_show("(Holistic Mode:"+(i?"ON":"OFF")+")",2)},0)}},get data_detected(){return s},set data_detected(e){if(1){if(e){if(!s){r=RAF_timestamp}if(this.data_detected_stable){_=0}}else{r=0;if(!_){_=RAF_timestamp}if(RAF_timestamp-_>250){Ye.reset()}}}s=e},get data_detected_stable(){return i&&(!_||RAF_timestamp-_<250||r&&RAF_timestamp-r>500)},get use_3D_pose(){return i&&t&&nt},set use_3D_pose(e){t=e},get use_holistic(){return o==null?C:o},set use_holistic(e){o=e},get _use_holistic_(){return C},set _use_holistic_(e){C=e},get skip_hand_countdown_max(){return 0},set IK_disabled(e){n=e},get auto_grounding(){return l!=null?l:MMD_SA_options.user_camera.ML_models.pose.auto_grounding||MMD_SA.WebXR.session},set auto_grounding(e){l=e},get ground_plane_visible(){return d!=null?d:!i||!!MMD_SA_options.user_camera.ML_models.pose.auto_grounding||MMD_SA.MMD.motionManager.para_SA.motion_tracking_upper_body_only},set ground_plane_visible(e){d=e},get spine_length_ref(){if(c)return c;const e=MMD_SA_options.model_para_obj.left_leg_length/MMD_SA_options.model_para_obj.spine_length;return Te.leg_scale_adjustment?Math.max(4.97462,MMD_SA_options.model_para_obj.spine_length*(e/1.83))*(21-Te.leg_scale_adjustment)/20:Math.max(4.97462,MMD_SA_options.model_para_obj.spine_length)},set spine_length_ref(e){c=e},get shoulder_tracking(){return m==null?1:m},set shoulder_tracking(e){m=e},get hip_adjustment_weight_percent(){return u==null?100:u},set hip_adjustment_weight_percent(e){u=e},get hip_adjustment_head_weight_percent(){return p==null?100:p},set hip_adjustment_head_weight_percent(e){p=e},get hip_adjustment_adjust_y_axis_percent(){return h==null?66:h},set hip_adjustment_adjust_y_axis_percent(e){h=e},get hip_adjustment_scale_x_percent(){return M==null?100:M},set hip_adjustment_scale_x_percent(e){M=e},get hip_adjustment_scale_y_percent(){return g==null?100:g},set hip_adjustment_scale_y_percent(e){g=e},get hip_adjustment_scale_z_percent(){return y==null?100:y},set hip_adjustment_scale_z_percent(e){y=e},get hip_adjustment_smoothing_percent(){return f==null?0:f},set hip_adjustment_smoothing_percent(e){f=e},leg_scale_adjustment:0,IK_disabled_check:function(){var o=new RegExp("("+toRegExp(["腕IK","足IK","つま先IK"],"|")+")$");var e=new RegExp("("+toRegExp(["腕IK"],"|")+")$");return function(e){const t=MMD_SA.MMD.motionManager.para_SA;if(!n||!this.data_detected&&(this.enabled||!Ie.enabled||!Ie.data_detected)||!t.motion_tracking_enabled)return null;let i=!e||o.test(e);if(i&&e){if(a[e])i=false}return i}}(),enable_IK:function(e,t){a[e]=t},get frames(){return Ye},camera_video_timestamp:0,get busy(){return $e},get initialized(){return A},get worker_initialized(){return D},set worker_initialized(e){D=e;if(!self.PoseAT)b[w].initialized=e}};return Te}(),handpose:function(){var t=false;var i={};var o={};var n,a;var s;je={get enabled(){return t},set enabled(e){if(t==!!e)return;t=!!e;if(t){i={};o={};if(!this.initialized)G()}},get hand_visible_timestamp(){return i},get hand_visible_session(){return o},get frames(){return Ye},get busy(){return $e},get initialized(){return A},get worker_initialized(){return D},set worker_initialized(e){D=b[w].initialized=e},get stabilize_arm(){return n==null?2:n},set stabilize_arm(e){n=e},get stabilize_arm_time(){return a==null?0:a},set stabilize_arm_time(e){a=e},get stabilize_hand_percent(){return s==null?20:s},set stabilize_hand_percent(e){s=e},_hand_last:{"左":{},"右":{}}};return je}(),reset_video_canvas:function(){if(this.video_canvas){this.video_canvas.width=this.video_canvas.height=E=0;x=""}},show:function(){if(!this.initialized||this.visible)return;this.visible=true;if(Pe.target_devicePixelRatio!=window.devicePixelRatio){Pe.target_devicePixelRatio=0;Pe.video_track.applyConstraints(Pe.set_constraints()).then(function(){DEBUG_show("(camera size updated)",2)})["catch"](function(e){DEBUG_show("ERROR:camera size failed to update")})}s();if(this.hidden_enforced)this.hide()},hide:function(){if(!this.initialized||!this.visible)return;this.visible=false;this.video_canvas.style.visibility="hidden";d.enabled=false;c.enabled=false;l()},set_constraints:function(e){var t={};const i=window.devicePixelRatio/this.target_devicePixelRatio;let o,n;const a=is_mobile?Math.min(270/Math.min(window.innerWidth,window.innerHeight),i):i;o=Math.round(window.innerWidth*a);n=Math.round(window.innerHeight*a);var s=MMD_SA_options.user_camera.pixel_limit.current||MMD_SA_options.user_camera.pixel_limit._default_;if(!u){if(MMD_SA_options.user_camera.pixel_limit.fixed){o=s[0];n=s[1]}else if(o*n>s[0]*s[1]){const r=Math.sqrt(o*n/(s[0]*s[1]));o=Math.round(o/r);n=Math.round(n/r)}}Pe.target_width=o;Pe.target_height=n;if(!MMD_SA_options.user_camera.pixel_limit.disabled){if(!is_mobile||!screen.orientation||/landscape/.test(screen.orientation.type)){t.width=o;t.height=n}else{t.width=n;t.height=o}}if(MMD_SA_options.user_camera.fps)t.frameRate=MMD_SA_options.user_camera;if(e)t=Object.assign(t,e);console.log("Camera constraints",t);return t}};return Pe}(),data_filter:function(){class e{constructor(){}filter(e){return e}}class t{constructor(e){this.filters=e;e.forEach(e=>{switch(e.type){case"one_euro":if(e.transition_time){e.para[1]=1/(1/(1/e.transition_time/60)-1)*60/(2*Math.PI);console.log("transition_time => minCutoff",e.para[1])}e.filter=new OneEuroFilter(...e.para||[]);break}if(e.id)e.filter.id=e.id})}filter(t,i=System._browser.camera.initialized&&System._browser.camera.ML_enabled?System._browser.camera.video_timestamp:RAF_timestamp){if(t!=null){this.filters.forEach(e=>{if(!e.condition||e.condition()){this.data=e.filter.filter(t,i);this.timestamp=RAF_timestamp}})}return this.data}}return t}(),motion_control:function(){var s,u,m,i,_,p;var c;var h;var f=function(){var r={};var a={};return{pressed:r,map:a,temp:{},set_options:function(e){if(!l)return;if(!e.timeout_list){const t=["W","A","S","D"];for(const i of["L","R"]){for(const o in e[i]){const n=e[i][o];if(n.press)t.push(...n.press)}}e.timeout_list=t.map(e=>p[e])}if(!e.clear_list)e.clear_list={};for(const i of["L","R"]){if(!e.clear_list[i]){const t=i=="L"?["W","A","S","D"]:[];for(const o in e[i]){const n=e[i][o];if(n.press)t.push(...n.press)}e.clear_list[i]=t.map(e=>[p[e]])}}this.temp={};Object.assign(a,e);console.log(a)},action:function(e,t,i){var o=a[t][i]||{};return{press:o.press&&(!o.press_check||o.press_check(e))&&o.press||[],release:o.release||[],click:o.click&&(!o.click_check||o.click_check(e))&&o.click||[]}},activate:async function(e,t,i,o=[]){const n=this.action(e,t,i);if(n.click.length)await f.click(...n.click.map(e=>[p[e]]));if(n.press.length){const a=n.press.map(e=>p[e]);o=[...o.filter(e=>a.indexOf(e[0])==-1),...n.release.map(e=>[p[e]])];if(o.length)await f.releaseKey(...o);await f.pressKey(...a.map(e=>[e]))}},clear_list:function(e){return a.clear_list[e]},pressKey:async function(...e){let t=Array.isArray(e[0])&&e||[e];var i=[];for(const o of t){const n=o.filter(e=>!r[e]);if(n.length){for(const s of n)r[s]=-1;await _.pressKey(...n);const a=n.filter(e=>r[e]==-2);if(a.length){await _.releaseKey(...a);for(const s of a)r[s]=0;console.log("key released enforced",a.length)}}for(const s of o){if(r[s])r[s]=RAF_timestamp}}},releaseKey:async function(...e){const t=!e.length?Object.keys(r).map(e=>[parseInt(e)]):Array.isArray(e[0])&&e||[e];const i=[];for(const o of t){const n=o.filter(e=>r[e]>0);if(n.length){i.push(_.releaseKey(...n).then(()=>{for(const e of n)r[e]=0}))}const a=o.filter(e=>r[e]<0);a.forEach(e=>{r[e]=-2})}if(i.length){await Promise.all(i)}},releaseIdleKey:async function(...e){const t=!e.length?Object.keys(r).map(e=>[parseInt(e)]):Array.isArray(e[0])&&e||[e];const i=t.map(e=>e.filter(e=>r[e]&&(a.timeout_list.indexOf(e)==-1||RAF_timestamp-(r[e]>0?r[e]:RAF_timestamp)>500))).filter(e=>e.length);if(i.length){await f.releaseKey(...i)}},click:async function(...e){const t=Array.isArray(e[0])&&e||[e];await this.pressKey(...t);await this.releaseKey(...t)}}}();var M={custom:{},list:[],estimate:function(e,t,i=9){const o=e.estimate(t.keypoints,i);if(o.gestures.length){o.gestures.forEach(e=>{e._d=t._d;e.hand_facing=this.list[0].hand_facing[t._d];e.hand_rot_YXZ=this.list[0].hand_rot_YXZ[t._d];e.thumb_out=this.list[0].thumb_out[t._d];e.poseData=o.poseData});this.list[0].gestures=this.list[0].gestures.concat(o.gestures)}return o},search:function(i,n={}){function a(e){return e.gestures.find(t=>i.split("|").some(e=>t.name==e&&(!n.hand||n.hand._d==t._d)&&(!n.hand_facing||n.hand_facing===t.hand_facing)&&(n.thumb_out==null||n.thumb_out===t.thumb_out)&&(!n.condition||t._condition_passed||n.condition(t)&&(t._condition_passed=true))))}var e=n.time_limit||0;var t;for(let i=0,o=this.list.length;i=n.duration)break}else break}if(e{const t=M.list;for(let e=t.length-1;e>=0;e--){if(t[e].timestamp>RAF_timestamp-3e3){if(eMath.max(...o);var a,s;if(n){s=e.hand_rot_YXZ[1];if(s<=20)a="Horizontal Left";else if(s>20&&s<=50)a="Diagonal Down Left";else if(s>130&&s<=160)a="Diagonal Down Right";else if(s>160)a="Horizontal Right";else a="Vertical Down";if(!e.thumb_out&&/Horizontal/.test(a)){a="";s=0}}else{if(!e.thumb_out){a="";s=0}else{const r=-(i[3][1]-i[1][1]);const _=i[3][0]-i[1][0];s=Math.atan2(r,_)*180/Math.PI-90;if(s<-180)s+=360;s=-s;if(s>20&&s<=60)a="Diagonal Up Right";else if(s>60&&s<=120)a="Horizontal Right";else if(s<-20&&s>=-60)a="Diagonal Up Left";else if(s<-60&&s>=-120)a="Horizontal Left";else a="Vertical Up"}}return[a+"\n"+(i[1][1]>Math.max(...o))+"\n"+e.hand_rot_YXZ.join("\n"),s]}var k=function(){var i,o,n,e,a;return function(){if(e!=RAF_timestamp){e=RAF_timestamp;i=null;a=[];s().then(async e=>{[o,n]=await Promise.all([e.title,e.region]);i=e;const t={w:i,title:o,region:n};a.forEach(e=>{e(t)})})}return new Promise((e,t)=>{if(i){e({w:i,title:o,region:n})}else{a.push(e)}})}}();var E=["0","1","2","3"];var x=[];var P=[];const I={get enabled(){return a},set enabled(e){if(a==!!e)return;a=!!e;if(a){A()}else{this.setMousePosition(null)}DEBUG_show("Motion control:"+(a?"ON":"OFF"),3)},get enabled_nut(){return r},get ready(){return a&&!d},get handedness(){return h},get off_hand(){return h=="左"?"右":"左"},get window_active(){return window_active},get _debug_msg(){return x},get debug_msg(){return a&&x.length?x.join("\n")+"\n":""},get Key(){return p},get key_pressed(){return f.pressed},gestures:M,get plugins(){return P},add_plugin:function(e){if(P.indexOf(e)==-1)P.push(e)},process:async function(t){if(!this.ready)return;if(t.posenet_data){if(!M.list.length||M.list[0].timestamp!=RAF_timestamp){M.list.unshift({timestamp:RAF_timestamp,gestures:[]})}x=["Motion control"+(S?"(PAUSED)":"")+":"];const e=t.posenet_data.handpose;if(e&&e.length){const _={};const l={};const d={};e.forEach(e=>{if(!e._used)return;const t=System._browser.camera.poseNet.frames.skin[e._d+"手首"];if(!t)return;const i=MMD_SA.TEMP_v3.setEulerFromQuaternion(t[0].rot,"YXZ");l[e._d]=i.toArray().map(e=>e*180/Math.PI);_[e._d]=Math.abs(i.y)1.3*Math.abs(Math.abs(l[e._d][1])-90)/90+.2});M.list[0].hand_rot_YXZ=l;M.list[0].hand_facing=_;M.list[0].thumb_out=d;e.forEach(e=>{if(!r)return;if(!e._used)return;if(S){M.estimate(c,e);const t=M.search("index_up",{duration:1e3,hand_facing:"front",thumb_out:false});if(t){S=false;h=t._d;DEBUG_show("Motion control:READY",2)}}else if(e._d==h){M.estimate(c,e);const t=M.search("index_up",{duration:1e3,hand_facing:"back",thumb_out:false});if(t){S=true;DEBUG_show("Motion control:PAUSED",2)}}})}}else if(t.facemesh_data){}P.forEach(e=>{e.process(t)});if(!r)return;if(S)return;this.virtual_mouse.process(t);this.game01.process(t)},setMousePosition:function(){var t;return async function(e){if(e===null){t=null;return}if(!a)return;if(!r)return;if(e){t=e}else if(!e){return}await i.setPosition(t)}}(),game01:function(){var t,e;var i={id:"PSO2NGS",L:{thumb:{release:["Space","X"]},thumb_index:{press:["X"],release:["Space"]},thumb_palm:{press:["Space"],release:["X"]}},R:function(){function e(e){const t=f.temp.index_middle||0;const i=e.thumb_out?1:0;f.temp.index_middle=i;return t!=i}return{index_thumb:{press:["Tab"],press_check:function(){if(!f.temp.index_thumb)f.temp.index_thumb={};f.temp.index_thumb.clicked=true;return true}},index_up:{press:["Q"],press_check:function(){var e=f.temp.index_thumb&&f.temp.index_thumb.clicked;if(e)f.temp.index_thumb.clicked=false;return e}},index_middle1:{press:["Period"],click:["Semicolon"],click_check:e},index_middle2:{press:["Slash"],click:["Semicolon"],click_check:e},index_middle3:{press:["Quote"],click:["Semicolon"],click_check:e},thumb_palm:{press:["Backslash"]}}}()};var d;var o,n;function c(){if(e)return;d=new fp.GestureEstimator([M.custom.index_up,M.custom.index_thumb,M.custom.index_middle,M.custom.index_pinky,M.custom.palm_open,M.custom.thumb,M.custom.thumb_index,M.custom.thumb_palm]);f.set_options(i);e=true}return{get enabled(){return t},set enabled(e){t=e;if(t){f.set_options(i)}else{}},process:async function(i){if(!this.enabled){await f.releaseKey();return}c();const a=await k();const e=await a.title;if(i.facemesh_data&&i.head_rot){let e=i.head_rot.x*180/Math.PI;let t=i.head_rot.y*180/Math.PI;let o=Math.round(Math.sign(e)*Math.pow(Math.min(Math.max((Math.abs(e)-8)/15,0),1),2)*40);let n=Math.round(Math.sign(t)*Math.pow(Math.min(Math.max((Math.abs(t)-10)/20,0),1),2)*40);x.push(e,t,n,o);Promise.resolve(a.region).then(async e=>{const t=await m(e);const i=e.width-1280<64?[1280,720]:[1920,1080];t.y+=Math.round((e.height-i[1]-(e.width-i[0]))/2);t.x+=n;t.y+=o;t.y+=1;t.x+=1;await I.setMousePosition(t)})}let t;if(i.posenet_data){t=i.posenet_data.handpose;let e="";if(!t||!t.length){t=null;if(M.search("palm_open",{time_limit:500,hand_facing:"front",condition:()=>{}})){e+="/CANCEL";await f.releaseKey()}else{await f.releaseIdleKey()}}x.push((t?"":"(no hand data)")+e+"/key active:"+Object.keys(f.pressed).filter(e=>f.pressed[e]).join(","))}if(!t)return;for(const n of t){if(!n._used)continue;const s=n._d==h?"R":"L";x.push(s+":");M.estimate(d,n);let i;i=M.search("palm_open",{hand:n,hand_facing:"front",condition:function(e){const t=this.hand;const i=g.fromArray(t.annotations.index[0]).sub(y.fromArray(t.annotations.index[3]));const o=b.fromArray(t.annotations.pinky[0]).sub(v.fromArray(t.annotations.pinky[3]));return i.angleTo(o)*180/Math.PI>30}});if(i){x.push("CANCEL");await f.releaseKey(...f.clear_list(s));continue}if(n._d==h){i=M.search("index_thumb",{hand:n,hand_facing:"back",thumb_out:true});if(i){await f.activate(i,s,i.name,f.clear_list(s));x.push("index_thumb");continue}i=M.search("index_up",{hand:n,hand_facing:"front",thumb_out:true});if(i){await f.activate(i,s,i.name,f.clear_list(s));x.push("index_up");continue}i=M.search("index_middle",{hand:n});if(i){let e=i.name;switch(i.poseData[1][2]){case"Vertical Up":e+=2;break;case"Diagonal Up Left":e+=h=="右"?1:3;break;case"Diagonal Up Right":e+=h=="右"?3:1;break}await f.activate(i,s,e,f.clear_list(s));x.push(e);continue}i=M.search("thumb_palm",{hand:n,condition:function(e){if(!/(Horizontal|Diagonal Up)/.test(e.poseData[2][2]))return false;const t=this.hand;const i=g.fromArray(t.annotations.index[0]).sub(y.fromArray(t.annotations.index[3]));const o=b.fromArray(t.annotations.pinky[0]).sub(v.fromArray(t.annotations.pinky[3]));return i.angleTo(o)*180/Math.PI<20}});if(i){await f.activate(i,s,i.name,f.clear_list(s));x.push("thumb_palm");continue}i=M.search("thumb",{hand:n});if(i){x.push("CANCEL");await f.releaseKey(...f.clear_list(s));continue}i=M.search("index_pinky",{hand:n});if(i){x.push("index_pinky");continue}}else{i=M.search("thumb_palm|thumb_index|thumb",{hand:n,condition:function(e){if(e.name!="thumb_palm")return true;const t=this.hand;const i=g.fromArray(t.annotations.index[0]).sub(y.fromArray(t.annotations.index[3]));const o=b.fromArray(t.annotations.pinky[0]).sub(v.fromArray(t.annotations.pinky[3]));return i.angleTo(o)*180/Math.PI<20}});if(i){const r=D(i,n);const _=r[0];let e=[];let t=[];switch(_){case"Vertical Up":e.push("W");t.push("A","S","D");break;case"Diagonal Up Right":e.push("W","A");t.push("S","D");break;case"Horizontal Right":e.push("A");t.push("W","S","D");break;case"Diagonal Up Left":e.push("W","D");t.push("A","S");break;case"Horizontal Left":e.push("D");t.push("W","A","S");break;case"Diagonal Down Right":e.push("S","A");t.push("W","D");break;case"Diagonal Down Left":e.push("S","D");t.push("W","A");break;case"Vertical Down":e.push("S");t.push("W","A","D");break;default:t.push("W","A","S","D")}var o=f.action(i,s,i.name);if(o.press.length)e.push(...o.press);if(o.release.length)t.push(...o.release);if(e.length)await f.pressKey(...e.map(e=>[p[e]]));if(t.length)await f.releaseKey(...t.map(e=>[p[e]]));x.push([i.name,_].join("/")+"/"+RAF_timestamp);continue}}if(!i)await f.releaseIdleKey(...f.clear_list(s))}for(const l of[[0,t.findIndex(e=>e._used&&e._d==h)],[1,t.findIndex(e=>e._used&&e._d!=h)]]){if(l[1]!=-1)continue;const s=l[0]==0?"R":"L";if(M.search("palm_open",{time_limit:500,hand:{_d:l[0]==0?h:I.off_hand},hand_facing:"front",condition:()=>{}})){await f.releaseKey(...f.clear_list(s))}else{await f.releaseIdleKey(...f.clear_list(s))}}}}}(),virtual_mouse:function(){var e;var t;function m(){if(e)return;t=new fp.GestureEstimator([fp.Gestures.VictoryGesture,fp.Gestures.ThumbsUpGesture,M.custom.index_up]);e=true}return{enabled:false,process:async function(e){if(!this.enabled)return;if(!e.posenet_data)return;m();const t=e.posenet_data.handpose;if(!t||!t.length)return;const i=t[0]._d==h?0:1;const o=h=="右"?0:1;if(!t[i]||!t[i]._used)return;const n=screen.width/2;const a=screen.height/2;const s=System._browser.camera.video_canvas;const r=s.width/s.height/(n/a);const _=.5;const l=t[i].annotations.index[0];const d={x:-(-s.width/2+l[0])/(s.width/2*_),y:(-s.height/2+l[1])/(s.height/2*_)};d.x=Math.round(n+THREE.Math.clamp(d.x*r,-1,1)*n);d.y=Math.round(a+THREE.Math.clamp(d.y/r,-1,1)*a);const c=new u(d.x,d.y);await I.setMousePosition(c)}}}()};return I}(),snapshot:function(){var i=false;var o=false;var n;var a;function s(){const e=MMD_SA.THREEX.SL;const t=System._browser.camera;var i=Math.ceil(3-(Date.now()-n)/1e3);if(i<=0){if(!t.visible){l(e);return}DEBUG_show("Capturing...");if(!t.stream){if(!t.bodyPix.enabled){r();return}o=true}else{t.target_devicePixelRatio=1;t.video_track.applyConstraints(t.set_constraints()).then(function(){System._browser.console.log("(Ready to capture)");System._browser.on_animation_update.add(function(){MMD_SA._renderer.devicePixelRatio=window.devicePixelRatio;MMD_SA._renderer.__resize(EV_width,EV_height);if(!t.bodyPix.enabled){System._browser.on_animation_update.add(function(){r()},0,1);return}o=true},0,0)})["catch"](function(e){DEBUG_show("ERROR:camera size failed to update");_()})}System._browser.on_animation_update.remove(s,0)}else if(a!=i){a=i;DEBUG_show(a)}}function r(){const e=MMD_SA.THREEX.SL;const t=System._browser.camera;let i=t.video_canvas_bodyPix;i.width=e.width;i.height=e.height;let o=i.getContext("2d");o.globalCompositeOperation="source-over";const n=t.video_canvas.width;const a=t.video_canvas.height;const s=Math.min(e.width/n,e.height/a);const r=Math.round(n*s);const _=Math.round(a*s);o.drawImage(t.video_canvas,0,0,n,a,(e.width-r)/2,(e.height-_)/2,r,_);if(t.face_detection.enabled)o.drawImage(t.video_canvas_face_detection,0,0);o.save();o.translate(i.width,0);o.scale(-1,1);o.drawImage(e,0,0);o.restore();l(i)}function l(e){i=true;o=false;System._browser.on_animation_update.remove(s,0);e.toBlob(function(e){if(webkit_electron_mode){System._browser.save_file("snapshot_"+Date.now()+".png",e)}else{const t=URL.createObjectURL(e);window.open(t)}_()})}function _(){const e=System._browser.camera;Ldebug.style.posLeft=Ldebug.style.posTop=0;Ldebug.style.transform=Ldebug.style.transformOrigin="";DEBUG_show();o=false;e.target_devicePixelRatio=0;i=false}const e={init:function(){if(i){return true}const e=MMD_SA.THREEX.SL;const t=System._browser.camera;if(MMD_SA.WebXR.session){let e=MMD_SA_options.WebXR&&MMD_SA_options.WebXR.AR;if(!e.dom_overlay||!e.dom_overlay.use_dummy_webgl){DEBUG_show("(No snapshot in AR WebGL)",3);return true}}if(!t.visible){l(e)}else{i=true;n=Date.now();Ldebug.style.posLeft=Ldebug.style.posTop=50;Ldebug.style.transformOrigin="0 0";Ldebug.style.transform="scale(5,5)";a=3;DEBUG_show();DEBUG_show(a);System._browser.on_animation_update.add(s,0,0,-1)}},check_bodyPix:function(){if(!i)return false;const e=System._browser.camera;if(o){l(e.video_canvas_bodyPix)}return true}};return e}(),video_capture:(()=>{const l=document.createElement("canvas");function r(){const e=u.get_specs();l.width=e.width;l.height=e.height;u._fps=e.fps;u.mime_type=e.mime_type;System._browser.on_animation_update.add(t,0,1,-1)}function t(){const e=MMD_SA.THREEX.SL;const t=l.getContext("2d");if(MMD_SA.music_mode){const i=SL_MC_video_obj.vo.media_linked&&SL_MC_video_obj.vo.media_linked.find(e=>e.id=="motion_bg_video");if(i&&i.style.visibility!="hidden"){const o=Math.min(i.videoWidth/i.videoHeight,l.width/l.height);const n=Math.round(Math.min(i.videoWidth,i.videoHeight)*o);const a=Math.min(n,i.videoWidth);const s=Math.min(n,i.videoHeight);const r=(i.videoWidth-a)/2;const _=(i.videoHeight-s)/2;t.drawImage(i,r,_,a,s,0,0,l.width,l.height)}}else{t.fillStyle=document.body.style.backgroundColor||"white";t.fillRect(0,0,l.width,l.height)}if(l.width==e.width&&l.height==e.height){t.drawImage(e,0,0)}else{t.drawImage(e,0,0,l.width,l.height)}}let _;function d(){if(!u.media_recorder||u.started)return;u.started=true;u.media_recorder.start();if(_&&u.stream.getAudioTracks().length&&(MMD_SA.music_mode?SL_MC_video_obj.vo.audio_obj.paused:MMD_SA.motion_player_control.enabled&&MMD_SA.motion_player_control.paused)){SL_MC_Play()}}function c(){System._browser.video_capture.stop()}var m=[];const u={enabled:false,started:false,fps:undefined,target_width:undefined,target_height:undefined,FFmpeg:(()=>{var e;var t;var n;var a;const i={enabled:webkit_electron_mode,load:async function(){if(e)return;e=true;return new Promise(o=>{n=new Worker("js/ffmpeg_worker.js");n.onmessage=e=>{const t=e.data;if(typeof t==="string"){if(t=="OK"){o()}}else{const i=new Blob([t.buffer],{type:t.output_type});return a(i)}}})},encode:async function(...e){await this.load();const t={inputs:[]};for(const i of e){if(i.blob)i.blob=await i.blob.arrayBuffer();t.inputs.push(i)}n.postMessage(t,t.inputs.filter(e=>e.blob).map(e=>e.blob));return new Promise(e=>{a=e})}};return i})(),get_specs:function(){const e=MMD_SA.THREEX.SL;const t=e.width*e.height;let i=this.target_width,o=this.target_height,n=this.fps;if(!i){if(is_mobile){i=1280;o=720;if(e.widthi*o){const _=Math.min(i/e.width,o/e.height);i=Math.min(Math.round(e.width*_/4)*4,i);o=Math.min(Math.round(e.height*_/4)*4,o)}else{i=e.width;o=e.height}const a=["video/webm;codecs=h264","video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];let s;for(const l of a){if(MediaRecorder.isTypeSupported(l)){s=l;break}}return{width:i,height:o,fps:n,mime_type:s}},start:function(){if(this.busy){DEBUG_show("(Media recorder still in use)",3);return}if(this.enabled)return;this.enabled=true;r();const e=this._fps==-1?undefined:this._fps;const t=l.captureStream(e);this.stream=new MediaStream;this.stream.addTrack(t.getTracks()[0]);this.audio_src=MMD_SA.music_mode&&SL_MC_video_obj.vo.audio_obj.src;if(this.audio_src&&(!this.FFmpeg.enabled||this.target_mime_type||!SL_MC_video_obj.vo.motion_by_song_name_mode||SL_MC_video_obj.vo.audio_obj.currentTime)){const n=SL_MC_video_obj.vo.audio_obj.captureStream();this.stream.addTrack(n.getTracks()[0])}this.file_ext="."+(this.mime_type.indexOf("x-matroska")!=-1?"mkv":this.mime_type.replace(/^.+[\/]/,"").replace(/\;.+$/,""));this.media_recorder=new MediaRecorder(this.stream,{videoBitsPerSecond:l.width*l.height*4,mimeType:this.mime_type});m.length=0;this.media_recorder.addEventListener("dataavailable",async e=>{m.push(e.data);if(!this.enabled){let e=new Blob(m,{type:this.mime_type});this.stream.getTracks().forEach(e=>{e.stop()});let t=this.file_ext;this.busy=true;if(this.FFmpeg.enabled&&/h264/.test(this.mime_type)&&!this.target_mime_type){try{DEBUG_show("Encoding MP4...");const o=[{name:"video",blob:e}];if(this.audio_src){const n={name:"audio"};if(!this.stream.getAudioTracks().length)n.blob=await fetch(this.audio_src).then(e=>e.blob());o.push(n)}e=await this.FFmpeg.encode(...o);t=".mp4"}catch(i){console.error(i);this.FFmpeg.enabled=false}}this.busy=false;m.length=0;DEBUG_show("🔴Video Capture:OFF",5);System._browser.save_file("video_"+Date.now()+t,e)}});const i=new Promise(e=>{_=e;this.media_recorder.addEventListener("start",()=>{DEBUG_show();DEBUG_show("🔴Video Capture:ON ("+(l.width+"x"+l.height+(u._fps>-1?"/"+u._fps+"fps":""))+"/"+u.mime_type+")",10);if(MMD_SA.music_mode?SL_MC_video_obj.vo.audio_obj.paused:MMD_SA.motion_player_control.enabled&&MMD_SA.motion_player_control.paused){SL_MC_Play()}_();_=null},{once:true})});DEBUG_show();const o=MMD_SA.THREEX.get_model(0).animation.time;if(o||(MMD_SA.music_mode?!SL_MC_video_obj.vo.motion_by_song_name_mode||!SL_MC_video_obj.vo.audio_obj.paused:!MMD_SA.motion_player_control.enabled||!MMD_SA.motion_player_control.paused)){d()}else{if(u.audio_src){window.addEventListener("SA_audio_onended",e=>{System._browser.video_capture.stop()},{once:true})}else if(MMD_SA.motion_player_control.enabled){const s=MMD_SA.THREEX.get_model(0).animation;if(s.enabled){s.mixer.addEventListener("loop",c,{once:true});s.mixer.addEventListener("finished",c,{once:true})}else{window.addEventListener("SA_MMD_model0_onmotionended",c,{once:true})}}const a=MMD_SA_options.reset_rigid_body_physics_step;MMD_SA_options.reset_rigid_body_physics_step=0;new Promise(e=>{DEBUG_show("(Resetting physics)",3);let t=60*3;System._browser.on_animation_update.add(()=>{MMD_SA.seek_motion(o,true);if(MMD_SA.THREEX.get_model(0).animation.enabled)THREE.MMD.getModels()[0].seekMotion(0);if(--t==0)e()},0,0,t)}).then(()=>{MMD_SA.seek_motion(o);if(MMD_SA.motion_player_control.enabled){MMD_SA.motion_player_control.pause()}else{jThree.MMD.pause()}MMD_SA_options.reset_rigid_body_physics_step=a;d()})}DEBUG_show("🔴Video Capture",3);return i},stop:function(){if(!this.media_recorder)return;if(!this.enabled)return;this.enabled=false;System._browser.on_animation_update.remove(t,1);const e=MMD_SA.THREEX.get_model(0).animation;if(e.enabled){e.mixer.removeEventListener("loop",c);e.mixer.removeEventListener("finished",c)}else{window.removeEventListener("SA_MMD_model0_onmotionended",c)}this.media_recorder.stop();this.media_recorder=undefined;this.started=false},pause:function(){if(this.started&&this.media_recorder.state!="paused")this.media_recorder.pause()},resume:function(){if(this.started&&this.media_recorder.state=="paused")this.media_recorder.resume()}};return u})(),hotkeys:(()=>{class s{constructor(e,t){this.id=e.id;this.index=t;this.config=s.config_by_id[this.id]=e;this.event={};this.accelerator=e.accelerator[t];const i=this.accelerator.split("+");i.forEach(e=>{if(/^(Cmd|Command|Ctrl|Control)$/.test(e)){this.event.ctrlKey=true}else if(e=="Shift"){this.event.shiftKey=true}else if(e=="Alt"){this.event.altKey=true}else if(/^[0-9]$/.test(e)){this.event.code="Digit"+e}else if(/^num([0-9])$/.test(e)){this.event.code="Numpad"+RegExp.$1}else if(/^[A-Z]$/.test(e)){this.event.code="Key"+e}})}static config_by_id={};static get_config(e){return s.config_by_id[e]}static accelerators={};static register(e,t,i){if(!s.unregister(e))return false;const o=s.get_config(e);if(i)Object.assign(o,i);o.accelerator=t;t.forEach((e,t)=>{s.accelerators[e]=new s(o,t)});return s.enable_global(e)}static unregister(e){const t=s.get_config(e);if(!t)return false;t.accelerator.forEach(e=>{if(s.accelerators[e].is_global){try{webkit_electron_remote.globalShortcut.unregister(e)}catch(t){}}delete s.accelerators[e]});return true}static enable_global(e,o){if(!webkit_electron_mode)return true;const t=s.get_config(e);if(!t)return;let n=o==null?!!s.accelerators[t.accelerator[0]].config.global_disabled:!o;o=n?false:s.is_global;let a=true;t.accelerator.forEach(e=>{const t=s.accelerators[e];t.config.global_disabled=n;try{if(o){if(!t.is_global&&!t.config.global_disabled)webkit_electron_remote.globalShortcut.register(e,()=>{SA_topmost_window.SA_OnKeyDown(t.event)})}else{if(t.is_global)webkit_electron_remote.globalShortcut.unregister(e)}t.is_global=webkit_electron_remote.globalShortcut.isRegistered(t.accelerator);if(a&&o&&!t.config.global_disabled)a=t.is_global}catch(i){}});return a}static remove(e){if(s.unregister(e))delete s.config_by_id[e]}static add(i){s.remove(i.id);i.accelerator.forEach((e,t)=>{s.accelerators[e]=new s(i,t)});s.enable_global(i.id)}static _is_global=null;static get is_global(){return this._is_global==null?true:this._is_global}static set is_global(e){this._is_global=e}static register_global(i){if(browser_native_mode){DEBUG_show("(Global hotkey is for app mode only.)",5);return}s.is_global=i==null?s.is_global:i;DEBUG_show("Global hotkey:"+(i?"ON":"OFF"),3);Object.values(s.accelerators).forEach(e=>{try{if(i){if(!e.is_global&&!e.config.global_disabled)webkit_electron_remote.globalShortcut.register(e.accelerator,()=>{SA_topmost_window.SA_OnKeyDown(e.event)})}else{if(e.is_global)webkit_electron_remote.globalShortcut.unregister(e.accelerator)}e.is_global=webkit_electron_remote.globalShortcut.isRegistered(e.accelerator)}catch(t){}})}}window.addEventListener("SA_keydown",o=>{const n=o.detail.e;Object.values(s.config_by_id).some(e=>{const t=e.accelerator.some(e=>{const t=s.accelerators[e].event;if(t.code&&t.code!=n.code)return false;if(t.ctrlKey&&!n.ctrlKey)return false;if(t.shiftKey&&!n.shiftKey)return false;if(t.altKey&&!n.altKey)return false;return true});if(t){const i=e.process(o);if(i!==false)o.detail.result.return_value=true;return true}})});return s})(),load_script:function(){var n={};var a=function(e,t){this.url=e;this.name=e.replace(/^.+[\/\\]/,"");this.loaded=false;this.resolve_list=[];this.reject_list=[];if(t){const i=this;import(e).then(e=>{i.module=e;i.check_loaded()})}else{const o=document.createElement("script");o.onload=this.check_loaded.bind(this);o.src=e;document.head.appendChild(o)}};a.prototype.check_loaded=function(){this.loaded=true;console.log(this.name+" loaded");this.resolve_list.forEach(e=>{e(this.module)})};a.prototype.make_promise=function(e,t){this.resolve_list.push(e);if(t)this.reject_list.push(t)};return function(e,t){var i=e.replace(/^.+[\/\\]/,"");var o=n[i]=n[i];if(o){if(o.loaded)return Promise.resolve(o.module)}else{o=n[i]=new a(e,t)}return new Promise((e,t)=>{o.make_promise(e,t)})}}(),save_file:function(){var a;return function(e,t,i){const o=!i?t:new Blob([t],{type:i});const n=URL.createObjectURL(o);if(!a){a=document.createElement("a");a.style.display="none";document.body.appendChild(a)}else{URL.revokeObjectURL(a.href)}a.href=n;a.download=e||"";a.click()}}(),update_obj_url:async function(t,i){if(/^(.+\.zip)\#[\/\\](.+)$/i.test(t)){const e=SA_topmost_window.DragDrop._obj_url[t];if(!e||t==e){const o=XMLHttpRequestZIP.zip_by_url(RegExp.$1);let e=await o.file(RegExp.$2.replace(/\\/g,"/"))["async"]("blob");if(i)e=new Blob([e],{type:i});console.log("Object URL (inside zip) updated",t);SA_topmost_window.DragDrop._obj_url[t]=SA_topmost_window.URL.createObjectURL(e)}}},skip_background_rendering:true,skip_rendering:false,rendering_check:function(){if(this.skip_rendering&&!this.hidden)return false;if(!returnBoolean("DisableBackgroundThrottling"))return true;const e=this.skip_background_rendering&&this.hidden;let t=document.getElementById("canvas_DisableBackgroundThrottling");if(e){if(!t){t=document.createElement("canvas");t.id="canvas_DisableBackgroundThrottling";t.width=t.height=1;t.style.position="absolute";t.style.posLeft=t.style.posTop="0px";t.style.zIndex=9999;document.getElementById("Lbody_host").appendChild(t)}t.getContext("2d").clearRect(0,0,t.width,t.height)}if(t)t.style.visibility=e?"inherit":"hidden";return!e},console:{content_list:[],log:function(){for(var e=0;e{var t,n,i;const o=navigator.language+"-default";var a;var e={ja:'"Meiryo UI"'};const s={get language(){return n},set language(e){t=e||o;n=t.split("-")[0].toLowerCase();if(t==o){i="System default"}else{switch(n){case"en":i="English";break;case"ja":i="Japanese";break;default:i="System default"}}},get language_full(){return t},get language_info(){return i},get language_default(){return o},get dictionary(){return a},set dictionary(e){a=Object.assign(a||{},e)},get font(){return e[n]},get:function(e,t=n){if(!a)return"(Now loading...)";let i=a;e.split(".").every(e=>{i=i[e];return i});const o=i&&(i._translation_?.[t]||i._translation_?._default_);return o!=null?o:"("+e+")"}};s.language=null;return s})(),DEBUG_show:function(){const t=self.DEBUG_show;self.DEBUG_show=function(...e){if(System._browser.overlay_mode>0){if(!e.length)t()}else{t(...e)}};return t}()},_hash_sha256:{_hash_cache:{},hash:function(e){if(webkit_electron_mode){var t=webkit_electron_remote.getGlobal("HASH_SHA256");if(t)return t.hash(e)}var i=this._hash_cache[e];if(i)return i;var o=require("crypto").createHash("sha256");o.update(e);i=this._hash_cache[e]=o.digest("hex");return i}},_media_objs_paused_:[],_gadget_resume:function(e){if(e&&!SA_topmost_window.EV_sync_update.RAF_auto_paused)return false;if(!SA_topmost_window.EV_sync_update.RAF_paused)return false;SA_topmost_window.EV_sync_update.RAF_paused=false;SA_topmost_window.EV_sync_update.RAF_auto_paused=false;SA_topmost_window.System._media_objs_paused_.forEach(function(e){if(e.SL_MC_Play)e.SL_MC_Play();else if(e.paused)e.play()});SA_topmost_window.System._media_objs_paused_=[];System._browser.update_tray();return true},_gadget_pause:function(e){if(SA_topmost_window.EV_sync_update.RAF_paused)return false;SA_topmost_window.EV_sync_update.RAF_paused=true;SA_topmost_window.EV_sync_update.RAF_auto_paused=e;var s=SA_topmost_window.System._media_objs_paused_;var t=[top];for(var i=0;i