@itwin/core-frontend
Version:
iTwin.js frontend components
60 lines • 2.96 kB
JavaScript
"use strict";
/*---------------------------------------------------------------------------------------------
* 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
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.createPointStringHiliter = createPointStringHiliter;
exports.createPointStringBuilder = createPointStringBuilder;
const AttributeMap_1 = require("../AttributeMap");
const ShaderBuilder_1 = require("../ShaderBuilder");
const Color_1 = require("./Color");
const Common_1 = require("./Common");
const FeatureSymbology_1 = require("./FeatureSymbology");
const Fragment_1 = require("./Fragment");
const Vertex_1 = require("./Vertex");
const computePosition = `
float lineWeight = computeLineWeight();
lineWeight += 0.5 * float(lineWeight > 4.0); // fudge factor for rounding fat points...
gl_PointSize = lineWeight;
return MAT_MVP * rawPos;
`;
// gl_PointSize specifies coordinates of this fragment within the point in range [0,1].
// This should be the most precise of the many approaches we've tried, but it still yields some asymmetry...
// Discarding if it meets radius precisely seems to reduce that slightly...
// ###TODO try point sprites?
const roundCorners = `
const vec2 center = vec2(0.5, 0.5);
vec2 vt = gl_PointCoord - center;
return dot(vt, vt) * v_roundCorners >= 0.25; // meets or exceeds radius of circle
`;
const computeRoundCorners = " v_roundCorners = gl_PointSize > 4.0 ? 1.0 : 0.0;";
function createBase(instanced, positionType) {
const attrMap = AttributeMap_1.AttributeMap.findAttributeMap(3 /* TechniqueId.PointString */, 1 /* IsInstanced.Yes */ === instanced);
const builder = new ShaderBuilder_1.ProgramBuilder(attrMap, { positionType, instanced: 1 /* IsInstanced.Yes */ === instanced });
const vert = builder.vert;
vert.set(10 /* VertexShaderComponent.ComputePosition */, computePosition);
(0, Vertex_1.addModelViewProjectionMatrix)(vert);
(0, Vertex_1.addLineWeight)(vert);
builder.addInlineComputedVarying("v_roundCorners", 2 /* VariableType.Float */, computeRoundCorners);
builder.frag.set(0 /* FragmentShaderComponent.CheckForEarlyDiscard */, roundCorners);
return builder;
}
/** @internal */
function createPointStringHiliter(instanced, posType) {
const builder = createBase(instanced, posType);
(0, FeatureSymbology_1.addHiliter)(builder, true);
return builder;
}
/** @internal */
function createPointStringBuilder(instanced, posType) {
const builder = createBase(instanced, posType);
(0, Common_1.addShaderFlags)(builder);
(0, Color_1.addColor)(builder);
(0, Fragment_1.addWhiteOnWhiteReversal)(builder.frag);
return builder;
}
//# sourceMappingURL=PointString.js.map