Browse Source

Rack 优化

master
修宁 6 months ago
parent
commit
a30b2ae5db
  1. 236
      src/modules/rack/RackRenderer.ts

236
src/modules/rack/RackRenderer.ts

@ -9,9 +9,6 @@ import { Material } from 'three/src/materials/Material'
import { InstancedMesh } from 'three/src/objects/InstancedMesh' import { InstancedMesh } from 'three/src/objects/InstancedMesh'
//@ts-ignore //@ts-ignore
import { mergeGeometries } from 'three/addons/utils/BufferGeometryUtils.js' import { mergeGeometries } from 'three/addons/utils/BufferGeometryUtils.js'
import InstancePointManager from '@/core/manager/InstancePointManager.ts'
import InstanceMeshManager from '@/core/manager/InstanceMeshManager.ts'
import type { Object3DLike } from '@/types/ModelTypes.ts'
/** /**
* *
@ -29,64 +26,6 @@ export default class RackRenderer extends BaseRenderer {
readonly defaultRotation: THREE.Vector3 = new THREE.Vector3(0, 0, 0) readonly defaultRotation: THREE.Vector3 = new THREE.Vector3(0, 0, 0)
readonly defaultLineWidth: number = 0.05 readonly defaultLineWidth: number = 0.05
bottomBarHeight = 0.2
bottomLinkHeight = 0.2
barSectionPoints = [
{ x: -0.05, y: -0.05 },
{ x: -0.025, y: -0.05 },
{ x: -0.01, y: -0.045 },
{ x: 0.05, y: -0.045 },
{ x: 0.025, y: -0.05 },
{ x: 0.05, y: -0.05 },
{ x: 0.05, y: 0.042 },
{ x: 0.042, y: 0.05 },
{ x: 0.025, y: 0.05 },
{ x: 0.025, y: 0.042 },
{ x: 0.042, y: 0.042 },
{ x: 0.042, y: -0.042 },
{ x: -0.042, y: -0.042 },
{ x: -0.042, y: 0.042 },
{ x: -0.025, y: 0.042 },
{ x: -0.025, y: 0.05 },
{ x: -0.042, y: 0.05 },
{ x: -0.05, y: 0.042 },
{ x: -0.05, y: -0.05 }
]
linkSectionPoints = [
{ x: -0.05, y: -0.05 },
{ x: -0.05, y: 0.05 },
{ x: 0, y: 0.05 },
{ x: 0, y: 0.06 },
{ x: -0.06, y: 0.06 },
{ x: -0.06, y: -0.05 },
{ x: -0.05, y: -0.05 }
]
linkBarSectionPoints = [
{ x: -0.025, y: -0.025 },
{ x: 0.025, y: -0.025 },
{ x: 0.025, y: 0.025 },
{ x: -0.025, y: 0.025 },
{ x: -0.025, y: -0.025 }
]
rackVerticalBarWidth = 0.1
rackVerticalBarDepth = 0.08
rackVerticalBarColor = 0xFF35499C
rackVerticalBarMaterial: Material = this.createVerticalBarMaterial()
rackLinkBarColor = 0xFF35499C
rackLinkBarGeometry: BufferGeometry = null
rackLinkBarMaterial: Material = this.createLinkBarMaterial()
rackHorizontalBarWidth = 0.1
rackHorizontalBarDepth = 0.08
rackHorizontalBarColor = 0xFFF97F27
rackHorizontalBarMaterial: Material = this.createHorizontalBarMaterial()
constructor(itemTypeName: string) { constructor(itemTypeName: string) {
super(itemTypeName) super(itemTypeName)
} }
@ -118,7 +57,7 @@ export default class RackRenderer extends BaseRenderer {
} }
createPoint(item: ItemJson, option?: RendererCudOption): Object3DLike { createPoint(item: ItemJson, option?: RendererCudOption): THREE.Object3D {
// 创建平面几何体 // 创建平面几何体
if (!item.dt.bays || !item.dt.rackDepth) { if (!item.dt.bays || !item.dt.rackDepth) {
system.showErrorDialog('RackRenderer field bays / rackDepth is null!') system.showErrorDialog('RackRenderer field bays / rackDepth is null!')
@ -188,12 +127,16 @@ export default class RackRenderer extends BaseRenderer {
const meshes = this.createRack(item, option) const meshes = this.createRack(item, option)
meshes.forEach(mesh => {
group.add(mesh)
})
// 设置位置 // 设置位置
// group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) // group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2])
// //
// item.dt.rackWidth = rackWidth // item.dt.rackWidth = rackWidth
// item.dt.rackHeight = rackHeight // item.dt.rackHeight = rackHeight
return meshes return group
} }
dispose() { dispose() {
@ -205,7 +148,67 @@ export default class RackRenderer extends BaseRenderer {
throw new Error('Rack createPointBasic not allow!') throw new Error('Rack createPointBasic not allow!')
} }
createVerticalBar(length: number): THREE.BufferGeometry { rackVerticalBarWidth = 0.1
rackVerticalBarDepth = 0.08
rackVerticalBarColor = 0xFF35499C
rackVerticalBarGeometry: BufferGeometry = null
rackVerticalBarMaterial: Material = null
rackLinkBarColor = 0xFF35499C
rackLinkBarGeometry: BufferGeometry = null
rackLinkBarMaterial: Material = null
rackHorizontalBarWidth = 0.1
rackHorizontalBarDepth = 0.08
rackHorizontalBarColor = 0xFFF97F27
rackHorizontalBarGeometry: BufferGeometry = null
rackHorizontalBarMaterial: Material = null
bottomBarHeight = 0.2
bottomLinkHeight = 0.2
barSectionPoints = [
{ x: -0.05, y: -0.05 },
{ x: -0.025, y: -0.05 },
{ x: -0.01, y: -0.045 },
{ x: 0.05, y: -0.045 },
{ x: 0.025, y: -0.05 },
{ x: 0.05, y: -0.05 },
{ x: 0.05, y: 0.042 },
{ x: 0.042, y: 0.05 },
{ x: 0.025, y: 0.05 },
{ x: 0.025, y: 0.042 },
{ x: 0.042, y: 0.042 },
{ x: 0.042, y: -0.042 },
{ x: -0.042, y: -0.042 },
{ x: -0.042, y: 0.042 },
{ x: -0.025, y: 0.042 },
{ x: -0.025, y: 0.05 },
{ x: -0.042, y: 0.05 },
{ x: -0.05, y: 0.042 },
{ x: -0.05, y: -0.05 }
]
linkSectionPoints = [
{ x: -0.05, y: -0.05 },
{ x: -0.05, y: 0.05 },
{ x: 0, y: 0.05 },
{ x: 0, y: 0.06 },
{ x: -0.06, y: 0.06 },
{ x: -0.06, y: -0.05 },
{ x: -0.05, y: -0.05 }
]
linkBarSectionPoints = [
{ x: -0.025, y: -0.025 },
{ x: 0.025, y: -0.025 },
{ x: 0.025, y: 0.025 },
{ x: -0.025, y: 0.025 },
{ x: -0.025, y: -0.025 }
]
createVerticalBar(x, y, z, length): THREE.BufferGeometry {
// 创建一个形状 柱子的截面形状 // 创建一个形状 柱子的截面形状
const shape = new THREE.Shape() const shape = new THREE.Shape()
shape.moveTo(this.barSectionPoints[0].x, this.barSectionPoints[0].y) shape.moveTo(this.barSectionPoints[0].x, this.barSectionPoints[0].y)
@ -264,7 +267,7 @@ export default class RackRenderer extends BaseRenderer {
return material return material
} }
createLinkBar(vBarLength: number, depth: number, bottomDistance: number, topDistance: number): THREE.BufferGeometry { createLinkBar(x, y, z, vBarLength, depth, bottomDistance, topDistance): THREE.BufferGeometry {
const bgs: BufferGeometry[] = [] const bgs: BufferGeometry[] = []
const top = vBarLength - topDistance const top = vBarLength - topDistance
@ -355,7 +358,8 @@ export default class RackRenderer extends BaseRenderer {
return material return material
} }
createHorizontalBar(length: number): THREE.BufferGeometry { createHorizontalBar(x, y, z, length): THREE.BufferGeometry {
// 创建一个形状 柱子的截面形状 // 创建一个形状 柱子的截面形状
const shape = new THREE.Shape() const shape = new THREE.Shape()
shape.moveTo(this.barSectionPoints[0].x, this.barSectionPoints[0].y) shape.moveTo(this.barSectionPoints[0].x, this.barSectionPoints[0].y)
@ -426,7 +430,7 @@ export default class RackRenderer extends BaseRenderer {
return material return material
} }
createRack(item: ItemJson, option?: RendererCudOption): Object3DLike { createRack(item: ItemJson, option?: RendererCudOption): InstancedMesh[] {
if (!item.dt.bays || !item.dt.rackDepth) { if (!item.dt.bays || !item.dt.rackDepth) {
system.showErrorDialog('RackRenderer field bays / rackDepth is null!') system.showErrorDialog('RackRenderer field bays / rackDepth is null!')
return null return null
@ -537,59 +541,68 @@ export default class RackRenderer extends BaseRenderer {
distanceX += bay.bayWidth distanceX += bay.bayWidth
} }
const meshes: InstancedMesh[] = []
if (vBarMatrix.length > 0) { if (vBarMatrix.length > 0) {
if (!this.rackVerticalBarGeometry) {
this.rackVerticalBarGeometry = this.createVerticalBar(vBarMatrix[0].x, vBarMatrix[0].y, vBarMatrix[0].z, vBarMatrix[0].l)
}
if (!this.rackVerticalBarMaterial) {
this.rackVerticalBarMaterial = this.createVerticalBarMaterial()
}
const dummy = new THREE.Object3D() const dummy = new THREE.Object3D()
const vBarMesh = new THREE.InstancedMesh(this.rackVerticalBarGeometry, this.rackVerticalBarMaterial, vBarMatrix.length)
// const vBarMesh = new THREE.InstancedMesh(this.rackVerticalBarGeometry, this.rackVerticalBarMaterial, vBarMatrix.length)
for (let i = 0; i < vBarMatrix.length; i++) { for (let i = 0; i < vBarMatrix.length; i++) {
const vp = vBarMatrix[i] const vp = vBarMatrix[i]
const wrap = this.getVBarMesh(vp.l).create(item.id)
dummy.position.set(vp.x, vp.y, vp.z) dummy.position.set(vp.x, vp.y, vp.z)
dummy.rotation.set(vp.rx, vp.ry, vp.rz) dummy.rotation.set(vp.rx, vp.ry, vp.rz)
dummy.scale.set(vp.sx, vp.sy, vp.sz) dummy.scale.set(vp.sx, vp.sy, vp.sz)
dummy.updateMatrix() dummy.updateMatrix()
wrap.setMatrix4(dummy.matrix) vBarMesh.setMatrixAt(i, dummy.matrix)
} }
meshes.push(vBarMesh)
} }
if (linkBarMatrix.length > 0) { if (linkBarMatrix.length > 0) {
// if (!this.rackLinkBarGeometry) { if (!this.rackLinkBarGeometry) {
// this.rackLinkBarGeometry = this.createLinkBar(rackHeight, item.dt.rackDepth, this.bottomLinkHeight, 0.2) this.rackLinkBarGeometry = this.createLinkBar(linkBarMatrix[0].x, linkBarMatrix[0].y, linkBarMatrix[0].z, rackHeight, item.dt.rackDepth, this.bottomLinkHeight, 0.2)
// } }
const meshInstance = this.getLinkBarMesh(rackHeight, item.dt.rackDepth, this.bottomLinkHeight, 0.2) if (!this.rackLinkBarMaterial) {
this.rackLinkBarMaterial = this.createLinkBarMaterial()
}
const dummy = new THREE.Object3D() const dummy = new THREE.Object3D()
const linkBarMesh = new THREE.InstancedMesh(this.rackLinkBarGeometry, this.rackLinkBarMaterial, linkBarMatrix.length) const linkBarMesh = new THREE.InstancedMesh(this.rackLinkBarGeometry, this.rackLinkBarMaterial, linkBarMatrix.length)
for (let i = 0; i < linkBarMatrix.length; i++) { for (let i = 0; i < linkBarMatrix.length; i++) {
const wrap = meshInstance.create(item.id)
const lp = linkBarMatrix[i] const lp = linkBarMatrix[i]
dummy.position.set(lp.x, lp.y, lp.z) dummy.position.set(lp.x, lp.y, lp.z)
dummy.rotation.set(lp.rx, lp.ry, lp.rz) dummy.rotation.set(lp.rx, lp.ry, lp.rz)
dummy.scale.set(lp.sx, lp.sy, lp.sz) dummy.scale.set(lp.sx, lp.sy, lp.sz)
dummy.updateMatrix() dummy.updateMatrix()
// linkBarMesh.setMatrixAt(i, dummy.matrix) linkBarMesh.setMatrixAt(i, dummy.matrix)
wrap.setMatrix4(dummy.matrix)
} }
meshes.push(linkBarMesh)
} }
if (hBarMatrix.length > 0) { if (hBarMatrix.length > 0) {
if (!this.rackHorizontalBarGeometry) {
this.rackHorizontalBarGeometry = this.createHorizontalBar(hBarMatrix[0].x, hBarMatrix[0].y, hBarMatrix[0].z, hBarMatrix[0].l)
}
if (!this.rackHorizontalBarMaterial) {
this.rackHorizontalBarMaterial = this.createHorizontalBarMaterial()
}
const dummy = new THREE.Object3D() const dummy = new THREE.Object3D()
// const hBarMesh = new THREE.InstancedMesh(this.rackHorizontalBarGeometry, this.rackHorizontalBarMaterial, hBarMatrix.length) const hBarMesh = new THREE.InstancedMesh(this.rackHorizontalBarGeometry, this.rackHorizontalBarMaterial, hBarMatrix.length)
for (let i = 0; i < hBarMatrix.length; i++) { for (let i = 0; i < hBarMatrix.length; i++) {
const hp = hBarMatrix[i] const hp = hBarMatrix[i]
const wrap = this.getHBarMesh(hp.l).create(item.id)
dummy.position.set(hp.x, hp.y, hp.z) dummy.position.set(hp.x, hp.y, hp.z)
dummy.rotation.set(hp.rx, hp.ry, hp.rz) dummy.rotation.set(hp.rx, hp.ry, hp.rz)
dummy.scale.set(hp.sx, hp.sy, hp.sz) dummy.scale.set(hp.sx, hp.sy, hp.sz)
dummy.updateMatrix() dummy.updateMatrix()
wrap.setMatrix4(dummy.matrix) hBarMesh.setMatrixAt(i, dummy.matrix)
} }
meshes.push(hBarMesh)
} }
return meshes
return new THREE.Group()
} }
@ -625,53 +638,4 @@ export default class RackRenderer extends BaseRenderer {
} }
} }
getLinkBarMesh(vBarLength: number, depth: number, bottomDistance: number, topDistance: number): InstanceMeshManager {
if (!this.tempViewport) {
throw new Error('tempViewport is not set.')
}
// rackHeight, item.dt.rackDepth, this.bottomLinkHeight, 0.2
const geometry = this.createLinkBar(vBarLength, depth, bottomDistance, topDistance)
const name = 'rack_linkbar_' + vBarLength + '_' + depth + '_' + bottomDistance + '_' + topDistance
return this.tempViewport.getOrCreateMeshManager(name, () =>
// 构建 InstanceMesh 代理对象
new InstanceMeshManager(name,
this.tempViewport,
geometry, this.rackLinkBarMaterial,
false, false, 100000)
)
}
getVBarMesh(length: number): InstanceMeshManager {
if (!this.tempViewport) {
throw new Error('tempViewport is not set.')
}
const name = 'rack_vbar' + length
return this.tempViewport.getOrCreateMeshManager(name, () => {
const geometry = this.createVerticalBar(length)
return new InstanceMeshManager(name,
this.tempViewport,
geometry, this.rackVerticalBarMaterial,
false, false, 100000)
})
}
getHBarMesh(length: number): InstanceMeshManager {
if (!this.tempViewport) {
throw new Error('tempViewport is not set.')
}
const name = 'rack_hbar' + length
return this.tempViewport.getOrCreateMeshManager(name, () => {
const geometry = this.createHorizontalBar(length)
return new InstanceMeshManager(name,
this.tempViewport,
geometry, this.rackHorizontalBarMaterial,
false, false, 100000)
})
}
} }

Loading…
Cancel
Save