diff --git a/src/core/manager/WorldModel.ts b/src/core/manager/WorldModel.ts index 3ecf703..88fe815 100644 --- a/src/core/manager/WorldModel.ts +++ b/src/core/manager/WorldModel.ts @@ -116,6 +116,7 @@ export default class WorldModel { import('../../modules/rack'), import('../../modules/shuttle_rack'), import('../../modules/pallet'), + import('../../modules/palletTz'), import('../../modules/tote'), import('../../modules/carton'), import('../../modules/amr/ptr/cl2'), diff --git a/src/modules/palletTz/PalletTz3dObject.ts b/src/modules/palletTz/PalletTz3dObject.ts new file mode 100644 index 0000000..3c6b542 --- /dev/null +++ b/src/modules/palletTz/PalletTz3dObject.ts @@ -0,0 +1,12 @@ +import * as THREE from 'three' +import {mergeGeometries} from 'three/addons/utils/BufferGeometryUtils.js' +import {BufferGeometry} from "three"; +import {Material} from "three/src/materials/Material"; +import storageBar_PNG from "@/assets/Models/storageBar.png"; +import Plastic_Rough_JPG from "@/assets/Models/Plastic_Rough.jpg"; +import {InstancedMesh} from "three/src/objects/InstancedMesh"; +import {decimalSumBy, resetUVs} from "@/core/ModelUtils"; + +export default class PalletTz3dObject extends THREE.Object3D { + +} diff --git a/src/modules/palletTz/PalletTzEntity.ts b/src/modules/palletTz/PalletTzEntity.ts new file mode 100644 index 0000000..7775d65 --- /dev/null +++ b/src/modules/palletTz/PalletTzEntity.ts @@ -0,0 +1,5 @@ +import BaseEntity from '@/core/base/BaseItemEntity.ts' + +export default class PalletTzEntity extends BaseEntity { + +} diff --git a/src/modules/palletTz/PalletTzInteraction.ts b/src/modules/palletTz/PalletTzInteraction.ts new file mode 100644 index 0000000..603118d --- /dev/null +++ b/src/modules/palletTz/PalletTzInteraction.ts @@ -0,0 +1,22 @@ +import BaseInteraction from '@/core/base/BaseInteraction.ts' +import * as THREE from 'three' + +export default class PalletTzInteraction extends BaseInteraction { + + get isSinglePointMode(): boolean { + return true + } + + constructor(itemTypeName: string) { + super(itemTypeName) + } + + createPointOfItem(item: ItemJson, point: THREE.Vector3): ItemJson { + item = super.createPointOfItem(item, point) + + // 创建一个地堆货架 + item.dt.palletWidth = 1.1 // 宽度 + item.dt.palletDepth = 1.1 // 深度 + return item + } +} diff --git a/src/modules/palletTz/PalletTzPropertySetter.ts b/src/modules/palletTz/PalletTzPropertySetter.ts new file mode 100644 index 0000000..4d72bf6 --- /dev/null +++ b/src/modules/palletTz/PalletTzPropertySetter.ts @@ -0,0 +1,35 @@ +import type { PropertySetter } from '@/core/base/PropertyTypes.ts' +import { basicFieldsSetter } from '@/editor/widgets/property/PropertyPanelConstant.ts' + +const propertySetter: PropertySetter = { + flatten: { + fields: [ + ...basicFieldsSetter + ] + }, + groups: [ + { + title: '存储位置', expand: true, size: 'small', + fields: [ + { + dataPath: 'dt.storeAt.item', label: '货架', input: 'Input', + inputProps: {} + }, + { + dataPath: 'dt.storeAt.bay', label: '列', input: 'InputNumber', + inputProps: {} + }, + { + dataPath: 'dt.storeAt.level', label: '层', input: 'InputNumber', + inputProps: {} + }, + { + dataPath: 'dt.storeAt.cell', label: '格', input: 'InputNumber', + inputProps: {} + } + ] + } + ] +} + +export default propertySetter diff --git a/src/modules/palletTz/PalletTzRenderer.ts b/src/modules/palletTz/PalletTzRenderer.ts new file mode 100644 index 0000000..575a526 --- /dev/null +++ b/src/modules/palletTz/PalletTzRenderer.ts @@ -0,0 +1,90 @@ +import * as THREE from 'three' +import BaseRenderer from '@/core/base/BaseRenderer.ts' +import Constract from '@/core/Constract.ts' +import type { Object3DLike } from '@/types/ModelTypes.ts' +import MODULE_PALLET_GLB from '@/assets/Models/Pallet.glb?url' +import MODULE_PALLET_TEX from '@/assets/Models/Pallet.jpg?inline' +import { loadGlbModule, loadTexture, processModel } from '@/core/ModelUtils.ts' +import InstanceMeshManager from '@/core/manager/InstanceMeshManager.ts' + +/** + * 托盘渲染器 + */ +export default class PalletTzRenderer extends BaseRenderer { + static POINT_NAME = 'pallet_point' + + /** + * 默认点的高度, 防止和地面重合 + */ + readonly defulePositionY: number = Constract.HEIGHT_WAY + readonly defaultScale: THREE.Vector3 = new THREE.Vector3(1.1, 0.15, 1.1) + readonly defaultRotation: THREE.Vector3 = new THREE.Vector3(0, 0, 0) + readonly defaultUserData = { + color: 0xFF616161 + } + + palletGeometry: THREE.BufferGeometry + palletMaterial: THREE.MeshPhongMaterial + private _isInitialized = false + + async init() { + await super.init() + + const [glbGroup, palletTexture] = await Promise.all([ + loadGlbModule(MODULE_PALLET_GLB), + loadTexture(MODULE_PALLET_TEX) + ]) + + const mesh = glbGroup.children[0] as THREE.Mesh + + this.palletGeometry = processModel(mesh) + this.palletMaterial = new THREE.MeshPhongMaterial({ color: 0x2b5d94 }) + + palletTexture.flipY = true + palletTexture.wrapS = THREE.RepeatWrapping + palletTexture.wrapT = THREE.RepeatWrapping + palletTexture.repeat.set(0.5, 0.5) + + this.palletMaterial.color.set(this.defaultUserData.color) + this.palletMaterial.map = palletTexture + this.palletMaterial.needsUpdate = true + + this._isInitialized = true + } + + createPointBasic(item: ItemJson, option?: RendererCudOption): Object3DLike { + if (!this._isInitialized) { + throw new Error('Renderer not initialized') + } + return this.pointManager.createByItem(item) + } + + get pointManager(): InstanceMeshManager { + if (!this.tempViewport) { + throw new Error('tempViewport is not set.') + } + if (!this._isInitialized) { + throw new Error('Renderer not ready') + } + return this.tempViewport.getOrCreateMeshManager(this.itemTypeName, () => + // 构建 InstanceMesh 代理对象 + new InstanceMeshManager(this.itemTypeName, + this.tempViewport, + this.palletGeometry, + this.palletMaterial, + true, true) + ) + } + + dispose() { + super.dispose() + if (this.palletGeometry) { + this.palletGeometry.dispose() + this.palletGeometry = undefined + } + if (this.palletMaterial) { + this.palletMaterial.dispose() + this.palletMaterial = undefined + } + } +} diff --git a/src/modules/palletTz/index.ts b/src/modules/palletTz/index.ts new file mode 100644 index 0000000..b3c15e5 --- /dev/null +++ b/src/modules/palletTz/index.ts @@ -0,0 +1,12 @@ +import { defineModule } from '@/core/manager/ModuleManager.ts' +import PalletTzRenderer from './PalletTzRenderer.ts' +import PalletTzInteraction from './PalletTzInteraction.ts' +import propertySetter from '@/modules/palletTz/PalletTzPropertySetter.ts' + +export const ITEM_TYPE_NAME = 'palletTz' + +export default defineModule(ITEM_TYPE_NAME, () => ({ + renderer: new PalletTzRenderer(ITEM_TYPE_NAME), + interaction: new PalletTzInteraction(ITEM_TYPE_NAME), + setter: propertySetter +})) diff --git a/src/modules/rack/Rack3dObject.ts b/src/modules/rack/Rack3dObject.ts index 56f1086..a11cb5d 100644 --- a/src/modules/rack/Rack3dObject.ts +++ b/src/modules/rack/Rack3dObject.ts @@ -11,11 +11,11 @@ export default class Rack3dObject extends THREE.Object3D { private rackVerticalBarWidth = 0.1 private rackVerticalBarDepth = 0.08 - private static rackVerticalBarColor = 0xFF35499C + private static rackVerticalBarColor = 0xFF2E66FD private static rackVerticalBarGeometryMap: Map = new Map() private static rackVerticalBarMaterial: Material = null - private static rackLinkBarColor = 0xFF35499C + private static rackLinkBarColor = 0xFF2E66FD private static rackLinkBarGeometryMap: Map = new Map() private static rackLinkBarMaterial: Material = null