@hatiolab/things-scene 10.0.0-beta.92 → 10.0.0-beta.94

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 (57) hide show
  1. package/dist-types/components/component-geometry.d.ts.map +1 -1
  2. package/dist-types/components/mutater/path.d.ts.map +1 -1
  3. package/dist-types/components/outline/path-outline.d.ts.map +1 -1
  4. package/dist-types/components/polygon.d.ts +2 -0
  5. package/dist-types/components/polygon.d.ts.map +1 -1
  6. package/dist-types/components/polyline.d.ts.map +1 -1
  7. package/dist-types/components/shape.d.ts.map +1 -1
  8. package/dist-types/diagnostics/contract-inspector.d.ts +103 -0
  9. package/dist-types/diagnostics/contract-inspector.d.ts.map +1 -0
  10. package/dist-types/diagnostics/inspector.d.ts +44 -0
  11. package/dist-types/diagnostics/inspector.d.ts.map +1 -1
  12. package/dist-types/layer/modeler/path-handler.d.ts.map +1 -1
  13. package/dist-types/math/component-pose.d.ts +51 -0
  14. package/dist-types/math/component-pose.d.ts.map +1 -0
  15. package/dist-types/math/index.d.ts +3 -0
  16. package/dist-types/math/index.d.ts.map +1 -0
  17. package/dist-types/math/pose6dof.d.ts +93 -0
  18. package/dist-types/math/pose6dof.d.ts.map +1 -0
  19. package/dist-types/navigation/index.d.ts +7 -0
  20. package/dist-types/navigation/index.d.ts.map +1 -0
  21. package/dist-types/navigation/nav-graph.d.ts +55 -0
  22. package/dist-types/navigation/nav-graph.d.ts.map +1 -0
  23. package/dist-types/navigation/path-planner.d.ts +29 -0
  24. package/dist-types/navigation/path-planner.d.ts.map +1 -0
  25. package/dist-types/navigation/reservation-table.d.ts +103 -0
  26. package/dist-types/navigation/reservation-table.d.ts.map +1 -0
  27. package/dist-types/navigation/types.d.ts +145 -0
  28. package/dist-types/navigation/types.d.ts.map +1 -0
  29. package/dist-types/things-scene/index.d.ts +10 -2
  30. package/dist-types/things-scene/index.d.ts.map +1 -1
  31. package/dist-types/threed/factories/polygon.d.ts +19 -0
  32. package/dist-types/threed/factories/polygon.d.ts.map +1 -1
  33. package/dist-types/threed/managers/vertex-gizmo-manager.d.ts +50 -4
  34. package/dist-types/threed/managers/vertex-gizmo-manager.d.ts.map +1 -1
  35. package/dist-types/threed/real-object-extrude.d.ts +10 -1
  36. package/dist-types/threed/real-object-extrude.d.ts.map +1 -1
  37. package/dist-types/threed/texture/fillstyle-texture.d.ts.map +1 -1
  38. package/dist-types/transfer/container-capacity.d.ts +72 -0
  39. package/dist-types/transfer/container-capacity.d.ts.map +1 -1
  40. package/dist-types/transfer/index.d.ts +9 -1
  41. package/dist-types/transfer/index.d.ts.map +1 -1
  42. package/dist-types/transfer/pickup-helpers.d.ts +65 -0
  43. package/dist-types/transfer/pickup-helpers.d.ts.map +1 -0
  44. package/dist-types/transfer/transfer.d.ts +168 -0
  45. package/dist-types/transfer/transfer.d.ts.map +1 -0
  46. package/dist-types/transfer/types.d.ts +104 -0
  47. package/dist-types/transfer/types.d.ts.map +1 -1
  48. package/dist-types/types/polygon-path-arc.d.ts +72 -0
  49. package/dist-types/types/polygon-path-arc.d.ts.map +1 -0
  50. package/dist-types/types/polygon-path.d.ts +153 -0
  51. package/dist-types/types/polygon-path.d.ts.map +1 -0
  52. package/package.json +1 -1
  53. package/things-scene-min.js +11 -11
  54. package/things-scene-min.js.map +1 -1
  55. package/things-scene-transfer.mjs +6 -1
  56. package/things-scene.mjs +3 -3
  57. package/things-scene.mjs.map +1 -1
@@ -0,0 +1,145 @@
1
+ import type { Vec3 } from '../transfer/types.js';
2
+ export interface LaneGeometry {
3
+ /** 중앙선의 점들 (시작 → 끝). */
4
+ centerPoints: Vec3[];
5
+ /** lane 의 폭 (vehicle 이 이 안에 들어가야 함). */
6
+ width: number;
7
+ }
8
+ export interface Lane {
9
+ id: string;
10
+ geometry: LaneGeometry;
11
+ /** oneway 면 centerPoints 의 시작→끝 방향만, twoway 면 양방향 허용. */
12
+ direction: 'oneway' | 'twoway';
13
+ /** 속도 제한 (scene units / sim sec). undefined = 무제한. */
14
+ speedLimit?: number;
15
+ /** 통과 가능한 도구 type (Pickable.toolType 과 같은 축). 빈 배열 = 모두 허용. */
16
+ allowedToolTypes?: string[];
17
+ /** 동시에 들어갈 수 있는 vehicle 수. 1 = 단독 점유 (1차원 큐). */
18
+ capacity: number;
19
+ }
20
+ /**
21
+ * 두 lane 의 진입쌍이 충돌하는지 표현. e.g. north→south 와 east→west 는 직각
22
+ * 교차로에서 충돌하지만 north→east 와 south→east 는 충돌 안 함 (병행).
23
+ */
24
+ export interface ConflictPair {
25
+ fromLane: string;
26
+ toLane: string;
27
+ /** 어떤 우선순위 정책을 적용할지. */
28
+ resolveBy: 'fifo' | 'priority' | 'roundrobin';
29
+ }
30
+ export interface Intersection {
31
+ id: string;
32
+ lanes: string[];
33
+ conflicts: ConflictPair[];
34
+ /** 통과 시간 (vehicle 이 교차로 안에 머무는 sim ms). 보수적으로 추정. */
35
+ crossingTimeMs: number;
36
+ }
37
+ export interface NavPolygon {
38
+ vertices: Vec3[];
39
+ }
40
+ /**
41
+ * lane 으로 표현하기 어려운 넓은 영역 (open warehouse floor, dock plaza 등).
42
+ * 시공간 격자로 점유권을 관리.
43
+ */
44
+ export interface OpenZone {
45
+ id: string;
46
+ boundary: NavPolygon;
47
+ /** 점유 격자의 cell 한 변 크기 (scene unit). 작을수록 정확하지만 reservation 많아짐. */
48
+ cellSize: number;
49
+ }
50
+ export interface TimeWindow {
51
+ /** sim time milliseconds. */
52
+ startSimMs: number;
53
+ endSimMs: number;
54
+ }
55
+ /**
56
+ * 어떤 resource 를 어떤 시간 window 동안 누가 점유하는가.
57
+ *
58
+ * resource 는 lane id / intersection id / open-zone cell key 등 resource 의
59
+ * 단일 식별자. cell 의 경우 e.g. `${zoneId}:cell:${i},${j}`.
60
+ */
61
+ export interface Reservation {
62
+ id: string;
63
+ resource: string;
64
+ timeWindow: TimeWindow;
65
+ reserverId: string;
66
+ /** 낮을수록 우선. emergency = -1, task-bound = 0, idle = 10 등. */
67
+ priority: number;
68
+ /** 부수 메타 (어떤 task 의 일부인지, 어떤 carrier 를 운반 중인지 등). */
69
+ metadata?: Record<string, any>;
70
+ }
71
+ export interface SpeedProfile {
72
+ /** 최대 속도 (scene units / sim sec). */
73
+ max: number;
74
+ /** 가속도 (scene units / sim sec²). */
75
+ accel: number;
76
+ /** 감속도 (scene units / sim sec²). */
77
+ decel: number;
78
+ }
79
+ export interface PathSegment {
80
+ resource: string;
81
+ /** 이 segment 를 통과하는 sim time. */
82
+ timeWindow: TimeWindow;
83
+ /** segment 시작 / 끝 좌표 (시각화용). */
84
+ fromPos: Vec3;
85
+ toPos: Vec3;
86
+ }
87
+ export interface PathPlan {
88
+ segments: PathSegment[];
89
+ /** 전체 경로의 sim time 길이. */
90
+ totalDurationMs: number;
91
+ /** 전체 경로 길이 (scene unit). */
92
+ totalDistance: number;
93
+ }
94
+ export interface PathPlanOptions {
95
+ /** sim time 시작점. 미지정 시 현재 globalSimClock.now. */
96
+ startSimMs?: number;
97
+ /** vehicle 의 toolType — lane.allowedToolTypes 검사용. */
98
+ toolType?: string;
99
+ /** vehicle 의 speed profile. */
100
+ speed?: SpeedProfile;
101
+ /** 우선순위 (충돌 시 양보 결정용). */
102
+ priority?: number;
103
+ /** deadline (sim ms) — 이 시간 안에 도착 못 하면 null 반환. */
104
+ deadlineSimMs?: number;
105
+ }
106
+ /**
107
+ * Vehicle 이 navigation 능력을 노출하는 인터페이스. Mover 의 sub-trait.
108
+ *
109
+ * lifecycle:
110
+ * 1. planPath(target) → PathPlan | null (lookup, 부수효과 없음)
111
+ * 2. reservePath(plan) → Reservation[] | null (table 에 add, 충돌 시 null)
112
+ * 3. followReservation(rs) → Promise<void> (sim time 진행)
113
+ * 4. releaseReservation(rs) (도착 후 또는 cancel)
114
+ *
115
+ * 단계 분리로 충돌 감지가 commit 직전, replay 가 결정적, 디버깅이 가능.
116
+ */
117
+ export interface Navigable {
118
+ toolType: string;
119
+ speedProfile: SpeedProfile;
120
+ /**
121
+ * 경로 계획. 시간-공간 reservation 가능성 검증 포함 (단, table 에 commit 안 함).
122
+ * null 반환 = 도달 가능 경로 없음 (deadline 초과 / 모든 lane 점유 등).
123
+ */
124
+ planPath(target: Vec3, options?: PathPlanOptions): PathPlan | null;
125
+ /**
126
+ * 계획된 경로를 reservation table 에 commit. 다른 vehicle 이 이미 점유한
127
+ * window 와 충돌 시 null — 호출자가 reroute 하든 대기하든 결정.
128
+ */
129
+ reservePath(plan: PathPlan, priority?: number): Reservation[] | null;
130
+ /**
131
+ * commit 된 reservation 따라 sim time 진행. resolve = 마지막 segment 도착.
132
+ */
133
+ followReservation(reservations: Reservation[]): Promise<void>;
134
+ /** 점유 해제. 도착 완료 또는 cancel 시 호출. */
135
+ releaseReservation(reservations: Reservation[]): void;
136
+ }
137
+ export type YieldDecision = 'a-yields' | 'b-yields' | 'replan-both';
138
+ export interface YieldPolicy {
139
+ /**
140
+ * 두 reservation 이 시간-공간 충돌할 때 누가 양보하는가.
141
+ * 기본: priority 낮은 (수치 높은) 쪽이 양보. 같으면 fifo (먼저 만든 게 우선).
142
+ */
143
+ resolveConflict(a: Reservation, b: Reservation): YieldDecision;
144
+ }
145
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/navigation/types.ts"],"names":[],"mappings":"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"}
@@ -28,8 +28,14 @@ export type { SceneRenderContext, DrawOptions, StyleOptions, FillStyle, StrokeSt
28
28
  export type { LinkEnd } from '../decorator/decorators/link-decorator.js';
29
29
  export type { LAYOUT, LayoutRegistry } from '../interfaces/layout.js';
30
30
  export type { IRealObject } from '../interfaces/real-object.js';
31
- export type { Vec3, Size3, Bounds3, SlotArrangement, GridShape, SlotDef, SlotAssignment, TransferOptions, StaticPolicy, DynamicPolicy, PendingPolicy, ConnectionPolicy, Port, TransferEventType, TransferEvent, CarrierAttachPoint, ArrangementStrategy, Transferable, NavigationTarget, NavigationOptions, Movable, ArticulatedCapability, MissionStatus, VehicleMission, MissionExecutor, SensorPoint, SpawnPoint, SinkPoint, SimulationClock } from '../transfer/index.js';
32
- export { FixedSlotStrategy, CenteringSlotStrategy, ContainerCapacity, TRANSFER_SLOT_KEY, globalSimClock } from '../transfer/index.js';
31
+ export type { Vec3, Size3, Bounds3, SlotArrangement, GridShape, SlotDef, SlotAssignment, TransferOptions, StaticPolicy, DynamicPolicy, PendingPolicy, ConnectionPolicy, Port, TransferEventType, TransferEvent, CarrierAttachPoint, ArrangementStrategy, Transferable, NavigationTarget, NavigationOptions, Movable, ArticulatedCapability, MissionStatus, VehicleMission, MissionExecutor, SensorPoint, SpawnPoint, SinkPoint, SimulationClock, TransferPhase, TransferTimeline, TransferReceipt, TransferReceiptJSON, TransferLogStats, PhysicalRunner, TransferInit, QuatLike, PoseSerialized, PickupFrame, PickupRequester, Pickable, RectangularFootprintOptions, TopApproachOptions } from '../transfer/index.js';
32
+ export { FixedSlotStrategy, CenteringSlotStrategy, ContainerCapacity, TRANSFER_SLOT_KEY, globalSimClock, Transfer, transferLog, receiptToJSON, quatFromYaw, rectangularFootprintFrames, topApproachFrame, filterByToolType, chooseNearestPickupFrame } from '../transfer/index.js';
33
+ export { Pose6DOF, getPose, getWorldPose, setPose, setWorldPose } from '../math/index.js';
34
+ export type { PoseLike } from '../math/index.js';
35
+ export { ReservationTable, reservationTable, standardYieldPolicy, NavGraph, buildNavGraph, planPathAStar, planToReservations } from '../navigation/index.js';
36
+ export type { LaneGeometry, Lane, ConflictPair, Intersection, NavPolygon, OpenZone, TimeWindow, Reservation, SpeedProfile, PathSegment, PathPlan, PathPlanOptions, Navigable, YieldDecision, YieldPolicy, ReservationEvent, AddResult, Conflict, ConflictRecord, NavNode, NavEdge, BuildNavGraphOptions } from '../navigation/index.js';
37
+ export { buildContractInspector, installContractInspector } from '../diagnostics/contract-inspector.js';
38
+ export type { ContractInspector, InspectorComponentSummary, InspectorSimStatus } from '../diagnostics/contract-inspector.js';
33
39
  export { frameClock } from '../clock/index.js';
34
40
  export type { FrameClock, TickHandler, Unsubscribe, SubscribeOptions, SubscriptionInfo, FrameClockSnapshot, ExternalAnimationInfo, ExternalAnimationHandle } from '../clock/index.js';
35
41
  export { default as ReferenceMap } from '../core/reference-map.js';
@@ -50,4 +56,6 @@ export { default as TransitionEffect } from '../transition/transition-effect.js'
50
56
  export * from '../placement/index.js';
51
57
  export * from '../search/index.js';
52
58
  export * from '../threed/index.js';
59
+ export * from '../types/polygon-path.js';
60
+ export * from '../types/polygon-path-arc.js';
53
61
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/things-scene/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/things-scene/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,13 @@
1
1
  import * as THREE from 'three';
2
2
  import { RealObjectExtrude } from '../real-object-extrude.js';
3
+ /**
4
+ * 호(bulge) 가 chord 한쪽으로 부풀면 ExtrudeGeometry 의 mesh BBox center 가
5
+ * 그 쪽으로 이동한다. RealObjectExtrude.createGeometry 의 `geometry.center()` 가
6
+ * 그 이동된 BBox center 를 (0,0) 으로 시프트 → polygon 통째가 호 반대편으로 어긋남.
7
+ *
8
+ * 여기서는 path vertex 만의 BBox center 로 정렬되도록 createGeometry 를 오버라이드.
9
+ * 핸들 위치(보드 좌표 = path vertex 좌표) 와 mesh 위치가 일치한다.
10
+ */
3
11
  export declare class PolygonExtrude extends RealObjectExtrude {
4
12
  _minMax?: {
5
13
  minX?: number;
@@ -8,6 +16,17 @@ export declare class PolygonExtrude extends RealObjectExtrude {
8
16
  maxY?: number;
9
17
  };
10
18
  get shape(): THREE.Shape;
19
+ /**
20
+ * super.build() 와 거의 동일하지만 BoundUVGenerator 의 BBox 를 호 포함 shape
21
+ * 이 아닌 path vertex 만의 BBox 로 설정. 패턴 텍스처가 vertex BBox 기준
22
+ * (= component bounds) 으로 매핑되어 Rect 와 동일한 시각이 나온다.
23
+ */
24
+ build(): void;
25
+ /**
26
+ * mesh BBox center 가 아닌 path vertex BBox center 로 정렬한다.
27
+ * 호 영역이 chord 한쪽으로 부풀어도 polygon 통째 위치가 어긋나지 않도록.
28
+ */
29
+ createGeometry(shape: THREE.Shape): THREE.BufferGeometry;
11
30
  get minMax(): {
12
31
  minX?: number;
13
32
  minY?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"polygon.d.ts","sourceRoot":"","sources":["../../../src/threed/factories/polygon.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAG7D,qBAAa,cAAe,SAAQ,iBAAiB;IACnD,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IAED,IAAI,KAAK,gBAoCR;IAED,IAAI,MAAM;eA5CD,MAAM;eACN,MAAM;eACN,MAAM;eACN,MAAM;MAwEd;CACF"}
1
+ {"version":3,"file":"polygon.d.ts","sourceRoot":"","sources":["../../../src/threed/factories/polygon.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAS7D;;;;;;;GAOG;AAEH,qBAAa,cAAe,SAAQ,iBAAiB;IACnD,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IAED,IAAI,KAAK,gBAoER;IAED;;;;OAIG;IACH,KAAK;IAiDL;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc;IAsCxD,IAAI,MAAM;eA5KD,MAAM;eACN,MAAM;eACN,MAAM;eACN,MAAM;MAwMd;CACF"}
@@ -20,8 +20,14 @@ export declare class VertexGizmoManager {
20
20
  private _activeComponent?;
21
21
  private _activeVertexHandles;
22
22
  private _activeHandleIndex;
23
+ private _activeKind;
24
+ private _activeHandle?;
23
25
  private _isDragging;
24
26
  private _isExtending;
27
+ private _isPending;
28
+ private _pendingHit?;
29
+ private _pendingHandleType?;
30
+ private _pendingScreenStart;
25
31
  private _dragPlane;
26
32
  private _dragOffset;
27
33
  private _raycaster;
@@ -50,6 +56,8 @@ export declare class VertexGizmoManager {
50
56
  private _rebuildComponentHandles;
51
57
  private _createVertexHandle;
52
58
  private _createMidpointHandle;
59
+ private _createCornerHandle;
60
+ private _createBulgeHandle;
53
61
  /**
54
62
  * 3D 핸들 위치 → 2D path 포인트 역변환
55
63
  */
@@ -63,10 +71,33 @@ export declare class VertexGizmoManager {
63
71
  /** 컴포넌트에 속하는 ComponentHandles를 찾는다 */
64
72
  private _findComponentHandles;
65
73
  /**
66
- * 마우스 다운: vertex/midpoint 핸들 raycast hit 감지 → 드래그 시작.
74
+ * 마우스 다운: 핸들 raycast hit 감지 → **pending 상태 진입** (드래그 시작 X).
75
+ *
76
+ * 2D `ua-event-handler.ts` 와 동일 컨벤션: mousedown 만으로 path mutation 을 일으키지
77
+ * 않고, mousemove 가 DRAG_THRESHOLD_PX2 를 넘는 순간 dragstart 처리.
78
+ * 이전엔 midpoint 핸들 클릭만 해도 vertex 가 즉시 추가되었고, vertex 클릭만 해도
79
+ * mouseup 에서 no-op CommandChange 가 쌓였다 — 두 케이스 모두 2D 와 다른 거동.
80
+ *
81
+ * vertex/midpoint 우선 raycast — corner/bulge 는 vertex 가 hit 안 될 때만 검사.
82
+ * 같은 ray 위에 vertex 와 corner 가 겹칠 때 vertex 가 우선되도록.
83
+ *
67
84
  * @returns true이면 이벤트를 소비
68
85
  */
69
86
  onPointerDown(ndc: THREE.Vector2, camera: THREE.Camera, event: MouseEvent): boolean;
87
+ /**
88
+ * pending 상태에서 임계값 통과 시점에 호출 — kind 별 dragstart 처리.
89
+ * `_startMidpointDrag` 는 vertex 를 splice 하므로 이 시점까지 path mutation 이 미뤄진다.
90
+ */
91
+ private _beginDrag;
92
+ /**
93
+ * corner radius 핸들 드래그 시작 — 보드 평면 ray-cast 로 드래그 좌표를 받아
94
+ * cornerRadiusFromDrag 으로 새 radius 계산.
95
+ */
96
+ private _startCornerDrag;
97
+ /**
98
+ * bulge 핸들 드래그 시작.
99
+ */
100
+ private _startBulgeDrag;
70
101
  /**
71
102
  * midpoint 핸들 드래그 시작: 세그먼트 중간에 새 vertex를 삽입
72
103
  */
@@ -80,20 +111,35 @@ export declare class VertexGizmoManager {
80
111
  */
81
112
  private _setupDragPlane;
82
113
  /**
83
- * 마우스 이동: 드래그 중이면 핸들 이동.
114
+ * 마우스 이동: pending 경우 임계값 검사 후 dragstart, 그 후 dragmove 처리.
115
+ *
116
+ * 첫 mousemove 가 임계값을 넘는 순간 `_beginDrag` 호출 — 이 함수가 _setupDragPlane 까지
117
+ * 처리하므로 같은 mousemove 내에서 fallthrough 로 dragmove 까지 이어지면 된다.
84
118
  */
85
119
  onPointerMove(ndc: THREE.Vector2, camera: THREE.Camera, event: MouseEvent): boolean;
120
+ /** corner 드래그 라이브 갱신 — 보드 좌표 변환 후 cornerRadiusFromDrag */
121
+ private _dragCornerLive;
122
+ /** bulge 드래그 라이브 갱신 */
123
+ private _dragBulgeLive;
86
124
  /**
87
125
  * 현재 활성 컴포넌트의 vertex 핸들 위치로부터 Line2 geometry를 실시간 업데이트한다.
88
126
  */
89
127
  private _updateLinePreview;
90
128
  /**
91
129
  * 마우스 업: 드래그 종료 → component.mutatePath() 호출.
130
+ *
131
+ * pending 만 있고 드래그가 시작 안 된 경우 = 클릭만. mutation 없이 정리만 한다
132
+ * (2D 와 동일 — 클릭은 path 를 더럽히지 않음). dblclick 은 별개 이벤트라 정리해도 무방.
92
133
  */
93
134
  onPointerUp(): boolean;
94
135
  /**
95
- * 더블클릭: vertex 핸들 위에서 더블클릭하면 해당 vertex 삭제.
96
- * @returns true이면 이벤트를 소비
136
+ * 더블클릭:
137
+ * - vertex 핸들 vertex 삭제 (기존)
138
+ * - corner 핸들 → radius 제거 (직각 복귀)
139
+ * - bulge 핸들 → bulge 제거 (직선 복귀)
140
+ *
141
+ * vertex 우선 raycast — corner/bulge 는 vertex 가 hit 안 될 때만 검사.
142
+ * onPointerDown 과 동일 컨벤션 (vertex 위 클릭이 corner 로 떨어지지 않도록).
97
143
  */
98
144
  onDblClick(ndc: THREE.Vector2, camera: THREE.Camera): boolean;
99
145
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"vertex-gizmo-manager.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/vertex-gizmo-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AA2B1D;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,YAAY,CAAC,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAa;IAC9B,OAAO,CAAC,UAAU,CAAC,CAAK;IAGxB,OAAO,CAAC,gBAAgB,CAAC,CAAW;IACpC,OAAO,CAAC,oBAAoB,CAAmB;IAC/C,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,aAAa,CAAsB;IAE3C,IAAI,UAAU,YAA8B;IAC5C,IAAI,UAAU,YAA+C;IAE7D,gCAAgC;IAChC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAMlC;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,GAAG,IAAI;IAqBlF,4BAA4B;IAC5B,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,GAAG,IAAI;IAIvE;;OAEG;IACH,MAAM,IAAI,IAAI;IAiBd;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAmBhC,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB,yBAAyB;IACzB,OAAO,CAAC,cAAc;IAQtB,sCAAsC;IACtC,OAAO,CAAC,qBAAqB;IAI7B;;;OAGG;IACH,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO;IAgDnF;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA2B5B;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO;IA6BnF;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACH,WAAW,IAAI,OAAO;IA+BtB;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO;IA8B7D;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI;IAuB9C,OAAO,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"vertex-gizmo-manager.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/vertex-gizmo-manager.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ import { BoundUVGenerator } from './utils/bound-uv-generator.js';
14
14
  */
15
15
  export declare class RealObjectExtrude extends RealObject {
16
16
  _boundUVGenerator?: BoundUVGenerator;
17
- private _mesh?;
17
+ protected _mesh?: THREE.Mesh;
18
18
  clear(): THREE.Object3D<THREE.Object3DEventMap>;
19
19
  get shape(): any;
20
20
  get boundUVGenerator(): BoundUVGenerator;
@@ -34,5 +34,14 @@ export declare class RealObjectExtrude extends RealObject {
34
34
  */
35
35
  private _applyCapTexture;
36
36
  updateDimension(): void;
37
+ /**
38
+ * path 변경 시 geometry 만 교체 (material/texture 보존).
39
+ *
40
+ * 이전엔 `update()` (clear + build) 호출했는데, 그러면 build 가 새 materials 를
41
+ * 만들고 updateFillStyle → 패턴인 경우 patternTextTexture 비동기 이미지 로드를
42
+ * 매번 다시 시작 → drag 중 race 로 패턴 깜빡임/누락. geometry 만 교체하면
43
+ * material/CanvasTexture 가 그대로 보존되어 안정.
44
+ */
45
+ onchange(after: any, before: any): void;
37
46
  }
38
47
  //# sourceMappingURL=real-object-extrude.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"real-object-extrude.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-extrude.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAOhE;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,iBAAiB,CAAC,EAAE,gBAAgB,CAAA;IACpC,OAAO,CAAC,KAAK,CAAC,CAAY;IAE1B,KAAK;IAKL,IAAI,KAAK,IAAI,GAAG,CAEf;IAED,IAAI,gBAAgB,qBAInB;IAED,KAAK;IAoCL,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc;IAoBxD,eAAe,IAAI,KAAK,CAAC,QAAQ,EAAE;IAcnC,aAAa;IAqBb,OAAO,CAAC,YAAY;IAMpB,gBAAgB;IAYhB,WAAW;IAUX,iBAAiB;IAQjB,eAAe;IAIf,UAAU;IAIV;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA+DxB,eAAe;CAMhB"}
1
+ {"version":3,"file":"real-object-extrude.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-extrude.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAOhE;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,iBAAiB,CAAC,EAAE,gBAAgB,CAAA;IACpC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAA;IAE5B,KAAK;IAKL,IAAI,KAAK,IAAI,GAAG,CAEf;IAED,IAAI,gBAAgB,qBAInB;IAED,KAAK;IAoCL,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc;IAoBxD,eAAe,IAAI,KAAK,CAAC,QAAQ,EAAE;IAcnC,aAAa;IAqBb,OAAO,CAAC,YAAY;IAMpB,gBAAgB;IAYhB,WAAW;IAUX,iBAAiB;IAQjB,eAAe;IAIf,UAAU;IAIV;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA+DxB,eAAe;IAMf;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;CAajC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fillstyle-texture.d.ts","sourceRoot":"","sources":["../../../src/threed/texture/fillstyle-texture.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAG1D;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE;IACT,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAClD,uDAAuD;IACvD,aAAa,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACtD,EACD,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,iBAAiB,GAAG,IAAI,CAyC1B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,GAAG,KAAK,CAAC,OAAO,CAqGvF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAC1H,KAAK,CAAC,aAAa,GAAG,SAAS,CASjC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,SAAS,EACpB,iBAAiB,CAAC,EAAE,OAAO,GAC1B,KAAK,CAAC,OAAO,GAAG,SAAS,CAkB3B"}
1
+ {"version":3,"file":"fillstyle-texture.d.ts","sourceRoot":"","sources":["../../../src/threed/texture/fillstyle-texture.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAG1D;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE;IACT,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAClD,uDAAuD;IACvD,aAAa,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACtD,EACD,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,iBAAiB,GAAG,IAAI,CAyC1B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,GAAG,KAAK,CAAC,OAAO,CAsJvF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAC1H,KAAK,CAAC,aAAa,GAAG,SAAS,CASjC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,SAAS,EACpB,iBAAiB,CAAC,EAAE,OAAO,GAC1B,KAAK,CAAC,OAAO,GAAG,SAAS,CAkB3B"}
@@ -34,6 +34,78 @@ export declare function ContainerCapacity<TBase extends Constructor<Component>>(
34
34
  * Fires 'transfer-rejected'; subclasses may trigger fallback routing.
35
35
  */
36
36
  rejectRoute(component: any, reason?: string): void;
37
+ /**
38
+ * carrier 의 받아들일 회전 (parent-local quaternion). 기본 identity.
39
+ * 회전이 필요한 holder (induct = belt 진행 방향, rack cell = grid 정렬 등)
40
+ * 는 이 메소드만 override 하면 receive() 가 atomic 하게 적용한다.
41
+ *
42
+ * 반환값은 plain object {x,y,z,w} — THREE.Quaternion 도 그 인터페이스 만족.
43
+ */
44
+ acceptanceRotation(_carrier: any, _slot?: SlotDef): {
45
+ x: number;
46
+ y: number;
47
+ z: number;
48
+ w: number;
49
+ } | undefined;
50
+ /**
51
+ * canReceive 의 풍부한 버전. ok 면 slot 동봉, 아니면 reason 명시.
52
+ * drag-over UI 가 사유 표시하기 위함. canReceive 와 동일 결정 사용.
53
+ */
54
+ canAccept(component: any): {
55
+ ok: true;
56
+ slot: SlotDef;
57
+ } | {
58
+ ok: false;
59
+ reason: string;
60
+ };
61
+ /**
62
+ * receive 의 alias — Phase G2 contract 의 명시적 이름. 기존 receive 호출자도
63
+ * 그대로 작동.
64
+ */
65
+ accept(component: any, options?: TransferOptions): Promise<void>;
66
+ /**
67
+ * Phase G5 — physical mover (robot-arm, AGV docking 등) 가 query 하는
68
+ * delivery world rotation. carrier 가 holder 에 도달했을 때 가져야 할
69
+ * world quaternion.
70
+ *
71
+ * delivery.world = holder.world.quat × acceptanceRotation_local
72
+ *
73
+ * source 가 이걸 미리 알면 TCP yaw 를 점진적으로 맞춰 carrier 가
74
+ * acceptance pose 에 도달한 채로 release → handoff 시 zero-delta → 시각적
75
+ * 점프 없음.
76
+ *
77
+ * acceptanceRotation 미정의 OR _realObject 미빌드 시 undefined.
78
+ */
79
+ deliveryWorldRotation(carrier: any): {
80
+ x: number;
81
+ y: number;
82
+ z: number;
83
+ w: number;
84
+ } | undefined;
85
+ /**
86
+ * Phase G9 — physical mover 가 query 하는 delivery world position.
87
+ *
88
+ * carrier 가 holder 에 도달했을 때 가져야 할 world XYZ. position 만 — rotation
89
+ * 은 deliveryWorldRotation 이 별도로 제공. 두 결과를 합치면 source 의 trajectory
90
+ * endpoint 가 됨.
91
+ *
92
+ * 기본 구현 — receivingSurfaceY 가 있으면 belt 표면 위, 없으면 slot.localPosition,
93
+ * 둘 다 없으면 holder object3d 원점.
94
+ *
95
+ * surface_world_y = holder.localToWorld((0, receivingSurfaceY - geometricOffsetY, 0)).y
96
+ * surface_world_xz = holder.world.xz
97
+ *
98
+ * receivingSurfaceY 의 정의가 cz-formula-tuned (= beltTopY + parent.geometricOffsetY)
99
+ * 라 그 차분 (- parent.geometricOffsetY) 으로 raw local 표면 Y 를 뽑아낸다.
100
+ *
101
+ * 호출 전제: holder 의 _realObject 가 빌드돼 있고 obj3d.matrixWorld 가 최신.
102
+ * 빌드 안 된 상태면 undefined → 호출자가 fallback (예: 2D bounds 기반).
103
+ */
104
+ deliveryWorldPosition(_carrier: any): {
105
+ x: number;
106
+ y: number;
107
+ z: number;
108
+ } | undefined;
37
109
  attachPointFor(component: any): CarrierAttachPoint | null;
38
110
  /** Count children currently assigned to `slotId`. */
39
111
  _countOccupied(slotId: string): number;
@@ -1 +1 @@
1
- {"version":3,"file":"container-capacity.d.ts","sourceRoot":"","sources":["../../src/transfer/container-capacity.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACjH,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAA;AAGvD,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,oBAAoB,CAAA;AAElD,KAAK,WAAW,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AAExD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK;kBARtC,GAAG,EAAE;QAa9C,mDAAmD;qBACtC,OAAO,EAAE;QAItB;;;WAGG;mCACwB,mBAAmB;8BAMxB,GAAG,GAAG,OAAO;4BAKf,GAAG,GAAG,OAAO,GAAG,IAAI;2BAsBf,GAAG,YAAW,eAAe,GAAQ,OAAO,CAAC,IAAI,CAAC;4BA+DjD,GAAG,UAAU,YAAY,YAAW,eAAe,GAAQ,OAAO,CAAC,IAAI,CAAC;0BAuBhF,GAAG,GAAG,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;QAI1E;;;;WAIG;iCACsB,GAAG,WAAW,YAAY,GAAG,IAAI;QAI1D;;;WAGG;+BACoB,GAAG,oBAAwB,IAAI;kCAS5B,GAAG,GAAG,kBAAkB,GAAG,IAAI;QAgBzD,qDAAqD;+BAC9B,MAAM,GAAG,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAMzC"}
1
+ {"version":3,"file":"container-capacity.d.ts","sourceRoot":"","sources":["../../src/transfer/container-capacity.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACjH,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAA;AAOvD,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,oBAAoB,CAAA;AAElD,KAAK,WAAW,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AAExD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK;kBARtC,GAAG,EAAE;QAa9C,mDAAmD;qBACtC,OAAO,EAAE;QAItB;;;WAGG;mCACwB,mBAAmB;8BAMxB,GAAG,GAAG,OAAO;4BAKf,GAAG,GAAG,OAAO,GAAG,IAAI;2BAsBf,GAAG,YAAW,eAAe,GAAQ,OAAO,CAAC,IAAI,CAAC;4BA+EjD,GAAG,UAAU,YAAY,YAAW,eAAe,GAAQ,OAAO,CAAC,IAAI,CAAC;0BAoChF,GAAG,GAAG,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;QAI1E;;;;WAIG;iCACsB,GAAG,WAAW,YAAY,GAAG,IAAI;QAI1D;;;WAGG;+BACoB,GAAG,oBAAwB,IAAI;QAWtD;;;;;;WAMG;qCAC0B,GAAG,UAAU,OAAO,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS;QAI9G;;;WAGG;6BACkB,GAAG,GAAG;YAAE,EAAE,EAAE,IAAI,CAAC;YAAC,IAAI,EAAE,OAAO,CAAA;SAAE,GAAG;YAAE,EAAE,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE;QAmBtF;;;WAGG;0BACe,GAAG,YAAY,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;QAIhE;;;;;;;;;;;;WAYG;uCAC4B,GAAG,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS;QAe/F;;;;;;;;;;;;;;;;;;WAkBG;wCAC6B,GAAG,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS;kCAwB3D,GAAG,GAAG,kBAAkB,GAAG,IAAI;QAgBzD,qDAAqD;+BAC9B,MAAM,GAAG,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAMzC"}
@@ -1,7 +1,15 @@
1
- export type { Vec3, Size3, Bounds3, SlotArrangement, GridShape, SlotDef, SlotAssignment, TransferOptions, StaticPolicy, DynamicPolicy, PendingPolicy, ConnectionPolicy, Port, TransferEventType, TransferEvent, CarrierAttachPoint, ArrangementStrategy, Transferable, NavigationTarget, NavigationOptions, Movable, ArticulatedCapability, MissionStatus, VehicleMission, MissionExecutor, SensorPoint, SpawnPoint, SinkPoint } from './types.js';
1
+ export type { Vec3, Size3, Bounds3, SlotArrangement, GridShape, SlotDef, SlotAssignment, TransferOptions, StaticPolicy, DynamicPolicy, PendingPolicy, ConnectionPolicy, Port, TransferEventType, TransferEvent, CarrierAttachPoint, ArrangementStrategy, Transferable, NavigationTarget, NavigationOptions, Movable, ArticulatedCapability, MissionStatus, VehicleMission, MissionExecutor, SensorPoint, SpawnPoint, SinkPoint, QuatLike, PoseSerialized, PickupFrame, PickupRequester, Pickable } from './types.js';
2
+ export { quatFromYaw, rectangularFootprintFrames, topApproachFrame, filterByToolType, chooseNearestPickupFrame } from './pickup-helpers.js';
3
+ export type { RectangularFootprintOptions, TopApproachOptions } from './pickup-helpers.js';
2
4
  export { FixedSlotStrategy, fixedSlotStrategy } from './fixed-slot-strategy.js';
3
5
  export { CenteringSlotStrategy } from './centering-slot-strategy.js';
4
6
  export { ContainerCapacity, TRANSFER_SLOT_KEY } from './container-capacity.js';
5
7
  export type { SimulationClock } from './simulation-clock.js';
6
8
  export { globalSimClock } from './simulation-clock.js';
9
+ export { Transfer, transferLog, receiptToJSON } from './transfer.js';
10
+ export type { TransferPhase, TransferTimeline, TransferReceipt, TransferReceiptJSON, TransferLogStats, PhysicalRunner, TransferInit } from './transfer.js';
11
+ export { ReservationTable, reservationTable, standardYieldPolicy, NavGraph, buildNavGraph, planPathAStar, planToReservations } from '../navigation/index.js';
12
+ export type { LaneGeometry, Lane, ConflictPair, Intersection, NavPolygon, OpenZone, TimeWindow, Reservation, SpeedProfile, PathSegment, PathPlan, PathPlanOptions, Navigable, YieldDecision, YieldPolicy, ReservationEvent, AddResult, Conflict, ConflictRecord, NavNode, NavEdge, BuildNavGraphOptions } from '../navigation/index.js';
13
+ export * from '../types/polygon-path.js';
14
+ export * from '../types/polygon-path-arc.js';
7
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,IAAI,EACJ,KAAK,EACL,OAAO,EACP,eAAe,EACf,SAAS,EACT,OAAO,EACP,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,IAAI,EACJ,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,UAAU,EACV,SAAS,EACV,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC9E,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,IAAI,EACJ,KAAK,EACL,OAAO,EACP,eAAe,EACf,SAAS,EACT,OAAO,EACP,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,IAAI,EACJ,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,UAAU,EACV,SAAS,EAET,QAAQ,EACR,cAAc,EACd,WAAW,EACX,eAAe,EACf,QAAQ,EACT,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE1F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC9E,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAItD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACpE,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACb,MAAM,eAAe,CAAA;AAItB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EACR,aAAa,EACb,aAAa,EACb,kBAAkB,EACnB,MAAM,wBAAwB,CAAA;AAC/B,YAAY,EACV,YAAY,EACZ,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,eAAe,EACf,SAAS,EACT,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,cAAc,EACd,OAAO,EACP,OAAO,EACP,oBAAoB,EACrB,MAAM,wBAAwB,CAAA;AAG/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,8BAA8B,CAAA"}
@@ -0,0 +1,65 @@
1
+ import type { PickupFrame, PickupRequester, Vec3, QuatLike, PoseSerialized } from './types.js';
2
+ /**
3
+ * Y 축 (3D vertical) 회전을 quaternion 으로. Three.js 없이 직접 계산 (cross-package
4
+ * 호환성).
5
+ *
6
+ * q = (0, sin(θ/2), 0, cos(θ/2))
7
+ */
8
+ export declare function quatFromYaw(yawRad: number): QuatLike;
9
+ export interface RectangularFootprintOptions {
10
+ /** carrier 의 world pose — entry 들이 이 frame 기준으로 회전/병진된다. */
11
+ carrierWorld: PoseSerialized;
12
+ /** carrier 의 가로 (X 방향). */
13
+ width: number;
14
+ /** carrier 의 세로 (Z 방향). */
15
+ depth: number;
16
+ /** entry 가 carrier 의 어느 높이에 있는가 (carrier-local Y). */
17
+ entryHeight: number;
18
+ /** approach 가 engage 에서 얼마나 떨어진 거리. */
19
+ approachDistance: number;
20
+ /** 어느 면에 entry 를 둘지. 'east'+'west' = 2-way, 4 개 다 = 4-way. */
21
+ sides: ReadonlyArray<'east' | 'west' | 'north' | 'south'>;
22
+ /** entry 의 toolType. 모두 동일하면 string, 면별 다르면 map. */
23
+ toolType: string | Partial<Record<'east' | 'west' | 'north' | 'south', string>>;
24
+ /** entry 의 tolerance. */
25
+ tolerance?: PickupFrame['tolerance'];
26
+ /** entry 의 priority. */
27
+ priority?: number;
28
+ }
29
+ /**
30
+ * 직사각형 carrier 의 N-면 진입 entry 들을 한꺼번에 생성.
31
+ *
32
+ * 각 entry 의 engage 는 carrier 의 해당 면 중심 (carrier-local), approach 는
33
+ * 그 외부 approachDistance 만큼 떨어진 점. 도구는 carrier 쪽을 향한 채 (yaw)
34
+ * 다가오는 자세.
35
+ */
36
+ export declare function rectangularFootprintFrames(options: RectangularFootprintOptions): PickupFrame[];
37
+ export interface TopApproachOptions {
38
+ carrierWorld: PoseSerialized;
39
+ /** carrier 의 top 표면 Y (carrier-local). */
40
+ topY: number;
41
+ /** approach 가 top 에서 얼마나 위에 있는가. */
42
+ approachDistance: number;
43
+ toolType: string;
44
+ tolerance?: PickupFrame['tolerance'];
45
+ priority?: number;
46
+ id?: string;
47
+ }
48
+ /**
49
+ * 위쪽 한 점 진입 (예: vacuum gripper 로 box 집기, 자석으로 철판 들기).
50
+ *
51
+ * engage 는 carrier 의 top 표면 중심, approach 는 그 위 approachDistance.
52
+ * 도구는 carrier 위에서 수직 하강 — yaw 보존 (도구가 회전하지 않음).
53
+ */
54
+ export declare function topApproachFrame(options: TopApproachOptions): PickupFrame;
55
+ /**
56
+ * Pickable.pickupFramesFor 의 기본 구현. 도구 type 일치하는 entry 만 통과.
57
+ * tool footprint 까지 검사하고 싶으면 carrier 가 자체 override.
58
+ */
59
+ export declare function filterByToolType(frames: PickupFrame[], requester: PickupRequester): PickupFrame[];
60
+ /**
61
+ * 두 entry 중 source 위치에 더 가까운 것을 고르는 helper. distance 는 approach
62
+ * pose 위치 기준. priority 가 다르면 priority 우선.
63
+ */
64
+ export declare function chooseNearestPickupFrame(frames: PickupFrame[], fromWorldPosition: Vec3): PickupFrame | null;
65
+ //# sourceMappingURL=pickup-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickup-helpers.d.ts","sourceRoot":"","sources":["../../src/transfer/pickup-helpers.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAI9F;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAQpD;AA2CD,MAAM,WAAW,2BAA2B;IAC1C,4DAA4D;IAC5D,YAAY,EAAE,cAAc,CAAA;IAC5B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAA;IACxB,8DAA8D;IAC9D,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,CAAA;IACzD,oDAAoD;IACpD,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/E,yBAAyB;IACzB,SAAS,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAA;IACpC,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAYD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,2BAA2B,GAAG,WAAW,EAAE,CAiD9F;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,cAAc,CAAA;IAC5B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAA;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAoBzE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EAAE,EACrB,SAAS,EAAE,eAAe,GACzB,WAAW,EAAE,CAEf;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EAAE,EACrB,iBAAiB,EAAE,IAAI,GACtB,WAAW,GAAG,IAAI,CAkBpB"}