@shopware-ag/dive 1.15.3 → 1.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/build/dive.cjs +132 -118
- package/build/dive.cjs.map +1 -1
- package/build/dive.d.cts +30 -19
- package/build/dive.d.ts +30 -19
- package/build/dive.js +135 -121
- package/build/dive.js.map +1 -1
- package/package.json +1 -1
- package/src/group/Group.ts +116 -68
- package/src/group/__test__/Group.test.ts +20 -4
- package/src/helper/applyMixins/__test__/applyMixins.test.ts +3 -3
- package/src/helper/findInterface/__test__/findInterface.test.ts +53 -0
- package/src/helper/findInterface/findInterface.ts +10 -0
- package/src/helper/getObjectDelta/__test__/getObjectDelta.test.ts +0 -2
- package/src/helper/isInterface/__test__/implementsInterface.test.ts +19 -0
- package/src/helper/isInterface/implementsInterface.ts +6 -0
- package/src/interface/Draggable.ts +0 -20
- package/src/interface/Hoverable.ts +1 -20
- package/src/interface/Movable.ts +12 -0
- package/src/interface/Selectable.ts +0 -23
- package/src/light/PointLight.ts +3 -3
- package/src/node/Node.ts +8 -3
- package/src/node/__test__/Node.test.ts +4 -0
- package/src/scene/root/Root.ts +1 -1
- package/src/scene/root/__test__/Root.test.ts +4 -2
- package/src/toolbox/BaseTool.ts +5 -4
- package/src/toolbox/select/SelectTool.ts +7 -6
- package/src/toolbox/select/__test__/SelectTool.test.ts +3 -3
- package/src/toolbox/transform/TransformTool.ts +19 -8
- package/src/toolbox/transform/__test__/TransformTool.test.ts +4 -2
- package/src/interface/Moveable.ts +0 -11
- package/src/interface/__test__/Interfaces.test.ts +0 -87
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { type Object3D } from "three";
|
|
2
2
|
import { DIVEScene } from "../../scene/Scene.ts";
|
|
3
3
|
import DIVETransformTool from "../transform/TransformTool.ts";
|
|
4
|
+
import { findInterface } from "../../helper/findInterface/findInterface.ts";
|
|
4
5
|
import type DIVEOrbitControls from "../../controls/OrbitControls.ts";
|
|
5
|
-
import { type DIVESelectable
|
|
6
|
-
import { type
|
|
6
|
+
import { type DIVESelectable } from "../../interface/Selectable.ts";
|
|
7
|
+
import { type DIVEMovable } from "../../interface/Movable.ts";
|
|
7
8
|
import { type DIVEBaseTool } from "../BaseTool.ts";
|
|
8
9
|
|
|
9
10
|
export const isSelectTool = (tool: DIVEBaseTool): tool is DIVESelectTool => {
|
|
@@ -17,7 +18,7 @@ export interface DIVEObjectEventMap {
|
|
|
17
18
|
/**
|
|
18
19
|
* A Tool to select and move objects in the scene.
|
|
19
20
|
*
|
|
20
|
-
* Objects have to implement the DIVESelectable interface to be selectable and
|
|
21
|
+
* Objects have to implement the DIVESelectable interface to be selectable and DIVEMovable to be movable.
|
|
21
22
|
*
|
|
22
23
|
* @module
|
|
23
24
|
*/
|
|
@@ -46,8 +47,8 @@ export class DIVESelectTool extends DIVETransformTool {
|
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
public AttachGizmo(selectable: DIVESelectable): void {
|
|
49
|
-
if ('
|
|
50
|
-
const movable = selectable as (Object3D & DIVESelectable &
|
|
50
|
+
if ('isMovable' in selectable) {
|
|
51
|
+
const movable = selectable as (Object3D & DIVESelectable & DIVEMovable);
|
|
51
52
|
this._gizmo.attach(movable);
|
|
52
53
|
this.SetGizmoVisibility(movable.visible);
|
|
53
54
|
}
|
|
@@ -61,7 +62,7 @@ export class DIVESelectTool extends DIVETransformTool {
|
|
|
61
62
|
super.onClick(e);
|
|
62
63
|
|
|
63
64
|
const first = this._raycaster.intersectObjects(this._scene.Root.children, true).filter((intersect) => intersect.object.visible)[0];
|
|
64
|
-
const selectable =
|
|
65
|
+
const selectable = findInterface<DIVESelectable>(first?.object, 'isSelectable');
|
|
65
66
|
|
|
66
67
|
// if nothing is hit
|
|
67
68
|
if (!first || !selectable) {
|
|
@@ -234,7 +234,7 @@ describe('dive/toolbox/select/DIVESelectTool', () => {
|
|
|
234
234
|
mock_intersectObjects.mockReturnValueOnce([{
|
|
235
235
|
object: {
|
|
236
236
|
isSelectable: true,
|
|
237
|
-
|
|
237
|
+
isMovable: true,
|
|
238
238
|
onSelect: mock_onSelect,
|
|
239
239
|
parent: {
|
|
240
240
|
name: 'this is the test scene root!!!',
|
|
@@ -250,7 +250,7 @@ describe('dive/toolbox/select/DIVESelectTool', () => {
|
|
|
250
250
|
const selectTool = new DIVESelectTool(mockScene, mockController);
|
|
251
251
|
const mock_onSelect = jest.fn();
|
|
252
252
|
expect(() => selectTool.Select({ isSelectable: true })).not.toThrow();
|
|
253
|
-
expect(() => selectTool.Select({
|
|
253
|
+
expect(() => selectTool.Select({ isMovable: true, onSelect: mock_onSelect } as unknown as DIVESelectable)).not.toThrow();
|
|
254
254
|
expect(mock_onSelect).toHaveBeenCalledTimes(1);
|
|
255
255
|
});
|
|
256
256
|
|
|
@@ -258,7 +258,7 @@ describe('dive/toolbox/select/DIVESelectTool', () => {
|
|
|
258
258
|
const selectTool = new DIVESelectTool(mockScene, mockController);
|
|
259
259
|
const mock_onDeselect = jest.fn();
|
|
260
260
|
expect(() => selectTool.Deselect({ isSelectable: true })).not.toThrow();
|
|
261
|
-
expect(() => selectTool.Deselect({
|
|
261
|
+
expect(() => selectTool.Deselect({ isMovable: true, onDeselect: mock_onDeselect } as unknown as DIVESelectable)).not.toThrow();
|
|
262
262
|
expect(mock_onDeselect).toHaveBeenCalledTimes(1);
|
|
263
263
|
});
|
|
264
264
|
|
|
@@ -2,7 +2,8 @@ import { DIVEBaseTool } from "../BaseTool.ts";
|
|
|
2
2
|
import { DIVEScene } from "../../scene/Scene.ts";
|
|
3
3
|
import DIVEOrbitControls from "../../controls/OrbitControls.ts";
|
|
4
4
|
import { TransformControls } from "three/examples/jsm/Addons";
|
|
5
|
-
import { type
|
|
5
|
+
import { type DIVEMovable } from "../../interface/Movable.ts";
|
|
6
|
+
import { implementsInterface } from "../../helper/isInterface/implementsInterface.ts";
|
|
6
7
|
|
|
7
8
|
export const isTransformTool = (tool: DIVEBaseTool): tool is DIVETransformTool => {
|
|
8
9
|
return (tool as DIVETransformTool).isTransformTool !== undefined;
|
|
@@ -15,7 +16,7 @@ export interface DIVEObjectEventMap {
|
|
|
15
16
|
/**
|
|
16
17
|
* A Tool to select and move objects in the scene.
|
|
17
18
|
*
|
|
18
|
-
* Objects have to implement the DIVESelectable interface to be selectable and
|
|
19
|
+
* Objects have to implement the DIVESelectable interface to be selectable and DIVEMovable to be movable.
|
|
19
20
|
*
|
|
20
21
|
* @module
|
|
21
22
|
*/
|
|
@@ -32,19 +33,29 @@ export default class DIVETransformTool extends DIVEBaseTool {
|
|
|
32
33
|
this._gizmo = new TransformControls(this._controller.object, this._controller.domElement);
|
|
33
34
|
this._gizmo.mode = 'translate';
|
|
34
35
|
|
|
36
|
+
// happens when pointerDown event is called on gizmo
|
|
35
37
|
this._gizmo.addEventListener('mouseDown', () => {
|
|
36
38
|
controller.enabled = false;
|
|
39
|
+
|
|
40
|
+
if (!implementsInterface<DIVEMovable>(this._gizmo.object, 'isMovable')) return;
|
|
41
|
+
if (!this._gizmo.object.onMoveStart) return;
|
|
42
|
+
this._gizmo.object.onMoveStart();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// happens when pointerMove event is called on gizmo
|
|
46
|
+
this._gizmo.addEventListener('objectChange', () => {
|
|
47
|
+
if (!implementsInterface<DIVEMovable>(this._gizmo.object, 'isMovable')) return;
|
|
48
|
+
if (!this._gizmo.object.onMove) return;
|
|
49
|
+
this._gizmo.object.onMove();
|
|
37
50
|
});
|
|
38
51
|
|
|
52
|
+
// happens when pointerUp event is called on gizmo
|
|
39
53
|
this._gizmo.addEventListener('mouseUp', () => {
|
|
40
54
|
controller.enabled = true;
|
|
41
|
-
});
|
|
42
55
|
|
|
43
|
-
|
|
44
|
-
if (!this._gizmo.object) return;
|
|
45
|
-
|
|
46
|
-
if (!('onMove' in this._gizmo.object)) return;
|
|
47
|
-
(this._gizmo.object as DIVEMoveable).onMove!();
|
|
56
|
+
if (!implementsInterface<DIVEMovable>(this._gizmo.object, 'isMovable')) return;
|
|
57
|
+
if (!this._gizmo.object.onMoveEnd) return;
|
|
58
|
+
this._gizmo.object.onMoveEnd();
|
|
48
59
|
});
|
|
49
60
|
|
|
50
61
|
scene.add(this._gizmo);
|
|
@@ -108,12 +108,14 @@ jest.mock('three/examples/jsm/Addons.js', () => {
|
|
|
108
108
|
this.object = {};
|
|
109
109
|
callback({ value: false });
|
|
110
110
|
this.object = {
|
|
111
|
-
|
|
111
|
+
isMovable: true
|
|
112
112
|
};
|
|
113
113
|
callback({ value: false });
|
|
114
114
|
this.object = {
|
|
115
|
-
|
|
115
|
+
isMovable: true,
|
|
116
116
|
onMove: jest.fn(),
|
|
117
|
+
onMoveStart: jest.fn(),
|
|
118
|
+
onMoveEnd: jest.fn(),
|
|
117
119
|
};
|
|
118
120
|
callback({ value: false });
|
|
119
121
|
},
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { type Object3D } from 'three';
|
|
2
|
-
import * as Moveable_DEF from '../Moveable';
|
|
3
|
-
import * as Rotatable_DEF from '../Rotatable';
|
|
4
|
-
import * as Scalable_DEF from '../Scalable';
|
|
5
|
-
import * as Selectable_DEF from '../Selectable';
|
|
6
|
-
import * as Draggable_DEF from '../Draggable';
|
|
7
|
-
import * as Hoverable_DEF from '../Hoverable';
|
|
8
|
-
|
|
9
|
-
describe('interfaces', () => {
|
|
10
|
-
it('should be defined', () => {
|
|
11
|
-
expect(Moveable_DEF).toBeDefined();
|
|
12
|
-
expect(Rotatable_DEF).toBeDefined();
|
|
13
|
-
expect(Scalable_DEF).toBeDefined();
|
|
14
|
-
expect(Selectable_DEF).toBeDefined();
|
|
15
|
-
expect(Draggable_DEF).toBeDefined();
|
|
16
|
-
expect(Hoverable_DEF).toBeDefined();
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it('should identify Selectable', () => {
|
|
20
|
-
const Selectable = { isSelectable: true };
|
|
21
|
-
expect(Selectable_DEF.isSelectable(Selectable as unknown as Object3D)).toBe(true);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('should find Selectable', () => {
|
|
25
|
-
let Selectable = {
|
|
26
|
-
isSelectable: true,
|
|
27
|
-
} as unknown as Object3D & Selectable_DEF.DIVESelectable;
|
|
28
|
-
expect(Selectable_DEF.findSelectableInterface(Selectable as unknown as Object3D)).toBe(Selectable);
|
|
29
|
-
|
|
30
|
-
let parent = {
|
|
31
|
-
isSelectable: true,
|
|
32
|
-
}
|
|
33
|
-
Selectable = {
|
|
34
|
-
parent: parent,
|
|
35
|
-
} as unknown as Object3D & Selectable_DEF.DIVESelectable;
|
|
36
|
-
expect(Selectable_DEF.findSelectableInterface(Selectable as unknown as Object3D)).toBe(parent);
|
|
37
|
-
|
|
38
|
-
Selectable = { isSelectable: true, parent: null } as unknown as Object3D & Selectable_DEF.DIVESelectable;
|
|
39
|
-
expect(Selectable_DEF.findSelectableInterface(Selectable as unknown as Object3D)).toBe(undefined);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('should identify Draggable', () => {
|
|
43
|
-
const Draggable = { isDraggable: true };
|
|
44
|
-
expect(Draggable_DEF.isDraggable(Draggable as unknown as Object3D)).toBe(true);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('should find Draggable', () => {
|
|
48
|
-
let Draggable = {
|
|
49
|
-
isDraggable: true,
|
|
50
|
-
} as unknown as Object3D & Draggable_DEF.DIVEDraggable;
|
|
51
|
-
expect(Draggable_DEF.findDraggableInterface(Draggable as unknown as Object3D)).toBe(Draggable);
|
|
52
|
-
|
|
53
|
-
let parent = {
|
|
54
|
-
isDraggable: true,
|
|
55
|
-
}
|
|
56
|
-
Draggable = {
|
|
57
|
-
parent: parent,
|
|
58
|
-
} as unknown as Object3D & Draggable_DEF.DIVEDraggable;
|
|
59
|
-
expect(Draggable_DEF.findDraggableInterface(Draggable as unknown as Object3D)).toBe(parent);
|
|
60
|
-
|
|
61
|
-
Draggable = { isDraggable: true, parent: null } as unknown as Object3D & Draggable_DEF.DIVEDraggable;
|
|
62
|
-
expect(Draggable_DEF.findDraggableInterface(Draggable as unknown as Object3D)).toBe(undefined);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('should identify Hoverable', () => {
|
|
66
|
-
const Hoverable = { isHoverable: true };
|
|
67
|
-
expect(Hoverable_DEF.isHoverable(Hoverable as unknown as Object3D)).toBe(true);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('should find Hoverable', () => {
|
|
71
|
-
let Hoverable = {
|
|
72
|
-
isHoverable: true,
|
|
73
|
-
} as unknown as Object3D & Hoverable_DEF.DIVEHoverable;
|
|
74
|
-
expect(Hoverable_DEF.findHoverableInterface(Hoverable as unknown as Object3D)).toBe(Hoverable);
|
|
75
|
-
|
|
76
|
-
let parent = {
|
|
77
|
-
isHoverable: true,
|
|
78
|
-
}
|
|
79
|
-
Hoverable = {
|
|
80
|
-
parent: parent,
|
|
81
|
-
} as unknown as Object3D & Hoverable_DEF.DIVEHoverable;
|
|
82
|
-
expect(Hoverable_DEF.findHoverableInterface(Hoverable as unknown as Object3D)).toBe(parent);
|
|
83
|
-
|
|
84
|
-
Hoverable = { isHoverable: true, parent: null } as unknown as Object3D & Hoverable_DEF.DIVEHoverable;
|
|
85
|
-
expect(Hoverable_DEF.findHoverableInterface(Hoverable as unknown as Object3D)).toBe(undefined);
|
|
86
|
-
});
|
|
87
|
-
});
|