@operato/scene-storage 10.0.0-beta.43 → 10.0.0-beta.46

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 (50) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/box-3d.d.ts +2 -0
  3. package/dist/box-3d.js +103 -64
  4. package/dist/box-3d.js.map +1 -1
  5. package/dist/crane-3d.d.ts +10 -0
  6. package/dist/crane-3d.js +34 -5
  7. package/dist/crane-3d.js.map +1 -1
  8. package/dist/crane.d.ts +136 -6
  9. package/dist/crane.js +567 -46
  10. package/dist/crane.js.map +1 -1
  11. package/dist/pallet-3d.d.ts +2 -0
  12. package/dist/pallet-3d.js +103 -53
  13. package/dist/pallet-3d.js.map +1 -1
  14. package/dist/parcel-3d.d.ts +1 -0
  15. package/dist/parcel-3d.js +18 -1
  16. package/dist/parcel-3d.js.map +1 -1
  17. package/dist/rack-grid-3d.js +26 -8
  18. package/dist/rack-grid-3d.js.map +1 -1
  19. package/dist/rack-grid.d.ts +94 -10
  20. package/dist/rack-grid.js +468 -86
  21. package/dist/rack-grid.js.map +1 -1
  22. package/dist/storage-rack-3d.js +1 -1
  23. package/dist/storage-rack-3d.js.map +1 -1
  24. package/dist/storage-rack.d.ts +31 -6
  25. package/dist/storage-rack.js +96 -14
  26. package/dist/storage-rack.js.map +1 -1
  27. package/package.json +3 -3
  28. package/src/box-3d.ts +121 -68
  29. package/src/crane-3d.ts +34 -4
  30. package/src/crane.ts +615 -55
  31. package/src/pallet-3d.ts +122 -55
  32. package/src/parcel-3d.ts +19 -1
  33. package/src/rack-grid-3d.ts +31 -8
  34. package/src/rack-grid.ts +488 -82
  35. package/src/storage-rack-3d.ts +1 -1
  36. package/src/storage-rack.ts +96 -14
  37. package/test/test-coord-alignment.ts +2 -2
  38. package/test/test-crane-bay-match.ts +130 -0
  39. package/test/test-crane-binding-resolve.ts +168 -0
  40. package/test/test-crane-duration.ts +90 -0
  41. package/test/test-crane-rotation-reach.ts +218 -0
  42. package/test/test-rack-grid-3d-alignment.ts +235 -0
  43. package/test/test-rack-grid-3d-attach-real.ts +375 -0
  44. package/test/test-rack-grid-cell.ts +2 -2
  45. package/test/test-rack-grid-location.ts +2 -2
  46. package/test/test-rack-grid-occupied-slots.ts +165 -0
  47. package/test/test-rack-grid-picking-position.ts +154 -0
  48. package/test/test-rack-grid-slot-api.ts +483 -0
  49. package/test/test-slot-ids-enumeration.ts +137 -0
  50. package/tsconfig.tsbuildinfo +1 -1
package/src/crane-3d.ts CHANGED
@@ -42,6 +42,26 @@ const RAIL_COLOR = 0x1a1f24 // rail — dark steel
42
42
  const LAMP_OFF = 0x222222
43
43
 
44
44
  export class Crane3D extends RealObjectGroup {
45
+ /**
46
+ * carriageHeight 의 실제 최댓값 — *mast 의 carriage 이동 가능 범위* 기반.
47
+ * mastH = D - railH * 2 - baseH - topFrameH - topGuideH (mast 의 실제 길이).
48
+ * carriage 의 *top edge 가 mast top 안에 머물도록* carriageH/2 추가 차감.
49
+ *
50
+ * 이전 D * 0.85 magic 대체 — base/top frame 의 실제 차지 비율과 무관한 추정값
51
+ * 이라 crane.depth = rack.depth 동일 모델에서도 carriage 가 rack 상위 cell
52
+ * 도달 못 함. 정확한 mastH 사용으로 *동일 size 모델에서 정상 도달* 보장.
53
+ */
54
+ static _maxCarriageHeight(D: number, width: number, height: number): number {
55
+ const S = Math.min(width, height)
56
+ const railH = S * 0.04
57
+ const baseH = S * 0.18
58
+ const topFrameH = S * 0.1
59
+ const topGuideH = S * 0.1
60
+ const carriageH = S * 0.12
61
+ const mastH = Math.max(D - railH * 2 - baseH - topFrameH - topGuideH, S * 0.5)
62
+ return Math.max(0, mastH - carriageH / 2)
63
+ }
64
+
45
65
  private _forkGroup?: THREE.Group
46
66
  private _carrierBaseY: number = 0
47
67
  private _bladeMidZ: number = 0
@@ -79,7 +99,12 @@ export class Crane3D extends RealObjectGroup {
79
99
  // Actuators
80
100
  const D = numOr(depth, Math.max(width, height) * 4)
81
101
  const carriageRaw = numOr((this.component.state as any).carriageHeight, (this.component as any)._canonicalDefault?.('carriageHeight') ?? D * 0.4)
82
- const carriageHeight = Math.max(0, Math.min(carriageRaw, D * 0.85))
102
+ // carriageHeight clamp 실제 mast carriage 이동 가능 범위 기반. helper 사용
103
+ // (render + onchange partial update 둘 다 동일 식). 이전엔 D * 0.85 magic 사용 —
104
+ // base/top frame 의 실제 차지 비율과 무관한 추정. crane.depth = rack.depth 동일
105
+ // 모델에서도 carriage 가 rack 상위 cell 도달 불가 → 14 levels rack 의 *마지막
106
+ // shelf 만 한 층 아래에서 포킹* 증상의 root cause 였음.
107
+ const carriageHeight = Math.max(0, Math.min(carriageRaw, Crane3D._maxCarriageHeight(D, width, height)))
83
108
 
84
109
  const forkLength = numOr((this.component.state as any).forkLength, height * 0.6)
85
110
  const forkExtensionRaw = numOr((this.component.state as any).forkExtension, 0)
@@ -362,9 +387,11 @@ export class Crane3D extends RealObjectGroup {
362
387
  let meshUpdated = false
363
388
  if (('carriageHeight' in after || 'forkLiftRT' in after) && this._carriageLiftGroup) {
364
389
  const state = this.component.state as any
365
- const D = numOr(state.depth, Math.max(numOr(state.width, 100), numOr(state.height, 100)) * 4)
390
+ const W = numOr(state.width, 100)
391
+ const H = numOr(state.height, 100)
392
+ const D = numOr(state.depth, Math.max(W, H) * 4)
366
393
  const carriageRaw = numOr(state.carriageHeight, D * 0.4)
367
- const carriageHeight = Math.max(0, Math.min(carriageRaw, D * 0.85))
394
+ const carriageHeight = Math.max(0, Math.min(carriageRaw, Crane3D._maxCarriageHeight(D, W, H)))
368
395
  const forkLift = numOr(state.forkLiftRT, 0)
369
396
  this._carriageLiftGroup.position.y = this._computeLiftGroupY(carriageHeight, forkLift)
370
397
  meshUpdated = true
@@ -458,7 +485,10 @@ export class Crane3D extends RealObjectGroup {
458
485
  if (this._forkGroup) {
459
486
  for (const child of this._forkGroup.children) {
460
487
  const ctx = (child as any).userData?.context
461
- if (ctx && ctx !== this && ctx instanceof RealObject) {
488
+ // `ctx instanceof RealObject` *cross-module identity 실패* 가능
489
+ // (Parcel3D 가 다른 things-scene 인스턴스의 RealObject 를 extend 한 경우
490
+ // instanceof 가 false 반환). duck-type 으로 완화 — *crane 자신만 제외*.
491
+ if (ctx && ctx !== this) {
462
492
  child.position.z = this._bladeMidZ
463
493
  }
464
494
  }