@itwin/core-frontend
Version:
iTwin.js frontend components
86 lines • 4.29 kB
TypeScript
/** @packageDocumentation
* @module WebGL
*/
import { ClipVector, Range3d, Transform } from "@itwin/core-geometry";
import { ClipIntersectionStyle, RgbColor } from "@itwin/core-common";
import { RenderClipVolume } from "../../../render/RenderClipVolume";
import { FloatRgba } from "./FloatRGBA";
import { Texture2DData, Texture2DHandle, TextureHandle } from "./Texture";
interface Clip {
readonly numRows: number;
readonly getData: (transform: Transform) => Uint8Array;
}
/** Maintains a stack of ClipVolumes. The volumes nest such that the stack represents the intersection of all the volumes.
* The bottom of the stack represents the view's clip volume and is always present even if the view has no clip.
* It also maintains the inside/outside clip colors, where the alpha component is 1 if the color should be applied and 0 if not.
* @internal
*/
export declare class ClipStack {
/** Encoded data for all clips on the stack, update when the stack or the transform changes. */
protected _cpuBuffer: Uint8Array;
/** A view of the encoded buffer in the format expected by the GPU. */
protected _gpuBuffer: Texture2DData;
protected _texture?: Texture2DHandle;
/** The maximum number of rows we have ever required. Determines the texture height. Grows as needed, reallocating a larger texture, but never shrinks. */
protected _numTotalRows: number;
/** The number of rows in the texture actually required to encode the current contents of the stack. */
protected _numRowsInUse: number;
/** The first entry always represents the view clip. The rest are pushed and popped with GraphicBranches. */
protected readonly _stack: Clip[];
/** True if we need to recompute the texture. */
protected _isStackDirty: boolean;
/** Obtain the transform to be applied to the clips - i.e., the view matrix. */
protected readonly _getTransform: () => Transform;
/** If this returns false, the clip at the bottom of the stack is ignored. */
protected readonly _wantViewClip: () => boolean;
/** If alpha is 1 then geometry inside the clip will be drawn in this color. */
protected readonly _insideColor: FloatRgba;
/** If alpha is 1 then geometry outside the clip will be drawn in this color. */
protected readonly _outsideColor: FloatRgba;
/** For detecting whether the transform changed from one invocation of setViewClip to the next. */
protected readonly _prevTransform: Transform;
/** True if we want to colorize geometry intersecting clip planes */
protected _colorizeIntersection: boolean;
/** The style to colorize the geometry intersecting clip planes */
protected readonly _intersectionStyle: FloatRgba;
constructor(getTransform: () => Transform, wantViewClip: () => boolean);
get insideColor(): FloatRgba;
get outsideColor(): FloatRgba;
get hasOutsideColor(): boolean;
get colorizeIntersection(): boolean;
set colorizeIntersection(b: boolean);
get intersectionStyle(): FloatRgba;
get bytesUsed(): number;
setViewClip(clip: ClipVector | undefined, style: {
insideColor?: RgbColor;
outsideColor?: RgbColor;
colorizeIntersection?: boolean;
intersectionStyle?: ClipIntersectionStyle;
}): void;
push(clip: RenderClipVolume): void;
pop(): void;
get hasClip(): boolean;
get hasViewClip(): boolean;
get startIndex(): number;
get endIndex(): number;
get textureHeight(): number;
get texture(): TextureHandle | undefined;
isRangeClipped(range: Range3d, transform: Transform): boolean;
/** Exposed strictly for tests. */
get clips(): ReadonlyArray<{
numRows: number;
}>;
/** Exposed strictly for tests. */
static get emptyViewClip(): {
numRows: number;
getData: () => Uint8Array;
};
protected updateTexture(): void;
protected recomputeTexture(): void;
protected uploadTexture(): void;
protected allocateGpuBuffer(): Texture2DData;
protected updateColor(rgb: RgbColor | undefined, rgba: FloatRgba): void;
protected updateIntersectionStyle(colorizeIntersection: boolean | undefined, style: ClipIntersectionStyle | undefined, _thisStyle: FloatRgba): void;
}
export {};
//# sourceMappingURL=ClipStack.d.ts.map