@soonspacejs/plugin-transform-controls 2.15.1 → 2.15.4
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 +10 -0
- package/dist/index.esm.js +34 -20
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,12 @@ import { Object3D } from 'three';
|
|
|
3
3
|
import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';
|
|
4
4
|
export interface StartOptions {
|
|
5
5
|
mode?: 'translate' | 'rotate' | 'scale';
|
|
6
|
+
/**
|
|
7
|
+
* 限制对象移动范围的 Object3D(例如通过 ssp.getObjectById / ssp.loadModel 获得的对象)
|
|
8
|
+
* 插件会实时从该对象取其世界包围盒作为允许范围,
|
|
9
|
+
* 并在 objectChange 时按照被控对象世界 bbox 的半尺寸将对象 clamp 在其中
|
|
10
|
+
*/
|
|
11
|
+
bounds?: Object3D;
|
|
6
12
|
onUpdate?: (object: Object3D) => void;
|
|
7
13
|
onDragStart?: (object: Object3D) => void;
|
|
8
14
|
onDragEnd?: (object: Object3D) => void;
|
|
@@ -16,5 +22,9 @@ export default class TransformControlsPlugin {
|
|
|
16
22
|
_getPreviousControl(): TransformControls | undefined;
|
|
17
23
|
close(control?: TransformControls | undefined): void;
|
|
18
24
|
closeAll(): void;
|
|
25
|
+
/**
|
|
26
|
+
* 动态更新指定控制器的移动范围来源对象(传 null 取消限制)
|
|
27
|
+
*/
|
|
28
|
+
setBounds(control?: TransformControls | undefined, bounds?: Object3D | null): void;
|
|
19
29
|
changeMode(control?: TransformControls | undefined, mode?: StartOptions['mode']): void;
|
|
20
30
|
}
|
package/dist/index.esm.js
CHANGED
|
@@ -1,24 +1,32 @@
|
|
|
1
|
-
import { Mesh as
|
|
2
|
-
import { TransformControls as
|
|
3
|
-
|
|
1
|
+
import { Box3 as y, Vector3 as p, Matrix4 as E, Mesh as P } from "three";
|
|
2
|
+
import { TransformControls as S } from "three/examples/jsm/controls/TransformControls.js";
|
|
3
|
+
const u = new y(), o = new y(), h = new p(), f = new p(), r = new p(), i = new p(), x = new p(), l = new p(), d = new E(), c = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
function v(s, e) {
|
|
5
|
+
return e.setFromObject(s), e.isEmpty() && (s.getWorldPosition(e.min), e.max.copy(e.min)), e;
|
|
6
|
+
}
|
|
7
|
+
function w(s, e) {
|
|
8
|
+
v(e, o), v(s, u), u.getCenter(h), u.getSize(f).multiplyScalar(0.5), r.addVectors(o.min, f), i.subVectors(o.max, f), r.x > i.x && (r.x = i.x = (o.min.x + o.max.x) * 0.5), r.y > i.y && (r.y = i.y = (o.min.y + o.max.y) * 0.5), r.z > i.z && (r.z = i.z = (o.min.z + o.max.z) * 0.5), x.copy(h).clamp(r, i), l.subVectors(x, h), !(l.x === 0 && l.y === 0 && l.z === 0) && (s.parent && (s.parent.updateWorldMatrix(!0, !1), d.copy(s.parent.matrixWorld).invert(), d.elements[12] = 0, d.elements[13] = 0, d.elements[14] = 0, l.applyMatrix4(d)), s.position.add(l));
|
|
9
|
+
}
|
|
10
|
+
class V {
|
|
4
11
|
constructor(e) {
|
|
5
12
|
this.ssp = e;
|
|
6
13
|
}
|
|
7
14
|
controls = /* @__PURE__ */ new Set();
|
|
8
|
-
start(e,
|
|
9
|
-
const { mode:
|
|
15
|
+
start(e, t = {}) {
|
|
16
|
+
const { mode: a = "translate", bounds: _, onUpdate: C, onDragStart: M, onDragEnd: z, onClose: B } = t, n = new S(
|
|
10
17
|
this.ssp.viewport.camera,
|
|
11
18
|
this.ssp.viewport.rendererManager.interactiveContainer
|
|
12
19
|
);
|
|
13
|
-
this.controls.add(
|
|
14
|
-
this.ssp.controls.enabled = !
|
|
15
|
-
}),
|
|
16
|
-
|
|
20
|
+
c.set(n, _ ?? null), this.controls.add(n), n.attach(e), n.mode = a, n.addEventListener("dragging-changed", (m) => {
|
|
21
|
+
this.ssp.controls.enabled = !m.value, m.value ? M?.(e) : z?.(e);
|
|
22
|
+
}), n.addEventListener("objectChange", () => {
|
|
23
|
+
const m = c.get(n) ?? null;
|
|
24
|
+
m && w(e, m), C?.(e), this.ssp.signals.objectChanged.dispatch(e);
|
|
17
25
|
});
|
|
18
|
-
const
|
|
19
|
-
return
|
|
20
|
-
|
|
21
|
-
}), this.ssp.viewport.scene.add(
|
|
26
|
+
const g = n.getHelper();
|
|
27
|
+
return g.addEventListener("removed", () => {
|
|
28
|
+
B?.();
|
|
29
|
+
}), this.ssp.viewport.scene.add(g), this.ssp.render(), n;
|
|
22
30
|
}
|
|
23
31
|
_getPreviousControl() {
|
|
24
32
|
return [...this.controls].at(-1);
|
|
@@ -26,19 +34,25 @@ class f {
|
|
|
26
34
|
close(e = this._getPreviousControl()) {
|
|
27
35
|
if (e) {
|
|
28
36
|
e.detach(), e.disconnect();
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}), this.ssp.removeObject(
|
|
37
|
+
const t = e.getHelper();
|
|
38
|
+
t.traverse(function(a) {
|
|
39
|
+
a instanceof P && (a.geometry && a.geometry.dispose(), a.material && a.material.dispose());
|
|
40
|
+
}), this.ssp.removeObject(t), c.delete(e), this.controls.delete(e);
|
|
33
41
|
}
|
|
34
42
|
}
|
|
35
43
|
closeAll() {
|
|
36
44
|
this.controls.forEach((e) => this.close(e)), this.controls.clear();
|
|
37
45
|
}
|
|
38
|
-
|
|
39
|
-
|
|
46
|
+
/**
|
|
47
|
+
* 动态更新指定控制器的移动范围来源对象(传 null 取消限制)
|
|
48
|
+
*/
|
|
49
|
+
setBounds(e = this._getPreviousControl(), t = null) {
|
|
50
|
+
e && (c.set(e, t), t && w(e.object, t));
|
|
51
|
+
}
|
|
52
|
+
changeMode(e = this._getPreviousControl(), t = "translate") {
|
|
53
|
+
e && e.mode !== t && (e.mode = t, this.ssp.signals.objectChanged.dispatch());
|
|
40
54
|
}
|
|
41
55
|
}
|
|
42
56
|
export {
|
|
43
|
-
|
|
57
|
+
V as default
|
|
44
58
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soonspacejs/plugin-transform-controls",
|
|
3
3
|
"pluginName": "TransformControlsPlugin",
|
|
4
|
-
"version": "2.15.
|
|
4
|
+
"version": "2.15.4",
|
|
5
5
|
"description": "Transform-controls plugin for SoonSpace.js",
|
|
6
6
|
"main": "dist/index.esm.js",
|
|
7
7
|
"module": "dist/index.esm.js",
|
|
@@ -15,6 +15,6 @@
|
|
|
15
15
|
"license": "UNLICENSED",
|
|
16
16
|
"gitHead": "4a87dd85050651088e11c3da777c49fab3db7e5d",
|
|
17
17
|
"peerDependencies": {
|
|
18
|
-
"soonspacejs": "2.15.
|
|
18
|
+
"soonspacejs": "2.15.4"
|
|
19
19
|
}
|
|
20
20
|
}
|