@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.
- package/CHANGELOG.md +29 -0
- package/dist/crane-3d.d.ts +10 -0
- package/dist/crane-3d.js +34 -5
- package/dist/crane-3d.js.map +1 -1
- package/dist/crane.d.ts +136 -6
- package/dist/crane.js +567 -46
- package/dist/crane.js.map +1 -1
- package/dist/parcel-3d.d.ts +1 -0
- package/dist/parcel-3d.js +18 -1
- package/dist/parcel-3d.js.map +1 -1
- package/dist/rack-grid-3d.js +26 -8
- package/dist/rack-grid-3d.js.map +1 -1
- package/dist/rack-grid.d.ts +94 -10
- package/dist/rack-grid.js +468 -86
- package/dist/rack-grid.js.map +1 -1
- package/dist/storage-rack-3d.js +1 -1
- package/dist/storage-rack-3d.js.map +1 -1
- package/dist/storage-rack.d.ts +31 -6
- package/dist/storage-rack.js +96 -14
- package/dist/storage-rack.js.map +1 -1
- package/package.json +3 -3
- package/src/crane-3d.ts +34 -4
- package/src/crane.ts +615 -55
- package/src/parcel-3d.ts +19 -1
- package/src/rack-grid-3d.ts +31 -8
- package/src/rack-grid.ts +488 -82
- package/src/storage-rack-3d.ts +1 -1
- package/src/storage-rack.ts +96 -14
- package/test/test-coord-alignment.ts +2 -2
- package/test/test-crane-bay-match.ts +130 -0
- package/test/test-crane-binding-resolve.ts +168 -0
- package/test/test-crane-duration.ts +90 -0
- package/test/test-crane-rotation-reach.ts +218 -0
- package/test/test-rack-grid-3d-alignment.ts +235 -0
- package/test/test-rack-grid-3d-attach-real.ts +375 -0
- package/test/test-rack-grid-cell.ts +2 -2
- package/test/test-rack-grid-location.ts +2 -2
- package/test/test-rack-grid-occupied-slots.ts +165 -0
- package/test/test-rack-grid-picking-position.ts +154 -0
- package/test/test-rack-grid-slot-api.ts +483 -0
- package/test/test-slot-ids-enumeration.ts +137 -0
- 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
|
-
|
|
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 ────────────────────────────────────────────────────
|
package/src/rack-grid-3d.ts
CHANGED
|
@@ -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
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
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
|
|
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
|
-
|
|
317
|
-
|
|
318
|
-
const
|
|
319
|
-
|
|
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) {
|