babylonjs-editcontrol 3.2.4 → 3.3.0
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/LICENSE +201 -201
- package/README.md +453 -339
- package/dist/EditControl.d.ts +17 -4
- package/dist/EditControl.js +1 -1
- package/dist/EditControl.js.map +1 -1
- package/dist/EditControl.max.js +3 -0
- package/dist/EditControl.max.js.LICENSE.txt +9 -0
- package/dist/EditControl.max.js.map +1 -0
- package/package.json +38 -36
- package/src/EditControl.ts +103 -51
package/dist/EditControl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///external {\"commonjs\":\"babylonjs\",\"commonjs2\":\"babylonjs\",\"amd\":\"babylonjs\",\"root\":\"BABYLON\"}","webpack:///./src/EditControl.ts"],"names":["root","factory","exports","module","require","define","amd","a","i","window","__WEBPACK_EXTERNAL_MODULE__0__","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","EditControl","ActionType","babylonjs__WEBPACK_IMPORTED_MODULE_0__","mesh","camera","canvas","scale","eulerian","pickWidth","_this","this","_local","_snapT","_snapR","_transSnap","_rotSnap","Math","PI","_axesLen","_axesScale","_pickWidth","_redCol","_greenCol","_blueCol","_whiteCol","_yellowCol","_visibility","_lhsRhs","_ecMatrix","_ecTOcamera","_distFromCamera","_cameraTOec","_cameraNormal","_prevState","_hidden","_actionListener","_actionStartListener","_actionEndListener","_pDown","_pointerIsOver","_editing","_rotate2","_transBy","_snapTV","_snapS","_snapSV","_scaleSnap","_scale","_localX","_localY","_localZ","_eulerian","_snapRA","_transEnabled","_rotEnabled","_scaleEnabled","_guideSize","_tSnap","_tv1","_tv2","_tv3","_tm","_mesh","_mainCamera","_canvas","_checkQuaternion","_scene","getScene","_actHist","ActHist","computeWorldMatrix","_boundingDimesion","_getBoundingDimension","_setLocalAxes","_check_LHS_RHS","console","log","_ecRoot","rotationQuaternion","Identity","visibility","isPickable","_createMaterials","_createCommonAxes","parent","_createPickPlanes","_pointerdown","evt","_onPointerDown","_pointerup","_onPointerUp","_pointermove","_onPointerMove","addEventListener","_renderer","_renderLoopProcess","registerBeforeRender","getRoot","undefined","_issue","actualZ","Cross","Dot","position","getAbsolutePivotPoint","_setECRotation","_setECScale","getWorldMatrix","invertToRef","TransformCoordinatesToRef","_pALL","lookAt","LOCAL","subtractToRef","WORLD","_rotRotGuides","_rotPlanarGuides","_tXZ","_tZY","_tYX","_sXZ","_sZY","_sYX","rot","rotation","RotationYawPitchRollToRef","y","x","z","copyFrom","_isScaleUnEqual","getRotationMatrixToRef","FromRotationMatrixToRef","scaling","FromFloatArrayToRef","asArray","parentOnNormal","length","abs","FromFloatsToRef","rotX","atan","_rX","rotY","_rY","rotZ","_rZ","XZ","ZY","YX","ec","switchTo","refreshBoundingInfo","switchCamera","setUndoCount","setCapacity","undo","at","_callActionStartListener","_callActionListener","_callActionEndListener","redo","detach","removeEventListener","unregisterBeforeRender","removeAllActionListeners","_disposeAll","hide","disableTranslation","disableRotation","disableScaling","_hideCommonAxes","_xaxis","_yaxis","_zaxis","_showCommonAxes","show","enableTranslation","enableRotation","enableScaling","isHidden","dispose","_disposeMaterials","addActionListener","actionListener","removeActionListener","addActionStartListener","actionStartListener","removeActionStartListener","addActionEndListener","actionEndListener","removeActionEndListener","preventDefault","button","pickResult","pick","pointerX","pointerY","_tX","_tY","_tZ","_tAll","_rAll","_sX","_sY","_sZ","_sAll","hit","_axisPicked","pickedMesh","childs","getChildren","name_1","_bXaxis","_bYaxis","_bZaxis","_setEditing","_pickedPlane","_getPickPlane","_prevPos","_getPosOnPickPlane","setTimeout","cam","can","_detachCamera","editing","_setActionType","_actionType","ROT","isEditing","detachControl","isPointerOver","_onPointerOver","_prevOverMesh","_clearPrevOverMesh","_savedCol","color","_savedMat","material","_whiteMat","_restoreColor","attachControl","_hideBaxis","add","TRANS","SCALE","newPos","_doRotation","diff","subtract","_doTranslation","_doScaling","axis","_pXZ","_pZY","_pYX","_transWithSnap","_transBoundsMin","max","_transBoundsMax","min","trans","local","snapit","addInPlace","normalizeToRef","translate","setAbsolutePosition","absolutePosition","bbd","upVector","copyFromFloats","inPlane","_scaleWithSnap","_scaleBoundsMin","_scaleBoundsMax","meshMatrix","bb","getBoundingInfo","boundingBox","bd","maximum","minimum","prevPos","rAxis","angle","X","Y","Z","_getAngle2","useRightHandedSystem","_getAngle","normalize","rotate","toEulerAngles","pickinfo","pickedPoint","getRotationQuaternion","getPosition","isTranslationEnabled","_createTransAxes","_tCtl","_setVisibility","_all_tEnd","isRotationEnabled","returnEuler","euler","_rCtl","_createRotAxes","_all_rEnd","isScalingEnabled","_createScaleAxes","_sCtl","_all_sEnd","setScaleBounds","removeScaleBounds","setTransBounds","removeTransBounds","setRotBounds","_rotBoundsMin","_rotBoundsMax","removeRotBounds","guideAxes","CreateLines","al","renderingGroupId","CreatePlane","pickPlanes","_createPickableTrans","_createNonPickableTrans","tCtl","scene","tX","_extrudeBox","tY","clone","tZ","tXZ","size","tZY","tYX","bakeCurrentTransformIntoVertices","tAll","CreateBox","_all_t","_setPickableFalse","cl","tEndX","CreateCylinder","tEndY","tEndZ","tEndXZ","tEndZY","tEndYX","tEndAll","_redMat","_greenMat","_blueMat","_yellowMat","_tEndX","_tEndY","_tEndZ","_tEndXZ","_tEndZY","_tEndYX","_tEndAll","_setRenderingGroup","setRotGuideFull","_createPickableRot","_createNonPickableRot","rCtl","rX","_createTube","rY","rZ","rAll","_all_r","rEndX","_createCircle","rEndY","rEndZ","rEndAll","rEndAll2","Gray","_rEndX","_rEndY","_rEndZ","_rEndAll","_rEndAll2","meshes","v","map","w","shape","path","ExtrudeShape","double","points","cos","sin","CreateTube","NO_CAP","_createPickableScale","_createNonPickableScale","sCtl","sX","sY","sZ","sXZ","sZY","sYX","sAll","_all_s","sEndX","sEndY","sEndZ","sEndXZ","sEndZY","sEndYX","sEndAll","_sEndX","_sEndY","_sEndZ","_sEndXZ","_sEndZY","_sEndYX","_sEndAll","setVisibility","setLocal","isLocal","setTransSnap","setRotSnap","setScaleSnap","setTransSnapValue","setRotSnapValue","setScaleSnapValue","p1","p2","cameraPos","c2ec","mN","scaleToRef","addToRef","q","subtractInPlace","mv","CrossToRef","asin","_getStandardMaterial","col","mat","emissiveColor","diffuseColor","Black","specularColor","backFaceCulling","capacity","lastMax","acts","Array","last","current","error","act","Act","splice","shift","push","getActionType","perform","_p","_rQ","_rE","_s","_at","RotationYawPitchRoll"],"mappings":"CAAA,SAAAA,EAAAC,GACA,oBAAAC,SAAA,iBAAAC,OACAA,OAAAD,QAAAD,EAAAG,QAAA,mBACA,sBAAAC,eAAAC,IACAD,OAAA,cAAAJ,OACA,CACA,IAAAM,EAAA,iBAAAL,QAAAD,EAAAG,QAAA,cAAAH,EAAAD,EAAA,SACA,QAAAQ,KAAAD,GAAA,iBAAAL,gBAAAF,GAAAQ,GAAAD,EAAAC,IAPA,CASCC,OAAA,SAAAC,GACD,mBCTA,IAAAC,EAAA,GAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAX,QAGA,IAAAC,EAAAQ,EAAAE,GAAA,CACAL,EAAAK,EACAC,GAAA,EACAZ,QAAA,IAUA,OANAa,EAAAF,GAAAG,KAAAb,EAAAD,QAAAC,IAAAD,QAAAU,GAGAT,EAAAW,GAAA,EAGAX,EAAAD,QA0DA,OArDAU,EAAAK,EAAAF,EAGAH,EAAAM,EAAAP,EAGAC,EAAAO,EAAA,SAAAjB,EAAAkB,EAAAC,GACAT,EAAAU,EAAApB,EAAAkB,IACAG,OAAAC,eAAAtB,EAAAkB,EAAA,CAA0CK,YAAA,EAAAC,IAAAL,KAK1CT,EAAAe,EAAA,SAAAzB,GACA,oBAAA0B,eAAAC,aACAN,OAAAC,eAAAtB,EAAA0B,OAAAC,YAAA,CAAwDC,MAAA,WAExDP,OAAAC,eAAAtB,EAAA,KAAiD4B,OAAA,KAQjDlB,EAAAmB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAAlB,EAAAkB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,EAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFAvB,EAAAe,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAAlB,EAAAO,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAtB,EAAA0B,EAAA,SAAAnC,GACA,IAAAkB,EAAAlB,KAAA8B,EACA,WAA2B,OAAA9B,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAS,EAAAO,EAAAE,EAAA,IAAAA,GACAA,GAIAT,EAAAU,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD5B,EAAA+B,EAAA,GAIA/B,IAAAgC,EAAA,mBClFAzC,EAAAD,QAAAQ,gCCCAE,EAAAe,EAAAkB,GAAAjC,EAAAO,EAAA0B,EAAA,gCAAAC,IAAA,IAwBKC,EAxBLC,EAAApC,EAAA,IAwBA,SAAKmC,GACDA,IAAA,iBACAA,IAAA,aACAA,IAAA,iBAHJ,CAAKA,MAAU,KAmBf,IAAAD,EAAA,WAwCI,SAAAA,EAAmBG,EAAYC,EAAgBC,EAA2BC,EAAgBC,EAAoBC,GAA9G,IAAAC,EAAAC,KA/BQA,KAAAC,GAAkB,EAClBD,KAAAE,GAAkB,EAClBF,KAAAG,GAAkB,EAClBH,KAAAI,EAAqB,EACrBJ,KAAAK,EAAmBC,KAAKC,GAAK,GAC7BP,KAAAQ,EAAmB,GACnBR,KAAAS,EAAqB,EAErBT,KAAAU,EAAqB,IAMrBV,KAAAW,EAAkB,IAAInB,EAAA,OAAO,EAAG,GAAK,IACrCQ,KAAAY,EAAoB,IAAIpB,EAAA,OAAO,GAAK,EAAG,IACvCQ,KAAAa,EAAmB,IAAIrB,EAAA,OAAO,GAAK,GAAK,GACxCQ,KAAAc,EAAoB,IAAItB,EAAA,OAAO,EAAG,EAAG,GACrCQ,KAAAe,EAAqB,IAAIvB,EAAA,OAAO,EAAG,EAAG,IAQtCQ,KAAAgB,EAAsB,IAGtBhB,KAAAiB,GAAmB,EAsGnBjB,KAAAkB,EAAoB,IAAI1B,EAAA,OAExBQ,KAAAmB,EAAuB,IAAI3B,EAAA,QAAQ,EAAG,EAAG,GAuEzCQ,KAAAoB,EAA0B,EAE1BpB,KAAAqB,EAAuB,IAAI7B,EAAA,QAAQ,EAAG,EAAG,GACzCQ,KAAAsB,EAAyB,IAAI9B,EAAA,QAAQ,EAAG,EAAG,GA0I3CQ,KAAAuB,EAAqB,GACrBvB,KAAAwB,GAAmB,EAsDnBxB,KAAAyB,EAAgD,KAChDzB,KAAA0B,EAAqD,KACrD1B,KAAA2B,EAAmD,KA2BnD3B,KAAA4B,GAAkB,EAwFlB5B,KAAA6B,GAA0B,EAyF1B7B,KAAA8B,GAAoB,EAiFpB9B,KAAA+B,GAAoB,EA4DpB/B,KAAAgC,GAAoB,IAAIxC,EAAA,QAAQ,EAAG,EAAG,GA2CtCQ,KAAAiC,GAAmB,IAAIzC,EAAA,QAAQ,EAAG,EAAG,GAgDrCQ,KAAAkC,IAAkB,EAClBlC,KAAAmC,GAAmB,IAAI3C,EAAA,QAAQ,EAAG,EAAG,GACrCQ,KAAAoC,GAAqB,IACrBpC,KAAAqC,GAAkB,IAAI7C,EAAA,QAAQ,EAAG,EAAG,GAwHpCQ,KAAAsC,GAAmB,IAAI9C,EAAA,QAAQ,EAAG,EAAG,GACrCQ,KAAAuC,GAAmB,IAAI/C,EAAA,QAAQ,EAAG,EAAG,GACrCQ,KAAAwC,GAAmB,IAAIhD,EAAA,QAAQ,EAAG,EAAG,GA+CrCQ,KAAAyC,IAAqB,EACrBzC,KAAA0C,GAAkB,EAmIlB1C,KAAA2C,IAAyB,EA4BzB3C,KAAA4C,IAAuB,EAgCvB5C,KAAA6C,IAAyB,EA2VzB7C,KAAA8C,GAAqB,IAqWrB9C,KAAA+C,GAAkB,IAAIvD,EAAA,QAAQQ,KAAKI,EAAYJ,KAAKI,EAAYJ,KAAKI,GAkBrEJ,KAAAgD,GAAgB,IAAIxD,EAAA,QAAQ,EAAG,EAAG,GAClCQ,KAAAiD,GAAgB,IAAIzD,EAAA,QAAQ,EAAG,EAAG,GAClCQ,KAAAkD,GAAgB,IAAI1D,EAAA,QAAQ,EAAG,EAAG,GAClCQ,KAAAmD,GAAc,IAAI3D,EAAA,OAt2DtBQ,KAAKoD,GAAQ3D,EACbO,KAAKqD,GAAc3D,EACnBM,KAAKsD,GAAU3D,EAEF,MAATC,IACAI,KAAKS,EAAab,GAIlBI,KAAKyC,GADQ,OAAb5C,GACiBA,EAIrBG,KAAKuD,KAEY,MAAbzD,IACAE,KAAKU,EAAaZ,GAGtBE,KAAKwD,GAAS/D,EAAKgE,WACnBzD,KAAK0D,GAAW,IAAIC,EAAQlE,EAAM,IAElCA,EAAKmE,oBAAmB,GACxB5D,KAAK6D,GAAoB7D,KAAK8D,GAAsBrE,GACpDO,KAAK+D,GAActE,GACnBO,KAAKiB,EAAUjB,KAAKgE,GAAevE,GACnCwE,QAAQC,IAAI,iBAAmBlE,KAAKiB,GAGpCjB,KAAKmE,GAAU,IAAI3E,EAAA,KAAK,GAAIQ,KAAKwD,IACjCxD,KAAKmE,GAAQC,mBAAqB5E,EAAA,WAAW6E,WAC7CrE,KAAKmE,GAAQG,WAAa,EAC1BtE,KAAKmE,GAAQI,YAAa,EAE1BvE,KAAKwE,GAAiBxE,KAAKwD,IAELxD,KAAKyE,KACjBC,OAAS1E,KAAKmE,GAGDnE,KAAK2E,KACjBD,OAAS1E,KAAKmE,GAEzBnE,KAAK4E,GAAe,SAACC,GAAU,OAAO9E,EAAK+E,GAAeD,IAC1D7E,KAAK+E,GAAa,SAACF,GAAU,OAAO9E,EAAKiF,GAAaH,IACtD7E,KAAKiF,GAAe,SAACJ,GAAU,OAAO9E,EAAKmF,GAAeL,IAM1DlF,EAAOwF,iBAAiB,cAAenF,KAAK4E,IAAc,GAC1DjF,EAAOwF,iBAAiB,YAAanF,KAAK+E,IAAY,GACtDpF,EAAOwF,iBAAiB,cAAenF,KAAKiF,IAAc,GAG1DjF,KAAKoF,GAAY,WAAQ,OAAOrF,EAAKsF,MACrCrF,KAAKwD,GAAO8B,qBAAqBtF,KAAKoF,IA45D9C,OAz5DW9F,EAAAL,UAAAsG,QAAP,WACI,OAAOvF,KAAKmE,IAKR7E,EAAAL,UAAAsE,GAAR,WACI,IAAKvD,KAAKyC,KACgC,MAAjCzC,KAAKoD,GAAMgB,oBAAiEoB,MAAjCxF,KAAKoD,GAAMgB,oBACvD,KAAM,iFAgBV9E,EAAAL,UAAA+E,GAAR,SAAuBvE,GACnB,IAAIgG,GAAkB,EAClBjJ,EAAaiD,EAAKiF,OACtB,GAAY,MAARlI,EAAc,OAAO,EACzBwD,KAAK+D,GAAcvH,GACnB,IAAIkJ,EAAUlG,EAAA,QAAQmG,MAAM3F,KAAKsC,GAAStC,KAAKuC,IAK/C,OAH4CkD,EAAxCjG,EAAA,QAAQoG,IAAIF,EAAS1F,KAAKwC,IAAW,EAEzCxC,KAAK+D,GAActE,GACZgG,GAMHnG,EAAAL,UAAAoG,GAAR,WAGIrF,KAAKmE,GAAQ0B,SAAW7F,KAAKoD,GAAM0C,wBACnC9F,KAAK+F,KAGL/F,KAAKgG,KAGDhG,KAAKC,GACLD,KAAKmE,GAAQ8B,iBAAiBC,YAAYlG,KAAKkB,GAC/C1B,EAAA,QAAQ2G,0BAA0BnG,KAAKqD,GAAYwC,SAAU7F,KAAKkB,EAAWlB,KAAKmB,GAElFnB,KAAKoG,GAAMC,OAAOrG,KAAKmB,EAAa,EAAG,EAAG,EAAG3B,EAAA,MAAM8G,SAEnDtG,KAAKqD,GAAYwC,SAASU,cAAcvG,KAAKmE,GAAQ0B,SAAU7F,KAAKmB,GACpEnB,KAAKoG,GAAMC,OAAOrG,KAAKqD,GAAYwC,SAAU,EAAG,EAAG,EAAGrG,EAAA,MAAMgH,QAI5DxG,KAAK4C,GACL5C,KAAKyG,KAEAzG,KAAK2C,GAAe3C,KAAK0G,GAAiB1G,KAAK2G,GAAM3G,KAAK4G,GAAM5G,KAAK6G,IACrE7G,KAAK6C,IAAe7C,KAAK0G,GAAiB1G,KAAK8G,GAAM9G,KAAK+G,GAAM/G,KAAKgH,KAS1E1H,EAAAL,UAAA8G,GAAR,WACI,GAAI/F,KAAKC,EACL,GAAyB,MAArBD,KAAKoD,GAAMsB,OACX,GAAI1E,KAAKyC,GAAW,CAChB,IAAIwE,EAAejH,KAAKoD,GAAM8D,SAC9B1H,EAAA,WAAW2H,0BAA0BF,EAAIG,EAAGH,EAAII,EAAGJ,EAAIK,EAAGtH,KAAKmE,GAAQC,yBAEvEpE,KAAKmE,GAAQC,mBAAmBmD,SAASvH,KAAKoD,GAAMgB,wBAErD,CAEH,GAAIpE,KAAKwH,GAAgBxH,KAAKoD,IAAQ,OAEtCpD,KAAKoD,GAAM6C,iBAAiBwB,uBAAuBzH,KAAKmD,IACxD3D,EAAA,WAAWkI,wBAAwB1H,KAAKmD,GAAKnD,KAAKmE,GAAQC,sBAQ9D9E,EAAAL,UAAAuI,GAAR,SAAwB/H,GACpB,GAAmB,MAAfA,EAAKiF,OAAgB,OAAO,EAChC,KAAsB,MAAfjF,EAAKiF,QAAgB,CACxB,GAAYjF,EAAKiF,OAAQiD,QAAQN,GAAY5H,EAAKiF,OAAQiD,QAAQP,GACvD3H,EAAKiF,OAAQiD,QAAQP,GAAY3H,EAAKiF,OAAQiD,QAAQL,EAC7D,OAAO,EAEP7H,EAAaA,EAAKiF,OAG1B,OAAO,GAQHpF,EAAAL,UAAA+G,GAAR,WACIhG,KAAKmE,GAAQ0B,SAASU,cAAcvG,KAAKqD,GAAYwC,SAAU7F,KAAKqB,GACpE7B,EAAA,QAAQoI,oBAAoB5H,KAAKqD,GAAY4C,iBAAiB4B,UAAW,EAAG7H,KAAKsB,GAIjF,IAAIwG,EAAyBtI,EAAA,QAAQoG,IAAI5F,KAAKqB,EAAarB,KAAKsB,GAAiBtB,KAAKsB,EAAcyG,SAEhG3I,EAAYkB,KAAK0H,IAAIF,EAAiB9H,KAAKoB,GAC/C5B,EAAA,QAAQyI,gBAAgB7I,EAAGA,EAAGA,EAAGY,KAAKmE,GAAQwD,UAM1CrI,EAAAL,UAAAwH,GAAR,WACI,IAAIyB,EAAO5H,KAAK6H,KAAKnI,KAAKmB,EAAYiG,EAAIpH,KAAKmB,EAAYmG,GACvDtH,KAAKmB,EAAYmG,GAAK,EACtBtH,KAAKoI,GAAIlB,SAASG,GAAKa,EAEvBlI,KAAKoI,GAAIlB,SAASG,GAAKa,EAAO5H,KAAKC,GAGvC,IAAI8H,EAAO/H,KAAK6H,KAAKnI,KAAKmB,EAAYkG,EAAIrH,KAAKmB,EAAYmG,GACvDtH,KAAKmB,EAAYmG,GAAK,EACtBtH,KAAKsI,GAAIpB,SAASE,EAAIiB,EAEtBrI,KAAKsI,GAAIpB,SAASE,EAAIiB,EAAO/H,KAAKC,GAGtC,IAAIgI,EAAOjI,KAAK6H,KAAKnI,KAAKmB,EAAYkG,EAAIrH,KAAKmB,EAAYiG,GACvDpH,KAAKmB,EAAYiG,GAAK,EACtBpH,KAAKwI,GAAItB,SAASI,GAAKiB,EAEvBvI,KAAKwI,GAAItB,SAASI,GAAKiB,EAAOjI,KAAKC,IAOnCjB,EAAAL,UAAAyH,GAAR,SAAyB+B,EAAUC,EAAUC,GACzC,IAAIC,EAAc5I,KAAKmB,EAEvBsH,EAAGvB,SAASG,EAAI,EAChBoB,EAAGvB,SAASE,EAAI,EAChBqB,EAAGvB,SAASI,EAAI,EAEhBoB,EAAGxB,SAASG,EAAI,EAChBqB,EAAGxB,SAASE,EAAI,EAChBsB,EAAGxB,SAASI,EAAI,EAEhBqB,EAAGzB,SAASG,EAAI,EAChBsB,EAAGzB,SAASE,EAAI,EAChBuB,EAAGzB,SAASI,EAAI,EAEZsB,EAAGvB,GAAK,GAAKuB,EAAGxB,GAAK,GAAKwB,EAAGtB,GAAK,GAClCmB,EAAGvB,SAASI,EAAI,KAChBqB,EAAGzB,SAASE,EAAI,MACTwB,EAAGvB,GAAK,GAAKuB,EAAGxB,GAAK,GAAKwB,EAAGtB,GAAK,GACzCmB,EAAGvB,SAASE,EAAI,KAChBsB,EAAGxB,SAASE,EAAI,KAChBuB,EAAGzB,SAASE,EAAI,MACTwB,EAAGvB,GAAK,GAAKuB,EAAGxB,GAAK,GAAKwB,EAAGtB,GAAK,GACzCmB,EAAGvB,SAASG,EAAI,KAChBqB,EAAGxB,SAASE,EAAI,MACTwB,EAAGvB,GAAK,GAAKuB,EAAGxB,GAAK,GAAKwB,EAAGtB,GAAK,GACzCoB,EAAGxB,SAASI,EAAI,KAChBqB,EAAGzB,SAASG,EAAI,MACTuB,EAAGvB,GAAK,GAAKuB,EAAGxB,GAAK,GAAKwB,EAAGtB,GAAK,GACzCmB,EAAGvB,SAASI,EAAI,KAChBoB,EAAGxB,SAASI,EAAI,KAChBqB,EAAGzB,SAASI,EAAI,MACTsB,EAAGvB,GAAK,GAAKuB,EAAGxB,GAAK,GAAKwB,EAAGtB,GAAK,GACzCmB,EAAGvB,SAASE,EAAI,KAChBsB,EAAGxB,SAASG,EAAI,KAChBsB,EAAGzB,SAASI,EAAI,MACTsB,EAAGvB,GAAK,GAAKuB,EAAGxB,GAAK,GAAKwB,EAAGtB,GAAK,IACzCmB,EAAGvB,SAASG,EAAI,KAChBqB,EAAGxB,SAASG,EAAI,KAChBsB,EAAGzB,SAASG,EAAI,OAMjB/H,EAAAL,UAAA4J,SAAP,SAAgBpJ,EAAqBI,GACjCJ,EAAKmE,oBAAmB,GACxB5D,KAAKoD,GAAQ3D,EACG,MAAZI,IACAG,KAAKyC,GAAY5C,GAErBG,KAAKuD,KACLvD,KAAK+D,GAActE,GACnBO,KAAK0D,GAAW,IAAIC,EAAQlE,EAAM,IAClCO,KAAKiB,EAAUjB,KAAKgE,GAAevE,GACnCO,KAAK8I,uBAGFxJ,EAAAL,UAAA8J,aAAP,SAAoBrJ,GAChBM,KAAKqD,GAAc3D,GAGhBJ,EAAAL,UAAA+J,aAAP,SAAoBtL,GAChBsC,KAAK0D,GAASuF,YAAYvL,IAGvB4B,EAAAL,UAAAiK,KAAP,WACI,IAAIC,EAAanJ,KAAK0D,GAASwF,OAC/BlJ,KAAKoD,GAAMQ,oBAAmB,GAC9B5D,KAAK+D,GAAc/D,KAAKoD,IACxBpD,KAAKoJ,GAAyBD,GAC9BnJ,KAAKqJ,GAAoBF,GACzBnJ,KAAKsJ,GAAuBH,IAGzB7J,EAAAL,UAAAsK,KAAP,WACI,IAAIJ,EAAanJ,KAAK0D,GAAS6F,OAC/BvJ,KAAKoD,GAAMQ,oBAAmB,GAC9B5D,KAAK+D,GAAc/D,KAAKoD,IACxBpD,KAAKoJ,GAAyBD,GAC9BnJ,KAAKqJ,GAAoBF,GACzBnJ,KAAKsJ,GAAuBH,IAOzB7J,EAAAL,UAAAuK,OAAP,WACIxJ,KAAKsD,GAAQmG,oBAAoB,cAAezJ,KAAK4E,IAAc,GACnE5E,KAAKsD,GAAQmG,oBAAoB,YAAazJ,KAAK+E,IAAY,GAC/D/E,KAAKsD,GAAQmG,oBAAoB,cAAezJ,KAAKiF,IAAc,GACnEjF,KAAKwD,GAAOkG,uBAAuB1J,KAAKoF,IACxCpF,KAAK2J,2BACL3J,KAAK4J,MAQFtK,EAAAL,UAAA4K,KAAP,WACI7J,KAAKwB,GAAU,EACXxB,KAAK2C,IACL3C,KAAKuB,EAAa,IAClBvB,KAAK8J,sBACE9J,KAAK4C,IACZ5C,KAAKuB,EAAa,IAClBvB,KAAK+J,mBACE/J,KAAK6C,KACZ7C,KAAKuB,EAAa,IAClBvB,KAAKgK,kBAEThK,KAAKiK,MAGD3K,EAAAL,UAAAgL,GAAR,WACIjK,KAAKkK,GAAO5F,WAAa,EACzBtE,KAAKmK,GAAO7F,WAAa,EACzBtE,KAAKoK,GAAO9F,WAAa,GAErBhF,EAAAL,UAAAoL,GAAR,WACIrK,KAAKkK,GAAO5F,WAAatE,KAAKgB,EAC9BhB,KAAKmK,GAAO7F,WAAatE,KAAKgB,EAC9BhB,KAAKoK,GAAO9F,WAAatE,KAAKgB,GAK3B1B,EAAAL,UAAAqL,KAAP,WACItK,KAAKwB,GAAU,EACfxB,KAAKqK,KACkB,KAAnBrK,KAAKuB,EAAmBvB,KAAKuK,oBACL,KAAnBvK,KAAKuB,EAAmBvB,KAAKwK,iBACV,KAAnBxK,KAAKuB,GAAmBvB,KAAKyK,iBAMnCnL,EAAAL,UAAAyL,SAAP,WACI,OAAO1K,KAAKwB,GAGRlC,EAAAL,UAAA2K,GAAR,WACI5J,KAAKmE,GAAQwG,UACb3K,KAAK4K,KACL5K,KAAK0D,GAAW,MAObpE,EAAAL,UAAA4L,kBAAP,SAAyBC,GACrB9K,KAAKyB,EAAkBqJ,GAEpBxL,EAAAL,UAAA8L,qBAAP,WACI/K,KAAKyB,EAAkB,MAEpBnC,EAAAL,UAAA+L,uBAAP,SAA8BC,GAC1BjL,KAAK0B,EAAuBuJ,GAEzB3L,EAAAL,UAAAiM,0BAAP,WACIlL,KAAK0B,EAAuB,MAEzBpC,EAAAL,UAAAkM,qBAAP,SAA4BC,GACxBpL,KAAK2B,EAAqByJ,GAEvB9L,EAAAL,UAAAoM,wBAAP,WACIrL,KAAK2B,EAAqB,MAGvBrC,EAAAL,UAAA0K,yBAAP,WACI3J,KAAKyB,EAAkB,KACvBzB,KAAK0B,EAAuB,KAC5B1B,KAAK2B,EAAqB,MAOtBrC,EAAAL,UAAA6F,GAAR,SAAuBD,GAAvB,IAAA9E,EAAAC,KAGI,GAFA6E,EAAIyG,iBACJtL,KAAK4B,GAAS,EACoB,GAAfiD,EAAK0G,OAAxB,CAGA,IAAIC,EAA0BxL,KAAKwD,GAAOiI,KAAKzL,KAAKwD,GAAOkI,SAAU1L,KAAKwD,GAAOmI,SAAU,SAAClM,GACxF,GAAIM,EAAK4C,IACL,GAAKlD,GAAQM,EAAK6L,IAASnM,GAAQM,EAAK8L,IAASpM,GAAQM,EAAK+L,IAASrM,GAAQM,EAAK4G,IAAUlH,GAAQM,EAAK6G,IAAUnH,GAAQM,EAAK8G,IAAUpH,GAAQM,EAAKgM,GAAQ,OAAO,OACrK,GAAKhM,EAAgB,IACxB,GAAKN,GAAQM,EAAKqI,IAAS3I,GAAQM,EAAKuI,IAAS7I,GAAQM,EAAKyI,IAAS/I,GAAQM,EAAKiM,GAAQ,OAAO,OAChG,GAAKjM,EAAkB,KACrBN,GAAQM,EAAKkM,IAASxM,GAAQM,EAAKmM,IAASzM,GAAQM,EAAKoM,IAAS1M,GAAQM,EAAK+G,IAAUrH,GAAQM,EAAKgH,IAAUtH,GAAQM,EAAKiH,IAAUvH,GAAQM,EAAKqM,IAAQ,OAAO,EAE5K,OAAO,GACR,KAAMpM,KAAKqD,IAEd,GAAImI,EAAWa,IAAK,CAEhBrM,KAAKsM,GAAoBd,EAAWe,WACpC,IAAIC,EAAiBxM,KAAKsM,GAAYG,cAClCD,EAAOzE,OAAS,EACTyE,EAAO,GAAIlI,WAAatE,KAAKgB,EAEpChB,KAAKsM,GAAYhI,WAAatE,KAAKgB,EAEvC,IAAI0L,EAAe1M,KAAKsM,GAAY1O,KACvB,KAAR8O,EAAc1M,KAAK2M,GAAQrI,WAAa,EAC3B,KAARoI,EAAc1M,KAAK4M,GAAQtI,WAAa,EAChC,KAARoI,EAAc1M,KAAK6M,GAAQvI,WAAa,EAChC,MAARoI,GACN1M,KAAK2M,GAAQrI,WAAa,EAC1BtE,KAAK6M,GAAQvI,WAAa,GACV,MAARoI,GACR1M,KAAK6M,GAAQvI,WAAa,EAC1BtE,KAAK4M,GAAQtI,WAAa,GACV,MAARoI,GACR1M,KAAK4M,GAAQtI,WAAa,EAC1BtE,KAAK2M,GAAQrI,WAAa,GACV,OAARoI,IACR1M,KAAK2M,GAAQrI,WAAa,EAC1BtE,KAAK4M,GAAQtI,WAAa,EAC1BtE,KAAK6M,GAAQvI,WAAa,GAE9BtE,KAAK8M,IAAY,GAEjB9M,KAAK+M,GAAe/M,KAAKgN,GAAchN,KAAKsM,IACnB,MAArBtM,KAAK+M,GACL/M,KAAKiN,GAAWjN,KAAKkN,KAErBlN,KAAKiN,GAAW,KAEpBhQ,OAAOkQ,WAAW,SAAEC,EAAKC,GAAU,OAAOtN,EAAKuN,GAAcF,EAAKC,IAAS,EAAGrN,KAAKqD,GAAarD,KAAKsD,OAIrGhE,EAAAL,UAAA6N,GAAR,SAAoBS,GAChBvN,KAAK8B,EAAWyL,EACZA,GACAvN,KAAKwN,KACDxN,KAAKyN,IAAelO,EAAWmO,MAC/B1N,KAAK0C,GAAU,GAEnB1C,KAAKoJ,GAAyBpJ,KAAKyN,KAEnCzN,KAAKsJ,GAAuBtJ,KAAKyN,KAIlCnO,EAAAL,UAAA0O,UAAP,WACI,OAAO3N,KAAK8B,GAMRxC,EAAAL,UAAAqO,GAAR,SAAsBF,EAAaC,GAC/B,IACI1N,EAA+C0N,EADtBD,EAEtBQ,cAAcjO,IAOlBL,EAAAL,UAAA4O,cAAP,WACI,OAAO7N,KAAK6B,GAIRvC,EAAAL,UAAA6O,GAAR,eAAA/N,EAAAC,KAEQwL,EAA0BxL,KAAKwD,GAAOiI,KAAKzL,KAAKwD,GAAOkI,SAAU1L,KAAKwD,GAAOmI,SAAU,SAAClM,GACxF,GAAIM,EAAK4C,IACL,GAAKlD,GAAQM,EAAK6L,IAASnM,GAAQM,EAAK8L,IAASpM,GAAQM,EAAK+L,IAASrM,GAAQM,EAAK4G,IAAUlH,GAAQM,EAAK6G,IAAUnH,GAAQM,EAAK8G,IAAUpH,GAAQM,EAAKgM,GAAQ,OAAO,OACrK,GAAKhM,EAAgB,IACxB,GAAKN,GAAQM,EAAKqI,IAAS3I,GAAQM,EAAKuI,IAAS7I,GAAQM,EAAKyI,IAAS/I,GAAQM,EAAKiM,GAAQ,OAAO,OAChG,GAAIjM,EAAK8C,KACPpD,GAAQM,EAAKkM,IAASxM,GAAQM,EAAKmM,IAASzM,GAAQM,EAAKoM,IAAS1M,GAAQM,EAAK+G,IAAUrH,GAAQM,EAAKgH,IAAUtH,GAAQM,EAAKiH,IAAUvH,GAAQM,EAAKqM,IAAQ,OAAO,EAE5K,OAAO,GACR,KAAMpM,KAAKqD,IACd,GAAImI,EAAWa,KAEX,GAAUb,EAAWe,YAAcvM,KAAK+N,GAAe,CAKnD,GAJA/N,KAAK6B,GAAiB,EAEtB7B,KAAKgO,KACLhO,KAAK+N,GAAsBvC,EAAWe,WAClCvM,KAAK4C,GACL5C,KAAKiO,GAAwBjO,KAAK+N,GAActB,cAAc,GAAIyB,MACtDlO,KAAK+N,GAActB,cAAc,GAAIyB,MAAQlO,KAAKc,MAC3D,CACH,IAAI0L,EAAiBxM,KAAK+N,GAActB,cACpCD,EAAOzE,OAAS,GAChB/H,KAAKmO,GAAmB3B,EAAO,GAAI4B,SAC5B5B,EAAO,GAAI4B,SAAWpO,KAAKqO,KAElCrO,KAAKmO,GAAYnO,KAAK+N,GAAcK,SACpCpO,KAAK+N,GAAcK,SAAWpO,KAAKqO,IAGZ,KAA3BrO,KAAK+N,GAAcnQ,KACnBoC,KAAKkK,GAAOgE,MAAQlO,KAAKc,EACS,KAA3Bd,KAAK+N,GAAcnQ,KAC1BoC,KAAKmK,GAAO+D,MAAQlO,KAAKc,EACS,KAA3Bd,KAAK+N,GAAcnQ,OAC1BoC,KAAKoK,GAAO8D,MAAQlO,KAAKc,SAIjCd,KAAK6B,GAAiB,EACI,MAAtB7B,KAAK+N,KACL/N,KAAKsO,GAActO,KAAK+N,IACxB/N,KAAK+N,GAAgB,OAMzBzO,EAAAL,UAAA+O,GAAR,WAC8B,MAAtBhO,KAAK+N,KACL/N,KAAK+N,GAAczJ,WAAa,EAChCtE,KAAKsO,GAActO,KAAK+N,MAIxBzO,EAAAL,UAAAqP,GAAR,SAAsB7O,GAClB,OAAQA,EAAK7B,MACT,IAAK,IACDoC,KAAKkK,GAAOgE,MAAQlO,KAAKW,EACzB,MACJ,IAAK,IACDX,KAAKmK,GAAO+D,MAAQlO,KAAKY,EACzB,MACJ,IAAK,IACDZ,KAAKoK,GAAO8D,MAAQlO,KAAKa,EAIjC,GAAIb,KAAK4C,GACOnD,EAAKgN,cAAc,GAAIyB,MAAQlO,KAAKiO,OAC7C,CACH,IAAIzB,EAAiB/M,EAAKgN,cACtBD,EAAOzE,OAAS,EACTyE,EAAO,GAAI4B,SAAWpO,KAAKmO,GAElC1O,EAAK2O,SAAWpO,KAAKmO,KAOzB7O,EAAAL,UAAA+F,GAAR,SAAqBH,GACjB7E,KAAK4B,GAAS,EACV5B,KAAK8B,IACL9B,KAAKqD,GAAYkL,cAAcvO,KAAKsD,IACpCtD,KAAK8M,IAAY,GAEjB9M,KAAKwO,KACqB,MAAtBxO,KAAK+N,KACL/N,KAAKsO,GAActO,KAAK+N,IACxB/N,KAAK+N,GAAgB,MAEzB/N,KAAK0D,GAAS+K,IAAIzO,KAAKyN,MAKvBnO,EAAAL,UAAAuO,GAAR,WACQxN,KAAK2C,GACL3C,KAAKyN,GAAclO,EAAWmP,MACtB1O,KAAgB,GACxBA,KAAKyN,GAAclO,EAAWmO,IACtB1N,KAAkB,KAC1BA,KAAKyN,GAAclO,EAAWoP,QAI9BrP,EAAAL,UAAAoK,GAAR,SAA4BF,GAEI,MAAxBnJ,KAAKyB,GACLzB,KAAKyB,EAAgB0H,IAIrB7J,EAAAL,UAAAmK,GAAR,SAAiCD,GAEI,MAA7BnJ,KAAK0B,GACL1B,KAAK0B,EAAqByH,IAI1B7J,EAAAL,UAAAqK,GAAR,SAA+BH,GAEI,MAA3BnJ,KAAK2B,GACL3B,KAAK2B,EAAmBwH,IAMxB7J,EAAAL,UAAAiG,GAAR,SAAuBL,GAEnB,GAAK7E,KAAK4B,GAIV,GAAK5B,KAAK8B,GACW,MAAjB9B,KAAKiN,GAAT,CAEA,IAAI2B,EAAkB5O,KAAKkN,KAE3B,GAAc,MAAV0B,EAAJ,CAEA,GAAI5O,KAAK4C,GACL5C,KAAK6O,GAAY7O,KAAKoD,GAAOpD,KAAKsM,GAAasC,EAAQ5O,KAAKiN,QACzD,CACH,IAAI6B,EAAgBF,EAAOG,SAAS/O,KAAKiN,IACzC,GAAc,GAAV6B,EAAKzH,GAAoB,GAAVyH,EAAK1H,GAAoB,GAAV0H,EAAKxH,EAAQ,OAC3CtH,KAAK2C,GACL3C,KAAKgP,GAAeF,GAEhB9O,KAAK6C,IAAiB7C,KAAKC,GAAQD,KAAKiP,GAAWH,GAG/D9O,KAAKiN,GAAW2B,EAChB5O,KAAKqJ,GAAoBrJ,KAAKyN,WAtB1BzN,KAAK8N,MA4BLxO,EAAAL,UAAA+N,GAAR,SAAsBkC,GAClB,IAAIpQ,EAAYoQ,EAAKtR,KACrB,GAAIoC,KAAK2C,IAAiB3C,KAAK6C,GAAe,CAC1C,GAAS,MAAL/D,EAAW,OAAOkB,KAAKmP,GACtB,GAAS,MAALrQ,EAAW,OAAOkB,KAAKoP,GAC3B,GAAS,MAALtQ,EAAW,OAAOkB,KAAKqP,GAC3B,GAAS,OAALvQ,EAAY,OAAOkB,KAAKoG,GAG7BpG,KAAKmE,GAAQ8B,iBAAiBC,YAAYlG,KAAKkB,GAC/C1B,EAAA,QAAQ2G,0BAA0BnG,KAAKqD,GAAYwC,SAAU7F,KAAKkB,EAAWlB,KAAKmB,GAClF,IAAIzD,EAAIsC,KAAKmB,EACb,GAAU,MAANrC,EACA,OAAIwB,KAAK0H,IAAItK,EAAE0J,GAAK9G,KAAK0H,IAAItK,EAAE4J,GACpBtH,KAAKmP,GACFnP,KAAKqP,GAChB,GAAU,MAANvQ,EACP,OAAIwB,KAAK0H,IAAItK,EAAE0J,GAAK9G,KAAK0H,IAAItK,EAAE2J,GACpBrH,KAAKmP,GACFnP,KAAKoP,GAChB,GAAU,MAANtQ,EACP,OAAIwB,KAAK0H,IAAItK,EAAE4J,GAAKhH,KAAK0H,IAAItK,EAAE2J,GACpBrH,KAAKqP,GACFrP,KAAKoP,OAGxB,KAAIpP,KAAK4C,GA0BT,OAAO,KAzBV5C,KAAK+B,GAAW,EAEhB/B,KAAKmE,GAAQ8B,iBAAiBC,YAAYlG,KAAKkB,GAC/C1B,EAAA,QAAQ2G,0BAA0BnG,KAAKqD,GAAYwC,SAAU7F,KAAKkB,EAAWlB,KAAKmB,GAC9EzD,EAAIsC,KAAKmB,EAEb,OAAQrC,GACJ,IAAK,IACD,OAAIwB,KAAK0H,IAAItK,EAAE2J,GAAK,IAChBrH,KAAK+B,GAAW,EACT/B,KAAKoG,IACFpG,KAAKoP,GACvB,IAAK,IACD,OAAI9O,KAAK0H,IAAItK,EAAE0J,GAAK,IAChBpH,KAAK+B,GAAW,EACT/B,KAAKoG,IACFpG,KAAKmP,GACvB,IAAK,IACD,OAAI7O,KAAK0H,IAAItK,EAAE4J,GAAK,IAChBtH,KAAK+B,GAAW,EACT/B,KAAKoG,IACFpG,KAAKqP,GACvB,QACI,OAAOrP,KAAKoG,MAUpB9G,EAAAL,UAAA+P,GAAR,SAAuBF,GAEO,MAArB9O,KAAKoD,GAAMsB,QAAmB1E,KAAKwH,GAAgBxH,KAAKoD,IACzDpD,KAAK+D,GAAc/D,KAAKmE,IAExBnE,KAAK+D,GAAc/D,KAAKoD,IAG5B,IAAItE,EAAYkB,KAAKsM,GAAY1O,KAEjCoC,KAAKgC,GAASqF,EAAI,EAAGrH,KAAKgC,GAASoF,EAAI,EAAGpH,KAAKgC,GAASsF,EAAI,EAElD,KAALxI,GAAmB,MAALA,GAAoB,MAALA,GAAoB,OAALA,IACzCkB,KAAKC,EAAQD,KAAKgC,GAASqF,EAAI7H,EAAA,QAAQoG,IAAIkJ,EAAM9O,KAAKsC,IAAWtC,KAAKsC,GAAQyF,SAC7E/H,KAAKgC,GAASqF,EAAIyH,EAAKzH,GAEtB,KAALvI,GAAmB,MAALA,GAAoB,MAALA,GAAoB,OAALA,IACzCkB,KAAKC,EAAQD,KAAKgC,GAASoF,EAAI5H,EAAA,QAAQoG,IAAIkJ,EAAM9O,KAAKuC,IAAWvC,KAAKuC,GAAQwF,SAC7E/H,KAAKgC,GAASoF,EAAI0H,EAAK1H,GAEtB,KAALtI,GAAmB,MAALA,GAAoB,MAALA,GAAoB,OAALA,IACzCkB,KAAKC,EAAQD,KAAKgC,GAASsF,EAAI9H,EAAA,QAAQoG,IAAIkJ,EAAM9O,KAAKwC,IAAWxC,KAAKwC,GAAQuF,SAC7E/H,KAAKgC,GAASsF,EAAIwH,EAAKxH,GAGhCtH,KAAKsP,GAAetP,KAAKoD,GAAOpD,KAAKgC,GAAUhC,KAAKC,GAGhDD,KAAKuP,KACLvP,KAAKoD,GAAMyC,SAASwB,EAAI/G,KAAKkP,IAAIxP,KAAKoD,GAAMyC,SAASwB,EAAGrH,KAAKuP,GAAgBlI,GAC7ErH,KAAKoD,GAAMyC,SAASuB,EAAI9G,KAAKkP,IAAIxP,KAAKoD,GAAMyC,SAASuB,EAAGpH,KAAKuP,GAAgBnI,GAC7EpH,KAAKoD,GAAMyC,SAASyB,EAAIhH,KAAKkP,IAAIxP,KAAKoD,GAAMyC,SAASyB,EAAGtH,KAAKuP,GAAgBjI,IAE7EtH,KAAKyP,KACLzP,KAAKoD,GAAMyC,SAASwB,EAAI/G,KAAKoP,IAAI1P,KAAKoD,GAAMyC,SAASwB,EAAGrH,KAAKyP,GAAgBpI,GAC7ErH,KAAKoD,GAAMyC,SAASuB,EAAI9G,KAAKoP,IAAI1P,KAAKoD,GAAMyC,SAASuB,EAAGpH,KAAKyP,GAAgBrI,GAC7EpH,KAAKoD,GAAMyC,SAASyB,EAAIhH,KAAKoP,IAAI1P,KAAKoD,GAAMyC,SAASyB,EAAGtH,KAAKyP,GAAgBnI,IAGjFtH,KAAKoD,GAAMQ,oBAAmB,IAI1BtE,EAAAL,UAAAqQ,GAAR,SAAuB7P,EAAqBkQ,EAAgBC,GACxD,GAAI5P,KAAKE,EAAQ,CACb,IAAI2P,GAAkB,EActB,GAbA7P,KAAKiC,GAAQ6N,WAAWH,GACpBrP,KAAK0H,IAAIhI,KAAKiC,GAAQoF,GAAKrH,KAAK+C,GAAOsE,IACnCrH,KAAKiC,GAAQoF,EAAI,EAAGsI,EAAMtI,EAAIrH,KAAK+C,GAAOsE,EAAQsI,EAAMtI,GAAKrH,KAAK+C,GAAOsE,EAC7EwI,GAAS,GAETvP,KAAK0H,IAAIhI,KAAKiC,GAAQmF,GAAKpH,KAAK+C,GAAOqE,IACnCpH,KAAKiC,GAAQmF,EAAI,EAAGuI,EAAMvI,EAAIpH,KAAK+C,GAAOqE,EAAQuI,EAAMvI,GAAKpH,KAAK+C,GAAOqE,EAC7EyI,GAAS,GAETvP,KAAK0H,IAAIhI,KAAKiC,GAAQqF,GAAKtH,KAAK+C,GAAOuE,IACnCtH,KAAKiC,GAAQqF,EAAI,EAAGqI,EAAMrI,EAAItH,KAAK+C,GAAOuE,EAAQqI,EAAMrI,GAAKtH,KAAK+C,GAAOuE,EAC7EuI,GAAS,IAETA,EAOA,OANIvP,KAAK0H,IAAI2H,EAAMtI,KAAOrH,KAAK+C,GAAOsE,IAAGsI,EAAMtI,EAAI,GAC/C/G,KAAK0H,IAAI2H,EAAMvI,KAAOpH,KAAK+C,GAAOqE,IAAGuI,EAAMvI,EAAI,GAC/C9G,KAAK0H,IAAI2H,EAAMrI,KAAOtH,KAAK+C,GAAOuE,IAAGqI,EAAMrI,EAAI,GACnD9H,EAAA,QAAQyI,gBAAgB,EAAG,EAAG,EAAGjI,KAAKiC,IACtC4N,GAAS,EAMbD,GAIA5P,KAAKsC,GAAQyN,eAAe/P,KAAKgD,IACjChD,KAAKuC,GAAQwN,eAAe/P,KAAKiD,IACjCjD,KAAKwC,GAAQuN,eAAe/P,KAAKkD,IACjClD,KAAKoD,GAAM4M,UAAUhQ,KAAKgD,GAAM2M,EAAMtI,EAAG7H,EAAA,MAAMgH,OAC/CxG,KAAKoD,GAAM4M,UAAUhQ,KAAKiD,GAAM0M,EAAMvI,EAAG5H,EAAA,MAAMgH,OAC/CxG,KAAKoD,GAAM4M,UAAUhQ,KAAKkD,GAAMyM,EAAMrI,EAAG9H,EAAA,MAAMgH,QAEtB,MAArBxG,KAAKoD,GAAMsB,OACX1E,KAAKoD,GAAMyC,SAASiK,WAAWH,GAE/B3P,KAAKoD,GAAM6M,oBAAoBN,EAAMG,WAAW9P,KAAKoD,GAAM8M,oBAU/D5Q,EAAAL,UAAAgQ,GAAR,SAAmBH,GACf9O,KAAK+D,GAAc/D,KAAKoD,IAExBpD,KAAKqC,GAAOgF,EAAI,EAChBrH,KAAKqC,GAAO+E,EAAI,EAChBpH,KAAKqC,GAAOiF,EAAI,EAChB,IAAIxI,EAAYkB,KAAKsM,GAAY1O,KACvB,KAALkB,GAAmB,MAALA,GAAoB,MAALA,IAC9BkB,KAAKqC,GAAOgF,EAAI7H,EAAA,QAAQoG,IAAIkJ,EAAM9O,KAAKsC,IAAWtC,KAAKsC,GAAQyF,SAC3D/H,KAAKoD,GAAMuE,QAAQN,EAAI,IAAGrH,KAAKqC,GAAOgF,GAAKrH,KAAKqC,GAAOgF,IAGrD,KAALvI,GAAmB,MAALA,GAAoB,MAALA,IAC9BkB,KAAKqC,GAAO+E,EAAI5H,EAAA,QAAQoG,IAAIkJ,EAAM9O,KAAKuC,IAAWvC,KAAKuC,GAAQwF,SAC3D/H,KAAKoD,GAAMuE,QAAQP,EAAI,IAAGpH,KAAKqC,GAAO+E,GAAKpH,KAAKqC,GAAO+E,IAErD,KAALtI,GAAmB,MAALA,GAAoB,MAALA,IAC9BkB,KAAKqC,GAAOiF,EAAI9H,EAAA,QAAQoG,IAAIkJ,EAAM9O,KAAKwC,IAAWxC,KAAKwC,GAAQuF,SAC3D/H,KAAKoD,GAAMuE,QAAQL,EAAI,IAAGtH,KAAKqC,GAAOiF,GAAKtH,KAAKqC,GAAOiF,IAI/D,IAAI6I,EAAMnQ,KAAK6D,GAKf,GAJA7D,KAAKqC,GAAOgF,EAAIrH,KAAKqC,GAAOgF,EAAI8I,EAAI9I,EACpCrH,KAAKqC,GAAO+E,EAAIpH,KAAKqC,GAAO+E,EAAI+I,EAAI/I,EACpCpH,KAAKqC,GAAOiF,EAAItH,KAAKqC,GAAOiF,EAAI6I,EAAI7I,EAE3B,OAALxI,EAAY,CAGZ,IAAIM,EAAYI,EAAA,QAAQoG,IAAIkJ,EAAM9O,KAAKqD,GAAY+M,UACnDhR,GAAQkB,KAAKkP,IAAIW,EAAI9I,EAAG8I,EAAI/I,EAAG+I,EAAI7I,GACnCtH,KAAKqC,GAAOgO,eAAejR,EAAGA,EAAGA,OAC9B,CACH,IAAIkR,GAAmB,EAiBvB,GAhBS,MAALxR,GACAwR,GAAU,EACNhQ,KAAK0H,IAAIhI,KAAKqC,GAAOgF,GAAK/G,KAAK0H,IAAIhI,KAAKqC,GAAOiF,GAC/CtH,KAAKqC,GAAOiF,EAAItH,KAAKqC,GAAOgF,EACzBrH,KAAKqC,GAAOgF,EAAIrH,KAAKqC,GAAOiF,GACvB,MAALxI,GACPwR,GAAU,EACNhQ,KAAK0H,IAAIhI,KAAKqC,GAAOiF,GAAKhH,KAAK0H,IAAIhI,KAAKqC,GAAO+E,GAC/CpH,KAAKqC,GAAO+E,EAAIpH,KAAKqC,GAAOiF,EACzBtH,KAAKqC,GAAOiF,EAAItH,KAAKqC,GAAO+E,GACvB,MAALtI,IACPwR,GAAU,EACNhQ,KAAK0H,IAAIhI,KAAKqC,GAAO+E,GAAK9G,KAAK0H,IAAIhI,KAAKqC,GAAOgF,GAC/CrH,KAAKqC,GAAOgF,EAAIrH,KAAKqC,GAAO+E,EACzBpH,KAAKqC,GAAO+E,EAAIpH,KAAKqC,GAAOgF,GAEnCiJ,EAAS,CAGTtQ,KAAKmE,GAAQ0B,SAASU,cAAcvG,KAAKqD,GAAYwC,SAAU7F,KAAKqB,GAChEjC,EAAYI,EAAA,QAAQoG,IAAIkJ,EAAM9O,KAAKqB,GACvCrB,KAAKqC,GAAOgF,EAAI/G,KAAK0H,IAAIhI,KAAKqC,GAAOgF,GACrCrH,KAAKqC,GAAO+E,EAAI9G,KAAK0H,IAAIhI,KAAKqC,GAAO+E,GACrCpH,KAAKqC,GAAOiF,EAAIhH,KAAK0H,IAAIhI,KAAKqC,GAAOiF,GACjClI,EAAI,GACAY,KAAKoD,GAAMuE,QAAQN,EAAI,IAAGrH,KAAKqC,GAAOgF,GAAKrH,KAAKqC,GAAOgF,GAEvDrH,KAAKoD,GAAMuE,QAAQP,EAAI,IAAGpH,KAAKqC,GAAO+E,GAAKpH,KAAKqC,GAAO+E,GACvDpH,KAAKoD,GAAMuE,QAAQL,EAAI,IAAGtH,KAAKqC,GAAOiF,GAAKtH,KAAKqC,GAAOiF,KAKvDtH,KAAKoD,GAAMuE,QAAQN,EAAI,IAAGrH,KAAKqC,GAAOgF,GAAKrH,KAAKqC,GAAOgF,GACvDrH,KAAKoD,GAAMuE,QAAQP,EAAI,IAAGpH,KAAKqC,GAAO+E,GAAKpH,KAAKqC,GAAO+E,GACvDpH,KAAKoD,GAAMuE,QAAQL,EAAI,IAAGtH,KAAKqC,GAAOiF,GAAKtH,KAAKqC,GAAOiF,KAMvEtH,KAAKuQ,GAAevQ,KAAKoD,GAAOpD,KAAKqC,IAGjCrC,KAAKwQ,KACLxQ,KAAKoD,GAAMuE,QAAQN,EAAI/G,KAAKkP,IAAIxP,KAAKoD,GAAMuE,QAAQN,EAAGrH,KAAKwQ,GAAgBnJ,GAC3ErH,KAAKoD,GAAMuE,QAAQP,EAAI9G,KAAKkP,IAAIxP,KAAKoD,GAAMuE,QAAQP,EAAGpH,KAAKwQ,GAAgBpJ,GAC3EpH,KAAKoD,GAAMuE,QAAQL,EAAIhH,KAAKkP,IAAIxP,KAAKoD,GAAMuE,QAAQL,EAAGtH,KAAKwQ,GAAgBlJ,IAE3EtH,KAAKyQ,KACLzQ,KAAKoD,GAAMuE,QAAQN,EAAI/G,KAAKoP,IAAI1P,KAAKoD,GAAMuE,QAAQN,EAAGrH,KAAKyQ,GAAgBpJ,GAC3ErH,KAAKoD,GAAMuE,QAAQP,EAAI9G,KAAKoP,IAAI1P,KAAKoD,GAAMuE,QAAQP,EAAGpH,KAAKyQ,GAAgBrJ,GAC3EpH,KAAKoD,GAAMuE,QAAQL,EAAIhH,KAAKoP,IAAI1P,KAAKoD,GAAMuE,QAAQL,EAAGtH,KAAKyQ,GAAgBnJ,KAK3EhI,EAAAL,UAAAsR,GAAR,SAAuB9Q,EAAqBN,GACxC,GAAIa,KAAKkC,GAAQ,CACb,IAAI2N,GAAkB,EActB,GAbA7P,KAAKmC,GAAQ2N,WAAW3Q,GACpBmB,KAAK0H,IAAIhI,KAAKmC,GAAQkF,GAAKrH,KAAKoC,KAC5BjD,EAAEkI,EAAI,EAAGlI,EAAEkI,EAAIrH,KAAKoC,GAAiBjD,EAAEkI,GAAKrH,KAAKoC,GACrDyN,GAAS,GAETvP,KAAK0H,IAAIhI,KAAKmC,GAAQiF,GAAKpH,KAAKoC,KAC5BjD,EAAEiI,EAAI,EAAGjI,EAAEiI,EAAIpH,KAAKoC,GAAiBjD,EAAEiI,GAAKpH,KAAKoC,GACrDyN,GAAS,GAETvP,KAAK0H,IAAIhI,KAAKmC,GAAQmF,GAAKtH,KAAKoC,KAC5BjD,EAAEmI,EAAI,EAAGnI,EAAEmI,EAAItH,KAAKoC,GAAiBjD,EAAEmI,GAAKtH,KAAKoC,GACrDyN,GAAS,IAERA,EAAQ,OACRvP,KAAK0H,IAAI7I,EAAEkI,KAAOrH,KAAKoC,IAAwB,IAARjD,EAAEkI,IAAUlI,EAAEkI,EAAI,GACzD/G,KAAK0H,IAAI7I,EAAEiI,KAAOpH,KAAKoC,IAAwB,IAARjD,EAAEiI,IAAUjI,EAAEiI,EAAI,GACzD9G,KAAK0H,IAAI7I,EAAEmI,KAAOtH,KAAKoC,IAAwB,IAARjD,EAAEmI,IAAUnI,EAAEmI,EAAI,GAC9D9H,EAAA,QAAQyI,gBAAgB,EAAG,EAAG,EAAGjI,KAAKmC,IACtC0N,GAAS,EAEbpQ,EAAKkI,QAAQmI,WAAW3Q,IAcpBG,EAAAL,UAAA8E,GAAR,SAAsBtE,GAClB,IAAIiR,EAAqBjR,EAAKwG,iBAC9BzG,EAAA,QAAQoI,oBAAoB8I,EAAWjT,EAAG,EAAGuC,KAAKsC,IAClD9C,EAAA,QAAQoI,oBAAoB8I,EAAWjT,EAAG,EAAGuC,KAAKuC,IAClD/C,EAAA,QAAQoI,oBAAoB8I,EAAWjT,EAAG,EAAGuC,KAAKwC,KAU9ClD,EAAAL,UAAA6E,GAAR,SAA8BrE,GAC1B,GAAIA,aAAgBD,EAAA,aAAc,CAC1B,IAAImR,EAAkBlR,EAAKmR,kBAAkBC,YAC7CC,EAAcH,EAAGI,QAAQhC,SAAS4B,EAAGK,SAIzC,OAHY,GAARF,EAAGzJ,IAAQyJ,EAAGzJ,EAAI,GACV,GAARyJ,EAAG1J,IAAQ0J,EAAG1J,EAAI,GACV,GAAR0J,EAAGxJ,IAAQwJ,EAAGxJ,EAAI,GACfwJ,EACJ,OAAO,IAAItR,EAAA,QAAQ,EAAG,EAAG,IAa7BF,EAAAL,UAAA6J,oBAAP,WACI9I,KAAK6D,GAAoB7D,KAAK8D,GAAsB9D,KAAKoD,KAKrD9D,EAAAL,UAAA4P,GAAR,SAAoBpP,EAAqByP,EAAYN,EAAiBqC,GAG9DjR,KAAKC,GAAgC,MAArBD,KAAKoD,GAAMsB,QAAmB1E,KAAKwH,GAAgB/H,GACnEO,KAAK+D,GAAc/D,KAAKmE,IAExBnE,KAAK+D,GAActE,GAGvB,IAGIyR,EAHAC,EAAgB,EAIhBjC,GAAQlP,KAAKoI,GAAK8I,EAAQlR,KAAKC,EAASD,KAAKsC,GAAU9C,EAAA,KAAK4R,EACvDlC,GAAQlP,KAAKsI,GAAK4I,EAAQlR,KAAKC,EAASD,KAAKuC,GAAU/C,EAAA,KAAK6R,EAC5DnC,GAAQlP,KAAKwI,KAAK0I,EAAQlR,KAAKC,EAASD,KAAKwC,GAAUhD,EAAA,KAAK8R,GAErEtR,KAAKmE,GAAQ0B,SAASU,cAAcvG,KAAKqD,GAAYwC,SAAU7F,KAAKqB,GAMhErB,KAAK+B,GACLoP,EAAQnR,KAAKuR,GAAWN,EAASrC,EAAQ5O,KAAKqD,GAAYwC,SAAU7F,KAAKqB,EAAa6P,GAElFlR,KAAKwD,GAAOgO,uBAAsBL,GAASA,IAE/CA,EAAQnR,KAAKyR,GAAUR,EAASrC,EAAQnP,EAAKqG,wBAAyB9F,KAAKqB,GAG3ErB,KAAKiB,IACLkQ,GAASA,GAOTnR,KAAKG,IACLH,KAAK0C,IAAWyO,EAChBA,EAAQ,EACJ7Q,KAAK0H,IAAIhI,KAAK0C,KAAY1C,KAAKK,IACT8Q,EAAlBnR,KAAK0C,GAAU,EAAW1C,KAAKK,GAAwBL,KAAKK,EAChEL,KAAK0C,GAAU,IAIT,IAAVyO,IACAnR,KAAKqB,EAAYqQ,YACbxC,GAAQlP,KAAKgM,GACbvM,EAAKkS,OAAO3R,KAAKqB,GAAc8P,EAAO3R,EAAA,MAAMgH,QAExChH,EAAA,QAAQoG,IAAIsL,EAAOlR,KAAKqB,IAAgB,IAAG8P,GAASA,GACxD1R,EAAKkS,OAAOT,EAAOC,EAAO3R,EAAA,MAAMgH,QAGhCxG,KAAKyC,KACLhD,EAAKyH,SAAWzH,EAAK2E,mBAAmBwN,gBACxCnS,EAAK2E,mBAAqB,MAG1BpE,KAAKC,IACDD,KAAKiB,IACLkQ,GAASA,GAEa,MAArBnR,KAAKoD,GAAMsB,QAAmB1E,KAAKwH,GAAgB/H,KAChDyP,GAAQlP,KAAKgM,GACbhM,KAAKmE,GAAQwN,OAAO3R,KAAKqB,GAAc8P,EAAO3R,EAAA,MAAMgH,OAEpDxG,KAAKmE,GAAQwN,OAAOT,EAAOC,EAAO3R,EAAA,MAAMgH,WAOpDlH,EAAAL,UAAAiO,GAAR,eAAAnN,EAAAC,KACQ6R,EAAwB7R,KAAKwD,GAAOiI,KAAKzL,KAAKwD,GAAOkI,SAAU1L,KAAKwD,GAAOmI,SAAU,SAAClM,GACtF,OAAOA,GAAQM,EAAKgN,IACrB,KAAM/M,KAAKqD,IAEd,OAAIwO,EAASxF,IACFwF,EAASC,YAET,MAIPxS,EAAAL,UAAAuP,GAAR,WACIxO,KAAK2M,GAAQrI,WAAa,EAC1BtE,KAAK4M,GAAQtI,WAAa,EAC1BtE,KAAK6M,GAAQvI,WAAa,GA8BvBhF,EAAAL,UAAA8S,sBAAP,WACI,OAAO/R,KAAKmE,GAAQC,oBAGjB9E,EAAAL,UAAA+S,YAAP,WACI,OAAOhS,KAAKmE,GAAQ0B,UAKjBvG,EAAAL,UAAAgT,qBAAP,WACI,OAAOjS,KAAK2C,IAGTrD,EAAAL,UAAAsL,kBAAP,WACQvK,KAAKwB,IACO,MAAZxB,KAAK4L,KACL5L,KAAKkS,KACLlS,KAAKmS,GAAMzN,OAAS1E,KAAKmE,IAE7BnE,KAAKgO,KACAhO,KAAK2C,KACN3C,KAAKoS,GAAepS,KAAKqS,GAAWrS,KAAKgB,GACzChB,KAAK2C,IAAgB,EACrB3C,KAAK+J,kBACL/J,KAAKgK,oBAIN1K,EAAAL,UAAA6K,mBAAP,WACQ9J,KAAK2C,KACL3C,KAAKoS,GAAepS,KAAKqS,GAAW,GACpCrS,KAAK2C,IAAgB,IAMtBrD,EAAAL,UAAAqT,kBAAP,WACI,OAAOtS,KAAK4C,IAGTtD,EAAAL,UAAAsT,YAAP,SAAmBC,GACfxS,KAAKyC,GAAY+P,GAGdlT,EAAAL,UAAAuL,eAAP,WACQxK,KAAKwB,IACS,MAAdxB,KAAKyS,KACLzS,KAAK0S,KACL1S,KAAKyS,GAAM/N,OAAS1E,KAAKmE,IAE7BnE,KAAKgO,KACAhO,KAAK4C,KACN5C,KAAKoS,GAAepS,KAAK2S,GAAW3S,KAAKgB,GACzChB,KAAK4C,IAAc,EACnB5C,KAAK8J,qBACL9J,KAAKgK,oBAIN1K,EAAAL,UAAA8K,gBAAP,WACQ/J,KAAK4C,KACL5C,KAAKoS,GAAepS,KAAK2S,GAAW,GACpC3S,KAAK4C,IAAc,IAMpBtD,EAAAL,UAAA2T,iBAAP,WACI,OAAO5S,KAAK6C,IAGTvD,EAAAL,UAAAwL,cAAP,WACQzK,KAAKwB,IACO,MAAZxB,KAAKiM,KACLjM,KAAK6S,KACL7S,KAAK8S,GAAMpO,OAAS1E,KAAKmE,IAE7BnE,KAAKgO,KACAhO,KAAK6C,KACN7C,KAAKoS,GAAepS,KAAK+S,GAAW/S,KAAKgB,GACzChB,KAAK6C,IAAgB,EACrB7C,KAAK8J,qBACL9J,KAAK+J,qBAINzK,EAAAL,UAAA+K,eAAP,WACQhK,KAAK6C,KACL7C,KAAKoS,GAAepS,KAAK+S,GAAW,GACpC/S,KAAK6C,IAAgB,IAOtBvD,EAAAL,UAAA+T,eAAP,SAAsBtD,EAAeF,GACjCxP,KAAKwQ,GAAkBd,GAAY,KACnC1P,KAAKyQ,GAAkBjB,GAAY,KACP,MAAxBxP,KAAKwQ,KACyB,GAA1BxQ,KAAKwQ,GAAgBnJ,IAAQrH,KAAKwQ,GAAgBnJ,EAAI,MAC5B,GAA1BrH,KAAKwQ,GAAgBpJ,IAAQpH,KAAKwQ,GAAgBpJ,EAAI,MAC5B,GAA1BpH,KAAKwQ,GAAgBlJ,IAAQtH,KAAKwQ,GAAgBlJ,EAAI,QAI3DhI,EAAAL,UAAAgU,kBAAP,WACIjT,KAAKwQ,GAAkB,KACvBxQ,KAAKyQ,GAAkB,MAOpBnR,EAAAL,UAAAiU,eAAP,SAAsBxD,EAAeF,GACjCxP,KAAKuP,GAAkBG,GAAY,KACnC1P,KAAKyP,GAAkBD,GAAY,MAGhClQ,EAAAL,UAAAkU,kBAAP,WACInT,KAAKuP,GAAkB,KACvBvP,KAAKyP,GAAkB,MAMpBnQ,EAAAL,UAAAmU,aAAP,SAAoB1D,EAAeF,GAC/BxP,KAAKqT,GAAgB3D,GAAY,KACjC1P,KAAKsT,GAAgB9D,GAAY,MAG9BlQ,EAAAL,UAAAsU,gBAAP,WACIvT,KAAKqT,GAAgB,KACrBrT,KAAKsT,GAAgB,MAejBhU,EAAAL,UAAAwF,GAAR,WAEI,IAAI+O,EAAkB,IAAIhU,EAAA,KAAK,GAAIQ,KAAKwD,IAGxCxD,KAAK2M,GAAUnN,EAAA,KAAKiU,YAAY,GAAI,CAAC,IAAIjU,EAAA,SAAS,IAAK,EAAG,GAAI,IAAIA,EAAA,QAAQ,IAAK,EAAG,IAAKQ,KAAKwD,IAC5FxD,KAAK4M,GAAUpN,EAAA,KAAKiU,YAAY,GAAI,CAAC,IAAIjU,EAAA,QAAQ,GAAI,IAAK,GAAI,IAAIA,EAAA,QAAQ,EAAG,IAAK,IAAKQ,KAAKwD,IAC5FxD,KAAK6M,GAAUrN,EAAA,KAAKiU,YAAY,GAAI,CAAC,IAAIjU,EAAA,QAAQ,EAAG,GAAI,KAAM,IAAIA,EAAA,QAAQ,EAAG,EAAG,MAAOQ,KAAKwD,IAG5FxD,KAAK2M,GAAQpI,YAAa,EAC1BvE,KAAK4M,GAAQrI,YAAa,EAC1BvE,KAAK6M,GAAQtI,YAAa,EAE1BvE,KAAK2M,GAAQjI,OAAS8O,EACtBxT,KAAK4M,GAAQlI,OAAS8O,EACtBxT,KAAK6M,GAAQnI,OAAS8O,EACtBxT,KAAK2M,GAAQuB,MAAQlO,KAAKW,EAC1BX,KAAK4M,GAAQsB,MAAQlO,KAAKY,EAC1BZ,KAAK6M,GAAQqB,MAAQlO,KAAKa,EAC1Bb,KAAKwO,KAGL,IAAIkF,EAAa1T,KAAKQ,EAAWR,KAAKS,EAAa,IAqBnD,OApBAT,KAAKkK,GAAS1K,EAAA,KAAKiU,YAAY,GAAI,CAAC,IAAIjU,EAAA,QAAQ,EAAG,EAAG,GAAI,IAAIA,EAAA,QAAQkU,EAAI,EAAG,IAAK1T,KAAKwD,IACvFxD,KAAKmK,GAAS3K,EAAA,KAAKiU,YAAY,GAAI,CAAC,IAAIjU,EAAA,QAAQ,EAAG,EAAG,GAAI,IAAIA,EAAA,QAAQ,EAAGkU,EAAI,IAAK1T,KAAKwD,IACvFxD,KAAKoK,GAAS5K,EAAA,KAAKiU,YAAY,GAAI,CAAC,IAAIjU,EAAA,QAAQ,EAAG,EAAG,GAAI,IAAIA,EAAA,QAAQ,EAAG,EAAGkU,IAAM1T,KAAKwD,IAGvFxD,KAAKkK,GAAO3F,YAAa,EACzBvE,KAAKmK,GAAO5F,YAAa,EACzBvE,KAAKoK,GAAO7F,YAAa,EAEzBvE,KAAKkK,GAAOxF,OAAS8O,EACrBxT,KAAKmK,GAAOzF,OAAS8O,EACrBxT,KAAKoK,GAAO1F,OAAS8O,EACrBxT,KAAKkK,GAAOgE,MAAQlO,KAAKW,EACzBX,KAAKmK,GAAO+D,MAAQlO,KAAKY,EACzBZ,KAAKoK,GAAO8D,MAAQlO,KAAKa,EAEzBb,KAAKkK,GAAOyJ,iBAAmB,EAC/B3T,KAAKmK,GAAOwJ,iBAAmB,EAC/B3T,KAAKoK,GAAOuJ,iBAAmB,EAExBH,GASHlU,EAAAL,UAAA0F,GAAR,WACI3E,KAAKoG,GAAQ5G,EAAA,KAAKoU,YAAY,GAAI,EAAG5T,KAAKwD,IAC1CxD,KAAKmP,GAAO3P,EAAA,KAAKoU,YAAY,GAAI,EAAG5T,KAAKwD,IACzCxD,KAAKoP,GAAO5P,EAAA,KAAKoU,YAAY,GAAI,EAAG5T,KAAKwD,IACzCxD,KAAKqP,GAAO7P,EAAA,KAAKoU,YAAY,GAAI,EAAG5T,KAAKwD,IAEzCxD,KAAKoG,GAAM7B,YAAa,EACxBvE,KAAKmP,GAAK5K,YAAa,EACvBvE,KAAKoP,GAAK7K,YAAa,EACvBvE,KAAKqP,GAAK9K,YAAa,EAEvBvE,KAAKoG,GAAM9B,WAAa,EACxBtE,KAAKmP,GAAK7K,WAAa,EACvBtE,KAAKoP,GAAK9K,WAAa,EACvBtE,KAAKqP,GAAK/K,WAAa,EAEvBtE,KAAKoG,GAAMuN,iBAAmB,EAC9B3T,KAAKmP,GAAKwE,iBAAmB,EAC7B3T,KAAKoP,GAAKuE,iBAAmB,EAC7B3T,KAAKqP,GAAKsE,iBAAmB,EAE7B3T,KAAKoG,GAAMC,OAAOrG,KAAKqD,GAAYwC,UACnC7F,KAAKmP,GAAKwC,OAAOnS,EAAA,KAAK4R,EAAG,MACzBpR,KAAKoP,GAAKuC,OAAOnS,EAAA,KAAK6R,EAAG,MAEzB,IAAIwC,EAAmB,IAAIrU,EAAA,KAAK,GAAIQ,KAAKwD,IAMzC,OALAxD,KAAKoG,GAAM1B,OAASmP,EACpB7T,KAAKmP,GAAKzK,OAASmP,EACnB7T,KAAKoP,GAAK1K,OAASmP,EACnB7T,KAAKqP,GAAK3K,OAASmP,EAEZA,GA0BHvU,EAAAL,UAAAiT,GAAR,WACI,IAAI/T,EAA8B,EAAlB6B,KAAKU,EAAiBV,KAAKS,EACvCnD,EAAY0C,KAAKQ,EAAWR,KAAKS,EAErCT,KAAKmS,GAAQ,IAAI3S,EAAA,KAAK,GAAIQ,KAAKwD,IAG/BxD,KAAK8T,GAAqB3V,EAAGb,EAAG0C,KAAKmS,GAAOnS,KAAKwD,IAGjDxD,KAAK+T,GAAwB5V,EAAGb,EAAG0C,KAAKwD,KAGpClE,EAAAL,UAAA6U,GAAR,SAA6B3V,EAAWb,EAAW0W,EAAYC,GAC3D,IAAIC,EAAKlU,KAAKmU,GAAYhW,EAAI,EAAGb,GACjC4W,EAAGtW,KAAO,IACV,IAAIwW,EAAKF,EAAGG,MAAM,KACdC,EAAKJ,EAAGG,MAAM,KAEdE,EAAM/U,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAU,EAAJrW,GAAS8V,GACrDQ,EAAMjV,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAU,EAAJrW,GAAS8V,GACrDS,EAAMlV,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAU,EAAJrW,GAAS8V,GAEzDM,EAAIrN,SAASG,EAAI,KACjBoN,EAAIvN,SAASE,GAAK,KAElBmN,EAAI1O,SAASwB,EAAI,EAAIlJ,EACrBoW,EAAI1O,SAASyB,EAAI,EAAInJ,EAErBsW,EAAI5O,SAASyB,EAAI,EAAInJ,EACrBsW,EAAI5O,SAASuB,EAAI,EAAIjJ,EAErBuW,EAAI7O,SAASuB,EAAI,EAAIjJ,EACrBuW,EAAI7O,SAASwB,EAAI,EAAIlJ,EAErBoW,EAAII,mCACJF,EAAIE,mCACJD,EAAIC,mCAEJ,IAAIC,EAAOpV,EAAA,KAAKqV,UAAU,MAAW,EAAJ1W,EAAO8V,GAExCC,EAAGxP,OAASsP,EACZI,EAAG1P,OAASsP,EACZM,EAAG5P,OAASsP,EACZO,EAAI7P,OAASsP,EACbS,EAAI/P,OAASsP,EACbU,EAAIhQ,OAASsP,EACbY,EAAKlQ,OAASsP,EAEdE,EAAGhN,SAASE,EAAI,KAChBgN,EAAGlN,SAASG,GAAK,KAEjBrH,KAAK4L,GAAMsI,EACXlU,KAAK6L,GAAMuI,EACXpU,KAAK8L,GAAMwI,EACXtU,KAAK2G,GAAO4N,EACZvU,KAAK4G,GAAO6N,EACZzU,KAAK6G,GAAO6N,EACZ1U,KAAK+L,GAAQ6I,EACb5U,KAAK8U,GAAS,CAACZ,EAAIE,EAAIE,EAAIC,EAAKE,EAAKC,EAAKE,GAE1C5U,KAAKoS,GAAepS,KAAK8U,GAAQ,GAGjC9U,KAAK+U,GAAkB/U,KAAK8U,KAGxBxV,EAAAL,UAAA8U,GAAR,SAAgC5V,EAAWb,EAAW2W,GAElD,IAAIe,EAAa1X,EAAI,EAGjB2X,EAAQzV,EAAA,KAAK0V,eAAe,GAAIF,EAAI,EAAG7W,EAAG,EAAG,EAAG8V,GAChDkB,EAAQF,EAAMZ,MAAM,IACpBe,EAAQH,EAAMZ,MAAM,IAGpBjV,EAAQ,EAAJjB,EACJkX,EAAS7V,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAMpV,GAAK6U,GACpDqB,EAAS9V,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAMpV,GAAK6U,GACpDsB,EAAS/V,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAMpV,GAAK6U,GAEpDuB,EAAUhW,EAAA,KAAKqV,UAAU,MAAO1W,EAAG8V,GAEvCgB,EAAM/N,SAASG,EAAI,KACnB8N,EAAMjO,SAASG,EAAI,KACnB+N,EAAMlO,SAASG,EAAI,KAEnBgO,EAAOnO,SAASG,EAAI,KACpBiO,EAAOpO,SAASE,EAAI,KAGpBiO,EAAOxP,SAASwB,EAAIjI,EACpBiW,EAAOxP,SAASyB,EAAIlI,EAEpBkW,EAAOzP,SAASyB,EAAIlI,EACpBkW,EAAOzP,SAASuB,EAAIhI,EAEpBmW,EAAO1P,SAASuB,EAAIhI,EACpBmW,EAAO1P,SAASwB,EAAIjI,EAEpB6V,EAAMvQ,OAAS1E,KAAK4L,GACpBuJ,EAAMzQ,OAAS1E,KAAK6L,GACpBuJ,EAAM1Q,OAAS1E,KAAK8L,GACpBuJ,EAAO3Q,OAAS1E,KAAK2G,GACrB2O,EAAO5Q,OAAS1E,KAAK4G,GACrB2O,EAAO7Q,OAAS1E,KAAK6G,GACrB2O,EAAQ9Q,OAAS1E,KAAK+L,GAEtBkJ,EAAMpP,SAASyB,EAAIhK,EAAI0X,EAAK,EAC5BG,EAAMtP,SAASyB,EAAIhK,EAAI0X,EAAK,EAC5BI,EAAMvP,SAASyB,EAAIhK,EAAI0X,EAAK,EAE5BC,EAAM7G,SAAWpO,KAAKyV,GACtBN,EAAM/G,SAAWpO,KAAK0V,GACtBN,EAAMhH,SAAWpO,KAAK2V,GACtBN,EAAOjH,SAAWpO,KAAK0V,GACvBJ,EAAOlH,SAAWpO,KAAKyV,GACvBF,EAAOnH,SAAWpO,KAAK2V,GACvBH,EAAQpH,SAAWpO,KAAK4V,GAExB5V,KAAK6V,GAASZ,EACdjV,KAAK8V,GAASX,EACdnV,KAAK+V,GAASX,EACdpV,KAAKgW,GAAUX,EACfrV,KAAKiW,GAAUX,EACftV,KAAKkW,GAAUX,EACfvV,KAAKmW,GAAWX,EAChBxV,KAAKqS,GAAY,CAAC4C,EAAOE,EAAOC,EAAOC,EAAQC,EAAQC,EAAQC,GAE/DxV,KAAK+U,GAAkB/U,KAAKqS,IAC5BrS,KAAKoW,GAAmBpW,KAAKqS,KAuB1B/S,EAAAL,UAAAoX,gBAAP,SAAuBjP,GACZpH,KAAK8C,GAARsE,EAAqB,IACF,IACL,MAAdpH,KAAKyS,KACLzS,KAAKyS,GAAM9H,UACX3K,KAAKgM,GAAMrB,UACX3K,KAAKyS,GAAQ,KACbzS,KAAKwK,mBAILlL,EAAAL,UAAAyT,GAAR,WACI,IAAI/U,EAAYqC,KAAKQ,EAAWR,KAAKS,EAAa,EAClDT,KAAKyS,GAAQ,IAAIjT,EAAA,KAAK,GAAIQ,KAAKwD,IAG/BxD,KAAKsW,GAAmB3Y,EAAGqC,KAAKyS,IAGhCzS,KAAKuW,GAAsB5Y,IAIvB2B,EAAAL,UAAAqX,GAAR,SAA2B3Y,EAAW6Y,GAClC,IAAIC,EAAKzW,KAAK0W,GAAY/Y,EAAI,EAAGqC,KAAK8C,IAClC6T,EAAK3W,KAAK0W,GAAY/Y,EAAI,EAAGqC,KAAK8C,IAClC8T,EAAK5W,KAAK0W,GAAY/Y,EAAI,EAAGqC,KAAK8C,IAClC+T,EAAO7W,KAAK0W,GAAY/Y,EAAI,KAAM,KACtC8Y,EAAG7Y,KAAO,IACV+Y,EAAG/Y,KAAO,IACVgZ,EAAGhZ,KAAO,IACViZ,EAAKjZ,KAAO,MAEZ6Y,EAAGvP,SAASI,EAAI,KAChBsP,EAAG1P,SAASG,GAAK,KACjBoP,EAAG9B,mCACHiC,EAAGjC,mCAEHkC,EAAK3P,SAASG,EAAI,KAElBoP,EAAG/R,OAAS8R,EACZG,EAAGjS,OAAS8R,EACZI,EAAGlS,OAAS8R,EACZK,EAAKnS,OAAS1E,KAAKoG,GAEnBpG,KAAKoI,GAAMqO,EACXzW,KAAKsI,GAAMqO,EACX3W,KAAKwI,GAAMoO,EACX5W,KAAKgM,GAAQ6K,EACb7W,KAAK8W,GAAS,CAACL,EAAIE,EAAIC,EAAIC,GAE3B7W,KAAKoS,GAAepS,KAAK8W,GAAQ,GAIjC9W,KAAK+U,GAAkB/U,KAAK8W,KAGxBxX,EAAAL,UAAAsX,GAAR,SAA8B5Y,GAE1B,IAAIoZ,EAAQ/W,KAAKgX,GAAcrZ,EAAI,EAAGqC,KAAK8C,IAAY,GACnDmU,EAAQF,EAAM1C,MAAM,IACpB6C,EAAQH,EAAM1C,MAAM,IACpB8C,EAAUnX,KAAKgX,GAAcrZ,EAAI,KAAM,KAAK,GAC5CyZ,EAAWpX,KAAKgX,GAAcrZ,EAAI,EAAG,KAAK,GAE9CoZ,EAAMrS,OAAS1E,KAAKoI,GACpB6O,EAAMvS,OAAS1E,KAAKsI,GACpB4O,EAAMxS,OAAS1E,KAAKwI,GAEpBuO,EAAM7P,SAASI,EAAI,KACnB4P,EAAMhQ,SAASG,GAAK,KAEpB8P,EAAQzS,OAAS1E,KAAKgM,GACtBoL,EAAS1S,OAAS1E,KAAKgM,GAGvB+K,EAAM7I,MAAQlO,KAAKW,EACnBsW,EAAM/I,MAAQlO,KAAKY,EACnBsW,EAAMhJ,MAAQlO,KAAKa,EACnBsW,EAAQjJ,MAAQlO,KAAKe,EACrBqW,EAASlJ,MAAQ1O,EAAA,OAAO6X,OAExBrX,KAAKsX,GAASP,EACd/W,KAAKuX,GAASN,EACdjX,KAAKwX,GAASN,EACdlX,KAAKyX,GAAWN,EAChBnX,KAAK0X,GAAYN,EACjBpX,KAAK2S,GAAY,CAACoE,EAAOE,EAAOC,EAAOC,EAASC,GAEhDpX,KAAK+U,GAAkB/U,KAAK2S,IAC5B3S,KAAKoW,GAAmBpW,KAAK2S,KAGzBrT,EAAAL,UAAAmT,GAAR,SAAuBuF,EAAgBC,GACnCD,EAAOE,IAAI,SAACpa,GAAM,OAAAA,EAAE6G,WAAasT,KAE7BtY,EAAAL,UAAA8V,GAAR,SAA0B4C,GACtBA,EAAOE,IAAI,SAACpa,GAAQA,EAAE8G,YAAa,KAE/BjF,EAAAL,UAAAmX,GAAR,SAA2BuB,GACvBA,EAAOE,IAAI,SAACpa,GAAM,OAAAA,EAAEkW,iBAAmB,KAGnCrU,EAAAL,UAAAkV,GAAR,SAAoB2D,EAAWxa,GAC3B,IAAIya,EAAmB,CAAC,IAAIvY,EAAA,QAAQsY,EAAGA,EAAG,GAAI,IAAItY,EAAA,SAASsY,EAAGA,EAAG,GAAI,IAAItY,EAAA,SAASsY,GAAIA,EAAG,GAAI,IAAItY,EAAA,QAAQsY,GAAIA,EAAG,GAAI,IAAItY,EAAA,QAAQsY,EAAGA,EAAG,IAClIE,EAAkB,CAAC,IAAIxY,EAAA,QAAQ,EAAG,EAAG,GAAI,IAAIA,EAAA,QAAQ,EAAG,EAAGlC,IAE/D,OADgBkC,EAAA,KAAKyY,aAAa,GAAIF,EAAOC,EAAM,EAAG,EAAG,EAAGhY,KAAKwD,KAI7DlE,EAAAL,UAAA+X,GAAR,SAAsB7Y,EAAWI,EAAW2Z,GAC9B,OAAN3Z,IAAYA,EAAI,KAMpB,IALA,IACI8I,EACAC,EAFA6Q,EAAoB,GAGpBpb,EAAY,KAAO,IACnBoC,EAAY,EACPnC,EAAY,EAAGA,GAAKuB,EAAGvB,GAAQ,EACpCqK,EAAIlJ,EAAImC,KAAK8X,IAAIpb,EAAID,GACRuK,EAAJ,IAALtK,EAAamB,EAAiB,KAALnB,GAAemB,EAAYA,EAAImC,KAAK+X,IAAIrb,EAAID,GACzEob,EAAOhZ,GAAK,IAAIK,EAAA,QAAQ6H,EAAG,EAAGC,GAC9BnI,IAEJ,GAAI+Y,EAAQ,CACR/Z,GAAQ,IACR,IAASnB,EAAY,EAAGA,GAAKuB,EAAGvB,GAAQ,EACpCqK,EAAIlJ,EAAImC,KAAK8X,IAAIpb,EAAID,GACRuK,EAAJ,IAALtK,EAAamB,EAAiB,KAALnB,GAAemB,EAAYA,EAAImC,KAAK+X,IAAIrb,EAAID,GACzEob,EAAOhZ,GAAK,IAAIK,EAAA,QAAQ6H,EAAG,EAAGC,GAC9BnI,IAIR,OADwBK,EAAA,KAAKiU,YAAY,GAAI0E,EAAQnY,KAAKwD,KAItDlE,EAAAL,UAAAyX,GAAR,SAAoBvY,EAAWI,GACjB,OAANA,IAAYA,EAAI,KAMpB,IALA,IACI8I,EACAC,EAFA6Q,EAAoB,GAGpBpb,EAAY,KAAO,IACnBoC,EAAY,EACPnC,EAAY,EAAGA,GAAKuB,EAAGvB,GAAQ,GACpCqK,EAAIlJ,EAAImC,KAAK8X,IAAIpb,EAAID,GACRuK,EAAJ,IAALtK,EAAamB,EAAiB,KAALnB,GAAemB,EAAYA,EAAImC,KAAK+X,IAAIrb,EAAID,GACzEob,EAAOhZ,GAAK,IAAIK,EAAA,QAAQ6H,EAAG,EAAGC,GAC9BnI,IAGJ,OADiBK,EAAA,KAAK8Y,WAAW,GAAIH,EAAQnY,KAAKU,EAAaV,KAAKS,EAAa,EAAG,EAAG,KAAMjB,EAAA,KAAK+Y,OAAQvY,KAAKwD,KA0B3GlE,EAAAL,UAAA4T,GAAR,WACI,IAAI1U,EAA8B,EAAlB6B,KAAKU,EAAiBV,KAAKS,EACvCnD,EAAY0C,KAAKQ,EAAWR,KAAKS,EAErCT,KAAK8S,GAAQ,IAAItT,EAAA,KAAK,GAAIQ,KAAKwD,IAG/BxD,KAAKwY,GAAqBra,EAAGb,EAAG0C,KAAK8S,IAGrC9S,KAAKyY,GAAwBta,EAAGb,IAK5BgC,EAAAL,UAAAuZ,GAAR,SAA6Bra,EAAWb,EAAWob,GAC/C,IAAIC,EAAW3Y,KAAKmU,GAAYhW,EAAI,EAAGb,GACvCqb,EAAG/a,KAAO,IACV,IAAIgb,EAAWD,EAAGtE,MAAM,KACpBwE,EAAWF,EAAGtE,MAAM,KAEpByE,EAAYtZ,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAU,EAAJrW,GAAS6B,KAAKwD,IAChEuV,EAAYvZ,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAU,EAAJrW,GAAS6B,KAAKwD,IAChEwV,EAAYxZ,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAU,EAAJrW,GAAS6B,KAAKwD,IAGpEsV,EAAI5R,SAASG,EAAI,KACjB0R,EAAI7R,SAASE,GAAK,KAElB0R,EAAIjT,SAASwB,EAAI,EAAIlJ,EACrB2a,EAAIjT,SAASyB,EAAI,EAAInJ,EAErB4a,EAAIlT,SAASyB,EAAI,EAAInJ,EACrB4a,EAAIlT,SAASuB,EAAI,EAAIjJ,EAErB6a,EAAInT,SAASuB,EAAI,EAAIjJ,EACrB6a,EAAInT,SAASwB,EAAI,EAAIlJ,EAErB2a,EAAInE,mCACJoE,EAAIpE,mCACJqE,EAAIrE,mCAEJ,IAAIsE,EAAazZ,EAAA,KAAKqV,UAAU,MAAO,EAAI1W,EAAG6B,KAAKwD,IAEnDmV,EAAGjU,OAASgU,EACZE,EAAGlU,OAASgU,EACZG,EAAGnU,OAASgU,EACZO,EAAKvU,OAASgU,EACdI,EAAIpU,OAASgU,EACbK,EAAIrU,OAASgU,EACbM,EAAItU,OAASgU,EAEbC,EAAGzR,SAASE,EAAI,KAChBwR,EAAG1R,SAASG,GAAK,KAEjBrH,KAAKiM,GAAM0M,EACX3Y,KAAKkM,GAAM0M,EACX5Y,KAAKmM,GAAM0M,EACX7Y,KAAK8G,GAAOgS,EACZ9Y,KAAK+G,GAAOgS,EACZ/Y,KAAKgH,GAAOgS,EACZhZ,KAAKoM,GAAQ6M,EACbjZ,KAAKkZ,GAAS,CAACP,EAAIC,EAAIC,EAAIC,EAAKC,EAAKC,EAAKC,GAE1CjZ,KAAKoS,GAAepS,KAAKkZ,GAAQ,GAGjClZ,KAAK+U,GAAkB/U,KAAKkZ,KAGxB5Z,EAAAL,UAAAwZ,GAAR,SAAgCta,EAAWb,GAEvC,IAAI6b,EAAQ3Z,EAAA,KAAKqV,UAAU,GAAI1W,EAAG6B,KAAKwD,IACnC4V,EAAQD,EAAM9E,MAAM,IACpBgF,EAAQF,EAAM9E,MAAM,IAEpBjV,EAAQ,EAAJjB,EACJmb,EAAS9Z,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAMpV,GAAKY,KAAKwD,IACzD+V,EAAS/Z,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAMpV,GAAKY,KAAKwD,IACzDgW,EAASha,EAAA,YAAYoU,YAAY,KAAM,CAAEY,KAAMpV,GAAKY,KAAKwD,IAGzDiW,EAAUja,EAAA,KAAKqV,UAAU,MAAO1W,EAAG6B,KAAKwD,IAE5C8V,EAAOpS,SAASG,EAAI,KACpBkS,EAAOrS,SAASE,GAAK,KAErBkS,EAAOzT,SAASwB,EAAIjI,EACpBka,EAAOzT,SAASyB,EAAIlI,EAEpBma,EAAO1T,SAASyB,EAAIlI,EACpBma,EAAO1T,SAASuB,EAAIhI,EAEpBoa,EAAO3T,SAASuB,EAAIhI,EACpBoa,EAAO3T,SAASwB,EAAIjI,EAEpB+Z,EAAMzU,OAAS1E,KAAKiM,GACpBmN,EAAM1U,OAAS1E,KAAKkM,GACpBmN,EAAM3U,OAAS1E,KAAKmM,GACpBmN,EAAO5U,OAAS1E,KAAK8G,GACrByS,EAAO7U,OAAS1E,KAAK+G,GACrByS,EAAO9U,OAAS1E,KAAKgH,GACrByS,EAAQ/U,OAAS1E,KAAKoM,GAEtB+M,EAAMtT,SAASyB,EAAIhK,EAAIa,EAAI,EAC3Bib,EAAMvT,SAASyB,EAAIhK,EAAIa,EAAI,EAC3Bkb,EAAMxT,SAASyB,EAAIhK,EAAIa,EAAI,EAE3Bgb,EAAM/K,SAAWpO,KAAKyV,GACtB2D,EAAMhL,SAAWpO,KAAK0V,GACtB2D,EAAMjL,SAAWpO,KAAK2V,GACtB2D,EAAOlL,SAAWpO,KAAK0V,GACvB6D,EAAOnL,SAAWpO,KAAKyV,GACvB+D,EAAOpL,SAAWpO,KAAK2V,GACvB8D,EAAQrL,SAAWpO,KAAK4V,GAExB5V,KAAK0Z,GAASP,EACdnZ,KAAK2Z,GAASP,EACdpZ,KAAK4Z,GAASP,EACdrZ,KAAK6Z,GAAUP,EACftZ,KAAK8Z,GAAUP,EACfvZ,KAAK+Z,GAAUP,EACfxZ,KAAKga,GAAWP,EAChBzZ,KAAK+S,GAAY,CAACoG,EAAOC,EAAOC,EAAOC,EAAQC,EAAQC,EAAQC,GAE/DzZ,KAAK+U,GAAkB/U,KAAK+S,IAC5B/S,KAAKoW,GAAmBpW,KAAK+S,KA0B1BzT,EAAAL,UAAAgb,cAAP,SAAqBrC,GACjB5X,KAAKgB,EAAc4W,GAEhBtY,EAAAL,UAAAib,SAAP,SAAgB5c,GACR0C,KAAKC,GAAU3C,IACnB0C,KAAKC,EAAS3C,EACTA,IACD0C,KAAKmE,GAAQC,mBAAqB5E,EAAA,WAAW6E,cAI9C/E,EAAAL,UAAAkb,QAAP,WACI,OAAOna,KAAKC,GAGTX,EAAAL,UAAAmb,aAAP,SAAoBhb,GAChBY,KAAKE,EAASd,GAGXE,EAAAL,UAAAob,WAAP,SAAkBjb,GACdY,KAAKG,EAASf,GAGXE,EAAAL,UAAAqb,aAAP,SAAoBlb,GAChBY,KAAKkC,GAAS9C,GAIXE,EAAAL,UAAAsb,kBAAP,SAAyBhc,GACrByB,KAAK+C,GAAOsN,eAAe9R,EAAGA,EAAGA,GACjCyB,KAAKI,EAAa7B,GAGfe,EAAAL,UAAAub,gBAAP,SAAuBrc,GACnB6B,KAAKK,EAAWlC,GAMbmB,EAAAL,UAAAwb,kBAAP,SAAyBtc,GACrB6B,KAAKoC,GAAajE,GAQdmB,EAAAL,UAAAsS,GAAR,SAAmBmJ,EAAaC,EAAaC,EAAoBC,EAAeC,GAK5E,IAAInd,EAAY6B,EAAA,QAAQoG,IAAIiV,EAAMC,GAElCA,EAAGC,WAAWpd,EAAGqC,KAAKgD,IAEtB4X,EAAUI,SAAShb,KAAKgD,GAAMhD,KAAKiD,IACnC,IAAIjG,EAAagD,KAAKiD,GAEtBjD,KAAKqD,GAAY4C,iBAAiBC,YAAYlG,KAAKmD,IACnD3D,EAAA,QAAQ2G,0BAA0BnG,KAAKiD,GAAMjD,KAAKmD,GAAKnD,KAAKiD,IAE5D,IAAIgY,EAAY,EACZje,EAAEqK,GAAK,GAAKrK,EAAEoK,GAAK,EAAG6T,EAAI,EACrBje,EAAEqK,GAAK,GAAKrK,EAAEoK,GAAK,EAAG6T,EAAI,EAC1Bje,EAAEqK,GAAK,GAAKrK,EAAEoK,GAAK,EAAG6T,EAAI,EAC1Bje,EAAEqK,GAAK,GAAKrK,EAAEoK,GAAK,IAAG6T,EAAI,GAOnCzb,EAAA,QAAQ2G,0BAA0BuU,EAAI1a,KAAKmD,GAAKnD,KAAKgD,IACrDxD,EAAA,QAAQ2G,0BAA0BwU,EAAI3a,KAAKmD,GAAKnD,KAAKiD,IACrDjD,KAAKiD,GAAKiY,gBAAgBlb,KAAKgD,IAC/B,IAAImY,EAAcnb,KAAKiD,GAEnBkO,EAAgBgK,EAAGpT,SAEnBtK,EAAY,GACZ0d,EAAG9T,GAAK,GAAK8T,EAAG/T,GAAK,EACH3J,EAAd0d,EAAG9T,GAAK8T,EAAG/T,EAAO,IAAc,IAC7B+T,EAAG9T,GAAK,GAAK8T,EAAG/T,GAAK,EACT3J,GAAd0d,EAAG9T,GAAK8T,EAAG/T,EAAO,IAAc,IAC9B+T,EAAG9T,GAAK,GAAK8T,EAAG/T,GAAK,EACR3J,GAAf0d,EAAG9T,IAAM8T,EAAG/T,EAAO,IAAc,IAC/B+T,EAAG9T,GAAK,GAAK8T,EAAG/T,GAAK,IACT3J,EAAf0d,EAAG9T,IAAM8T,EAAG/T,EAAO,IAAc,KAOzC,IAAIjJ,EAAY,EAiBhB,MAfS,KAALV,EACsBU,EAAb,GAAL8c,GAAe,GAALA,EAAY,GAChB,EACE,KAALxd,EACeU,EAAb,GAAL8c,GAAe,GAALA,GAAa,EAClB,EAEG,KAALxd,EACeU,EAAb,GAAL8c,GAAe,GAALA,EAAY,GAChB,EACE,KAALxd,IACeU,EAAb,GAAL8c,GAAe,GAALA,GAAa,EAClB,GAGN9c,EAAIgT,GAQP7R,EAAAL,UAAAwS,GAAR,SAAkBiJ,EAAaC,EAAaxb,EAAY0b,GACpDH,EAAGnU,cAAcpH,EAAGa,KAAKgD,IACzB2X,EAAGpU,cAAcpH,EAAGa,KAAKiD,IACzBzD,EAAA,QAAQ4b,WAAWpb,KAAKgD,GAAMhD,KAAKiD,GAAMjD,KAAKkD,IAC9C,IAAIiO,EAAgB7Q,KAAK+a,KAAKrb,KAAKkD,GAAK6E,UAAY/H,KAAKgD,GAAK+E,SAAW/H,KAAKiD,GAAK8E,WAKnF,OAHKvI,EAAA,QAAQoG,IAAI5F,KAAKkD,GAAM2X,GAAQ,IAChC1J,IAAS,GAENA,GAIH7R,EAAAL,UAAAuF,GAAR,SAAyByP,GACrBjU,KAAKyV,GAAUnW,EAAYgc,GAAqBtb,KAAKW,EAASsT,GAC9DjU,KAAK0V,GAAYpW,EAAYgc,GAAqBtb,KAAKY,EAAWqT,GAClEjU,KAAK2V,GAAWrW,EAAYgc,GAAqBtb,KAAKa,EAAUoT,GAChEjU,KAAKqO,GAAY/O,EAAYgc,GAAqBtb,KAAKc,EAAWmT,GAClEjU,KAAK4V,GAAatW,EAAYgc,GAAqBtb,KAAKe,EAAYkT,IAGhE3U,EAAAL,UAAA2L,GAAR,WACI5K,KAAKyV,GAAQ9K,UACb3K,KAAK0V,GAAU/K,UACf3K,KAAK2V,GAAShL,UACd3K,KAAKqO,GAAU1D,UACf3K,KAAK4V,GAAWjL,WAGLrL,EAAAgc,GAAf,SAAoCC,EAAatH,GAC7C,IAAIuH,EAAwB,IAAIhc,EAAA,iBAAiB,GAAIyU,GAKrD,OAJAuH,EAAIC,cAAgBF,EACpBC,EAAIE,aAAelc,EAAA,OAAOmc,QAC1BH,EAAII,cAAgBpc,EAAA,OAAOmc,QAC3BH,EAAIK,iBAAkB,EACfL,GAEflc,EA//DA,GAigEAqE,EAAA,WAWI,SAAAA,EAAmBlE,EAAqBqc,GARhC9b,KAAA+b,QAAkB,GAElB/b,KAAAgc,KAAmB,IAAIC,MAEvBjc,KAAAkc,MAAgB,EAEhBlc,KAAAmc,SAAmB,EAGvBnc,KAAKP,KAAOA,EACZO,KAAK+b,QAAUD,EAAW,EAC1B9b,KAAKyO,MAgDb,OA7CW9K,EAAA1E,UAAAgK,YAAP,SAAmBvL,GACL,GAALA,GAILsC,KAAK+b,QAAUre,EAAI,EACnBsC,KAAKkc,MAAQ,EACblc,KAAKmc,SAAW,EAChBnc,KAAKgc,KAAO,IAAIC,MAChBjc,KAAKyO,OAPDxK,QAAQmY,MAAM,sCAUfzY,EAAA1E,UAAAwP,IAAP,SAAWtF,QACI3D,IAAP2D,IAAkBA,EAAK,MAC3B,IAAIkT,EAAW,IAAIC,EAAItc,KAAKP,KAAM0J,GAC7BnJ,KAAKmc,QAAUnc,KAAKkc,OACrBlc,KAAKgc,KAAKO,OAAOvc,KAAKmc,QAAU,GAChCnc,KAAKkc,KAAOlc,KAAKmc,SAEhBnc,KAAKkc,MAAQlc,KAAK+b,SACnB/b,KAAKgc,KAAKQ,QACVxc,KAAKgc,KAAKS,KAAKJ,KAEfrc,KAAKgc,KAAKS,KAAKJ,GACfrc,KAAKkc,OACLlc,KAAKmc,YAINxY,EAAA1E,UAAAiK,KAAP,WACI,GAAKlJ,KAAKmc,QAAU,EAAI,CACpB,IAAIhT,EAAmBnJ,KAAKgc,KAAKhc,KAAKmc,SAAUO,gBAGhD,OAFA1c,KAAKmc,UACCnc,KAAKgc,KAAKhc,KAAKmc,SAAUQ,QAAQ3c,KAAKP,MACrC0J,IAIRxF,EAAA1E,UAAAsK,KAAP,WACI,GAAKvJ,KAAKmc,QAAUnc,KAAKkc,KAGrB,OAFAlc,KAAKmc,UACCnc,KAAKgc,KAAKhc,KAAKmc,SAAUQ,QAAQ3c,KAAKP,MAC/BO,KAAKgc,KAAKhc,KAAKmc,SAAUO,iBAGlD/Y,EA9DA,GAgEA2Y,EAAA,WAWI,SAAAA,EAAmB7c,EAAqB0J,GACpCnJ,KAAK4c,GAAKnd,EAAKoG,SAASwO,QAEO,MAA3B5U,EAAK2E,oBACLpE,KAAK6c,GAAM,KACX7c,KAAK8c,GAAMrd,EAAKyH,SAASmN,UAEzBrU,KAAK6c,GAAMpd,EAAK2E,mBAAmBiQ,QACnCrU,KAAK8c,GAAM,MAEf9c,KAAK+c,GAAKtd,EAAKkI,QAAQ0M,QACvBrU,KAAKgd,GAAM7T,EA+BnB,OA5BWmT,EAAArd,UAAAyd,cAAP,WACI,OAAO1c,KAAKgd,IAGTV,EAAArd,UAAA0d,QAAP,SAAeld,GACXA,EAAKoG,SAAS0B,SAASvH,KAAK4c,IAIG,MAA3Bnd,EAAK2E,mBACW,MAAZpE,KAAK8c,GAELrd,EAAKyH,SAASK,SAASvH,KAAK8c,IAG5Brd,EAAKyH,SAASK,SAASvH,KAAK6c,GAAIjL,iBAGpB,MAAZ5R,KAAK6c,GACLpd,EAAK2E,mBAAmBmD,SAASvH,KAAK6c,IAItCpd,EAAK2E,mBAAmBmD,SAAS/H,EAAA,WAAWyd,qBAAqBjd,KAAK8c,GAAI1V,EAAGpH,KAAK8c,GAAIzV,EAAGrH,KAAK8c,GAAIxV,IAG1G7H,EAAKkI,QAAQJ,SAASvH,KAAK+c,KAEnCT,EArDA","file":"EditControl.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"babylonjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"babylonjs\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"babylonjs\")) : factory(root[\"BABYLON\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function(__WEBPACK_EXTERNAL_MODULE__0__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","module.exports = __WEBPACK_EXTERNAL_MODULE__0__;","\r\nimport {\r\n AbstractMesh,\r\n Axis,\r\n BoundingBox,\r\n Camera,\r\n Color3,\r\n LinesMesh,\r\n Material,\r\n Matrix,\r\n Mesh,\r\n MeshBuilder,\r\n Node,\r\n PickingInfo,\r\n Quaternion,\r\n Scene,\r\n Space,\r\n StandardMaterial,\r\n Vector3,\r\n TransformNode\r\n}\r\n from 'babylonjs';\r\n\r\n\r\n\r\nenum ActionType {\r\n TRANS = 0,\r\n ROT = 1,\r\n SCALE = 2\r\n}\r\n\r\n/**\r\n * Draws a transform widget at the mesh's location (its pivot location).\r\n * The widget transforms(translates,rotates and scales) the mesh based on user\r\n * interactions with the widget.\r\n * The widget shows the mesh position and rotation at any time. \r\n * The widget follows the mesh constantly. \r\n * Note: An alternate approach would have been for the mesh to follow the widget.\r\n * The problem with the alternate approach - syncing the transforms\r\n * if the mesh was being transformed by entities other than the widget say physics \r\n * or script for example.\r\n * \r\n */\r\n\r\nexport class EditControl {\r\n private _mesh: TransformNode;\r\n\r\n\r\n private _canvas: HTMLCanvasElement;\r\n private _scene: Scene;\r\n private _mainCamera: Camera;\r\n //root of the edit control\r\n private _ecRoot: Mesh;\r\n private _local: boolean = true;\r\n private _snapT: boolean = false;\r\n private _snapR: boolean = false;\r\n private _transSnap: number = 1;\r\n private _rotSnap: number = Math.PI / 18;\r\n private _axesLen: number = 0.4;\r\n private _axesScale: number = 1;\r\n //how close to an axis should we get before we can pick it \r\n private _pickWidth: number = 0.02;\r\n private _redMat: StandardMaterial;\r\n private _greenMat: StandardMaterial;\r\n private _blueMat: StandardMaterial;\r\n private _whiteMat: StandardMaterial;\r\n private _yellowMat: StandardMaterial;\r\n private _redCol: Color3 = new Color3(1, 0.2, 0.2);\r\n private _greenCol: Color3 = new Color3(0.2, 1, 0.2);\r\n private _blueCol: Color3 = new Color3(0.2, 0.2, 1);\r\n private _whiteCol: Color3 = new Color3(1, 1, 1);\r\n private _yellowCol: Color3 = new Color3(1, 1, 0.2);\r\n\r\n private _actHist: ActHist;\r\n private _renderer: () => void;\r\n private _pointerdown: EventListener;\r\n private _pointerup: EventListener;\r\n private _pointermove: EventListener;\r\n //axes visibility\r\n private _visibility: number = 0.75;\r\n\r\n //lhs-rhs issue. lhs mesh in rhs or rhs mesh in lhs\r\n private _lhsRhs: boolean = false;\r\n\r\n public constructor(mesh: TransformNode, camera: Camera, canvas: HTMLCanvasElement, scale?: number, eulerian?: boolean, pickWidth?: number) {\r\n\r\n this._mesh = mesh;\r\n this._mainCamera = camera;\r\n this._canvas = canvas;\r\n\r\n if (scale != null) {\r\n this._axesScale = scale;\r\n }\r\n\r\n if (eulerian !== null) {\r\n this._eulerian = eulerian;\r\n } else {\r\n this._eulerian = false;\r\n }\r\n this._checkQuaternion();\r\n\r\n if (pickWidth != null) {\r\n this._pickWidth = pickWidth;\r\n }\r\n\r\n this._scene = mesh.getScene();\r\n this._actHist = new ActHist(mesh, 10);\r\n\r\n mesh.computeWorldMatrix(true);\r\n this._boundingDimesion = this._getBoundingDimension(mesh);\r\n this._setLocalAxes(mesh);\r\n this._lhsRhs = this._check_LHS_RHS(mesh);\r\n console.log(\"lhs rhs issue \" + this._lhsRhs);\r\n\r\n //build the edit control axes\r\n this._ecRoot = new Mesh(\"\", this._scene);\r\n this._ecRoot.rotationQuaternion = Quaternion.Identity();\r\n this._ecRoot.visibility = 0;\r\n this._ecRoot.isPickable = false;\r\n\r\n this._createMaterials(this._scene);\r\n\r\n let guideAxes: Mesh = this._createCommonAxes();\r\n guideAxes.parent = this._ecRoot;\r\n\r\n //build the pickplanes\r\n let pickPlanes: Mesh = this._createPickPlanes();\r\n pickPlanes.parent = this._ecRoot;\r\n\r\n this._pointerdown = (evt) => { return this._onPointerDown(evt) };\r\n this._pointerup = (evt) => { return this._onPointerUp(evt) };\r\n this._pointermove = (evt) => { return this._onPointerMove(evt) };\r\n\r\n //use canvas rather than scene to handle pointer events\r\n //scene cannot have mutiple eventlisteners for an event\r\n //with canvas one will have to do ones own pickinfo generattion.\r\n\r\n canvas.addEventListener(\"pointerdown\", this._pointerdown, false);\r\n canvas.addEventListener(\"pointerup\", this._pointerup, false);\r\n canvas.addEventListener(\"pointermove\", this._pointermove, false);\r\n\r\n\r\n this._renderer = () => { return this._renderLoopProcess() };\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n public getRoot(): AbstractMesh {\r\n return this._ecRoot;\r\n }\r\n\r\n //make sure that if eulerian is set to false then mesh's rotation is in quaternion\r\n //throw error and exit if not so.\r\n private _checkQuaternion() {\r\n if (!this._eulerian) {\r\n if ((this._mesh.rotationQuaternion == null) || (this._mesh.rotationQuaternion == undefined)) {\r\n throw \"Error: Eulerian is set to false but the mesh's rotationQuaternion is not set.\";\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * checks if a have left hand , right hand issue.\r\n * In other words if a mesh is a LHS mesh in RHS system or \r\n * a RHS mesh in LHS system\r\n * The X axis will be reversed in such cases.\r\n * thus Cross product of X and Y should be inverse of Z.\r\n * \r\n * if no parent then we are ok.\r\n * If parent and parent has issue then we have issue.\r\n * \r\n */\r\n private _check_LHS_RHS(mesh: TransformNode) {\r\n let _issue: boolean = false;\r\n let root: Node = mesh.parent;\r\n if (root == null) return false;\r\n this._setLocalAxes(root);\r\n let actualZ = Vector3.Cross(this._localX, this._localY);\r\n //same direction or opposite direction of Z\r\n if (Vector3.Dot(actualZ, this._localZ) < 0) _issue = true;\r\n else _issue = false;\r\n this._setLocalAxes(mesh);\r\n return _issue;\r\n }\r\n\r\n private _ecMatrix: Matrix = new Matrix();\r\n //edit control to camera vector\r\n private _ecTOcamera: Vector3 = new Vector3(0, 0, 0);\r\n private _renderLoopProcess() {\r\n\r\n //sync the edit control position and rotation with that of mesh\r\n this._ecRoot.position = this._mesh.getAbsolutePivotPoint();\r\n this._setECRotation();\r\n\r\n //scale the EditControl so it seems at the same distance from camera/user\r\n this._setECScale();\r\n\r\n //rotate the free move,rotate,scale pick plane to face the camera/user\r\n if (this._local) {\r\n this._ecRoot.getWorldMatrix().invertToRef(this._ecMatrix);\r\n Vector3.TransformCoordinatesToRef(this._mainCamera.position, this._ecMatrix, this._ecTOcamera);\r\n //note pALL is child of ecRoot hence lookAt in local space\r\n this._pALL.lookAt(this._ecTOcamera, 0, 0, 0, Space.LOCAL);\r\n } else {\r\n this._mainCamera.position.subtractToRef(this._ecRoot.position, this._ecTOcamera);\r\n this._pALL.lookAt(this._mainCamera.position, 0, 0, 0, Space.WORLD);\r\n }\r\n\r\n //rotate the rotation and planar guide to face the camera/user\r\n if (this._rotEnabled) {\r\n this._rotRotGuides();\r\n }\r\n else if (this._transEnabled) this._rotPlanarGuides(this._tXZ, this._tZY, this._tYX);\r\n else if (this._scaleEnabled) this._rotPlanarGuides(this._sXZ, this._sZY, this._sYX);\r\n\r\n //check pointer over axes only during pointer moves\r\n //this.onPointerOver();\r\n }\r\n\r\n /**\r\n * sets rotaion of edit control to that of the mesh\r\n */\r\n private _setECRotation() {\r\n if (this._local) {\r\n if (this._mesh.parent == null) {\r\n if (this._eulerian) {\r\n let rot: Vector3 = this._mesh.rotation;\r\n Quaternion.RotationYawPitchRollToRef(rot.y, rot.x, rot.z, this._ecRoot.rotationQuaternion);\r\n } else {\r\n this._ecRoot.rotationQuaternion.copyFrom(this._mesh.rotationQuaternion);\r\n }\r\n } else {\r\n\r\n if (this._isScaleUnEqual(this._mesh)) return;\r\n\r\n this._mesh.getWorldMatrix().getRotationMatrixToRef(this._tm);\r\n Quaternion.FromRotationMatrixToRef(this._tm, this._ecRoot.rotationQuaternion);\r\n //this._ecRoot.rotationQuaternion.normalize();\r\n }\r\n }\r\n }\r\n /**\r\n * checks if any of the mesh's ancestors has non uniform scale\r\n */\r\n private _isScaleUnEqual(mesh: TransformNode): boolean {\r\n if (mesh.parent == null) return false;\r\n while (mesh.parent != null) {\r\n if (((<Mesh>mesh.parent).scaling.x != (<Mesh>mesh.parent).scaling.y ||\r\n (<Mesh>mesh.parent).scaling.y != (<Mesh>mesh.parent).scaling.z)) {\r\n return true;\r\n } else {\r\n mesh = <Mesh>mesh.parent;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n //how far away from camera should the edit control appear to be\r\n private _distFromCamera: number = 2;\r\n //vector from camera to edit control\r\n private _cameraTOec: Vector3 = new Vector3(0, 0, 0);\r\n private _cameraNormal: Vector3 = new Vector3(0, 0, 0);\r\n private _setECScale() {\r\n this._ecRoot.position.subtractToRef(this._mainCamera.position, this._cameraTOec);\r\n Vector3.FromFloatArrayToRef(this._mainCamera.getWorldMatrix().asArray(), 8, this._cameraNormal);\r\n\r\n //get distance of edit control from the camera plane \r\n //project \"camera to edit control\" vector onto the camera normal\r\n let parentOnNormal: number = Vector3.Dot(this._cameraTOec, this._cameraNormal) / this._cameraNormal.length();\r\n\r\n let s: number = Math.abs(parentOnNormal / this._distFromCamera);\r\n Vector3.FromFloatsToRef(s, s, s, this._ecRoot.scaling);\r\n //Vector3.FromFloatsToRef(s,s,s,this.pALL.scaling);\r\n }\r\n\r\n\r\n //rotate the rotation guides so that they are facing the camera\r\n private _rotRotGuides() {\r\n let rotX = Math.atan(this._ecTOcamera.y / this._ecTOcamera.z);\r\n if (this._ecTOcamera.z >= 0) {\r\n this._rX.rotation.x = -rotX;\r\n } else {\r\n this._rX.rotation.x = -rotX - Math.PI;\r\n }\r\n\r\n let rotY = Math.atan(this._ecTOcamera.x / this._ecTOcamera.z);\r\n if (this._ecTOcamera.z >= 0) {\r\n this._rY.rotation.y = rotY;\r\n } else {\r\n this._rY.rotation.y = rotY + Math.PI;\r\n }\r\n\r\n let rotZ = Math.atan(this._ecTOcamera.x / this._ecTOcamera.y);\r\n if (this._ecTOcamera.y >= 0) {\r\n this._rZ.rotation.z = -rotZ;\r\n } else {\r\n this._rZ.rotation.z = -rotZ - Math.PI;\r\n }\r\n }\r\n\r\n /**\r\n * rotate the planar guide so that they are facing the camera\r\n */\r\n private _rotPlanarGuides(XZ: Mesh, ZY: Mesh, YX: Mesh) {\r\n let ec: Vector3 = this._ecTOcamera;\r\n\r\n XZ.rotation.x = 0;\r\n XZ.rotation.y = 0;\r\n XZ.rotation.z = 0;\r\n\r\n ZY.rotation.x = 0;\r\n ZY.rotation.y = 0;\r\n ZY.rotation.z = 0;\r\n\r\n YX.rotation.x = 0;\r\n YX.rotation.y = 0;\r\n YX.rotation.z = 0;\r\n\r\n if (ec.x <= 0 && ec.y >= 0 && ec.z >= 0) {\r\n XZ.rotation.z = 3.14;\r\n YX.rotation.y = 3.14;\r\n } else if (ec.x <= 0 && ec.y >= 0 && ec.z <= 0) {\r\n XZ.rotation.y = 3.14;\r\n ZY.rotation.y = 3.14;\r\n YX.rotation.y = 3.14;\r\n } else if (ec.x >= 0 && ec.y >= 0 && ec.z <= 0) {\r\n XZ.rotation.x = 3.14;\r\n ZY.rotation.y = 3.14;\r\n } else if (ec.x >= 0 && ec.y <= 0 && ec.z >= 0) {\r\n ZY.rotation.z = 3.14;\r\n YX.rotation.x = 3.14;\r\n } else if (ec.x <= 0 && ec.y <= 0 && ec.z >= 0) {\r\n XZ.rotation.z = 3.14;\r\n ZY.rotation.z = 3.14;\r\n YX.rotation.z = 3.14;\r\n } else if (ec.x <= 0 && ec.y <= 0 && ec.z <= 0) {\r\n XZ.rotation.y = 3.14;\r\n ZY.rotation.x = 3.14;\r\n YX.rotation.z = 3.14;\r\n } else if (ec.x >= 0 && ec.y <= 0 && ec.z <= 0) {\r\n XZ.rotation.x = 3.14;\r\n ZY.rotation.x = 3.14;\r\n YX.rotation.x = 3.14;\r\n }\r\n }\r\n\r\n\r\n\r\n public switchTo(mesh: TransformNode, eulerian?: boolean) {\r\n mesh.computeWorldMatrix(true);\r\n this._mesh = mesh;\r\n if (eulerian != null) {\r\n this._eulerian = eulerian;\r\n }\r\n this._checkQuaternion();\r\n this._setLocalAxes(mesh);\r\n this._actHist = new ActHist(mesh, 10);\r\n this._lhsRhs = this._check_LHS_RHS(mesh);\r\n this.refreshBoundingInfo();\r\n }\r\n\r\n public switchCamera(camera: Camera) {\r\n this._mainCamera = camera;\r\n }\r\n\r\n public setUndoCount(c: number) {\r\n this._actHist.setCapacity(c);\r\n }\r\n\r\n public undo() {\r\n let at: number = this._actHist.undo();\r\n this._mesh.computeWorldMatrix(true);\r\n this._setLocalAxes(this._mesh);\r\n this._callActionStartListener(at);\r\n this._callActionListener(at);\r\n this._callActionEndListener(at);\r\n }\r\n\r\n public redo() {\r\n let at: number = this._actHist.redo();\r\n this._mesh.computeWorldMatrix(true);\r\n this._setLocalAxes(this._mesh);\r\n this._callActionStartListener(at);\r\n this._callActionListener(at);\r\n this._callActionEndListener(at);\r\n }\r\n\r\n /**\r\n * detach the edit control from the mesh and dispose off all\r\n * resources created by the edit control\r\n */\r\n public detach() {\r\n this._canvas.removeEventListener(\"pointerdown\", this._pointerdown, false);\r\n this._canvas.removeEventListener(\"pointerup\", this._pointerup, false);\r\n this._canvas.removeEventListener(\"pointermove\", this._pointermove, false);\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n this.removeAllActionListeners();\r\n this._disposeAll();\r\n }\r\n private _prevState: String = \"\";\r\n private _hidden: boolean = false;\r\n\r\n /**\r\n * hide the edit control. use show() to unhide the control.\r\n */\r\n public hide() {\r\n this._hidden = true;\r\n if (this._transEnabled) {\r\n this._prevState = \"T\";\r\n this.disableTranslation();\r\n } else if (this._rotEnabled) {\r\n this._prevState = \"R\";\r\n this.disableRotation();\r\n } else if (this._scaleEnabled) {\r\n this._prevState = \"S\";\r\n this.disableScaling();\r\n }\r\n this._hideCommonAxes();\r\n }\r\n\r\n private _hideCommonAxes() {\r\n this._xaxis.visibility = 0;\r\n this._yaxis.visibility = 0;\r\n this._zaxis.visibility = 0;\r\n }\r\n private _showCommonAxes() {\r\n this._xaxis.visibility = this._visibility;\r\n this._yaxis.visibility = this._visibility;\r\n this._zaxis.visibility = this._visibility;\r\n }\r\n /**\r\n * unhide the editcontrol hidden using the hide() method\r\n */\r\n public show() {\r\n this._hidden = false;\r\n this._showCommonAxes();\r\n if (this._prevState == \"T\") this.enableTranslation();\r\n else if (this._prevState == \"R\") this.enableRotation();\r\n else if (this._prevState == \"S\") this.enableScaling();\r\n }\r\n\r\n /**\r\n * check if the editcontrol was hidden using the hide() methods\r\n */\r\n public isHidden(): boolean {\r\n return this._hidden;\r\n }\r\n\r\n private _disposeAll() {\r\n this._ecRoot.dispose();\r\n this._disposeMaterials();\r\n this._actHist = null;\r\n }\r\n\r\n private _actionListener: (actionType: number) => void = null;\r\n private _actionStartListener: (actionType: number) => void = null;\r\n private _actionEndListener: (actionType: number) => void = null;\r\n\r\n public addActionListener(actionListener: (actionType: number) => void) {\r\n this._actionListener = actionListener;\r\n }\r\n public removeActionListener() {\r\n this._actionListener = null;\r\n }\r\n public addActionStartListener(actionStartListener: (actionType: number) => void) {\r\n this._actionStartListener = actionStartListener;\r\n }\r\n public removeActionStartListener() {\r\n this._actionStartListener = null;\r\n }\r\n public addActionEndListener(actionEndListener: (actionType: number) => void) {\r\n this._actionEndListener = actionEndListener;\r\n }\r\n public removeActionEndListener() {\r\n this._actionEndListener = null;\r\n }\r\n\r\n public removeAllActionListeners() {\r\n this._actionListener = null;\r\n this._actionStartListener = null;\r\n this._actionEndListener = null;\r\n }\r\n\r\n private _pDown: boolean = false;\r\n\r\n private _axisPicked: Mesh;\r\n\r\n private _onPointerDown(evt: Event) {\r\n evt.preventDefault();\r\n this._pDown = true;\r\n if ((<PointerEvent>evt).button != 0) return;\r\n //TODO: do we really need to do a pick here?\r\n //onPointerOver() has already done this.\r\n let pickResult: PickingInfo = this._scene.pick(this._scene.pointerX, this._scene.pointerY, (mesh) => {\r\n if (this._transEnabled) {\r\n if ((mesh == this._tX) || (mesh == this._tY) || (mesh == this._tZ) || (mesh == this._tXZ) || (mesh == this._tZY) || (mesh == this._tYX) || (mesh == this._tAll)) return true;\r\n } else if ((this._rotEnabled)) {\r\n if ((mesh == this._rX) || (mesh == this._rY) || (mesh == this._rZ) || (mesh == this._rAll)) return true;\r\n } else if ((this._scaleEnabled)) {\r\n if ((mesh == this._sX) || (mesh == this._sY) || (mesh == this._sZ) || (mesh == this._sXZ) || (mesh == this._sZY) || (mesh == this._sYX) || (mesh == this._sAll)) return true;\r\n }\r\n return false;\r\n }, null, this._mainCamera);\r\n\r\n if (pickResult.hit) {\r\n //this.setAxesVisiblity(0);\r\n this._axisPicked = <Mesh>pickResult.pickedMesh;\r\n let childs: Node[] = this._axisPicked.getChildren();\r\n if (childs.length > 0) {\r\n (<Mesh>childs[0]).visibility = this._visibility;\r\n } else {\r\n this._axisPicked.visibility = this._visibility;\r\n }\r\n let name: string = this._axisPicked.name;\r\n if ((name == \"X\")) this._bXaxis.visibility = 1;\r\n else if ((name == \"Y\")) this._bYaxis.visibility = 1;\r\n else if ((name == \"Z\")) this._bZaxis.visibility = 1;\r\n else if ((name == \"XZ\")) {\r\n this._bXaxis.visibility = 1;\r\n this._bZaxis.visibility = 1;\r\n } else if ((name == \"ZY\")) {\r\n this._bZaxis.visibility = 1;\r\n this._bYaxis.visibility = 1;\r\n } else if ((name == \"YX\")) {\r\n this._bYaxis.visibility = 1;\r\n this._bXaxis.visibility = 1;\r\n } else if ((name == \"ALL\")) {\r\n this._bXaxis.visibility = 1;\r\n this._bYaxis.visibility = 1;\r\n this._bZaxis.visibility = 1;\r\n }\r\n this._setEditing(true);\r\n //lets find out where we are on the pickplane\r\n this._pickedPlane = this._getPickPlane(this._axisPicked);\r\n if (this._pickedPlane != null) {\r\n this._prevPos = this._getPosOnPickPlane();\r\n } else {\r\n this._prevPos = null;\r\n }\r\n window.setTimeout(((cam, can) => { return this._detachCamera(cam, can) }), 0, this._mainCamera, this._canvas);\r\n }\r\n }\r\n\r\n private _setEditing(editing: boolean) {\r\n this._editing = editing;\r\n if (editing) {\r\n this._setActionType();\r\n if (this._actionType == ActionType.ROT) {\r\n this._snapRA = 0;\r\n }\r\n this._callActionStartListener(this._actionType);\r\n } else {\r\n this._callActionEndListener(this._actionType);\r\n }\r\n }\r\n\r\n public isEditing(): boolean {\r\n return this._editing;\r\n }\r\n\r\n /**\r\n * no camera movement during edit\r\n */\r\n private _detachCamera(cam: Object, can: Object) {\r\n let camera: Camera = <Camera>cam;\r\n let canvas: HTMLCanvasElement = <HTMLCanvasElement>can;\r\n camera.detachControl(canvas);\r\n }\r\n\r\n private _prevOverMesh: Mesh;\r\n\r\n private _pointerIsOver: boolean = false;\r\n\r\n public isPointerOver(): boolean {\r\n return this._pointerIsOver;\r\n }\r\n private _savedMat: Material;\r\n private _savedCol: Color3;\r\n private _onPointerOver() {\r\n //if(this.pDown) return;\r\n let pickResult: PickingInfo = this._scene.pick(this._scene.pointerX, this._scene.pointerY, (mesh) => {\r\n if (this._transEnabled) {\r\n if ((mesh == this._tX) || (mesh == this._tY) || (mesh == this._tZ) || (mesh == this._tXZ) || (mesh == this._tZY) || (mesh == this._tYX) || (mesh == this._tAll)) return true;\r\n } else if ((this._rotEnabled)) {\r\n if ((mesh == this._rX) || (mesh == this._rY) || (mesh == this._rZ) || (mesh == this._rAll)) return true;\r\n } else if (this._scaleEnabled) {\r\n if ((mesh == this._sX) || (mesh == this._sY) || (mesh == this._sZ) || (mesh == this._sXZ) || (mesh == this._sZY) || (mesh == this._sYX) || (mesh == this._sAll)) return true;\r\n }\r\n return false;\r\n }, null, this._mainCamera);\r\n if (pickResult.hit) {\r\n //if we are still over the same axis mesh then don't do anything\r\n if (<Mesh>pickResult.pickedMesh != this._prevOverMesh) {\r\n this._pointerIsOver = true;\r\n //if we moved directly from one axis mesh to this then clean up the prev axis mesh\r\n this._clearPrevOverMesh();\r\n this._prevOverMesh = <Mesh>pickResult.pickedMesh;\r\n if (this._rotEnabled) {\r\n this._savedCol = (<LinesMesh>this._prevOverMesh.getChildren()[0]).color;\r\n (<LinesMesh>this._prevOverMesh.getChildren()[0]).color = this._whiteCol;\r\n } else {\r\n let childs: Node[] = this._prevOverMesh.getChildren();\r\n if (childs.length > 0) {\r\n this._savedMat = (<Mesh>childs[0]).material;\r\n (<Mesh>childs[0]).material = this._whiteMat;\r\n } else {\r\n this._savedMat = this._prevOverMesh.material;\r\n this._prevOverMesh.material = this._whiteMat;\r\n }\r\n }\r\n if (this._prevOverMesh.name == \"X\") {\r\n this._xaxis.color = this._whiteCol;\r\n } else if (this._prevOverMesh.name == \"Y\") {\r\n this._yaxis.color = this._whiteCol;\r\n } else if (this._prevOverMesh.name == \"Z\") {\r\n this._zaxis.color = this._whiteCol;\r\n }\r\n }\r\n } else {\r\n this._pointerIsOver = false;\r\n if (this._prevOverMesh != null) {\r\n this._restoreColor(this._prevOverMesh);\r\n this._prevOverMesh = null;\r\n }\r\n }\r\n }\r\n\r\n //clean up any axis we might have been howering over before\r\n private _clearPrevOverMesh() {\r\n if (this._prevOverMesh != null) {\r\n this._prevOverMesh.visibility = 0;\r\n this._restoreColor(this._prevOverMesh);\r\n }\r\n }\r\n\r\n private _restoreColor(mesh: Mesh) {\r\n switch (mesh.name) {\r\n case \"X\":\r\n this._xaxis.color = this._redCol;\r\n break;\r\n case \"Y\":\r\n this._yaxis.color = this._greenCol;\r\n break;\r\n case \"Z\":\r\n this._zaxis.color = this._blueCol;\r\n break;\r\n }\r\n\r\n if (this._rotEnabled) {\r\n (<LinesMesh>mesh.getChildren()[0]).color = this._savedCol;\r\n } else {\r\n let childs: Node[] = mesh.getChildren();\r\n if (childs.length > 0) {\r\n (<Mesh>childs[0]).material = this._savedMat;\r\n } else {\r\n mesh.material = this._savedMat;\r\n }\r\n }\r\n }\r\n\r\n private _editing: boolean = false;\r\n\r\n private _onPointerUp(evt: Event) {\r\n this._pDown = false;\r\n if (this._editing) {\r\n this._mainCamera.attachControl(this._canvas);\r\n this._setEditing(false);\r\n //this.setAxesVisiblity(1);\r\n this._hideBaxis();\r\n if (this._prevOverMesh != null) {\r\n this._restoreColor(this._prevOverMesh);\r\n this._prevOverMesh = null;\r\n }\r\n this._actHist.add(this._actionType);\r\n }\r\n }\r\n\r\n private _actionType: number;\r\n private _setActionType() {\r\n if (this._transEnabled) {\r\n this._actionType = ActionType.TRANS;\r\n } else if ((this._rotEnabled)) {\r\n this._actionType = ActionType.ROT;\r\n } else if ((this._scaleEnabled)) {\r\n this._actionType = ActionType.SCALE;\r\n }\r\n }\r\n\r\n private _callActionListener(at: number) {\r\n //call actionListener if registered\r\n if (this._actionListener != null) {\r\n this._actionListener(at);\r\n }\r\n\r\n }\r\n private _callActionStartListener(at: number) {\r\n //call actionListener if registered\r\n if (this._actionStartListener != null) {\r\n this._actionStartListener(at);\r\n }\r\n\r\n }\r\n private _callActionEndListener(at: number) {\r\n //call actionListener if registered\r\n if (this._actionEndListener != null) {\r\n this._actionEndListener(at);\r\n }\r\n\r\n }\r\n\r\n private _prevPos: Vector3;\r\n private _onPointerMove(evt: Event) {\r\n\r\n if (!this._pDown) {\r\n this._onPointerOver();\r\n return;\r\n }\r\n if (!this._editing) return;\r\n if (this._prevPos == null) return;\r\n\r\n let newPos: Vector3 = this._getPosOnPickPlane();\r\n\r\n if (newPos == null) return;\r\n\r\n if (this._rotEnabled) {\r\n this._doRotation(this._mesh, this._axisPicked, newPos, this._prevPos);\r\n } else {\r\n let diff: Vector3 = newPos.subtract(this._prevPos);\r\n if (diff.x == 0 && diff.y == 0 && diff.z == 0) return;\r\n if (this._transEnabled) {\r\n this._doTranslation(diff);\r\n } else {\r\n if (this._scaleEnabled && this._local) this._doScaling(diff);\r\n }\r\n }\r\n this._prevPos = newPos;\r\n this._callActionListener(this._actionType);\r\n }\r\n\r\n\r\n //rotate differently if camera is too close to the rotation plane\r\n private _rotate2: boolean = false;\r\n private _getPickPlane(axis: Mesh): Mesh {\r\n let n: string = axis.name;\r\n if (this._transEnabled || this._scaleEnabled) {\r\n if (n == \"XZ\") return this._pXZ;\r\n else if (n == \"ZY\") return this._pZY;\r\n else if (n == \"YX\") return this._pYX;\r\n else if (n == \"ALL\") return this._pALL;\r\n else {\r\n //get the position of camera in the edit control frame of reference\r\n this._ecRoot.getWorldMatrix().invertToRef(this._ecMatrix);\r\n Vector3.TransformCoordinatesToRef(this._mainCamera.position, this._ecMatrix, this._ecTOcamera);\r\n let c = this._ecTOcamera;\r\n if (n === \"X\") {\r\n if (Math.abs(c.y) > Math.abs(c.z)) {\r\n return this._pXZ;\r\n } else return this._pYX;\r\n } else if (n === \"Z\") {\r\n if (Math.abs(c.y) > Math.abs(c.x)) {\r\n return this._pXZ;\r\n } else return this._pZY;\r\n } else if (n === \"Y\") {\r\n if (Math.abs(c.z) > Math.abs(c.x)) {\r\n return this._pYX;\r\n } else return this._pZY;\r\n }\r\n }\r\n } else if (this._rotEnabled) {\r\n this._rotate2 = false;\r\n //get the position of camera in the edit control frame of reference\r\n this._ecRoot.getWorldMatrix().invertToRef(this._ecMatrix);\r\n Vector3.TransformCoordinatesToRef(this._mainCamera.position, this._ecMatrix, this._ecTOcamera);\r\n let c = this._ecTOcamera;\r\n //if camera is too close to the rotation plane then use alternate rotation process\r\n switch (n) {\r\n case \"X\":\r\n if (Math.abs(c.x) < 0.2) {\r\n this._rotate2 = true;\r\n return this._pALL;\r\n } else return this._pZY;\r\n case \"Y\":\r\n if (Math.abs(c.y) < 0.2) {\r\n this._rotate2 = true;\r\n return this._pALL;\r\n } else return this._pXZ;\r\n case \"Z\":\r\n if (Math.abs(c.z) < 0.2) {\r\n this._rotate2 = true;\r\n return this._pALL;\r\n } else return this._pYX;\r\n default:\r\n return this._pALL;\r\n }\r\n } else return null;\r\n }\r\n\r\n //TODO when translating, the orientation of pALL keeps changing\r\n //TODo this is not so with rotation or scaling\r\n //TODO so for translation instead of pALL maybe we should use the camera view plane for picking\r\n\r\n private _transBy: Vector3 = new Vector3(0, 0, 0);\r\n private _doTranslation(diff: Vector3) {\r\n\r\n if ((this._mesh.parent != null) && this._isScaleUnEqual(this._mesh)) {\r\n this._setLocalAxes(this._ecRoot);\r\n } else {\r\n this._setLocalAxes(this._mesh);\r\n }\r\n\r\n let n: string = this._axisPicked.name;\r\n\r\n this._transBy.x = 0; this._transBy.y = 0; this._transBy.z = 0;\r\n\r\n if ((n == \"X\") || (n == \"XZ\") || (n == \"YX\") || (n == \"ALL\")) {\r\n if (this._local) this._transBy.x = Vector3.Dot(diff, this._localX) / this._localX.length();\r\n else this._transBy.x = diff.x;\r\n }\r\n if ((n == \"Y\") || (n == \"ZY\") || (n == \"YX\") || (n == \"ALL\")) {\r\n if (this._local) this._transBy.y = Vector3.Dot(diff, this._localY) / this._localY.length();\r\n else this._transBy.y = diff.y;\r\n }\r\n if ((n == \"Z\") || (n == \"XZ\") || (n == \"ZY\") || (n == \"ALL\")) {\r\n if (this._local) this._transBy.z = Vector3.Dot(diff, this._localZ) / this._localZ.length();\r\n else this._transBy.z = diff.z;\r\n }\r\n\r\n this._transWithSnap(this._mesh, this._transBy, this._local);\r\n\r\n // bound the translation\r\n if (this._transBoundsMin) {\r\n this._mesh.position.x = Math.max(this._mesh.position.x, this._transBoundsMin.x);\r\n this._mesh.position.y = Math.max(this._mesh.position.y, this._transBoundsMin.y);\r\n this._mesh.position.z = Math.max(this._mesh.position.z, this._transBoundsMin.z);\r\n }\r\n if (this._transBoundsMax) {\r\n this._mesh.position.x = Math.min(this._mesh.position.x, this._transBoundsMax.x);\r\n this._mesh.position.y = Math.min(this._mesh.position.y, this._transBoundsMax.y);\r\n this._mesh.position.z = Math.min(this._mesh.position.z, this._transBoundsMax.z);\r\n }\r\n\r\n this._mesh.computeWorldMatrix(true);\r\n }\r\n\r\n private _snapTV: Vector3 = new Vector3(0, 0, 0);\r\n private _transWithSnap(mesh: TransformNode, trans: Vector3, local: boolean) {\r\n if (this._snapT) {\r\n let snapit: boolean = false;\r\n this._snapTV.addInPlace(trans);\r\n if (Math.abs(this._snapTV.x) > this._tSnap.x) {\r\n if (this._snapTV.x > 0) trans.x = this._tSnap.x; else trans.x = -this._tSnap.x;\r\n snapit = true;\r\n }\r\n if (Math.abs(this._snapTV.y) > this._tSnap.y) {\r\n if (this._snapTV.y > 0) trans.y = this._tSnap.y; else trans.y = -this._tSnap.y;\r\n snapit = true;\r\n }\r\n if (Math.abs(this._snapTV.z) > this._tSnap.z) {\r\n if (this._snapTV.z > 0) trans.z = this._tSnap.z; else trans.z = -this._tSnap.z;\r\n snapit = true;\r\n }\r\n if (snapit) {\r\n if (Math.abs(trans.x) !== this._tSnap.x) trans.x = 0;\r\n if (Math.abs(trans.y) !== this._tSnap.y) trans.y = 0;\r\n if (Math.abs(trans.z) !== this._tSnap.z) trans.z = 0;\r\n Vector3.FromFloatsToRef(0, 0, 0, this._snapTV);\r\n snapit = false;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if (local) {\r\n //locallyTranslate moves the mesh wrt the absolute location not pivotlocation :(\r\n //this.mesh.locallyTranslate(trans);\r\n //\r\n this._localX.normalizeToRef(this._tv1);\r\n this._localY.normalizeToRef(this._tv2);\r\n this._localZ.normalizeToRef(this._tv3);\r\n this._mesh.translate(this._tv1, trans.x, Space.WORLD);\r\n this._mesh.translate(this._tv2, trans.y, Space.WORLD);\r\n this._mesh.translate(this._tv3, trans.z, Space.WORLD);\r\n } else {\r\n if (this._mesh.parent == null) {\r\n this._mesh.position.addInPlace(trans);\r\n } else {\r\n this._mesh.setAbsolutePosition(trans.addInPlace(this._mesh.absolutePosition));\r\n }\r\n\r\n }\r\n }\r\n\r\n private _snapS: boolean = false;\r\n private _snapSV: Vector3 = new Vector3(0, 0, 0);\r\n private _scaleSnap: number = 0.25;\r\n private _scale: Vector3 = new Vector3(0, 0, 0);\r\n private _doScaling(diff: Vector3) {\r\n this._setLocalAxes(this._mesh);\r\n\r\n this._scale.x = 0;\r\n this._scale.y = 0;\r\n this._scale.z = 0;\r\n let n: string = this._axisPicked.name;\r\n if ((n == \"X\") || (n == \"XZ\") || (n == \"YX\")) {\r\n this._scale.x = Vector3.Dot(diff, this._localX) / this._localX.length();\r\n if (this._mesh.scaling.x < 0) this._scale.x = -this._scale.x;\r\n //if(this.lhsRhs) this.scale.x=-this.scale.x;\r\n }\r\n if ((n == \"Y\") || (n == \"ZY\") || (n == \"YX\")) {\r\n this._scale.y = Vector3.Dot(diff, this._localY) / this._localY.length();\r\n if (this._mesh.scaling.y < 0) this._scale.y = -this._scale.y;\r\n }\r\n if ((n == \"Z\") || (n == \"XZ\") || (n == \"ZY\")) {\r\n this._scale.z = Vector3.Dot(diff, this._localZ) / this._localZ.length();\r\n if (this._mesh.scaling.z < 0) this._scale.z = -this._scale.z;\r\n }\r\n\r\n //as the mesh becomes large reduce the amount by which we scale.\r\n let bbd = this._boundingDimesion;\r\n this._scale.x = this._scale.x / bbd.x;\r\n this._scale.y = this._scale.y / bbd.y;\r\n this._scale.z = this._scale.z / bbd.z;\r\n\r\n if (n == \"ALL\") {\r\n //project movement along camera up vector\r\n //if up then scale up else scale down\r\n let s: number = Vector3.Dot(diff, this._mainCamera.upVector);\r\n s = s / Math.max(bbd.x, bbd.y, bbd.z);\r\n this._scale.copyFromFloats(s, s, s);\r\n } else {\r\n let inPlane: boolean = false;\r\n if (n == \"XZ\") {\r\n inPlane = true;\r\n if (Math.abs(this._scale.x) > Math.abs(this._scale.z)) {\r\n this._scale.z = this._scale.x;\r\n } else this._scale.x = this._scale.z;\r\n } else if (n == \"ZY\") {\r\n inPlane = true;\r\n if (Math.abs(this._scale.z) > Math.abs(this._scale.y)) {\r\n this._scale.y = this._scale.z;\r\n } else this._scale.z = this._scale.y;\r\n } else if (n == \"YX\") {\r\n inPlane = true;\r\n if (Math.abs(this._scale.y) > Math.abs(this._scale.x)) {\r\n this._scale.x = this._scale.y;\r\n } else this._scale.y = this._scale.x;\r\n }\r\n if (inPlane) {\r\n //check if the mouse/pointer was moved towards camera or away from camera\r\n //if towards then scale up else scale down\r\n this._ecRoot.position.subtractToRef(this._mainCamera.position, this._cameraTOec);\r\n let s: number = Vector3.Dot(diff, this._cameraTOec);\r\n this._scale.x = Math.abs(this._scale.x);\r\n this._scale.y = Math.abs(this._scale.y);\r\n this._scale.z = Math.abs(this._scale.z);\r\n if (s > 0) {\r\n if (this._mesh.scaling.x > 0) this._scale.x = -this._scale.x;\r\n //if(this.lhsRhs) this.scale.y=Math.abs(this.scale.y);\r\n if (this._mesh.scaling.y > 0) this._scale.y = -this._scale.y;\r\n if (this._mesh.scaling.z > 0) this._scale.z = -this._scale.z;\r\n } else {\r\n //this.scale.x=Math.abs(this.scale.x);\r\n //if(this.lhsRhs) this.scale.y=-Math.abs(this.scale.y);\r\n //else this.scale.y=Math.abs(this.scale.y);\r\n if (this._mesh.scaling.x < 0) this._scale.x = -this._scale.x;\r\n if (this._mesh.scaling.y < 0) this._scale.y = -this._scale.y;\r\n if (this._mesh.scaling.z < 0) this._scale.z = -this._scale.z;\r\n }\r\n }\r\n\r\n }\r\n\r\n this._scaleWithSnap(this._mesh, this._scale);\r\n\r\n // bound the scale\r\n if (this._scaleBoundsMin) {\r\n this._mesh.scaling.x = Math.max(this._mesh.scaling.x, this._scaleBoundsMin.x);\r\n this._mesh.scaling.y = Math.max(this._mesh.scaling.y, this._scaleBoundsMin.y);\r\n this._mesh.scaling.z = Math.max(this._mesh.scaling.z, this._scaleBoundsMin.z);\r\n }\r\n if (this._scaleBoundsMax) {\r\n this._mesh.scaling.x = Math.min(this._mesh.scaling.x, this._scaleBoundsMax.x);\r\n this._mesh.scaling.y = Math.min(this._mesh.scaling.y, this._scaleBoundsMax.y);\r\n this._mesh.scaling.z = Math.min(this._mesh.scaling.z, this._scaleBoundsMax.z);\r\n }\r\n\r\n }\r\n\r\n private _scaleWithSnap(mesh: TransformNode, p: Vector3) {\r\n if (this._snapS) {\r\n let snapit: boolean = false;\r\n this._snapSV.addInPlace(p);\r\n if (Math.abs(this._snapSV.x) > this._scaleSnap) {\r\n if (p.x > 0) p.x = this._scaleSnap; else p.x = -this._scaleSnap;\r\n snapit = true;\r\n }\r\n if (Math.abs(this._snapSV.y) > this._scaleSnap) {\r\n if (p.y > 0) p.y = this._scaleSnap; else p.y = -this._scaleSnap;\r\n snapit = true;\r\n }\r\n if (Math.abs(this._snapSV.z) > this._scaleSnap) {\r\n if (p.z > 0) p.z = this._scaleSnap; else p.z = -this._scaleSnap;\r\n snapit = true;\r\n }\r\n if (!snapit) return;\r\n if ((Math.abs(p.x) !== this._scaleSnap) && (p.x !== 0)) p.x = 0;\r\n if ((Math.abs(p.y) !== this._scaleSnap) && (p.y !== 0)) p.y = 0;\r\n if ((Math.abs(p.z) !== this._scaleSnap) && (p.z !== 0)) p.z = 0;\r\n Vector3.FromFloatsToRef(0, 0, 0, this._snapSV);\r\n snapit = false;\r\n }\r\n mesh.scaling.addInPlace(p);\r\n\r\n }\r\n\r\n private _localX: Vector3 = new Vector3(0, 0, 0);\r\n private _localY: Vector3 = new Vector3(0, 0, 0);\r\n private _localZ: Vector3 = new Vector3(0, 0, 0);\r\n\r\n /*\r\n * This would be called after rotation or scaling as the local axes direction or length might have changed\r\n * We need to set the local axis as these are used in all three modes to figure out \r\n * direction of mouse move wrt the axes\r\n * TODO should use world pivotmatrix instead of worldmatrix - incase pivot axes were rotated?\r\n */\r\n private _setLocalAxes(mesh: Node) {\r\n let meshMatrix: Matrix = mesh.getWorldMatrix();\r\n Vector3.FromFloatArrayToRef(meshMatrix.m, 0, this._localX);\r\n Vector3.FromFloatArrayToRef(meshMatrix.m, 4, this._localY);\r\n Vector3.FromFloatArrayToRef(meshMatrix.m, 8, this._localZ);\r\n }\r\n\r\n\r\n /*\r\n * boundingDimesion is used by scaling to adjust rate at which a mesh is scaled\r\n * with respect to mouse movement.\r\n *\r\n */\r\n private _boundingDimesion: Vector3;\r\n private _getBoundingDimension(mesh: TransformNode): Vector3 {\r\n if (mesh instanceof AbstractMesh) {\r\n { } let bb: BoundingBox = mesh.getBoundingInfo().boundingBox;\r\n let bd: Vector3 = bb.maximum.subtract(bb.minimum);\r\n if (bd.x == 0) bd.x = 1;\r\n if (bd.y == 0) bd.y = 1;\r\n if (bd.z == 0) bd.z = 1;\r\n return bd;\r\n } else return new Vector3(1, 1, 1);\r\n }\r\n\r\n /*\r\n *\r\n * For the sake of speed the editcontrol calculates bounding info only once.\r\n * This is in the constructor.\r\n * Now The boundingbox dimension can change if the mesh is baked.\r\n * If the editcontrol is attached to the mesh when the mesh was baked then\r\n * the scaling speed will be incorrect.\r\n * Thus client application should call refreshBoundingInfo if it bakes the mesh.\r\n *\r\n */\r\n public refreshBoundingInfo() {\r\n this._boundingDimesion = this._getBoundingDimension(this._mesh);\r\n }\r\n\r\n private _eulerian: boolean = false;\r\n private _snapRA: number = 0;\r\n private _doRotation(mesh: TransformNode, axis: Mesh, newPos: Vector3, prevPos: Vector3) {\r\n\r\n //for now no rotation if parents have non uniform scale\r\n if (this._local && (this._mesh.parent != null) && this._isScaleUnEqual(mesh)) {\r\n this._setLocalAxes(this._ecRoot);\r\n } else {\r\n this._setLocalAxes(mesh);\r\n }\r\n\r\n let angle: number = 0;\r\n\r\n //rotation axis\r\n let rAxis: Vector3;\r\n if (axis == this._rX) rAxis = this._local ? this._localX : Axis.X;\r\n else if (axis == this._rY) rAxis = this._local ? this._localY : Axis.Y;\r\n else if (axis == this._rZ) rAxis = this._local ? this._localZ : Axis.Z;\r\n\r\n this._ecRoot.position.subtractToRef(this._mainCamera.position, this._cameraTOec);\r\n\r\n /**\r\n * A)first find the angle and the direction (clockwise or anticlockwise) by which the user was trying to rotate\r\n * from the user(camera) perspective\r\n */\r\n if (this._rotate2) {\r\n angle = this._getAngle2(prevPos, newPos, this._mainCamera.position, this._cameraTOec, rAxis);\r\n //TODO check why we need to handle righ hand this way\r\n if (this._scene.useRightHandedSystem) angle = -angle;\r\n } else {\r\n angle = this._getAngle(prevPos, newPos, mesh.getAbsolutePivotPoint(), this._cameraTOec);\r\n }\r\n\r\n if (this._lhsRhs) {\r\n angle = -angle;\r\n }\r\n /**\r\n * B)then rotate based on users(camera) postion and orientation in the local/world space\r\n * \r\n */\r\n\r\n if (this._snapR) {\r\n this._snapRA += angle;\r\n angle = 0;\r\n if (Math.abs(this._snapRA) >= this._rotSnap) {\r\n if (this._snapRA > 0) angle = this._rotSnap; else angle = -this._rotSnap;\r\n this._snapRA = 0;\r\n }\r\n }\r\n\r\n if (angle !== 0) {\r\n this._cameraTOec.normalize();\r\n if (axis == this._rAll) {\r\n mesh.rotate(this._cameraTOec, -angle, Space.WORLD);\r\n } else {\r\n if (Vector3.Dot(rAxis, this._cameraTOec) >= 0) angle = -angle;\r\n mesh.rotate(rAxis, angle, Space.WORLD);\r\n }\r\n\r\n if (this._eulerian) {\r\n mesh.rotation = mesh.rotationQuaternion.toEulerAngles();\r\n mesh.rotationQuaternion = null;\r\n }\r\n\r\n if (this._local) {\r\n if (this._lhsRhs) {\r\n angle = -angle;\r\n }\r\n if ((this._mesh.parent != null) && this._isScaleUnEqual(mesh)) {\r\n if (axis == this._rAll) {\r\n this._ecRoot.rotate(this._cameraTOec, -angle, Space.WORLD);\r\n } else {\r\n this._ecRoot.rotate(rAxis, angle, Space.WORLD);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _getPosOnPickPlane(): Vector3 {\r\n let pickinfo: PickingInfo = this._scene.pick(this._scene.pointerX, this._scene.pointerY, (mesh) => {\r\n return mesh == this._pickedPlane;\r\n }, null, this._mainCamera);\r\n\r\n if (pickinfo.hit) {\r\n return pickinfo.pickedPoint;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n private _hideBaxis() {\r\n this._bXaxis.visibility = 0;\r\n this._bYaxis.visibility = 0;\r\n this._bZaxis.visibility = 0;\r\n }\r\n\r\n // private _setAxesVisiblity(v: number) {\r\n // if (this._transEnabled) {\r\n // this._tEndX.visibility = v;\r\n // this._tEndY.visibility = v;\r\n // this._tEndZ.visibility = v;\r\n // this._tEndXZ.visibility = v;\r\n // this._tEndZY.visibility = v;\r\n // this._tEndYX.visibility = v;\r\n // this._tEndAll.visibility = v;\r\n // }\r\n // if (this._rotEnabled) {\r\n // this._rEndX.visibility = v;\r\n // this._rEndY.visibility = v;\r\n // this._rEndZ.visibility = v;\r\n // this._rEndAll.visibility = v;\r\n // }\r\n // if (this._scaleEnabled) {\r\n // this._sEndX.visibility = v;\r\n // this._sEndY.visibility = v;\r\n // this._sEndZ.visibility = v;\r\n // this._sEndXZ.visibility = v;\r\n // this._sEndZY.visibility = v;\r\n // this._sEndYX.visibility = v;\r\n // this._sEndAll.visibility = v;\r\n // }\r\n // }\r\n\r\n public getRotationQuaternion(): Quaternion {\r\n return this._ecRoot.rotationQuaternion\r\n }\r\n\r\n public getPosition(): Vector3 {\r\n return this._ecRoot.position;\r\n }\r\n\r\n private _transEnabled: boolean = false;\r\n\r\n public isTranslationEnabled(): boolean {\r\n return this._transEnabled;\r\n }\r\n\r\n public enableTranslation() {\r\n if (this._hidden) return;\r\n if (this._tX == null) {\r\n this._createTransAxes();\r\n this._tCtl.parent = this._ecRoot;\r\n }\r\n this._clearPrevOverMesh();\r\n if (!this._transEnabled) {\r\n this._setVisibility(this._all_tEnd, this._visibility);\r\n this._transEnabled = true;\r\n this.disableRotation();\r\n this.disableScaling();\r\n }\r\n }\r\n\r\n public disableTranslation() {\r\n if (this._transEnabled) {\r\n this._setVisibility(this._all_tEnd, 0);\r\n this._transEnabled = false;\r\n }\r\n }\r\n\r\n private _rotEnabled: boolean = false;\r\n\r\n public isRotationEnabled(): boolean {\r\n return this._rotEnabled;\r\n }\r\n\r\n public returnEuler(euler: boolean) {\r\n this._eulerian = euler;\r\n }\r\n\r\n public enableRotation() {\r\n if (this._hidden) return;\r\n if (this._rCtl == null) {\r\n this._createRotAxes();\r\n this._rCtl.parent = this._ecRoot;\r\n }\r\n this._clearPrevOverMesh();\r\n if (!this._rotEnabled) {\r\n this._setVisibility(this._all_rEnd, this._visibility);\r\n this._rotEnabled = true;\r\n this.disableTranslation();\r\n this.disableScaling();\r\n }\r\n }\r\n\r\n public disableRotation() {\r\n if (this._rotEnabled) {\r\n this._setVisibility(this._all_rEnd, 0);\r\n this._rotEnabled = false;\r\n }\r\n }\r\n\r\n private _scaleEnabled: boolean = false;\r\n\r\n public isScalingEnabled(): boolean {\r\n return this._scaleEnabled;\r\n }\r\n\r\n public enableScaling() {\r\n if (this._hidden) return;\r\n if (this._sX == null) {\r\n this._createScaleAxes();\r\n this._sCtl.parent = this._ecRoot;\r\n }\r\n this._clearPrevOverMesh();\r\n if (!this._scaleEnabled) {\r\n this._setVisibility(this._all_sEnd, this._visibility);\r\n this._scaleEnabled = true;\r\n this.disableTranslation();\r\n this.disableRotation();\r\n }\r\n }\r\n\r\n public disableScaling() {\r\n if (this._scaleEnabled) {\r\n this._setVisibility(this._all_sEnd, 0);\r\n this._scaleEnabled = false;\r\n }\r\n }\r\n\r\n private _scaleBoundsMin: Vector3;\r\n private _scaleBoundsMax: Vector3;\r\n\r\n public setScaleBounds(min?: Vector3, max?: Vector3) {\r\n this._scaleBoundsMin = min ? min : null;\r\n this._scaleBoundsMax = max ? max : null;\r\n if (this._scaleBoundsMin != null) {\r\n if (this._scaleBoundsMin.x == 0) this._scaleBoundsMin.x = 0.00000001;\r\n if (this._scaleBoundsMin.y == 0) this._scaleBoundsMin.y = 0.00000001;\r\n if (this._scaleBoundsMin.z == 0) this._scaleBoundsMin.z = 0.00000001;\r\n }\r\n }\r\n\r\n public removeScaleBounds() {\r\n this._scaleBoundsMin = null;\r\n this._scaleBoundsMax = null;\r\n }\r\n\r\n\r\n private _transBoundsMin: Vector3;\r\n private _transBoundsMax: Vector3;\r\n\r\n public setTransBounds(min?: Vector3, max?: Vector3) {\r\n this._transBoundsMin = min ? min : null;\r\n this._transBoundsMax = max ? max : null;\r\n }\r\n\r\n public removeTransBounds() {\r\n this._transBoundsMin = null;\r\n this._transBoundsMax = null;\r\n }\r\n\r\n private _rotBoundsMin: Vector3;\r\n private _rotBoundsMax: Vector3;\r\n\r\n public setRotBounds(min?: Vector3, max?: Vector3) {\r\n this._rotBoundsMin = min ? min : null;\r\n this._rotBoundsMax = max ? max : null;\r\n }\r\n\r\n public removeRotBounds() {\r\n this._rotBoundsMin = null;\r\n this._rotBoundsMax = null;\r\n }\r\n\r\n private _bXaxis: LinesMesh;\r\n private _bYaxis: LinesMesh;\r\n private _bZaxis: LinesMesh;\r\n private _xaxis: LinesMesh;\r\n private _yaxis: LinesMesh;\r\n private _zaxis: LinesMesh;\r\n\r\n\r\n /*\r\n * create big and small axeses which will be shown in translate, rotate and scale mode.\r\n *\r\n */\r\n private _createCommonAxes(): Mesh {\r\n\r\n let guideAxes: Mesh = new Mesh(\"\", this._scene);\r\n\r\n //the big axes, shown when an axis is selected\r\n this._bXaxis = Mesh.CreateLines(\"\", [new Vector3(-100, 0, 0), new Vector3(100, 0, 0)], this._scene);\r\n this._bYaxis = Mesh.CreateLines(\"\", [new Vector3(0, -100, 0), new Vector3(0, 100, 0)], this._scene);\r\n this._bZaxis = Mesh.CreateLines(\"\", [new Vector3(0, 0, -100), new Vector3(0, 0, 100)], this._scene);\r\n\r\n //lines are now pickable too\r\n this._bXaxis.isPickable = false;\r\n this._bYaxis.isPickable = false;\r\n this._bZaxis.isPickable = false;\r\n\r\n this._bXaxis.parent = guideAxes;\r\n this._bYaxis.parent = guideAxes;\r\n this._bZaxis.parent = guideAxes;\r\n this._bXaxis.color = this._redCol;\r\n this._bYaxis.color = this._greenCol\r\n this._bZaxis.color = this._blueCol\r\n this._hideBaxis();\r\n\r\n //the small axis\r\n let al: number = this._axesLen * this._axesScale * 0.75;\r\n this._xaxis = Mesh.CreateLines(\"\", [new Vector3(0, 0, 0), new Vector3(al, 0, 0)], this._scene);\r\n this._yaxis = Mesh.CreateLines(\"\", [new Vector3(0, 0, 0), new Vector3(0, al, 0)], this._scene);\r\n this._zaxis = Mesh.CreateLines(\"\", [new Vector3(0, 0, 0), new Vector3(0, 0, al)], this._scene);\r\n\r\n //lines are now pickable too\r\n this._xaxis.isPickable = false;\r\n this._yaxis.isPickable = false;\r\n this._zaxis.isPickable = false;\r\n\r\n this._xaxis.parent = guideAxes;\r\n this._yaxis.parent = guideAxes;\r\n this._zaxis.parent = guideAxes;\r\n this._xaxis.color = this._redCol;\r\n this._yaxis.color = this._greenCol;\r\n this._zaxis.color = this._blueCol;\r\n\r\n this._xaxis.renderingGroupId = 1;\r\n this._yaxis.renderingGroupId = 1;\r\n this._zaxis.renderingGroupId = 1;\r\n\r\n return guideAxes;\r\n }\r\n\r\n private _pickedPlane: Mesh;\r\n private _pALL: Mesh;\r\n private _pXZ: Mesh;\r\n private _pZY: Mesh;\r\n private _pYX: Mesh;\r\n\r\n private _createPickPlanes() {\r\n this._pALL = Mesh.CreatePlane(\"\", 5, this._scene);\r\n this._pXZ = Mesh.CreatePlane(\"\", 5, this._scene);\r\n this._pZY = Mesh.CreatePlane(\"\", 5, this._scene);\r\n this._pYX = Mesh.CreatePlane(\"\", 5, this._scene);\r\n\r\n this._pALL.isPickable = false;\r\n this._pXZ.isPickable = false;\r\n this._pZY.isPickable = false;\r\n this._pYX.isPickable = false;\r\n\r\n this._pALL.visibility = 0;\r\n this._pXZ.visibility = 0;\r\n this._pZY.visibility = 0;\r\n this._pYX.visibility = 0;\r\n\r\n this._pALL.renderingGroupId = 1;\r\n this._pXZ.renderingGroupId = 1;\r\n this._pZY.renderingGroupId = 1;\r\n this._pYX.renderingGroupId = 1;\r\n\r\n this._pALL.lookAt(this._mainCamera.position);\r\n this._pXZ.rotate(Axis.X, 1.57);\r\n this._pZY.rotate(Axis.Y, 1.57);\r\n\r\n let pickPlanes: Mesh = new Mesh(\"\", this._scene);\r\n this._pALL.parent = pickPlanes;\r\n this._pXZ.parent = pickPlanes;\r\n this._pZY.parent = pickPlanes;\r\n this._pYX.parent = pickPlanes;\r\n\r\n return pickPlanes;\r\n\r\n\r\n }\r\n\r\n private _tCtl: Mesh;\r\n\r\n private _tX: Mesh;\r\n private _tY: Mesh;\r\n private _tZ: Mesh;\r\n private _tXZ: Mesh;\r\n private _tZY: Mesh;\r\n private _tYX: Mesh;\r\n private _tAll: Mesh;\r\n private _all_t: Mesh[];\r\n\r\n private _tEndX: Mesh;\r\n private _tEndY: Mesh;\r\n private _tEndZ: Mesh;\r\n private _tEndXZ: Mesh;\r\n private _tEndZY: Mesh;\r\n private _tEndYX: Mesh;\r\n private _tEndAll: Mesh;\r\n\r\n private _all_tEnd: Mesh[];\r\n\r\n private _createTransAxes() {\r\n let r: number = this._pickWidth * 2 * this._axesScale;\r\n let l: number = this._axesLen * this._axesScale;\r\n\r\n this._tCtl = new Mesh(\"\", this._scene);\r\n\r\n /*pickable invisible boxes around axes lines*/\r\n this._createPickableTrans(r, l, this._tCtl, this._scene);\r\n\r\n //non pickable but visible cones at end of axes lines\r\n this._createNonPickableTrans(r, l, this._scene);\r\n }\r\n\r\n private _createPickableTrans(r: number, l: number, tCtl: Mesh, scene: Scene) {\r\n let tX = this._extrudeBox(r / 2, l);\r\n tX.name = \"X\";\r\n let tY = tX.clone(\"Y\");\r\n let tZ = tX.clone(\"Z\");\r\n\r\n let tXZ = MeshBuilder.CreatePlane(\"XZ\", { size: r * 2 }, scene);\r\n let tZY = MeshBuilder.CreatePlane(\"ZY\", { size: r * 2 }, scene);\r\n let tYX = MeshBuilder.CreatePlane(\"YX\", { size: r * 2 }, scene);\r\n\r\n tXZ.rotation.x = 1.57;\r\n tZY.rotation.y = -1.57;\r\n\r\n tXZ.position.x = 2 * r;\r\n tXZ.position.z = 2 * r;\r\n\r\n tZY.position.z = 2 * r;\r\n tZY.position.y = 2 * r;\r\n\r\n tYX.position.y = 2 * r;\r\n tYX.position.x = 2 * r;\r\n\r\n tXZ.bakeCurrentTransformIntoVertices();\r\n tZY.bakeCurrentTransformIntoVertices();\r\n tYX.bakeCurrentTransformIntoVertices();\r\n\r\n let tAll = Mesh.CreateBox(\"ALL\", r * 2, scene);\r\n\r\n tX.parent = tCtl;\r\n tY.parent = tCtl;\r\n tZ.parent = tCtl;\r\n tXZ.parent = tCtl;\r\n tZY.parent = tCtl;\r\n tYX.parent = tCtl;\r\n tAll.parent = tCtl;\r\n\r\n tX.rotation.y = 1.57;\r\n tY.rotation.x -= 1.57;\r\n\r\n this._tX = tX;\r\n this._tY = tY;\r\n this._tZ = tZ;\r\n this._tXZ = tXZ;\r\n this._tZY = tZY;\r\n this._tYX = tYX;\r\n this._tAll = tAll;\r\n this._all_t = [tX, tY, tZ, tXZ, tZY, tYX, tAll]\r\n\r\n this._setVisibility(this._all_t, 0);\r\n //do not want clients picking this\r\n //we will pick using mesh filter in scene.pick function\r\n this._setPickableFalse(this._all_t)\r\n }\r\n\r\n private _createNonPickableTrans(r: number, l: number, scene: Scene) {\r\n //cone length\r\n let cl: number = l / 5;\r\n //cone base radius\r\n //let cr: number = r;\r\n let tEndX = Mesh.CreateCylinder(\"\", cl, 0, r, 6, 1, scene);\r\n let tEndY = tEndX.clone(\"\");\r\n let tEndZ = tEndX.clone(\"\");\r\n\r\n\r\n let s = r * 2\r\n let tEndXZ = MeshBuilder.CreatePlane(\"XZ\", { size: s }, scene);\r\n let tEndZY = MeshBuilder.CreatePlane(\"ZY\", { size: s }, scene);\r\n let tEndYX = MeshBuilder.CreatePlane(\"YX\", { size: s }, scene);\r\n\r\n let tEndAll = Mesh.CreateBox(\"ALL\", r, scene);\r\n\r\n tEndX.rotation.x = 1.57;\r\n tEndY.rotation.x = 1.57;\r\n tEndZ.rotation.x = 1.57;\r\n\r\n tEndXZ.rotation.x = 1.57;\r\n tEndZY.rotation.y = 1.57;\r\n //tEndYX.rotation.x = 0;\r\n\r\n tEndXZ.position.x = s;\r\n tEndXZ.position.z = s;\r\n\r\n tEndZY.position.z = s;\r\n tEndZY.position.y = s;\r\n\r\n tEndYX.position.y = s;\r\n tEndYX.position.x = s;\r\n\r\n tEndX.parent = this._tX;\r\n tEndY.parent = this._tY;\r\n tEndZ.parent = this._tZ;\r\n tEndXZ.parent = this._tXZ;\r\n tEndZY.parent = this._tZY;\r\n tEndYX.parent = this._tYX;\r\n tEndAll.parent = this._tAll;\r\n\r\n tEndX.position.z = l - cl / 2;\r\n tEndY.position.z = l - cl / 2;\r\n tEndZ.position.z = l - cl / 2;\r\n\r\n tEndX.material = this._redMat;\r\n tEndY.material = this._greenMat;\r\n tEndZ.material = this._blueMat;\r\n tEndXZ.material = this._greenMat;\r\n tEndZY.material = this._redMat;\r\n tEndYX.material = this._blueMat;\r\n tEndAll.material = this._yellowMat;\r\n\r\n this._tEndX = tEndX;\r\n this._tEndY = tEndY;\r\n this._tEndZ = tEndZ;\r\n this._tEndXZ = tEndXZ;\r\n this._tEndZY = tEndZY;\r\n this._tEndYX = tEndYX;\r\n this._tEndAll = tEndAll;\r\n this._all_tEnd = [tEndX, tEndY, tEndZ, tEndXZ, tEndZY, tEndYX, tEndAll];\r\n\r\n this._setPickableFalse(this._all_tEnd);\r\n this._setRenderingGroup(this._all_tEnd);\r\n }\r\n\r\n\r\n\r\n private _rCtl: Mesh;\r\n\r\n private _rX: Mesh;\r\n private _rY: Mesh;\r\n private _rZ: Mesh;\r\n private _rAll: Mesh;\r\n private _all_r: Mesh[];\r\n\r\n private _rEndX: LinesMesh;\r\n private _rEndY: LinesMesh;\r\n private _rEndZ: LinesMesh;\r\n private _rEndAll: LinesMesh;\r\n private _rEndAll2: LinesMesh;\r\n private _all_rEnd: Mesh[];\r\n\r\n\r\n private _guideSize: number = 180;\r\n\r\n public setRotGuideFull(y: boolean) {\r\n if (y) this._guideSize = 360;\r\n else this._guideSize = 180;\r\n if (this._rCtl != null) {\r\n this._rCtl.dispose();\r\n this._rAll.dispose();\r\n this._rCtl = null;\r\n this.enableRotation();\r\n }\r\n }\r\n\r\n private _createRotAxes() {\r\n let d: number = this._axesLen * this._axesScale * 2;\r\n this._rCtl = new Mesh(\"\", this._scene);\r\n\r\n //pickable invisible torus around the rotation circles\r\n this._createPickableRot(d, this._rCtl);\r\n\r\n /*non pickable but visible circles */\r\n this._createNonPickableRot(d);\r\n\r\n }\r\n\r\n private _createPickableRot(d: number, rCtl: Mesh) {\r\n let rX = this._createTube(d / 2, this._guideSize);\r\n let rY = this._createTube(d / 2, this._guideSize);\r\n let rZ = this._createTube(d / 2, this._guideSize);\r\n let rAll = this._createTube(d / 1.75, 360);\r\n rX.name = \"X\";\r\n rY.name = \"Y\";\r\n rZ.name = \"Z\";\r\n rAll.name = \"ALL\";\r\n\r\n rX.rotation.z = 1.57;\r\n rZ.rotation.x = -1.57;\r\n rX.bakeCurrentTransformIntoVertices();\r\n rZ.bakeCurrentTransformIntoVertices();\r\n\r\n rAll.rotation.x = 1.57;\r\n\r\n rX.parent = rCtl;\r\n rY.parent = rCtl;\r\n rZ.parent = rCtl;\r\n rAll.parent = this._pALL;\r\n\r\n this._rX = rX;\r\n this._rY = rY;\r\n this._rZ = rZ;\r\n this._rAll = rAll;\r\n this._all_r = [rX, rY, rZ, rAll];\r\n\r\n this._setVisibility(this._all_r, 0);\r\n\r\n //do not want clients picking this\r\n //we will pick using mesh filter in scene.pick function\r\n this._setPickableFalse(this._all_r);\r\n }\r\n\r\n private _createNonPickableRot(d: number) {\r\n\r\n let rEndX = this._createCircle(d / 2, this._guideSize, false);\r\n let rEndY = rEndX.clone(\"\");\r\n let rEndZ = rEndX.clone(\"\");\r\n let rEndAll = this._createCircle(d / 1.75, 360, false);\r\n let rEndAll2 = this._createCircle(d / 2, 360, false);\r\n\r\n rEndX.parent = this._rX;\r\n rEndY.parent = this._rY;\r\n rEndZ.parent = this._rZ;\r\n\r\n rEndX.rotation.z = 1.57;\r\n rEndZ.rotation.x = -1.57;\r\n\r\n rEndAll.parent = this._rAll;\r\n rEndAll2.parent = this._rAll;\r\n\r\n\r\n rEndX.color = this._redCol;\r\n rEndY.color = this._greenCol;\r\n rEndZ.color = this._blueCol;\r\n rEndAll.color = this._yellowCol;\r\n rEndAll2.color = Color3.Gray();\r\n\r\n this._rEndX = rEndX;\r\n this._rEndY = rEndY;\r\n this._rEndZ = rEndZ;\r\n this._rEndAll = rEndAll;\r\n this._rEndAll2 = rEndAll2;\r\n this._all_rEnd = [rEndX, rEndY, rEndZ, rEndAll, rEndAll2];\r\n\r\n this._setPickableFalse(this._all_rEnd);\r\n this._setRenderingGroup(this._all_rEnd);\r\n }\r\n\r\n private _setVisibility(meshes: Mesh[], v: number) {\r\n meshes.map((m) => m.visibility = v)\r\n }\r\n private _setPickableFalse(meshes: Mesh[]) {\r\n meshes.map((m) => { m.isPickable = false })\r\n }\r\n private _setRenderingGroup(meshes: Mesh[]) {\r\n meshes.map((m) => m.renderingGroupId = 2)\r\n }\r\n\r\n private _extrudeBox(w: number, l: number): Mesh {\r\n let shape: Vector3[] = [new Vector3(w, w, 0), new Vector3(-w, w, 0), new Vector3(-w, -w, 0), new Vector3(w, -w, 0), new Vector3(w, w, 0)];\r\n let path: Vector3[] = [new Vector3(0, 0, 0), new Vector3(0, 0, l)];\r\n let box: Mesh = Mesh.ExtrudeShape(\"\", shape, path, 1, 0, 2, this._scene);\r\n return box;\r\n }\r\n\r\n private _createCircle(r: number, t: number, double: boolean): LinesMesh {\r\n if (t === null) t = 360;\r\n let points: Vector3[] = [];\r\n let x: number;\r\n let z: number;\r\n let a: number = 3.14 / 180;\r\n let p: number = 0;\r\n for (let i: number = 0; i <= t; i = i + 5) {\r\n x = r * Math.cos(i * a);\r\n if (i == 90) z = r; else if (i == 270) z = -r; else z = r * Math.sin(i * a);\r\n points[p] = new Vector3(x, 0, z);\r\n p++;\r\n }\r\n if (double) {\r\n r = r - 0.04;\r\n for (let i: number = 0; i <= t; i = i + 5) {\r\n x = r * Math.cos(i * a);\r\n if (i == 90) z = r; else if (i == 270) z = -r; else z = r * Math.sin(i * a);\r\n points[p] = new Vector3(x, 0, z);\r\n p++;\r\n }\r\n }\r\n let circle: LinesMesh = Mesh.CreateLines(\"\", points, this._scene);\r\n return circle;\r\n }\r\n\r\n private _createTube(r: number, t?: number): Mesh {\r\n if (t === null) t = 360;\r\n let points: Vector3[] = [];\r\n let x: number;\r\n let z: number;\r\n let a: number = 3.14 / 180;\r\n let p: number = 0;\r\n for (let i: number = 0; i <= t; i = i + 30) {\r\n x = r * Math.cos(i * a);\r\n if (i == 90) z = r; else if (i == 270) z = -r; else z = r * Math.sin(i * a);\r\n points[p] = new Vector3(x, 0, z);\r\n p++;\r\n }\r\n let tube: Mesh = Mesh.CreateTube(\"\", points, this._pickWidth * this._axesScale * 2, 3, null, Mesh.NO_CAP, this._scene);\r\n return tube;\r\n }\r\n\r\n\r\n private _sCtl: Mesh;\r\n\r\n private _sX: Mesh;\r\n private _sY: Mesh;\r\n private _sZ: Mesh;\r\n private _sXZ: Mesh;\r\n private _sZY: Mesh;\r\n private _sYX: Mesh;\r\n private _sAll: Mesh;\r\n private _all_s: Mesh[];\r\n\r\n private _sEndX: Mesh;\r\n private _sEndY: Mesh;\r\n private _sEndZ: Mesh;\r\n private _sEndXZ: Mesh;\r\n private _sEndZY: Mesh;\r\n private _sEndYX: Mesh;\r\n private _sEndAll: Mesh;\r\n private _all_sEnd: Mesh[];\r\n\r\n\r\n private _createScaleAxes() {\r\n let r: number = this._pickWidth * 2 * this._axesScale;\r\n let l: number = this._axesLen * this._axesScale;\r\n\r\n this._sCtl = new Mesh(\"\", this._scene);\r\n\r\n /* pickable , invisible part */\r\n this._createPickableScale(r, l, this._sCtl);\r\n\r\n /* non pickable visible boxes at end of axes */\r\n this._createNonPickableScale(r, l);\r\n\r\n\r\n }\r\n\r\n private _createPickableScale(r: number, l: number, sCtl: Mesh) {\r\n let sX: Mesh = this._extrudeBox(r / 2, l);\r\n sX.name = \"X\";\r\n let sY: Mesh = sX.clone(\"Y\");\r\n let sZ: Mesh = sX.clone(\"Z\");\r\n\r\n let sXZ: Mesh = MeshBuilder.CreatePlane(\"XZ\", { size: r * 2 }, this._scene);\r\n let sZY: Mesh = MeshBuilder.CreatePlane(\"ZY\", { size: r * 2 }, this._scene);\r\n let sYX: Mesh = MeshBuilder.CreatePlane(\"YX\", { size: r * 2 }, this._scene);\r\n\r\n\r\n sXZ.rotation.x = 1.57;\r\n sZY.rotation.y = -1.57;\r\n\r\n sXZ.position.x = 2 * r;\r\n sXZ.position.z = 2 * r;\r\n\r\n sZY.position.z = 2 * r;\r\n sZY.position.y = 2 * r;\r\n\r\n sYX.position.y = 2 * r;\r\n sYX.position.x = 2 * r;\r\n\r\n sXZ.bakeCurrentTransformIntoVertices();\r\n sZY.bakeCurrentTransformIntoVertices();\r\n sYX.bakeCurrentTransformIntoVertices();\r\n\r\n let sAll: Mesh = Mesh.CreateBox(\"ALL\", 2 * r, this._scene);\r\n\r\n sX.parent = sCtl;\r\n sY.parent = sCtl;\r\n sZ.parent = sCtl;\r\n sAll.parent = sCtl;\r\n sXZ.parent = sCtl;\r\n sZY.parent = sCtl;\r\n sYX.parent = sCtl;\r\n\r\n sX.rotation.y = 1.57;\r\n sY.rotation.x -= 1.57;\r\n\r\n this._sX = sX;\r\n this._sY = sY;\r\n this._sZ = sZ;\r\n this._sXZ = sXZ;\r\n this._sZY = sZY;\r\n this._sYX = sYX;\r\n this._sAll = sAll;\r\n this._all_s = [sX, sY, sZ, sXZ, sZY, sYX, sAll];\r\n\r\n this._setVisibility(this._all_s, 0);\r\n //do not want clients picking this\r\n //we will pick using mesh filter in scene.pick function\r\n this._setPickableFalse(this._all_s);\r\n }\r\n\r\n private _createNonPickableScale(r: number, l: number) {\r\n\r\n let sEndX = Mesh.CreateBox(\"\", r, this._scene);\r\n let sEndY = sEndX.clone(\"\");\r\n let sEndZ = sEndX.clone(\"\");\r\n\r\n let s = r * 2;\r\n let sEndXZ = MeshBuilder.CreatePlane(\"XZ\", { size: s }, this._scene);\r\n let sEndZY = MeshBuilder.CreatePlane(\"ZY\", { size: s }, this._scene);\r\n let sEndYX = MeshBuilder.CreatePlane(\"YX\", { size: s }, this._scene);\r\n\r\n\r\n let sEndAll = Mesh.CreateBox(\"ALL\", r, this._scene);\r\n\r\n sEndXZ.rotation.x = 1.57;\r\n sEndZY.rotation.y = -1.57;\r\n\r\n sEndXZ.position.x = s;\r\n sEndXZ.position.z = s;\r\n\r\n sEndZY.position.z = s;\r\n sEndZY.position.y = s;\r\n\r\n sEndYX.position.y = s;\r\n sEndYX.position.x = s;\r\n\r\n sEndX.parent = this._sX;\r\n sEndY.parent = this._sY;\r\n sEndZ.parent = this._sZ;\r\n sEndXZ.parent = this._sXZ;\r\n sEndZY.parent = this._sZY;\r\n sEndYX.parent = this._sYX;\r\n sEndAll.parent = this._sAll;\r\n\r\n sEndX.position.z = l - r / 2;\r\n sEndY.position.z = l - r / 2;\r\n sEndZ.position.z = l - r / 2;\r\n\r\n sEndX.material = this._redMat;\r\n sEndY.material = this._greenMat;\r\n sEndZ.material = this._blueMat;\r\n sEndXZ.material = this._greenMat;\r\n sEndZY.material = this._redMat;\r\n sEndYX.material = this._blueMat;\r\n sEndAll.material = this._yellowMat;\r\n\r\n this._sEndX = sEndX;\r\n this._sEndY = sEndY;\r\n this._sEndZ = sEndZ;\r\n this._sEndXZ = sEndXZ;\r\n this._sEndZY = sEndZY;\r\n this._sEndYX = sEndYX;\r\n this._sEndAll = sEndAll;\r\n this._all_sEnd = [sEndX, sEndY, sEndZ, sEndXZ, sEndZY, sEndYX, sEndAll];\r\n\r\n this._setPickableFalse(this._all_sEnd);\r\n this._setRenderingGroup(this._all_sEnd);\r\n }\r\n\r\n\r\n /**\r\n * checks if a have left hand , right hand issue.\r\n * In other words if a mesh is a LHS mesh in RHS system or \r\n * a RHS mesh in LHS system\r\n * The X axis will be reversed in such cases.\r\n * thus Cross product of X and Y should be inverse of Z.\r\n * \r\n */\r\n // private _check_LHS_RHS(mesh: Mesh) {\r\n // let actualZ = Vector3.Cross(this._localX, this._localY);\r\n // //same direction or opposite direction of Z\r\n // if (Vector3.Dot(actualZ, this._localZ) < 0) return true;\r\n // else return false;\r\n // }\r\n\r\n /**\r\n * set how transparent the axes are\r\n * 0 to 1\r\n * 0 - completely transparent\r\n * 1 - completely non transparent\r\n * default is 0.75\r\n */\r\n public setVisibility(v: number) {\r\n this._visibility = v;\r\n }\r\n public setLocal(l: boolean) {\r\n if (this._local == l) return;\r\n this._local = l;\r\n if (!l) {\r\n this._ecRoot.rotationQuaternion = Quaternion.Identity();\r\n }\r\n }\r\n\r\n public isLocal(): boolean {\r\n return this._local;\r\n }\r\n\r\n public setTransSnap(s: boolean) {\r\n this._snapT = s;\r\n }\r\n\r\n public setRotSnap(s: boolean) {\r\n this._snapR = s;\r\n }\r\n\r\n public setScaleSnap(s: boolean) {\r\n this._snapS = s;\r\n }\r\n\r\n private _tSnap: Vector3 = new Vector3(this._transSnap, this._transSnap, this._transSnap);\r\n public setTransSnapValue(t: number) {\r\n this._tSnap.copyFromFloats(t, t, t);\r\n this._transSnap = t;\r\n }\r\n\r\n public setRotSnapValue(r: number) {\r\n this._rotSnap = r;\r\n }\r\n\r\n /**\r\n * use this to set the scale snap value\r\n */\r\n public setScaleSnapValue(r: number) {\r\n this._scaleSnap = r;\r\n }\r\n\r\n //few temp vectors & matrix\r\n private _tv1: Vector3 = new Vector3(0, 0, 0);\r\n private _tv2: Vector3 = new Vector3(0, 0, 0);\r\n private _tv3: Vector3 = new Vector3(0, 0, 0);\r\n private _tm: Matrix = new Matrix();\r\n private _getAngle2(p1: Vector3, p2: Vector3, cameraPos: Vector3, c2ec: Vector3, mN: Vector3): number {\r\n /**\r\n * A) find out if the camera is above , below, left, right of the rotation plane\r\n */\r\n //project \"camera to ec\" vector onto mesh normal to get distance to rotation plane\r\n let d: number = Vector3.Dot(c2ec, mN);\r\n //scale mesh normal by above ammount to get vector to rotation plane\r\n mN.scaleToRef(d, this._tv1);\r\n //get the point of intersection of vector from camera perpendicular to rotation plane\r\n cameraPos.addToRef(this._tv1, this._tv2);\r\n let i: Vector3 = this._tv2;//save some typing\r\n //find the co-ordinate of this point in the cameras frame of reference\r\n this._mainCamera.getWorldMatrix().invertToRef(this._tm);\r\n Vector3.TransformCoordinatesToRef(this._tv2, this._tm, this._tv2);\r\n //find in which quadarant the point (and thus the rotation plane) is in the camera xy plane\r\n let q: number = 0; //(1=x y,2=-x y,3=-x -y,4=x -y)\r\n if (i.x >= 0 && i.y >= 0) q = 1;\r\n else if (i.x <= 0 && i.y >= 0) q = 2;\r\n else if (i.x <= 0 && i.y <= 0) q = 3;\r\n else if (i.x >= 0 && i.y <= 0) q = 4;\r\n\r\n /**\r\n * B) find out if the user moved pointer up,down, right, left\r\n */\r\n\r\n //find movement vector in camera frame of reference\r\n Vector3.TransformCoordinatesToRef(p1, this._tm, this._tv1);\r\n Vector3.TransformCoordinatesToRef(p2, this._tm, this._tv2);\r\n this._tv2.subtractInPlace(this._tv1);\r\n let mv: Vector3 = this._tv2; //save some typing\r\n //for now lets set the angle magnitutde same as amount by which the mouse moved\r\n let angle: number = mv.length();\r\n\r\n let m: String = \"\";//(u ,d ,r,l)\r\n if (mv.x >= 0 && mv.y >= 0) {\r\n if (mv.x >= mv.y) m = \"r\"; else m = \"u\";\r\n } else if (mv.x <= 0 && mv.y >= 0) {\r\n if (-mv.x >= mv.y) m = \"l\"; else m = \"u\";\r\n } else if (mv.x <= 0 && mv.y <= 0) {\r\n if (-mv.x >= -mv.y) m = \"l\"; else m = \"d\";\r\n } else if (mv.x >= 0 && mv.y <= 0) {\r\n if (mv.x >= -mv.y) m = \"r\"; else m = \"d\";\r\n }\r\n\r\n /**\r\n * C) decide if the user was trying to rotate clockwise (+1) or anti-clockwise(-1)\r\n */\r\n\r\n let r: number = 0;\r\n //if mouse moved down /up and rotation plane is on right or left side of user\r\n if (m == \"d\") {\r\n if (q == 1 || q == 4) r = 1;\r\n else r = -1;\r\n } else if (m == \"u\") {\r\n if (q == 1 || q == 4) r = -1;\r\n else r = 1;\r\n //if mouse moved right/left and rotation plane is above or below user\r\n } else if (m == \"r\") {\r\n if (q == 2 || q == 1) r = 1;\r\n else r = -1;\r\n } else if (m == \"l\") {\r\n if (q == 2 || q == 1) r = -1;\r\n else r = 1;\r\n }\r\n\r\n return r * angle;\r\n }\r\n\r\n /**\r\n * finds the angle subtended from points p1 to p2 around the point p\r\n * checks if the user was trying to rotate clockwise (+ve in LHS) or anticlockwise (-ve in LHS)\r\n * to figure this check the orientation of the user(camera)to ec vector with the rotation normal vector\r\n */\r\n private _getAngle(p1: Vector3, p2: Vector3, p: Vector3, c2ec: Vector3): number {\r\n p1.subtractToRef(p, this._tv1);\r\n p2.subtractToRef(p, this._tv2);\r\n Vector3.CrossToRef(this._tv1, this._tv2, this._tv3);\r\n let angle: number = Math.asin(this._tv3.length() / (this._tv1.length() * this._tv2.length()));\r\n //camera looking down from front of plane or looking up from behind plane\r\n if ((Vector3.Dot(this._tv3, c2ec) > 0)) {\r\n angle = -1 * angle;\r\n }\r\n return angle;\r\n }\r\n\r\n\r\n private _createMaterials(scene: Scene) {\r\n this._redMat = EditControl._getStandardMaterial(this._redCol, scene);\r\n this._greenMat = EditControl._getStandardMaterial(this._greenCol, scene);\r\n this._blueMat = EditControl._getStandardMaterial(this._blueCol, scene);\r\n this._whiteMat = EditControl._getStandardMaterial(this._whiteCol, scene);\r\n this._yellowMat = EditControl._getStandardMaterial(this._yellowCol, scene);\r\n }\r\n\r\n private _disposeMaterials() {\r\n this._redMat.dispose();\r\n this._greenMat.dispose();\r\n this._blueMat.dispose();\r\n this._whiteMat.dispose();\r\n this._yellowMat.dispose();\r\n }\r\n\r\n private static _getStandardMaterial(col: Color3, scene: Scene): StandardMaterial {\r\n let mat: StandardMaterial = new StandardMaterial(\"\", scene);\r\n mat.emissiveColor = col;\r\n mat.diffuseColor = Color3.Black();\r\n mat.specularColor = Color3.Black();\r\n mat.backFaceCulling = false;\r\n return mat;\r\n }\r\n}\r\n\r\nclass ActHist {\r\n private mesh: TransformNode;\r\n\r\n private lastMax: number = 10;\r\n\r\n private acts: Array<Act> = new Array<Act>();\r\n\r\n private last: number = -1;\r\n\r\n private current: number = -1;\r\n\r\n public constructor(mesh: TransformNode, capacity: number) {\r\n this.mesh = mesh;\r\n this.lastMax = capacity - 1;\r\n this.add();\r\n }\r\n\r\n public setCapacity(c: number) {\r\n if ((c == 0)) {\r\n console.error(\"capacity should be more than zero\");\r\n return;\r\n }\r\n this.lastMax = c - 1;\r\n this.last = -1;\r\n this.current = -1;\r\n this.acts = new Array<Act>();\r\n this.add();\r\n }\r\n\r\n public add(at?: number) {\r\n if (at === undefined) at = null;\r\n let act: Act = new Act(this.mesh, at);\r\n if ((this.current < this.last)) {\r\n this.acts.splice(this.current + 1);\r\n this.last = this.current;\r\n }\r\n if ((this.last == this.lastMax)) {\r\n this.acts.shift();\r\n this.acts.push(act);\r\n } else {\r\n this.acts.push(act);\r\n this.last++;\r\n this.current++;\r\n }\r\n }\r\n\r\n public undo(): number {\r\n if ((this.current > 0)) {\r\n let at: number = (<Act>this.acts[this.current]).getActionType()\r\n this.current--;\r\n (<Act>this.acts[this.current]).perform(this.mesh);\r\n return at;\r\n }\r\n }\r\n\r\n public redo() {\r\n if ((this.current < this.last)) {\r\n this.current++;\r\n (<Act>this.acts[this.current]).perform(this.mesh);\r\n return (<Act>this.acts[this.current]).getActionType()\r\n }\r\n }\r\n}\r\n\r\nclass Act {\r\n private _p: Vector3;\r\n\r\n private _rQ: Quaternion;\r\n private _rE: Vector3;\r\n\r\n private _s: Vector3;\r\n\r\n //actiontype\r\n private _at: number;\r\n\r\n public constructor(mesh: TransformNode, at: number) {\r\n this._p = mesh.position.clone();\r\n //if (mesh.rotationQuaternion == null) {\r\n if (mesh.rotationQuaternion == null) {\r\n this._rQ = null;\r\n this._rE = mesh.rotation.clone();\r\n } else {\r\n this._rQ = mesh.rotationQuaternion.clone();\r\n this._rE = null;\r\n }\r\n this._s = mesh.scaling.clone();\r\n this._at = at;\r\n }\r\n\r\n public getActionType(): number {\r\n return this._at;\r\n }\r\n\r\n public perform(mesh: TransformNode) {\r\n mesh.position.copyFrom(this._p)\r\n //check if we are doing euler or quaternion now\r\n //also check what were we doing when the rotation value\r\n //was captured and set value accordingly\r\n if (mesh.rotationQuaternion == null) {\r\n if (this._rE != null) {\r\n //mesh.rotation = this.rE.clone();\r\n mesh.rotation.copyFrom(this._rE);\r\n } else {\r\n //mesh.rotation = this.r.toEulerAngles();\r\n mesh.rotation.copyFrom(this._rQ.toEulerAngles());\r\n }\r\n } else {\r\n if (this._rQ != null) {\r\n mesh.rotationQuaternion.copyFrom(this._rQ);\r\n } else {\r\n //TODO use BABYLON.Quaternion.RotationYawPitchRoll(rot.y, rot.x, rot.z) instead of toQuaternion.\r\n //mesh.rotationQuaternion.copyFrom(this.rE.toQuaternion());\r\n mesh.rotationQuaternion.copyFrom(Quaternion.RotationYawPitchRoll(this._rE.y, this._rE.x, this._rE.z));\r\n }\r\n }\r\n mesh.scaling.copyFrom(this._s);\r\n }\r\n}\r\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"EditControl.js","mappings":"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","sources":["webpack://babylonjs-editcontrol/webpack/universalModuleDefinition","webpack://babylonjs-editcontrol/external umd {\"commonjs\":\"babylonjs\",\"commonjs2\":\"babylonjs\",\"amd\":\"babylonjs\",\"root\":\"BABYLON\"}","webpack://babylonjs-editcontrol/webpack/bootstrap","webpack://babylonjs-editcontrol/webpack/runtime/compat get default export","webpack://babylonjs-editcontrol/webpack/runtime/define property getters","webpack://babylonjs-editcontrol/webpack/runtime/hasOwnProperty shorthand","webpack://babylonjs-editcontrol/webpack/runtime/make namespace object","webpack://babylonjs-editcontrol/./src/EditControl.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"babylonjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"babylonjs\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"babylonjs\")) : factory(root[\"BABYLON\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, (__WEBPACK_EXTERNAL_MODULE__247__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__247__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\r\nimport {\r\n AbstractMesh,\r\n Axis,\r\n BoundingBox,\r\n Camera,\r\n Color3,\r\n LinesMesh,\r\n Material,\r\n Matrix,\r\n Mesh,\r\n MeshBuilder,\r\n Node,\r\n PickingInfo,\r\n Quaternion,\r\n Scene,\r\n Space,\r\n StandardMaterial,\r\n Vector3,\r\n TransformNode,\r\n Engine,\r\n DeepImmutableObject,\r\n UtilityLayerRenderer\r\n}\r\n from 'babylonjs';\r\n\r\n\r\n\r\nenum ActionType {\r\n TRANS = 0,\r\n ROT = 1,\r\n SCALE = 2\r\n}\r\n\r\n/**\r\n * Draws a transform widget at the mesh's location (its pivot location).\r\n * The widget transforms(translates,rotates and scales) the mesh based on user\r\n * interactions with the widget.\r\n * The widget shows the mesh position and rotation at any time. \r\n * The widget follows the mesh constantly. \r\n * Note: An alternate approach would have been for the mesh to follow the widget.\r\n * The problem with the alternate approach - syncing the transforms\r\n * if the mesh was being transformed by entities other than the widget say physics \r\n * or script for example.\r\n * \r\n */\r\n\r\nexport class EditControl {\r\n private _mesh: TransformNode;\r\n\r\n\r\n private _canvas: HTMLCanvasElement;\r\n private _scene: Scene;\r\n private _utilLayer: UtilityLayerRenderer;\r\n private _mainCamera: Camera;\r\n //root of the edit control\r\n private _ecRoot: Mesh;\r\n private _local: boolean = true;\r\n private _snapT: boolean = false;\r\n private _snapR: boolean = false;\r\n private _transSnap: number = 1;\r\n private _rotSnap: number = Math.PI / 18;\r\n private _axesLen: number = 0.4;\r\n private _axesScale: number = 1;\r\n //how close to an axis should we get before we can pick it \r\n private _pickWidth: number = 0.02;\r\n private _redMat: StandardMaterial;\r\n private _greenMat: StandardMaterial;\r\n private _blueMat: StandardMaterial;\r\n private _whiteMat: StandardMaterial;\r\n private _yellowMat: StandardMaterial;\r\n private _redCol: Color3 = new Color3(1, 0.2, 0.2);\r\n private _greenCol: Color3 = new Color3(0.2, 1, 0.2);\r\n private _blueCol: Color3 = new Color3(0.2, 0.2, 1);\r\n private _whiteCol: Color3 = new Color3(1, 1, 1);\r\n private _yellowCol: Color3 = new Color3(1, 1, 0.2);\r\n\r\n private _actHist: ActHist;\r\n private _renderer: () => void;\r\n private _pointerdown: EventListener;\r\n private _pointerup: EventListener;\r\n private _pointermove: EventListener;\r\n\r\n //axes visibility\r\n private _visibility: number = 0.75;\r\n\r\n //lhs-rhs issue. lhs mesh in rhs or rhs mesh in lhs\r\n private _lhsRhs: boolean = false;\r\n\r\n public constructor(mesh: TransformNode, camera: Camera, canvas: HTMLCanvasElement, scale?: number, eulerian?: boolean, pickWidth?: number) {\r\n\r\n this._mesh = mesh;\r\n this._mainCamera = camera;\r\n this._canvas = canvas;\r\n\r\n if (scale != null) {\r\n this._axesScale = scale;\r\n }\r\n\r\n if (eulerian !== null) {\r\n this._eulerian = eulerian;\r\n } else {\r\n this._eulerian = false;\r\n }\r\n this._checkQuaternion();\r\n\r\n if (pickWidth != null) {\r\n this._pickWidth = pickWidth;\r\n }\r\n\r\n\r\n this._utilLayer = UtilityLayerRenderer.DefaultUtilityLayer;\r\n this._utilLayer.onlyCheckPointerDownEvents = false;\r\n this._scene = this._utilLayer.utilityLayerScene;\r\n\r\n this._actHist = new ActHist(mesh, 10);\r\n\r\n mesh.computeWorldMatrix(true);\r\n this._boundingDimesion = this._getBoundingDimension(mesh);\r\n this._setLocalAxes(mesh);\r\n this._lhsRhs = this._check_LHS_RHS(mesh);\r\n console.log(\"lhs rhs issue \" + this._lhsRhs);\r\n\r\n //build the edit control axes\r\n this._ecRoot = new Mesh(\"\", this._scene);\r\n this._ecRoot.rotationQuaternion = Quaternion.Identity();\r\n this._ecRoot.visibility = 0;\r\n this._ecRoot.isPickable = false;\r\n\r\n this._createMaterials(this._scene);\r\n\r\n let guideAxes: Mesh = this._createCommonAxes();\r\n guideAxes.parent = this._ecRoot;\r\n\r\n //build the pickplanes\r\n let pickPlanes: Mesh = this._createPickPlanes();\r\n pickPlanes.parent = this._ecRoot;\r\n\r\n this._pointerdown = (evt) => { return this._onPointerDown(evt) };\r\n this._pointerup = (evt) => { return this._onPointerUp(evt) };\r\n this._pointermove = (evt) => { return this._onPointerMove(evt) };\r\n\r\n //use canvas rather than scene to handle pointer events\r\n //scene cannot have mutiple eventlisteners for an event\r\n //with canvas one will have to do ones own pickinfo generation.\r\n\r\n canvas.addEventListener(\"pointerdown\", this._pointerdown, false);\r\n canvas.addEventListener(\"pointerup\", this._pointerup, false);\r\n canvas.addEventListener(\"pointermove\", this._pointermove, false);\r\n\r\n\r\n this._renderer = () => { return this._renderLoopProcess() };\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n public getRoot(): AbstractMesh {\r\n return this._ecRoot;\r\n }\r\n\r\n //make sure that if eulerian is set to false then mesh's rotation is in quaternion\r\n //throw error and exit if not so.\r\n private _checkQuaternion() {\r\n if (!this._eulerian) {\r\n if ((this._mesh.rotationQuaternion == null) || (this._mesh.rotationQuaternion == undefined)) {\r\n throw \"Error: Eulerian is set to false but the mesh's rotationQuaternion is not set.\";\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * checks if a have left hand , right hand issue.\r\n * In other words if a mesh is a LHS mesh in RHS system or \r\n * a RHS mesh in LHS system\r\n * The X axis will be reversed in such cases.\r\n * thus Cross product of X and Y should be inverse of Z.\r\n * \r\n * if no parent then we are ok.\r\n * If parent and parent has issue then we have issue.\r\n * \r\n */\r\n private _check_LHS_RHS(mesh: TransformNode) {\r\n let _issue: boolean = false;\r\n let root: Node = mesh.parent;\r\n if (root == null) return false;\r\n this._setLocalAxes(root);\r\n let actualZ = Vector3.Cross(this._localX, this._localY);\r\n //same direction or opposite direction of Z\r\n if (Vector3.Dot(actualZ, this._localZ) < 0) _issue = true;\r\n else _issue = false;\r\n this._setLocalAxes(mesh);\r\n return _issue;\r\n }\r\n\r\n private _ecMatrix: Matrix = new Matrix();\r\n //edit control to camera vector\r\n private _ecTOcamera: Vector3 = new Vector3(0, 0, 0);\r\n private _renderLoopProcess() {\r\n\r\n //sync the edit control position and rotation with that of mesh\r\n this._ecRoot.position = this._mesh.getAbsolutePivotPoint();\r\n this._setECRotation();\r\n\r\n //scale the EditControl so it seems at the same distance from camera/user\r\n this._setECScale();\r\n\r\n //rotate the free move,rotate,scale pick plane to face the camera/user\r\n if (this._local) {\r\n this._ecRoot.getWorldMatrix().invertToRef(this._ecMatrix);\r\n Vector3.TransformCoordinatesToRef(this._mainCamera.position, this._ecMatrix, this._ecTOcamera);\r\n //note pALL is child of ecRoot hence lookAt in local space\r\n this._pALL.lookAt(this._ecTOcamera, 0, 0, 0, Space.LOCAL);\r\n } else {\r\n this._mainCamera.position.subtractToRef(this._ecRoot.position, this._ecTOcamera);\r\n this._pALL.lookAt(this._mainCamera.position, 0, 0, 0, Space.WORLD);\r\n }\r\n\r\n //rotate the rotation and planar guide to face the camera/user\r\n if (this._rotEnabled) {\r\n this._rotRotGuides();\r\n }\r\n else if (this._transEnabled) this._rotPlanarGuides(this._tXZ, this._tZY, this._tYX);\r\n else if (this._scaleEnabled) this._rotPlanarGuides(this._sXZ, this._sZY, this._sYX);\r\n\r\n //check pointer over axes only during pointer moves\r\n //this.onPointerOver();\r\n }\r\n\r\n /**\r\n * sets rotaion of edit control to that of the mesh\r\n */\r\n private _setECRotation() {\r\n if (this._local) {\r\n if (this._mesh.parent == null) {\r\n if (this._eulerian) {\r\n let rot: Vector3 = this._mesh.rotation;\r\n Quaternion.RotationYawPitchRollToRef(rot.y, rot.x, rot.z, this._ecRoot.rotationQuaternion);\r\n } else {\r\n this._ecRoot.rotationQuaternion.copyFrom(this._mesh.rotationQuaternion);\r\n }\r\n } else {\r\n\r\n if (this._isScaleUnEqual(this._mesh)) return;\r\n\r\n this._mesh.getWorldMatrix().getRotationMatrixToRef(this._tm);\r\n Quaternion.FromRotationMatrixToRef(this._tm, this._ecRoot.rotationQuaternion);\r\n //this._ecRoot.rotationQuaternion.normalize();\r\n }\r\n }\r\n }\r\n /**\r\n * checks if any of the mesh's ancestors has non uniform scale\r\n */\r\n private _isScaleUnEqual(mesh: TransformNode): boolean {\r\n if (mesh.parent == null) return false;\r\n while (mesh.parent != null) {\r\n if (((<Mesh>mesh.parent).scaling.x != (<Mesh>mesh.parent).scaling.y ||\r\n (<Mesh>mesh.parent).scaling.y != (<Mesh>mesh.parent).scaling.z)) {\r\n return true;\r\n } else {\r\n mesh = <Mesh>mesh.parent;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n //how far away from camera should the edit control appear to be\r\n private _distFromCamera: number = 2;\r\n //vector from camera to edit control\r\n private _cameraTOec: Vector3 = new Vector3(0, 0, 0);\r\n private _cameraNormal: Vector3 = new Vector3(0, 0, 0);\r\n private _setECScale() {\r\n this._ecRoot.position.subtractToRef(this._mainCamera.position, this._cameraTOec);\r\n Vector3.FromArrayToRef(<DeepImmutableObject<Float32Array>>this._mainCamera.getWorldMatrix().asArray(), 8, this._cameraNormal);\r\n\r\n //get distance of edit control from the camera plane \r\n //project \"camera to edit control\" vector onto the camera normal\r\n let parentOnNormal: number = Vector3.Dot(this._cameraTOec, this._cameraNormal) / this._cameraNormal.length();\r\n\r\n let s: number = Math.abs(parentOnNormal / this._distFromCamera);\r\n Vector3.FromFloatsToRef(s, s, s, this._ecRoot.scaling);\r\n //Vector3.FromFloatsToRef(s,s,s,this.pALL.scaling);\r\n }\r\n\r\n\r\n //rotate the rotation guides so that they are facing the camera\r\n private _rotRotGuides() {\r\n let rotX = Math.atan(this._ecTOcamera.y / this._ecTOcamera.z);\r\n if (this._ecTOcamera.z >= 0) {\r\n this._rX.rotation.x = -rotX;\r\n } else {\r\n this._rX.rotation.x = -rotX - Math.PI;\r\n }\r\n\r\n let rotY = Math.atan(this._ecTOcamera.x / this._ecTOcamera.z);\r\n if (this._ecTOcamera.z >= 0) {\r\n this._rY.rotation.y = rotY;\r\n } else {\r\n this._rY.rotation.y = rotY + Math.PI;\r\n }\r\n\r\n let rotZ = Math.atan(this._ecTOcamera.x / this._ecTOcamera.y);\r\n if (this._ecTOcamera.y >= 0) {\r\n this._rZ.rotation.z = -rotZ;\r\n } else {\r\n this._rZ.rotation.z = -rotZ - Math.PI;\r\n }\r\n }\r\n\r\n /**\r\n * rotate the planar guide so that they are facing the camera\r\n */\r\n private _rotPlanarGuides(XZ: Mesh, ZY: Mesh, YX: Mesh) {\r\n let ec: Vector3 = this._ecTOcamera;\r\n\r\n XZ.rotation.x = 0;\r\n XZ.rotation.y = 0;\r\n XZ.rotation.z = 0;\r\n\r\n ZY.rotation.x = 0;\r\n ZY.rotation.y = 0;\r\n ZY.rotation.z = 0;\r\n\r\n YX.rotation.x = 0;\r\n YX.rotation.y = 0;\r\n YX.rotation.z = 0;\r\n\r\n if (ec.x <= 0 && ec.y >= 0 && ec.z >= 0) {\r\n XZ.rotation.z = 3.14;\r\n YX.rotation.y = 3.14;\r\n } else if (ec.x <= 0 && ec.y >= 0 && ec.z <= 0) {\r\n XZ.rotation.y = 3.14;\r\n ZY.rotation.y = 3.14;\r\n YX.rotation.y = 3.14;\r\n } else if (ec.x >= 0 && ec.y >= 0 && ec.z <= 0) {\r\n XZ.rotation.x = 3.14;\r\n ZY.rotation.y = 3.14;\r\n } else if (ec.x >= 0 && ec.y <= 0 && ec.z >= 0) {\r\n ZY.rotation.z = 3.14;\r\n YX.rotation.x = 3.14;\r\n } else if (ec.x <= 0 && ec.y <= 0 && ec.z >= 0) {\r\n XZ.rotation.z = 3.14;\r\n ZY.rotation.z = 3.14;\r\n YX.rotation.z = 3.14;\r\n } else if (ec.x <= 0 && ec.y <= 0 && ec.z <= 0) {\r\n XZ.rotation.y = 3.14;\r\n ZY.rotation.x = 3.14;\r\n YX.rotation.z = 3.14;\r\n } else if (ec.x >= 0 && ec.y <= 0 && ec.z <= 0) {\r\n XZ.rotation.x = 3.14;\r\n ZY.rotation.x = 3.14;\r\n YX.rotation.x = 3.14;\r\n }\r\n }\r\n\r\n\r\n\r\n public switchTo(mesh: TransformNode, eulerian?: boolean) {\r\n mesh.computeWorldMatrix(true);\r\n this._mesh = mesh;\r\n if (eulerian != null) {\r\n this._eulerian = eulerian;\r\n }\r\n this._checkQuaternion();\r\n this._setLocalAxes(mesh);\r\n this._actHist = new ActHist(mesh, 10);\r\n this._lhsRhs = this._check_LHS_RHS(mesh);\r\n this.refreshBoundingInfo();\r\n }\r\n\r\n public switchCamera(camera: Camera) {\r\n this._mainCamera = camera;\r\n }\r\n\r\n public setUndoCount(c: number) {\r\n this._actHist.setCapacity(c);\r\n }\r\n\r\n public undo() {\r\n let at: number = this._actHist.undo();\r\n this._mesh.computeWorldMatrix(true);\r\n this._setLocalAxes(this._mesh);\r\n this._callActionStartListener(at);\r\n this._callActionListener(at);\r\n this._callActionEndListener(at);\r\n }\r\n\r\n public redo() {\r\n let at: number = this._actHist.redo();\r\n this._mesh.computeWorldMatrix(true);\r\n this._setLocalAxes(this._mesh);\r\n this._callActionStartListener(at);\r\n this._callActionListener(at);\r\n this._callActionEndListener(at);\r\n }\r\n\r\n /**\r\n * detach the edit control from the mesh and dispose off all\r\n * resources created by the edit control\r\n */\r\n public detach() {\r\n this._canvas.removeEventListener(\"pointerdown\", this._pointerdown, false);\r\n this._canvas.removeEventListener(\"pointerup\", this._pointerup, false);\r\n this._canvas.removeEventListener(\"pointermove\", this._pointermove, false);\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n this.removeAllActionListeners();\r\n this._disposeAll();\r\n }\r\n private _prevState: String = \"\";\r\n private _hidden: boolean = false;\r\n\r\n /**\r\n * hide the edit control. use show() to unhide the control.\r\n */\r\n public hide() {\r\n this._hidden = true;\r\n if (this._transEnabled) {\r\n this._prevState = \"T\";\r\n this.disableTranslation();\r\n } else if (this._rotEnabled) {\r\n this._prevState = \"R\";\r\n this.disableRotation();\r\n } else if (this._scaleEnabled) {\r\n this._prevState = \"S\";\r\n this.disableScaling();\r\n }\r\n this._hideCommonAxes();\r\n }\r\n\r\n private _hideCommonAxes() {\r\n this._xaxis.visibility = 0;\r\n this._yaxis.visibility = 0;\r\n this._zaxis.visibility = 0;\r\n }\r\n private _showCommonAxes() {\r\n this._xaxis.visibility = this._visibility;\r\n this._yaxis.visibility = this._visibility;\r\n this._zaxis.visibility = this._visibility;\r\n }\r\n /**\r\n * unhide the editcontrol hidden using the hide() method\r\n */\r\n public show() {\r\n this._hidden = false;\r\n this._showCommonAxes();\r\n if (this._prevState == \"T\") this.enableTranslation();\r\n else if (this._prevState == \"R\") this.enableRotation();\r\n else if (this._prevState == \"S\") this.enableScaling();\r\n }\r\n\r\n /**\r\n * check if the editcontrol was hidden using the hide() methods\r\n */\r\n public isHidden(): boolean {\r\n return this._hidden;\r\n }\r\n\r\n private _disposeAll() {\r\n this._ecRoot.dispose();\r\n this._disposeMaterials();\r\n this._actHist = null;\r\n }\r\n\r\n private _actionListener: (actionType: number) => void = null;\r\n private _actionStartListener: (actionType: number) => void = null;\r\n private _actionEndListener: (actionType: number) => void = null;\r\n\r\n public addActionListener(actionListener: (actionType: number) => void) {\r\n this._actionListener = actionListener;\r\n }\r\n public removeActionListener() {\r\n this._actionListener = null;\r\n }\r\n public addActionStartListener(actionStartListener: (actionType: number) => void) {\r\n this._actionStartListener = actionStartListener;\r\n }\r\n public removeActionStartListener() {\r\n this._actionStartListener = null;\r\n }\r\n public addActionEndListener(actionEndListener: (actionType: number) => void) {\r\n this._actionEndListener = actionEndListener;\r\n }\r\n public removeActionEndListener() {\r\n this._actionEndListener = null;\r\n }\r\n\r\n public removeAllActionListeners() {\r\n this._actionListener = null;\r\n this._actionStartListener = null;\r\n this._actionEndListener = null;\r\n }\r\n\r\n private _pDown: boolean = false;\r\n\r\n private _axisPicked: Mesh;\r\n\r\n private _onPointerDown(evt: Event) {\r\n evt.preventDefault();\r\n this._pDown = true;\r\n if ((<PointerEvent>evt).button != 0) return;\r\n let engine: Engine = this._scene.getEngine();\r\n let x = (engine.isPointerLock) ? this._canvas.width * 0.5 : this._scene.pointerX;\r\n let y = (engine.isPointerLock) ? this._canvas.height * 0.5 : this._scene.pointerY;\r\n let pickResult: PickingInfo = this._scene.pick(x, y, (mesh) => {\r\n if (this._transEnabled) {\r\n if ((mesh == this._tX) || (mesh == this._tY) || (mesh == this._tZ) || (mesh == this._tXZ) || (mesh == this._tZY) || (mesh == this._tYX) || (mesh == this._tAll)) return true;\r\n } else if ((this._rotEnabled)) {\r\n if ((mesh == this._rX) || (mesh == this._rY) || (mesh == this._rZ) || (mesh == this._rAll)) return true;\r\n } else if ((this._scaleEnabled)) {\r\n if ((mesh == this._sX) || (mesh == this._sY) || (mesh == this._sZ) || (mesh == this._sXZ) || (mesh == this._sZY) || (mesh == this._sYX) || (mesh == this._sAll)) return true;\r\n }\r\n return false;\r\n }, false, this._mainCamera);\r\n\r\n if (pickResult.hit) {\r\n //this.setAxesVisiblity(0);\r\n this._axisPicked = <Mesh>pickResult.pickedMesh;\r\n let childs: Node[] = this._axisPicked.getChildren();\r\n if (childs.length > 0) {\r\n (<Mesh>childs[0]).visibility = this._visibility;\r\n } else {\r\n this._axisPicked.visibility = this._visibility;\r\n }\r\n let name: string = this._axisPicked.name;\r\n if ((name == \"X\")) this._bXaxis.visibility = 1;\r\n else if ((name == \"Y\")) this._bYaxis.visibility = 1;\r\n else if ((name == \"Z\")) this._bZaxis.visibility = 1;\r\n else if ((name == \"XZ\")) {\r\n this._bXaxis.visibility = 1;\r\n this._bZaxis.visibility = 1;\r\n } else if ((name == \"ZY\")) {\r\n this._bZaxis.visibility = 1;\r\n this._bYaxis.visibility = 1;\r\n } else if ((name == \"YX\")) {\r\n this._bYaxis.visibility = 1;\r\n this._bXaxis.visibility = 1;\r\n } else if ((name == \"ALL\")) {\r\n this._bXaxis.visibility = 1;\r\n this._bYaxis.visibility = 1;\r\n this._bZaxis.visibility = 1;\r\n }\r\n this._setEditing(true);\r\n //lets find out where we are on the pickplane\r\n this._pickedPlane = this._getPickPlane(this._axisPicked);\r\n if (this._pickedPlane != null) {\r\n this._prevPos = this._getPosOnPickPlane();\r\n } else {\r\n this._prevPos = null;\r\n }\r\n window.setTimeout(((cam, can) => { return this._detachCamera(cam, can) }), 0, this._mainCamera, this._canvas);\r\n }\r\n }\r\n\r\n private _setEditing(editing: boolean) {\r\n this._editing = editing;\r\n if (editing) {\r\n this._setActionType();\r\n if (this._actionType == ActionType.ROT) {\r\n this._snapRA = 0;\r\n }\r\n this._callActionStartListener(this._actionType);\r\n } else {\r\n this._callActionEndListener(this._actionType);\r\n }\r\n }\r\n\r\n public isEditing(): boolean {\r\n return this._editing;\r\n }\r\n\r\n /**\r\n * no camera movement during edit\r\n */\r\n private _detachCamera(cam: Object, can: Object) {\r\n let camera: Camera = <Camera>cam;\r\n let canvas: HTMLCanvasElement = <HTMLCanvasElement>can;\r\n let engine: Engine = this._scene.getEngine();\r\n if (!engine.isPointerLock) {\r\n camera.detachControl(canvas)\r\n }\r\n }\r\n\r\n private _prevOverMesh: Mesh;\r\n\r\n private _pointerIsOver: boolean = false;\r\n\r\n public isPointerOver(): boolean {\r\n return this._pointerIsOver;\r\n }\r\n private _savedMat: Material;\r\n private _savedCol: Color3;\r\n private _onPointerOver() {\r\n //if(this.pDown) return;\r\n let engine: Engine = this._scene.getEngine();\r\n let x = (engine.isPointerLock) ? this._canvas.width * 0.5 : this._scene.pointerX;\r\n let y = (engine.isPointerLock) ? this._canvas.height * 0.5 : this._scene.pointerY;\r\n let pickResult: PickingInfo = this._scene.pick(x, y, (mesh) => {\r\n if (this._transEnabled) {\r\n if ((mesh == this._tX) || (mesh == this._tY) || (mesh == this._tZ) || (mesh == this._tXZ) || (mesh == this._tZY) || (mesh == this._tYX) || (mesh == this._tAll)) return true;\r\n } else if ((this._rotEnabled)) {\r\n if ((mesh == this._rX) || (mesh == this._rY) || (mesh == this._rZ) || (mesh == this._rAll)) return true;\r\n } else if (this._scaleEnabled) {\r\n if ((mesh == this._sX) || (mesh == this._sY) || (mesh == this._sZ) || (mesh == this._sXZ) || (mesh == this._sZY) || (mesh == this._sYX) || (mesh == this._sAll)) return true;\r\n }\r\n return false;\r\n }, false, this._mainCamera);\r\n if (pickResult.hit) {\r\n //if we are still over the same axis mesh then don't do anything\r\n if (<Mesh>pickResult.pickedMesh != this._prevOverMesh) {\r\n this._pointerIsOver = true;\r\n //if we moved directly from one axis mesh to this then clean up the prev axis mesh\r\n this._clearPrevOverMesh();\r\n this._prevOverMesh = <Mesh>pickResult.pickedMesh;\r\n if (this._rotEnabled) {\r\n this._savedCol = (<LinesMesh>this._prevOverMesh.getChildren()[0]).color;\r\n (<LinesMesh>this._prevOverMesh.getChildren()[0]).color = this._whiteCol;\r\n } else {\r\n let childs: Node[] = this._prevOverMesh.getChildren();\r\n if (childs.length > 0) {\r\n this._savedMat = (<Mesh>childs[0]).material;\r\n (<Mesh>childs[0]).material = this._whiteMat;\r\n } else {\r\n this._savedMat = this._prevOverMesh.material;\r\n this._prevOverMesh.material = this._whiteMat;\r\n }\r\n }\r\n if (this._prevOverMesh.name == \"X\") {\r\n this._xaxis.color = this._whiteCol;\r\n } else if (this._prevOverMesh.name == \"Y\") {\r\n this._yaxis.color = this._whiteCol;\r\n } else if (this._prevOverMesh.name == \"Z\") {\r\n this._zaxis.color = this._whiteCol;\r\n }\r\n }\r\n } else {\r\n this._pointerIsOver = false;\r\n if (this._prevOverMesh != null) {\r\n this._restoreColor(this._prevOverMesh);\r\n this._prevOverMesh = null;\r\n }\r\n }\r\n }\r\n\r\n //clean up any axis we might have been howering over before\r\n private _clearPrevOverMesh() {\r\n if (this._prevOverMesh != null) {\r\n this._prevOverMesh.visibility = 0;\r\n this._restoreColor(this._prevOverMesh);\r\n }\r\n }\r\n\r\n private _restoreColor(mesh: Mesh) {\r\n switch (mesh.name) {\r\n case \"X\":\r\n this._xaxis.color = this._redCol;\r\n break;\r\n case \"Y\":\r\n this._yaxis.color = this._greenCol;\r\n break;\r\n case \"Z\":\r\n this._zaxis.color = this._blueCol;\r\n break;\r\n }\r\n\r\n if (this._rotEnabled) {\r\n (<LinesMesh>mesh.getChildren()[0]).color = this._savedCol;\r\n } else {\r\n let childs: Node[] = mesh.getChildren();\r\n if (childs.length > 0) {\r\n (<Mesh>childs[0]).material = this._savedMat;\r\n } else {\r\n mesh.material = this._savedMat;\r\n }\r\n }\r\n }\r\n\r\n private _editing: boolean = false;\r\n\r\n private _onPointerUp(evt: Event) {\r\n this._pDown = false;\r\n if (this._editing) {\r\n let engine: Engine = this._scene.getEngine();\r\n if (!engine.isPointerLock) {\r\n this._mainCamera.attachControl(true);\r\n }\r\n this._setEditing(false);\r\n //this.setAxesVisiblity(1);\r\n this._hideBaxis();\r\n if (this._prevOverMesh != null) {\r\n this._restoreColor(this._prevOverMesh);\r\n this._prevOverMesh = null;\r\n }\r\n this._actHist.add(this._actionType);\r\n }\r\n }\r\n\r\n private _actionType: number;\r\n private _setActionType() {\r\n if (this._transEnabled) {\r\n this._actionType = ActionType.TRANS;\r\n } else if ((this._rotEnabled)) {\r\n this._actionType = ActionType.ROT;\r\n } else if ((this._scaleEnabled)) {\r\n this._actionType = ActionType.SCALE;\r\n }\r\n }\r\n\r\n private _callActionListener(at: number) {\r\n //call actionListener if registered\r\n if (this._actionListener != null) {\r\n this._actionListener(at);\r\n }\r\n\r\n }\r\n private _callActionStartListener(at: number) {\r\n //call actionListener if registered\r\n if (this._actionStartListener != null) {\r\n this._actionStartListener(at);\r\n }\r\n\r\n }\r\n private _callActionEndListener(at: number) {\r\n //call actionListener if registered\r\n if (this._actionEndListener != null) {\r\n this._actionEndListener(at);\r\n }\r\n\r\n }\r\n\r\n private _prevPos: Vector3;\r\n private _onPointerMove(evt: Event) {\r\n\r\n if (!this._pDown) {\r\n this._onPointerOver();\r\n return;\r\n }\r\n if (!this._editing) return;\r\n if (this._prevPos == null) return;\r\n\r\n let newPos: Vector3 = this._getPosOnPickPlane();\r\n\r\n if (newPos == null) return;\r\n\r\n if (this._rotEnabled) {\r\n this._doRotation(this._mesh, this._axisPicked, newPos, this._prevPos);\r\n } else {\r\n let diff: Vector3 = newPos.subtract(this._prevPos);\r\n if (diff.x == 0 && diff.y == 0 && diff.z == 0) return;\r\n if (this._transEnabled) {\r\n this._doTranslation(diff);\r\n } else {\r\n if (this._scaleEnabled && this._local) this._doScaling(diff);\r\n }\r\n }\r\n this._prevPos = newPos;\r\n this._callActionListener(this._actionType);\r\n }\r\n\r\n\r\n //rotate differently if camera is too close to the rotation plane\r\n private _rotate2: boolean = false;\r\n private _getPickPlane(axis: Mesh): Mesh {\r\n let n: string = axis.name;\r\n if (this._transEnabled || this._scaleEnabled) {\r\n if (n == \"XZ\") return this._pXZ;\r\n else if (n == \"ZY\") return this._pZY;\r\n else if (n == \"YX\") return this._pYX;\r\n else if (n == \"ALL\") return this._pALL;\r\n else {\r\n //get the position of camera in the edit control frame of reference\r\n this._ecRoot.getWorldMatrix().invertToRef(this._ecMatrix);\r\n Vector3.TransformCoordinatesToRef(this._mainCamera.position, this._ecMatrix, this._ecTOcamera);\r\n let c = this._ecTOcamera;\r\n if (n === \"X\") {\r\n if (Math.abs(c.y) > Math.abs(c.z)) {\r\n return this._pXZ;\r\n } else return this._pYX;\r\n } else if (n === \"Z\") {\r\n if (Math.abs(c.y) > Math.abs(c.x)) {\r\n return this._pXZ;\r\n } else return this._pZY;\r\n } else if (n === \"Y\") {\r\n if (Math.abs(c.z) > Math.abs(c.x)) {\r\n return this._pYX;\r\n } else return this._pZY;\r\n }\r\n }\r\n } else if (this._rotEnabled) {\r\n this._rotate2 = false;\r\n //get the position of camera in the edit control frame of reference\r\n this._ecRoot.getWorldMatrix().invertToRef(this._ecMatrix);\r\n Vector3.TransformCoordinatesToRef(this._mainCamera.position, this._ecMatrix, this._ecTOcamera);\r\n let c = this._ecTOcamera;\r\n //if camera is too close to the rotation plane then use alternate rotation process\r\n switch (n) {\r\n case \"X\":\r\n if (Math.abs(c.x) < 0.2) {\r\n this._rotate2 = true;\r\n return this._pALL;\r\n } else return this._pZY;\r\n case \"Y\":\r\n if (Math.abs(c.y) < 0.2) {\r\n this._rotate2 = true;\r\n return this._pALL;\r\n } else return this._pXZ;\r\n case \"Z\":\r\n if (Math.abs(c.z) < 0.2) {\r\n this._rotate2 = true;\r\n return this._pALL;\r\n } else return this._pYX;\r\n default:\r\n return this._pALL;\r\n }\r\n } else return null;\r\n }\r\n\r\n //TODO when translating, the orientation of pALL keeps changing\r\n //TODo this is not so with rotation or scaling\r\n //TODO so for translation instead of pALL maybe we should use the camera view plane for picking\r\n\r\n private _transBy: Vector3 = new Vector3(0, 0, 0);\r\n private _doTranslation(diff: Vector3) {\r\n\r\n if ((this._mesh.parent != null) && this._isScaleUnEqual(this._mesh)) {\r\n this._setLocalAxes(this._ecRoot);\r\n } else {\r\n this._setLocalAxes(this._mesh);\r\n }\r\n\r\n let n: string = this._axisPicked.name;\r\n\r\n this._transBy.x = 0; this._transBy.y = 0; this._transBy.z = 0;\r\n\r\n if ((n == \"X\") || (n == \"XZ\") || (n == \"YX\") || (n == \"ALL\")) {\r\n if (this._local) this._transBy.x = Vector3.Dot(diff, this._localX) / this._localX.length();\r\n else this._transBy.x = diff.x;\r\n }\r\n if ((n == \"Y\") || (n == \"ZY\") || (n == \"YX\") || (n == \"ALL\")) {\r\n if (this._local) this._transBy.y = Vector3.Dot(diff, this._localY) / this._localY.length();\r\n else this._transBy.y = diff.y;\r\n }\r\n if ((n == \"Z\") || (n == \"XZ\") || (n == \"ZY\") || (n == \"ALL\")) {\r\n if (this._local) this._transBy.z = Vector3.Dot(diff, this._localZ) / this._localZ.length();\r\n else this._transBy.z = diff.z;\r\n }\r\n\r\n this._transWithSnap(this._mesh, this._transBy, this._local);\r\n\r\n // bound the translation\r\n if (this._transBoundsMin) {\r\n this._mesh.position.x = Math.max(this._mesh.position.x, this._transBoundsMin.x);\r\n this._mesh.position.y = Math.max(this._mesh.position.y, this._transBoundsMin.y);\r\n this._mesh.position.z = Math.max(this._mesh.position.z, this._transBoundsMin.z);\r\n }\r\n if (this._transBoundsMax) {\r\n this._mesh.position.x = Math.min(this._mesh.position.x, this._transBoundsMax.x);\r\n this._mesh.position.y = Math.min(this._mesh.position.y, this._transBoundsMax.y);\r\n this._mesh.position.z = Math.min(this._mesh.position.z, this._transBoundsMax.z);\r\n }\r\n\r\n this._mesh.computeWorldMatrix(true);\r\n }\r\n\r\n private _snapTV: Vector3 = new Vector3(0, 0, 0);\r\n private _transWithSnap(mesh: TransformNode, trans: Vector3, local: boolean) {\r\n if (this._snapT) {\r\n let snapit: boolean = false;\r\n this._snapTV.addInPlace(trans);\r\n if (Math.abs(this._snapTV.x) > this._tSnap.x) {\r\n if (this._snapTV.x > 0) trans.x = this._tSnap.x; else trans.x = -this._tSnap.x;\r\n snapit = true;\r\n }\r\n if (Math.abs(this._snapTV.y) > this._tSnap.y) {\r\n if (this._snapTV.y > 0) trans.y = this._tSnap.y; else trans.y = -this._tSnap.y;\r\n snapit = true;\r\n }\r\n if (Math.abs(this._snapTV.z) > this._tSnap.z) {\r\n if (this._snapTV.z > 0) trans.z = this._tSnap.z; else trans.z = -this._tSnap.z;\r\n snapit = true;\r\n }\r\n if (snapit) {\r\n if (Math.abs(trans.x) !== this._tSnap.x) trans.x = 0;\r\n if (Math.abs(trans.y) !== this._tSnap.y) trans.y = 0;\r\n if (Math.abs(trans.z) !== this._tSnap.z) trans.z = 0;\r\n Vector3.FromFloatsToRef(0, 0, 0, this._snapTV);\r\n snapit = false;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if (local) {\r\n //locallyTranslate moves the mesh wrt the absolute location not pivotlocation :(\r\n //this.mesh.locallyTranslate(trans);\r\n //\r\n this._localX.normalizeToRef(this._tv1);\r\n this._localY.normalizeToRef(this._tv2);\r\n this._localZ.normalizeToRef(this._tv3);\r\n this._mesh.translate(this._tv1, trans.x, Space.WORLD);\r\n this._mesh.translate(this._tv2, trans.y, Space.WORLD);\r\n this._mesh.translate(this._tv3, trans.z, Space.WORLD);\r\n } else {\r\n if (this._mesh.parent == null) {\r\n this._mesh.position.addInPlace(trans);\r\n } else {\r\n this._mesh.setAbsolutePosition(trans.addInPlace(this._mesh.absolutePosition));\r\n }\r\n\r\n }\r\n }\r\n\r\n private _snapS: boolean = false;\r\n private _snapSV: Vector3 = new Vector3(0, 0, 0);\r\n private _scaleSnap: number = 0.25;\r\n private _scale: Vector3 = new Vector3(0, 0, 0);\r\n private _doScaling(diff: Vector3) {\r\n this._setLocalAxes(this._mesh);\r\n\r\n this._scale.x = 0;\r\n this._scale.y = 0;\r\n this._scale.z = 0;\r\n let n: string = this._axisPicked.name;\r\n if ((n == \"X\") || (n == \"XZ\") || (n == \"YX\")) {\r\n this._scale.x = Vector3.Dot(diff, this._localX) / this._localX.length();\r\n if (this._mesh.scaling.x < 0) this._scale.x = -this._scale.x;\r\n //if(this.lhsRhs) this.scale.x=-this.scale.x;\r\n }\r\n if ((n == \"Y\") || (n == \"ZY\") || (n == \"YX\")) {\r\n this._scale.y = Vector3.Dot(diff, this._localY) / this._localY.length();\r\n if (this._mesh.scaling.y < 0) this._scale.y = -this._scale.y;\r\n }\r\n if ((n == \"Z\") || (n == \"XZ\") || (n == \"ZY\")) {\r\n this._scale.z = Vector3.Dot(diff, this._localZ) / this._localZ.length();\r\n if (this._mesh.scaling.z < 0) this._scale.z = -this._scale.z;\r\n }\r\n\r\n //as the mesh becomes large reduce the amount by which we scale.\r\n let bbd = this._boundingDimesion;\r\n this._scale.x = this._scale.x / bbd.x;\r\n this._scale.y = this._scale.y / bbd.y;\r\n this._scale.z = this._scale.z / bbd.z;\r\n\r\n if (n == \"ALL\") {\r\n //project movement along camera up vector\r\n //if up then scale up else scale down\r\n let s: number = Vector3.Dot(diff, this._mainCamera.upVector);\r\n s = s / Math.max(bbd.x, bbd.y, bbd.z);\r\n this._scale.copyFromFloats(s, s, s);\r\n } else {\r\n let inPlane: boolean = false;\r\n if (n == \"XZ\") {\r\n inPlane = true;\r\n if (Math.abs(this._scale.x) > Math.abs(this._scale.z)) {\r\n this._scale.z = this._scale.x;\r\n } else this._scale.x = this._scale.z;\r\n } else if (n == \"ZY\") {\r\n inPlane = true;\r\n if (Math.abs(this._scale.z) > Math.abs(this._scale.y)) {\r\n this._scale.y = this._scale.z;\r\n } else this._scale.z = this._scale.y;\r\n } else if (n == \"YX\") {\r\n inPlane = true;\r\n if (Math.abs(this._scale.y) > Math.abs(this._scale.x)) {\r\n this._scale.x = this._scale.y;\r\n } else this._scale.y = this._scale.x;\r\n }\r\n if (inPlane) {\r\n //check if the mouse/pointer was moved towards camera or away from camera\r\n //if towards then scale up else scale down\r\n this._ecRoot.position.subtractToRef(this._mainCamera.position, this._cameraTOec);\r\n let s: number = Vector3.Dot(diff, this._cameraTOec);\r\n this._scale.x = Math.abs(this._scale.x);\r\n this._scale.y = Math.abs(this._scale.y);\r\n this._scale.z = Math.abs(this._scale.z);\r\n if (s > 0) {\r\n if (this._mesh.scaling.x > 0) this._scale.x = -this._scale.x;\r\n //if(this.lhsRhs) this.scale.y=Math.abs(this.scale.y);\r\n if (this._mesh.scaling.y > 0) this._scale.y = -this._scale.y;\r\n if (this._mesh.scaling.z > 0) this._scale.z = -this._scale.z;\r\n } else {\r\n //this.scale.x=Math.abs(this.scale.x);\r\n //if(this.lhsRhs) this.scale.y=-Math.abs(this.scale.y);\r\n //else this.scale.y=Math.abs(this.scale.y);\r\n if (this._mesh.scaling.x < 0) this._scale.x = -this._scale.x;\r\n if (this._mesh.scaling.y < 0) this._scale.y = -this._scale.y;\r\n if (this._mesh.scaling.z < 0) this._scale.z = -this._scale.z;\r\n }\r\n }\r\n\r\n }\r\n\r\n this._scaleWithSnap(this._mesh, this._scale);\r\n\r\n // bound the scale\r\n if (this._scaleBoundsMin) {\r\n this._mesh.scaling.x = Math.max(this._mesh.scaling.x, this._scaleBoundsMin.x);\r\n this._mesh.scaling.y = Math.max(this._mesh.scaling.y, this._scaleBoundsMin.y);\r\n this._mesh.scaling.z = Math.max(this._mesh.scaling.z, this._scaleBoundsMin.z);\r\n }\r\n if (this._scaleBoundsMax) {\r\n this._mesh.scaling.x = Math.min(this._mesh.scaling.x, this._scaleBoundsMax.x);\r\n this._mesh.scaling.y = Math.min(this._mesh.scaling.y, this._scaleBoundsMax.y);\r\n this._mesh.scaling.z = Math.min(this._mesh.scaling.z, this._scaleBoundsMax.z);\r\n }\r\n\r\n }\r\n\r\n private _scaleWithSnap(mesh: TransformNode, p: Vector3) {\r\n if (this._snapS) {\r\n let snapit: boolean = false;\r\n this._snapSV.addInPlace(p);\r\n if (Math.abs(this._snapSV.x) > this._scaleSnap) {\r\n if (p.x > 0) p.x = this._scaleSnap; else p.x = -this._scaleSnap;\r\n snapit = true;\r\n }\r\n if (Math.abs(this._snapSV.y) > this._scaleSnap) {\r\n if (p.y > 0) p.y = this._scaleSnap; else p.y = -this._scaleSnap;\r\n snapit = true;\r\n }\r\n if (Math.abs(this._snapSV.z) > this._scaleSnap) {\r\n if (p.z > 0) p.z = this._scaleSnap; else p.z = -this._scaleSnap;\r\n snapit = true;\r\n }\r\n if (!snapit) return;\r\n if ((Math.abs(p.x) !== this._scaleSnap) && (p.x !== 0)) p.x = 0;\r\n if ((Math.abs(p.y) !== this._scaleSnap) && (p.y !== 0)) p.y = 0;\r\n if ((Math.abs(p.z) !== this._scaleSnap) && (p.z !== 0)) p.z = 0;\r\n Vector3.FromFloatsToRef(0, 0, 0, this._snapSV);\r\n snapit = false;\r\n }\r\n mesh.scaling.addInPlace(p);\r\n\r\n }\r\n\r\n private _localX: Vector3 = new Vector3(0, 0, 0);\r\n private _localY: Vector3 = new Vector3(0, 0, 0);\r\n private _localZ: Vector3 = new Vector3(0, 0, 0);\r\n\r\n /*\r\n * This would be called after rotation or scaling as the local axes direction or length might have changed\r\n * We need to set the local axis as these are used in all three modes to figure out \r\n * direction of mouse move wrt the axes\r\n * TODO should use world pivotmatrix instead of worldmatrix - incase pivot axes were rotated?\r\n */\r\n private _setLocalAxes(mesh: Node) {\r\n let meshMatrix: Matrix = mesh.getWorldMatrix();\r\n Vector3.FromArrayToRef(<DeepImmutableObject<Float32Array>>meshMatrix.m, 0, this._localX);\r\n Vector3.FromArrayToRef(<DeepImmutableObject<Float32Array>>meshMatrix.m, 4, this._localY);\r\n Vector3.FromArrayToRef(<DeepImmutableObject<Float32Array>>meshMatrix.m, 8, this._localZ);\r\n }\r\n\r\n\r\n /*\r\n * boundingDimesion is used by scaling to adjust rate at which a mesh is scaled\r\n * with respect to mouse movement.\r\n *\r\n */\r\n private _boundingDimesion: Vector3;\r\n private _getBoundingDimension(mesh: TransformNode): Vector3 {\r\n if (mesh instanceof AbstractMesh) {\r\n { } let bb: BoundingBox = mesh.getBoundingInfo().boundingBox;\r\n let bd: Vector3 = bb.maximum.subtract(bb.minimum);\r\n if (bd.x == 0) bd.x = 1;\r\n if (bd.y == 0) bd.y = 1;\r\n if (bd.z == 0) bd.z = 1;\r\n return bd;\r\n } else return new Vector3(1, 1, 1);\r\n }\r\n\r\n /*\r\n *\r\n * For the sake of speed the editcontrol calculates bounding info only once.\r\n * This is in the constructor.\r\n * Now The boundingbox dimension can change if the mesh is baked.\r\n * If the editcontrol is attached to the mesh when the mesh was baked then\r\n * the scaling speed will be incorrect.\r\n * Thus client application should call refreshBoundingInfo if it bakes the mesh.\r\n *\r\n */\r\n public refreshBoundingInfo() {\r\n this._boundingDimesion = this._getBoundingDimension(this._mesh);\r\n }\r\n\r\n private _eulerian: boolean = false;\r\n private _snapRA: number = 0;\r\n private _doRotation(mesh: TransformNode, axis: Mesh, newPos: Vector3, prevPos: Vector3) {\r\n\r\n //for now no rotation if parents have non uniform scale\r\n if (this._local && (this._mesh.parent != null) && this._isScaleUnEqual(mesh)) {\r\n this._setLocalAxes(this._ecRoot);\r\n } else {\r\n this._setLocalAxes(mesh);\r\n }\r\n\r\n let angle: number = 0;\r\n\r\n //rotation axis\r\n let rAxis: Vector3;\r\n if (axis == this._rX) rAxis = this._local ? this._localX : Axis.X;\r\n else if (axis == this._rY) rAxis = this._local ? this._localY : Axis.Y;\r\n else if (axis == this._rZ) rAxis = this._local ? this._localZ : Axis.Z;\r\n\r\n this._ecRoot.position.subtractToRef(this._mainCamera.position, this._cameraTOec);\r\n\r\n /**\r\n * A)first find the angle and the direction (clockwise or anticlockwise) by which the user was trying to rotate\r\n * from the user(camera) perspective\r\n */\r\n if (this._rotate2) {\r\n angle = this._getAngle2(prevPos, newPos, this._mainCamera.position, this._cameraTOec, rAxis);\r\n //TODO check why we need to handle righ hand this way\r\n if (this._scene.useRightHandedSystem) angle = -angle;\r\n } else {\r\n angle = this._getAngle(prevPos, newPos, mesh.getAbsolutePivotPoint(), this._cameraTOec);\r\n }\r\n\r\n if (this._lhsRhs) {\r\n angle = -angle;\r\n }\r\n /**\r\n * B)then rotate based on users(camera) postion and orientation in the local/world space\r\n * \r\n */\r\n\r\n if (this._snapR) {\r\n this._snapRA += angle;\r\n angle = 0;\r\n if (Math.abs(this._snapRA) >= this._rotSnap) {\r\n if (this._snapRA > 0) angle = this._rotSnap; else angle = -this._rotSnap;\r\n this._snapRA = 0;\r\n }\r\n }\r\n\r\n if (angle !== 0) {\r\n this._cameraTOec.normalize();\r\n if (axis == this._rAll) {\r\n mesh.rotate(this._cameraTOec, -angle, Space.WORLD);\r\n } else {\r\n if (Vector3.Dot(rAxis, this._cameraTOec) >= 0) angle = -angle;\r\n mesh.rotate(rAxis, angle, Space.WORLD);\r\n }\r\n\r\n if (this._eulerian) {\r\n mesh.rotation = mesh.rotationQuaternion.toEulerAngles();\r\n mesh.rotationQuaternion = null;\r\n }\r\n\r\n if (this._local) {\r\n if (this._lhsRhs) {\r\n angle = -angle;\r\n }\r\n if ((this._mesh.parent != null) && this._isScaleUnEqual(mesh)) {\r\n if (axis == this._rAll) {\r\n this._ecRoot.rotate(this._cameraTOec, -angle, Space.WORLD);\r\n } else {\r\n this._ecRoot.rotate(rAxis, angle, Space.WORLD);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _getPosOnPickPlane(): Vector3 {\r\n let engine: Engine = this._scene.getEngine();\r\n let x = (engine.isPointerLock) ? this._canvas.width * 0.5 : this._scene.pointerX;\r\n let y = (engine.isPointerLock) ? this._canvas.height * 0.5 : this._scene.pointerY;\r\n let pickinfo: PickingInfo = this._scene.pick(x, y, (mesh) => {\r\n return mesh == this._pickedPlane;\r\n }, null, this._mainCamera);\r\n\r\n if (pickinfo.hit) {\r\n return pickinfo.pickedPoint;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n private _hideBaxis() {\r\n this._bXaxis.visibility = 0;\r\n this._bYaxis.visibility = 0;\r\n this._bZaxis.visibility = 0;\r\n }\r\n\r\n // private _setAxesVisiblity(v: number) {\r\n // if (this._transEnabled) {\r\n // this._tEndX.visibility = v;\r\n // this._tEndY.visibility = v;\r\n // this._tEndZ.visibility = v;\r\n // this._tEndXZ.visibility = v;\r\n // this._tEndZY.visibility = v;\r\n // this._tEndYX.visibility = v;\r\n // this._tEndAll.visibility = v;\r\n // }\r\n // if (this._rotEnabled) {\r\n // this._rEndX.visibility = v;\r\n // this._rEndY.visibility = v;\r\n // this._rEndZ.visibility = v;\r\n // this._rEndAll.visibility = v;\r\n // }\r\n // if (this._scaleEnabled) {\r\n // this._sEndX.visibility = v;\r\n // this._sEndY.visibility = v;\r\n // this._sEndZ.visibility = v;\r\n // this._sEndXZ.visibility = v;\r\n // this._sEndZY.visibility = v;\r\n // this._sEndYX.visibility = v;\r\n // this._sEndAll.visibility = v;\r\n // }\r\n // }\r\n\r\n public getRotationQuaternion(): Quaternion {\r\n return this._ecRoot.rotationQuaternion\r\n }\r\n\r\n public getPosition(): Vector3 {\r\n return this._ecRoot.position;\r\n }\r\n\r\n private _transEnabled: boolean = false;\r\n\r\n public isTranslationEnabled(): boolean {\r\n return this._transEnabled;\r\n }\r\n\r\n public enableTranslation() {\r\n if (this._hidden) return;\r\n if (this._tX == null) {\r\n this._createTransAxes();\r\n this._tCtl.parent = this._ecRoot;\r\n }\r\n this._clearPrevOverMesh();\r\n if (!this._transEnabled) {\r\n this._setVisibility(this._all_tEnd, this._visibility);\r\n this._transEnabled = true;\r\n this.disableRotation();\r\n this.disableScaling();\r\n }\r\n }\r\n\r\n public disableTranslation() {\r\n if (this._transEnabled) {\r\n this._setVisibility(this._all_tEnd, 0);\r\n this._transEnabled = false;\r\n }\r\n }\r\n\r\n private _rotEnabled: boolean = false;\r\n\r\n public isRotationEnabled(): boolean {\r\n return this._rotEnabled;\r\n }\r\n\r\n public returnEuler(euler: boolean) {\r\n this._eulerian = euler;\r\n }\r\n\r\n public enableRotation() {\r\n if (this._hidden) return;\r\n if (this._rCtl == null) {\r\n this._createRotAxes();\r\n this._rCtl.parent = this._ecRoot;\r\n }\r\n this._clearPrevOverMesh();\r\n if (!this._rotEnabled) {\r\n this._setVisibility(this._all_rEnd, this._visibility);\r\n this._rotEnabled = true;\r\n this.disableTranslation();\r\n this.disableScaling();\r\n }\r\n }\r\n\r\n public disableRotation() {\r\n if (this._rotEnabled) {\r\n this._setVisibility(this._all_rEnd, 0);\r\n this._rotEnabled = false;\r\n }\r\n }\r\n\r\n private _scaleEnabled: boolean = false;\r\n\r\n public isScalingEnabled(): boolean {\r\n return this._scaleEnabled;\r\n }\r\n\r\n public enableScaling() {\r\n if (this._hidden) return;\r\n if (this._sX == null) {\r\n this._createScaleAxes();\r\n this._sCtl.parent = this._ecRoot;\r\n }\r\n this._clearPrevOverMesh();\r\n if (!this._scaleEnabled) {\r\n this._setVisibility(this._all_sEnd, this._visibility);\r\n this._scaleEnabled = true;\r\n this.disableTranslation();\r\n this.disableRotation();\r\n }\r\n }\r\n\r\n public disableScaling() {\r\n if (this._scaleEnabled) {\r\n this._setVisibility(this._all_sEnd, 0);\r\n this._scaleEnabled = false;\r\n }\r\n }\r\n\r\n private _scaleBoundsMin: Vector3;\r\n private _scaleBoundsMax: Vector3;\r\n\r\n public setScaleBounds(min?: Vector3, max?: Vector3) {\r\n this._scaleBoundsMin = min ? min : null;\r\n this._scaleBoundsMax = max ? max : null;\r\n if (this._scaleBoundsMin != null) {\r\n if (this._scaleBoundsMin.x == 0) this._scaleBoundsMin.x = 0.00000001;\r\n if (this._scaleBoundsMin.y == 0) this._scaleBoundsMin.y = 0.00000001;\r\n if (this._scaleBoundsMin.z == 0) this._scaleBoundsMin.z = 0.00000001;\r\n }\r\n }\r\n\r\n public removeScaleBounds() {\r\n this._scaleBoundsMin = null;\r\n this._scaleBoundsMax = null;\r\n }\r\n\r\n\r\n private _transBoundsMin: Vector3;\r\n private _transBoundsMax: Vector3;\r\n\r\n public setTransBounds(min?: Vector3, max?: Vector3) {\r\n this._transBoundsMin = min ? min : null;\r\n this._transBoundsMax = max ? max : null;\r\n }\r\n\r\n public removeTransBounds() {\r\n this._transBoundsMin = null;\r\n this._transBoundsMax = null;\r\n }\r\n\r\n private _rotBoundsMin: Vector3;\r\n private _rotBoundsMax: Vector3;\r\n\r\n public setRotBounds(min?: Vector3, max?: Vector3) {\r\n this._rotBoundsMin = min ? min : null;\r\n this._rotBoundsMax = max ? max : null;\r\n }\r\n\r\n public removeRotBounds() {\r\n this._rotBoundsMin = null;\r\n this._rotBoundsMax = null;\r\n }\r\n\r\n private _bXaxis: LinesMesh;\r\n private _bYaxis: LinesMesh;\r\n private _bZaxis: LinesMesh;\r\n private _xaxis: LinesMesh;\r\n private _yaxis: LinesMesh;\r\n private _zaxis: LinesMesh;\r\n\r\n\r\n /*\r\n * create big and small axeses which will be shown in translate, rotate and scale mode.\r\n *\r\n */\r\n private _createCommonAxes(): Mesh {\r\n\r\n let guideAxes: Mesh = new Mesh(\"\", this._scene);\r\n\r\n //the big axes, shown when an axis is selected\r\n this._bXaxis = MeshBuilder.CreateLines(\"\", { points: [new Vector3(-100, 0, 0), new Vector3(100, 0, 0)] }, this._scene);\r\n this._bYaxis = MeshBuilder.CreateLines(\"\", { points: [new Vector3(0, -100, 0), new Vector3(0, 100, 0)] }, this._scene);\r\n this._bZaxis = MeshBuilder.CreateLines(\"\", { points: [new Vector3(0, 0, -100), new Vector3(0, 0, 100)] }, this._scene);\r\n\r\n //lines are now pickable too\r\n this._bXaxis.isPickable = false;\r\n this._bYaxis.isPickable = false;\r\n this._bZaxis.isPickable = false;\r\n\r\n this._bXaxis.parent = guideAxes;\r\n this._bYaxis.parent = guideAxes;\r\n this._bZaxis.parent = guideAxes;\r\n this._bXaxis.color = this._redCol;\r\n this._bYaxis.color = this._greenCol\r\n this._bZaxis.color = this._blueCol\r\n this._hideBaxis();\r\n\r\n //the small axis\r\n let al: number = this._axesLen * this._axesScale * 0.75;\r\n this._xaxis = MeshBuilder.CreateLines(\"\", { points: [new Vector3(0, 0, 0), new Vector3(al, 0, 0)] }, this._scene);\r\n this._yaxis = MeshBuilder.CreateLines(\"\", { points: [new Vector3(0, 0, 0), new Vector3(0, al, 0)] }, this._scene);\r\n this._zaxis = MeshBuilder.CreateLines(\"\", { points: [new Vector3(0, 0, 0), new Vector3(0, 0, al)] }, this._scene);\r\n\r\n //lines are now pickable too\r\n this._xaxis.isPickable = false;\r\n this._yaxis.isPickable = false;\r\n this._zaxis.isPickable = false;\r\n\r\n this._xaxis.parent = guideAxes;\r\n this._yaxis.parent = guideAxes;\r\n this._zaxis.parent = guideAxes;\r\n this._xaxis.color = this._redCol;\r\n this._yaxis.color = this._greenCol;\r\n this._zaxis.color = this._blueCol;\r\n\r\n this._xaxis.renderingGroupId = 1;\r\n this._yaxis.renderingGroupId = 1;\r\n this._zaxis.renderingGroupId = 1;\r\n\r\n return guideAxes;\r\n }\r\n\r\n private _pickedPlane: Mesh;\r\n private _pALL: Mesh;\r\n private _pXZ: Mesh;\r\n private _pZY: Mesh;\r\n private _pYX: Mesh;\r\n\r\n private _createPickPlanes() {\r\n this._pALL = MeshBuilder.CreatePlane(\"\", { size: 5 }, this._scene);\r\n this._pXZ = MeshBuilder.CreatePlane(\"\", { size: 5 }, this._scene);\r\n this._pZY = MeshBuilder.CreatePlane(\"\", { size: 5 }, this._scene);\r\n this._pYX = MeshBuilder.CreatePlane(\"\", { size: 5 }, this._scene);\r\n\r\n this._pALL.isPickable = false;\r\n this._pXZ.isPickable = false;\r\n this._pZY.isPickable = false;\r\n this._pYX.isPickable = false;\r\n\r\n this._pALL.visibility = 0;\r\n this._pXZ.visibility = 0;\r\n this._pZY.visibility = 0;\r\n this._pYX.visibility = 0;\r\n\r\n this._pALL.renderingGroupId = 1;\r\n this._pXZ.renderingGroupId = 1;\r\n this._pZY.renderingGroupId = 1;\r\n this._pYX.renderingGroupId = 1;\r\n\r\n this._pALL.lookAt(this._mainCamera.position);\r\n this._pXZ.rotate(Axis.X, 1.57);\r\n this._pZY.rotate(Axis.Y, 1.57);\r\n\r\n let pickPlanes: Mesh = new Mesh(\"\", this._scene);\r\n this._pALL.parent = pickPlanes;\r\n this._pXZ.parent = pickPlanes;\r\n this._pZY.parent = pickPlanes;\r\n this._pYX.parent = pickPlanes;\r\n\r\n return pickPlanes;\r\n\r\n\r\n }\r\n\r\n private _tCtl: Mesh;\r\n\r\n private _tX: Mesh;\r\n private _tY: Mesh;\r\n private _tZ: Mesh;\r\n private _tXZ: Mesh;\r\n private _tZY: Mesh;\r\n private _tYX: Mesh;\r\n private _tAll: Mesh;\r\n private _all_t: Mesh[];\r\n\r\n private _tEndX: Mesh;\r\n private _tEndY: Mesh;\r\n private _tEndZ: Mesh;\r\n private _tEndXZ: Mesh;\r\n private _tEndZY: Mesh;\r\n private _tEndYX: Mesh;\r\n private _tEndAll: Mesh;\r\n\r\n private _all_tEnd: Mesh[];\r\n\r\n private _createTransAxes() {\r\n let r: number = this._pickWidth * 2 * this._axesScale;\r\n let l: number = this._axesLen * this._axesScale;\r\n\r\n this._tCtl = new Mesh(\"\", this._scene);\r\n\r\n // pickable invisible boxes around axes lines\r\n this._createPickableTrans(r, l, this._tCtl, this._scene);\r\n\r\n //non pickable but visible cones at end of axes lines\r\n this._createNonPickableTrans(r, l, this._scene);\r\n }\r\n\r\n /**\r\n * pickable but invisible \r\n * a) 3 boxes around each of the 3 small axes lines\r\n * b) 3 small planes near origin for movement along a plane\r\n * @param r \r\n * @param l \r\n * @param tCtl \r\n * @param scene \r\n */\r\n\r\n private _createPickableTrans(r: number, l: number, tCtl: Mesh, scene: Scene) {\r\n let tX = this._extrudeBox(r / 2, l);\r\n tX.name = \"X\";\r\n let tY = tX.clone(\"Y\");\r\n let tZ = tX.clone(\"Z\");\r\n\r\n let s = r * 2;\r\n let tXZ = MeshBuilder.CreatePlane(\"XZ\", { size: s }, scene);\r\n let tZY = MeshBuilder.CreatePlane(\"ZY\", { size: s }, scene);\r\n let tYX = MeshBuilder.CreatePlane(\"YX\", { size: s }, scene);\r\n\r\n tXZ.rotation.x = 1.57;\r\n tZY.rotation.y = -1.57;\r\n\r\n tXZ.position.x = 2 * r;\r\n tXZ.position.z = 2 * r;\r\n\r\n tZY.position.z = 2 * r;\r\n tZY.position.y = 2 * r;\r\n\r\n tYX.position.y = 2 * r;\r\n tYX.position.x = 2 * r;\r\n\r\n tXZ.bakeCurrentTransformIntoVertices();\r\n tZY.bakeCurrentTransformIntoVertices();\r\n tYX.bakeCurrentTransformIntoVertices();\r\n\r\n let tAll = MeshBuilder.CreateBox(\"ALL\", { size: r * 2 }, scene);\r\n\r\n tX.parent = tCtl;\r\n tY.parent = tCtl;\r\n tZ.parent = tCtl;\r\n tXZ.parent = tCtl;\r\n tZY.parent = tCtl;\r\n tYX.parent = tCtl;\r\n tAll.parent = tCtl;\r\n\r\n tX.rotation.y = 1.57;\r\n tY.rotation.x -= 1.57;\r\n\r\n this._tX = tX;\r\n this._tY = tY;\r\n this._tZ = tZ;\r\n this._tXZ = tXZ;\r\n this._tZY = tZY;\r\n this._tYX = tYX;\r\n this._tAll = tAll;\r\n this._all_t = [tX, tY, tZ, tXZ, tZY, tYX, tAll]\r\n\r\n this._setVisibility(this._all_t, 0);\r\n //do not want clients picking this\r\n //we will pick using mesh filter in scene.pick function\r\n this._setPickableFalse(this._all_t)\r\n }\r\n\r\n //non pickable but visible \r\n // a) 3 cones at end of the 3 small axes lines\r\n // b) 3 small planes near origin for movement along a plane\r\n private _createNonPickableTrans(r: number, l: number, scene: Scene) {\r\n //cone length\r\n let cl: number = l / 5;\r\n //cone base radius\r\n //let cr: number = r;\r\n let tEndX = MeshBuilder.CreateCylinder(\"\", { height: cl, diameterTop: 0, diameterBottom: r, tessellation: 6, subdivisions: 1 }, scene);\r\n let tEndY = tEndX.clone(\"\");\r\n let tEndZ = tEndX.clone(\"\");\r\n\r\n\r\n let s = r * 2\r\n let tEndXZ = MeshBuilder.CreatePlane(\"XZ\", { size: s }, scene);\r\n let tEndZY = MeshBuilder.CreatePlane(\"ZY\", { size: s }, scene);\r\n let tEndYX = MeshBuilder.CreatePlane(\"YX\", { size: s }, scene);\r\n\r\n let tEndAll = MeshBuilder.CreateBox(\"ALL\", { size: r }, scene);\r\n\r\n tEndX.rotation.x = 1.57;\r\n tEndY.rotation.x = 1.57;\r\n tEndZ.rotation.x = 1.57;\r\n\r\n tEndXZ.rotation.x = 1.57;\r\n tEndZY.rotation.y = 1.57;\r\n //tEndYX.rotation.x = 0;\r\n\r\n tEndXZ.position.x = s;\r\n tEndXZ.position.z = s;\r\n\r\n tEndZY.position.z = s;\r\n tEndZY.position.y = s;\r\n\r\n tEndYX.position.y = s;\r\n tEndYX.position.x = s;\r\n\r\n tEndX.parent = this._tX;\r\n tEndY.parent = this._tY;\r\n tEndZ.parent = this._tZ;\r\n tEndXZ.parent = this._tXZ;\r\n tEndZY.parent = this._tZY;\r\n tEndYX.parent = this._tYX;\r\n tEndAll.parent = this._tAll;\r\n\r\n tEndX.position.z = l - cl / 2;\r\n tEndY.position.z = l - cl / 2;\r\n tEndZ.position.z = l - cl / 2;\r\n\r\n tEndX.material = this._redMat;\r\n tEndY.material = this._greenMat;\r\n tEndZ.material = this._blueMat;\r\n tEndXZ.material = this._greenMat;\r\n tEndZY.material = this._redMat;\r\n tEndYX.material = this._blueMat;\r\n tEndAll.material = this._yellowMat;\r\n\r\n this._tEndX = tEndX;\r\n this._tEndY = tEndY;\r\n this._tEndZ = tEndZ;\r\n this._tEndXZ = tEndXZ;\r\n this._tEndZY = tEndZY;\r\n this._tEndYX = tEndYX;\r\n this._tEndAll = tEndAll;\r\n this._all_tEnd = [tEndX, tEndY, tEndZ, tEndXZ, tEndZY, tEndYX, tEndAll];\r\n\r\n this._setPickableFalse(this._all_tEnd);\r\n this._setRenderingGroup(this._all_tEnd);\r\n }\r\n\r\n\r\n\r\n private _rCtl: Mesh;\r\n\r\n private _rX: Mesh;\r\n private _rY: Mesh;\r\n private _rZ: Mesh;\r\n private _rAll: Mesh;\r\n private _all_r: Mesh[];\r\n\r\n private _rEndX: LinesMesh;\r\n private _rEndY: LinesMesh;\r\n private _rEndZ: LinesMesh;\r\n private _rEndAll: LinesMesh;\r\n private _rEndAll2: LinesMesh;\r\n private _all_rEnd: Mesh[];\r\n\r\n\r\n private _guideSize: number = 180;\r\n\r\n public setRotGuideFull(y: boolean) {\r\n if (y) this._guideSize = 360;\r\n else this._guideSize = 180;\r\n if (this._rCtl != null) {\r\n this._rCtl.dispose();\r\n this._rAll.dispose();\r\n this._rCtl = null;\r\n this.enableRotation();\r\n }\r\n }\r\n\r\n private _createRotAxes() {\r\n let d: number = this._axesLen * this._axesScale * 2;\r\n this._rCtl = new Mesh(\"\", this._scene);\r\n\r\n //pickable invisible torus around the rotation circles\r\n this._createPickableRot(d, this._rCtl);\r\n\r\n /*non pickable but visible circles */\r\n this._createNonPickableRot(d);\r\n\r\n }\r\n\r\n private _createPickableRot(d: number, rCtl: Mesh) {\r\n let rX = this._createTube(d / 2, this._guideSize);\r\n let rY = this._createTube(d / 2, this._guideSize);\r\n let rZ = this._createTube(d / 2, this._guideSize);\r\n let rAll = this._createTube(d / 1.75, 360);\r\n rX.name = \"X\";\r\n rY.name = \"Y\";\r\n rZ.name = \"Z\";\r\n rAll.name = \"ALL\";\r\n\r\n rX.rotation.z = 1.57;\r\n rZ.rotation.x = -1.57;\r\n rX.bakeCurrentTransformIntoVertices();\r\n rZ.bakeCurrentTransformIntoVertices();\r\n\r\n rAll.rotation.x = 1.57;\r\n\r\n rX.parent = rCtl;\r\n rY.parent = rCtl;\r\n rZ.parent = rCtl;\r\n rAll.parent = this._pALL;\r\n\r\n this._rX = rX;\r\n this._rY = rY;\r\n this._rZ = rZ;\r\n this._rAll = rAll;\r\n this._all_r = [rX, rY, rZ, rAll];\r\n\r\n this._setVisibility(this._all_r, 0);\r\n\r\n //do not want clients picking this\r\n //we will pick using mesh filter in scene.pick function\r\n this._setPickableFalse(this._all_r);\r\n }\r\n\r\n private _createNonPickableRot(d: number) {\r\n\r\n let rEndX = this._createCircle(d / 2, this._guideSize, false);\r\n let rEndY = rEndX.clone(\"\");\r\n let rEndZ = rEndX.clone(\"\");\r\n let rEndAll = this._createCircle(d / 1.75, 360, false);\r\n let rEndAll2 = this._createCircle(d / 2, 360, false);\r\n\r\n rEndX.parent = this._rX;\r\n rEndY.parent = this._rY;\r\n rEndZ.parent = this._rZ;\r\n\r\n rEndX.rotation.z = 1.57;\r\n rEndZ.rotation.x = -1.57;\r\n\r\n rEndAll.parent = this._rAll;\r\n rEndAll2.parent = this._rAll;\r\n\r\n\r\n rEndX.color = this._redCol;\r\n rEndY.color = this._greenCol;\r\n rEndZ.color = this._blueCol;\r\n rEndAll.color = this._yellowCol;\r\n rEndAll2.color = Color3.Gray();\r\n\r\n this._rEndX = rEndX;\r\n this._rEndY = rEndY;\r\n this._rEndZ = rEndZ;\r\n this._rEndAll = rEndAll;\r\n this._rEndAll2 = rEndAll2;\r\n this._all_rEnd = [rEndX, rEndY, rEndZ, rEndAll, rEndAll2];\r\n\r\n this._setPickableFalse(this._all_rEnd);\r\n this._setRenderingGroup(this._all_rEnd);\r\n }\r\n\r\n private _setVisibility(meshes: Mesh[], v: number) {\r\n meshes.map((m) => m.visibility = v)\r\n }\r\n private _setPickableFalse(meshes: Mesh[]) {\r\n meshes.map((m) => { m.isPickable = false })\r\n }\r\n private _setRenderingGroup(meshes: Mesh[]) {\r\n meshes.map((m) => m.renderingGroupId = 2)\r\n }\r\n\r\n private _extrudeBox(w: number, l: number): Mesh {\r\n let shape: Vector3[] = [new Vector3(w, w, 0), new Vector3(-w, w, 0), new Vector3(-w, -w, 0), new Vector3(w, -w, 0), new Vector3(w, w, 0)];\r\n let path: Vector3[] = [new Vector3(0, 0, 0), new Vector3(0, 0, l)];\r\n let box: Mesh = MeshBuilder.ExtrudeShape(\"\", { shape: shape, path: path, scale: 1, rotation: 0, cap: 2 }, this._scene);\r\n return box;\r\n }\r\n\r\n private _createCircle(r: number, t: number, double: boolean): LinesMesh {\r\n if (t === null) t = 360;\r\n let points: Vector3[] = [];\r\n let x: number;\r\n let z: number;\r\n let a: number = 3.14 / 180;\r\n let p: number = 0;\r\n for (let i: number = 0; i <= t; i = i + 5) {\r\n x = r * Math.cos(i * a);\r\n if (i == 90) z = r; else if (i == 270) z = -r; else z = r * Math.sin(i * a);\r\n points[p] = new Vector3(x, 0, z);\r\n p++;\r\n }\r\n if (double) {\r\n r = r - 0.04;\r\n for (let i: number = 0; i <= t; i = i + 5) {\r\n x = r * Math.cos(i * a);\r\n if (i == 90) z = r; else if (i == 270) z = -r; else z = r * Math.sin(i * a);\r\n points[p] = new Vector3(x, 0, z);\r\n p++;\r\n }\r\n }\r\n let circle: LinesMesh = MeshBuilder.CreateLines(\"\", { points: points }, this._scene);\r\n return circle;\r\n }\r\n\r\n private _createTube(r: number, t?: number): Mesh {\r\n if (t === null) t = 360;\r\n let points: Vector3[] = [];\r\n let x: number;\r\n let z: number;\r\n let a: number = 3.14 / 180;\r\n let p: number = 0;\r\n for (let i: number = 0; i <= t; i = i + 30) {\r\n x = r * Math.cos(i * a);\r\n if (i == 90) z = r; else if (i == 270) z = -r; else z = r * Math.sin(i * a);\r\n points[p] = new Vector3(x, 0, z);\r\n p++;\r\n }\r\n let tube: Mesh = MeshBuilder.CreateTube(\"\", { path: points, radius: this._pickWidth * this._axesScale * 2, tessellation: 3, cap: Mesh.NO_CAP }, this._scene);\r\n return tube;\r\n }\r\n\r\n\r\n private _sCtl: Mesh;\r\n\r\n private _sX: Mesh;\r\n private _sY: Mesh;\r\n private _sZ: Mesh;\r\n private _sXZ: Mesh;\r\n private _sZY: Mesh;\r\n private _sYX: Mesh;\r\n private _sAll: Mesh;\r\n private _all_s: Mesh[];\r\n\r\n private _sEndX: Mesh;\r\n private _sEndY: Mesh;\r\n private _sEndZ: Mesh;\r\n private _sEndXZ: Mesh;\r\n private _sEndZY: Mesh;\r\n private _sEndYX: Mesh;\r\n private _sEndAll: Mesh;\r\n private _all_sEnd: Mesh[];\r\n\r\n\r\n private _createScaleAxes() {\r\n let r: number = this._pickWidth * 2 * this._axesScale;\r\n let l: number = this._axesLen * this._axesScale;\r\n\r\n this._sCtl = new Mesh(\"\", this._scene);\r\n\r\n /* pickable , invisible part */\r\n this._createPickableScale(r, l, this._sCtl);\r\n\r\n /* non pickable visible boxes at end of axes */\r\n this._createNonPickableScale(r, l);\r\n\r\n\r\n }\r\n\r\n private _createPickableScale(r: number, l: number, sCtl: Mesh) {\r\n let sX: Mesh = this._extrudeBox(r / 2, l);\r\n sX.name = \"X\";\r\n let sY: Mesh = sX.clone(\"Y\");\r\n let sZ: Mesh = sX.clone(\"Z\");\r\n\r\n let sXZ: Mesh = MeshBuilder.CreatePlane(\"XZ\", { size: r * 2 }, this._scene);\r\n let sZY: Mesh = MeshBuilder.CreatePlane(\"ZY\", { size: r * 2 }, this._scene);\r\n let sYX: Mesh = MeshBuilder.CreatePlane(\"YX\", { size: r * 2 }, this._scene);\r\n\r\n\r\n sXZ.rotation.x = 1.57;\r\n sZY.rotation.y = -1.57;\r\n\r\n sXZ.position.x = 2 * r;\r\n sXZ.position.z = 2 * r;\r\n\r\n sZY.position.z = 2 * r;\r\n sZY.position.y = 2 * r;\r\n\r\n sYX.position.y = 2 * r;\r\n sYX.position.x = 2 * r;\r\n\r\n sXZ.bakeCurrentTransformIntoVertices();\r\n sZY.bakeCurrentTransformIntoVertices();\r\n sYX.bakeCurrentTransformIntoVertices();\r\n\r\n let sAll: Mesh = MeshBuilder.CreateBox(\"ALL\", { size: 2 * r }, this._scene);\r\n\r\n sX.parent = sCtl;\r\n sY.parent = sCtl;\r\n sZ.parent = sCtl;\r\n sAll.parent = sCtl;\r\n sXZ.parent = sCtl;\r\n sZY.parent = sCtl;\r\n sYX.parent = sCtl;\r\n\r\n sX.rotation.y = 1.57;\r\n sY.rotation.x -= 1.57;\r\n\r\n this._sX = sX;\r\n this._sY = sY;\r\n this._sZ = sZ;\r\n this._sXZ = sXZ;\r\n this._sZY = sZY;\r\n this._sYX = sYX;\r\n this._sAll = sAll;\r\n this._all_s = [sX, sY, sZ, sXZ, sZY, sYX, sAll];\r\n\r\n this._setVisibility(this._all_s, 0);\r\n //do not want clients picking this\r\n //we will pick using mesh filter in scene.pick function\r\n this._setPickableFalse(this._all_s);\r\n }\r\n\r\n private _createNonPickableScale(r: number, l: number) {\r\n\r\n let sEndX = MeshBuilder.CreateBox(\"\", { size: r }, this._scene);\r\n let sEndY = sEndX.clone(\"\");\r\n let sEndZ = sEndX.clone(\"\");\r\n\r\n let s = r * 2;\r\n let sEndXZ = MeshBuilder.CreatePlane(\"XZ\", { size: s }, this._scene);\r\n let sEndZY = MeshBuilder.CreatePlane(\"ZY\", { size: s }, this._scene);\r\n let sEndYX = MeshBuilder.CreatePlane(\"YX\", { size: s }, this._scene);\r\n\r\n\r\n let sEndAll = MeshBuilder.CreateBox(\"ALL\", { size: r }, this._scene);\r\n\r\n sEndXZ.rotation.x = 1.57;\r\n sEndZY.rotation.y = -1.57;\r\n\r\n sEndXZ.position.x = s;\r\n sEndXZ.position.z = s;\r\n\r\n sEndZY.position.z = s;\r\n sEndZY.position.y = s;\r\n\r\n sEndYX.position.y = s;\r\n sEndYX.position.x = s;\r\n\r\n sEndX.parent = this._sX;\r\n sEndY.parent = this._sY;\r\n sEndZ.parent = this._sZ;\r\n sEndXZ.parent = this._sXZ;\r\n sEndZY.parent = this._sZY;\r\n sEndYX.parent = this._sYX;\r\n sEndAll.parent = this._sAll;\r\n\r\n sEndX.position.z = l - r / 2;\r\n sEndY.position.z = l - r / 2;\r\n sEndZ.position.z = l - r / 2;\r\n\r\n sEndX.material = this._redMat;\r\n sEndY.material = this._greenMat;\r\n sEndZ.material = this._blueMat;\r\n sEndXZ.material = this._greenMat;\r\n sEndZY.material = this._redMat;\r\n sEndYX.material = this._blueMat;\r\n sEndAll.material = this._yellowMat;\r\n\r\n this._sEndX = sEndX;\r\n this._sEndY = sEndY;\r\n this._sEndZ = sEndZ;\r\n this._sEndXZ = sEndXZ;\r\n this._sEndZY = sEndZY;\r\n this._sEndYX = sEndYX;\r\n this._sEndAll = sEndAll;\r\n this._all_sEnd = [sEndX, sEndY, sEndZ, sEndXZ, sEndZY, sEndYX, sEndAll];\r\n\r\n this._setPickableFalse(this._all_sEnd);\r\n this._setRenderingGroup(this._all_sEnd);\r\n }\r\n\r\n\r\n /**\r\n * checks if a have left hand , right hand issue.\r\n * In other words if a mesh is a LHS mesh in RHS system or \r\n * a RHS mesh in LHS system\r\n * The X axis will be reversed in such cases.\r\n * thus Cross product of X and Y should be inverse of Z.\r\n * \r\n */\r\n // private _check_LHS_RHS(mesh: Mesh) {\r\n // let actualZ = Vector3.Cross(this._localX, this._localY);\r\n // //same direction or opposite direction of Z\r\n // if (Vector3.Dot(actualZ, this._localZ) < 0) return true;\r\n // else return false;\r\n // }\r\n\r\n /**\r\n * set how transparent the axes are\r\n * 0 to 1\r\n * 0 - completely transparent\r\n * 1 - completely non transparent\r\n * default is 0.75\r\n */\r\n public setVisibility(v: number) {\r\n this._visibility = v;\r\n }\r\n public setLocal(l: boolean) {\r\n if (this._local == l) return;\r\n this._local = l;\r\n if (!l) {\r\n this._ecRoot.rotationQuaternion = Quaternion.Identity();\r\n }\r\n }\r\n\r\n public isLocal(): boolean {\r\n return this._local;\r\n }\r\n\r\n public setTransSnap(s: boolean) {\r\n this._snapT = s;\r\n }\r\n\r\n public isTransSnap(): boolean {\r\n return this._snapT;\r\n }\r\n\r\n public setRotSnap(s: boolean) {\r\n this._snapR = s;\r\n }\r\n public isRotSnap(): boolean {\r\n return this._snapR;\r\n }\r\n\r\n public setScaleSnap(s: boolean) {\r\n this._snapS = s;\r\n }\r\n public isScaleSnap(): boolean {\r\n return this._snapS;\r\n }\r\n\r\n private _tSnap: Vector3 = new Vector3(this._transSnap, this._transSnap, this._transSnap);\r\n public setTransSnapValue(t: number) {\r\n this._tSnap.copyFromFloats(t, t, t);\r\n this._transSnap = t;\r\n }\r\n public getTransSnapValue(): number {\r\n return this._transSnap;\r\n }\r\n\r\n public setRotSnapValue(r: number) {\r\n this._rotSnap = r;\r\n }\r\n public getRotSnapValue(): number {\r\n return this._rotSnap;\r\n }\r\n\r\n public setScaleSnapValue(r: number) {\r\n this._scaleSnap = r;\r\n }\r\n public getScaleSnapValue(): number {\r\n return this._scaleSnap;\r\n }\r\n //few temp vectors & matrix\r\n private _tv1: Vector3 = new Vector3(0, 0, 0);\r\n private _tv2: Vector3 = new Vector3(0, 0, 0);\r\n private _tv3: Vector3 = new Vector3(0, 0, 0);\r\n private _tm: Matrix = new Matrix();\r\n private _getAngle2(p1: Vector3, p2: Vector3, cameraPos: Vector3, c2ec: Vector3, mN: Vector3): number {\r\n /**\r\n * A) find out if the camera is above , below, left, right of the rotation plane\r\n */\r\n //project \"camera to ec\" vector onto mesh normal to get distance to rotation plane\r\n let d: number = Vector3.Dot(c2ec, mN);\r\n //scale mesh normal by above ammount to get vector to rotation plane\r\n mN.scaleToRef(d, this._tv1);\r\n //get the point of intersection of vector from camera perpendicular to rotation plane\r\n cameraPos.addToRef(this._tv1, this._tv2);\r\n let i: Vector3 = this._tv2;//save some typing\r\n //find the co-ordinate of this point in the cameras frame of reference\r\n this._mainCamera.getWorldMatrix().invertToRef(this._tm);\r\n Vector3.TransformCoordinatesToRef(this._tv2, this._tm, this._tv2);\r\n //find in which quadarant the point (and thus the rotation plane) is in the camera xy plane\r\n let q: number = 0; //(1=x y,2=-x y,3=-x -y,4=x -y)\r\n if (i.x >= 0 && i.y >= 0) q = 1;\r\n else if (i.x <= 0 && i.y >= 0) q = 2;\r\n else if (i.x <= 0 && i.y <= 0) q = 3;\r\n else if (i.x >= 0 && i.y <= 0) q = 4;\r\n\r\n /**\r\n * B) find out if the user moved pointer up,down, right, left\r\n */\r\n\r\n //find movement vector in camera frame of reference\r\n Vector3.TransformCoordinatesToRef(p1, this._tm, this._tv1);\r\n Vector3.TransformCoordinatesToRef(p2, this._tm, this._tv2);\r\n this._tv2.subtractInPlace(this._tv1);\r\n let mv: Vector3 = this._tv2; //save some typing\r\n //for now lets set the angle magnitutde same as amount by which the mouse moved\r\n let angle: number = mv.length();\r\n\r\n let m: String = \"\";//(u ,d ,r,l)\r\n if (mv.x >= 0 && mv.y >= 0) {\r\n if (mv.x >= mv.y) m = \"r\"; else m = \"u\";\r\n } else if (mv.x <= 0 && mv.y >= 0) {\r\n if (-mv.x >= mv.y) m = \"l\"; else m = \"u\";\r\n } else if (mv.x <= 0 && mv.y <= 0) {\r\n if (-mv.x >= -mv.y) m = \"l\"; else m = \"d\";\r\n } else if (mv.x >= 0 && mv.y <= 0) {\r\n if (mv.x >= -mv.y) m = \"r\"; else m = \"d\";\r\n }\r\n\r\n /**\r\n * C) decide if the user was trying to rotate clockwise (+1) or anti-clockwise(-1)\r\n */\r\n\r\n let r: number = 0;\r\n //if mouse moved down /up and rotation plane is on right or left side of user\r\n if (m == \"d\") {\r\n if (q == 1 || q == 4) r = 1;\r\n else r = -1;\r\n } else if (m == \"u\") {\r\n if (q == 1 || q == 4) r = -1;\r\n else r = 1;\r\n //if mouse moved right/left and rotation plane is above or below user\r\n } else if (m == \"r\") {\r\n if (q == 2 || q == 1) r = 1;\r\n else r = -1;\r\n } else if (m == \"l\") {\r\n if (q == 2 || q == 1) r = -1;\r\n else r = 1;\r\n }\r\n\r\n return r * angle;\r\n }\r\n\r\n /**\r\n * finds the angle subtended from points p1 to p2 around the point p\r\n * checks if the user was trying to rotate clockwise (+ve in LHS) or anticlockwise (-ve in LHS)\r\n * to figure this check the orientation of the user(camera)to ec vector with the rotation normal vector\r\n */\r\n private _getAngle(p1: Vector3, p2: Vector3, p: Vector3, c2ec: Vector3): number {\r\n p1.subtractToRef(p, this._tv1);\r\n p2.subtractToRef(p, this._tv2);\r\n Vector3.CrossToRef(this._tv1, this._tv2, this._tv3);\r\n let angle: number = Math.asin(this._tv3.length() / (this._tv1.length() * this._tv2.length()));\r\n //camera looking down from front of plane or looking up from behind plane\r\n if ((Vector3.Dot(this._tv3, c2ec) > 0)) {\r\n angle = -1 * angle;\r\n }\r\n return angle;\r\n }\r\n\r\n private static _getStandardMaterial(col: Color3, scene: Scene): StandardMaterial {\r\n let mat: StandardMaterial = new StandardMaterial(\"\", scene);\r\n mat.emissiveColor = col;\r\n mat.diffuseColor = Color3.Black();\r\n mat.specularColor = Color3.Black();\r\n mat.backFaceCulling = false;\r\n return mat;\r\n }\r\n\r\n private _createMaterials(scene: Scene) {\r\n this._redMat = EditControl._getStandardMaterial(this._redCol, scene);\r\n this._greenMat = EditControl._getStandardMaterial(this._greenCol, scene);\r\n this._blueMat = EditControl._getStandardMaterial(this._blueCol, scene);\r\n this._whiteMat = EditControl._getStandardMaterial(this._whiteCol, scene);\r\n this._yellowMat = EditControl._getStandardMaterial(this._yellowCol, scene);\r\n }\r\n\r\n private _disposeMaterials() {\r\n this._redMat.dispose();\r\n this._greenMat.dispose();\r\n this._blueMat.dispose();\r\n this._whiteMat.dispose();\r\n this._yellowMat.dispose();\r\n }\r\n\r\n\r\n}\r\n\r\nclass ActHist {\r\n private mesh: TransformNode;\r\n\r\n private lastMax: number = 10;\r\n\r\n private acts: Array<Act> = new Array<Act>();\r\n\r\n private last: number = -1;\r\n\r\n private current: number = -1;\r\n\r\n public constructor(mesh: TransformNode, capacity: number) {\r\n this.mesh = mesh;\r\n this.lastMax = capacity - 1;\r\n this.add();\r\n }\r\n\r\n public setCapacity(c: number) {\r\n if ((c == 0)) {\r\n console.error(\"capacity should be more than zero\");\r\n return;\r\n }\r\n this.lastMax = c - 1;\r\n this.last = -1;\r\n this.current = -1;\r\n this.acts = new Array<Act>();\r\n this.add();\r\n }\r\n\r\n public add(at?: number) {\r\n if (at === undefined) at = null;\r\n let act: Act = new Act(this.mesh, at);\r\n if ((this.current < this.last)) {\r\n this.acts.splice(this.current + 1);\r\n this.last = this.current;\r\n }\r\n if ((this.last == this.lastMax)) {\r\n this.acts.shift();\r\n this.acts.push(act);\r\n } else {\r\n this.acts.push(act);\r\n this.last++;\r\n this.current++;\r\n }\r\n }\r\n\r\n public undo(): number {\r\n if ((this.current > 0)) {\r\n let at: number = (<Act>this.acts[this.current]).getActionType()\r\n this.current--;\r\n (<Act>this.acts[this.current]).perform(this.mesh);\r\n return at;\r\n }\r\n }\r\n\r\n public redo() {\r\n if ((this.current < this.last)) {\r\n this.current++;\r\n (<Act>this.acts[this.current]).perform(this.mesh);\r\n return (<Act>this.acts[this.current]).getActionType()\r\n }\r\n }\r\n}\r\n\r\nclass Act {\r\n private _p: Vector3;\r\n\r\n private _rQ: Quaternion;\r\n private _rE: Vector3;\r\n\r\n private _s: Vector3;\r\n\r\n //actiontype\r\n private _at: number;\r\n\r\n public constructor(mesh: TransformNode, at: number) {\r\n this._p = mesh.position.clone();\r\n //if (mesh.rotationQuaternion == null) {\r\n if (mesh.rotationQuaternion == null) {\r\n this._rQ = null;\r\n this._rE = mesh.rotation.clone();\r\n } else {\r\n this._rQ = mesh.rotationQuaternion.clone();\r\n this._rE = null;\r\n }\r\n this._s = mesh.scaling.clone();\r\n this._at = at;\r\n }\r\n\r\n public getActionType(): number {\r\n return this._at;\r\n }\r\n\r\n public perform(mesh: TransformNode) {\r\n mesh.position.copyFrom(this._p)\r\n //check if we are doing euler or quaternion now\r\n //also check what were we doing when the rotation value\r\n //was captured and set value accordingly\r\n if (mesh.rotationQuaternion == null) {\r\n if (this._rE != null) {\r\n //mesh.rotation = this.rE.clone();\r\n mesh.rotation.copyFrom(this._rE);\r\n } else {\r\n //mesh.rotation = this.r.toEulerAngles();\r\n mesh.rotation.copyFrom(this._rQ.toEulerAngles());\r\n }\r\n } else {\r\n if (this._rQ != null) {\r\n mesh.rotationQuaternion.copyFrom(this._rQ);\r\n } else {\r\n //TODO use BABYLON.Quaternion.RotationYawPitchRoll(rot.y, rot.x, rot.z) instead of toQuaternion.\r\n //mesh.rotationQuaternion.copyFrom(this.rE.toQuaternion());\r\n mesh.rotationQuaternion.copyFrom(Quaternion.RotationYawPitchRoll(this._rE.y, this._rE.x, this._rE.z));\r\n }\r\n }\r\n mesh.scaling.copyFrom(this._s);\r\n }\r\n}\r\n"],"names":["root","factory","exports","module","require","define","amd","a","i","self","__WEBPACK_EXTERNAL_MODULE__247__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","ActionType","mesh","camera","canvas","scale","eulerian","pickWidth","_local","_snapT","_snapR","_transSnap","_rotSnap","Math","PI","_axesLen","_axesScale","_pickWidth","_redCol","Color3","_greenCol","_blueCol","_whiteCol","_yellowCol","_visibility","_lhsRhs","_ecMatrix","Matrix","_ecTOcamera","Vector3","_distFromCamera","_cameraTOec","_cameraNormal","_prevState","_hidden","_actionListener","_actionStartListener","_actionEndListener","_pDown","_pointerIsOver","_editing","_rotate2","_transBy","_snapTV","_snapS","_snapSV","_scaleSnap","_scale","_localX","_localY","_localZ","_eulerian","_snapRA","_transEnabled","_rotEnabled","_scaleEnabled","_guideSize","_tSnap","this","_tv1","_tv2","_tv3","_tm","_mesh","_mainCamera","_canvas","_checkQuaternion","_utilLayer","UtilityLayerRenderer","onlyCheckPointerDownEvents","_scene","utilityLayerScene","_actHist","ActHist","computeWorldMatrix","_boundingDimesion","_getBoundingDimension","_setLocalAxes","_check_LHS_RHS","console","log","_ecRoot","Mesh","rotationQuaternion","Quaternion","visibility","isPickable","_createMaterials","_createCommonAxes","parent","_createPickPlanes","_pointerdown","evt","_onPointerDown","_pointerup","_onPointerUp","_pointermove","_onPointerMove","addEventListener","_renderer","_renderLoopProcess","registerBeforeRender","getRoot","_issue","actualZ","position","getAbsolutePivotPoint","_setECRotation","_setECScale","getWorldMatrix","invertToRef","_pALL","lookAt","Space","subtractToRef","_rotRotGuides","_rotPlanarGuides","_tXZ","_tZY","_tYX","_sXZ","_sZY","_sYX","rot","rotation","y","x","z","copyFrom","_isScaleUnEqual","getRotationMatrixToRef","scaling","asArray","parentOnNormal","length","s","abs","rotX","atan","_rX","rotY","_rY","rotZ","_rZ","XZ","ZY","YX","ec","switchTo","refreshBoundingInfo","switchCamera","setUndoCount","c","setCapacity","undo","at","_callActionStartListener","_callActionListener","_callActionEndListener","redo","detach","removeEventListener","unregisterBeforeRender","removeAllActionListeners","_disposeAll","hide","disableTranslation","disableRotation","disableScaling","_hideCommonAxes","_xaxis","_yaxis","_zaxis","_showCommonAxes","show","enableTranslation","enableRotation","enableScaling","isHidden","dispose","_disposeMaterials","addActionListener","actionListener","removeActionListener","addActionStartListener","actionStartListener","removeActionStartListener","addActionEndListener","actionEndListener","removeActionEndListener","preventDefault","button","engine","getEngine","width","pointerX","height","pointerY","pickResult","pick","_tX","_tY","_tZ","_tAll","_rAll","_sX","_sY","_sZ","_sAll","hit","_axisPicked","pickedMesh","childs","getChildren","name","_bXaxis","_bYaxis","_bZaxis","_setEditing","_pickedPlane","_getPickPlane","_prevPos","_getPosOnPickPlane","window","setTimeout","cam","can","_detachCamera","editing","_setActionType","_actionType","ROT","isEditing","isPointerLock","detachControl","isPointerOver","_onPointerOver","_prevOverMesh","_clearPrevOverMesh","_savedCol","color","_savedMat","material","_whiteMat","_restoreColor","attachControl","_hideBaxis","add","TRANS","SCALE","newPos","_doRotation","diff","subtract","_doTranslation","_doScaling","axis","_pXZ","_pZY","_pYX","_transWithSnap","_transBoundsMin","max","_transBoundsMax","min","trans","local","snapit","addInPlace","normalizeToRef","translate","setAbsolutePosition","absolutePosition","bbd","upVector","copyFromFloats","inPlane","_scaleWithSnap","_scaleBoundsMin","_scaleBoundsMax","p","meshMatrix","m","AbstractMesh","bb","getBoundingInfo","boundingBox","bd","maximum","minimum","prevPos","rAxis","angle","Axis","_getAngle2","useRightHandedSystem","_getAngle","normalize","rotate","toEulerAngles","pickinfo","pickedPoint","getRotationQuaternion","getPosition","isTranslationEnabled","_createTransAxes","_tCtl","_setVisibility","_all_tEnd","isRotationEnabled","returnEuler","euler","_rCtl","_createRotAxes","_all_rEnd","isScalingEnabled","_createScaleAxes","_sCtl","_all_sEnd","setScaleBounds","removeScaleBounds","setTransBounds","removeTransBounds","setRotBounds","_rotBoundsMin","_rotBoundsMax","removeRotBounds","guideAxes","MeshBuilder","points","al","renderingGroupId","size","pickPlanes","l","_createPickableTrans","_createNonPickableTrans","tCtl","scene","tX","_extrudeBox","tY","clone","tZ","tXZ","tZY","tYX","bakeCurrentTransformIntoVertices","tAll","_all_t","_setPickableFalse","cl","tEndX","diameterTop","diameterBottom","tessellation","subdivisions","tEndY","tEndZ","tEndXZ","tEndZY","tEndYX","tEndAll","_redMat","_greenMat","_blueMat","_yellowMat","_tEndX","_tEndY","_tEndZ","_tEndXZ","_tEndZY","_tEndYX","_tEndAll","_setRenderingGroup","setRotGuideFull","_createPickableRot","_createNonPickableRot","rCtl","rX","_createTube","rY","rZ","rAll","_all_r","rEndX","_createCircle","rEndY","rEndZ","rEndAll","rEndAll2","_rEndX","_rEndY","_rEndZ","_rEndAll","_rEndAll2","meshes","v","map","w","shape","path","cap","t","double","cos","sin","radius","_createPickableScale","_createNonPickableScale","sCtl","sX","sY","sZ","sXZ","sZY","sYX","sAll","_all_s","sEndX","sEndY","sEndZ","sEndXZ","sEndZY","sEndYX","sEndAll","_sEndX","_sEndY","_sEndZ","_sEndXZ","_sEndZY","_sEndYX","_sEndAll","setVisibility","setLocal","isLocal","setTransSnap","isTransSnap","setRotSnap","isRotSnap","setScaleSnap","isScaleSnap","setTransSnapValue","getTransSnapValue","setRotSnapValue","getRotSnapValue","setScaleSnapValue","getScaleSnapValue","p1","p2","cameraPos","c2ec","mN","scaleToRef","addToRef","q","subtractInPlace","mv","asin","_getStandardMaterial","col","mat","StandardMaterial","emissiveColor","diffuseColor","specularColor","backFaceCulling","EditControl","capacity","lastMax","acts","Array","last","current","error","act","Act","splice","shift","push","getActionType","perform","_p","_rQ","_rE","_s","_at"],"sourceRoot":""}
|