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