@shopware-ag/dive 1.2.0 → 1.3.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.
Files changed (39) hide show
  1. package/build/dive.cjs +288 -60
  2. package/build/dive.cjs.map +1 -1
  3. package/build/dive.d.cts +64 -6
  4. package/build/dive.d.ts +64 -6
  5. package/build/dive.js +289 -61
  6. package/build/dive.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/__test__/DIVE.test.ts +2 -0
  9. package/src/com/Communication.ts +6 -3
  10. package/src/com/__test__/Communication.test.ts +3 -6
  11. package/src/com/actions/object/getobjects.ts +2 -2
  12. package/src/dive.ts +7 -0
  13. package/src/gizmo/Gizmo.ts +130 -0
  14. package/src/gizmo/handles/AxisHandle.ts +124 -0
  15. package/src/gizmo/handles/RadialHandle.ts +119 -0
  16. package/src/gizmo/handles/ScaleHandle.ts +152 -0
  17. package/src/gizmo/plane/GizmoPlane.ts +85 -0
  18. package/src/gizmo/rotate/RotateGizmo.ts +95 -0
  19. package/src/gizmo/scale/ScaleGizmo.ts +97 -0
  20. package/src/gizmo/translate/TranslateGizmo.ts +88 -0
  21. package/src/interface/Draggable.ts +34 -0
  22. package/src/interface/Hoverable.ts +33 -0
  23. package/src/interface/Moveable.ts +0 -2
  24. package/src/interface/Selectable.ts +6 -0
  25. package/src/interface/__test__/Interfaces.test.ts +56 -0
  26. package/src/math/index.ts +3 -0
  27. package/src/math/signedAngleTo/__test__/signedAngleTo.test.ts +14 -0
  28. package/src/math/signedAngleTo/signedAngleTo.ts +13 -0
  29. package/src/scene/root/lightroot/LightRoot.ts +17 -3
  30. package/src/scene/root/lightroot/__test__/LightRoot.test.ts +12 -3
  31. package/src/scene/root/modelroot/ModelRoot.ts +17 -3
  32. package/src/scene/root/modelroot/__test__/ModelRoot.test.ts +13 -14
  33. package/src/toolbox/BaseTool.ts +254 -4
  34. package/src/toolbox/Toolbox.ts +6 -0
  35. package/src/toolbox/__test__/BaseTool.test.ts +389 -0
  36. package/src/toolbox/__test__/Toolbox.test.ts +8 -0
  37. package/src/toolbox/select/SelectTool.ts +29 -65
  38. package/src/toolbox/select/__test__/SelectTool.test.ts +57 -25
  39. package/src/toolbox/transform/TransformTool.ts +48 -0
package/build/dive.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { ShadowMapType, ToneMapping, WebGLRenderer, Scene, Camera, PerspectiveCamera, Vector3Like, Mesh, ColorRepresentation, Object3D } from 'three';
1
+ import { ShadowMapType, ToneMapping, WebGLRenderer, Scene, Camera, PerspectiveCamera, Vector3Like, Mesh, ColorRepresentation, Object3D, Intersection, Vector2, Raycaster, Vector3 } from 'three';
2
2
  import { OrbitControls } from 'three/examples/jsm/Addons.js';
3
3
 
4
4
  type DIVERendererSettings = {
@@ -272,10 +272,9 @@ interface GET_ALL_OBJECTS {
272
272
 
273
273
  interface GET_OBJECTS {
274
274
  'PAYLOAD': {
275
- map: Map<string, COMEntity>;
276
- ids?: string[];
275
+ ids: string[];
277
276
  };
278
- 'RETURN': Map<string, COMEntity>;
277
+ 'RETURN': COMEntity[];
279
278
  }
280
279
 
281
280
  interface ADD_OBJECT {
@@ -393,14 +392,62 @@ type Actions = {
393
392
  GENERATE_MEDIA: GENERATE_MEDIA;
394
393
  };
395
394
 
395
+ interface DIVEDraggable {
396
+ isDraggable: true;
397
+ onDragStart?: (e: DraggableEvent) => void;
398
+ onDrag?: (e: DraggableEvent) => void;
399
+ onDragEnd?: (e: DraggableEvent) => void;
400
+ }
401
+
402
+ interface DIVEHoverable {
403
+ isHoverable: true;
404
+ onPointerEnter?: (i: Intersection) => void;
405
+ onPointerOver?: (i: Intersection) => void;
406
+ onPointerLeave?: () => void;
407
+ }
408
+
409
+ type DraggableEvent = {
410
+ dragStart: Vector3;
411
+ dragCurrent: Vector3;
412
+ dragEnd: Vector3;
413
+ dragDelta: Vector3;
414
+ };
396
415
  declare abstract class DIVEBaseTool {
397
- protected name: string;
398
- protected constructor();
416
+ readonly POINTER_DRAG_THRESHOLD: number;
417
+ name: string;
418
+ protected _canvas: HTMLElement;
419
+ protected _scene: DIVEScene;
420
+ protected _controller: DIVEOrbitControls;
421
+ protected _pointer: Vector2;
422
+ protected get _pointerAnyDown(): boolean;
423
+ protected _pointerPrimaryDown: boolean;
424
+ protected _pointerMiddleDown: boolean;
425
+ protected _pointerSecondaryDown: boolean;
426
+ protected _lastPointerDown: Vector2;
427
+ protected _lastPointerUp: Vector2;
428
+ protected _raycaster: Raycaster;
429
+ protected _intersects: Intersection[];
430
+ protected _hovered: (Object3D & DIVEHoverable) | null;
431
+ protected _dragging: boolean;
432
+ protected _dragStart: Vector3;
433
+ protected _dragCurrent: Vector3;
434
+ protected _dragEnd: Vector3;
435
+ protected _dragDelta: Vector3;
436
+ protected _draggable: DIVEDraggable | null;
437
+ protected _dragRaycastOnObjects: Object3D[] | null;
438
+ protected constructor(scene: DIVEScene, controller: DIVEOrbitControls);
399
439
  Activate(): void;
400
440
  Deactivate(): void;
401
441
  onPointerDown(e: PointerEvent): void;
442
+ onDragStart(e: PointerEvent): void;
443
+ onPointerMove(e: PointerEvent): void;
444
+ onDrag(e: PointerEvent): void;
402
445
  onPointerUp(e: PointerEvent): void;
446
+ onClick(e: PointerEvent): void;
447
+ onDragEnd(e: PointerEvent): void;
403
448
  onWheel(e: WheelEvent): void;
449
+ protected raycast(objects?: Object3D[]): Intersection[];
450
+ private pointerWasDragged;
404
451
  }
405
452
 
406
453
  /**
@@ -418,6 +465,7 @@ declare class DIVEToolbox {
418
465
  GetActiveTool(): DIVEBaseTool;
419
466
  UseTool(tool: string): void;
420
467
  SetGizmoMode(mode: 'translate' | 'rotate' | 'scale'): void;
468
+ onPointerMove(e: PointerEvent): void;
421
469
  onPointerDown(e: PointerEvent): void;
422
470
  onPointerUp(e: PointerEvent): void;
423
471
  onWheel(e: WheelEvent): void;
@@ -501,6 +549,15 @@ declare function floorExp(number: number, decimals?: number): number;
501
549
 
502
550
  declare function roundExponential(number: number, decimals?: number): number;
503
551
 
552
+ /**
553
+ * Calculate the signed angle between two vectors. Only works when the vectors are on the same plane.
554
+ * @param vecB Start Vector
555
+ * @param vecA Target Vector
556
+ * @param planeNormal The vector's plane normal
557
+ * @returns Signed angle in radians
558
+ */
559
+ declare function signedAngleTo(vecA: Vector3, vecB: Vector3, planeNormal: Vector3): number;
560
+
504
561
  declare function toFixedExp(number: number, decimals?: number): string;
505
562
 
506
563
  declare function truncateExp(number: number, decimals?: number): number;
@@ -511,6 +568,7 @@ declare const DIVEMath: {
511
568
  roundExp: typeof roundExponential;
512
569
  toFixedExp: typeof toFixedExp;
513
570
  truncateExp: typeof truncateExp;
571
+ signedAngleTo: typeof signedAngleTo;
514
572
  };
515
573
 
516
574
  type DIVESettings = {
package/build/dive.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ShadowMapType, ToneMapping, WebGLRenderer, Scene, Camera, PerspectiveCamera, Vector3Like, Mesh, ColorRepresentation, Object3D } from 'three';
1
+ import { ShadowMapType, ToneMapping, WebGLRenderer, Scene, Camera, PerspectiveCamera, Vector3Like, Mesh, ColorRepresentation, Object3D, Intersection, Vector2, Raycaster, Vector3 } from 'three';
2
2
  import { OrbitControls } from 'three/examples/jsm/Addons.js';
3
3
 
4
4
  type DIVERendererSettings = {
@@ -272,10 +272,9 @@ interface GET_ALL_OBJECTS {
272
272
 
273
273
  interface GET_OBJECTS {
274
274
  'PAYLOAD': {
275
- map: Map<string, COMEntity>;
276
- ids?: string[];
275
+ ids: string[];
277
276
  };
278
- 'RETURN': Map<string, COMEntity>;
277
+ 'RETURN': COMEntity[];
279
278
  }
280
279
 
281
280
  interface ADD_OBJECT {
@@ -393,14 +392,62 @@ type Actions = {
393
392
  GENERATE_MEDIA: GENERATE_MEDIA;
394
393
  };
395
394
 
395
+ interface DIVEDraggable {
396
+ isDraggable: true;
397
+ onDragStart?: (e: DraggableEvent) => void;
398
+ onDrag?: (e: DraggableEvent) => void;
399
+ onDragEnd?: (e: DraggableEvent) => void;
400
+ }
401
+
402
+ interface DIVEHoverable {
403
+ isHoverable: true;
404
+ onPointerEnter?: (i: Intersection) => void;
405
+ onPointerOver?: (i: Intersection) => void;
406
+ onPointerLeave?: () => void;
407
+ }
408
+
409
+ type DraggableEvent = {
410
+ dragStart: Vector3;
411
+ dragCurrent: Vector3;
412
+ dragEnd: Vector3;
413
+ dragDelta: Vector3;
414
+ };
396
415
  declare abstract class DIVEBaseTool {
397
- protected name: string;
398
- protected constructor();
416
+ readonly POINTER_DRAG_THRESHOLD: number;
417
+ name: string;
418
+ protected _canvas: HTMLElement;
419
+ protected _scene: DIVEScene;
420
+ protected _controller: DIVEOrbitControls;
421
+ protected _pointer: Vector2;
422
+ protected get _pointerAnyDown(): boolean;
423
+ protected _pointerPrimaryDown: boolean;
424
+ protected _pointerMiddleDown: boolean;
425
+ protected _pointerSecondaryDown: boolean;
426
+ protected _lastPointerDown: Vector2;
427
+ protected _lastPointerUp: Vector2;
428
+ protected _raycaster: Raycaster;
429
+ protected _intersects: Intersection[];
430
+ protected _hovered: (Object3D & DIVEHoverable) | null;
431
+ protected _dragging: boolean;
432
+ protected _dragStart: Vector3;
433
+ protected _dragCurrent: Vector3;
434
+ protected _dragEnd: Vector3;
435
+ protected _dragDelta: Vector3;
436
+ protected _draggable: DIVEDraggable | null;
437
+ protected _dragRaycastOnObjects: Object3D[] | null;
438
+ protected constructor(scene: DIVEScene, controller: DIVEOrbitControls);
399
439
  Activate(): void;
400
440
  Deactivate(): void;
401
441
  onPointerDown(e: PointerEvent): void;
442
+ onDragStart(e: PointerEvent): void;
443
+ onPointerMove(e: PointerEvent): void;
444
+ onDrag(e: PointerEvent): void;
402
445
  onPointerUp(e: PointerEvent): void;
446
+ onClick(e: PointerEvent): void;
447
+ onDragEnd(e: PointerEvent): void;
403
448
  onWheel(e: WheelEvent): void;
449
+ protected raycast(objects?: Object3D[]): Intersection[];
450
+ private pointerWasDragged;
404
451
  }
405
452
 
406
453
  /**
@@ -418,6 +465,7 @@ declare class DIVEToolbox {
418
465
  GetActiveTool(): DIVEBaseTool;
419
466
  UseTool(tool: string): void;
420
467
  SetGizmoMode(mode: 'translate' | 'rotate' | 'scale'): void;
468
+ onPointerMove(e: PointerEvent): void;
421
469
  onPointerDown(e: PointerEvent): void;
422
470
  onPointerUp(e: PointerEvent): void;
423
471
  onWheel(e: WheelEvent): void;
@@ -501,6 +549,15 @@ declare function floorExp(number: number, decimals?: number): number;
501
549
 
502
550
  declare function roundExponential(number: number, decimals?: number): number;
503
551
 
552
+ /**
553
+ * Calculate the signed angle between two vectors. Only works when the vectors are on the same plane.
554
+ * @param vecB Start Vector
555
+ * @param vecA Target Vector
556
+ * @param planeNormal The vector's plane normal
557
+ * @returns Signed angle in radians
558
+ */
559
+ declare function signedAngleTo(vecA: Vector3, vecB: Vector3, planeNormal: Vector3): number;
560
+
504
561
  declare function toFixedExp(number: number, decimals?: number): string;
505
562
 
506
563
  declare function truncateExp(number: number, decimals?: number): number;
@@ -511,6 +568,7 @@ declare const DIVEMath: {
511
568
  roundExp: typeof roundExponential;
512
569
  toFixedExp: typeof toFixedExp;
513
570
  truncateExp: typeof truncateExp;
571
+ signedAngleTo: typeof signedAngleTo;
514
572
  };
515
573
 
516
574
  type DIVESettings = {