@itwin/core-frontend
Version:
iTwin.js frontend components
208 lines • 9.98 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module WebGL
*/
import { RenderMode } from "@itwin/core-common";
/** Flags used to control which shader program is used by a rendering Technique.
* @internal
*/
export class TechniqueFlags {
numClipPlanes = 0;
featureMode = 0 /* FeatureMode.None */;
isTranslucent;
isEdgeTestNeeded = 0 /* IsEdgeTestNeeded.No */;
isAnimated = 0 /* IsAnimated.No */;
isInstanced = 0 /* IsInstanced.No */;
isClassified = 0 /* IsClassified.No */;
isShadowable = 0 /* IsShadowable.No */;
isThematic = 0 /* IsThematic.No */;
isWiremesh = 0 /* IsWiremesh.No */;
positionType = "quantized";
enableAtmosphere = 0 /* EnableAtmosphere.No */;
_isHilite = false;
constructor(translucent = false) {
this.isTranslucent = translucent;
}
get hasClip() {
return this.numClipPlanes > 0;
}
get usesQuantizedPositions() {
return "quantized" === this.positionType;
}
init(target, pass, instanced, animated = 0 /* IsAnimated.No */, classified = 0 /* IsClassified.No */, shadowable = 0 /* IsShadowable.No */, thematic = 0 /* IsThematic.No */, wiremesh = 0 /* IsWiremesh.No */, posType = "quantized", enableAtmosphere = 0 /* EnableAtmosphere.No */) {
const clipStack = target.uniforms.branch.clipStack;
const numClipPlanes = clipStack.hasClip ? clipStack.textureHeight : 0;
this.positionType = posType;
if (10 /* RenderPass.Hilite */ === pass || 16 /* RenderPass.HiliteClassification */ === pass || 18 /* RenderPass.HilitePlanarClassification */ === pass) {
const isClassified = (classified === 1 /* IsClassified.Yes */ && 18 /* RenderPass.HilitePlanarClassification */ === pass) ? 1 /* IsClassified.Yes */ : 0 /* IsClassified.No */;
this.initForHilite(numClipPlanes, instanced, isClassified, posType);
}
else {
this._isHilite = false;
this.isTranslucent = 8 /* RenderPass.Translucent */ === pass;
this.numClipPlanes = numClipPlanes;
this.isAnimated = animated;
this.isInstanced = instanced;
this.isClassified = classified;
this.isShadowable = shadowable;
this.isThematic = thematic;
this.isWiremesh = wiremesh;
this.enableAtmosphere = enableAtmosphere;
this.featureMode = target.uniforms.batch.featureMode;
// Determine if we should use the shaders which support discarding surfaces in favor of their edges (and discarding non-planar surfaces in favor of coincident planar surfaces).
// These are only useful if the geometry defines feature Ids.
// In 3d, if we're only displaying surfaces or edges, not both, don't bother, unless forceSurfaceDiscard is true.
this.isEdgeTestNeeded = this.hasFeatures ? (this.isClassified ? 0 /* IsEdgeTestNeeded.No */ : 1 /* IsEdgeTestNeeded.Yes */) : 0 /* IsEdgeTestNeeded.No */;
if (!target.currentViewFlags.forceSurfaceDiscard && target.is3d && !target.isReadPixelsInProgress && this.isEdgeTestNeeded) {
switch (target.currentViewFlags.renderMode) {
case RenderMode.Wireframe:
// We're only displaying edges (ignoring filled planar regions)
this.isEdgeTestNeeded = 0 /* IsEdgeTestNeeded.No */;
break;
case RenderMode.SmoothShade:
if (!target.currentViewFlags.visibleEdges && !target.wantAmbientOcclusion && pass !== 19 /* RenderPass.PlanarClassification */) {
// We're only displaying surfaces (ignoring filled planar regions).
// NB: Filled text (blanking region) is handled by adjusting the depth in the surface vertex shader.
this.isEdgeTestNeeded = 0 /* IsEdgeTestNeeded.No */;
}
break;
default:
// SolidFill and HiddenLine always display edges and surfaces.
break;
}
}
}
}
reset(mode, instanced = 0 /* IsInstanced.No */, shadowable, thematic, posType) {
this._isHilite = false;
this.featureMode = mode;
this.isTranslucent = false;
this.isEdgeTestNeeded = 0 /* IsEdgeTestNeeded.No */;
this.isAnimated = 0 /* IsAnimated.No */;
this.isClassified = 0 /* IsClassified.No */;
this.isInstanced = instanced;
this.isShadowable = shadowable;
this.isThematic = thematic;
this.isWiremesh = 0 /* IsWiremesh.No */;
this.positionType = posType;
this.enableAtmosphere = 0 /* EnableAtmosphere.No */;
this.numClipPlanes = 0;
}
get hasFeatures() { return 0 /* FeatureMode.None */ !== this.featureMode; }
setAnimated(animated) { this.isAnimated = animated ? 1 /* IsAnimated.Yes */ : 0 /* IsAnimated.No */; }
setInstanced(instanced) { this.isInstanced = instanced ? 1 /* IsInstanced.Yes */ : 0 /* IsInstanced.No */; }
setClassified(classified) {
this.isClassified = classified ? 1 /* IsClassified.Yes */ : 0 /* IsClassified.No */;
}
get isHilite() { return this._isHilite; }
initForHilite(numClipPlanes, instanced, classified, posType) {
this.featureMode = classified ? 0 /* FeatureMode.None */ : 2 /* FeatureMode.Overrides */;
this._isHilite = true;
this.isTranslucent = false;
this.isEdgeTestNeeded = 0 /* IsEdgeTestNeeded.No */;
this.isAnimated = 0 /* IsAnimated.No */;
this.isInstanced = instanced;
this.isClassified = classified;
this.numClipPlanes = numClipPlanes;
this.positionType = posType;
}
equals(other) {
return this.numClipPlanes === other.numClipPlanes
&& this.featureMode === other.featureMode
&& this.isTranslucent === other.isTranslucent
&& this.isEdgeTestNeeded === other.isEdgeTestNeeded
&& this.isAnimated === other.isAnimated
&& this.isInstanced === other.isInstanced
&& this.isClassified === other.isClassified
&& this.isShadowable === other.isShadowable
&& this.isThematic === other.isThematic
&& this.isWiremesh === other.isWiremesh
&& this.positionType === other.positionType
&& this.enableAtmosphere === other.enableAtmosphere
&& this.isHilite === other.isHilite;
}
buildDescription() {
const parts = [this.isTranslucent ? "Translucent" : "Opaque"];
if (this.isInstanced)
parts.push("Instanced");
if (this.isEdgeTestNeeded)
parts.push("EdgeTestNeeded");
if (this.isAnimated)
parts.push("Animated");
if (this.isHilite)
parts.push("Hilite");
if (this.isClassified)
parts.push("Classified");
if (this.hasClip)
parts.push("Clip");
if (this.isShadowable)
parts.push("Shadowable");
if (this.isThematic)
parts.push("Thematic");
if (this.hasFeatures)
parts.push(1 /* FeatureMode.Pick */ === this.featureMode ? "Pick" : "Overrides");
if (this.isWiremesh)
parts.push("Wiremesh");
if (this.positionType === "unquantized")
parts.push("Unquantized");
if (this.enableAtmosphere)
parts.push("EnableAtmosphere");
return parts.join("-");
}
static fromDescription(description) {
const flags = new TechniqueFlags(false);
const parts = description.split("-");
for (const part of parts) {
switch (part) {
case "Translucent":
flags.isTranslucent = true;
break;
case "Instanced":
flags.isInstanced = 1 /* IsInstanced.Yes */;
break;
case "EdgeTestNeeded":
flags.isEdgeTestNeeded = 1 /* IsEdgeTestNeeded.Yes */;
break;
case "Animated":
flags.isAnimated = 1 /* IsAnimated.Yes */;
break;
case "Hilite":
flags._isHilite = true;
break;
case "Classified":
flags.isClassified = 1 /* IsClassified.Yes */;
break;
case "Clip":
flags.numClipPlanes = 1;
break;
case "Shadowable":
flags.isShadowable = 1 /* IsShadowable.Yes */;
break;
case "Thematic":
flags.isThematic = 1 /* IsThematic.Yes */;
break;
case "Wiremesh":
flags.isWiremesh = 1 /* IsWiremesh.Yes */;
break;
case "Unquantized":
flags.positionType = "unquantized";
break;
case "EnableAtmosphere":
flags.enableAtmosphere = 1 /* EnableAtmosphere.Yes */;
break;
case "Pick":
flags.featureMode = 1 /* FeatureMode.Pick */;
break;
case "Overrides":
flags.featureMode = 2 /* FeatureMode.Overrides */;
break;
}
}
return flags;
}
static defaults = new TechniqueFlags();
}
//# sourceMappingURL=TechniqueFlags.js.map