@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 +14 -14
- package/dist/index.d.ts +34 -0
- package/dist/index.esm.js +1 -218
- package/package.json +3 -3
- package/dist/index.esm.js.map +0 -1
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` 清空并取消摆放
|
package/dist/index.d.ts
ADDED
|
@@ -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 {
|
|
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.
|
|
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": "
|
|
16
|
+
"gitHead": "a5596909f48bd136905b85f239e13690f9f2c66e",
|
|
17
17
|
"peerDependencies": {
|
|
18
|
-
"soonspacejs": "2.13.
|
|
18
|
+
"soonspacejs": "2.13.9"
|
|
19
19
|
}
|
|
20
20
|
}
|
package/dist/index.esm.js.map
DELETED
|
@@ -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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"}
|