@speckle/viewer
Version:
A 3d viewer for Speckle, based on threejs.
61 lines (60 loc) • 3.01 kB
TypeScript
import { Box3, Material, Object3D, WebGLRenderer } from 'three';
import { NodeRenderView } from '../tree/NodeRenderView.js';
import { type Batch, type BatchUpdateRange, type DrawGroup, GeometryType } from './Batch.js';
import { SpeckleBatchedText } from '../objects/SpeckleBatchedText.js';
import { AnchorX, AnchorY } from 'troika-three-text';
import { DrawRanges } from './DrawRanges.js';
export default class TextBatch implements Batch {
id: string;
subtreeId: string;
renderViews: NodeRenderView[];
batchMaterial: Material;
mesh: SpeckleBatchedText;
protected drawRanges: DrawRanges;
get bounds(): Box3;
get drawCalls(): number;
get minDrawCalls(): number;
get maxDrawCalls(): number;
get triCount(): number;
get vertCount(): number;
get pointCount(): number;
get lineCount(): number;
get geometryType(): GeometryType;
get renderObject(): Object3D;
getCount(): number;
get materials(): Material[];
get groups(): Array<DrawGroup>;
constructor(id: string, subtreeId: string, renderViews: NodeRenderView[]);
setBatchMaterial(material: Material): void;
onUpdate(deltaTime: number): void;
onRender(renderer: WebGLRenderer): void;
setVisibleRange(ranges: BatchUpdateRange[]): void;
getVisibleRange(): BatchUpdateRange;
/** TODO: Need to give this a glow up */
getOpaque(): BatchUpdateRange;
/** TODO: Need to give this a glow up */
getDepth(): BatchUpdateRange;
/** TODO: Need to give this a glow up */
getTransparent(): BatchUpdateRange;
/** TODO: Need to give this a glow up */
getStencil(): BatchUpdateRange;
/** Text batches are mix between how mesh and line batches work.
* - They still keep track of various draw groups each with it's material
* - However that material is not really being used, but rather the properies are copied over to the batch fp32 data texture
* - For filtering we cheat and use `SpeckleTextColoredMaterial` only to store the gradient/ramp texture + gradient indices for each text in the batch
* - The color from the gradient/ramp texture will be used only if the gradient index > 0, otherwise the regular color will be used
* - The gradient index is stored in each text object in it's `userData` and written to the 27'th float in the batch data texture, where the shader reads if from
* - Even if, the **text batch does not use the materials in it's draw groups**, it emulates the behavior as if it would
*/
setBatchBuffers(ranges: BatchUpdateRange[]): void;
setDrawRanges(ranges: BatchUpdateRange[]): void;
private cleanMaterials;
resetDrawRanges(): void;
protected alignmentXToAnchorX(value: number): AnchorX;
protected alignmentYToAnchorY(value: number): AnchorY;
buildBatch(): Promise<void>;
getRenderView(index: number): NodeRenderView | null;
getMaterialAtIndex(index: number): Material | null;
getMaterial(rv: NodeRenderView): Material | null;
purge(): void;
}