8 changed files with 179 additions and 2 deletions
@ -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 { |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,5 @@ |
|||||
|
import BaseEntity from '@/core/base/BaseItemEntity.ts' |
||||
|
|
||||
|
export default class PalletTzEntity extends BaseEntity { |
||||
|
|
||||
|
} |
||||
@ -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 |
||||
|
} |
||||
|
} |
||||
@ -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 |
||||
@ -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 |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -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 |
||||
|
})) |
||||
Loading…
Reference in new issue