@soonspacejs/plugin-patrol-controls 2.9.7 → 2.10.0-rc.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/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { PerspectiveCamera, Vector3, Euler } from 'three';
1
+ import { PerspectiveCamera } from 'three';
2
2
  import SoonSpace from 'soonspacejs';
3
- import type { CameraViewpointData, CameraTargetViewData, Position } from 'soonspacejs';
3
+ import type { CameraViewpointData, Position } from 'soonspacejs';
4
4
  import type { Node } from 'soonspacejs/types/Library';
5
5
  import type { Topology } from 'soonspacejs/types/Library';
6
6
  import type { Tween } from '@tweenjs/tween.js';
@@ -26,7 +26,7 @@ export interface DefaultOptions {
26
26
  /**
27
27
  * 更新回调
28
28
  */
29
- onUpdate: (realTimePosition: Position, realTimeRotation: Euler, nextNode: Node, toNextNodeDistance: number) => void;
29
+ onUpdate: (realTimePosition: Position, nextNode: Node, toNextNodeDistance: number) => void;
30
30
  /**
31
31
  * 巡检进度
32
32
  */
@@ -60,13 +60,13 @@ export default class PatrolControlsPlugin {
60
60
  _needsUpdateProgress: boolean;
61
61
  isPaused: boolean;
62
62
  isStoped: boolean;
63
- _positionTween: Tween<Vector3> | null;
64
- _rotationTween: Tween<Euler> | null;
65
- _cameraViewpointData: CameraViewpointData | CameraTargetViewData | null;
66
- /**
67
- * 主相机视角数据
68
- */
69
- _mainCameraViewpointData: CameraViewpointData | CameraTargetViewData | null;
63
+ _positionTween: Tween<{
64
+ distance: number;
65
+ }> | null;
66
+ _rotationTween: Tween<{
67
+ t: number;
68
+ }> | null;
69
+ _cameraViewpointData: CameraViewpointData | null;
70
70
  constructor(ssp: SoonSpace);
71
71
  /**
72
72
  * 开始巡检
package/dist/index.esm.js CHANGED
@@ -1 +1 @@
1
- import{Vector3 as t,Matrix4 as i,Euler as s}from"three";const e="patrolControls";class o{constructor(t){this.ssp=t,this.options={naviSpeed:1,rotateSpeed:1,eyeHeight:150,flyToStartPoint:!0,onUpdate:()=>{},onProgress:()=>{},onEnd:()=>{}},this.states={moveDuration:0,rotateDuration:0},this.nodes=[],this.nextPointIndex=0,this._nodeDistances=[],this._totalDistance=0,this._updatePercent=0,this._needsUpdateProgress=!1,this.isPaused=!1,this.isStoped=!0,this._positionTween=null,this._rotationTween=null,this._cameraViewpointData=null,this._mainCameraViewpointData=null;const{cameraManager:i}=this.ssp.viewport;this.camera=i.cameras[e]||i.createCamera(e)}start(t,i){this.isStoped?(this.init(t),this.initOptions(i),this.patrolStart()):this.ssp.utils.warn("巡检已经开始!")}setProgress(t){var i,s;this._updatePercent=Math.min(Math.max(t,0),1),this._needsUpdateProgress=!0,null===(i=this._positionTween)||void 0===i||i.stop(),null===(s=this._rotationTween)||void 0===s||s.stop()}setOptions(t){if(this.isStoped)return;const{naviSpeed:i,rotateSpeed:s}=t;if(i&&this._positionTween){const t=this.states.moveDuration*this.options.naviSpeed/i;this._positionTween.duration(t),this.states.moveDuration=t}if(s&&this._rotationTween){const t=this.states.rotateDuration*this.options.rotateSpeed/s;this._rotationTween.duration(t),this.states.rotateDuration=t}this.initOptions(t)}pause(){var t,i;if(this.isPaused||this.isStoped)return;this._cameraViewpointData=this.ssp.getCameraViewpoint();const{cameraManager:s}=this.ssp.viewport,e=s.getMainCamera();s.setCurrentCamera(e),this._cameraViewpointData&&this.ssp.setCameraViewpoint(this._cameraViewpointData),this.ssp.viewport.controls.currentControls.enabled=!1,this.isPaused=!0,null===(t=this._positionTween)||void 0===t||t.pause(),null===(i=this._rotationTween)||void 0===i||i.pause()}resume(){var t,i;if(this.isPaused&&!this.isStoped){if(this._cameraViewpointData){const{cameraManager:t}=this.ssp.viewport;t.setCurrentCamera(this.camera),this.ssp.setCameraViewpoint(this._cameraViewpointData)}this.isPaused=!1,null===(t=this._positionTween)||void 0===t||t.resume(),null===(i=this._rotationTween)||void 0===i||i.resume()}}stop(){if(this.isStoped)return;this.patrolStop();const{cameraManager:t}=this.ssp.viewport,i=t.getMainCamera();t.setCurrentCamera(i),this._mainCameraViewpointData&&this.ssp.setCameraViewpoint(this._mainCameraViewpointData),this.ssp.viewport.controls.currentControls.enabled=!0}init(t){const{cameraManager:i}=this.ssp.viewport;this.isPaused=!1,this.isStoped=!1,this.nextPointIndex=0,this._mainCameraViewpointData=this.ssp.getCameraViewpoint(),i.setCurrentCamera(this.camera),this.ssp.setCameraViewpoint(this._mainCameraViewpointData),this.nodes=[...t.nodes]}initOptions(i){const{eyeHeight:s,naviSpeed:e,rotateSpeed:o,flyToStartPoint:n=!0,onUpdate:a,onProgress:r,onEnd:h}=i;s&&(this.options.eyeHeight=s),e&&(this.options.naviSpeed=e),o&&(this.options.rotateSpeed=o),this.options.flyToStartPoint=n,a&&(this.options.onUpdate=a),r&&(this.options.onProgress=r),h&&(this.options.onEnd=h),this._nodeDistances.length=0,this._nodeDistances.push(0),this._totalDistance=0;for(let i=0,s=this.nodes.length;i<s-1;i++){const s=this.nodes[i],e=this.nodes[i+1];if(s&&e){const i=s.getWorldPosition(new t),o=e.getWorldPosition(new t);i.y+=this.options.eyeHeight,o.y+=this.options.eyeHeight;const n=i.distanceTo(o);this._nodeDistances.push(n),this._totalDistance+=n}}}computedRotation(t,e){const o=new i;o.lookAt(t,e,this.camera.up);const n=(new s).setFromRotationMatrix(o,"YXZ");return n.copy(this.ssp.utils.rotationAFix(this.camera.rotation,n.clone())),0===n.y&&(0===n.z?n.x=0:0===n.x&&(n.z=0)),n}computeNextRotation(i=this.nextPointIndex){var e,o;const n=null===(e=this.nodes[i])||void 0===e?void 0:e.getWorldPosition(new t),a=null===(o=this.nodes[i+1])||void 0===o?void 0:o.getWorldPosition(new t);return n&&a?this.computedRotation(n,a):new s}async patrolStart(){return new Promise((async i=>{const{onUpdate:s,onProgress:e,onEnd:o}=this.options;if(this.nextPointIndex>=this.nodes.length)null==o||o(this.camera.position.clone()),i(!0);else{if(this._needsUpdateProgress){let i=this._totalDistance*this._updatePercent;for(let s=0,e=this._nodeDistances.length;s<e;s++)if(i-=this._nodeDistances[s],i<0){this.nextPointIndex=s,i+=this._nodeDistances[s];const e=i/this._nodeDistances[s]||0,o=this.nodes[s-1],n=this.nodes[s],a=new t,r=o.getWorldPosition(new t),h=n.getWorldPosition(new t);r.y+=this.options.eyeHeight,h.y+=this.options.eyeHeight;const p=(new t).subVectors(h,r).multiplyScalar(e);a.copy(r).add(p),this.camera.position.copy(a),this.camera.rotation.copy(this.computeNextRotation(s-1));break}this._needsUpdateProgress=!1}const i=this.camera.position.clone(),o=this.computeNextRotation(),n=this.nodes[this.nextPointIndex],a=n.getWorldPosition(new t);a.setY(a.y+this.options.eyeHeight);const r=i.distanceTo(a);if(this.states.moveDuration=0===this.nextPointIndex?1e3:r/this.options.naviSpeed/.6,0!==this.nextPointIndex||this.options.flyToStartPoint)try{await this.ssp.animation(this.camera.position,a,{duration:this.states.moveDuration},(t=>{var i;this.isPaused&&(null===(i=this._positionTween)||void 0===i||i.pause());const r=this.camera.position.distanceTo(a);if(null==s||s(t,o,n,r),this._nodeDistances[this.nextPointIndex]>0){let t=this._nodeDistances.slice(0,this.nextPointIndex+1).reduce(((t,i)=>t+i),0);t-=r,null==e||e({patrolled:t,total:this._totalDistance,percent:t/this._totalDistance})}}),(t=>{this._positionTween=t}))}catch(t){}else this.camera.position.copy(a);if(this.nextPointIndex<this.nodes.length-1){const t=this.camera.rotation.clone(),i=this.computeNextRotation(),s=Math.abs(t.x-i.x)+Math.abs(t.y-i.y)+Math.abs(t.y-i.y);if(this.states.rotateDuration=0===this.nextPointIndex?1e3:100*s/this.options.rotateSpeed,0!==this.nextPointIndex||this.options.flyToStartPoint)try{await this.ssp.animation(this.camera.rotation,i,{duration:this.states.rotateDuration},((t,i)=>{var s;this.isPaused&&(null===(s=this._rotationTween)||void 0===s||s.pause())}),(t=>{this._rotationTween=t}))}catch(t){}else this.camera.rotation.copy(i)}this._needsUpdateProgress||this.nextPointIndex++,this.isStoped||await this.patrolStart()}}))}patrolStop(){var t,i;this.options={naviSpeed:1,rotateSpeed:1,eyeHeight:150,flyToStartPoint:!0,onUpdate:()=>{},onProgress:()=>{},onEnd:()=>{}},this.nodes=[],this.nextPointIndex=0,this.isPaused=!1,this.isStoped=!0,this._needsUpdateProgress=!1,null===(t=this._positionTween)||void 0===t||t.stop(),null===(i=this._rotationTween)||void 0===i||i.stop(),this._positionTween=null,this._rotationTween=null}}export{o as default};
1
+ import{Vector3 as t,Matrix4 as s,Euler as i}from"three";const e=1e-5;class o{constructor(t){this.ssp=t,this.options={naviSpeed:1,rotateSpeed:1,eyeHeight:150,flyToStartPoint:!0,onUpdate:()=>{},onProgress:()=>{},onEnd:()=>{}},this.states={moveDuration:0,rotateDuration:0},this.nodes=[],this.nextPointIndex=0,this._nodeDistances=[],this._totalDistance=0,this._updatePercent=0,this._needsUpdateProgress=!1,this.isPaused=!1,this.isStoped=!0,this._positionTween=null,this._rotationTween=null,this._cameraViewpointData=null;const{cameraManager:s}=this.ssp.viewport;this.camera=s.mainCamera}start(t,s){this.isStoped?(this.ssp.controls.saveState(),this.ssp.controls.enabled=!1,this.init(t),this.initOptions(s),this.patrolStart()):this.ssp.utils.warn("巡检已经开始!")}setProgress(t){var s,i;this._updatePercent=Math.min(Math.max(t,0),1),this._needsUpdateProgress=!0,null===(s=this._positionTween)||void 0===s||s.stop(),null===(i=this._rotationTween)||void 0===i||i.stop()}setOptions(t){if(this.isStoped)return;const{naviSpeed:s,rotateSpeed:i}=t;if(s&&this._positionTween){const t=this.states.moveDuration*this.options.naviSpeed/s;this._positionTween.duration(t),this.states.moveDuration=t}if(i&&this._rotationTween){const t=this.states.rotateDuration*this.options.rotateSpeed/i;this._rotationTween.duration(t),this.states.rotateDuration=t}this.initOptions(t)}pause(){var t,s;this.isPaused||this.isStoped||(this._cameraViewpointData=this.ssp.getCameraViewpoint(),this.isPaused=!0,null===(t=this._positionTween)||void 0===t||t.pause(),null===(s=this._rotationTween)||void 0===s||s.pause())}resume(){var t,s;this.isPaused&&!this.isStoped&&(this._cameraViewpointData&&this.ssp.setCameraViewpoint(this._cameraViewpointData),this.isPaused=!1,null===(t=this._positionTween)||void 0===t||t.resume(),null===(s=this._rotationTween)||void 0===s||s.resume())}stop(){this.isStoped||(this.patrolStop(),this.ssp.controls.reset(),this.ssp.controls.enabled=!0)}init(t){this.isPaused=!1,this.isStoped=!1,this.nextPointIndex=0,this.nodes=[...t.nodes]}initOptions(s){const{eyeHeight:i,naviSpeed:e,rotateSpeed:o,flyToStartPoint:n=!0,onUpdate:a,onProgress:h,onEnd:r}=s;i&&(this.options.eyeHeight=i),e&&(this.options.naviSpeed=e),o&&(this.options.rotateSpeed=o),this.options.flyToStartPoint=n,a&&(this.options.onUpdate=a),h&&(this.options.onProgress=h),r&&(this.options.onEnd=r),this._nodeDistances.length=0,this._nodeDistances.push(0),this._totalDistance=0;for(let s=0,i=this.nodes.length;s<i-1;s++){const i=this.nodes[s],e=this.nodes[s+1];if(i&&e){const s=i.getWorldPosition(new t),o=e.getWorldPosition(new t);s.y+=this.options.eyeHeight,o.y+=this.options.eyeHeight;const n=s.distanceTo(o);this._nodeDistances.push(n),this._totalDistance+=n}}}computedRotation(t,e){const o=new s;o.lookAt(t,e,this.camera.up);const n=(new i).setFromRotationMatrix(o,"YXZ");return n.copy(this.ssp.utils.rotationAFix(this.camera.rotation,n.clone())),0===n.y&&(0===n.z?n.x=0:0===n.x&&(n.z=0)),n}computeNextRotation(s=this.nextPointIndex){var e,o;const n=null===(e=this.nodes[s])||void 0===e?void 0:e.getWorldPosition(new t),a=null===(o=this.nodes[s+1])||void 0===o?void 0:o.getWorldPosition(new t);return n&&a?this.computedRotation(n,a):new i}async patrolStart(){return new Promise((async s=>{var i;const{controls:o}=this.ssp,{onUpdate:n,onProgress:a,onEnd:h}=this.options;if(this.nextPointIndex>=this.nodes.length)null==h||h(this.camera.position.clone()),s(!0);else{if(this._needsUpdateProgress){let s=this._totalDistance*this._updatePercent;for(let i=0,e=this._nodeDistances.length;i<e;i++)if(s-=this._nodeDistances[i],s<0){this.nextPointIndex=i,s+=this._nodeDistances[i];const e=s/this._nodeDistances[i]||0,n=this.nodes[i-1],a=this.nodes[i],h=new t,r=n.getWorldPosition(new t),d=a.getWorldPosition(new t);r.y+=this.options.eyeHeight,d.y+=this.options.eyeHeight;const p=(new t).subVectors(d,r).multiplyScalar(e);h.copy(r).add(p),o.setPosition(h.x,h.y,h.z),o.setTarget(d.x,d.y,d.z);break}this._needsUpdateProgress=!1}const s=this.nodes[this.nextPointIndex],h=s.getWorldPosition(new t);h.setY(h.y+this.options.eyeHeight);const r=o.getPosition(new t).distanceTo(h);if(this.states.moveDuration=0===this.nextPointIndex?1e3:r/this.options.naviSpeed/.6,o.setTarget(h.x,h.y,h.z),0!==this.nextPointIndex||this.options.flyToStartPoint)try{await this.ssp.animation({distance:o.distance},{distance:e},{duration:this.states.moveDuration},(({distance:i})=>{var e;if(this.isPaused&&(null===(e=this._positionTween)||void 0===e||e.pause()),o.dollyTo(i),null==n||n(o.getPosition(new t),s,i),this._nodeDistances[this.nextPointIndex]>0){let t=this._nodeDistances.slice(0,this.nextPointIndex+1).reduce(((t,s)=>t+s),0);t-=i,null==a||a({patrolled:t,total:this._totalDistance,percent:t/this._totalDistance})}}),(t=>{this._positionTween=t}))}catch(t){}else o.dollyTo(e);if(this.nextPointIndex<this.nodes.length-1){const s=this.camera.rotation.clone(),e=this.computeNextRotation(),n=Math.abs(s.x-e.x)+Math.abs(s.y-e.y)+Math.abs(s.y-e.y);this.states.rotateDuration=0===this.nextPointIndex?1e3:100*n/this.options.rotateSpeed;const a=o.getPosition(new t),r=null===(i=this.nodes[this.nextPointIndex+1])||void 0===i?void 0:i.getWorldPosition(new t);r.y+=this.options.eyeHeight;try{await this.ssp.animation({t:0},{t:1},{duration:this.states.rotateDuration},(({t:t})=>{var s;this.isPaused&&(null===(s=this._rotationTween)||void 0===s||s.pause());const i=h.clone().sub(a).normalize().add(h),e=r.clone().sub(h).normalize().add(h);o.lerpLookAt(h.x,h.y,h.z,i.x,i.y,i.z,h.x,h.y,h.z,e.x,e.y,e.z,t)}),(t=>{this._rotationTween=t}))}catch(t){}}this._needsUpdateProgress||this.nextPointIndex++,this.isStoped||await this.patrolStart()}}))}patrolStop(){var t,s;this.options={naviSpeed:1,rotateSpeed:1,eyeHeight:150,flyToStartPoint:!0,onUpdate:()=>{},onProgress:()=>{},onEnd:()=>{}},this.nodes=[],this.nextPointIndex=0,this.isPaused=!1,this.isStoped=!0,this._needsUpdateProgress=!1,null===(t=this._positionTween)||void 0===t||t.stop(),null===(s=this._rotationTween)||void 0===s||s.stop(),this._positionTween=null,this._rotationTween=null}}export{o as default};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@soonspacejs/plugin-patrol-controls",
3
3
  "pluginName": "PatrolControlsPlugin",
4
- "version": "2.9.7",
4
+ "version": "2.10.0-rc.0",
5
5
  "description": "Patrol-controls plugin for SoonSpace.js",
6
6
  "main": "dist/index.esm.js",
7
7
  "module": "dist/index.esm.js",
@@ -13,8 +13,8 @@
13
13
  ],
14
14
  "author": "xunwei",
15
15
  "license": "UNLICENSED",
16
- "gitHead": "a15e2ecffc921c604f41b9218553c63dd5e5e279",
16
+ "gitHead": "99c11070f1d4d468e35f6e646092c1a3e888ff1c",
17
17
  "peerDependencies": {
18
- "soonspacejs": "2.9.7"
18
+ "soonspacejs": "2.10.0-rc.0"
19
19
  }
20
20
  }