@fmsim/machine 2.0.0-beta.20 → 2.0.0-beta.23

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.
@@ -1 +1 @@
1
- {"version":3,"file":"machine-3d.js","sourceRoot":"","sources":["../../src/factories/machine-3d.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCS 설비 컴포넌트 3D 팩토리\n *\n * 10,000+ 인스턴스를 위한 최소 폴리곤 설계:\n * - 컴포넌트당 단일 Mesh (draw call 최소화)\n * - BoxGeometry / ExtrudeGeometry(hexagon) 만 사용\n * - Machine: 높은 depth, 컨테이너는 반투명\n * - Unit: 낮은 depth, 불투명\n */\n\nimport * as THREE from 'three'\nimport { RealObjectGroup, registerRealObjectFactory, disposeObject3D } from '@hatiolab/things-scene'\nimport type { Component } from '@hatiolab/things-scene'\nimport { LEGEND_CAPACITY } from '../features/mcs-status-default'\nimport { getVaueOnRanges } from '../utils/get-value-on-ranges'\n\n// ── 설정 타입 ────────────────────────────────────────────\n\ninterface MCS3DConfig {\n /** state.depth 미설정 시 기본 depth.\n * defaultDepth > 0이면 절대값, 아니면 min(w,h) * depthRatio */\n depthRatio: number\n defaultDepth?: number\n /** true이면 syncZPosOffset = TRANSPORT_SURFACE_HEIGHT */\n defaultZPosFromParent?: boolean\n /** 1.0 = 불투명, 0.35 = 반투명 컨테이너 */\n opacity: number\n metalness: number\n roughness: number\n /** statusColor 미사용 시 기본 색상 */\n defaultColor: number\n /** 'box' | 'hexagon' */\n shape: 'box' | 'hexagon' | 'plane'\n /** mesh 생성 전 가시성 판정 — false 반환 시 mesh 미생성 */\n isVisible?: (component: Component) => boolean\n /** 부모 대비 크기 비율 (기본 1.0). < 1이면 부모 중심에 배치. */\n sizeRatio?: number\n /** 상부 면 제거 (5면 개방 박스) */\n openTop?: boolean\n /** 상판 무반사 (MeshBasicMaterial) */\n matteTop?: boolean\n /** 상판에 2D 렌더링 텍스처 적용 */\n texturedTop?: boolean\n /** 자체 발광 강도 (0~1). 조명 약한 면에서도 색상 유지 */\n emissiveIntensity?: number\n /** 바닥면 유지 (기본 false — 바닥면 제거) */\n keepBottomFace?: boolean\n}\n\n/**\n * 포트 기본 높이 (절대값).\n * 모든 이송장치의 상단 높이 = 이 값.\n * 캐리어가 이송장치 간 높이 차 없이 이동할 수 있는 기준 높이.\n */\nexport const TRANSPORT_SURFACE_HEIGHT = 30\n\nconst DEFAULTS: MCS3DConfig = {\n depthRatio: 0.5,\n opacity: 1.0,\n metalness: 0.3,\n roughness: 0.7,\n defaultColor: 0xaabbcc,\n shape: 'box',\n}\n\n// ── 3D 오브젝트 ──────────────────────────────────────────\n\nclass MCSRealObject3D extends RealObjectGroup {\n private _config: MCS3DConfig\n\n constructor(component: Component, config: MCS3DConfig) {\n super(component)\n this._config = config\n }\n\n // width, height 절대값 (음수 값은 양수로 취급)\n protected get absSize(): { w: number; h: number } {\n const { width = 10, height = 10 } = this.component.state\n return { w: Math.abs(width), h: Math.abs(height) }\n }\n\n get effectiveDepth(): number {\n const { depth } = this.component.state\n if (depth) return depth\n if (this._config.defaultDepth) return this._config.defaultDepth\n const { w, h } = this.absSize\n return Math.min(w, h) * this._config.depthRatio\n }\n\n protected get syncZPosOffset(): number {\n // Port: 이송 표면 높이에 배치\n if (this._config.defaultZPosFromParent) {\n return TRANSPORT_SURFACE_HEIGHT\n }\n // Carrier: Port 안이면 중앙, 그 외 컨테이너면 상단 위\n if (this._config.sizeRatio && this._config.sizeRatio < 1) {\n const parentType = this.component.parent?.state?.type\n if (parentType === 'Port' || parentType === 'Shelf' || parentType === 'OHT' || parentType === 'Shuttle') {\n return 0\n }\n return TRANSPORT_SURFACE_HEIGHT\n }\n return 0\n }\n\n // 컴포넌트의 상태 색상(statusColor) 또는 fillStyle → Three.js 색상 변환\n protected resolveColor(): number {\n const comp = this.component as any\n\n // 1) MCSStatusMixin.statusColor (legend 기반 상태 색상)\n // '#F0F0F0'은 상태 미설정 시 기본 fallback — 무시하고 defaultColor 사용\n try {\n const sc = comp.statusColor\n if (typeof sc === 'string' && sc && sc.toUpperCase() !== '#F0F0F0') return new THREE.Color(sc).getHex()\n } catch {\n /* statusColor 미구현 시 무시 */\n }\n\n // 2) state.fillStyle fallback\n const { fillStyle } = this.component.state\n if (fillStyle && typeof fillStyle === 'string') {\n try {\n return new THREE.Color(fillStyle).getHex()\n } catch {\n /* 파싱 실패 시 무시 */\n }\n }\n\n return this._config.defaultColor\n }\n\n // ── Geometry helpers ──\n\n /**\n * 바닥면(-Y 방향) 삼각형 제거: z-fighting 근본 해결.\n * 바닥면이 없으면 floor grid와 겹칠 면 자체가 없어진다.\n */\n private removeBottomFace(geometry: THREE.BufferGeometry): THREE.BufferGeometry {\n const posAttr = geometry.getAttribute('position')\n const normAttr = geometry.getAttribute('normal')\n const index = geometry.getIndex()\n\n if (!posAttr || !normAttr || !index) return geometry\n\n const newIndices: number[] = []\n const normalY = new THREE.Vector3()\n\n for (let i = 0; i < index.count; i += 3) {\n const a = index.getX(i)\n const b = index.getX(i + 1)\n const c = index.getX(i + 2)\n\n // 세 꼭짓점 노말의 Y 성분 평균으로 방향 판단\n const avgY = (normAttr.getY(a) + normAttr.getY(b) + normAttr.getY(c)) / 3\n\n // -Y 방향 삼각형 제거 (threshold -0.9: 거의 아래를 향하는 면만)\n if (avgY > -0.9) {\n newIndices.push(a, b, c)\n }\n }\n\n geometry.setIndex(newIndices)\n return geometry\n }\n\n // ── Geometry builders ──\n\n private buildBoxGeometry(w: number, d: number, h: number): THREE.BufferGeometry {\n const geo = new THREE.BoxGeometry(w, d, h)\n return this._config.keepBottomFace ? geo : this.removeBottomFace(geo)\n }\n\n private buildHexagonGeometry(w: number, d: number, h: number): THREE.BufferGeometry {\n // Buffer의 2D 형태: 좌우 끝이 꺾인 육각형\n const offset = Math.min(w, h) * 0.2\n const hw = w / 2\n const hh = h / 2\n\n const shape = new THREE.Shape()\n shape.moveTo(-hw + offset, -hh)\n shape.lineTo(hw - offset, -hh)\n shape.lineTo(hw, 0)\n shape.lineTo(hw - offset, hh)\n shape.lineTo(-hw + offset, hh)\n shape.lineTo(-hw, 0)\n shape.closePath()\n\n const geo = new THREE.ExtrudeGeometry(shape, {\n steps: 1,\n depth: d,\n bevelEnabled: false,\n })\n\n // 중심 정렬 후 Y-up 좌표계 회전 (extrude 축: +Z → +Y)\n geo.translate(0, 0, -d / 2)\n geo.rotateX(Math.PI / 2)\n\n return this.removeBottomFace(geo)\n }\n\n private buildPlaneGeometry(w: number, h: number): THREE.BufferGeometry {\n const geo = new THREE.PlaneGeometry(w, h)\n geo.rotateX(-Math.PI / 2)\n return geo\n }\n\n // ── Build ──\n\n protected _ownMesh?: THREE.Mesh\n\n build() {\n super.build()\n\n // 가시성 판정 — e.g., Carrier는 데이터 없으면 mesh 미생성\n if (this._config.isVisible && !this._config.isVisible(this.component)) return\n\n const { w: rawW, h: rawH } = this.absSize\n const rawDepth = this.effectiveDepth\n if (!rawW || !rawH) return\n\n const ratio = this._config.sizeRatio ?? 1.0\n const w = rawW * ratio\n const h = rawH * ratio\n const depth = rawDepth * ratio\n\n const color = this.resolveColor()\n const { opacity, metalness, roughness, shape } = this._config\n\n const geometry =\n shape === 'plane'\n ? this.buildPlaneGeometry(w, h)\n : shape === 'hexagon'\n ? this.buildHexagonGeometry(w, depth, h)\n : this.buildBoxGeometry(w, depth, h)\n\n const isPlane = shape === 'plane'\n const material = isPlane\n ? new THREE.MeshBasicMaterial({\n color,\n opacity,\n transparent: opacity < 1,\n side: THREE.DoubleSide,\n depthWrite: opacity >= 0.9,\n })\n : new THREE.MeshStandardMaterial({\n color,\n metalness,\n roughness,\n opacity,\n transparent: opacity < 1,\n side: opacity < 1 ? THREE.DoubleSide : THREE.FrontSide,\n depthWrite: opacity >= 0.9,\n ...(this._config.emissiveIntensity ? { emissive: color, emissiveIntensity: this._config.emissiveIntensity } : {}),\n })\n // z-fighting 방지: 바닥면(floor grid)보다 항상 앞에 렌더링\n material.polygonOffset = true\n material.polygonOffsetFactor = -1\n material.polygonOffsetUnit = -1\n\n // BoxGeometry material groups: +x(0), -x(1), +y(2), -y(3), +z(4), -z(5)\n let meshMaterial: THREE.Material | THREE.Material[] = material\n if (shape === 'box') {\n if (this._config.openTop) {\n // 상단면 제거 → 5면 개방 박스\n const invisible = new THREE.MeshBasicMaterial({ visible: false })\n meshMaterial = [material, material, invisible, material, material, material]\n } else if (this._config.texturedTop) {\n // 상판에 2D 렌더링 텍스처\n const topMat = this.buildTopTexture(w, h)\n meshMaterial = [material, material, topMat, material, material, material]\n } else if (this._config.matteTop) {\n // 상판만 무반사\n const matte = new THREE.MeshBasicMaterial({ color, opacity, transparent: opacity < 1 })\n meshMaterial = [material, material, matte, material, material, material]\n }\n }\n\n this._ownMesh = new THREE.Mesh(geometry, meshMaterial)\n // sizeRatio < 1이면 부모 중심에 배치 (rawDepth/2), plane은 살짝 띄움\n this._ownMesh.position.y = isPlane ? 1 : ratio < 1 ? rawDepth / 2 : depth / 2\n this._ownMesh.castShadow = !isPlane\n this._ownMesh.receiveShadow = true\n this.object3d.add(this._ownMesh)\n }\n\n // ── Change handling ──\n\n private _updatePending = false\n\n onchange(after: Record<string, unknown>, before: Record<string, unknown>) {\n if (\n 'width' in after ||\n 'height' in after ||\n 'depth' in after ||\n 'fillStyle' in after ||\n 'strokeStyle' in after ||\n 'id' in after ||\n 'EMPTYTYPE' in after ||\n 'CARRIERSTATUS' in after\n ) {\n // 연속 setState에 의한 다중 rebuild 방지: 한 프레임에 한 번만 실행\n if (!this._updatePending) {\n this._updatePending = true\n queueMicrotask(() => {\n this._updatePending = false\n this.update()\n })\n }\n return\n }\n\n super.onchange(after, before)\n }\n\n /**\n * 상판 텍스처: 컴포넌트의 2D render()를 캔버스에 그려서 텍스처로 사용\n */\n protected buildTopTexture(w: number, h: number): THREE.MeshBasicMaterial {\n const scale = 4\n const cw = this.nextPow2(w * scale)\n const ch = this.nextPow2(h * scale)\n const canvas = document.createElement('canvas')\n canvas.width = cw\n canvas.height = ch\n const ctx = canvas.getContext('2d')!\n\n const statusColor = '#' + this.resolveColor().toString(16).padStart(6, '0')\n const emptyType = (this.component.state as any)?.EMPTYTYPE || ''\n const text = emptyType === 'FULL' ? 'F' : emptyType === 'EMPTY' ? 'E' : emptyType === 'EMPTYEMPTY' ? 'X' : ''\n\n // 실제 사용 영역 (nextPow2 이전 크기)\n const usedW = w * scale\n const usedH = h * scale\n\n // 바탕: 캐리어 상태 색상 (사용 영역만)\n ctx.fillStyle = statusColor\n ctx.fillRect(0, 0, usedW, usedH)\n\n // 텍스트 (사용 영역 중앙)\n if (text) {\n const fontSize = Math.round(Math.min(usedW, usedH) * 0.7)\n ctx.font = `bold ${fontSize}px Arial`\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillStyle = '#000000'\n ctx.fillText(text, usedW / 2, usedH / 2)\n }\n\n const texture = new THREE.CanvasTexture(canvas)\n texture.offset.set(0, 1 - usedH / ch)\n texture.repeat.set(usedW / cw, usedH / ch)\n texture.colorSpace = THREE.SRGBColorSpace\n\n return new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n side: THREE.DoubleSide,\n })\n }\n\n private nextPow2(n: number): number {\n if (!(n > 0)) return 1\n let v = Math.ceil(n)\n v--\n v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16\n return v + 1\n }\n\n /**\n * 자신의 mesh만 제거 후 rebuild.\n * 기본 update()는 clear()로 object3d의 모든 children을 제거하는데,\n * 컨테이너(Port 등)의 경우 자식 컴포넌트(Carrier 등)의 3D 오브젝트도 함께 제거됨.\n * 이를 방지하기 위해 자신이 생성한 mesh만 제거한다.\n */\n update() {\n // 자신의 mesh만 제거 (자식 컴포넌트 3D 오브젝트 보존)\n if (this._ownMesh) {\n this.object3d.remove(this._ownMesh)\n disposeObject3D(this._ownMesh)\n this._ownMesh = undefined\n }\n\n this.build()\n this.updateTransform()\n this.updateAlpha()\n this.updateHidden()\n }\n\n // RealObjectGroup 기본 동작 비활성화\n updateDimension() {}\n\n updateAlpha() {\n const { alpha = 1 } = this.component.state\n const configOpacity = this._config.opacity\n const effective = configOpacity * alpha\n\n this.object3d.traverse((o: any) => {\n if (!o.material) return\n const materials = Array.isArray(o.material) ? o.material : [o.material]\n for (const m of materials) {\n if (!m.visible) continue // openTop invisible face 무시\n if (m.map) continue // 텍스처 material은 자체 transparent 유지\n m.opacity = effective\n m.transparent = effective < 1\n }\n })\n }\n}\n\n// ── 팩토리 등록 헬퍼 ─────────────────────────────────────\n\nfunction register(type: string, overrides: Partial<MCS3DConfig> = {}) {\n const config: MCS3DConfig = { ...DEFAULTS, ...overrides }\n registerRealObjectFactory(type, (component: Component) => new MCSRealObject3D(component, config))\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Machine (인프라 설비) — 높은 depth, 컨테이너는 반투명\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nregister('Equipment', {\n defaultDepth: 3 * TRANSPORT_SURFACE_HEIGHT,\n opacity: 0.75,\n metalness: 0.4,\n roughness: 0.6,\n defaultColor: 0x8899aa,\n})\n\nregister('Buffer', {\n defaultDepth: TRANSPORT_SURFACE_HEIGHT,\n opacity: 1.0,\n metalness: 0.3,\n roughness: 0.7,\n defaultColor: 0x99aa88,\n shape: 'hexagon',\n})\n\nregister('AGVLine', {\n depthRatio: 0.12,\n metalness: 0.6,\n roughness: 0.3,\n defaultColor: 0x888899,\n})\n\nregister('OHTLine', {\n depthRatio: 0.12,\n metalness: 0.6,\n roughness: 0.3,\n defaultColor: 0x888899,\n})\n\n// STOCKER: 벽면에 용량 게이지 바를 포함하는 커스텀 3D 오브젝트\nconst STOCKER_CONFIG: MCS3DConfig = {\n ...DEFAULTS,\n defaultDepth: 5 * TRANSPORT_SURFACE_HEIGHT,\n opacity: 0.75,\n metalness: 0.3,\n roughness: 0.6,\n defaultColor: 0x8899bb,\n}\n\nclass StockerRealObject3D extends MCSRealObject3D {\n private gaugeMesh?: THREE.Mesh\n\n constructor(component: Component) {\n super(component, STOCKER_CONFIG)\n }\n\n build() {\n super.build()\n this.buildGauge()\n }\n\n private buildGauge() {\n const comp = this.component as any\n const data = comp.data || {}\n const gaugeMode = comp.root?.style?.stockerGaugeMode || 'capacity'\n\n const gauge = this.resolveGauge(data, gaugeMode)\n\n // 테두리는 스토커의 상태 색상 (machine status)\n const statusColor = comp.statusColor\n if (statusColor && statusColor.toUpperCase() !== '#F0F0F0') {\n gauge.borderColor = statusColor\n }\n\n const { w, h } = this.absSize\n const depth = this.effectiveDepth\n const isWidthLonger = w >= h\n\n // 게이지 캔버스 (고해상도)\n const barW = 130\n const barH = 26\n const scale = 4\n const canvasW = barW * scale\n const canvasH = barH * scale\n const canvas = document.createElement('canvas')\n canvas.width = canvasW\n canvas.height = canvasH\n const ctx = canvas.getContext('2d')!\n\n const pad = 12\n\n // 배경 + 테두리\n ctx.fillStyle = '#dddddd'\n ctx.fillRect(0, 0, canvasW, canvasH)\n ctx.strokeStyle = gauge.borderColor\n ctx.lineWidth = 12\n ctx.strokeRect(6, 6, canvasW - 12, canvasH - 12)\n\n // 세그먼트 채움 (왼→오)\n const innerW = canvasW - pad * 2\n const innerH = canvasH - pad * 2\n let x = pad\n for (const seg of gauge.segments) {\n const segW = Math.max(innerW * seg.ratio, seg.ratio > 0 ? 1 : 0)\n if (segW <= 0) continue\n ctx.fillStyle = seg.color\n ctx.fillRect(x, pad, segW, innerH)\n x += segW\n }\n\n // 텍스트\n ctx.font = `bold ${10 * scale}px sans-serif`\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillStyle = '#333333'\n ctx.fillText(gauge.label, canvasW / 2, canvasH / 2)\n\n // 텍스처 → Plane\n const texture = new THREE.CanvasTexture(canvas)\n texture.colorSpace = THREE.SRGBColorSpace\n\n const geo = new THREE.PlaneGeometry(barW, barH)\n geo.rotateX(-Math.PI / 2) // 수평 (지붕 위)\n if (!isWidthLonger) geo.rotateY(Math.PI / 2)\n\n const mat = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n side: THREE.DoubleSide,\n })\n mat.polygonOffset = true\n mat.polygonOffsetFactor = -2\n mat.polygonOffsetUnit = -2\n\n this.gaugeMesh = new THREE.Mesh(geo, mat)\n this.gaugeMesh.position.set(0, depth + 0.5, 0)\n this.object3d.add(this.gaugeMesh)\n }\n\n private resolveGauge(data: any, mode: string) {\n switch (mode) {\n case 'carrier': {\n const full = Number(data.FULL_CNT) || 0\n const empty = Number(data.EMPTY_CNT) || 0\n const emptyEmpty = Number(data.EMPTYEMPTY_CNT) || 0\n const total = full + empty + emptyEmpty\n const segments = total > 0\n ? [\n { ratio: full / total, color: '#4AA7FE' },\n { ratio: empty / total, color: '#8BDA5B' },\n { ratio: emptyEmpty / total, color: '#019D59' },\n ]\n : [{ ratio: 1, color: '#dddddd' }]\n return {\n segments,\n borderColor: '#4AA7FE',\n label: total > 0 ? `F${full} E${empty} EE${emptyEmpty}` : '',\n }\n }\n case 'abnormal': {\n const normal = Number(data.CARRIER_NORMAL) || 0\n const abnormal = Number(data.CARRIER_ABNORMAL) || 0\n const total = normal + abnormal\n const segments = total > 0\n ? [\n { ratio: normal / total, color: '#8BDA5B' },\n { ratio: abnormal / total, color: '#F4B4B4' },\n ]\n : [{ ratio: 1, color: '#dddddd' }]\n return {\n segments,\n borderColor: abnormal > 0 ? '#F4B4B4' : '#8BDA5B',\n label: total > 0 ? `N${normal} A${abnormal}` : '',\n }\n }\n default: { // capacity\n const cur = Number(data.CURRENTCAPACITY) || 0\n const max = Number(data.MAXCAPACITY) || 100\n const fullup = data.FULLUP === 'T'\n const usage = Math.round((cur / max) * 100)\n const legend = (this.component as any).root?.style?.LEGEND_CAPACITY || LEGEND_CAPACITY\n const color = fullup ? 'red' : (getVaueOnRanges(usage, legend) || '#44aa44')\n return {\n segments: [{ ratio: usage / 100, color }],\n borderColor: color,\n label: `${usage}%`,\n }\n }\n }\n }\n\n onchange(after: Record<string, unknown>, before: Record<string, unknown>) {\n if ('data' in after) {\n this.clearGauge()\n this.buildGauge()\n }\n super.onchange(after, before)\n }\n\n clear() {\n this.clearGauge()\n return super.clear()\n }\n\n private clearGauge() {\n if (this.gaugeMesh) {\n this.object3d.remove(this.gaugeMesh)\n this.gaugeMesh.geometry?.dispose()\n const mat = this.gaugeMesh.material as THREE.MeshBasicMaterial\n mat?.map?.dispose()\n mat?.dispose()\n this.gaugeMesh = undefined\n }\n }\n}\n\nregisterRealObjectFactory('STOCKER', (component: Component) => new StockerRealObject3D(component))\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Unit (이동체 · 홀더) — 낮은 depth, 불투명\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n// Port: 바닥판 (PlaneGeometry)\nconst PORT_CONFIG: MCS3DConfig = {\n ...DEFAULTS,\n depthRatio: 0.01,\n defaultZPosFromParent: true,\n opacity: 0.1,\n metalness: 0.3,\n roughness: 0.8,\n defaultColor: 0xb0a090,\n shape: 'plane',\n}\nregisterRealObjectFactory('Port', (component: Component) => new MCSRealObject3D(component, PORT_CONFIG))\n\nregister('Shelf', {\n depthRatio: 0.25,\n metalness: 0.3,\n roughness: 0.7,\n defaultColor: 0xaabbcc,\n})\n\n// Carrier: CARRIERSTATUS에 따른 3D 애니메이션 지원\nconst CARRIER_CONFIG: MCS3DConfig = {\n ...DEFAULTS,\n depthRatio: 0.5,\n metalness: 0,\n roughness: 1,\n defaultColor: 0x66bb66,\n isVisible: (c: Component) => !!(c.state as any).id,\n sizeRatio: 0.8,\n texturedTop: true,\n}\n\nclass CarrierRealObject3D extends MCSRealObject3D {\n constructor(component: Component) {\n super(component, CARRIER_CONFIG)\n }\n}\n\nregisterRealObjectFactory('Carrier', (component: Component) => new CarrierRealObject3D(component))\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Gauge (용량 게이지) — 얇은 바\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Gauge (용량 게이지) — 2D 렌더링을 Plane 텍스처로 3D 표시\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n// Gauge 컴포넌트 (StockerCapacityBar, ZoneCapacityBar, MCSGaugeCapacityBar)는\n// 3D에서 표시하지 않음. 대신 부모(STOCKER 등)의 3D 모델에서 직접 게이지를 렌더링.\nregisterRealObjectFactory('StockerCapacityBar', () => null as any)\nregisterRealObjectFactory('MCSGaugeCapacityBar', () => null as any)\nregisterRealObjectFactory('ZoneCapacityBar', () => null as any)\n"]}
1
+ {"version":3,"file":"machine-3d.js","sourceRoot":"","sources":["../../src/factories/machine-3d.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCS 설비 컴포넌트 3D 팩토리\n *\n * 10,000+ 인스턴스를 위한 최소 폴리곤 설계:\n * - 컴포넌트당 단일 Mesh (draw call 최소화)\n * - BoxGeometry / ExtrudeGeometry(hexagon) 만 사용\n * - Machine: 높은 depth, 컨테이너는 반투명\n * - Unit: 낮은 depth, 불투명\n */\n\nimport * as THREE from 'three'\nimport { RealObjectGroup, registerRealObjectFactory, disposeObject3D } from '@hatiolab/things-scene'\nimport type { Component } from '@hatiolab/things-scene'\nimport { LEGEND_CAPACITY } from '../features/mcs-status-default'\nimport { getVaueOnRanges } from '../utils/get-value-on-ranges'\n\n// ── 설정 타입 ────────────────────────────────────────────\n\ninterface MCS3DConfig {\n /** state.depth 미설정 시 기본 depth.\n * defaultDepth > 0이면 절대값, 아니면 min(w,h) * depthRatio */\n depthRatio: number\n defaultDepth?: number\n /** true이면 syncZPosOffset = TRANSPORT_SURFACE_HEIGHT */\n defaultZPosFromParent?: boolean\n /** 1.0 = 불투명, 0.35 = 반투명 컨테이너 */\n opacity: number\n metalness: number\n roughness: number\n /** statusColor 미사용 시 기본 색상 */\n defaultColor: number\n /** 'box' | 'hexagon' */\n shape: 'box' | 'hexagon' | 'plane'\n /** mesh 생성 전 가시성 판정 — false 반환 시 mesh 미생성 */\n isVisible?: (component: Component) => boolean\n /** 부모 대비 크기 비율 (기본 1.0). < 1이면 부모 중심에 배치. */\n sizeRatio?: number\n /** 상부 면 제거 (5면 개방 박스) */\n openTop?: boolean\n /** 상판 무반사 (MeshBasicMaterial) */\n matteTop?: boolean\n /** 상판에 2D 렌더링 텍스처 적용 */\n texturedTop?: boolean\n /** 자체 발광 강도 (0~1). 조명 약한 면에서도 색상 유지 */\n emissiveIntensity?: number\n /** 바닥면 유지 (기본 false — 바닥면 제거) */\n keepBottomFace?: boolean\n}\n\n/**\n * 포트 기본 높이 (절대값).\n * 모든 이송장치의 상단 높이 = 이 값.\n * 캐리어가 이송장치 간 높이 차 없이 이동할 수 있는 기준 높이.\n */\nexport const TRANSPORT_SURFACE_HEIGHT = 30\n\nconst DEFAULTS: MCS3DConfig = {\n depthRatio: 0.5,\n opacity: 1.0,\n metalness: 0.3,\n roughness: 0.7,\n defaultColor: 0xaabbcc,\n shape: 'box',\n}\n\n// ── 3D 오브젝트 ──────────────────────────────────────────\n\nclass MCSRealObject3D extends RealObjectGroup {\n private _config: MCS3DConfig\n\n constructor(component: Component, config: MCS3DConfig) {\n super(component)\n this._config = config\n }\n\n // width, height 절대값 (음수 값은 양수로 취급)\n protected get absSize(): { w: number; h: number } {\n const { width = 10, height = 10 } = this.component.state\n return { w: Math.abs(width), h: Math.abs(height) }\n }\n\n get effectiveDepth(): number {\n const { depth } = this.component.state\n if (depth) return depth\n if (this._config.defaultDepth) return this._config.defaultDepth\n const { w, h } = this.absSize\n return Math.min(w, h) * this._config.depthRatio\n }\n\n protected get syncZPosOffset(): number {\n // Port: 이송 표면 높이에 배치\n if (this._config.defaultZPosFromParent) {\n return TRANSPORT_SURFACE_HEIGHT\n }\n // Carrier: Port 안이면 중앙, 그 외 컨테이너면 상단 위\n if (this._config.sizeRatio && this._config.sizeRatio < 1) {\n const parentType = this.component.parent?.state?.type\n if (parentType === 'Port' || parentType === 'Shelf' || parentType === 'OHT' || parentType === 'Shuttle') {\n return 0\n }\n return TRANSPORT_SURFACE_HEIGHT\n }\n return 0\n }\n\n // 컴포넌트의 상태 색상(statusColor) 또는 fillStyle → Three.js 색상 변환\n protected resolveColor(): number {\n const comp = this.component as any\n\n // 1) MCSStatusMixin.statusColor (legend 기반 상태 색상)\n // '#F0F0F0'은 상태 미설정 시 기본 fallback — 무시하고 defaultColor 사용\n try {\n const sc = comp.statusColor\n if (typeof sc === 'string' && sc && sc.toUpperCase() !== '#F0F0F0' && sc !== 'transparent') return new THREE.Color(sc).getHex()\n } catch {\n /* statusColor 미구현 시 무시 */\n }\n\n // 2) state.fillStyle fallback\n const { fillStyle } = this.component.state\n if (fillStyle && typeof fillStyle === 'string' && fillStyle !== 'transparent') {\n try {\n return new THREE.Color(fillStyle).getHex()\n } catch {\n /* 파싱 실패 시 무시 */\n }\n }\n\n return this._config.defaultColor\n }\n\n // ── Geometry helpers ──\n\n /**\n * 바닥면(-Y 방향) 삼각형 제거: z-fighting 근본 해결.\n * 바닥면이 없으면 floor grid와 겹칠 면 자체가 없어진다.\n */\n private removeBottomFace(geometry: THREE.BufferGeometry): THREE.BufferGeometry {\n const posAttr = geometry.getAttribute('position')\n const normAttr = geometry.getAttribute('normal')\n const index = geometry.getIndex()\n\n if (!posAttr || !normAttr || !index) return geometry\n\n const newIndices: number[] = []\n const normalY = new THREE.Vector3()\n\n for (let i = 0; i < index.count; i += 3) {\n const a = index.getX(i)\n const b = index.getX(i + 1)\n const c = index.getX(i + 2)\n\n // 세 꼭짓점 노말의 Y 성분 평균으로 방향 판단\n const avgY = (normAttr.getY(a) + normAttr.getY(b) + normAttr.getY(c)) / 3\n\n // -Y 방향 삼각형 제거 (threshold -0.9: 거의 아래를 향하는 면만)\n if (avgY > -0.9) {\n newIndices.push(a, b, c)\n }\n }\n\n geometry.setIndex(newIndices)\n return geometry\n }\n\n // ── Geometry builders ──\n\n private buildBoxGeometry(w: number, d: number, h: number): THREE.BufferGeometry {\n const geo = new THREE.BoxGeometry(w, d, h)\n return this._config.keepBottomFace ? geo : this.removeBottomFace(geo)\n }\n\n private buildHexagonGeometry(w: number, d: number, h: number): THREE.BufferGeometry {\n // Buffer의 2D 형태: 좌우 끝이 꺾인 육각형\n const offset = Math.min(w, h) * 0.2\n const hw = w / 2\n const hh = h / 2\n\n const shape = new THREE.Shape()\n shape.moveTo(-hw + offset, -hh)\n shape.lineTo(hw - offset, -hh)\n shape.lineTo(hw, 0)\n shape.lineTo(hw - offset, hh)\n shape.lineTo(-hw + offset, hh)\n shape.lineTo(-hw, 0)\n shape.closePath()\n\n const geo = new THREE.ExtrudeGeometry(shape, {\n steps: 1,\n depth: d,\n bevelEnabled: false,\n })\n\n // 중심 정렬 후 Y-up 좌표계 회전 (extrude 축: +Z → +Y)\n geo.translate(0, 0, -d / 2)\n geo.rotateX(Math.PI / 2)\n\n return this.removeBottomFace(geo)\n }\n\n private buildPlaneGeometry(w: number, h: number): THREE.BufferGeometry {\n const geo = new THREE.PlaneGeometry(w, h)\n geo.rotateX(-Math.PI / 2)\n return geo\n }\n\n // ── Build ──\n\n protected _ownMesh?: THREE.Mesh\n\n build() {\n super.build()\n\n // 가시성 판정 — e.g., Carrier는 데이터 없으면 mesh 미생성\n if (this._config.isVisible && !this._config.isVisible(this.component)) return\n\n const { w: rawW, h: rawH } = this.absSize\n const rawDepth = this.effectiveDepth\n if (!rawW || !rawH) return\n\n const ratio = this._config.sizeRatio ?? 1.0\n const w = rawW * ratio\n const h = rawH * ratio\n const depth = rawDepth * ratio\n\n const color = this.resolveColor()\n const { opacity, metalness, roughness, shape } = this._config\n\n const geometry =\n shape === 'plane'\n ? this.buildPlaneGeometry(w, h)\n : shape === 'hexagon'\n ? this.buildHexagonGeometry(w, depth, h)\n : this.buildBoxGeometry(w, depth, h)\n\n const isPlane = shape === 'plane'\n const material = isPlane\n ? new THREE.MeshBasicMaterial({\n color,\n opacity,\n transparent: opacity < 1,\n side: THREE.DoubleSide,\n depthWrite: opacity >= 0.9,\n })\n : new THREE.MeshStandardMaterial({\n color,\n metalness,\n roughness,\n opacity,\n transparent: opacity < 1,\n side: opacity < 1 ? THREE.DoubleSide : THREE.FrontSide,\n depthWrite: opacity >= 0.9,\n ...(this._config.emissiveIntensity ? { emissive: color, emissiveIntensity: this._config.emissiveIntensity } : {}),\n })\n // z-fighting 방지: 바닥면(floor grid)보다 항상 앞에 렌더링\n material.polygonOffset = true\n material.polygonOffsetFactor = -1\n material.polygonOffsetUnit = -1\n\n // BoxGeometry material groups: +x(0), -x(1), +y(2), -y(3), +z(4), -z(5)\n let meshMaterial: THREE.Material | THREE.Material[] = material\n if (shape === 'box') {\n if (this._config.openTop) {\n // 상단면 제거 → 5면 개방 박스\n const invisible = new THREE.MeshBasicMaterial({ visible: false })\n meshMaterial = [material, material, invisible, material, material, material]\n } else if (this._config.texturedTop) {\n // 상판에 2D 렌더링 텍스처\n const topMat = this.buildTopTexture(w, h)\n meshMaterial = [material, material, topMat, material, material, material]\n } else if (this._config.matteTop) {\n // 상판만 무반사\n const matte = new THREE.MeshBasicMaterial({ color, opacity, transparent: opacity < 1 })\n meshMaterial = [material, material, matte, material, material, material]\n }\n }\n\n this._ownMesh = new THREE.Mesh(geometry, meshMaterial)\n // sizeRatio < 1이면 부모 중심에 배치 (rawDepth/2), plane은 살짝 띄움\n this._ownMesh.position.y = isPlane ? 1 : ratio < 1 ? rawDepth / 2 : depth / 2\n this._ownMesh.castShadow = !isPlane\n this._ownMesh.receiveShadow = true\n this.object3d.add(this._ownMesh)\n }\n\n // ── Change handling ──\n\n private _updatePending = false\n\n onchange(after: Record<string, unknown>, before: Record<string, unknown>) {\n if (\n 'width' in after ||\n 'height' in after ||\n 'depth' in after ||\n 'fillStyle' in after ||\n 'strokeStyle' in after ||\n 'id' in after ||\n 'EMPTYTYPE' in after ||\n 'CARRIERSTATUS' in after\n ) {\n // 연속 setState에 의한 다중 rebuild 방지: 한 프레임에 한 번만 실행\n if (!this._updatePending) {\n this._updatePending = true\n queueMicrotask(() => {\n this._updatePending = false\n this.update()\n })\n }\n return\n }\n\n super.onchange(after, before)\n }\n\n /**\n * 상판 텍스처: 컴포넌트의 2D render()를 캔버스에 그려서 텍스처로 사용\n */\n protected buildTopTexture(w: number, h: number): THREE.MeshBasicMaterial {\n const scale = 4\n const cw = this.nextPow2(w * scale)\n const ch = this.nextPow2(h * scale)\n const canvas = document.createElement('canvas')\n canvas.width = cw\n canvas.height = ch\n const ctx = canvas.getContext('2d')!\n\n const statusColor = '#' + this.resolveColor().toString(16).padStart(6, '0')\n const emptyType = (this.component.state as any)?.EMPTYTYPE || ''\n const text = emptyType === 'FULL' ? 'F' : emptyType === 'EMPTY' ? 'E' : emptyType === 'EMPTYEMPTY' ? 'X' : ''\n\n // 실제 사용 영역 (nextPow2 이전 크기)\n const usedW = w * scale\n const usedH = h * scale\n\n // 바탕: 캐리어 상태 색상 (사용 영역만)\n ctx.fillStyle = statusColor\n ctx.fillRect(0, 0, usedW, usedH)\n\n // 텍스트 (사용 영역 중앙)\n if (text) {\n const fontSize = Math.round(Math.min(usedW, usedH) * 0.7)\n ctx.font = `bold ${fontSize}px Arial`\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillStyle = '#000000'\n ctx.fillText(text, usedW / 2, usedH / 2)\n }\n\n const texture = new THREE.CanvasTexture(canvas)\n texture.offset.set(0, 1 - usedH / ch)\n texture.repeat.set(usedW / cw, usedH / ch)\n texture.colorSpace = THREE.SRGBColorSpace\n\n return new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n side: THREE.DoubleSide,\n })\n }\n\n private nextPow2(n: number): number {\n if (!(n > 0)) return 1\n let v = Math.ceil(n)\n v--\n v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16\n return v + 1\n }\n\n /**\n * 자신의 mesh만 제거 후 rebuild.\n * 기본 update()는 clear()로 object3d의 모든 children을 제거하는데,\n * 컨테이너(Port 등)의 경우 자식 컴포넌트(Carrier 등)의 3D 오브젝트도 함께 제거됨.\n * 이를 방지하기 위해 자신이 생성한 mesh만 제거한다.\n */\n update() {\n // 자신의 mesh만 제거 (자식 컴포넌트 3D 오브젝트 보존)\n if (this._ownMesh) {\n this.object3d.remove(this._ownMesh)\n disposeObject3D(this._ownMesh)\n this._ownMesh = undefined\n }\n\n this.build()\n this.updateTransform()\n this.updateAlpha()\n this.updateHidden()\n }\n\n // RealObjectGroup 기본 동작 비활성화\n updateDimension() {}\n\n updateAlpha() {\n const { alpha = 1 } = this.component.state\n const configOpacity = this._config.opacity\n const effective = configOpacity * alpha\n\n this.object3d.traverse((o: any) => {\n if (!o.material) return\n const materials = Array.isArray(o.material) ? o.material : [o.material]\n for (const m of materials) {\n if (!m.visible) continue // openTop invisible face 무시\n if (m.map) continue // 텍스처 material은 자체 transparent 유지\n m.opacity = effective\n m.transparent = effective < 1\n }\n })\n }\n}\n\n// ── 팩토리 등록 헬퍼 ─────────────────────────────────────\n\nfunction register(type: string, overrides: Partial<MCS3DConfig> = {}) {\n const config: MCS3DConfig = { ...DEFAULTS, ...overrides }\n registerRealObjectFactory(type, (component: Component) => new MCSRealObject3D(component, config))\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Machine (인프라 설비) — 높은 depth, 컨테이너는 반투명\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nregister('Equipment', {\n defaultDepth: 3 * TRANSPORT_SURFACE_HEIGHT,\n opacity: 0.75,\n metalness: 0.4,\n roughness: 0.6,\n defaultColor: 0x8899aa,\n})\n\nregister('Buffer', {\n defaultDepth: TRANSPORT_SURFACE_HEIGHT,\n opacity: 1.0,\n metalness: 0.3,\n roughness: 0.7,\n defaultColor: 0x99aa88,\n shape: 'hexagon',\n})\n\nregister('AGVLine', {\n depthRatio: 0.12,\n metalness: 0.6,\n roughness: 0.3,\n defaultColor: 0x888899,\n})\n\nregister('OHTLine', {\n depthRatio: 0.12,\n metalness: 0.6,\n roughness: 0.3,\n defaultColor: 0x888899,\n})\n\n// STOCKER: 벽면에 용량 게이지 바를 포함하는 커스텀 3D 오브젝트\nconst STOCKER_CONFIG: MCS3DConfig = {\n ...DEFAULTS,\n defaultDepth: 5 * TRANSPORT_SURFACE_HEIGHT,\n opacity: 0.75,\n metalness: 0.3,\n roughness: 0.6,\n defaultColor: 0x8899bb,\n}\n\nclass StockerRealObject3D extends MCSRealObject3D {\n private gaugeMesh?: THREE.Mesh\n\n constructor(component: Component) {\n super(component, STOCKER_CONFIG)\n }\n\n build() {\n super.build()\n this.buildGauge()\n }\n\n private buildGauge() {\n const comp = this.component as any\n const data = comp.data || {}\n const gaugeMode = comp.root?.style?.stockerGaugeMode || 'capacity'\n\n const gauge = this.resolveGauge(data, gaugeMode)\n\n // 테두리는 스토커의 상태 색상 (machine status)\n const statusColor = comp.statusColor\n if (statusColor && statusColor.toUpperCase() !== '#F0F0F0') {\n gauge.borderColor = statusColor\n }\n\n const { w, h } = this.absSize\n const depth = this.effectiveDepth\n const isWidthLonger = w >= h\n\n // 게이지 캔버스 (고해상도)\n const barW = 130\n const barH = 26\n const scale = 4\n const canvasW = barW * scale\n const canvasH = barH * scale\n const canvas = document.createElement('canvas')\n canvas.width = canvasW\n canvas.height = canvasH\n const ctx = canvas.getContext('2d')!\n\n const pad = 12\n\n // 배경 + 테두리\n ctx.fillStyle = '#dddddd'\n ctx.fillRect(0, 0, canvasW, canvasH)\n ctx.strokeStyle = gauge.borderColor\n ctx.lineWidth = 12\n ctx.strokeRect(6, 6, canvasW - 12, canvasH - 12)\n\n // 세그먼트 채움 (왼→오)\n const innerW = canvasW - pad * 2\n const innerH = canvasH - pad * 2\n let x = pad\n for (const seg of gauge.segments) {\n const segW = Math.max(innerW * seg.ratio, seg.ratio > 0 ? 1 : 0)\n if (segW <= 0) continue\n ctx.fillStyle = seg.color\n ctx.fillRect(x, pad, segW, innerH)\n x += segW\n }\n\n // 텍스트\n ctx.font = `bold ${10 * scale}px sans-serif`\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillStyle = '#333333'\n ctx.fillText(gauge.label, canvasW / 2, canvasH / 2)\n\n // 텍스처 → Plane\n const texture = new THREE.CanvasTexture(canvas)\n texture.colorSpace = THREE.SRGBColorSpace\n\n const geo = new THREE.PlaneGeometry(barW, barH)\n geo.rotateX(-Math.PI / 2) // 수평 (지붕 위)\n if (!isWidthLonger) geo.rotateY(Math.PI / 2)\n\n const mat = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n side: THREE.DoubleSide,\n })\n mat.polygonOffset = true\n mat.polygonOffsetFactor = -2\n mat.polygonOffsetUnit = -2\n\n this.gaugeMesh = new THREE.Mesh(geo, mat)\n this.gaugeMesh.position.set(0, depth + 0.5, 0)\n this.object3d.add(this.gaugeMesh)\n }\n\n private resolveGauge(data: any, mode: string) {\n switch (mode) {\n case 'carrier': {\n const full = Number(data.FULL_CNT) || 0\n const empty = Number(data.EMPTY_CNT) || 0\n const emptyEmpty = Number(data.EMPTYEMPTY_CNT) || 0\n const total = full + empty + emptyEmpty\n const segments = total > 0\n ? [\n { ratio: full / total, color: '#4AA7FE' },\n { ratio: empty / total, color: '#8BDA5B' },\n { ratio: emptyEmpty / total, color: '#019D59' },\n ]\n : [{ ratio: 1, color: '#dddddd' }]\n return {\n segments,\n borderColor: '#4AA7FE',\n label: total > 0 ? `F${full} E${empty} EE${emptyEmpty}` : '',\n }\n }\n case 'abnormal': {\n const normal = Number(data.CARRIER_NORMAL) || 0\n const abnormal = Number(data.CARRIER_ABNORMAL) || 0\n const total = normal + abnormal\n const segments = total > 0\n ? [\n { ratio: normal / total, color: '#8BDA5B' },\n { ratio: abnormal / total, color: '#F4B4B4' },\n ]\n : [{ ratio: 1, color: '#dddddd' }]\n return {\n segments,\n borderColor: abnormal > 0 ? '#F4B4B4' : '#8BDA5B',\n label: total > 0 ? `N${normal} A${abnormal}` : '',\n }\n }\n default: { // capacity\n const cur = Number(data.CURRENTCAPACITY) || 0\n const max = Number(data.MAXCAPACITY) || 100\n const fullup = data.FULLUP === 'T'\n const usage = Math.round((cur / max) * 100)\n const legend = (this.component as any).root?.style?.LEGEND_CAPACITY || LEGEND_CAPACITY\n const color = fullup ? 'red' : (getVaueOnRanges(usage, legend) || '#44aa44')\n return {\n segments: [{ ratio: usage / 100, color }],\n borderColor: color,\n label: `${usage}%`,\n }\n }\n }\n }\n\n onchange(after: Record<string, unknown>, before: Record<string, unknown>) {\n if ('data' in after) {\n this.clearGauge()\n this.buildGauge()\n }\n super.onchange(after, before)\n }\n\n clear() {\n this.clearGauge()\n return super.clear()\n }\n\n private clearGauge() {\n if (this.gaugeMesh) {\n this.object3d.remove(this.gaugeMesh)\n this.gaugeMesh.geometry?.dispose()\n const mat = this.gaugeMesh.material as THREE.MeshBasicMaterial\n mat?.map?.dispose()\n mat?.dispose()\n this.gaugeMesh = undefined\n }\n }\n}\n\nregisterRealObjectFactory('STOCKER', (component: Component) => new StockerRealObject3D(component))\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Unit (이동체 · 홀더) — 낮은 depth, 불투명\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n// Port: 바닥판 (PlaneGeometry)\nconst PORT_CONFIG: MCS3DConfig = {\n ...DEFAULTS,\n depthRatio: 0.01,\n defaultZPosFromParent: true,\n opacity: 0.1,\n metalness: 0.3,\n roughness: 0.8,\n defaultColor: 0xb0a090,\n shape: 'plane',\n}\nregisterRealObjectFactory('Port', (component: Component) => new MCSRealObject3D(component, PORT_CONFIG))\n\nregister('Shelf', {\n depthRatio: 0.25,\n metalness: 0.3,\n roughness: 0.7,\n defaultColor: 0xaabbcc,\n})\n\n// Carrier: CARRIERSTATUS에 따른 3D 애니메이션 지원\nconst CARRIER_CONFIG: MCS3DConfig = {\n ...DEFAULTS,\n depthRatio: 0.5,\n metalness: 0,\n roughness: 1,\n defaultColor: 0x66bb66,\n isVisible: (c: Component) => !!(c.state as any).id,\n sizeRatio: 0.8,\n texturedTop: true,\n}\n\nclass CarrierRealObject3D extends MCSRealObject3D {\n constructor(component: Component) {\n super(component, CARRIER_CONFIG)\n }\n}\n\nregisterRealObjectFactory('Carrier', (component: Component) => new CarrierRealObject3D(component))\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Gauge (용량 게이지) — 얇은 바\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Gauge (용량 게이지) — 2D 렌더링을 Plane 텍스처로 3D 표시\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n// Gauge 컴포넌트 (StockerCapacityBar, ZoneCapacityBar, MCSGaugeCapacityBar)는\n// 3D에서 표시하지 않음. 대신 부모(STOCKER 등)의 3D 모델에서 직접 게이지를 렌더링.\nregisterRealObjectFactory('StockerCapacityBar', () => null as any)\nregisterRealObjectFactory('MCSGaugeCapacityBar', () => null as any)\nregisterRealObjectFactory('ZoneCapacityBar', () => null as any)\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// PortFlow — 2D render를 Plane 텍스처로 3D 표시\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nclass PortFlowRealObject3D extends RealObjectGroup {\n private _mesh?: THREE.Mesh\n private _texture?: THREE.CanvasTexture\n\n get effectiveDepth(): number { return 0 }\n protected get syncZPosOffset(): number {\n // 부모 Port/Conveyor의 zPos와 동일하게\n const parent = (this.component as any).parentObject\n if (parent?.state?.zPos != null) return parent.state.zPos\n return TRANSPORT_SURFACE_HEIGHT\n }\n\n build() {\n super.build()\n\n const { width = 10, height = 10 } = this.component.state\n const w = Math.abs(width)\n const h = Math.abs(height)\n if (!w || !h) return\n\n // 2D render를 캔버스에 캡처\n // 화살표 날개 + 텍스트 영역이 bounds 밖으로 나가므로 전체 영역 계산\n const { left, top } = this.component.bounds\n const { fontSize = 24, labelPosition = 'top' } = this.component.state\n const arrowPad = Math.min(w, h) * 0.4\n\n // 텍스트 영역 확장\n let padLeft = arrowPad, padRight = arrowPad, padTop = arrowPad, padBottom = arrowPad\n if ((this.component as any).hasTextProperty) {\n switch (labelPosition) {\n case 'top': padTop = Math.max(padTop, fontSize + 4); break\n case 'bottom': padBottom = Math.max(padBottom, fontSize + 4); break\n case 'left': padLeft = Math.max(padLeft, fontSize * 4 + 4); break\n case 'right': padRight = Math.max(padRight, fontSize * 4 + 4); break\n }\n }\n\n const totalW = w + padLeft + padRight\n const totalH = h + padTop + padBottom\n const scale = 2\n const canvas = document.createElement('canvas')\n canvas.width = totalW * scale\n canvas.height = totalH * scale\n const ctx = canvas.getContext('2d')!\n\n ctx.save()\n ctx.scale(scale, scale)\n ctx.translate(-left + padLeft, -top + padTop)\n try {\n // 화살표 렌더\n this.component.render(ctx)\n ctx.fillStyle = this.component.state.strokeStyle || '#666666'\n ctx.fill()\n // 텍스트 렌더\n if ((this.component as any).hasTextProperty && (this.component as any).drawText) {\n ;(this.component as any).drawText(ctx)\n }\n } catch { /* render 실패 시 빈 텍스처 */ }\n ctx.restore()\n\n this._texture = new THREE.CanvasTexture(canvas)\n this._texture.colorSpace = THREE.SRGBColorSpace\n\n const geo = new THREE.PlaneGeometry(totalW, totalH)\n geo.rotateX(-Math.PI / 2)\n\n const mat = new THREE.MeshBasicMaterial({\n map: this._texture,\n transparent: true,\n side: THREE.DoubleSide,\n depthWrite: false,\n })\n\n this._mesh = new THREE.Mesh(geo, mat)\n this._mesh.position.y = 1\n this.object3d.add(this._mesh)\n }\n\n update() {\n if (this._mesh) {\n this.object3d.remove(this._mesh)\n this._mesh.geometry.dispose()\n ;(this._mesh.material as THREE.Material).dispose()\n this._texture?.dispose()\n this._mesh = undefined\n this._texture = undefined\n }\n this.build()\n this.updateTransform()\n }\n\n onchange(after: Record<string, unknown>, before: Record<string, unknown>) {\n if ('width' in after || 'height' in after || 'orientation' in after ||\n 'direction' in after || 'strokeStyle' in after || 'INOUTTYPE' in after) {\n this.update()\n return\n }\n super.onchange(after, before)\n }\n\n updateDimension() {}\n updateAlpha() {}\n}\n\nregisterRealObjectFactory('PortFlow', (component: Component) => new PortFlowRealObject3D(component))\n"]}