@soonspacejs/plugin-follow-mouse 2.13.7 → 2.13.9

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/README.md CHANGED
@@ -1,15 +1,15 @@
1
- # @soonspacejs/plugin-follow-mouse
2
-
3
- > Scene object follow mouse plugin for SoonSpace.js
4
-
5
- Document: [http://www.xwbuilders.com:8800/plugin/follow-mouse.html](http://www.xwbuilders.com:8800/plugin/follow-mouse.html)
6
-
7
- ## 交互
8
-
9
- 鼠标左键单击摆放模型
10
- 鼠标左键双击摆放模型并结束摆放
11
-
12
- 回车键结束摆放
13
-
14
- 鼠标右键单击或 `delete` 删除上一次摆放
1
+ # @soonspacejs/plugin-follow-mouse
2
+
3
+ > Scene object follow mouse plugin for SoonSpace.js
4
+
5
+ Document: [http://www.xwbuilders.com:8800/plugin/follow-mouse.html](http://www.xwbuilders.com:8800/plugin/follow-mouse.html)
6
+
7
+ ## 交互
8
+
9
+ 鼠标左键单击摆放模型
10
+ 鼠标左键双击摆放模型并结束摆放
11
+
12
+ 回车键结束摆放
13
+
14
+ 鼠标右键单击或 `delete` 删除上一次摆放
15
15
  `esc` 清空并取消摆放
@@ -0,0 +1,34 @@
1
+ import { Vector3 } from 'three';
2
+ import SoonSpace, { IColor } from 'soonspacejs';
3
+ import type { BaseObject3D } from 'soonspacejs';
4
+ export interface StartOptions {
5
+ offset?: Vector3;
6
+ openHelper?: boolean;
7
+ helperColor?: IColor;
8
+ onPlace?: (object: BaseObject3D) => void;
9
+ onDone?: (objects: BaseObject3D[]) => void;
10
+ onBack?: (object: BaseObject3D) => void;
11
+ onCancel?: () => void;
12
+ }
13
+ export default class FollowMousePlugin {
14
+ private readonly ssp;
15
+ private object;
16
+ private objectBbox;
17
+ private objectSourcePosition;
18
+ private sceneMesh;
19
+ private helper;
20
+ private placedObject;
21
+ private options;
22
+ private mouseDownModelPosition;
23
+ constructor(ssp: SoonSpace);
24
+ start(object: BaseObject3D, options?: StartOptions): void;
25
+ private stop;
26
+ private onMouseMove;
27
+ private onMouseDown;
28
+ private onClick;
29
+ private onRightClick;
30
+ private onDblClick;
31
+ private onKeyUp;
32
+ private onPlace;
33
+ private onDelPrev;
34
+ }
package/dist/index.esm.js CHANGED
@@ -1,218 +1 @@
1
- import { Vector3, Box3 } from 'three';
2
-
3
- const helperId = 'followMouseBoxHelper';
4
- class FollowMousePlugin {
5
- constructor(ssp) {
6
- this.ssp = ssp;
7
- this.mouseDownModelPosition = new Vector3();
8
- this.object = null;
9
- this.objectBbox = new Box3(new Vector3, new Vector3);
10
- this.objectSourcePosition = new Vector3;
11
- this.sceneMesh = [];
12
- this.helper = null;
13
- this.placedObject = [];
14
- this.options = {};
15
- this.onMouseMove = this.onMouseMove.bind(this);
16
- this.onMouseDown = this.onMouseDown.bind(this);
17
- this.onClick = this.onClick.bind(this);
18
- this.onRightClick = this.onRightClick.bind(this);
19
- this.onDblClick = this.onDblClick.bind(this);
20
- this.onKeyUp = this.onKeyUp.bind(this);
21
- }
22
- start(object, options = {}) {
23
- this.options = options;
24
- this.object = object;
25
- this.objectBbox.setFromObject(object);
26
- this.objectSourcePosition.copy(object.position.clone());
27
- // all visible meshes
28
- this.sceneMesh =
29
- this.ssp.viewport.scener.intersectsList.getAll()
30
- .filter(o => {
31
- let visible = o.visible;
32
- o.traverseAncestors(p => {
33
- if (p.visible === false)
34
- visible = false;
35
- });
36
- return visible;
37
- });
38
- const { openHelper = true, helperColor = 0xffff00, } = this.options;
39
- if (openHelper && this.object.stype === 'Model') {
40
- object.updateWorldMatrix(true, true);
41
- this.helper = this.ssp.addBoxHelper({
42
- id: helperId,
43
- box: this.objectBbox,
44
- color: helperColor,
45
- });
46
- this.ssp.signals.sceneChanged.dispatch();
47
- }
48
- object.traverse(child => {
49
- const index = this.sceneMesh.findIndex(mesh => mesh.uuid === child.uuid);
50
- if (index !== -1)
51
- this.sceneMesh.splice(index, 1);
52
- });
53
- this.ssp.signals.mouseMove.add(this.onMouseMove);
54
- this.ssp.signals.mouseDown.add(this.onMouseDown);
55
- this.ssp.signals.click.add(this.onClick);
56
- this.ssp.signals.rightClick.add(this.onRightClick);
57
- this.ssp.signals.dblClick.add(this.onDblClick);
58
- this.ssp.signals.keyUp.add(this.onKeyUp);
59
- }
60
- stop() {
61
- var _a;
62
- (_a = this.object) === null || _a === void 0 ? void 0 : _a.position.copy(this.objectSourcePosition.clone());
63
- this.ssp.removeObjectById(helperId);
64
- this.object = null;
65
- this.objectBbox = new Box3(new Vector3, new Vector3);
66
- this.objectSourcePosition = new Vector3;
67
- this.sceneMesh = [];
68
- this.helper = null;
69
- this.placedObject = [];
70
- this.options = {};
71
- this.mouseDownModelPosition = new Vector3();
72
- this.ssp.signals.mouseMove.remove(this.onMouseMove);
73
- this.ssp.signals.mouseDown.remove(this.onMouseDown);
74
- this.ssp.signals.click.remove(this.onClick);
75
- this.ssp.signals.dblClick.remove(this.onDblClick);
76
- this.ssp.signals.keyUp.remove(this.onKeyUp);
77
- }
78
- onMouseMove(e) {
79
- e.preventDefault();
80
- if (!this.object)
81
- return;
82
- const { offset = new Vector3(1, 1, 1), } = this.options;
83
- const intersects = this.ssp.viewport.getIntersects(e, this.sceneMesh);
84
- const objectWorldPos = this.object.getWorldPosition(new Vector3);
85
- const posDiff = objectWorldPos.sub(this.object.position);
86
- const nextWorldPosition = new Vector3();
87
- let adsorbAxis = 'y';
88
- if (intersects.length > 0) {
89
- const { point, face, } = intersects[0];
90
- nextWorldPosition.copy(point.clone());
91
- if (face) {
92
- const { normal, } = face;
93
- // x
94
- if (normal.y === 0 && normal.z === 0) {
95
- if (normal.x === 1)
96
- adsorbAxis = 'x';
97
- else if (normal.x === -1)
98
- adsorbAxis = '-x';
99
- }
100
- // y
101
- if (normal.x === 0 && normal.z === 0) {
102
- if (normal.y === 1)
103
- adsorbAxis = 'y';
104
- else if (normal.y === -1)
105
- adsorbAxis = '-y';
106
- }
107
- // z
108
- if (normal.x === 0 && normal.y === 0) {
109
- if (normal.z === 1)
110
- adsorbAxis = 'z';
111
- else if (normal.z === -1)
112
- adsorbAxis = '-z';
113
- }
114
- }
115
- }
116
- else {
117
- nextWorldPosition.copy(this.ssp.getPositionByOffset(e, 0.1));
118
- }
119
- const objectNextPosition = nextWorldPosition.sub(posDiff);
120
- const objectSize = this.objectBbox.getSize(new Vector3);
121
- switch (adsorbAxis) {
122
- case 'x':
123
- objectNextPosition.setX(objectNextPosition.x + objectSize.x / 2 + offset.x);
124
- break;
125
- case '-x':
126
- objectNextPosition.setX(objectNextPosition.x - objectSize.x / 2 - offset.x);
127
- break;
128
- case 'y':
129
- objectNextPosition.setY(objectNextPosition.y + offset.y);
130
- break;
131
- case '-y':
132
- objectNextPosition.setY(objectNextPosition.y - objectSize.y - offset.y);
133
- break;
134
- case 'z':
135
- objectNextPosition.setZ(objectNextPosition.z + objectSize.z / 2 + offset.z);
136
- break;
137
- case '-z':
138
- objectNextPosition.setZ(objectNextPosition.z - objectSize.z / 2 - offset.z);
139
- break;
140
- }
141
- this.object.position.copy(objectNextPosition).setY(objectNextPosition.y);
142
- if (this.helper)
143
- this.helper.box.copy(new Box3(new Vector3, new Vector3).setFromObject(this.object));
144
- this.ssp.signals.sceneChanged.dispatch();
145
- }
146
- onMouseDown(e) {
147
- this.object && this.mouseDownModelPosition.copy(this.object.getWorldPosition(new Vector3));
148
- }
149
- onClick(e) {
150
- this.onPlace();
151
- }
152
- onRightClick(e) {
153
- this.onDelPrev();
154
- }
155
- async onDblClick(e) {
156
- await this.onPlace();
157
- this.options.onDone && this.options.onDone(this.placedObject);
158
- this.stop();
159
- }
160
- onKeyUp(e) {
161
- switch (e.code) {
162
- case 'Backspace':
163
- this.onDelPrev();
164
- break;
165
- case 'Enter':
166
- this.options.onDone && this.options.onDone(this.placedObject);
167
- this.stop();
168
- break;
169
- case 'Escape':
170
- this.options.onCancel && this.options.onCancel();
171
- this.stop();
172
- break;
173
- }
174
- }
175
- async onPlace() {
176
- var _a, _b, _c, _d;
177
- if (((_a = this.object) === null || _a === void 0 ? void 0 : _a.stype) === 'Model') {
178
- return this.ssp
179
- .cloneModel(this.object, {
180
- id: `clone_${this.object.sid}_${this.placedObject.length + 1}`,
181
- position: this.mouseDownModelPosition.clone(),
182
- })
183
- .then(model => {
184
- var _a, _b;
185
- this.placedObject.push(model);
186
- (_b = (_a = this.options).onPlace) === null || _b === void 0 ? void 0 : _b.call(_a, model);
187
- });
188
- }
189
- // Poi
190
- else if (((_b = this.object) === null || _b === void 0 ? void 0 : _b.stype) === 'Poi') {
191
- const poi = this.ssp.clonePoi(this.object, {
192
- id: `clone_${this.object.sid}_${this.placedObject.length + 1}`,
193
- position: this.mouseDownModelPosition.clone(),
194
- });
195
- if (poi) {
196
- this.placedObject.push(poi);
197
- (_d = (_c = this.options).onPlace) === null || _d === void 0 ? void 0 : _d.call(_c, poi);
198
- }
199
- else {
200
- return Promise.reject('In soonspacejs: 插件(plugin-follow-mouse)摆放 Poi 对象时错误!');
201
- }
202
- }
203
- else {
204
- return Promise.reject('In soonspacejs: 插件(plugin-follow-mouse)传入对象类型错误,仅支持 sbm、model、poi !');
205
- }
206
- }
207
- onDelPrev() {
208
- if (this.placedObject.length === 0)
209
- return;
210
- const delObj = this.placedObject[this.placedObject.length - 1];
211
- this.ssp.removeObject(delObj);
212
- this.placedObject.splice(this.placedObject.length - 1, 1);
213
- this.options.onBack && this.options.onBack(delObj);
214
- }
215
- }
216
-
217
- export { FollowMousePlugin as default };
218
- //# sourceMappingURL=index.esm.js.map
1
+ import{Vector3 as s,Box3 as e}from"three";const t="followMouseBoxHelper";class o{constructor(t){this.ssp=t,this.mouseDownModelPosition=new s,this.object=null,this.objectBbox=new e(new s,new s),this.objectSourcePosition=new s,this.sceneMesh=[],this.helper=null,this.placedObject=[],this.options={},this.onMouseMove=this.onMouseMove.bind(this),this.onMouseDown=this.onMouseDown.bind(this),this.onClick=this.onClick.bind(this),this.onRightClick=this.onRightClick.bind(this),this.onDblClick=this.onDblClick.bind(this),this.onKeyUp=this.onKeyUp.bind(this)}start(s,e={}){this.options=e,this.object=s,this.objectBbox.setFromObject(s),this.objectSourcePosition.copy(s.position.clone()),this.sceneMesh=this.ssp.viewport.scener.intersectsList.getAll().filter((s=>{let e=s.visible;return s.traverseAncestors((s=>{!1===s.visible&&(e=!1)})),e}));const{openHelper:o=!0,helperColor:i=16776960}=this.options;o&&"Model"===this.object.stype&&(s.updateWorldMatrix(!0,!0),this.helper=this.ssp.addBoxHelper({id:t,box:this.objectBbox,color:i}),this.ssp.signals.sceneChanged.dispatch()),s.traverse((s=>{const e=this.sceneMesh.findIndex((e=>e.uuid===s.uuid));-1!==e&&this.sceneMesh.splice(e,1)})),this.ssp.signals.mouseMove.add(this.onMouseMove),this.ssp.signals.mouseDown.add(this.onMouseDown),this.ssp.signals.click.add(this.onClick),this.ssp.signals.rightClick.add(this.onRightClick),this.ssp.signals.dblClick.add(this.onDblClick),this.ssp.signals.keyUp.add(this.onKeyUp)}stop(){var o;null===(o=this.object)||void 0===o||o.position.copy(this.objectSourcePosition.clone()),this.ssp.removeObjectById(t),this.object=null,this.objectBbox=new e(new s,new s),this.objectSourcePosition=new s,this.sceneMesh=[],this.helper=null,this.placedObject=[],this.options={},this.mouseDownModelPosition=new s,this.ssp.signals.mouseMove.remove(this.onMouseMove),this.ssp.signals.mouseDown.remove(this.onMouseDown),this.ssp.signals.click.remove(this.onClick),this.ssp.signals.dblClick.remove(this.onDblClick),this.ssp.signals.keyUp.remove(this.onKeyUp)}onMouseMove(t){if(t.preventDefault(),!this.object)return;const{offset:o=new s(1,1,1)}=this.options,i=this.ssp.viewport.getIntersects(t,this.sceneMesh),n=this.object.getWorldPosition(new s).sub(this.object.position),h=new s;let c="y";if(i.length>0){const{point:s,face:e}=i[0];if(h.copy(s.clone()),e){const{normal:s}=e;0===s.y&&0===s.z&&(1===s.x?c="x":-1===s.x&&(c="-x")),0===s.x&&0===s.z&&(1===s.y?c="y":-1===s.y&&(c="-y")),0===s.x&&0===s.y&&(1===s.z?c="z":-1===s.z&&(c="-z"))}}else h.copy(this.ssp.getPositionByOffset(t,.1));const l=h.sub(n),p=this.objectBbox.getSize(new s);switch(c){case"x":l.setX(l.x+p.x/2+o.x);break;case"-x":l.setX(l.x-p.x/2-o.x);break;case"y":l.setY(l.y+o.y);break;case"-y":l.setY(l.y-p.y-o.y);break;case"z":l.setZ(l.z+p.z/2+o.z);break;case"-z":l.setZ(l.z-p.z/2-o.z)}this.object.position.copy(l).setY(l.y),this.helper&&this.helper.box.copy(new e(new s,new s).setFromObject(this.object)),this.ssp.signals.sceneChanged.dispatch()}onMouseDown(e){this.object&&this.mouseDownModelPosition.copy(this.object.getWorldPosition(new s))}onClick(s){this.onPlace()}onRightClick(s){this.onDelPrev()}async onDblClick(s){await this.onPlace(),this.options.onDone&&this.options.onDone(this.placedObject),this.stop()}onKeyUp(s){switch(s.code){case"Backspace":this.onDelPrev();break;case"Enter":this.options.onDone&&this.options.onDone(this.placedObject),this.stop();break;case"Escape":this.options.onCancel&&this.options.onCancel(),this.stop()}}async onPlace(){var s,e,t,o;if("Model"===(null===(s=this.object)||void 0===s?void 0:s.stype))return this.ssp.cloneModel(this.object,{id:`clone_${this.object.sid}_${this.placedObject.length+1}`,position:this.mouseDownModelPosition.clone()}).then((s=>{var e,t;this.placedObject.push(s),null===(t=(e=this.options).onPlace)||void 0===t||t.call(e,s)}));if("Poi"!==(null===(e=this.object)||void 0===e?void 0:e.stype))return Promise.reject("In soonspacejs: 插件(plugin-follow-mouse)传入对象类型错误,仅支持 sbm、model、poi !");{const s=this.ssp.clonePoi(this.object,{id:`clone_${this.object.sid}_${this.placedObject.length+1}`,position:this.mouseDownModelPosition.clone()});if(!s)return Promise.reject("In soonspacejs: 插件(plugin-follow-mouse)摆放 Poi 对象时错误!");this.placedObject.push(s),null===(o=(t=this.options).onPlace)||void 0===o||o.call(t,s)}}onDelPrev(){if(0===this.placedObject.length)return;const s=this.placedObject[this.placedObject.length-1];this.ssp.removeObject(s),this.placedObject.splice(this.placedObject.length-1,1),this.options.onBack&&this.options.onBack(s)}}export{o as default};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@soonspacejs/plugin-follow-mouse",
3
3
  "pluginName": "FollowMousePlugin",
4
- "version": "2.13.7",
4
+ "version": "2.13.9",
5
5
  "description": "Scene object follow mouse 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": "550040550bf20ec0015982ff1159d0cfe9b35ed3",
16
+ "gitHead": "a5596909f48bd136905b85f239e13690f9f2c66e",
17
17
  "peerDependencies": {
18
- "soonspacejs": "2.13.7"
18
+ "soonspacejs": "2.13.9"
19
19
  }
20
20
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"sourcesContent":["import { Box3, Object3D, Vector3, Box3Helper, } from 'three'\r\nimport SoonSpace, { IColor, AxisType, } from 'soonspacejs'\r\nimport type { BaseObject3D, Model, Poi, } from 'soonspacejs'\r\n\r\nconst helperId = 'followMouseBoxHelper'\r\n\r\ntype AdsorbAxisType = AxisType | '-x' | '-y' | '-z'\r\n\r\nexport interface StartOptions {\r\n offset?: Vector3;\r\n openHelper?: boolean;\r\n helperColor?: IColor;\r\n onPlace?: ( object: BaseObject3D ) => void;\r\n onDone?: ( objects: BaseObject3D[] ) => void;\r\n onBack?: ( object: BaseObject3D ) => void;\r\n onCancel?: () => void;\r\n}\r\n\r\nexport default class FollowMousePlugin {\r\n\r\n private object: BaseObject3D | null\r\n private objectBbox: Box3\r\n private objectSourcePosition: Vector3\r\n\r\n private sceneMesh: Object3D[]\r\n private helper: Box3Helper | null\r\n private placedObject: BaseObject3D[]\r\n\r\n private options: StartOptions\r\n\r\n private mouseDownModelPosition = new Vector3()\r\n\r\n constructor ( private readonly ssp: SoonSpace ) {\r\n\r\n this.object = null\r\n this.objectBbox = new Box3( new Vector3, new Vector3 )\r\n this.objectSourcePosition = new Vector3\r\n\r\n this.sceneMesh = []\r\n this.helper = null\r\n this.placedObject = []\r\n\r\n this.options = {}\r\n\r\n this.onMouseMove = this.onMouseMove.bind( this )\r\n this.onMouseDown = this.onMouseDown.bind( this )\r\n this.onClick = this.onClick.bind( this )\r\n this.onRightClick = this.onRightClick.bind( this )\r\n this.onDblClick = this.onDblClick.bind( this )\r\n this.onKeyUp = this.onKeyUp.bind( this )\r\n\r\n }\r\n\r\n start ( object: BaseObject3D, options: StartOptions = {} ) {\r\n\r\n this.options = options\r\n\r\n this.object = object\r\n this.objectBbox.setFromObject( object )\r\n\r\n this.objectSourcePosition.copy( object.position.clone() )\r\n\r\n // all visible meshes\r\n this.sceneMesh = \r\n this.ssp.viewport.scener.intersectsList.getAll()\r\n .filter( o => {\r\n\r\n let visible = o.visible\r\n\r\n o.traverseAncestors( p => {\r\n \r\n if ( p.visible === false ) visible = false\r\n \r\n } )\r\n\r\n return visible\r\n \r\n } )\r\n\r\n const {\r\n openHelper = true,\r\n helperColor = 0xffff00,\r\n } = this.options\r\n\r\n if ( openHelper && this.object.stype === 'Model' ) {\r\n\r\n object.updateWorldMatrix( true, true )\r\n\r\n this.helper = this.ssp.addBoxHelper( {\r\n id: helperId,\r\n box: this.objectBbox,\r\n color: helperColor,\r\n } )\r\n \r\n this.ssp.signals.sceneChanged.dispatch()\r\n \r\n }\r\n\r\n object.traverse( child => {\r\n\r\n const index = this.sceneMesh.findIndex( mesh => mesh.uuid === child.uuid )\r\n\r\n if ( index !== -1 ) this.sceneMesh.splice( index, 1 )\r\n \r\n } )\r\n\r\n this.ssp.signals.mouseMove.add( this.onMouseMove )\r\n this.ssp.signals.mouseDown.add( this.onMouseDown )\r\n this.ssp.signals.click.add( this.onClick )\r\n this.ssp.signals.rightClick.add( this.onRightClick )\r\n this.ssp.signals.dblClick.add( this.onDblClick )\r\n this.ssp.signals.keyUp.add( this.onKeyUp )\r\n \r\n }\r\n\r\n private stop () {\r\n\r\n this.object?.position.copy( this.objectSourcePosition.clone() )\r\n this.ssp.removeObjectById( helperId )\r\n\r\n this.object = null\r\n this.objectBbox = new Box3( new Vector3, new Vector3 )\r\n this.objectSourcePosition = new Vector3\r\n\r\n this.sceneMesh = []\r\n this.helper = null\r\n this.placedObject = []\r\n\r\n this.options = {}\r\n\r\n this.mouseDownModelPosition = new Vector3()\r\n\r\n this.ssp.signals.mouseMove.remove( this.onMouseMove )\r\n this.ssp.signals.mouseDown.remove( this.onMouseDown )\r\n this.ssp.signals.click.remove( this.onClick )\r\n this.ssp.signals.dblClick.remove( this.onDblClick )\r\n this.ssp.signals.keyUp.remove( this.onKeyUp )\r\n \r\n }\r\n\r\n private onMouseMove ( e: MouseEvent ) {\r\n\r\n e.preventDefault()\r\n\r\n if ( !this.object ) return\r\n\r\n const {\r\n offset = new Vector3( 1, 1, 1 ),\r\n } = this.options\r\n\r\n const intersects = this.ssp.viewport.getIntersects( e, this.sceneMesh )\r\n\r\n const objectWorldPos = this.object.getWorldPosition( new Vector3 )\r\n const posDiff = objectWorldPos.sub( this.object.position )\r\n\r\n const nextWorldPosition = new Vector3()\r\n\r\n let adsorbAxis: AdsorbAxisType = 'y'\r\n\r\n if ( intersects.length > 0 ) {\r\n\r\n const { point, face, } = intersects[ 0 ]\r\n\r\n nextWorldPosition.copy( point.clone() )\r\n\r\n if ( face ) {\r\n\r\n const { normal, } = face\r\n\r\n // x\r\n if ( normal.y === 0 && normal.z === 0 ) {\r\n\r\n if ( normal.x === 1 ) adsorbAxis = 'x'\r\n else if ( normal.x === -1 ) adsorbAxis = '-x'\r\n \r\n }\r\n\r\n // y\r\n if ( normal.x === 0 && normal.z === 0 ) {\r\n\r\n if ( normal.y === 1 ) adsorbAxis = 'y'\r\n else if ( normal.y === -1 ) adsorbAxis = '-y'\r\n \r\n }\r\n\r\n // z\r\n if ( normal.x === 0 && normal.y === 0 ) {\r\n\r\n if ( normal.z === 1 ) adsorbAxis = 'z'\r\n else if ( normal.z === -1 ) adsorbAxis = '-z'\r\n \r\n }\r\n\r\n }\r\n\r\n } else {\r\n\r\n nextWorldPosition.copy( this.ssp.getPositionByOffset( e, 0.1 ) )\r\n \r\n }\r\n\r\n const objectNextPosition = nextWorldPosition.sub( posDiff )\r\n const objectSize = this.objectBbox.getSize( new Vector3 )\r\n\r\n switch ( adsorbAxis ) {\r\n\r\n case 'x':\r\n objectNextPosition.setX( objectNextPosition.x + objectSize.x / 2 + offset.x )\r\n break\r\n case '-x':\r\n objectNextPosition.setX( objectNextPosition.x - objectSize.x / 2 - offset.x )\r\n break\r\n case 'y':\r\n objectNextPosition.setY( objectNextPosition.y + offset.y )\r\n break\r\n case '-y':\r\n objectNextPosition.setY( objectNextPosition.y - objectSize.y - offset.y )\r\n break\r\n case 'z':\r\n objectNextPosition.setZ( objectNextPosition.z + objectSize.z / 2 + offset.z )\r\n break\r\n case '-z':\r\n objectNextPosition.setZ( objectNextPosition.z - objectSize.z / 2 - offset.z )\r\n break\r\n \r\n }\r\n\r\n this.object.position.copy( objectNextPosition ).setY( objectNextPosition.y )\r\n if ( this.helper ) this.helper.box.copy( new Box3( new Vector3, new Vector3 ).setFromObject( this.object ) )\r\n\r\n this.ssp.signals.sceneChanged.dispatch()\r\n \r\n }\r\n\r\n private onMouseDown ( e: MouseEvent ) {\r\n\r\n this.object && this.mouseDownModelPosition.copy( this.object.getWorldPosition( new Vector3 ) )\r\n \r\n }\r\n\r\n private onClick ( e: MouseEvent ) {\r\n\r\n this.onPlace()\r\n \r\n }\r\n\r\n private onRightClick ( e: MouseEvent ) {\r\n\r\n this.onDelPrev()\r\n \r\n }\r\n\r\n private async onDblClick ( e: MouseEvent ) {\r\n\r\n await this.onPlace()\r\n this.options.onDone && this.options.onDone( this.placedObject )\r\n this.stop()\r\n \r\n }\r\n\r\n private onKeyUp ( e: KeyboardEvent ) {\r\n\r\n switch ( e.code ) {\r\n\r\n case 'Backspace':\r\n this.onDelPrev()\r\n break\r\n case 'Enter':\r\n this.options.onDone && this.options.onDone( this.placedObject )\r\n this.stop()\r\n break\r\n case 'Escape':\r\n this.options.onCancel && this.options.onCancel()\r\n this.stop()\r\n break\r\n \r\n }\r\n \r\n }\r\n\r\n private async onPlace (): Promise<void> {\r\n\r\n if ( this.object?.stype === 'Model' ) {\r\n\r\n return this.ssp\r\n .cloneModel(\r\n this.object as Model,\r\n {\r\n id: `clone_${this.object.sid}_${this.placedObject.length + 1}`,\r\n position: this.mouseDownModelPosition.clone(),\r\n }\r\n )\r\n .then( model => {\r\n\r\n this.placedObject.push( model )\r\n this.options.onPlace?.( model )\r\n \r\n } )\r\n \r\n }\r\n // Poi\r\n else if ( this.object?.stype === 'Poi' ) {\r\n\r\n const poi = this.ssp.clonePoi( this.object as Poi, {\r\n id: `clone_${this.object.sid}_${this.placedObject.length + 1}`,\r\n position: this.mouseDownModelPosition.clone(),\r\n } )\r\n\r\n if ( poi ) {\r\n\r\n this.placedObject.push( poi )\r\n this.options.onPlace?.( poi )\r\n \r\n } else {\r\n\r\n return Promise.reject( 'In soonspacejs: 插件(plugin-follow-mouse)摆放 Poi 对象时错误!' )\r\n \r\n }\r\n\r\n }\r\n else {\r\n\r\n return Promise.reject( 'In soonspacejs: 插件(plugin-follow-mouse)传入对象类型错误,仅支持 sbm、model、poi !' )\r\n \r\n }\r\n \r\n }\r\n\r\n private onDelPrev () {\r\n\r\n if ( this.placedObject.length === 0 ) return\r\n\r\n const delObj = this.placedObject[ this.placedObject.length - 1 ]\r\n\r\n this.ssp.removeObject( delObj )\r\n\r\n this.placedObject.splice( this.placedObject.length - 1, 1 )\r\n\r\n this.options.onBack && this.options.onBack( delObj )\r\n \r\n }\r\n\r\n}\r\n"],"names":[],"mappings":"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"}