From 20d4bbf6210b0d37b956cc5b41fdb06f29845b4f Mon Sep 17 00:00:00 2001 From: AlexandruPopovici Date: Wed, 22 Nov 2023 19:47:27 +0200 Subject: [PATCH] WIP --- .../modules/batching/InstancedBatchObject.ts | 69 +++++++++++++------ .../modules/batching/InstancedMeshBatch.ts | 7 +- .../modules/objects/SpeckleInstancedMesh.ts | 5 +- 3 files changed, 56 insertions(+), 25 deletions(-) diff --git a/packages/viewer/src/modules/batching/InstancedBatchObject.ts b/packages/viewer/src/modules/batching/InstancedBatchObject.ts index 262967f564..9238d19c1e 100644 --- a/packages/viewer/src/modules/batching/InstancedBatchObject.ts +++ b/packages/viewer/src/modules/batching/InstancedBatchObject.ts @@ -1,25 +1,52 @@ -// /* eslint-disable camelcase */ -// import { BatchObject } from './BatchObject' +/* eslint-disable camelcase */ +import { BatchObject, VectorLike } from './BatchObject' -// import { Matrix4, Vector3 } from 'three' -// import { SpeckleMeshBVH } from '../objects/AccelerationStructure' -// import { NodeRenderView } from '../tree/NodeRenderView' +import { Box3, Matrix4 } from 'three' +import { NodeRenderView } from '../tree/NodeRenderView' +import { AccelerationStructure } from '../objects/AccelerationStructure' -// export class InstancedBatchObject extends BatchObject { -// protected instanceTransform: Matrix4 = new Matrix4() +export class InstancedBatchObject extends BatchObject { + protected instanceTransform: Matrix4 = new Matrix4() -// public constructor(renderView: NodeRenderView, batchIndex: number) { -// super(renderView, batchIndex) -// } + public get aabb(): Box3 { + const box = new Box3().copy(this.renderView.aabb) + box.applyMatrix4(this.transform).applyMatrix4(this.instanceTransform) + return box + } -// public buildInstanceBVH(instanceBVH?: SpeckleMeshBVH) { -// if (instanceBVH) { -// this._bvh = SpeckleMeshBVH.buildBVH(indices, localPositions) -// this._bvh.inputTransform = this.transformInv -// this._bvh.outputTransform = this.transform -// this._bvh.inputOriginTransform = new Matrix4().copy(transform) -// this._bvh.outputOriginTransfom = new Matrix4().copy(transform).invert() -// return -// } else this.buildBVH() -// } -// } + public constructor(renderView: NodeRenderView, batchIndex: number) { + super(renderView, batchIndex) + this.instanceTransform.copy(renderView.renderData.geometry.transform) + this.transform.copy(this.instanceTransform) + this.transformInv.copy(this.instanceTransform) + } + + public buildInstanceBVH(accelerationStructure?: AccelerationStructure) { + if (accelerationStructure) { + this._accelerationStructure = accelerationStructure + this._accelerationStructure.inputTransform = this.transformInv + this._accelerationStructure.outputTransform = this.transform + const transform = new Matrix4().makeTranslation( + this._localOrigin.x, + this._localOrigin.y, + this._localOrigin.z + ) + transform.invert() + this._accelerationStructure.inputOriginTransform = new Matrix4().copy(transform) + this._accelerationStructure.outputOriginTransfom = new Matrix4() + .copy(transform) + .invert() + } else this.buildBVH() + } + + public transformTRS( + translation: VectorLike, + euler: VectorLike, + scale: VectorLike, + pivot: VectorLike + ) { + super.transformTRS(translation, euler, scale, pivot) + this.transform.multiply(this.instanceTransform) + this.transformInv.multiply(this.instanceTransform) + } +} diff --git a/packages/viewer/src/modules/batching/InstancedMeshBatch.ts b/packages/viewer/src/modules/batching/InstancedMeshBatch.ts index 9006212011..f2e8ca5629 100644 --- a/packages/viewer/src/modules/batching/InstancedMeshBatch.ts +++ b/packages/viewer/src/modules/batching/InstancedMeshBatch.ts @@ -19,9 +19,9 @@ import { GeometryType, HideAllBatchUpdateRange } from './Batch' -import { BatchObject } from './BatchObject' import SpeckleInstancedMesh from '../objects/SpeckleInstancedMesh' import { ObjectLayers } from '../../IViewer' +import { InstancedBatchObject } from './InstancedBatchObject' export default class InstancedMeshBatch implements Batch { public id: string @@ -399,10 +399,11 @@ export default class InstancedMeshBatch implements Batch { public buildBatch() { const batchObjects = [] + // let instanceBVH = null for (let k = 0; k < this.renderViews.length; k++) { this.renderViews[k].setBatchData(this.id, k, 1) - const batchObject = new BatchObject(this.renderViews[k], k) - batchObject.buildBVH() + const batchObject = new InstancedBatchObject(this.renderViews[k], k) + batchObjects.push(batchObject) } diff --git a/packages/viewer/src/modules/objects/SpeckleInstancedMesh.ts b/packages/viewer/src/modules/objects/SpeckleInstancedMesh.ts index 1a95cc5345..8d49fc17b2 100644 --- a/packages/viewer/src/modules/objects/SpeckleInstancedMesh.ts +++ b/packages/viewer/src/modules/objects/SpeckleInstancedMesh.ts @@ -17,6 +17,8 @@ import { import { BatchObject } from '../batching/BatchObject' import Materials from '../materials/Materials' import { TopLevelAccelerationStructure } from './TopLevelAccelerationStructure' +import { AccelerationStructure } from './AccelerationStructure' +import { InstancedBatchObject } from '../batching/InstancedBatchObject' const _inverseMatrix = new Matrix4() const _ray = new Ray() @@ -47,6 +49,7 @@ const tmpInverseMatrix = /* @__PURE__ */ new Matrix4() export default class SpeckleInstancedMesh extends InstancedMesh { public static MeshBatchNumber = 0 + private instanceAccelerationStructure: AccelerationStructure = null private tas: TopLevelAccelerationStructure = null private batchMaterial: Material = null private materialCache: { [id: string]: Material } = {} @@ -74,7 +77,7 @@ export default class SpeckleInstancedMesh extends InstancedMesh { this.material = this.batchMaterial } - public setBatchObjects(batchObjects: BatchObject[]) { + public setBatchObjects(batchObjects: InstancedBatchObject[]) { this._batchObjects = batchObjects for (let k = 0; k < batchObjects.length; k++) { this.setMatrixAt(k, batchObjects[k].renderView.renderData.geometry.transform)