@operato/scene-storage 10.0.0-beta.44 → 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 (42) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/crane-3d.d.ts +10 -0
  3. package/dist/crane-3d.js +34 -5
  4. package/dist/crane-3d.js.map +1 -1
  5. package/dist/crane.d.ts +136 -6
  6. package/dist/crane.js +567 -46
  7. package/dist/crane.js.map +1 -1
  8. package/dist/parcel-3d.d.ts +1 -0
  9. package/dist/parcel-3d.js +18 -1
  10. package/dist/parcel-3d.js.map +1 -1
  11. package/dist/rack-grid-3d.js +26 -8
  12. package/dist/rack-grid-3d.js.map +1 -1
  13. package/dist/rack-grid.d.ts +94 -10
  14. package/dist/rack-grid.js +468 -86
  15. package/dist/rack-grid.js.map +1 -1
  16. package/dist/storage-rack-3d.js +1 -1
  17. package/dist/storage-rack-3d.js.map +1 -1
  18. package/dist/storage-rack.d.ts +31 -6
  19. package/dist/storage-rack.js +96 -14
  20. package/dist/storage-rack.js.map +1 -1
  21. package/package.json +3 -3
  22. package/src/crane-3d.ts +34 -4
  23. package/src/crane.ts +615 -55
  24. package/src/parcel-3d.ts +19 -1
  25. package/src/rack-grid-3d.ts +31 -8
  26. package/src/rack-grid.ts +488 -82
  27. package/src/storage-rack-3d.ts +1 -1
  28. package/src/storage-rack.ts +96 -14
  29. package/test/test-coord-alignment.ts +2 -2
  30. package/test/test-crane-bay-match.ts +130 -0
  31. package/test/test-crane-binding-resolve.ts +168 -0
  32. package/test/test-crane-duration.ts +90 -0
  33. package/test/test-crane-rotation-reach.ts +218 -0
  34. package/test/test-rack-grid-3d-alignment.ts +235 -0
  35. package/test/test-rack-grid-3d-attach-real.ts +375 -0
  36. package/test/test-rack-grid-cell.ts +2 -2
  37. package/test/test-rack-grid-location.ts +2 -2
  38. package/test/test-rack-grid-occupied-slots.ts +165 -0
  39. package/test/test-rack-grid-picking-position.ts +154 -0
  40. package/test/test-rack-grid-slot-api.ts +483 -0
  41. package/test/test-slot-ids-enumeration.ts +137 -0
  42. package/tsconfig.tsbuildinfo +1 -1
package/src/parcel-3d.ts CHANGED
@@ -70,10 +70,28 @@ function _getLabelGeo(w: number, t: number, h: number): THREE.BoxGeometry {
70
70
  }
71
71
 
72
72
  export class Parcel3D extends RealObjectGroup {
73
+ // 처음 build 에서 finite size 받으면 cache. 이후 *NaN 으로 rebuild* 시 cache
74
+ // 값 사용 — *생성 직후 실제 크기 유지*. fallback (100x100x150) 은 *cache 도
75
+ // 없는 첫 호출에 NaN* 일 때만 사용.
76
+ private _cachedSize?: { w: number; h: number; d: number }
77
+
73
78
  build() {
74
79
  super.build()
75
80
 
76
- const { width, height, depth = 150 } = this.component.state
81
+ // NaN guard + cache. carrier.state.height/width *crane.receive
82
+ // bounds reflow* 시점에 NaN 으로 변할 수 있음 (cross-module state proxy
83
+ // 의 _state.h undefined + 계산 결과 NaN). 처음 build 의 finite 값을 instance
84
+ // 에 cache → 이후 NaN rebuild 에도 *실제 carrier 크기로 BoxGeometry* 유지.
85
+ const finite = (v: any) => typeof v === 'number' && Number.isFinite(v) && v > 0
86
+ const stateW = this.component.state.width
87
+ const stateH = this.component.state.height
88
+ const stateD = this.component.state.depth
89
+ if (this._cachedSize == null && finite(stateW) && finite(stateH) && finite(stateD)) {
90
+ this._cachedSize = { w: stateW, h: stateH, d: stateD }
91
+ }
92
+ const width = finite(stateW) ? stateW : (this._cachedSize?.w ?? 100)
93
+ const height = finite(stateH) ? stateH : (this._cachedSize?.h ?? 100)
94
+ const depth = finite(stateD) ? stateD : (this._cachedSize?.d ?? 150)
77
95
  const baseY = -depth / 2
78
96
 
79
97
  // ── Main body ────────────────────────────────────────────────────
@@ -60,13 +60,16 @@ export class RackGrid3D extends RealObjectGroup {
60
60
  this._frameGroup.add(this._beamGroup)
61
61
  this.object3d.add(this._frameGroup)
62
62
 
63
- const width = (rs?.width as number) ?? 400 // 3D X
64
- const height = (rs?.depth as number) ?? 2000 // 3D Y (floor → ceiling)
65
- const depth = (rs?.height as number) ?? 200 // 3D Z (front back)
63
+ // ?? 쓰면 NaN 통과 finite + positive 검증 후 default fallback.
64
+ const finite = (v: any, fb: number) =>
65
+ typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : fb
66
+ const width = finite(rs?.width, 400) // 3D X
67
+ const height = finite(rs?.depth, 2000) // 3D Y (floor → ceiling)
68
+ const depth = finite(rs?.height, 200) // 3D Z (front → back)
66
69
  const cols = comp.columns
67
70
  const rows = comp.rackRows
68
71
  const shelves = comp.shelves
69
- const shelfBase = Math.max(0, Math.min((rs?.shelfBaseHeight as number) || 0, height * 0.9))
72
+ const shelfBase = Math.max(0, Math.min(finite(rs?.shelfBaseHeight, 0), height * 0.9))
70
73
  const shelfZone = height - shelfBase
71
74
 
72
75
  const bayW = width / cols
@@ -313,10 +316,14 @@ export class RackGrid3D extends RealObjectGroup {
313
316
  const cols = comp.columns
314
317
  const rows = comp.rackRows
315
318
  const shelves = comp.shelves
316
- const width = (rs?.width as number) ?? 400
317
- const height = (rs?.depth as number) ?? 2000
318
- const depth = (rs?.height as number) ?? 200
319
- const shelfBase = Math.max(0, Math.min((rs?.shelfBaseHeight as number) || 0, height * 0.9))
319
+ // state.width/depth/height NaN 경우 ?? 는 nullish 만 fallback 이라 NaN 통과.
320
+ // 명시적 finite 검증 default 사용. NaN BoxGeometry 의 근본 원인.
321
+ const finite = (v: any, fb: number) =>
322
+ typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : fb
323
+ const width = finite(rs?.width, 400)
324
+ const height = finite(rs?.depth, 2000)
325
+ const depth = finite(rs?.height, 200)
326
+ const shelfBase = Math.max(0, Math.min(finite(rs?.shelfBaseHeight, 0), height * 0.9))
320
327
  const shelfZone = height - shelfBase
321
328
  const bayW = width / cols
322
329
  const bayD = depth / rows
@@ -328,6 +335,22 @@ export class RackGrid3D extends RealObjectGroup {
328
335
  const stockD = cellY * 0.7
329
336
  const stockH = bayD * 0.85
330
337
 
338
+ // 최종 차원이 finite 한지 검증 — accessor + finite() 거쳤어도 *모든 입력이 0* 이거나
339
+ // 예상 못한 경로로 NaN/0 가능성. invalid 시 stock mesh 생성 자체를 skip + 진단 로그.
340
+ if (
341
+ !Number.isFinite(stockW) || stockW <= 0 ||
342
+ !Number.isFinite(stockD) || stockD <= 0 ||
343
+ !Number.isFinite(stockH) || stockH <= 0
344
+ ) {
345
+ console.error('[rack-grid-3d] rebuildStockMesh: invalid stock dims — mesh 생성 skip', {
346
+ stockW, stockD, stockH,
347
+ cols, rows, shelves,
348
+ width, height, depth, shelfBase, shelfZone, cellY, bayW, bayD,
349
+ stateW: rs?.width, stateDepth: rs?.depth, stateH: rs?.height, stateShelfBase: rs?.shelfBaseHeight
350
+ })
351
+ return
352
+ }
353
+
331
354
  const records = comp.records
332
355
  const recordsByCell = new Map<string, any>()
333
356
  for (const r of records) {