import { Box3, InstancedInterleavedBuffer, Material, Object3D, WebGLRenderer } from 'three'; import { LineSegments2 } from 'three/examples/jsm/lines/LineSegments2.js'; import { LineSegmentsGeometry } from 'three/examples/jsm/lines/LineSegmentsGeometry.js'; import SpeckleLineMaterial from '../materials/SpeckleLineMaterial.js'; import { NodeRenderView } from '../tree/NodeRenderView.js'; import { type Batch, type BatchUpdateRange, DrawGroup, GeometryType } from './Batch.js'; export default class LineBatch implements Batch { id: string; subtreeId: string; renderViews: NodeRenderView[]; protected geometry: LineSegmentsGeometry; batchMaterial: SpeckleLineMaterial; protected batchTransparent: boolean; protected batchOpacity: number; protected mesh: LineSegments2; colorBuffer: InstancedInterleavedBuffer; protected visibilityRanges: { [offset: number]: boolean; }; get bounds(): Box3; get drawCalls(): number; get minDrawCalls(): number; get triCount(): number; get vertCount(): number; constructor(id: string, subtreeId: string, renderViews: NodeRenderView[]); get groups(): DrawGroup[]; get pointCount(): number; get lineCount(): number; get renderObject(): Object3D; get geometryType(): GeometryType; get materials(): Material[]; getCount(): number; setBatchMaterial(material: SpeckleLineMaterial): void; onUpdate(deltaTime: number): void; onRender(renderer: WebGLRenderer): void; setVisibleRange(ranges: BatchUpdateRange[]): void; /** Line batches do not sort their ranges. This means we can have hidden/transparent objects anywhere inside the batch. */ getVisibleRange(): BatchUpdateRange; getOpaque(): BatchUpdateRange; getDepth(): BatchUpdateRange; getTransparent(): BatchUpdateRange; getStencil(): BatchUpdateRange; /** Reminder here that line batches do not really change materials, just the color buffer changes */ setBatchBuffers(ranges: BatchUpdateRange[]): void; setDrawRanges(ranges: BatchUpdateRange[]): void; resetDrawRanges(): void; buildBatch(): Promise; getRenderView(index: number): NodeRenderView | null; getMaterialAtIndex(index: number): Material; /** TODO: I wish we wouldn't clone the material here... */ getMaterial(rv: NodeRenderView): Material; private makeLineGeometry; private updateColorBuffer; purge(): void; }