nadesiko3 3.3.76 → 3.3.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/package.json +3 -3
- package/core/src/nako3.mjs +6 -6
- package/core/src/nako3.mts +6 -6
- package/core/src/nako_core_version.mjs +2 -2
- package/core/src/nako_core_version.mts +2 -2
- package/core/src/nako_gen.mjs +11 -1
- package/core/src/nako_gen.mts +7 -1
- package/core/src/plugin_system.mjs +19 -2
- package/core/src/plugin_system.mts +20 -3
- package/core/test/array_test.mjs +3 -0
- package/package.json +1 -1
- package/release/editor.js +1 -1
- package/release/editor.js.LICENSE.txt +475 -29
- package/release/nako_gen_async.js +2 -1
- package/release/plugin_caniuse.js +2 -1
- package/release/plugin_datetime.js +2 -1
- package/release/plugin_kansuji.js +2 -1
- package/release/plugin_markup.js +2 -1
- package/release/plugin_turtle.js +2 -1
- package/release/plugin_webworker.js +2 -1
- package/release/plugin_weykturtle3d.js +2 -1
- package/release/stats.json +1 -1
- package/release/version.js +1 -1
- package/release/version.js.LICENSE.txt +363 -29
- package/release/wnako3.js +1 -1
- package/release/wnako3.js.LICENSE.txt +219 -1
- package/release/wnako3webworker.js +2 -1
- package/test/node/plugin_test.mjs +1 -2
- package/test/selenium/requirements.txt +2 -2
package/release/plugin_turtle.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
!function(){"use strict";const t={"初期化":{type:"func",josi:[],pure:!0,fn:function(t){t._turtle||(t._turtle={list:[],target:-1,ctx:null,canvas:null,canvas_r:{left:0,top:0,width:640,height:400},clearAll:function(){const t=this;console.log("[TURTLE] clearAll");for(let e=0;e<t.list.length;e++){const n=t.list[e];n.mlist=[],document.body.removeChild(n.canvas)}t.list=[],null!==t.canvas&&t.ctx.clearRect(0,0,t.canvas.width,t.canvas.height),t.target=-1,t.flagSetTimer=!1},drawTurtle:function(t){const e=this.list[t];if(!e)return;const n=this.canvas_r;if(e.canvas.style.left=n.left+e.x-e.cx+"px",e.canvas.style.top=n.top+e.y-e.cx+"px",e.f_update&&e.flagLoaded&&(e.f_update=!1,e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.f_visible))if(270!==e.dir){const t=.017453292519943295*(e.dir+90);e.ctx.save(),e.ctx.translate(e.cx,e.cy),e.ctx.rotate(t),e.ctx.translate(-e.cx,-e.cy),e.ctx.drawImage(e.img,0,0),e.ctx.restore()}else e.ctx.drawImage(e.img,0,0)},getCur:function(){if(0===this.list.length)throw Error("最初に『カメ作成』命令を呼び出してください。");return this.list[this.target]},flagSetTimer:!1,setTimer:function(){this.flagSetTimer||(this.flagSetTimer=!0,console.log("[TURTLE] standby ..."),setTimeout((()=>{console.log("[TURTLE] Let's go!"),t._turtle.play()}),1))},line:function(t,e,n,i,r){if(t&&!t.flagDown)return;const c=this.ctx;t.flagBegeinPath?c.lineTo(i,r):(c.beginPath(),c.lineWidth=t.lineWidth,c.strokeStyle=t.color,c.moveTo(e,n),c.lineTo(i,r),c.stroke())},doMacro:function(e,n){const i=this;if(!e.flagLoaded&&n>0)return!0;const r=e.mlist.shift();switch(void 0!==r?r[0]:""){case"xy":e.x=r[1],e.y=r[2];break;case"begin":this.ctx.beginPath(),this.ctx.moveTo(e.x,e.y),e.flagBegeinPath=!0;break;case"close":this.ctx.closePath(),e.flagBegeinPath=!1;break;case"fill":e.flagBegeinPath&&(this.ctx.closePath(),e.flagBegeinPath=!1),this.ctx.fill();break;case"stroke":e.flagBegeinPath&&(this.ctx.closePath(),e.flagBegeinPath=!1),this.ctx.stroke();break;case"text":this.ctx.fillText(r[1],e.x,e.y);break;case"textset":this.ctx.font=r[1];break;case"fillStyle":this.ctx.fillStyle=r[1];break;case"mv":{i.line(e,e.x,e.y,r[1],r[2]);const t=Math.atan2(r[2]-e.y,r[1]-e.x);e.dir=57.29577951308232*t,e.f_update=!0,e.x=r[1],e.y=r[2];break}case"fd":{const t=r[1]*r[2],n=.017453292519943295*e.dir,c=e.x+Math.cos(n)*t,s=e.y+Math.sin(n)*t;i.line(e,e.x,e.y,c,s),e.x=c,e.y=s;break}case"angle":{const t=r[1];e.dir=(t-90+360)%360,e.f_update=!0;break}case"rotr":{const t=r[1];e.dir=(e.dir+t)%360,e.f_update=!0;break}case"rotl":{const t=r[1];e.dir=(e.dir-t+360)%360,e.f_update=!0;break}case"color":e.color=r[1],this.ctx.strokeStyle=e.color;break;case"size":this.ctx.lineWidth=e.lineWidth,e.lineWidth=r[1];break;case"penOn":e.flagDown=r[1];break;case"visible":e.f_visible=r[1],e.f_update=!0;break;case"changeImage":e.flagLoaded=!1,e.img.src=r[1]}return e.flagLoaded&&t._turtle.drawTurtle(e.id),e.mlist.length>0},doMacroAll:function(e){let n=!1;for(let i=0;i<t._turtle.list.length;i++){const r=t._turtle.list[i];this.doMacro(r,e)&&(n=!0)}return n},play:function(){const e=this,n=t.__v0["カメ速度"];let i=this.doMacroAll(n);if(n<=0)for(;i;)i=this.doMacroAll(n);else if(i)return void setTimeout((()=>e.play()),n);console.log("[TURTLE] finished."),e.flagSetTimer=!1},setupCanvas:function(t){let e=t.__v0["カメ描画先"];"string"==typeof e&&(e=document.getElementById(e)||document.querySelector(e),t.__v0["カメ描画先"]=e),console.log("カメ描画先=",e);if(!(t._turtle.canvas=e))throw console.log("[ERROR] カメ描画先が見当たりません。"+e),Error("カメ描画先が見当たりません。");const n=t._turtle.ctx=t._turtle.canvas.getContext("2d");n.lineWidth=4,n.strokeStyle="black",n.lineCap="round",t._turtle.resizeCanvas(t)},resizeCanvas:function(t){const e=t._turtle.canvas.getBoundingClientRect(),n=e.left+window.pageXOffset,i=e.top+window.pageYOffset;t._turtle.canvas_r={left:n,top:i,width:e.width,height:e.height}},createTurtle:function(t,e){e._turtle.setupCanvas(e);const n=e._turtle.list.length,i={id:n,img:null,canvas:null,ctx:null,dir:270,cx:32,cy:32,x:0,y:0,color:"black",lineWidth:4,flagDown:!0,flagBegeinPath:!1,f_update:!0,flagLoaded:!1,f_visible:!0,mlist:[]};return e._turtle.list.push(i),e._turtle.target=n,i.img=document.createElement("img"),i.canvas=document.createElement("canvas"),i.ctx=i.canvas.getContext("2d"),i.canvas.id=n,i.img.onload=()=>{i.cx=i.img.width/2,i.cy=i.img.height/2,i.canvas.width=i.img.width,i.canvas.height=i.img.height,i.flagLoaded=!0,i.f_update=!0,e._turtle.drawTurtle(i.id),console.log("turtle.onload")},i.img.onerror=()=>{console.log("カメの読み込みに失敗"),i.flagLoaded=!0,i.f_visible=!1,i.f_update=!0,e._turtle.drawTurtle(i.id)},i.img.src=t,i.canvas.style.position="absolute",document.body.appendChild(i.canvas),i.x=e._turtle.canvas_r.width/2,i.y=e._turtle.canvas_r.height/2,n}})}},"!クリア":{type:"func",josi:[],pure:!0,fn:function(t){t._turtle.clearAll()}},"カメ作成":{type:"func",josi:[],pure:!0,fn:function(t){const e=t.__v0["カメ画像URL"];return t._turtle.createTurtle(e,t)}},"ゾウ作成":{type:"func",josi:[],pure:!0,fn:function(t){return t._turtle.createTurtle("data:image/png;base64,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",t)}},"パンダ作成":{type:"func",josi:[],pure:!0,fn:function(t){return t._turtle.createTurtle("data:image/png;base64,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",t)}},"カメ操作対象設定":{type:"func",josi:[["に","へ","の"]],pure:!0,fn:function(t,e){e._turtle.target=t},return_none:!0},"カメ描画先":{type:"var",value:"turtle_cv"},"カメ画像URL":{type:"var",value:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAB9VBMVEVHcEyZZjOaZTGYZzGZZjOYZTIAiFUEjlWZZjKaZjMFjlMGjlOaZjMHjVOcYzEAjFIGj1QFjVQFjVMFjVGyfzOYZTOcazKWZjKZZTIGjVOYZDCcaTOZZjIbiE6gbTIDjlR1cTklhU38yTTI/scGjlQ8yTtl2WRT0lIyxjFi2GF233U3xzZz3nJw3W9V01Rd1lyJ5oh/4n5Lz0pDzEI/yj584Xtb1VovxC6C44FZ1Fhn2WZQ0U+E5INr22qX65ZFzURHzUZBy0CS6pGo8qdJzkkqwyk5yDiM54tO0E1X01Y0xjOc7Ztp2mij8KKl8aSr86pNz0wmwSV64HmV6pS09rO5+LgHkVGZ7Jiu9K2297Uswysowief7p4iwCFu3G3D/MIfvh4QuQ+G5YXB+8ARpTiP6I6x9bAYvBcKtgl433eO6I1t22xg119ipEjjsDO8+buh76BDnEwUuhMcvRu+ujyI5YfG/cVf1l7KlzOR6ZAVnVAasi+vfDO/+r4kwCS+izMVkVIPrSQToz8FpSIIlEwarTfvvDO3hDPsxTYcrTwpvy4KmUb1wjMOmU0FjU3YpTMxvT/EkTMMtBIHnjSkdTPptjMapkeBq0Qps0c0mU4Lm0IjtzTQnTM8wE1Vn0maaTMiqU8Joi+Qr0Jnez+fskAFrBUEkTpCX988AAAAInRSTlMAXz8vD58PP3+/78HP3x8ff4+fL+9v79/3r0+vj3TfTz/fnOJEOAAAB65JREFUWMO1l2dTW1cTx6mmGzABj1ueJ/JR770XEKCKEJK4EkISICwZVJBsUxNaaLaxscGOe039nNlz7hWSmGQCmcm+k4f9+b/l7O6tqfkvrfZmS0vLjeb6f+ne++3J8wWwjw/b6/6Fe8ONVVbJnm41XxzQuMCqsNXai/o3f2RV2cMLRtHwTbU/62nLxQA3F84AWKvXLwT49qw/61XjhSJYZ7EWf3lzj7E3vyyyWO0XAfz/1zxCiPqeMQp+5H+9dG73zu5W9P3XT34jl8s1Gp3+QZvy7esj1NrdeS73S92t1NdPRq7EpcfmknC5ToXNqjp+TbV2n0NFUwf1ddAocWmkKzlsK1KN3sU1KmxKlfA11dH0T/5X0NEnJxfccxyOweD1Ggwcfk6qcXGdg1bV8PERuvI3jpfr6urqay61obcKo0Qv5XMM5mxCDJbImoEh1UuMCiC4H6O2S5ebwS5XuzeuY7vaRh2DfP0KuCdEIoFgfl4gEIjEWS8nByII4QPV8eVkdfXkS2ND2f/6N09Js3ymjm1Orj7H8SZEgnm1Wo5NHQCE2cCXurh+IPA+UHnyxx/LzV3PNH4evbX6ufD/g/+8Wq4zJcFMJp1cPS9KeDkreqxByNtHNOH5zRLg6gH5hzforXLQ6JJi/4Bcl5Q5HJlMxuGQJU3ygEBs5qxAFEq2ULuP3hCHLeaF1j4kPxfRaxUI0PAN2N+05EgNBIMWS3BgLSNL6tSYIHUZB/vZ7ugOWqx8Ho3P8a9H20fD/SBghWPG/rLMgCXsIWYJrjmWTEDwcqQSpw2CmHyy/Qj79NGAFvJ089QxW6kAAV6xQG2SpYIWT6w44vONFGOASMkIga+BNICETTqRXyoULKLHQpXNKZFiAbpkJhiOFX32UWz2kZiHJiQMORzEMG/yDg7iKQOo3QLAvT3ecL/N6MoZEgK5yTFgiY3YR9PpUCiUjoz6ih5LSqYLiCANEj+RsHePxVpgCtnQdwAC9gEwyNVDBAH5UsriGbFH0hPjhUJhfCIdsRc9wUxSPi825PS0hH2QsFWatNfXD/LUEI+kACJQg4BwzB4JjRc2ZqdmNwrjISCEBxwmtSjLkeJSuqNxKv+qPGJqH27vDLkBACnIQgodQc/IaHp8Y2r5NtjUBhB8MUtqiUhwGaEQ2rE72+0VvXwL/RB1s61+AEAKkilLzBcJFWZv07a8MZ4eHfEEsQQzFILE8AP6X8Vj6kLxCgCkIGYHAcu3TwkTETtISMoFCZxGJZs3FEddFYC2J/EhGoCLsLQWLgKgJABHUQiBhAEoBI7BCS8iuvmkrQKA7sRxEksKADCaLkyVAViCj47By9czSUAVY5ABKEohnAXcnh1PQwyZpFrAJEELvVQekE3ox+lJ6ANcxiydxOoQGABOQpYD7awkWWyqAoxpcSNp+LgPMgCIjG9UAKYAUAxDIUkWFTiLZwAPxrTwFoz6nFdE+gCXcblaQRng/yvAJq6j07ViEM/rZCSLFTHgTrCTVioB3GcBd+OlXsZJyNCdNFUu49lGqAb0AGB6UiuEgQKvCZ6zbAB3wkSJAAJCTCtCEk9z0FPRBz/fhxiEKqtTsoJbCeYBfg0Thdmp5eXlqY1C+TmZSRUAUNkHNa0vZ05j4OOJIluDIEbT+EFu4OcIbyFGjwRoJPIYhnZaK1v5/czdaVIHnMaEgH7RvtFIOjQxMREKwUyJgQBIQXkiVLVyF5q7T+rATMV5eZIZSpFIGkaS3Uemmo4MBJeTtHLVY2pCuzMkjadjkRA8sRGfHcyHB+uawwTzAM9VGGpCbWURaurbt18SCTw2LkTOkCWEVDDsicWKxVjMEw6mIICAKEEigBxGd7YbK1bbQf7ZHJMFqwKWI71bZJk12CzhcBi2C/jr6MGOVwPkkMqfnBLaF2Co7oIEKMQwDoLZTni7pdYGBtZSGdgscrKc8IKk11t5qNav47FOS4A89g8SQlYkIPtVhi2JNyz4G3JYANQgisf6q6vMVXtCFssuEOKQRzZsWIkmxzGL8YqW63R4P+MFjXe8RoIzQAtgsX6ir4xmcpZ/fjaHg6AJTgk+ErJiuBICarU6EIAzI1G+MniH1Gfss06v595Vern+MTcDlRjiEQIXnzlec0IsIiZOwKGD/f02WM/a9/RyZRTU0+v9NxLENE2w+bn0peQ1E/OCO9xJxF/Ie4x+wx4HTA5qWg6YA+X3U0K/VQG3ml6a4/M5YHz6UoNjD/t/YE6U08+QOloC692z3+fuY4LWzVYpbQpybGqkYBpyK8KlR/ypd+TPFypWG31kPXr3bLdEwCJsCidcuxJscPP68a2J9VPvSAKe36hYbbV9W/B1tdXXhgghPhnlCYfZ/UrboELhdzqdfoUCDuZ+1TCO/7ufVsH6qj+jGnrhA6+3AQ7V3Rczdx/Ex4a0GKHqV1qtVpvNagVv9rDQffgYTtV6uDN7G/7mYu1GT17MYBEY4QYGW0WMjd15h0eo+5+O5Z4O6uWL+3cfTG+ODUWB4RYSc7t52sMdqqPnHOf+FbT3M0HExyaBwVj0cGcPXTnfR0fnNYRe/kgQ8c2xsUmwzf0dhK51nv+bpasVob33dxh7v4dQa1fnxT78em5d60CMdVy71VPzX9mfgxDe5Qu9BEIAAAAASUVORK5CYII="},"カメ画像変更":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["changeImage",t]),e._turtle.setTimer()},return_none:!0},"カメ速度":{type:"const",value:100},"カメ速度設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,e){e.__varslist[0]["カメ速度"]=t}},"カメ移動":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["mv",t[0],t[1]]),e._turtle.setTimer()},return_none:!0},"カメ起点移動":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["xy",t[0],t[1]]),e._turtle.setTimer()},return_none:!0},"カメ進":{type:"func",josi:[["だけ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["fd",t,1]),e._turtle.setTimer()},return_none:!0},"カメ戻":{type:"func",josi:[["だけ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["fd",t,-1]),e._turtle.setTimer()},return_none:!0},"カメ角度設定":{type:"func",josi:[["に","へ","の"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["angle",parseFloat(t)]),e._turtle.setTimer()},return_none:!0},"カメ右回転":{type:"func",josi:[["だけ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["rotr",t]),e._turtle.setTimer()},return_none:!0},"カメ左回転":{type:"func",josi:[["だけ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["rotl",t]),e._turtle.setTimer()},return_none:!0},"カメペン色設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["color",t]),e._turtle.setTimer()},return_none:!0},"カメペンサイズ設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["size",t]),e._turtle.setTimer()}},"カメペン設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["penOn",t]),e._turtle.setTimer()}},"カメパス開始":{type:"func",josi:[],pure:!0,fn:function(t){t._turtle.getCur().mlist.push(["begin"]),t._turtle.setTimer()}},"カメパス閉":{type:"func",josi:[],pure:!0,fn:function(t){t._turtle.getCur().mlist.push(["close"]),t._turtle.setTimer()}},"カメパス線引":{type:"func",josi:[],pure:!0,fn:function(t){t._turtle.getCur().mlist.push(["stroke"]),t._turtle.setTimer()}},"カメパス塗":{type:"func",josi:[],pure:!0,fn:function(t){t._turtle.getCur().mlist.push(["fill"]),t._turtle.setTimer()}},"カメ文字描画":{type:"func",josi:[["を","と","の"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["text",t]),e._turtle.setTimer()}},"カメ文字設定":{type:"func",josi:[["に","へ","で"]],pure:!0,fn:function(t,e){(t=""+t).match(/^\d+$/)?t+="px serif":t.match(/^\d+(px|em)$/)&&(t+=" serif");e._turtle.getCur().mlist.push(["textset",t]),e._turtle.setTimer()}},"カメ塗色設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,e){e._turtle.getCur().mlist.push(["fillStyle",t]),e._turtle.setTimer()},return_none:!0},"カメ全消去":{type:"func",josi:[],pure:!0,fn:function(t){t._turtle.clearAll()},return_none:!0},"カメコマンド実行":{type:"func",josi:[["の","を"]],pure:!0,fn:function(t,e){const n=e._turtle.getCur(),i=t.split(/(\n|;)/);for(let t=0;t<i.length;t++){let e=i[t];e=e.replace(/^([a-zA-Z_]+)\s*(\d+)/,"$1,$2"),e=e.replace(/^([a-zA-Z_]+)\s*=/,"$1,");const r=e.split(/\s*,\s*/);n.mlist.push(r)}e._turtle.setTimer()},return_none:!0},"カメ非表示":{type:"func",josi:[],pure:!0,fn:function(t){t._turtle.getCur().mlist.push(["visible",!1]),t._turtle.setTimer()},return_none:!0},"カメ表示":{type:"func",josi:[],pure:!0,fn:function(t){t._turtle.getCur().mlist.push(["visible",!0]),t._turtle.setTimer()},return_none:!0},"カメクリック時":{type:"func",josi:[["を"]],pure:!1,fn:function(t,e){t=e.__findVar(t,null);const n=e._turtle.target;e._turtle.list[n].canvas.onclick=n=>(e.__v0["対象"]=n.target,t(n,e))},return_none:!0}};"object"==typeof navigator&&(navigator.nako3,1)&&navigator.nako3.addPluginObject("PluginTurtle",t)}();
|
|
1
|
+
/*! For license information please see plugin_turtle.js.LICENSE.txt */
|
|
2
|
+
(function(){"use strict";var __webpack_modules__={"./src/image_turtle-elephant.mjs":function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){eval("__webpack_require__.r(__webpack_exports__);\n// file:turtle-elephant.png\n/* harmony default export */ __webpack_exports__[\"default\"] = ('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAq5pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTctMDUtMjVUMTM6MzU6NTNaPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBGaXJld29ya3MgQ1MzPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE3LTA1LTI1VDEzOjQyOjMxWjwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgplPlLSAAAOCElEQVRoBb1ZaWxU1xW+896bxdvYHu8b2AaKF7AxJixpQhwWB0KDkiZBaqQ2aZNI7Y9GaqM2an60jvqjqdofqaqqUtqkqVLaJgRBgCZhNSRsIRgCxmCMDcaAF2zGNvaM7Vn7fXfem9jYMx5D0yNdv+f77jn3O+eec+65d4S4OzKBTXv66afVCOxJ6M9Fm42Wj5aMpqBNoLq6OvZpaJR3V3Q3jJzQN262VLyvqFy4cFlWVmZlQkJCkdVmS9NUNVGIoFmYFH/A7xseHRtzulzuDuetvrNfNJw+Bp7jaD2GnJqaGu3gwYN+/B80+mJ5zkQBFRYLogV0wWtXLFv63YKC/NqMjIyspCS7sFiA1xQydDD4FQ6TKTQN+7xerxgaGhJ9fX39XV1d+w99dvhdyNuFZsi900BR9YhJAd06htXXrV5V82pxUfGDAC40TRMBEMD50Ux4MYkQeBO0gT3DigQVRQlCGTa8Kqrf7xe3bt0SV9rbv9y9Z+9vgfTfRDuT1ZhOARP8XNmyZQuXdu79y5a+Ub5gwYbsrCx4rSkAAH4AVgFSmt2wNEFEI64ExgbYoIhJMZnUPihy7lzjoU8PH/0peE/RGCS8GyszpchoChCUwfzck99+4s+lJSU2TkrcIC0kPySXoKai8WOm+q4r41dVmQ/UtrY2seW993+G5f69Pn48jkkiIilAabS6mJWf84d16x59KQtWB3CvDjzMpwMQqqqE/d+Yhd8wXjb2RVOGY7EaXihi7u93iu3btv71elfvi7qsiEpMlQbDg8vLSjZvfGzjC6mpDj+Cjyam1SeAp+X4YWhoWPT398s2ODgoRkZGqLBQESNmM4PbJBUZx65jCz30fsZFIDExyV9UPGfJYL+zsM/Z/yFGcArimrTMYTAhMcKkWzRYMm/OOxu+9dizSIvesbExjb6qj5EPjmMA3759W1xoOicGezrhcF7MEhqG2BAmzSJs9hSRlVcg8vLyBGRJpfQ5xoub8I5VC1osVp/bNWzeuWvnWy2tl18AD3SUsicoQa3CxIDFoGBKvOW1tbWPPBsfHx8RPC3PdHj00AEx2tspUpPtwuFIFymONNkcaXhPShSaZ0R0NJ0SR+r3ictXrsiVgDEQ9xNwhDHwhcbyeMa0hMREX23tI8+j6xXiQnaa5DHhjhq4x0fnz9PvH/3OM8+8mZmZFfR4PJA10fL4LkEQwJkvTwuT+7ZITE4VPrgL+yY0jFWgaFx8grAiRjouNolhX0BANkHKsbpVKXYCod9EF+SqFc6etfbM2cYT7e3tLRjEfcJILsJQQGkPBa19w6PrPykpKbH7fD4/ZBjfw8IJkK7TPzAg2hpPi5SUFOHzeacNUFYLdija29Em3Jg+Kys7LDPSC5XAfH6Hw6EkJSQ83NLa+hbGjqCF40G6EJZGPucWF/2qvKwsDz7oBSM1jUgDCFgzXJKOgHkijvvqQ2gXzsjOFTeaG8XN3l5kLm4hkV2JvMx6aJ6y8vLc+XOL69hn4OU7Laxiaeg6pbW1tW9nZmaqsD5jYUpU7Ga73nFVeF2DyDCWaUFwIhIlEq4Gd3J7fCInl/VedOJcUMBktVhMtri46sZzTe8Dby+4iD2oIHClhCVVlS8XFc620PpY7SnBG1PRaj7UNKx7otvP4PjqGcS+YLPFCWfXNZkEYlkFcKMiDHhnz55tXryo4mVKM3AbZULOnLnzntI0M9OcOg3+EBqa8y6IyqMSEqrfJ+ugCAs9QbK+CthSNDF33jdo8Xy9vIEkUFpq4uPI08kQzoJN9rH/6yCCoRIWq1VgoxKwbEwxBB6F+PJzc1NysjKeJDbGggRbtfi+jYmJCVF3yvHKcJPyeT0yFc7YhyCICmjYnUdcw8Lv88WkgL4KAnuDWFhRsZF46uvr/VQgLT0tvZppDv4/rfWlBWE1r8cjXSEUlhQXOxmZi+CpTKwEwzG5iDRH2mLwZONdlsHlycn2DICXcmMVdjeWN2QzejAf3MiGVZw+lRp80Jb7QgB7Twr6FrBfyctML0XxxHem0oiRSUuNtxaK+MiDKS0KMXv5sILxSUko9magAPABgz8RbjSvuLicUyg5+fkFPAqOB3fn3Fw2o6LkN1ovIH33LtIoDMEEhjOyYL0En7hzuoj/S/cFP/GmZ6QVcaCSkJCYqaoaFWC5N4mZfTzHdnd3h4Ocvob1mDQ2lg6mUCYAs92B4EuX1WksfMYYGppuh2BOZx+DVvoPnpPQczAVaG1tFX95621x/fp1mXlYiKnYMwJBpEBKiZEoD7cVODM4xZySMmFDKuVqTmW4KCIxHB6hag6OoQIRTcmBnLSvjzu3kBsPd1KCiEtIlEWc9Af5NfofCR5KDw0OCEfBHJGfny+tP0PwxCNthlKfMZCgwMaD+tSTFOGktHZhYZGIQ2lXUFAgtWVfWkamGB0dlT7McdFIgkfeH3UPC58lXixcVCXlTsc3lUzwKMyYWdnZs/B9uZqelrq8qKhoJUDBuAGZZw1GYwWSkpKC1UuWBvHkkksL2Gw2cb2rW2jYvBVs8VyZqazJPpYArtsDYtRkFssefEgk6iezqcYbc0d5gs3kHxgYUPr7eq8onZ03rjFIQZHcOYAMRPDAqfFCBzqwILOJsopFoqenm7lNnn0JiCmSgcqDjIonDtPiZnensDiyxf01q4QdRkC1O6WyUUCHP3EOzn/t2jW6cbHW1dN3yeVyibi4OCMewopgMO9uFF4+4QDTi6DLyMnJgQ4KsqhPwbuoWrlWnDn+mbDH2YTZEiqtuRpeZBqvPyhsKWmifEWNPBOD757A0+V0GUG32y3MmurhoeUizraDOAfwApZHNUMBXjoply5dcr+35YMfon8r2vKnnnj8g9LS0lQI4/2QMmvWLJFk3yCuXr4MH3fB+nAZnBEy7Mki1eGQJzbU8hI4j4i04L0Q+UdGR0wDA04ciLTrtHrn4MDAeQoFXnnWBLgg6vQgbxwA/lV8ere+rs6D54EPtm2vG0YRBndCaYKiDu6Qip29oqpKLFm+QlQvXS4WVS8R8+fPF5m8eoQr6S56z+Axf5Bu6RoaHmq60HJyzOs5RQXE1Y6r+3B1wgmInU9aX70aOkT/kWMerqsz7kbf6+7ucWKMPFzTIlTCCGL+j1wn+2R/SB5F3DMRF8AJXEN2QNjK5uZLO6UCjU0XPuzp6SFwMzXgQAaKs9+5BwMDiysr9iXHm1/QEfQA7JAEqu8h+vsEgOybqn/CoBn8Q8PSQ3hh1tJykZddI5s2bcJ6hKihq7PzGCeE6/CWGWMVkZiUVGUV4s3Va9as/t73X/zLmtUPf4bhNTiM0Pqke3PokIxY/xKU+caNG97mltZ/kQmnMqHU4IcF/rN73/4/OZ0MDFkdyiu+stKyb/7opR+/aLFYvKmpqf6KBQsfwNDVSKuTrlso4+siWh+44JE+cbG5eTPmacaZmBj8iv6rCOfe3HKppQFPXiPinsqvWK3WIEpXnDt8vNpQXW73EL67oUAqXQz0/1qBABQwoyZzN3x55jVOTOuT6EKsA+Qq7N134Jfd3V3MMDh/hgpUgEfgK8xKvLDt53goZoUC0esHDPxfEK0Pg/l5jbnnkx2/hsx23Wt4fpEK8OnTl+Sjz0+c+DuvFM1mjZdbRiBKsNi+Wxz2eAs2PfZHPACRD8SbPR8b3/U+9sdM5IExPUjD5iNHDn8y6PK9TuZxXhO+WhTnz5+nOwR7bvbujbNaN6FazMDkY3AlpHLVBz9S9x/Y/7f5JaVpRUXFy7ECVGBSLGBSrJYWwMQq+LF4yMf48QDv/FUED+bZ6ckAj6fl2PGj544c+7wWXKx5OKf0X0oxsgnf2cn/XXsP1D9ujbMdXVy12I75PQBg4S8nV65e21q5aNEb6GMpPAkIwQO4aXh4WL3c1tYyMjp6Crx2xFFlbm5uHotB8IXvyTnpVETwmMMLXS2nTp/qPXjo8AaMc6ERn7EfSdbxCrCDH9nXtOs/Hz/g8XjfL5k/v4R1xxdfnPgF+i9aLdYFnADNSMHoxtKFljuIusn0z3+887tBl+fn8kPoD7Kx+MnzP3juN9m41J1OCYD3QXHz2bNnXR99vHsNeDvQzGiy6sQzTHcqwA+GEo179u6rRKP2DN6DaGWoQjN1BSZ4AyfFd63xXOPHBnjGVXl5OX+aHcO31y+3ttXk5uQ+An4f2qS5KVcHr51rbBz9cOcugj9bXV1tbmhomAQe38JBzPfxRDD0NdY/29AOopGKcV+vYSK6W9iF9ImRpdzi0sXzHC8A3MLrP4APQBEL+1DCnAzdqeKkx447iG4DF9QQj/5tO3auw+fj0cCTfYIb3CFPZhmmrPXr19MFxKKKBZXJdjut5IH5qaQs6KAA/VpzOvtFT9/gSY5tamqSaY7vIPmOS90cnhNIYe3xTgNQHt2GfFu3bV+L7kPTgaecaArwexApy4cgJFgcJIK5AzjTovCz0VLIz0i3ZmYcKsTfy9owTFa2HE4ekEm/iLWlp6c9AOV5IGE6YoploNLqYwCvNTY2jgD8KvDUxwKewielQXbeSVhS2YUU+/nJhlMH3K6h9qHbQwI7sx3Wi0epobHmb25u/vRK+9XN9H3wGApwDnpM9UMrV77CSzWABl6ZWlXwq9BHg+WHtu/YSZ8/Eit4gpoUSOycggiAq34LbffpM41sHIaf7MXi+6qr7rfb7Rtv3Ojcwc7e3t6wh8AFTVhFUZiXs4rnC7fb1e12jQyilr85OjLShQx3ra/vprOl9Qpj58JMwHOumRKBaYyLGTBKZQqzswvBw6uQNLQp+XHxH5NHgD9M/wVPQaO2U1a1NwAAAABJRU5ErkJggg==');\n\n\n//# sourceURL=webpack://nadesiko3/./src/image_turtle-elephant.mjs?")},"./src/image_turtle-panda.mjs":function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){eval("__webpack_require__.r(__webpack_exports__);\n// file:turtle-panda.png\n/* harmony default export */ __webpack_exports__[\"default\"] = ('data:image/png;base64,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');\n\n\n//# sourceURL=webpack://nadesiko3/./src/image_turtle-panda.mjs?")},"./src/image_turtle64.mjs":function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){eval("__webpack_require__.r(__webpack_exports__);\n// file:turtle64.png\n/* harmony default export */ __webpack_exports__[\"default\"] = ('data:image/png;base64,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');\n\n\n//# sourceURL=webpack://nadesiko3/./src/image_turtle64.mjs?")},"./src/plugin_turtle.mjs":function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _image_turtle64_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./image_turtle64.mjs */ \"./src/image_turtle64.mjs\");\n/* harmony import */ var _image_turtle_elephant_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./image_turtle-elephant.mjs */ \"./src/image_turtle-elephant.mjs\");\n/* harmony import */ var _image_turtle_panda_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./image_turtle-panda.mjs */ \"./src/image_turtle-panda.mjs\");\n// @ts-nocheck\n/**\n * Turtle Graphics for Web browser (nadesiko3)\n * plugin_turtle.js\n */\n\n\n\n\n\nconst PluginTurtle = {\n '初期化': {\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n /* istanbul ignore if */\n if (sys._turtle) { return }\n sys._turtle = {\n list: [],\n target: -1,\n ctx: null,\n canvas: null,\n canvas_r: { left: 0, top: 0, width: 640, height: 400 },\n clearAll: function () {\n const me = this\n console.log('[TURTLE] clearAll')\n for (let i = 0; i < me.list.length; i++) {\n const tt = me.list[i]\n tt.mlist = [] // ジョブをクリア\n document.body.removeChild(tt.canvas)\n }\n me.list = []\n if (me.canvas !== null) {\n me.ctx.clearRect(0, 0,\n me.canvas.width,\n me.canvas.height)\n }\n\n me.target = -1\n me.flagSetTimer = false\n },\n drawTurtle: function (id) {\n const tt = this.list[id]\n if (!tt) { return }\n const cr = this.canvas_r\n // カメの位置を移動\n tt.canvas.style.left = (cr.left + tt.x - tt.cx) + 'px'\n tt.canvas.style.top = (cr.top + tt.y - tt.cx) + 'px'\n if (!tt.f_update) { return }\n /* istanbul ignore if */\n if (!tt.flagLoaded) { return }\n tt.f_update = false\n tt.ctx.clearRect(0, 0,\n tt.canvas.width,\n tt.canvas.height)\n if (!tt.f_visible) { return }\n if (tt.dir !== 270) {\n const rad = (tt.dir + 90) * 0.017453292519943295\n tt.ctx.save()\n tt.ctx.translate(tt.cx, tt.cy)\n tt.ctx.rotate(rad)\n tt.ctx.translate(-tt.cx, -tt.cy)\n tt.ctx.drawImage(tt.img, 0, 0)\n tt.ctx.restore()\n } else { tt.ctx.drawImage(tt.img, 0, 0) }\n },\n getCur: function () {\n if (this.list.length === 0) { throw Error('最初に『カメ作成』命令を呼び出してください。') }\n\n return this.list[this.target]\n },\n flagSetTimer: false,\n setTimer: function () {\n if (this.flagSetTimer) { return }\n this.flagSetTimer = true\n console.log('[TURTLE] standby ...')\n setTimeout(() => {\n console.log('[TURTLE] Let\\'s go!')\n sys._turtle.play()\n }, 1)\n },\n line: function (tt, x1, y1, x2, y2) {\n /* istanbul ignore else */\n if (tt) { if (!tt.flagDown) { return } }\n\n const ctx = this.ctx\n if (tt.flagBegeinPath) {\n ctx.lineTo(x2, y2)\n } else {\n ctx.beginPath()\n ctx.lineWidth = tt.lineWidth\n ctx.strokeStyle = tt.color\n ctx.moveTo(x1, y1)\n ctx.lineTo(x2, y2)\n ctx.stroke()\n }\n },\n doMacro: function (tt, wait) {\n const me = this\n if (!tt.flagLoaded && wait > 0) {\n // console.log('[TURTLE] waiting ...')\n return true\n }\n const m = tt.mlist.shift()\n const cmd = (m !== undefined) ? m[0] : ''\n switch (cmd) {\n case 'xy':\n // 起点を移動する\n tt.x = m[1]\n tt.y = m[2]\n break\n case 'begin':\n // 描画を明示的に開始する\n this.ctx.beginPath()\n this.ctx.moveTo(tt.x, tt.y)\n tt.flagBegeinPath = true\n break\n case 'close':\n // パスを閉じる\n this.ctx.closePath()\n tt.flagBegeinPath = false\n break\n case 'fill':\n if (tt.flagBegeinPath) {\n this.ctx.closePath()\n tt.flagBegeinPath = false\n }\n this.ctx.fill()\n break\n case 'stroke':\n if (tt.flagBegeinPath) {\n this.ctx.closePath()\n tt.flagBegeinPath = false\n }\n this.ctx.stroke()\n break\n case 'text':\n this.ctx.fillText(m[1], tt.x, tt.y)\n break\n case 'textset':\n this.ctx.font = m[1]\n break\n case 'fillStyle':\n this.ctx.fillStyle = m[1]\n break\n case 'mv': {\n // 線を引く\n me.line(tt, tt.x, tt.y, m[1], m[2])\n // カメの角度を変更\n const mvRad = Math.atan2(m[2] - tt.y, m[1] - tt.x)\n tt.dir = mvRad * 57.29577951308232\n tt.f_update = true\n // 実際に位置を移動\n tt.x = m[1]\n tt.y = m[2]\n break\n }\n case 'fd': {\n const fdv = m[1] * m[2]\n const rad = tt.dir * 0.017453292519943295\n const x2 = tt.x + Math.cos(rad) * fdv\n const y2 = tt.y + Math.sin(rad) * fdv\n me.line(tt, tt.x, tt.y, x2, y2)\n tt.x = x2\n tt.y = y2\n break\n }\n case 'angle': {\n const angle = m[1]\n tt.dir = ((angle - 90 + 360) % 360)\n tt.f_update = true\n break\n }\n case 'rotr': {\n const rv = m[1]\n tt.dir = (tt.dir + rv) % 360\n tt.f_update = true\n break\n }\n case 'rotl': {\n const lv = m[1]\n tt.dir = (tt.dir - lv + 360) % 360\n tt.f_update = true\n break\n }\n case 'color':\n tt.color = m[1]\n this.ctx.strokeStyle = tt.color\n break\n case 'size':\n this.ctx.lineWidth = tt.lineWidth\n tt.lineWidth = m[1]\n break\n case 'penOn':\n tt.flagDown = m[1]\n break\n case 'visible':\n tt.f_visible = m[1]\n tt.f_update = true\n break\n case 'changeImage':\n tt.flagLoaded = false\n tt.img.src = m[1]\n break\n }\n if (tt.flagLoaded) { sys._turtle.drawTurtle(tt.id) }\n return (tt.mlist.length > 0)\n },\n doMacroAll: function (wait) {\n let hasNext = false\n for (let i = 0; i < sys._turtle.list.length; i++) {\n const tt = sys._turtle.list[i]\n if (this.doMacro(tt, wait)) { hasNext = true }\n }\n return hasNext\n },\n play: function () {\n const me = this\n const wait = sys.__v0['カメ速度']\n let hasNext = this.doMacroAll(wait)\n if (wait <= 0) {\n while (hasNext) { hasNext = this.doMacroAll(wait) }\n } else if (hasNext) {\n setTimeout(() => me.play(), wait)\n return\n }\n console.log('[TURTLE] finished.')\n me.flagSetTimer = false\n },\n setupCanvas: function (sys) {\n // 描画先をセットする\n let canvasId = sys.__v0['カメ描画先']\n if (typeof canvasId === 'string') {\n canvasId = document.getElementById(canvasId) || document.querySelector(canvasId)\n sys.__v0['カメ描画先'] = canvasId\n }\n console.log('カメ描画先=', canvasId)\n const cv = sys._turtle.canvas = canvasId\n if (!cv) {\n console.log('[ERROR] カメ描画先が見当たりません。' + canvasId)\n throw Error('カメ描画先が見当たりません。')\n }\n const ctx = sys._turtle.ctx = sys._turtle.canvas.getContext('2d')\n ctx.lineWidth = 4\n ctx.strokeStyle = 'black'\n ctx.lineCap = 'round'\n sys._turtle.resizeCanvas(sys)\n },\n resizeCanvas: function (sys) {\n const cv = sys._turtle.canvas\n const rect = cv.getBoundingClientRect()\n const rx = rect.left + window.pageXOffset\n const ry = rect.top + window.pageYOffset\n sys._turtle.canvas_r = {\n 'left': rx,\n 'top': ry,\n width: rect.width,\n height: rect.height\n }\n },\n createTurtle: function (imageUrl, sys) {\n // キャンバス情報は毎回参照する (#734)\n sys._turtle.setupCanvas(sys)\n // const cv = sys._turtle.canvas\n // カメの情報を sys._turtle リストに追加\n const id = sys._turtle.list.length\n const tt = {\n id: id,\n img: null,\n canvas: null,\n ctx: null,\n dir: 270, // 上向き\n cx: 32,\n cy: 32,\n x: 0,\n y: 0,\n color: 'black',\n lineWidth: 4,\n flagDown: true,\n flagBegeinPath: false,\n f_update: true,\n flagLoaded: false,\n f_visible: true,\n mlist: []\n }\n sys._turtle.list.push(tt)\n sys._turtle.target = id\n // 画像を読み込む\n tt.img = document.createElement('img')\n tt.canvas = document.createElement('canvas')\n tt.ctx = tt.canvas.getContext('2d')\n tt.canvas.id = id\n tt.img.onload = () => {\n tt.cx = tt.img.width / 2\n tt.cy = tt.img.height / 2\n tt.canvas.width = tt.img.width\n tt.canvas.height = tt.img.height\n tt.flagLoaded = true\n tt.f_update = true\n sys._turtle.drawTurtle(tt.id)\n console.log('turtle.onload')\n }\n tt.img.onerror = () => {\n console.log('カメの読み込みに失敗')\n tt.flagLoaded = true\n tt.f_visible = false\n tt.f_update = true\n sys._turtle.drawTurtle(tt.id)\n }\n tt.img.src = imageUrl\n tt.canvas.style.position = 'absolute'\n document.body.appendChild(tt.canvas)\n // デフォルト位置の設定\n tt.x = sys._turtle.canvas_r.width / 2\n tt.y = sys._turtle.canvas_r.height / 2\n return id\n }\n }\n }\n },\n\n '!クリア': {\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n sys._turtle.clearAll()\n }\n },\n\n // @タートルグラフィックス・カメ描画\n 'カメ作成': { // @タートルグラフィックスを開始してカメのIDを返す // @かめさくせい\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n const imageUrl = sys.__v0['カメ画像URL']\n return sys._turtle.createTurtle(imageUrl, sys)\n }\n },\n 'ゾウ作成': { // @ゾウの画像でタートルグラフィックスを開始してIDを返す // @ぞうさくせい\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n const imageUrl = _image_turtle_elephant_mjs__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n return sys._turtle.createTurtle(imageUrl, sys)\n }\n },\n 'パンダ作成': { // @パンダの画像でタートルグラフィックスを開始してIDを返す // @ぱんださくせい\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n const imageUrl = _image_turtle_panda_mjs__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n return sys._turtle.createTurtle(imageUrl, sys)\n }\n },\n 'カメ操作対象設定': { // @IDを指定して操作対象となるカメを変更する // @かめそうさたいしょうせってい\n type: 'func',\n josi: [['に', 'へ', 'の']],\n pure: true,\n fn: function (id, sys) {\n sys._turtle.target = id\n },\n return_none: true\n },\n 'カメ描画先': { type: 'var', value: 'turtle_cv' }, // @かめびょうがさき\n 'カメ画像URL': { type: 'var', value: _image_turtle64_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"] }, // @かめがぞうURL\n 'カメ画像変更': { // @カメの画像をURLに変更する // @かめがぞうへんこう\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (url, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['changeImage', url])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメ速度': { type: 'const', value: 100 }, // @かめそくど\n 'カメ速度設定': { // @カメの動作速度vに設定(大きいほど遅い) // @かめそくどせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (v, sys) {\n sys.__varslist[0]['カメ速度'] = v\n }\n },\n 'カメ移動': { // @カメの位置を[x,y]へ移動する // @かめいどう\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (xy, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['mv', xy[0], xy[1]])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメ起点移動': { // @カメの描画起点位置を[x,y]へ移動する // @かめきてんいどう\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (xy, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['xy', xy[0], xy[1]])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメ進': { // @カメの位置をVだけ進める // @かめすすむ\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['fd', v, 1])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメ戻': { // @カメの位置をVだけ戻す // @かめもどる\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['fd', v, -1])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメ角度設定': { // @カメの向きをDEGに設定する // @かめかくどせってい\n type: 'func',\n josi: [['に', 'へ', 'の']],\n pure: true,\n fn: function (v, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['angle', parseFloat(v)])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメ右回転': { // @カメの向きをDEGだけ右に向ける // @かめみぎかいてん\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['rotr', v])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメ左回転': { // @カメの向きをDEGだけ左に向ける // @かめひだりかいてん\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['rotl', v])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメペン色設定': { // @カメのペン描画色をCに設定する // @かめぺんいろせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (c, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['color', c])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメペンサイズ設定': { // @カメペンのサイズをWに設定する // @かめぺんさいずせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (w, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['size', w])\n sys._turtle.setTimer()\n }\n },\n 'カメペン設定': { // @カメペンを使うかどうかをV(オン/オフ)に設定する // @かめぺんせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (w, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['penOn', w])\n sys._turtle.setTimer()\n }\n },\n 'カメパス開始': { // @カメで明示的にパスの描画を開始する // @かめぱすかいし\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['begin'])\n sys._turtle.setTimer()\n }\n },\n 'カメパス閉': { // @カメでパスを明示的に閉じる(省略可能) // @かめぱすとじる\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['close'])\n sys._turtle.setTimer()\n }\n },\n 'カメパス線引': { // @カメでパスを閉じて、カメペン色設定で指定した色で枠線を引く // @かめぱすせんひく\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['stroke'])\n sys._turtle.setTimer()\n }\n },\n 'カメパス塗': { // @カメでパスを閉じて、カメ塗り色設定で指定した色で塗りつぶす // @かめぱすぬる\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['fill'])\n sys._turtle.setTimer()\n }\n },\n 'カメ文字描画': { // @カメの位置に文字Sを描画 // @かめもじびょうが\n type: 'func',\n josi: [['を', 'と', 'の']],\n pure: true,\n fn: function (s, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['text', s])\n sys._turtle.setTimer()\n }\n },\n 'カメ文字設定': { // @カメ文字描画で描画するテキストサイズやフォント(48px serif)などを設定 // @かめもじせってい\n type: 'func',\n josi: [['に', 'へ', 'で']],\n pure: true,\n fn: function (s, sys) {\n s = '' + s // 文字列に\n if (s.match(/^\\d+$/)) {\n s = s + 'px serif'\n } else if (s.match(/^\\d+(px|em)$/)) {\n s = s + ' serif'\n }\n const tt = sys._turtle.getCur()\n tt.mlist.push(['textset', s])\n sys._turtle.setTimer()\n }\n },\n 'カメ塗色設定': { // @カメパスの塗り色をCに設定する // @かめぬりいろせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (c, sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['fillStyle', c])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメ全消去': { // @表示しているカメと描画内容を全部消去する // @かめぜんしょうきょ\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n sys._turtle.clearAll()\n },\n return_none: true\n },\n 'カメコマンド実行': { // @カメにコマンドSを実行する。コマンドは改行か「;」で区切る。コマンドと引数は「=」で区切り引数はかカンマで区切る // @かめこまんどじっこう\n type: 'func',\n josi: [['の', 'を']],\n pure: true,\n fn: function (cmd, sys) {\n const tt = sys._turtle.getCur()\n const a = cmd.split(/(\\n|;)/)\n for (let i = 0; i < a.length; i++) {\n let c = a[i]\n c = c.replace(/^([a-zA-Z_]+)\\s*(\\d+)/, '$1,$2')\n c = c.replace(/^([a-zA-Z_]+)\\s*=/, '$1,')\n const ca = c.split(/\\s*,\\s*/)\n tt.mlist.push(ca)\n }\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメ非表示': { // @カメの画像を非表示にする。描画に影響しない。 // @かめひひょうじ\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['visible', false])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメ表示': { // @非表示にしたカメを表示する。 // @かめひょうじ\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n const tt = sys._turtle.getCur()\n tt.mlist.push(['visible', true])\n sys._turtle.setTimer()\n },\n return_none: true\n },\n 'カメクリック時': { // @ 操作対象のカメをクリックした時のイベントを設定する // @かめくりっくしたとき\n type: 'func',\n josi: [['を']],\n pure: false,\n fn: function (func, sys) {\n func = sys.__findVar(func, null) // 文字列指定なら関数に変換\n const tid = sys._turtle.target\n const tt = sys._turtle.list[tid]\n tt.canvas.onclick = (e) => {\n sys.__v0['対象'] = e.target\n return func(e, sys)\n }\n },\n return_none: true\n }\n}\n\n// module.exports = PluginTurtle\n/* harmony default export */ __webpack_exports__[\"default\"] = (PluginTurtle);\n\n// scriptタグで取り込んだ時、自動で登録する\n/* istanbul ignore else */\nif (typeof (navigator) === 'object' && typeof (navigator.nako3)) { navigator.nako3.addPluginObject('PluginTurtle', PluginTurtle) }\n\n\n//# sourceURL=webpack://nadesiko3/./src/plugin_turtle.mjs?")}},__webpack_module_cache__={};function __webpack_require__(t){var n=__webpack_module_cache__[t];if(void 0!==n)return n.exports;var e=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t](e,e.exports,__webpack_require__),e.exports}__webpack_require__.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/plugin_turtle.mjs")})();
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
/*! For license information please see plugin_webworker.js.LICENSE.txt */
|
|
2
|
+
(function(){"use strict";var __webpack_modules__={"./src/plugin_webworker.mjs":function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){eval("__webpack_require__.r(__webpack_exports__);\n// @ts-nocheck\nconst PluginWebWorker = {\n '初期化': {\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n sys._webworker = {\n setNakoHandler: function (work) {\n work.onmessage = (event) => {\n const data = event.data || { type: '', data: '' }\n const type = data.type || ''\n const value = data.data || ''\n switch (type) {\n case 'output':\n if (work.onoutput) {\n work.onoutput.apply(sys, [value, event])\n }\n break\n case 'data':\n if (work.ondata) {\n work.ondata.apply(sys, [value, event])\n }\n break\n case 'error':\n sys.logger.error(value.noColor)\n break\n }\n }\n work.onerror = (event) => {\n const e = new Error(typeof event.message !== 'undefined' ? event.message : 'no message')\n sys.logger.error(e)\n }\n work.onerrormessage = (event) => {\n const e = new Error(typeof event.message !== 'undefined' ? event.message : 'no message')\n sys.logger.error(e)\n }\n },\n inWorker: () => {\n // eslint-disable-next-line no-undef\n return typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope\n },\n getBaseUrlFromTag: () => {\n if (!self.document) { return '' }\n const pluginName = 'plugin_webworker.js'\n let path = location.pathname\n if (path.substr(path.length - 1, 1) !== '/') {\n const paths = path.split('/')\n path = paths.slice(paths.length - 1, 1).join('/') & '/'\n }\n const scripts = document.querySelectorAll('script')\n for (let i = 0; i < scripts.length; i++) {\n const script = scripts[i]\n let src = script.src || ''\n const index = src.indexOf(pluginName)\n if (index >= 0) {\n if (src.length - index === pluginName.length ||\n '?&#'.indexOf(src.substr(index + pluginName.length, 1)) >= 0) {\n src = src.substring(0, index)\n if (src.substring(0, 1) === '/') {\n // スクリプトソースはorigin無しの絶対パス\n return location.origin + src\n }\n if (/^[a-zA-Z]+:\\/\\//.test(src)) {\n // スクリプトソースは絶対URI\n return src\n }\n // スクリプトソースはorigin無しの相対パス\n return location.origin + path + src\n }\n }\n }\n // スクリプトソースが見つからなかったのでドキュメントのURIを返す\n return location.origin + path\n }\n }\n sys.__v0['ワーカーURL'] = sys._webworker.getBaseUrlFromTag()\n }\n },\n // @イベント定数\n '対象イベント': { type: 'const', value: '' }, // @たいしょういべんと\n '受信データ': { type: 'const', value: '' }, // @たいしょういべんと\n\n 'ワーカーURL': { type: 'const', value: '' }, // @わーかーURL\n 'ワーカーURL設定': { // @なでしこv3のファイルのあるURLを設定 // @わーかーURLせってい\n type: 'func',\n josi: [['に', 'へ', 'と']],\n pure: true,\n fn: function (url, sys) {\n if (url && url.substring(url.length - 1) !== '/') {\n url += '/'\n }\n sys.__v0['ワーカーURL'] = url\n },\n return_none: true\n },\n\n // @NAKOワーカー\n 'ワーカー起動': { // @指定したURLでWebWorkerを起動する。ワーカオブジェクトを返す。 // @わーかーきどう\n type: 'func',\n josi: [['で', 'を', 'の']],\n pure: true,\n fn: function (url, sys) {\n return new Worker(url)\n },\n return_none: false\n },\n 'ワーカーJS起動': { // @指定したJavascriptのソースでWebWorkerを起動する。ワーカオブジェクトを返す。 // @わーかーJSきどう\n type: 'func',\n josi: [['で', 'を', 'の']],\n pure: true,\n fn: function (src, sys) {\n const blob = new Blob([src], { type: 'application/javascript' })\n const url = URL.createObjectURL(blob)\n return new Worker(url)\n },\n return_none: false\n },\n 'NAKOワーカー起動': { // @指定したなでしこ3のWebWorkerを起動する。ワーカオブジェクトを返す。 // @NAKOわーかーきどう\n type: 'func',\n josi: [['で']],\n isVariableJosi: true,\n pure: true,\n fn: function (plugins, sys) {\n let url\n if (typeof sys === 'undefined') { sys = plugins; plugins = undefined }\n if (plugins !== undefined) {\n if (!(plugins instanceof Array)) {\n throw new Error('プラグインはファイル名を配列で指定してください')\n }\n const baseurl = sys.__v0['ワーカーURL']\n let code = `importScripts('${baseurl}wnako3webworker.js')\\n`\n const l = plugins.length\n let i\n for (i = 0; i < l; i++) {\n code += `importScripts('${baseurl}${plugins[i]}')\\n`\n }\n const blob = new Blob([code], { type: 'application/javascript' })\n url = URL.createObjectURL(blob)\n } else {\n url = sys.__v0['ワーカーURL'] + 'wnako3webworker.js'\n }\n const myWorker = new Worker(url)\n if (myWorker) {\n sys._webworker.setNakoHandler(myWorker)\n }\n return myWorker\n },\n return_none: false\n },\n 'NAKOワーカーハンドラ設定': { // @ワーカーにNAKOワーカーのための設定を行う。 // @NAKOわーかーはんどらせってい\n type: 'func',\n josi: [['に', 'へ', 'の']],\n pure: true,\n fn: function (work, sys) {\n sys._webworker.setNakoHandler(work)\n },\n return_none: true\n },\n 'NAKOワーカーデータ受信時': { // @無名関数Fでなでしこv3エンジンに対してワーカーメッセージによりデータを受信した時に実行するイベントを設定。『受信データ』に受信したデータ。『対象イベント』にイベント引数。 // @NAKOわーかーでーたじゅしんしたとき\n type: 'func',\n josi: [['で'], ['から']],\n isVariableJosi: true,\n pure: false,\n fn: function (func, work, sys) {\n if (typeof sys === 'undefined') { sys = work; work = self }\n func = sys.__findVar(func, null) // 文字列指定なら関数に変換\n work.ondata = (data, e) => {\n sys.__v0['受信データ'] = data\n sys.__v0['対象イベント'] = e\n return func(e, sys)\n }\n },\n return_none: true\n },\n 'NAKOワーカー表示時': { // @無名関数Fでなでしこv3エンジンに対してワーカーメッセージにより表示データを受信した時に実行するイベントを設定。『受信データ』に表示しようとしたデータ。『対象イベント』にイベント引数。 // @NAKOわーかーひょうじしたとき\n type: 'func',\n josi: [['で'], ['から']],\n pure: false,\n fn: function (func, work, sys) {\n func = sys.__findVar(func, null) // 文字列指定なら関数に変換\n work.onoutput = (data, e) => {\n sys.__v0['受信データ'] = data\n sys.__v0['対象イベント'] = e\n return func(e, sys)\n }\n },\n return_none: true\n },\n 'ワーカーメッセージ受信時': { // @無名関数Fでworkに対してメッセージを受信した時に実行するイベントを設定。『受信データ』に受信したデータ。『対象イベント』にイベント引数。 // @わーかーめっせーじじゅしんしたとき\n type: 'func',\n josi: [['で'], ['から']],\n isVariableJosi: true,\n pure: false,\n fn: function (func, work, sys) {\n if (typeof sys === 'undefined') { sys = work; work = self }\n func = sys.__findVar(func, null) // 文字列指定なら関数に変換\n work.onmessage = (e) => {\n sys.__v0['受信データ'] = e.data\n sys.__v0['対象イベント'] = e\n return func(e, sys)\n }\n },\n return_none: true\n },\n 'NAKOワーカープログラム起動': { // @WORKERに固有の形式でプログラムの転送と実行行う。 // @NAKOわーかーぷろぐらむきどう\n type: 'func',\n josi: [['に', 'で'], ['を']],\n pure: true,\n fn: function (work, data, sys) {\n const msg = {\n type: 'run',\n data: sys.__modName + '__' + data\n }\n work.postMessage(msg)\n },\n return_none: true\n },\n 'NAKOワーカーリセット': { // @WORKERに固有の形式でプログラムの転送と実行行う。 // @わーかーりせっと\n type: 'func',\n josi: [['を']],\n pure: true,\n fn: function (work, sys) {\n const msg = {\n type: 'reset',\n data: ''\n }\n work.postMessage(msg)\n },\n return_none: true\n },\n 'ワーカー終了': { // @WORKERを終了する。 // @わーかーしゅうりょう\n type: 'func',\n josi: [['を']],\n isVariableJosi: true,\n pure: true,\n fn: function (work, sys) {\n if (typeof sys === 'undefined') { sys = work; work = self }\n work.terminate()\n },\n return_none: true\n },\n 'NAKOワーカー終了': { // @WORKERを終了する。 // @NAKOわーかーしゅうりょう\n type: 'func',\n josi: [['を']],\n isVariableJosi: true,\n pure: true,\n fn: function (work, sys) {\n if (typeof sys === 'undefined') {\n self.close()\n return\n }\n const msg = {\n type: 'close',\n data: ''\n }\n work.postMessage(msg)\n },\n return_none: true\n },\n 'NAKOワーカーデータ送信': { // @WORKERに固有の形式でデータを送信する。 // @NAKOわーかーでーたそうしん\n type: 'func',\n josi: [['を'], ['に', 'へ']],\n isVariableJosi: true,\n pure: true,\n fn: function (data, work, sys) {\n if (typeof sys === 'undefined') { sys = work; work = self }\n const msg = {\n type: 'data',\n data: data\n }\n work.postMessage(msg)\n },\n return_none: true\n },\n 'ワーカーメッセージ送信': { // @WORKERにメッセージを送信する。 // @わーかーめっせーじそうしん\n type: 'func',\n josi: [['を'], ['に', 'へ']],\n isVariableJosi: true,\n pure: true,\n fn: function (msg, work, sys) {\n if (typeof sys === 'undefined') { sys = work; work = self }\n work.postMessage(msg)\n },\n return_none: true\n },\n 'NAKOワーカー転送': { // @WORKERにユーザー定義関数またはユーザ定義のグローバル変数を転送する。 // @NAKOわーかーてんそう\n type: 'func',\n josi: [['を'], ['に', 'へ']],\n isVariableJosi: true,\n pure: false,\n fn: function (datas, work, sys) {\n if (typeof sys === 'undefined') { sys = work; work = self }\n const obj = []\n if (typeof datas === 'string') { datas = [datas] }\n datas.forEach(data => {\n data = sys.__modName + '__' + data\n if (typeof sys.__varslist[2][data] !== 'undefined') {\n obj.push({\n type: 'val',\n name: data,\n content: sys.__varslist[2][data]\n })\n } else\n if (typeof sys.__varslist[1][data] !== 'undefined') {\n obj.push({\n type: 'func',\n name: data,\n content: {\n meta: sys.gen.nakoFuncList[data],\n func: Object.assign({}, sys.compiler.funclist[data], { fn: null })\n }\n })\n } else {\n console.error('指定した名前のユーザ関数もしくはグローバル変数がありません:' + data)\n throw new Error('指定した名前のユーザ関数もしくはグローバル変数がありません:' + data)\n }\n })\n if (obj.length > 0) {\n const msg = {\n type: 'trans',\n data: obj\n }\n work.postMessage(msg)\n }\n },\n return_none: true\n }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (PluginWebWorker);\n\nif (typeof (navigator) === 'object' && typeof (navigator.nako3) === 'object') {\n navigator.nako3.addPluginObject('PluginWebWorker', PluginWebWorker)\n}\n\n\n\n//# sourceURL=webpack://nadesiko3/./src/plugin_webworker.mjs?")}},__webpack_require__={r:function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})}},__webpack_exports__={};__webpack_modules__["./src/plugin_webworker.mjs"](0,__webpack_exports__,__webpack_require__)})();
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
!function(){"use strict";let e=window.THREE;const t={"初期化":{type:"func",josi:[],pure:!0,fn:function(t){if(!t._weykturtle3d){if(void 0===window.THREE)throw new Error("three.jsが読み込まれていません");e=window.THREE,t._weykturtle3d={containerid:"",camera:-1,target:-1,_renderer:null,_scene:null,_lines:new e.Group,_camera:null,_controls:null,_camerahelper:null,_axishelper:null,list:[],clearAll:function(){console.log("[TURTLE] clearAll"),this.disposeAllTurtle(),this.disposeAllLine();const e=this._scene;null!==e&&(e.remove(this._lines),e.add(this._lines),null!==this._camerahelper&&(this._camerahelper.visible=!1,e.remove(this._camerahelper),e.add(this._camerahelper)),null!==this._axishelper&&(this._axishelper.visible=!1,e.remove(this._axishelper),e.add(this._axishelper)),this.initTurtle())},disposeAllTurtle:function(){for(let e=0;e<this.list.length;e++){const t=this.list[e];t.mlist=[],this.disposeChildObject(t.obj)}this.list=[],this.target=-1,this.camera=-1,this.flagSetTimer=!1},disposeAllLine:function(){null!==this._lines&&this.disposeChildObject(this._lines)},createDefaultTurtle:function(){const t=new e.Group,n=new e.LineBasicMaterial({vertexColors:!0}),r=new Float32Array([0,1,0,-.6,-1,0,0,-.5,0,.6,-1,0,0,0,.5,0,1,0,-.6,-1,0,0,-.5,0,.6,-1,0,0,0,-.5,0,1,0,-.6,-1,0,0,-.5,0,.6,-1,0]),i=new Float32Array([0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1]),o=new e.BufferGeometry;o.setIndex([0,1,1,2,2,3,3,0,4,5,4,6,4,7,4,8,9,10,9,11,9,12,9,13]),o.setAttribute("position",new e.BufferAttribute(r,3)),o.setAttribute("color",new e.BufferAttribute(i,3)),o.computeBoundingSphere();const u=new e.LineSegments(o,n);return u.scale.set(30,30,30),t.add(u),t},createTurtle:function(t){const n=this.list.length,r={id:n,obj:new e.Group,home:{position:new e.Vector3(0,0,0),quaternion:new e.Quaternion},color:new e.Color(16777215),lineWidth:4,flagDown:!0,flagLoaded:!1,f_visible:!0,mlist:[]};this.list.push(r),this.target=n,r.home.position.copy(r.obj.position),r.home.quaternion.copy(r.obj.quaternion),this.loadTurtle(r,t);return this.getScene().add(r.obj),n},loadTurtle:function(t,n){const r=new e.ObjectLoader,i=this;if(n instanceof e.Object3D){console.log("turtle.object"),i.disposeChildObject(t.obj);const e=n;return t.obj.add(e),t.flagLoaded=!0,void i.doDraw()}if(0===n.length){console.log("turtle.default"),i.disposeChildObject(t.obj);const e=i.createDefaultTurtle();return t.obj.add(e),t.flagLoaded=!0,void i.doDraw()}r.load(n,(function(e){console.log("turtle.onload"),i.disposeChildObject(t.obj),t.obj.add(e),t.flagLoaded=!0,i.doDraw()}),(function(e){}),(function(e){console.log("turtle.onerror"),t.flagLoaded=!0,t.f_visible=!1,t.obj.visible=!1,i.disposeChildObject(t.obj),i.doDraw()}))},initTurtle:function(){if(0===this.list.length){const t=this.createTurtle(""),n=this.list[t];n.obj.position.set(0,0,1e3);const r=new e.Vector3(0,0,-1).normalize(),i=0;n.obj.quaternion.setFromAxisAngle(r,i),n.home.position.copy(n.obj.position),n.home.quaternion.copy(n.obj.quaternion),n.f_visible=!1,n.obj.visible=!1,this.camera=t,this.target=-1}},getCur:function(){if(0===this.list.length)throw Error("最初に『T3Dカメ作成』命令を呼び出してください。");if(this.target<0||this.target>=this.list.length)throw Error("指定された番号のカメはいません。");return this.list[this.target]},doDraw:function(){if(-1===this.camera)return;this.getRenderer();const e=this.list[this.camera];null!==this._controls||(this._camera.position.copy(e.obj.position),this._camera.quaternion.copy(e.obj.quaternion)),null!==this._camerahelper&&this._camerahelper.update(),this._renderer.clear(),null!==this._controls&&(this._controls.update(),e.obj.position.copy(this._camera.position),e.obj.quaternion.copy(this._camera.quaternion)),this._renderer.render(this._scene,this._camera)},setCameraHelper:function(t){if(t){if(null===this._camerahelper){if(void 0===e.CameraHelper)throw Error("カメラヘルパの機能が見当たりません。");const t=new e.CameraHelper(this._camera);this._camerahelper=t,this._scene.add(t)}this._camerahelper.visible=!0}else null!==this._camerahelper&&(this._camerahelper.visible=!1)},setAxisHelper:function(t){if(t){if(null===this._axishelper){if(void 0===e.AxisHelper)throw Error("AXISヘルパの機能が見当たりません。");const t=new e.AxisHelper(1e3);this._axishelper=t,this._scene.add(t)}this._axishelper.visible=!0}else null!==this._axishelper&&(this._axishelper.visible=!1)},getScene:function(){if(null===this._scene){const t=new e.Scene;if(null===t)throw new Error("シーンを作成できません");this._scene=t}return this._scene},getCamera:function(){if(null===this._camera){const t=new e.PerspectiveCamera(60,1,1,65e3);if(null===t)throw new Error("カメラを作成できません");this.resetCamera(t),this._camera=t}return this._camera},resetCamera:function(t){if(t.position.set(0,0,1e3),null!==this._renderer){const n=new e.Vector2;this._renderer.getSize(n),t.aspect=n.width/n.height}t.up=new e.Vector3(0,1,0),t.lookAt(new e.Vector3(0,0,0))},initTrutle3dEnv:function(e){e.setClearColor(0,1),e.autoClear=!1;const n=this.getScene();this.getCamera();n.add(t._weykturtle3d._lines),0===this.list.length&&this.initTurtle()},initRenderer:function(){let e=t.__v0["T3Dカメ描画先"];if("string"==typeof e&&(e=document.querySelector(e)||document.getElementById(e)),!e)throw new Error("[ERROR] T3Dカメ描画先が見当たりません。");this.setRenderer(e)},setRenderer:function(t){if(t instanceof e.WebGLRenderer)this._renderer=t;else{const n=new e.WebGLRenderer({antialias:!1,alpha:!0});if(null===n)throw new Error("レンダラを作成できません");n.setPixelRatio(window.devicePixelRatio),n.setSize(t.clientWidth,t.clientHeight),t.appendChild(n.domElement),this._renderer=n}return this._renderer},setupRenderer:function(){this.initTrutle3dEnv(this._renderer)},getRenderer:function(){return null===this._renderer&&(this.initRenderer(),this.setupRenderer()),this._renderer},setupControl:function(e){if(void 0===e)throw new Error("指定されたコンコントロールが見当たりません。");if(null!==this._controls){if(this._controls instanceof e)return this._controls;throw new Error("既にコントロールを適用しています。コントロールの変更はできません。")}const t=this.getRenderer(),n=new e(this.getCamera(t),t.domElement);return n.enabled=!0,this._controls=n,this._controls},line:function(t,n,r){if(t&&!t.flagDown)return;const i=new e.BufferGeometry,o=new e.Float32BufferAttribute(6,3);o.copyVector3sArray([n,r]);const u=new e.LineBasicMaterial({color:t.color,linewidth:t.lineWidth});i.setAttribute("position",o);const l=new e.Line(i,u);this._lines.add(l)},doMacro:function(t,n){const r=this;if(!t.flagLoaded&&n>0)return console.log("[TURTLE] waiting ..."),!0;const i=t.mlist.shift();switch(void 0!==i?i[0]:""){case"xyz":t.obj.position.copy(i[1]);break;case"mv":{const n=t.obj.position.clone(),r=i[1];this.line(t,n,r),t.obj.lookAt(r);const o=new e.Quaternion,u=new e.Vector3(1,0,0);o.setFromAxisAngle(u,Math.PI/2),t.obj.quaternion.multiply(o),t.obj.position.copy(r);break}case"fd":{const n=t.obj.position.clone(),r=new e.Vector3(0,i[1]*i[2],0);r.applyQuaternion(t.obj.quaternion),r.add(n),this.line(t,n,r),t.obj.position.copy(r);break}case"su":{const n=t.obj.position.clone(),r=new e.Vector3(0,i[1],0),o=new e.Quaternion,u=new e.Vector3(1,0,0);o.setFromAxisAngle(u,-90*Math.PI/180);const l=t.obj.quaternion.clone();l.multiply(o),r.applyQuaternion(l),r.add(n),this.line(t,n,r),t.obj.position.copy(r);break}case"sd":{const n=t.obj.position.clone(),r=new e.Vector3(0,i[1],0),o=new e.Quaternion,u=new e.Vector3(1,0,0);o.setFromAxisAngle(u,90*Math.PI/180);const l=t.obj.quaternion.clone();l.multiply(o),r.applyQuaternion(l),r.add(n),this.line(t,n,r),t.obj.position.copy(r);break}case"sl":{const n=t.obj.position.clone(),r=new e.Vector3(0,i[1],0),o=new e.Quaternion,u=new e.Vector3(0,0,1);o.setFromAxisAngle(u,90*Math.PI/180);const l=t.obj.quaternion.clone();l.multiply(o),r.applyQuaternion(l),r.add(n),this.line(t,n,r),t.obj.position.copy(r);break}case"sr":{const n=t.obj.position.clone(),r=new e.Vector3(0,i[1],0),o=new e.Quaternion,u=new e.Vector3(0,0,1);o.setFromAxisAngle(u,-90*Math.PI/180);const l=t.obj.quaternion.clone();l.multiply(o),r.applyQuaternion(l),r.add(n),this.line(t,n,r),t.obj.position.copy(r);break}case"angle":{const n=new e.Euler;n.fromArray(i[1]);new e.Quaternion;t.obj.quaternion.setFromEuler(n);break}case"rotr":{const n=i[1],r=new e.Quaternion,o=new e.Vector3(0,0,1);r.setFromAxisAngle(o,-n%360*Math.PI/180),t.obj.quaternion.multiply(r);break}case"rotl":{const n=i[1],r=new e.Quaternion,o=new e.Vector3(0,0,1);r.setFromAxisAngle(o,n%360*Math.PI/180),t.obj.quaternion.multiply(r);break}case"rotu":{const n=i[1],r=new e.Quaternion,o=new e.Vector3(1,0,0);r.setFromAxisAngle(o,-n%360*Math.PI/180),t.obj.quaternion.multiply(r);break}case"rotd":{const n=i[1],r=new e.Quaternion,o=new e.Vector3(1,0,0);r.setFromAxisAngle(o,n%360*Math.PI/180),t.obj.quaternion.multiply(r);break}case"rolr":{const n=i[1],r=new e.Quaternion,o=new e.Vector3(0,1,0);r.setFromAxisAngle(o,n%360*Math.PI/180),t.obj.quaternion.multiply(r);break}case"roll":{const n=i[1],r=new e.Quaternion,o=new e.Vector3(0,1,0);r.setFromAxisAngle(o,-n%360*Math.PI/180),t.obj.quaternion.multiply(r);break}case"color":t.color=new i[1];break;case"size":t.lineWidth=i[1];break;case"penOn":t.flagDown=i[1];break;case"visible":t.f_visible=i[1],t.f_visible?t.obj.visible=!0:t.obj.visible=!1;break;case"changeModel":t.flagLoaded=!1,r.loadTurtle(t,i[1]);break;case"changeCamera":r.camera=i[1];break;case"sethome":t.home.position.copy(t.obj.position),t.home.quaternion.copy(t.obj.quaternion);break;case"gohome":t.obj.position.copy(t.home.position),t.obj.quaternion.copy(t.home.quaternion)}return t.mlist.length>0},doMacroAll:function(e){let t=!1;for(let n=0;n<this.list.length;n++){const r=this.list[n];this.doMacro(r,e)&&(t=!0)}return t},flagSetTimer:!1,animationStart:function(){0!==this.getWait()?this.flagSetTimer||(this.flagSetTimer=!0,this.animationFrame(this.animation)):this.animation()},getWait:function(){return t.__v0["T3Dカメ速度"]},disposeChildObject:function(e){for(;e.children.length>0;)this.disposeChildObject(e.children[0]),e.remove(e.children[0]);e.geometry&&e.geometry.dispose(),e.material&&(Object.keys(e.material).forEach((t=>{e.material[t]&&"function"==typeof e.material[t].dispose&&e.material[t].dispose()})),e.material.dispose())},animation:function(){const e=t._weykturtle3d,n=Date.now(),r=n-e._prevUpdatedTime,i=e.getWait();if(i>0&&r<i)return e.doDraw(),void e.animationFrame(e.animation);let o=e.doMacroAll(i);if(i<=0)for(;o;)o=e.doMacroAll(i);else if(o||null!==e._controls)return e.doDraw(),e._prevUpdatedTime=n,void e.animationFrame(e.animation);e.doDraw(),e.flagSetTimer=!1}},t._weykturtle3d.animationFrame=function(e,t){window.setTimeout(e,1e3/60)}}}},"T3Dカメ作成":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.initTurtle();const t=e.__v0["T3DカメモデルURL"];return e._weykturtle3d.createTurtle(t)},return_none:!1},"T3Dカメ操作対象設定":{type:"func",josi:[["に","へ","の"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.target=e},return_none:!0},"T3Dカメ描画先":{type:"var",value:"turtle3d_div"},"T3DカメモデルURL":{type:"var",value:""},"T3Dカメモデル変更":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["changeModel",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ速度":{type:"const",value:100},"T3Dカメ速度設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(e,t){t.__varslist[0]["T3Dカメ速度"]=e},return_none:!0},"T3Dカメ移動":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,n){if(!n._weykturtle3d)return null;n._weykturtle3d.getCur().mlist.push(["mv",new e.Vector3(t[0],t[1],t[2])]),n._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ原点設定":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.getCur().mlist.push(["sethome"]),e._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ原点移動":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.getCur().mlist.push(["gohome"]),e._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ起点移動":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,n){if(!n._weykturtle3d)return null;n._weykturtle3d.getCur().mlist.push(["xyz",new e.Vector3(t[0],t[1],t[2])]),n._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ進":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["fd",e,1]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ戻":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["fd",e,-1]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ上平行移動":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["su",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ下平行移動":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["sd",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ左平行移動":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["sl",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ右平行移動":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["sr",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ動":{type:"func",josi:[["へ","に"],["だけ"]],pure:!0,fn:function(e,t,n){if(!n._weykturtle3d)return null;const r=n._weykturtle3d.getCur();let i="";if("前"===e||"後"===e)"前"===e?r.mlist.push(["fd",t,1]):r.mlist.push(["fd",t,-1]);else{if("上"===e||"UP"===e||"うえ"===e)i="su";else if("下"===e||"DOWN"===e||"した"===e)i="sd";else if("右"===e||"RIGHT"===e||"みぎ"===e)i="sr";else{if("左"!==e&&"LEFT"!==e&&"ひだり"!==e)throw Error("方向の指定が正しくありません。前後上下左右のいずれかで指定してください。");i="sl"}r.mlist.push([i,t])}n._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ角度設定":{type:"func",josi:[["に","へ","の"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["angle",parseFloat(e)]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ右回転":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["rotr",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ左回転":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["rotl",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ上回転":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["rotu",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ下回転":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["rotd",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ回転":{type:"func",josi:[["へ","に"],["だけ"]],pure:!0,fn:function(e,t,n){if(!n._weykturtle3d)return null;const r=n._weykturtle3d.getCur();let i="";if("上"===e||"UP"===e||"うえ"===e)i="rotu";else if("下"===e||"DOWN"===e||"した"===e)i="rotd";else if("右"===e||"RIGHT"===e||"みぎ"===e)i="rotr";else{if("左"!==e&&"LEFT"!==e&&"ひだり"!==e)throw Error("方向の指定が正しくありません。上下左右のいずれかで指定してください。");i="rotl"}r.mlist.push([i,t]),n._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ右ロール":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["rolr",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ左ロール":{type:"func",josi:[["だけ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["roll",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ傾":{type:"func",josi:[["に","へ"],["だけ"]],pure:!0,fn:function(e,t,n){if(!n._weykturtle3d)return null;const r=n._weykturtle3d.getCur();let i="";if("右"===e||"RIGHT"===e||"みぎ"===e)i="rolr";else{if("左"!==e&&"LEFT"!==e&&"ひだり"!==e)throw Error("向きの指定が正しくありません。左右のどちらかで指定してください。");i="roll"}r.mlist.push([i,t]),n._weykturtle3d.animationStart()},return_none:!0},"T3Dカメペン色設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["color",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメペンサイズ設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["size",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメペン設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;t._weykturtle3d.getCur().mlist.push(["penOn",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ全消去":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.clearAll()},return_none:!0},"T3Dカメ非表示":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.getCur().mlist.push(["visible",!1]),e._weykturtle3d.animationStart()},return_none:!0},"T3Dカメ表示":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.getCur().mlist.push(["visible",!0]),e._weykturtle3d.animationStart()},return_none:!0},"T3D視点カメ設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;if(e<0||e>=t._weykturtle3d.list.length)throw Error("指定された番号のカメはいません。");t._weykturtle3d.getCur().mlist.push(["changeCamera",e]),t._weykturtle3d.animationStart()},return_none:!0},"T3D描画準備":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(t,n){if(!n._weykturtle3d)return null;if(void 0===e)throw new Error("three.jsが読み込まれていません");if("string"==typeof t&&(t=document.querySelector(t)||document.getElementById(t)),!t)throw new Error("TJS描画準備に指定した描画先に誤りがあります");return n._weykturtle3d.setRenderer(t),n._weykturtle3d.setupRenderer(),n._weykturtle3d._renderer},return_none:!1},"T3D描画":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.doDraw()},return_none:!0},"T3D背景色設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;null===t._weykturtle3d._renderer&&t._weykturtle3d.setRenderTarget(),t._weykturtle3d._renderer.setClearColor(e),t._weykturtle3d.animationStart()},return_none:!0},"T3D背景透過設定":{type:"func",josi:[["に","へ"]],pure:!0,fn:function(e,t){if(!t._weykturtle3d)return null;null===t._weykturtle3d._renderer&&t._weykturtle3d.setRenderTarget(),t._weykturtle3d._renderer.setClearAlpha(e),t._weykturtle3d.animationStart()},return_none:!0},"T3DJSON取得":{type:"func",josi:[],pure:!0,fn:function(e){return e._weykturtle3d?JSON.stringify(e._weykturtle3d._lines.toJSON()):null},return_none:!1},"T3Dオービットコントロール設定":{type:"func",josi:[],pure:!0,fn:function(t){return t._weykturtle3d&&void 0!==e.OrbitControls?t._weykturtle3d.setupControl(e.OrbitControls):null},return_none:!1},"T3Dコントロール有効":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d._controls&&(e._weykturtle3d._controls.enabled=!0)},return_none:!0},"T3Dコントロール無効":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d._controls&&(e._weykturtle3d._controls.enabled=!1)},return_none:!0},"T3Dカメラヘルパ表示":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.setCameraHelper(!0)},return_none:!0},"T3Dカメラヘルパ非表示":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.setCameraHelper(!1)},return_none:!0},"T3D軸線ヘルパ表示":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.setAxisHelper(!0)},return_none:!0},"T3D軸線ヘルパ非表示":{type:"func",josi:[],pure:!0,fn:function(e){if(!e._weykturtle3d)return null;e._weykturtle3d.setAxisHelper(!1)},return_none:!0}};"object"==typeof navigator&&navigator.nako3.addPluginObject("PluginWeykTurtle3D",t)}();
|
|
1
|
+
/*! For license information please see plugin_weykturtle3d.js.LICENSE.txt */
|
|
2
|
+
(function(){"use strict";var __webpack_modules__={"./src/plugin_weykturtle3d.mjs":function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){eval("__webpack_require__.r(__webpack_exports__);\n// @ts-nocheck\n/**\n * PluginWeykTurtle3D\n */\nlet THREE = window.THREE\n\nconst PluginWeykTurtle3D = {\n '初期化': {\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (sys._weykturtle3d) { return }\n if (typeof window.THREE === 'undefined') {\n throw new Error('three.jsが読み込まれていません')\n }\n THREE = window.THREE // set three.js instance\n sys._weykturtle3d = {\n containerid: '',\n camera: -1,\n target: -1,\n _renderer: null,\n _scene: null,\n _lines: new THREE.Group(),\n _camera: null,\n _controls: null,\n _camerahelper: null,\n _axishelper: null,\n list: [],\n clearAll: function () {\n console.log('[TURTLE] clearAll')\n this.disposeAllTurtle()\n this.disposeAllLine()\n const scene = this._scene\n if (scene !== null) {\n scene.remove(this._lines)\n scene.add(this._lines)\n if (this._camerahelper !== null) {\n this._camerahelper.visible = false\n scene.remove(this._camerahelper)\n scene.add(this._camerahelper)\n }\n if (this._axishelper !== null) {\n this._axishelper.visible = false\n scene.remove(this._axishelper)\n scene.add(this._axishelper)\n }\n this.initTurtle()\n }\n },\n disposeAllTurtle: function () {\n // カメをクリア\n for (let i = 0; i < this.list.length; i++) {\n const tt = this.list[i]\n tt.mlist = [] // ジョブをクリア\n // かめのモデルをカメから削除\n this.disposeChildObject(tt.obj)\n }\n this.list = []\n this.target = -1\n this.camera = -1\n this.flagSetTimer = false\n },\n disposeAllLine: function () {\n // 引いた線を線用のバッファからクリア\n if (this._lines !== null) {\n this.disposeChildObject(this._lines)\n }\n },\n createDefaultTurtle: function () {\n const obj = new THREE.Group()\n\n const material = new THREE.LineBasicMaterial({ vertexColors: true })\n\n const vertices = new Float32Array([\n 0.0, 1.0, 0.0,\n -0.6, -1.0, 0.0,\n 0.0, -0.5, 0.0,\n 0.6, -1.0, 0.0,\n\n 0.0, 0.0, 0.5,\n 0.0, 1.0, 0.0,\n -0.6, -1.0, 0.0,\n 0.0, -0.5, 0.0,\n 0.6, -1.0, 0.0,\n\n 0.0, 0.0, -0.5,\n 0.0, 1.0, 0.0,\n -0.6, -1.0, 0.0,\n 0.0, -0.5, 0.0,\n 0.6, -1.0, 0.0\n ])\n\n const colors = new Float32Array([\n 0.0, 1.0, 0.0,\n 0.0, 1.0, 0.0,\n 0.0, 1.0, 0.0,\n 0.0, 1.0, 0.0,\n\n 1.0, 0.0, 0.0,\n 1.0, 0.0, 0.0,\n 1.0, 0.0, 0.0,\n 1.0, 0.0, 0.0,\n 1.0, 0.0, 0.0,\n\n 0.0, 0.0, 1.0,\n 0.0, 0.0, 1.0,\n 0.0, 0.0, 1.0,\n 0.0, 0.0, 1.0,\n 0.0, 0.0, 1.0\n ])\n\n const indices = [\n 0, 1, 1, 2, 2, 3, 3, 0,\n 4, 5, 4, 6, 4, 7, 4, 8,\n 9, 10, 9, 11, 9, 12, 9, 13\n ]\n\n const geometry = new THREE.BufferGeometry()\n geometry.setIndex(indices)\n geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3))\n geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3))\n geometry.computeBoundingSphere()\n\n const lineSegments = new THREE.LineSegments(geometry, material)\n lineSegments.scale.set(30.0, 30.0, 30.0)\n\n obj.add(lineSegments)\n return obj\n },\n createTurtle: function (modelUrl) {\n // カメの情報を sys._turtle リストに追加\n const id = this.list.length\n const tt = {\n id: id,\n obj: new THREE.Group(),\n home: {\n position: new THREE.Vector3(0, 0, 0),\n quaternion: new THREE.Quaternion()\n },\n color: new THREE.Color(0xffffff),\n lineWidth: 4,\n flagDown: true,\n flagLoaded: false,\n f_visible: true,\n mlist: []\n }\n this.list.push(tt)\n this.target = id\n tt.home.position.copy(tt.obj.position)\n tt.home.quaternion.copy(tt.obj.quaternion)\n this.loadTurtle(tt, modelUrl)\n const scene = this.getScene()\n scene.add(tt.obj)\n return id\n },\n loadTurtle: function (tt, url) {\n const loader = new THREE.ObjectLoader()\n const me = this\n if (url instanceof THREE.Object3D) {\n console.log('turtle.object')\n me.disposeChildObject(tt.obj)\n const obj = url\n tt.obj.add(obj)\n tt.flagLoaded = true\n me.doDraw()\n return\n }\n if (url.length === 0) {\n console.log('turtle.default')\n me.disposeChildObject(tt.obj)\n const obj = me.createDefaultTurtle()\n tt.obj.add(obj)\n tt.flagLoaded = true\n me.doDraw()\n return\n }\n loader.load(url, function (obj) {\n console.log('turtle.onload')\n me.disposeChildObject(tt.obj)\n tt.obj.add(obj)\n tt.flagLoaded = true\n me.doDraw()\n }, function (xhr) {\n // nothing\n }, function (xhr) {\n console.log('turtle.onerror')\n tt.flagLoaded = true\n tt.f_visible = false\n tt.obj.visible = false\n me.disposeChildObject(tt.obj)\n me.doDraw()\n })\n },\n initTurtle: function () {\n if (this.list.length === 0) {\n const index = this.createTurtle('')\n const tt = this.list[index]\n tt.obj.position.set(0, 0, 1000)\n const axis = new THREE.Vector3(0, 0, -1).normalize()\n const angle = 0\n tt.obj.quaternion.setFromAxisAngle(axis, angle)\n tt.home.position.copy(tt.obj.position)\n tt.home.quaternion.copy(tt.obj.quaternion)\n tt.f_visible = false\n tt.obj.visible = false\n this.camera = index\n this.target = -1\n }\n },\n getCur: function () {\n if (this.list.length === 0) {\n throw Error('最初に『T3Dカメ作成』命令を呼び出してください。')\n }\n if (this.target < 0 || this.target >= this.list.length) {\n throw Error('指定された番号のカメはいません。')\n }\n return this.list[this.target]\n },\n doDraw: function () {\n if (this.camera === -1) { return }\n this.getRenderer()\n const camera = this.list[this.camera]\n if (this._controls !== null) { //\n } else {\n this._camera.position.copy(camera.obj.position)\n this._camera.quaternion.copy(camera.obj.quaternion)\n }\n if (this._camerahelper !== null) {\n this._camerahelper.update()\n }\n this._renderer.clear()\n if (this._controls !== null) {\n this._controls.update()\n camera.obj.position.copy(this._camera.position)\n camera.obj.quaternion.copy(this._camera.quaternion)\n }\n this._renderer.render(this._scene, this._camera)\n },\n setCameraHelper: function (flag) {\n if (flag) {\n if (this._camerahelper === null) {\n if (typeof THREE.CameraHelper === 'undefined') {\n throw Error('カメラヘルパの機能が見当たりません。')\n }\n const cameraHelper = new THREE.CameraHelper(this._camera)\n this._camerahelper = cameraHelper\n this._scene.add(cameraHelper)\n }\n this._camerahelper.visible = true\n } else {\n if (this._camerahelper !== null) {\n this._camerahelper.visible = false\n }\n }\n },\n setAxisHelper: function (flag) {\n if (flag) {\n if (this._axishelper === null) {\n if (typeof THREE.AxisHelper === 'undefined') {\n throw Error('AXISヘルパの機能が見当たりません。')\n }\n const axisHelper = new THREE.AxisHelper(1000)\n this._axishelper = axisHelper\n this._scene.add(axisHelper)\n }\n this._axishelper.visible = true\n } else {\n if (this._axishelper !== null) {\n this._axishelper.visible = false\n }\n }\n },\n getScene: function () {\n if (this._scene === null) {\n const scene = new THREE.Scene()\n if (scene === null) {\n throw new Error('シーンを作成できません')\n }\n this._scene = scene\n }\n return this._scene\n },\n getCamera: function () {\n if (this._camera === null) {\n const camera = new THREE.PerspectiveCamera(60, 1.0, 1, 65000)\n if (camera === null) {\n throw new Error('カメラを作成できません')\n }\n this.resetCamera(camera)\n this._camera = camera\n }\n return this._camera\n },\n resetCamera: function (camera) {\n camera.position.set(0, 0, 1000)\n if (this._renderer !== null) {\n const rect = new THREE.Vector2()\n this._renderer.getSize(rect)\n camera.aspect = rect.width / rect.height\n }\n camera.up = new THREE.Vector3(0, 1, 0)\n camera.lookAt(new THREE.Vector3(0, 0, 0))\n },\n initTrutle3dEnv: function (renderer) {\n renderer.setClearColor(0x000000, 1.0)\n renderer.autoClear = false\n\n const scene = this.getScene()\n // eslint-disable-next-line no-unused-vars\n const camera = this.getCamera()\n\n scene.add(sys._weykturtle3d._lines)\n if (this.list.length === 0) {\n this.initTurtle()\n }\n },\n initRenderer: function () {\n // 描画先をセットする\n let to = sys.__v0['T3Dカメ描画先']\n if (typeof to === 'string') { to = document.querySelector(to) || document.getElementById(to) }\n if (!to) {\n throw new Error('[ERROR] T3Dカメ描画先が見当たりません。')\n }\n this.setRenderer(to)\n },\n setRenderer: function (to) {\n if (to instanceof THREE.WebGLRenderer) {\n this._renderer = to\n } else {\n const renderer = new THREE.WebGLRenderer({ antialias: false, alpha: true })\n if (renderer === null) {\n throw new Error('レンダラを作成できません')\n }\n renderer.setPixelRatio(window.devicePixelRatio)\n renderer.setSize(to.clientWidth, to.clientHeight)\n to.appendChild(renderer.domElement)\n this._renderer = renderer\n }\n return this._renderer\n },\n setupRenderer: function () {\n this.initTrutle3dEnv(this._renderer)\n },\n getRenderer: function () {\n if (this._renderer === null) {\n this.initRenderer()\n this.setupRenderer()\n }\n return this._renderer\n },\n setupControl: function (controlConstrucor) {\n if (typeof controlConstrucor === 'undefined') {\n throw new Error('指定されたコンコントロールが見当たりません。')\n }\n if (this._controls !== null) {\n if (this._controls instanceof controlConstrucor) {\n return this._controls\n } else {\n throw new Error('既にコントロールを適用しています。コントロールの変更はできません。')\n }\n }\n const renderer = this.getRenderer()\n const camera = this.getCamera(renderer)\n // eslint-disable-next-line new-cap\n const controls = new controlConstrucor(camera, renderer.domElement)\n controls.enabled = true\n this._controls = controls\n return this._controls\n },\n line: function (tt, v1, v2) {\n if (tt) {\n if (!tt.flagDown) { return }\n }\n const geometry = new THREE.BufferGeometry()\n const vertices = new THREE.Float32BufferAttribute(6, 3)\n vertices.copyVector3sArray([v1, v2])\n const material = new THREE.LineBasicMaterial({ color: tt.color, linewidth: tt.lineWidth })\n geometry.setAttribute('position', vertices)\n const line = new THREE.Line(geometry, material)\n this._lines.add(line)\n },\n doMacro: function (tt, wait) {\n const me = this\n if (!tt.flagLoaded && wait > 0) {\n console.log('[TURTLE] waiting ...')\n return true\n }\n const m = tt.mlist.shift()\n const cmd = (m !== undefined) ? m[0] : ''\n switch (cmd) {\n case 'xyz':\n // 起点を移動する\n tt.obj.position.copy(m[1])\n break\n case 'mv': {\n const v1 = tt.obj.position.clone()\n const v2 = m[1]\n // 線を引く\n this.line(tt, v1, v2)\n // カメの角度を変更\n tt.obj.lookAt(v2)\n const headup90 = new THREE.Quaternion()\n const axisX = new THREE.Vector3(1, 0, 0)\n headup90.setFromAxisAngle(axisX, Math.PI / 2)\n tt.obj.quaternion.multiply(headup90)\n // カメを移動\n tt.obj.position.copy(v2)\n break\n }\n case 'fd': {\n const v1 = tt.obj.position.clone()\n const v2 = new THREE.Vector3(0, m[1] * m[2], 0)\n v2.applyQuaternion(tt.obj.quaternion)\n v2.add(v1)\n this.line(tt, v1, v2)\n tt.obj.position.copy(v2)\n break\n }\n case 'su': {\n const v1 = tt.obj.position.clone()\n const v2 = new THREE.Vector3(0, m[1], 0)\n const modifier = new THREE.Quaternion()\n const axis = new THREE.Vector3(1, 0, 0)\n modifier.setFromAxisAngle(axis, (-90) * Math.PI / 180)\n const target = tt.obj.quaternion.clone()\n target.multiply(modifier)\n v2.applyQuaternion(target)\n v2.add(v1)\n this.line(tt, v1, v2)\n tt.obj.position.copy(v2)\n break\n }\n case 'sd': {\n const v1 = tt.obj.position.clone()\n const v2 = new THREE.Vector3(0, m[1], 0)\n const modifier = new THREE.Quaternion()\n const axis = new THREE.Vector3(1, 0, 0)\n modifier.setFromAxisAngle(axis, 90 * Math.PI / 180)\n const target = tt.obj.quaternion.clone()\n target.multiply(modifier)\n v2.applyQuaternion(target)\n v2.add(v1)\n this.line(tt, v1, v2)\n tt.obj.position.copy(v2)\n break\n }\n case 'sl': {\n const v1 = tt.obj.position.clone()\n const v2 = new THREE.Vector3(0, m[1], 0)\n const modifier = new THREE.Quaternion()\n const axis = new THREE.Vector3(0, 0, 1)\n modifier.setFromAxisAngle(axis, 90 * Math.PI / 180)\n const target = tt.obj.quaternion.clone()\n target.multiply(modifier)\n v2.applyQuaternion(target)\n v2.add(v1)\n this.line(tt, v1, v2)\n tt.obj.position.copy(v2)\n break\n }\n case 'sr': {\n const v1 = tt.obj.position.clone()\n const v2 = new THREE.Vector3(0, m[1], 0)\n const modifier = new THREE.Quaternion()\n const axis = new THREE.Vector3(0, 0, 1)\n modifier.setFromAxisAngle(axis, (-90) * Math.PI / 180)\n const target = tt.obj.quaternion.clone()\n target.multiply(modifier)\n v2.applyQuaternion(target)\n v2.add(v1)\n this.line(tt, v1, v2)\n tt.obj.position.copy(v2)\n break\n }\n case 'angle': {\n const euler = new THREE.Euler()\n euler.fromArray(m[1])\n // eslint-disable-next-line no-unused-vars\n const dir = new THREE.Quaternion()\n tt.obj.quaternion.setFromEuler(euler)\n break\n }\n case 'rotr': {\n const rv = m[1]\n const target = new THREE.Quaternion()\n const axis = new THREE.Vector3(0, 0, 1)\n target.setFromAxisAngle(axis, (-rv % 360) * Math.PI / 180)\n tt.obj.quaternion.multiply(target)\n break\n }\n case 'rotl': {\n const rv = m[1]\n const target = new THREE.Quaternion()\n const axis = new THREE.Vector3(0, 0, 1)\n target.setFromAxisAngle(axis, (rv % 360) * Math.PI / 180)\n tt.obj.quaternion.multiply(target)\n break\n }\n case 'rotu': {\n const rv = m[1]\n const target = new THREE.Quaternion()\n const axis = new THREE.Vector3(1, 0, 0)\n target.setFromAxisAngle(axis, (-rv % 360) * Math.PI / 180)\n tt.obj.quaternion.multiply(target)\n break\n }\n case 'rotd': {\n const rv = m[1]\n const target = new THREE.Quaternion()\n const axis = new THREE.Vector3(1, 0, 0)\n target.setFromAxisAngle(axis, (rv % 360) * Math.PI / 180)\n tt.obj.quaternion.multiply(target)\n break\n }\n case 'rolr': {\n const rv = m[1]\n const target = new THREE.Quaternion()\n const axis = new THREE.Vector3(0, 1, 0)\n target.setFromAxisAngle(axis, (rv % 360) * Math.PI / 180)\n tt.obj.quaternion.multiply(target)\n break\n }\n case 'roll': {\n const rv = m[1]\n const target = new THREE.Quaternion()\n const axis = new THREE.Vector3(0, 1, 0)\n target.setFromAxisAngle(axis, (-rv % 360) * Math.PI / 180)\n tt.obj.quaternion.multiply(target)\n break\n }\n case 'color':\n tt.color = new m[1]()\n break\n case 'size':\n tt.lineWidth = m[1]\n break\n case 'penOn':\n tt.flagDown = m[1]\n break\n case 'visible':\n tt.f_visible = m[1]\n if (tt.f_visible) {\n tt.obj.visible = true\n } else {\n tt.obj.visible = false\n }\n break\n case 'changeModel':\n tt.flagLoaded = false\n me.loadTurtle(tt, m[1])\n break\n case 'changeCamera':\n me.camera = m[1]\n break\n case 'sethome':\n tt.home.position.copy(tt.obj.position)\n tt.home.quaternion.copy(tt.obj.quaternion)\n break\n case 'gohome':\n tt.obj.position.copy(tt.home.position)\n tt.obj.quaternion.copy(tt.home.quaternion)\n break\n }\n return (tt.mlist.length > 0)\n },\n doMacroAll: function (wait) {\n let hasNext = false\n for (let i = 0; i < this.list.length; i++) {\n const tt = this.list[i]\n if (this.doMacro(tt, wait)) { hasNext = true }\n }\n return hasNext\n },\n flagSetTimer: false,\n animationStart: function () {\n const wait = this.getWait()\n if (wait === 0) {\n this.animation()\n return\n }\n if (this.flagSetTimer) { return }\n this.flagSetTimer = true\n this.animationFrame(this.animation)\n },\n getWait: function () {\n return sys.__v0['T3Dカメ速度']\n },\n disposeChildObject: function (obj) {\n while (obj.children.length > 0) {\n this.disposeChildObject(obj.children[0])\n obj.remove(obj.children[0])\n }\n if (obj.geometry) { obj.geometry.dispose() }\n\n if (obj.material) {\n Object.keys(obj.material).forEach(prop => {\n if (!obj.material[prop]) { return }\n if (typeof obj.material[prop].dispose === 'function') { obj.material[prop].dispose() }\n })\n obj.material.dispose()\n }\n },\n animation: function () {\n const me = sys._weykturtle3d\n const now = Date.now()\n const elapsedMs = now - me._prevUpdatedTime\n const wait = me.getWait()\n if (wait > 0 && elapsedMs < wait) {\n me.doDraw()\n me.animationFrame(me.animation)\n return\n }\n let hasNext = me.doMacroAll(wait)\n if (wait <= 0) {\n while (hasNext) {\n hasNext = me.doMacroAll(wait)\n }\n } else if (hasNext || me._controls !== null) {\n me.doDraw()\n me._prevUpdatedTime = now\n me.animationFrame(me.animation)\n return\n }\n me.doDraw()\n me.flagSetTimer = false\n }\n }\n sys._weykturtle3d.animationFrame = (function () {\n return function (callback, element) {\n window.setTimeout(callback, 1000 / 60)\n }\n /* window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame || */\n })()\n }\n },\n // @3Dタートルグラフィックス/カメ操作\n 'T3Dカメ作成': { // @タートルグラフィックスを開始してカメのIDを返す // @T3Dかめさくせい\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n sys._weykturtle3d.initTurtle()\n const modelUrl = sys.__v0['T3DカメモデルURL']\n const id = sys._weykturtle3d.createTurtle(modelUrl)\n return id\n },\n return_none: false\n },\n 'T3Dカメ操作対象設定': { // @IDを指定して操作対象となるカメを変更する // @T3Dかめそうさたいしょうせってい\n type: 'func',\n josi: [['に', 'へ', 'の']],\n pure: true,\n fn: function (id, sys) {\n if (!sys._weykturtle3d) { return null }\n sys._weykturtle3d.target = id\n },\n return_none: true\n },\n 'T3Dカメ描画先': { type: 'var', value: 'turtle3d_div' }, // @T3Dかめびょうがさき\n 'T3DカメモデルURL': { type: 'var', value: '' }, // @T3DかめもでるURL\n 'T3Dカメモデル変更': { // @カメのモデルをURLに変更する // @T3Dかめもでるへんこう\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (url, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['changeModel', url])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ速度': { type: 'const', value: 100 }, // @T3Dかめそくど\n 'T3Dカメ速度設定': { // @カメの動作速度vに設定(大きいほど遅い) // @T3Dかめそくどせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (v, sys) {\n sys.__varslist[0]['T3Dカメ速度'] = v\n },\n return_none: true\n },\n 'T3Dカメ移動': { // @カメの位置を[x,y,z]へ移動する // @T3Dかめいどう\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (xyz, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['mv', new THREE.Vector3(xyz[0], xyz[1], xyz[2])])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ原点設定': { // @カメの原点を現在の位置・向きに設定する // @T3Dかめげんてんせってい\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['sethome'])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ原点移動': { // @カメを原点の位置・向きに移動する(描画はしない) // @T3Dかめげんてんいどう\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['gohome'])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ起点移動': { // @カメの描画起点位置を[x,y,z]へ移動する // @T3Dかめきてんいどう\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (xyz, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['xyz', new THREE.Vector3(xyz[0], xyz[1], xyz[2])])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ進': { // @カメの位置をVだけ進める // @T3Dかめすすむ\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['fd', v, 1])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ戻': { // @カメの位置をVだけ戻す // @T3Dかめもどる\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['fd', v, -1])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ上平行移動': { // @カメの位置を上にVだけ進める // @T3Dかめうえへいこういどう\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['su', v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ下平行移動': { // @カメの位置を下にVだけ進める // @T3Dかめしたへいこういどう\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['sd', v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ左平行移動': { // @カメの位置を左にVだけ進める // @T3Dかめひだりへいこういどう\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['sl', v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ右平行移動': { // @カメの位置を右にVだけ進める // @T3Dかめみぎへいこういどう\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['sr', v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ動': { // @カメの位置をDIRにVだけ進める // @T3Dかめうごく\n type: 'func',\n josi: [['へ', 'に'], ['だけ']],\n pure: true,\n fn: function (dir, v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n let cmd = ''\n if (dir === '前' || dir === '後') {\n if (dir === '前') {\n tt.mlist.push(['fd', v, 1])\n } else {\n tt.mlist.push(['fd', v, -1])\n }\n } else {\n if (dir === '上' || dir === 'UP' || dir === 'うえ') {\n cmd = 'su'\n } else\n if (dir === '下' || dir === 'DOWN' || dir === 'した') {\n cmd = 'sd'\n } else\n if (dir === '右' || dir === 'RIGHT' || dir === 'みぎ') {\n cmd = 'sr'\n } else\n if (dir === '左' || dir === 'LEFT' || dir === 'ひだり') {\n cmd = 'sl'\n } else {\n throw Error('方向の指定が正しくありません。前後上下左右のいずれかで指定してください。')\n }\n tt.mlist.push([cmd, v])\n }\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ角度設定': { // @カメの向きをオイラー(XYZ)にて設定する // @T3Dかめかくどせってい\n type: 'func',\n josi: [['に', 'へ', 'の']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['angle', parseFloat(v)])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ右回転': { // @カメの向きをDEGだけ右に向ける // @T3Dかめみぎかいてん\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['rotr', v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ左回転': { // @カメの向きをDEGだけ左に向ける // @T3Dかめひだりかいてん\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['rotl', v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ上回転': { // @カメの向きをDEGだけ上に向ける // @T3Dかめうえかいてん\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['rotu', v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ下回転': { // @カメの向きをDEGだけ下に向ける // @T3Dかめしたかいてん\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['rotd', v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ回転': { // @カメの向きをDEGだけDIRに向ける // @T3Dかめかいてん\n type: 'func',\n josi: [['へ', 'に'], ['だけ']],\n pure: true,\n fn: function (dir, v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n let cmd = ''\n if (dir === '上' || dir === 'UP' || dir === 'うえ') {\n cmd = 'rotu'\n } else\n if (dir === '下' || dir === 'DOWN' || dir === 'した') {\n cmd = 'rotd'\n } else\n if (dir === '右' || dir === 'RIGHT' || dir === 'みぎ') {\n cmd = 'rotr'\n } else\n if (dir === '左' || dir === 'LEFT' || dir === 'ひだり') {\n cmd = 'rotl'\n } else {\n throw Error('方向の指定が正しくありません。上下左右のいずれかで指定してください。')\n }\n tt.mlist.push([cmd, v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ右ロール': { // @カメをDEGだけ右に傾ける // @T3Dかめみぎろーる\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['rolr', v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ左ロール': { // @カメのDEGだけ左に傾ける // @T3Dかめひだりろーる\n type: 'func',\n josi: [['だけ']],\n pure: true,\n fn: function (v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['roll', v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ傾': { // @カメをDEGだけDIRに傾ける // @T3Dかめかたむける\n type: 'func',\n josi: [['に', 'へ'], ['だけ']],\n pure: true,\n fn: function (dir, v, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n let cmd = ''\n if (dir === '右' || dir === 'RIGHT' || dir === 'みぎ') {\n cmd = 'rolr'\n } else\n if (dir === '左' || dir === 'LEFT' || dir === 'ひだり') {\n cmd = 'roll'\n } else {\n throw Error('向きの指定が正しくありません。左右のどちらかで指定してください。')\n }\n tt.mlist.push([cmd, v])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメペン色設定': { // @カメのペン描画色をCに設定する // @T3Dかめぺんいろせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (c, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['color', c])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメペンサイズ設定': { // @カメペンのサイズをWに設定する // @T3Dかめぺんさいずせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (w, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['size', w])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメペン設定': { // @カメペンを使うかどうかをV(オン/オフ)に設定する // @T3Dかめぺんせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (w, sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['penOn', w])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ全消去': { // @表示しているカメと描画内容を全部消去する // @T3Dかめぜんしょうきょ\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n sys._weykturtle3d.clearAll()\n },\n return_none: true\n },\n 'T3Dカメ非表示': { // @カメのモデルを非表示にする。描画に影響しない。 // @T3Dかめひひょうじ\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['visible', false])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3Dカメ表示': { // @非表示にしたカメのモデルを表示する。 // @T3Dかめひょうじ\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['visible', true])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3D視点カメ設定': { // @指定したカメを視点として使用する // @T3Dしてんかめせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (w, sys) {\n if (!sys._weykturtle3d) { return null }\n if (w < 0 || w >= sys._weykturtle3d.list.length) {\n throw Error('指定された番号のカメはいません。')\n }\n const tt = sys._weykturtle3d.getCur()\n tt.mlist.push(['changeCamera', w])\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n // @3Dタートルグラフィックス/基本機能\n 'T3D描画準備': { // @指定したDOMのIDに対する描画を準備し、描画オブジェクトを返す // @T3Dびょうがじゅんび\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (to, sys) {\n if (!sys._weykturtle3d) { return null }\n if (typeof THREE === 'undefined') {\n throw new Error('three.jsが読み込まれていません')\n }\n\n if (typeof to === 'string') { to = document.querySelector(to) || document.getElementById(to) }\n if (!to) { throw new Error('TJS描画準備に指定した描画先に誤りがあります') }\n\n sys._weykturtle3d.setRenderer(to)\n sys._weykturtle3d.setupRenderer()\n return sys._weykturtle3d._renderer\n },\n return_none: false\n },\n 'T3D描画': { // @現在の状態を描画する // @T3Dびょうが\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n sys._weykturtle3d.doDraw()\n },\n return_none: true\n },\n 'T3D背景色設定': { // @canvasをクリアする際の背景色を設定する // @T3Dはいけいしょくせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (c, sys) {\n if (!sys._weykturtle3d) { return null }\n if (sys._weykturtle3d._renderer === null) {\n sys._weykturtle3d.setRenderTarget()\n }\n sys._weykturtle3d._renderer.setClearColor(c)\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3D背景透過設定': { // @canvasをクリアする際の背景のアルファ値を設定する // @T3Dはいけいとうかせってい\n type: 'func',\n josi: [['に', 'へ']],\n pure: true,\n fn: function (c, sys) {\n if (!sys._weykturtle3d) { return null }\n if (sys._weykturtle3d._renderer === null) {\n sys._weykturtle3d.setRenderTarget()\n }\n sys._weykturtle3d._renderer.setClearAlpha(c)\n sys._weykturtle3d.animationStart()\n },\n return_none: true\n },\n 'T3DJSON取得': { // @描画した線のJSON形式で取得する // @T3DJSONしゅとく\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n return JSON.stringify(sys._weykturtle3d._lines.toJSON())\n },\n return_none: false\n },\n // @3Dタートルグラフィックス/ヘルパ機能\n 'T3Dオービットコントロール設定': { // オービットコントロールを組み込む // @T3Dおーびっとこんとろーるせってい\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n if (typeof THREE.OrbitControls !== 'undefined') {\n return sys._weykturtle3d.setupControl(THREE.OrbitControls)\n }\n return null\n },\n return_none: false\n },\n 'T3Dコントロール有効': { // @組み込んだコントロールを有効にする // @T3Dこんとろーるゆうこう\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n if (sys._weykturtle3d._controls) {\n sys._weykturtle3d._controls.enabled = true\n }\n },\n return_none: true\n },\n 'T3Dコントロール無効': { // @組み込んだコントロールを無効にする // @T3Dこんとろーるむこう\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n if (sys._weykturtle3d._controls) {\n sys._weykturtle3d._controls.enabled = false\n }\n },\n return_none: true\n },\n 'T3Dカメラヘルパ表示': { // @カメラヘルパーを表示する // @T3Dかめらへるぱひょうじ\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n sys._weykturtle3d.setCameraHelper(true)\n },\n return_none: true\n },\n 'T3Dカメラヘルパ非表示': { // @カメラヘルパーを非表示にする // @T3Dかめらへるぱひひょうじ\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n sys._weykturtle3d.setCameraHelper(false)\n },\n return_none: true\n },\n 'T3D軸線ヘルパ表示': { // @座標軸ヘルパーを表示する // @T3Dじくせんへるぱひょうじ\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n sys._weykturtle3d.setAxisHelper(true)\n },\n return_none: true\n },\n 'T3D軸線ヘルパ非表示': { // @座標軸ヘルパーを非表示にする // @T3Dじくせんへるぱひひょうじ\n type: 'func',\n josi: [],\n pure: true,\n fn: function (sys) {\n if (!sys._weykturtle3d) { return null }\n sys._weykturtle3d.setAxisHelper(false)\n },\n return_none: true\n }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (PluginWeykTurtle3D);\n\n// ブラウザからscriptタグで取り込んだ時、自動で登録する\nif (typeof (navigator) === 'object') {\n navigator.nako3.addPluginObject('PluginWeykTurtle3D', PluginWeykTurtle3D)\n}\n\n\n//# sourceURL=webpack://nadesiko3/./src/plugin_weykturtle3d.mjs?")}},__webpack_require__={r:function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})}},__webpack_exports__={};__webpack_modules__["./src/plugin_weykturtle3d.mjs"](0,__webpack_exports__,__webpack_require__)})();
|