Browse Source

RuntimeManager 运行时信息

master
修宁 6 months ago
parent
commit
e796d131ac
  1. 20
      src/core/base/BaseRenderer.ts
  2. 7
      src/core/engine/Viewport.ts
  3. 68
      src/core/manager/RuntimeManager.ts
  4. 31
      src/modules/rack/RackRenderer.ts

20
src/core/base/BaseRenderer.ts

@ -111,6 +111,10 @@ export default abstract class BaseRenderer {
const point = this.createPoint(item, option)
point.visible = ((typeof item.v !== 'undefined') ? item.v : true)
if (item.dt.storeAt?.item) {
this.tempViewport.runtimeManager.addStoreAt(item.dt.storeAt?.item, item.id)
}
setUserDataForItem(item, point)
this.afterCreateOrUpdatePoint(item, option, point)
this.tempViewport.entityManager.appendObject(item.id, point)
@ -198,15 +202,31 @@ export default abstract class BaseRenderer {
throw new Error('unkown Point type', object)
}
const item = this.tempViewport.entityManager.findItemById(id)
if (item.dt.storeAt?.item) {
this.tempViewport.runtimeManager.removeStoreAt(item.dt.storeAt?.item, id)
}
this.tempViewport.entityManager.deleteEntityOnly(id)
this.tempViewport.entityManager.deleteObjectsOnly(id)
}
updatePointForEntity(item: ItemJson, option?: RendererCudOption): Object3DLike {
const originObject = this.tempViewport.entityManager.findObjectById(item.id)
const originItem = this.tempViewport.entityManager.findItemById(item.id)
const newObject = this.updatePoint(item, originObject, option)
newObject.visible = ((typeof item.v !== 'undefined') ? item.v : true)
// 库存位置发生改变
if (originItem.dt.storeAt?.item !== item.dt.storeAt?.item) {
if (originItem.dt.storeAt?.item) {
this.tempViewport.runtimeManager.removeStoreAt(originItem.dt.storeAt?.item, item.id)
}
if (item.dt.storeAt?.item) {
this.tempViewport.runtimeManager.addStoreAt(item.dt.storeAt?.item, item.id)
}
}
if (originObject !== newObject) {
// 如果更新后的对象和原来的对象不同, 则替换掉
setUserDataForItem(item, newObject)

7
src/core/engine/Viewport.ts

@ -25,12 +25,13 @@ import type InstanceMeshManager from '@/core/manager/InstanceMeshManager.ts'
import ItemFindManager from '@/core/manager/ItemFindManager.ts'
import { MapControls } from 'three/examples/jsm/controls/MapControls'
import ModelManager from '@/core/script/ModelManager.ts'
import RuntimeManager from '@/core/manager/RuntimeManager.ts'
/**
*
* ,,,,,
*/
export default class Viewport implements Model {
export default class Viewport {
viewerDom: HTMLElement
camera: THREE.Camera // THREE.OrthographicCamera
renderer: THREE.WebGLRenderer
@ -48,6 +49,7 @@ export default class Viewport implements Model {
itemFindManager = new ItemFindManager()
interactionManager = new InteractionManager()
modelManager = new ModelManager()
runtimeManager = new RuntimeManager()
// 状态管理器
stateManager: StateManager
@ -60,7 +62,8 @@ export default class Viewport implements Model {
markRaw(this.entityManager),
markRaw(this.itemFindManager),
markRaw(this.interactionManager),
markRaw(this.modelManager)
markRaw(this.modelManager),
markRaw(this.runtimeManager)
]
// 对象实例管理器 moduleName -> InstanceMeshManager

68
src/core/manager/RuntimeManager.ts

@ -0,0 +1,68 @@
import type Viewport from '@/core/engine/Viewport.ts'
/**
* ,
*/
export default class RuntimeManager {
private viewport: Viewport
private readonly storeRackMap = new Map<string, Set<string>>()
init(viewport: Viewport): void {
this.viewport = viewport
}
/**
*
* @param rackId ID
* @param itemId ID
*/
addStoreAt(rackId: string, itemId: string): void {
if (!this.storeRackMap.has(rackId)) {
this.storeRackMap.set(rackId, new Set())
}
this.storeRackMap.get(rackId).add(itemId)
}
/**
*
* @param rackId ID
* @param itemId ID
*/
removeStoreAt(rackId: string, itemId: string): void {
const rack = this.storeRackMap.get(rackId)
if (rack) {
rack.delete(itemId)
if (rack.size === 0) {
this.storeRackMap.delete(rackId)
}
}
}
/**
*
* @param rackId ID
*/
getItemsByRack(rackId: string): Set<string> | undefined {
return this.storeRackMap.get(rackId)
}
/**
*
* @param rackId ID
*/
removeRack(rackId: string): void {
this.storeRackMap.delete(rackId)
}
/**
*
*/
clear() {
this.storeRackMap.clear()
}
dispose(): void {
this.viewport = null
this.storeRackMap.clear()
}
}

31
src/modules/rack/RackRenderer.ts

@ -74,7 +74,7 @@ export default class RackRenderer extends BaseRenderer {
// 暂时不用算格子 const cell = item.dt?.storeAt?.cell || 0
// 目标货架
const rack = viewport.entityManager.findItemById(item.dt.storeAt.item)
const rack = viewport.stateManager.findItemById(item.dt.storeAt.item)
const rackWidth = decimalSumBy(rack.dt.bays, (b: any) => b.bayWidth)
const bays = rack.dt.bays
const levelHeights = rack.dt.bays[bay]?.levelHeight
@ -135,6 +135,35 @@ export default class RackRenderer extends BaseRenderer {
// 禁止缩放,
item.tf[2][0] = item.dt.rackWidth
item.tf[2][1] = item.dt.rackHeight
// 更新放在内部的所有箱子
const subItems = this.tempViewport.runtimeManager.getItemsByRack(item.id)
const viewport = this.tempViewport
if (subItems) {
_.defer(() => {
viewport.stateManager.update(({ getEntity, putEntity, deleteEntity, addEntity }) => {
for (const subItemId of subItems) {
const subItem = getEntity(subItemId)
if (subItem) {
const { position, rotation } = this.getStorePlacement(viewport, subItem)
if (position) {
subItem.tf[0][0] = position[0]
subItem.tf[0][1] = position[1]
subItem.tf[0][2] = position[2]
subItem.tf[1][0] = rotation[0]
subItem.tf[1][1] = rotation[1]
subItem.tf[1][2] = rotation[2]
putEntity(subItem)
}
}
}
})
})
}
return group
}

Loading…
Cancel
Save