Files
speckle-server/packages/viewer/src/modules/batching/Batch.ts
T
Alexandru Popovici ae7ff59d09 Object Operations Performance Improvements (#2002)
* Implemented shuffling for point batches

* Points are now drawn indexed. This is needed in order to implement shuffling for point batches, to allow for best runtime performance in scenarios where the baches are split into multiple non-flat-able draw groups

* Implemented draw range flattening before sending over to be set in batches. This reduces execution time significantly especially in scenarios where a lot of objects need to change material at once. Implemented batching of draw ranges in SelectionExtension when reseting a selection. This makes un-selecting significatly faster when a lot of objects are involved

* Added a note
2024-01-31 16:38:46 +02:00

66 lines
1.6 KiB
TypeScript

import { Box3, Material, Object3D, WebGLRenderer } from 'three'
import { FilterMaterialOptions } from '../materials/Materials'
import { NodeRenderView } from '../tree/NodeRenderView'
import { DrawGroup } from './InstancedMeshBatch'
export enum GeometryType {
MESH,
LINE,
POINT,
POINT_CLOUD,
TEXT
}
/** TO DO: Unify point and mesh batch implementations */
export interface Batch {
id: string
subtreeId: string
renderViews: NodeRenderView[]
batchMaterial: Material
renderObject: Object3D
geometryType: GeometryType
get bounds(): Box3
get drawCalls(): number
get minDrawCalls(): number
get materials(): Material[]
get groups(): DrawGroup[]
get triCount(): number
get vertCount(): number
getCount(): number
setBatchMaterial(material: Material): void
setBatchBuffers(...range: BatchUpdateRange[]): void
setVisibleRange(...range: BatchUpdateRange[])
getVisibleRange(): BatchUpdateRange
setDrawRanges(...ranges: BatchUpdateRange[])
resetDrawRanges()
buildBatch()
getRenderView(index: number): NodeRenderView
getMaterialAtIndex(index: number): Material
getMaterial(rv: NodeRenderView): Material
getOpaque(): BatchUpdateRange
getTransparent(): BatchUpdateRange
getStencil(): BatchUpdateRange
onUpdate(deltaTime: number)
onRender(renderer: WebGLRenderer)
purge()
}
export interface BatchUpdateRange {
offset: number
count: number
material?: Material
materialOptions?: FilterMaterialOptions
}
export const NoneBatchUpdateRange = {
offset: 0,
count: 0
} as BatchUpdateRange
export const AllBatchUpdateRange = {
offset: 0,
count: Infinity
} as BatchUpdateRange