UNPKG

@needle-tools/engine

Version:

Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.

171 lines (170 loc) 7.32 kB
import { Object3D } from "three"; import { Behaviour } from "./Component.js"; import type { IPointerEventHandler, PointerEventData } from "./ui/PointerEvents.js"; /** * The DragMode determines how an object is dragged around in the scene. */ export declare enum DragMode { /** Object stays at the same horizontal plane as it started. Commonly used for objects on the floor */ XZPlane = 0, /** Object is dragged as if it was attached to the pointer. In 2D, that means it's dragged along the camera screen plane. In XR, it's dragged by the controller/hand. */ Attached = 1, /** Object is dragged along the initial raycast hit normal. */ HitNormal = 2, /** Combination of XZ and Screen based on the viewing angle. Low angles result in Screen dragging and higher angles in XZ dragging. */ DynamicViewAngle = 3, /** The drag plane is snapped to surfaces in the scene while dragging. */ SnapToSurfaces = 4, /** Don't allow dragging the object */ None = 5 } /** * DragControls allows you to drag objects around in the scene. It can be used to move objects in 2D (screen space) or 3D (world space). * Debug mode can be enabled with the URL parameter `?debugdrag`, which shows visual helpers and logs drag operations. * * @category Interactivity * @group Components */ export declare class DragControls extends Behaviour implements IPointerEventHandler { /** * Checks if any DragControls component is currently active with selected objects * @returns True if any DragControls component is currently active */ static get HasAnySelected(): boolean; private static _active; /** * Retrieves a list of all DragControl components that are currently dragging objects. * @returns Array of currently active DragControls components */ static get CurrentlySelected(): DragControls[]; /** Registry of currently active and enabled DragControls components */ private static _instances; /** * Determines how and where the object is dragged along. Different modes include * dragging along a plane, attached to the pointer, or following surface normals. */ dragMode: DragMode; /** * Snaps dragged objects to a 3D grid with the specified resolution. * Set to 0 to disable snapping. */ snapGridResolution: number; /** * When true, maintains the original rotation of the dragged object while moving it. * When false, allows the object to rotate freely during dragging. */ keepRotation: boolean; /** * Determines how and where the object is dragged along while dragging in XR. * Uses a separate setting from regular drag mode for better XR interaction. */ xrDragMode: DragMode; /** * When true, maintains the original rotation of the dragged object during XR dragging. * When false, allows the object to rotate freely during XR dragging. */ xrKeepRotation: boolean; /** * Multiplier that affects how quickly objects move closer or further away when dragging in XR. * Higher values make distance changes more pronounced. * This is similar to mouse acceleration on a screen. */ xrDistanceDragFactor: number; /** * When enabled, draws a visual line from the dragged object downwards to the next raycast hit, * providing visual feedback about the object's position relative to surfaces below it. */ showGizmo: boolean; /** * Returns the object currently being dragged by this DragControls component, if any. * @returns The object being dragged or null if no object is currently dragged */ get draggedObject(): Object3D<import("three").Object3DEventMap> | null; /** * Updates the object that is being dragged by the DragControls. * This can be used to change the target during a drag operation. * @param obj The new object to drag, or null to stop dragging */ setTargetObject(obj: Object3D | null): void; private _rigidbody; /** The object to be dragged – we pass this to handlers when they are created */ private _targetObject; private _dragHelper; private static lastHovered; private _draggingRigidbodies; private _potentialDragStartEvt; private _dragHandlers; private _totalMovement; /** A marker is attached to components that are currently interacted with, to e.g. prevent them from being deleted. */ private _marker; private _isDragging; private _didDrag; /** @internal */ awake(): void; /** @internal */ start(): void; /** @internal */ onEnable(): void; /** @internal */ onDisable(): void; /** * Checks if editing is allowed for the current networking connection. * @param _obj Optional object to check edit permissions for * @returns True if editing is allowed */ private allowEdit; /** * Handles pointer enter events. Sets the cursor style and tracks the hovered object. * @param evt Pointer event data containing information about the interaction * @internal */ onPointerEnter?(evt: PointerEventData): void; /** * Handles pointer movement events. Marks the event as used if dragging is active. * @param args Pointer event data containing information about the movement * @internal */ onPointerMove?(args: PointerEventData): void; /** * Handles pointer exit events. Resets the cursor style when the pointer leaves a draggable object. * @param evt Pointer event data containing information about the interaction * @internal */ onPointerExit?(evt: PointerEventData): void; /** * Handles pointer down events. Initiates the potential drag operation if conditions are met. * @param args Pointer event data containing information about the interaction * @internal */ onPointerDown(args: PointerEventData): void; /** * Handles pointer up events. Finalizes or cancels the drag operation. * @param args Pointer event data containing information about the interaction * @internal */ onPointerUp(args: PointerEventData): void; /** * Updates the drag operation every frame. Processes pointer movement, accumulates drag distance * and triggers drag start once there's enough movement. * @internal */ update(): void; /** * Called when the first pointer starts dragging on this object. * Sets up network synchronization and marks rigidbodies for dragging. * Not called for subsequent pointers on the same object. * @param evt Pointer event data that initiated the drag */ private onFirstDragStart; /** * Called each frame as long as any pointer is dragging this object. * Updates visuals and keeps rigidbodies awake during the drag. */ private onAnyDragUpdate; /** * Called when the last pointer has been removed from this object. * Cleans up drag state and applies final velocities to rigidbodies. * @param evt Pointer event data for the last pointer that was lifted */ private onLastDragEnd; }