@itwin/core-frontend 5.8.0-dev.14 → 5.8.0-dev.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -1
- package/lib/cjs/common/gltf/GltfSchema.d.ts +11 -0
- package/lib/cjs/common/gltf/GltfSchema.d.ts.map +1 -1
- package/lib/cjs/common/gltf/GltfSchema.js.map +1 -1
- package/lib/cjs/common/imdl/ImdlModel.d.ts +1 -0
- package/lib/cjs/common/imdl/ImdlModel.d.ts.map +1 -1
- package/lib/cjs/common/imdl/ImdlModel.js.map +1 -1
- package/lib/cjs/common/imdl/ParseImdlDocument.d.ts.map +1 -1
- package/lib/cjs/common/imdl/ParseImdlDocument.js +2 -0
- package/lib/cjs/common/imdl/ParseImdlDocument.js.map +1 -1
- package/lib/cjs/common/internal/render/LineCode.d.ts +30 -2
- package/lib/cjs/common/internal/render/LineCode.d.ts.map +1 -1
- package/lib/cjs/common/internal/render/LineCode.js +105 -14
- package/lib/cjs/common/internal/render/LineCode.js.map +1 -1
- package/lib/cjs/common/internal/render/MeshPrimitives.d.ts +1 -0
- package/lib/cjs/common/internal/render/MeshPrimitives.d.ts.map +1 -1
- package/lib/cjs/common/internal/render/MeshPrimitives.js +2 -0
- package/lib/cjs/common/internal/render/MeshPrimitives.js.map +1 -1
- package/lib/cjs/common/internal/render/PolylineParams.d.ts +1 -0
- package/lib/cjs/common/internal/render/PolylineParams.d.ts.map +1 -1
- package/lib/cjs/common/internal/render/PolylineParams.js +1 -0
- package/lib/cjs/common/internal/render/PolylineParams.js.map +1 -1
- package/lib/cjs/common/internal/render/VertexTableBuilder.d.ts.map +1 -1
- package/lib/cjs/common/internal/render/VertexTableBuilder.js +87 -4
- package/lib/cjs/common/internal/render/VertexTableBuilder.js.map +1 -1
- package/lib/cjs/internal/render/webgl/CachedGeometry.d.ts +1 -0
- package/lib/cjs/internal/render/webgl/CachedGeometry.d.ts.map +1 -1
- package/lib/cjs/internal/render/webgl/CachedGeometry.js +1 -0
- package/lib/cjs/internal/render/webgl/CachedGeometry.js.map +1 -1
- package/lib/cjs/internal/render/webgl/LineCode.d.ts +4 -2
- package/lib/cjs/internal/render/webgl/LineCode.d.ts.map +1 -1
- package/lib/cjs/internal/render/webgl/LineCode.js +55 -22
- package/lib/cjs/internal/render/webgl/LineCode.js.map +1 -1
- package/lib/cjs/internal/render/webgl/Polyline.d.ts +2 -0
- package/lib/cjs/internal/render/webgl/Polyline.d.ts.map +1 -1
- package/lib/cjs/internal/render/webgl/Polyline.js +3 -0
- package/lib/cjs/internal/render/webgl/Polyline.js.map +1 -1
- package/lib/cjs/internal/render/webgl/System.d.ts +2 -0
- package/lib/cjs/internal/render/webgl/System.d.ts.map +1 -1
- package/lib/cjs/internal/render/webgl/System.js +15 -1
- package/lib/cjs/internal/render/webgl/System.js.map +1 -1
- package/lib/cjs/internal/render/webgl/Texture.d.ts +1 -1
- package/lib/cjs/internal/render/webgl/Texture.d.ts.map +1 -1
- package/lib/cjs/internal/render/webgl/Texture.js +2 -1
- package/lib/cjs/internal/render/webgl/Texture.js.map +1 -1
- package/lib/cjs/internal/render/webgl/glsl/Edge.js +1 -1
- package/lib/cjs/internal/render/webgl/glsl/Edge.js.map +1 -1
- package/lib/cjs/internal/render/webgl/glsl/Polyline.d.ts.map +1 -1
- package/lib/cjs/internal/render/webgl/glsl/Polyline.js +82 -13
- package/lib/cjs/internal/render/webgl/glsl/Polyline.js.map +1 -1
- package/lib/cjs/internal/tile/ImdlGraphicsCreator.d.ts.map +1 -1
- package/lib/cjs/internal/tile/ImdlGraphicsCreator.js +1 -0
- package/lib/cjs/internal/tile/ImdlGraphicsCreator.js.map +1 -1
- package/lib/cjs/render/PolylineArgs.d.ts +2 -0
- package/lib/cjs/render/PolylineArgs.d.ts.map +1 -1
- package/lib/cjs/render/PolylineArgs.js.map +1 -1
- package/lib/cjs/tile/GltfReader.d.ts +9 -2
- package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
- package/lib/cjs/tile/GltfReader.js +104 -14
- package/lib/cjs/tile/GltfReader.js.map +1 -1
- package/lib/esm/common/gltf/GltfSchema.d.ts +11 -0
- package/lib/esm/common/gltf/GltfSchema.d.ts.map +1 -1
- package/lib/esm/common/gltf/GltfSchema.js.map +1 -1
- package/lib/esm/common/imdl/ImdlModel.d.ts +1 -0
- package/lib/esm/common/imdl/ImdlModel.d.ts.map +1 -1
- package/lib/esm/common/imdl/ImdlModel.js.map +1 -1
- package/lib/esm/common/imdl/ParseImdlDocument.d.ts.map +1 -1
- package/lib/esm/common/imdl/ParseImdlDocument.js +2 -0
- package/lib/esm/common/imdl/ParseImdlDocument.js.map +1 -1
- package/lib/esm/common/internal/render/LineCode.d.ts +30 -2
- package/lib/esm/common/internal/render/LineCode.d.ts.map +1 -1
- package/lib/esm/common/internal/render/LineCode.js +98 -14
- package/lib/esm/common/internal/render/LineCode.js.map +1 -1
- package/lib/esm/common/internal/render/MeshPrimitives.d.ts +1 -0
- package/lib/esm/common/internal/render/MeshPrimitives.d.ts.map +1 -1
- package/lib/esm/common/internal/render/MeshPrimitives.js +2 -0
- package/lib/esm/common/internal/render/MeshPrimitives.js.map +1 -1
- package/lib/esm/common/internal/render/PolylineParams.d.ts +1 -0
- package/lib/esm/common/internal/render/PolylineParams.d.ts.map +1 -1
- package/lib/esm/common/internal/render/PolylineParams.js +1 -0
- package/lib/esm/common/internal/render/PolylineParams.js.map +1 -1
- package/lib/esm/common/internal/render/VertexTableBuilder.d.ts.map +1 -1
- package/lib/esm/common/internal/render/VertexTableBuilder.js +87 -4
- package/lib/esm/common/internal/render/VertexTableBuilder.js.map +1 -1
- package/lib/esm/internal/render/webgl/CachedGeometry.d.ts +1 -0
- package/lib/esm/internal/render/webgl/CachedGeometry.d.ts.map +1 -1
- package/lib/esm/internal/render/webgl/CachedGeometry.js +1 -0
- package/lib/esm/internal/render/webgl/CachedGeometry.js.map +1 -1
- package/lib/esm/internal/render/webgl/LineCode.d.ts +4 -2
- package/lib/esm/internal/render/webgl/LineCode.d.ts.map +1 -1
- package/lib/esm/internal/render/webgl/LineCode.js +56 -23
- package/lib/esm/internal/render/webgl/LineCode.js.map +1 -1
- package/lib/esm/internal/render/webgl/Polyline.d.ts +2 -0
- package/lib/esm/internal/render/webgl/Polyline.d.ts.map +1 -1
- package/lib/esm/internal/render/webgl/Polyline.js +3 -0
- package/lib/esm/internal/render/webgl/Polyline.js.map +1 -1
- package/lib/esm/internal/render/webgl/System.d.ts +2 -0
- package/lib/esm/internal/render/webgl/System.d.ts.map +1 -1
- package/lib/esm/internal/render/webgl/System.js +16 -2
- package/lib/esm/internal/render/webgl/System.js.map +1 -1
- package/lib/esm/internal/render/webgl/Texture.d.ts +1 -1
- package/lib/esm/internal/render/webgl/Texture.d.ts.map +1 -1
- package/lib/esm/internal/render/webgl/Texture.js +1 -1
- package/lib/esm/internal/render/webgl/Texture.js.map +1 -1
- package/lib/esm/internal/render/webgl/glsl/Edge.js +1 -1
- package/lib/esm/internal/render/webgl/glsl/Edge.js.map +1 -1
- package/lib/esm/internal/render/webgl/glsl/Polyline.d.ts.map +1 -1
- package/lib/esm/internal/render/webgl/glsl/Polyline.js +82 -13
- package/lib/esm/internal/render/webgl/glsl/Polyline.js.map +1 -1
- package/lib/esm/internal/tile/ImdlGraphicsCreator.d.ts.map +1 -1
- package/lib/esm/internal/tile/ImdlGraphicsCreator.js +1 -0
- package/lib/esm/internal/tile/ImdlGraphicsCreator.js.map +1 -1
- package/lib/esm/render/PolylineArgs.d.ts +2 -0
- package/lib/esm/render/PolylineArgs.d.ts.map +1 -1
- package/lib/esm/render/PolylineArgs.js.map +1 -1
- package/lib/esm/tile/GltfReader.d.ts +9 -2
- package/lib/esm/tile/GltfReader.d.ts.map +1 -1
- package/lib/esm/tile/GltfReader.js +104 -14
- package/lib/esm/tile/GltfReader.js.map +1 -1
- package/lib/public/scripts/parse-imdl-worker.js +1 -1
- package/lib/workers/webpack/parse-imdl-worker.js +1 -1
- package/package.json +20 -20
|
@@ -10,6 +10,7 @@ import { AttributeMap } from "../AttributeMap";
|
|
|
10
10
|
import { TextureUnit } from "../RenderFlags";
|
|
11
11
|
import { ProgramBuilder, } from "../ShaderBuilder";
|
|
12
12
|
import { System } from "../System";
|
|
13
|
+
import { LineCode } from "../LineCode";
|
|
13
14
|
import { addColor } from "./Color";
|
|
14
15
|
import { addEdgeContrast } from "./Edge";
|
|
15
16
|
import { addFrustum, addShaderFlags } from "./Common";
|
|
@@ -40,7 +41,7 @@ const applyLineCode = `
|
|
|
40
41
|
return baseColor;
|
|
41
42
|
`;
|
|
42
43
|
const computeTextureCoord = `
|
|
43
|
-
vec2 computeLineCodeTextureCoords(vec2 windowDir, vec4 projPos, float adjust) {
|
|
44
|
+
vec2 computeLineCodeTextureCoords(vec2 windowDir, vec4 projPos, float adjust, float patternDist) {
|
|
44
45
|
vec2 texc;
|
|
45
46
|
float lineCode = computeLineCode();
|
|
46
47
|
if (0.0 == lineCode) {
|
|
@@ -50,22 +51,65 @@ vec2 computeLineCodeTextureCoords(vec2 windowDir, vec4 projPos, float adjust) {
|
|
|
50
51
|
const float imagesPerPixel = 1.0/32.0;
|
|
51
52
|
const float textureCoordinateBase = 8192.0; // Temp workardound for clipping problem in perspective views (negative values don't seem to interpolate correctly).
|
|
52
53
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
float patternDistPixels;
|
|
55
|
+
if (u_useCumDist > 0.5) {
|
|
56
|
+
patternDistPixels = patternDist * u_pixelsPerWorld;
|
|
57
|
+
} else {
|
|
58
|
+
if (abs(windowDir.x) > abs(windowDir.y))
|
|
59
|
+
patternDistPixels = projPos.x + adjust * windowDir.x;
|
|
60
|
+
else
|
|
61
|
+
patternDistPixels = projPos.y + adjust * windowDir.y;
|
|
62
|
+
}
|
|
63
|
+
texc.x = textureCoordinateBase + imagesPerPixel * patternDistPixels;
|
|
57
64
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const float stepY = rowsPerCode/numRows;
|
|
65
|
+
// Use uniform to support dynamic capacity based on System.maxTextureSize
|
|
66
|
+
float numRows = u_numLineCodes;
|
|
67
|
+
float centerY = 0.5 / numRows;
|
|
68
|
+
float stepY = 1.0 / numRows;
|
|
63
69
|
texc.y = stepY * lineCode + centerY;
|
|
64
70
|
}
|
|
65
71
|
|
|
66
72
|
return texc;
|
|
67
73
|
}
|
|
68
74
|
`;
|
|
75
|
+
function addPixelsPerWorldUniform(prog) {
|
|
76
|
+
const addUniform = (shader) => {
|
|
77
|
+
shader.addUniform("u_pixelsPerWorld", 2 /* VariableType.Float */, (prg) => {
|
|
78
|
+
prg.addProgramUniform("u_pixelsPerWorld", (uniform, params) => {
|
|
79
|
+
// Calculate pixels per world unit from viewport
|
|
80
|
+
// For orthographic views this is constant and provides stable pattern scaling
|
|
81
|
+
const vp = params.target.viewRect;
|
|
82
|
+
// Default to 1.0 if we can't calculate (will use world units directly)
|
|
83
|
+
let pixelsPerWorld = 1.0;
|
|
84
|
+
// Get frustum planes: { top, bottom, left, right }
|
|
85
|
+
const planes = params.target.uniforms.frustum.planes;
|
|
86
|
+
const worldWidth = planes[3] - planes[2]; // right - left
|
|
87
|
+
if (worldWidth > 0) {
|
|
88
|
+
// worldWidth is the view width in world units
|
|
89
|
+
pixelsPerWorld = vp.width / worldWidth;
|
|
90
|
+
}
|
|
91
|
+
uniform.setUniform1f(pixelsPerWorld);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
addUniform(prog.vert);
|
|
96
|
+
addUniform(prog.frag);
|
|
97
|
+
}
|
|
98
|
+
function addUseCumulativeDistanceUniform(prog) {
|
|
99
|
+
prog.vert.addUniform("u_useCumDist", 2 /* VariableType.Float */, (prg) => {
|
|
100
|
+
prg.addGraphicUniform("u_useCumDist", (uniform, params) => {
|
|
101
|
+
uniform.setUniform1f(params.geometry.hasCumulativeDistances ? 1.0 : 0.0);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function addNumLineCodesUniform(prog) {
|
|
106
|
+
prog.vert.addUniform("u_numLineCodes", 2 /* VariableType.Float */, (prg) => {
|
|
107
|
+
prg.addProgramUniform("u_numLineCodes", (uniform, _params) => {
|
|
108
|
+
// Pass the current LineCode capacity to the shader
|
|
109
|
+
uniform.setUniform1f(LineCode.capacity());
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
69
113
|
/** @internal */
|
|
70
114
|
export const adjustWidth = `
|
|
71
115
|
void adjustWidth(inout float width, vec2 d2, vec2 org) {
|
|
@@ -148,6 +192,9 @@ export function addLineCode(prog, args) {
|
|
|
148
192
|
const vert = prog.vert;
|
|
149
193
|
const frag = prog.frag;
|
|
150
194
|
addLineCodeUniform(vert);
|
|
195
|
+
addPixelsPerWorldUniform(prog);
|
|
196
|
+
addUseCumulativeDistanceUniform(prog);
|
|
197
|
+
addNumLineCodesUniform(prog); // Add uniform for dynamic capacity
|
|
151
198
|
const funcCall = `computeLineCodeTextureCoords(${args})`;
|
|
152
199
|
prog.addFunctionComputedVaryingWithArgs("v_texc", 3 /* VariableType.Vec2 */, funcCall, computeTextureCoord);
|
|
153
200
|
addFrustum(prog);
|
|
@@ -174,12 +221,14 @@ function addCommon(prog) {
|
|
|
174
221
|
vert.addFunction(unquantize2d);
|
|
175
222
|
addLineWeight(vert);
|
|
176
223
|
vert.addGlobal("miterAdjust", 2 /* VariableType.Float */, "0.0");
|
|
224
|
+
prog.addVarying("v_patternDistance", 2 /* VariableType.Float */);
|
|
177
225
|
prog.addVarying("v_eyeSpace", 4 /* VariableType.Vec3 */);
|
|
178
|
-
vert.set(10 /* VertexShaderComponent.ComputePosition */,
|
|
226
|
+
vert.set(10 /* VertexShaderComponent.ComputePosition */, buildComputePosition(vert.positionType));
|
|
179
227
|
prog.addVarying("v_lnInfo", 5 /* VariableType.Vec4 */);
|
|
180
228
|
addAdjustWidth(vert);
|
|
181
229
|
addSamplePosition(vert);
|
|
182
230
|
vert.addFunction(decodePosition);
|
|
231
|
+
vert.addFunction(decodeFloatFromBytes);
|
|
183
232
|
}
|
|
184
233
|
const decodePosition = `
|
|
185
234
|
vec4 decodePosition(vec3 baseIndex) {
|
|
@@ -191,7 +240,18 @@ const decodeAdjacentPositions = `
|
|
|
191
240
|
g_prevPos = decodePosition(a_prevIndex);
|
|
192
241
|
g_nextPos = decodePosition(a_nextIndex);
|
|
193
242
|
`;
|
|
194
|
-
const
|
|
243
|
+
const decodeFloatFromBytes = `
|
|
244
|
+
float decodeFloatFromBytes(vec4 bytes) {
|
|
245
|
+
uvec4 b = uvec4(bytes);
|
|
246
|
+
uint u = b.x | (b.y << 8) | (b.z << 16) | (b.w << 24);
|
|
247
|
+
return uintBitsToFloat(u);
|
|
248
|
+
}
|
|
249
|
+
`;
|
|
250
|
+
function buildComputePosition(positionType) {
|
|
251
|
+
const cumDistExpr = positionType === "unquantized"
|
|
252
|
+
? "((u_vertParams.z > 5.0) ? decodeFloatFromBytes(g_vertLutData5) : 0.0)"
|
|
253
|
+
: "((u_vertParams.z > 3.0) ? decodeFloatFromBytes(g_vertLutData3) : 0.0)";
|
|
254
|
+
return `
|
|
195
255
|
const float kNone = 0.0,
|
|
196
256
|
kSquare = 1.0*3.0,
|
|
197
257
|
kMiter = 2.0*3.0,
|
|
@@ -216,9 +276,11 @@ const computePosition = `
|
|
|
216
276
|
if (param >= kNoneAdjWt)
|
|
217
277
|
param -= kNoneAdjWt;
|
|
218
278
|
|
|
279
|
+
bool isSegmentStart = true;
|
|
219
280
|
if (param >= kNegateAlong) {
|
|
220
281
|
directionScale = -directionScale;
|
|
221
282
|
param -= kNegateAlong;
|
|
283
|
+
isSegmentStart = false;
|
|
222
284
|
}
|
|
223
285
|
|
|
224
286
|
if (param >= kNegatePerp) {
|
|
@@ -231,6 +293,11 @@ const computePosition = `
|
|
|
231
293
|
vec4 projNext = modelToWindowCoordinates(next, rawPos, otherPos, otherMvPos);
|
|
232
294
|
g_windowDir = projNext.xy - g_windowPos.xy;
|
|
233
295
|
|
|
296
|
+
if (u_useCumDist > 0.5)
|
|
297
|
+
v_patternDistance = ${cumDistExpr};
|
|
298
|
+
else
|
|
299
|
+
v_patternDistance = 0.0;
|
|
300
|
+
|
|
234
301
|
if (param < kJointBase) {
|
|
235
302
|
vec2 dir = (directionScale > 0.0) ? g_windowDir : -g_windowDir;
|
|
236
303
|
vec2 pos = (directionScale > 0.0) ? g_windowPos.xy : projNext.xy;
|
|
@@ -298,7 +365,8 @@ const computePosition = `
|
|
|
298
365
|
|
|
299
366
|
return pos;
|
|
300
367
|
`;
|
|
301
|
-
|
|
368
|
+
}
|
|
369
|
+
const lineCodeArgs = "g_windowDir, g_windowPos, miterAdjust, v_patternDistance";
|
|
302
370
|
/** @internal */
|
|
303
371
|
export function createPolylineBuilder(isInstanced, positionType) {
|
|
304
372
|
const instanced = 1 /* IsInstanced.Yes */ === isInstanced;
|
|
@@ -318,6 +386,7 @@ export function createPolylineHiliter(isInstanced, positionType) {
|
|
|
318
386
|
const attrMap = AttributeMap.findAttributeMap(1 /* TechniqueId.Polyline */, instanced);
|
|
319
387
|
const builder = new ProgramBuilder(attrMap, { positionType, instanced });
|
|
320
388
|
addCommon(builder);
|
|
389
|
+
addUseCumulativeDistanceUniform(builder);
|
|
321
390
|
addFrustum(builder);
|
|
322
391
|
addHiliter(builder, true);
|
|
323
392
|
return builder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Polyline.js","sourceRoot":"","sources":["../../../../../../src/internal/render/webgl/glsl/Polyline.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { AttributeMap } from \"../AttributeMap\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport {\r\n FragmentShaderBuilder, FragmentShaderComponent, ProgramBuilder, VariableType, VertexShaderBuilder, VertexShaderComponent,\r\n} from \"../ShaderBuilder\";\r\nimport { System } from \"../System\";\r\nimport { IsInstanced, PositionType } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { addColor } from \"./Color\";\r\nimport { addEdgeContrast } from \"./Edge\";\r\nimport { addFrustum, addShaderFlags } from \"./Common\";\r\nimport { unquantize2d } from \"./Decode\";\r\nimport { addHiliter } from \"./FeatureSymbology\";\r\nimport { addWhiteOnWhiteReversal } from \"./Fragment\";\r\nimport {\r\n addLineCode as addLineCodeUniform, addLineWeight, addModelViewMatrix, addProjectionMatrix, addSamplePosition,\r\n} from \"./Vertex\";\r\nimport { addModelToWindowCoordinates, addViewport } from \"./Viewport\";\r\n\r\nconst checkForDiscard = \"return discardByLineCode;\";\r\n\r\nconst applyLineCode = `\r\n if (v_texc.x >= 0.0) { // v_texc = (-1,-1) for solid lines - don't bother with any of this\r\n vec4 texColor = TEXTURE(u_lineCodeTexture, v_texc);\r\n discardByLineCode = (0.0 == texColor.r);\r\n }\r\n\r\n if (v_lnInfo.w > 0.5) { // line needs pixel trimming\r\n // calculate pixel distance from pixel center to expected line center, opposite dir from major\r\n vec2 dxy = gl_FragCoord.xy - v_lnInfo.xy;\r\n if (v_lnInfo.w < 1.5) // not x-major\r\n dxy = dxy.yx;\r\n\r\n float dist = v_lnInfo.z * dxy.x - dxy.y;\r\n float distA = abs(dist);\r\n if (distA > 0.5 || (distA == 0.5 && dist < 0.0))\r\n discardByLineCode = true; // borrow this flag to force discard\r\n }\r\n\r\n return baseColor;\r\n`;\r\n\r\nconst computeTextureCoord = `\r\nvec2 computeLineCodeTextureCoords(vec2 windowDir, vec4 projPos, float adjust) {\r\n vec2 texc;\r\n float lineCode = computeLineCode();\r\n if (0.0 == lineCode) {\r\n // Solid line - tell frag shader not to bother.\r\n texc = vec2(-1.0, -1.0);\r\n } else {\r\n const float imagesPerPixel = 1.0/32.0;\r\n const float textureCoordinateBase = 8192.0; // Temp workardound for clipping problem in perspective views (negative values don't seem to interpolate correctly).\r\n\r\n if (abs(windowDir.x) > abs(windowDir.y))\r\n texc.x = textureCoordinateBase + imagesPerPixel * (projPos.x + adjust * windowDir.x);\r\n else\r\n texc.x = textureCoordinateBase + imagesPerPixel * (projPos.y + adjust * windowDir.y);\r\n\r\n const float numLineCodes = 16.0; // NB: Actually only 10, but texture is 16px tall because it needs to be a power of 2.\r\n const float rowsPerCode = 1.0;\r\n const float numRows = numLineCodes*rowsPerCode;\r\n const float centerY = 0.5/numRows;\r\n const float stepY = rowsPerCode/numRows;\r\n texc.y = stepY * lineCode + centerY;\r\n }\r\n\r\n return texc;\r\n}\r\n`;\r\n\r\n/** @internal */\r\nexport const adjustWidth = `\r\nvoid adjustWidth(inout float width, vec2 d2, vec2 org) {\r\n if (u_aaSamples > 1) {\r\n if (width < 5.0)\r\n width += (5.0 - width) * 0.125;\r\n return;\r\n }\r\n\r\n // calculate slope based width adjustment for non-AA lines, widths 1 to 4\r\n vec2 d2A = abs(d2);\r\n const float s_myFltEpsilon = 0.0001; // limit test resolution to 4 digits in case 24 bit (s16e7) is used in hardware\r\n if (d2A.y > s_myFltEpsilon && width < 4.5) {\r\n float len = length(d2A);\r\n float tan = d2A.x / d2A.y;\r\n\r\n if (width < 1.5) { // width 1\r\n if (tan <= 1.0)\r\n width = d2A.y;\r\n else\r\n width = d2A.x;\r\n // width 1 requires additional adjustment plus trimming in frag shader using v_lnInfo\r\n width *= 1.01;\r\n v_lnInfo.xy = org;\r\n v_lnInfo.w = 1.0; // set flag to do trimming\r\n // set slope in v_lnInfo.z\r\n if (d2A.x - d2A.y > s_myFltEpsilon) {\r\n v_lnInfo.z = d2.y / d2.x;\r\n v_lnInfo.w += 2.0; // add in x-major flag\r\n } else\r\n v_lnInfo.z = d2.x / d2.y;\r\n\r\n } else if (width < 2.5) { // width 2\r\n if (tan <= 0.5)\r\n width = 2.0 * d2A.y;\r\n else\r\n width = (d2A.y + 2.0 * d2A.x);\r\n\r\n } else if (width < 3.5) { // width 3\r\n if (tan <= 1.0)\r\n width = (3.0 * d2A.y + d2A.x);\r\n else\r\n width = (d2A.y + 3.0 * d2A.x);\r\n\r\n } else { // if (width < 4.5) // width 4\r\n if (tan <= 0.5)\r\n width = (4.0 * d2A.y + d2A.x);\r\n else if (tan <= 2.0)\r\n width = (3.0 * d2A.y + 3.0 * d2A.x);\r\n else\r\n width = (d2A.y + 4.0 * d2A.x);\r\n }\r\n width /= len;\r\n }\r\n}\r\n`;\r\n\r\n/** @internal */\r\nexport function addAdjustWidth(vert: VertexShaderBuilder) {\r\n vert.addUniform(\"u_aaSamples\", VariableType.Int, (prog) => {\r\n prog.addGraphicUniform(\"u_aaSamples\", (attr, params) => {\r\n const numSamples = System.instance.frameBufferStack.currentFbMultisampled ? params.target.compositor.antialiasSamples : 1;\r\n attr.setUniform1i(numSamples);\r\n });\r\n });\r\n vert.addFunction(adjustWidth);\r\n}\r\n\r\n/** @internal */\r\nexport function addLineCodeTexture(frag: FragmentShaderBuilder) {\r\n frag.addUniform(\"u_lineCodeTexture\", VariableType.Sampler2D, (prog) => {\r\n prog.addProgramUniform(\"u_lineCodeTexture\", (uniform) => {\r\n const lct = System.instance.lineCodeTexture;\r\n assert(undefined !== lct);\r\n if (undefined !== lct)\r\n lct.bindSampler(uniform, TextureUnit.LineCode);\r\n });\r\n });\r\n}\r\n\r\n/** @internal */\r\nexport function addLineCode(prog: ProgramBuilder, args: string) {\r\n const vert = prog.vert;\r\n const frag = prog.frag;\r\n\r\n addLineCodeUniform(vert);\r\n\r\n const funcCall: string = `computeLineCodeTextureCoords(${args})`;\r\n\r\n prog.addFunctionComputedVaryingWithArgs(\"v_texc\", VariableType.Vec2, funcCall, computeTextureCoord);\r\n\r\n addFrustum(prog);\r\n addLineCodeTexture(prog.frag);\r\n\r\n frag.set(FragmentShaderComponent.FinalizeBaseColor, applyLineCode);\r\n frag.set(FragmentShaderComponent.CheckForDiscard, checkForDiscard);\r\n frag.addGlobal(\"discardByLineCode\", VariableType.Boolean, \"false\");\r\n}\r\n\r\nfunction polylineAddLineCode(prog: ProgramBuilder) {\r\n addLineCode(prog, lineCodeArgs);\r\n addModelViewMatrix(prog.vert);\r\n}\r\n\r\nfunction addCommon(prog: ProgramBuilder) {\r\n const vert = prog.vert;\r\n addModelToWindowCoordinates(vert); // adds u_mvp, u_viewportTransformation\r\n addProjectionMatrix(vert);\r\n addModelViewMatrix(vert);\r\n addViewport(vert);\r\n\r\n vert.addGlobal(\"g_windowPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_prevPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_nextPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_windowDir\", VariableType.Vec2);\r\n vert.addInitializer(decodeAdjacentPositions);\r\n\r\n vert.addFunction(unquantize2d);\r\n\r\n addLineWeight(vert);\r\n\r\n vert.addGlobal(\"miterAdjust\", VariableType.Float, \"0.0\");\r\n prog.addVarying(\"v_eyeSpace\", VariableType.Vec3);\r\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\r\n prog.addVarying(\"v_lnInfo\", VariableType.Vec4);\r\n addAdjustWidth(vert);\r\n\r\n addSamplePosition(vert);\r\n vert.addFunction(decodePosition);\r\n}\r\n\r\nconst decodePosition = `\r\nvec4 decodePosition(vec3 baseIndex) {\r\n float index = decodeUInt24(baseIndex);\r\n return samplePosition(index);\r\n}\r\n`;\r\n\r\nconst decodeAdjacentPositions = `\r\n g_prevPos = decodePosition(a_prevIndex);\r\n g_nextPos = decodePosition(a_nextIndex);\r\n`;\r\n\r\nconst computePosition = `\r\n const float kNone = 0.0,\r\n kSquare = 1.0*3.0,\r\n kMiter = 2.0*3.0,\r\n kMiterInsideOnly = 3.0*3.0,\r\n kJointBase = 4.0*3.0,\r\n kNegatePerp = 8.0*3.0,\r\n kNegateAlong = 16.0*3.0,\r\n kNoneAdjWt = 32.0*3.0;\r\n\r\n v_lnInfo = vec4(0.0, 0.0, 0.0, 0.0); // init and set flag to false\r\n\r\n vec4 next = g_nextPos;\r\n vec4 pos;\r\n g_windowPos = modelToWindowCoordinates(rawPos, next, pos, v_eyeSpace);\r\n if (g_windowPos.w == 0.0)\r\n return g_windowPos;\r\n\r\n float param = a_param;\r\n float weight = computeLineWeight();\r\n float scale = 1.0, directionScale = 1.0;\r\n\r\n if (param >= kNoneAdjWt)\r\n param -= kNoneAdjWt;\r\n\r\n if (param >= kNegateAlong) {\r\n directionScale = -directionScale;\r\n param -= kNegateAlong;\r\n }\r\n\r\n if (param >= kNegatePerp) {\r\n scale = -1.0;\r\n param -= kNegatePerp;\r\n }\r\n\r\n vec4 otherPos;\r\n vec3 otherMvPos;\r\n vec4 projNext = modelToWindowCoordinates(next, rawPos, otherPos, otherMvPos);\r\n g_windowDir = projNext.xy - g_windowPos.xy;\r\n\r\n if (param < kJointBase) {\r\n vec2 dir = (directionScale > 0.0) ? g_windowDir : -g_windowDir;\r\n vec2 pos = (directionScale > 0.0) ? g_windowPos.xy : projNext.xy;\r\n adjustWidth(weight, dir, pos);\r\n }\r\n\r\n if (kNone != param) {\r\n vec2 delta = vec2(0.0);\r\n vec4 prev = g_prevPos;\r\n vec4 projPrev = modelToWindowCoordinates(prev, rawPos, otherPos, otherMvPos);\r\n vec2 prevDir = g_windowPos.xy - projPrev.xy;\r\n float thisLength = sqrt(g_windowDir.x * g_windowDir.x + g_windowDir.y * g_windowDir.y);\r\n const float s_minNormalizeLength = 1.0E-5; // avoid normalizing zero length vectors.\r\n float dist = weight / 2.0;\r\n\r\n if (thisLength > s_minNormalizeLength) {\r\n g_windowDir /= thisLength;\r\n\r\n float prevLength = sqrt(prevDir.x * prevDir.x + prevDir.y * prevDir.y);\r\n\r\n if (prevLength > s_minNormalizeLength) {\r\n prevDir /= prevLength;\r\n const float s_minParallelDot= -.9999, s_maxParallelDot = .9999;\r\n float prevNextDot = dot(prevDir, g_windowDir);\r\n\r\n if (prevNextDot < s_minParallelDot || prevNextDot > s_maxParallelDot) // No miter if parallel or antiparallel.\r\n param = kSquare;\r\n } else\r\n param = kSquare;\r\n } else {\r\n g_windowDir = -normalize(prevDir);\r\n param = kSquare;\r\n }\r\n\r\n vec2 perp = scale * vec2(-g_windowDir.y, g_windowDir.x);\r\n\r\n if (param == kSquare) {\r\n delta = perp;\r\n } else {\r\n vec2 bisector = normalize(prevDir - g_windowDir);\r\n float dotP = dot (bisector, perp);\r\n\r\n if (dotP != 0.0) { // Should never occur - but avoid divide by zero.\r\n const float maxMiter = 3.0;\r\n float miterDistance = 1.0/dotP;\r\n\r\n if (param == kMiter) { // Straight miter.\r\n delta = (abs(miterDistance) > maxMiter) ? perp : bisector * miterDistance;\r\n\r\n } else if (param == kMiterInsideOnly) { // Miter at inside, square at outside (to make room for joint).\r\n delta = (dotP > 0.0 || abs(miterDistance) > maxMiter) ? perp : bisector * miterDistance;\r\n\r\n } else {\r\n const float jointTriangleCount = 3.0;\r\n float ratio = (param - kJointBase) / jointTriangleCount; // 3 triangles per half-joint as defined in Graphics.cpp\r\n delta = normalize((1.0 - ratio) * bisector + (dotP < 0.0 ? -ratio : ratio) * perp); // Miter/Straight combination.\r\n }\r\n }\r\n }\r\n\r\n miterAdjust = dot(g_windowDir, delta) * dist; // Not actually used for hilite shader but meh.\r\n pos.x += dist * delta.x * 2.0 * pos.w / u_viewport.x;\r\n pos.y += dist * delta.y * 2.0 * pos.w / u_viewport.y;\r\n }\r\n\r\n return pos;\r\n`;\r\n\r\nconst lineCodeArgs = \"g_windowDir, g_windowPos, miterAdjust\";\r\n\r\n/** @internal */\r\nexport function createPolylineBuilder(isInstanced: IsInstanced, positionType: PositionType): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Polyline, instanced);\r\n const builder = new ProgramBuilder(attrMap, { positionType, instanced });\r\n\r\n addShaderFlags(builder);\r\n\r\n addCommon(builder);\r\n\r\n polylineAddLineCode(builder);\r\n\r\n addColor(builder);\r\n addEdgeContrast(builder.vert);\r\n addWhiteOnWhiteReversal(builder.frag);\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createPolylineHiliter(isInstanced: IsInstanced, positionType: PositionType): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Polyline, instanced);\r\n const builder = new ProgramBuilder(attrMap, { positionType, instanced });\r\n\r\n addCommon(builder);\r\n addFrustum(builder);\r\n addHiliter(builder, true);\r\n return builder;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Polyline.js","sourceRoot":"","sources":["../../../../../../src/internal/render/webgl/glsl/Polyline.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { AttributeMap } from \"../AttributeMap\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport {\r\n FragmentShaderBuilder, FragmentShaderComponent, ProgramBuilder, VariableType, VertexShaderBuilder, VertexShaderComponent,\r\n} from \"../ShaderBuilder\";\r\nimport { System } from \"../System\";\r\nimport { LineCode } from \"../LineCode\";\r\nimport { IsInstanced, PositionType } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { addColor } from \"./Color\";\r\nimport { addEdgeContrast } from \"./Edge\";\r\nimport { addFrustum, addShaderFlags } from \"./Common\";\r\nimport { unquantize2d } from \"./Decode\";\r\nimport { addHiliter } from \"./FeatureSymbology\";\r\nimport { addWhiteOnWhiteReversal } from \"./Fragment\";\r\nimport {\r\n addLineCode as addLineCodeUniform, addLineWeight, addModelViewMatrix, addProjectionMatrix, addSamplePosition,\r\n} from \"./Vertex\";\r\nimport { addModelToWindowCoordinates, addViewport } from \"./Viewport\";\r\n\r\nconst checkForDiscard = \"return discardByLineCode;\";\r\n\r\nconst applyLineCode = `\r\n if (v_texc.x >= 0.0) { // v_texc = (-1,-1) for solid lines - don't bother with any of this\r\n vec4 texColor = TEXTURE(u_lineCodeTexture, v_texc);\r\n discardByLineCode = (0.0 == texColor.r);\r\n }\r\n\r\n if (v_lnInfo.w > 0.5) { // line needs pixel trimming\r\n // calculate pixel distance from pixel center to expected line center, opposite dir from major\r\n vec2 dxy = gl_FragCoord.xy - v_lnInfo.xy;\r\n if (v_lnInfo.w < 1.5) // not x-major\r\n dxy = dxy.yx;\r\n\r\n float dist = v_lnInfo.z * dxy.x - dxy.y;\r\n float distA = abs(dist);\r\n if (distA > 0.5 || (distA == 0.5 && dist < 0.0))\r\n discardByLineCode = true; // borrow this flag to force discard\r\n }\r\n\r\n return baseColor;\r\n`;\r\n\r\nconst computeTextureCoord = `\r\nvec2 computeLineCodeTextureCoords(vec2 windowDir, vec4 projPos, float adjust, float patternDist) {\r\n vec2 texc;\r\n float lineCode = computeLineCode();\r\n if (0.0 == lineCode) {\r\n // Solid line - tell frag shader not to bother.\r\n texc = vec2(-1.0, -1.0);\r\n } else {\r\n const float imagesPerPixel = 1.0/32.0;\r\n const float textureCoordinateBase = 8192.0; // Temp workardound for clipping problem in perspective views (negative values don't seem to interpolate correctly).\r\n\r\n float patternDistPixels;\r\n if (u_useCumDist > 0.5) {\r\n patternDistPixels = patternDist * u_pixelsPerWorld;\r\n } else {\r\n if (abs(windowDir.x) > abs(windowDir.y))\r\n patternDistPixels = projPos.x + adjust * windowDir.x;\r\n else\r\n patternDistPixels = projPos.y + adjust * windowDir.y;\r\n }\r\n texc.x = textureCoordinateBase + imagesPerPixel * patternDistPixels;\r\n\r\n // Use uniform to support dynamic capacity based on System.maxTextureSize\r\n float numRows = u_numLineCodes;\r\n float centerY = 0.5 / numRows;\r\n float stepY = 1.0 / numRows;\r\n texc.y = stepY * lineCode + centerY;\r\n }\r\n\r\n return texc;\r\n}\r\n`;\r\n\r\nfunction addPixelsPerWorldUniform(prog: ProgramBuilder): void {\r\n const addUniform = (shader: VertexShaderBuilder | FragmentShaderBuilder) => {\r\n shader.addUniform(\"u_pixelsPerWorld\", VariableType.Float, (prg) => {\r\n prg.addProgramUniform(\"u_pixelsPerWorld\", (uniform, params) => {\r\n // Calculate pixels per world unit from viewport\r\n // For orthographic views this is constant and provides stable pattern scaling\r\n const vp = params.target.viewRect;\r\n\r\n // Default to 1.0 if we can't calculate (will use world units directly)\r\n let pixelsPerWorld = 1.0;\r\n\r\n // Get frustum planes: { top, bottom, left, right }\r\n const planes = params.target.uniforms.frustum.planes;\r\n const worldWidth = planes[3] - planes[2]; // right - left\r\n if (worldWidth > 0) {\r\n // worldWidth is the view width in world units\r\n pixelsPerWorld = vp.width / worldWidth;\r\n }\r\n\r\n uniform.setUniform1f(pixelsPerWorld);\r\n });\r\n });\r\n };\r\n\r\n addUniform(prog.vert);\r\n addUniform(prog.frag);\r\n}\r\n\r\nfunction addUseCumulativeDistanceUniform(prog: ProgramBuilder): void {\r\n prog.vert.addUniform(\"u_useCumDist\", VariableType.Float, (prg) => {\r\n prg.addGraphicUniform(\"u_useCumDist\", (uniform, params) => {\r\n uniform.setUniform1f(params.geometry.hasCumulativeDistances ? 1.0 : 0.0);\r\n });\r\n });\r\n}\r\n\r\nfunction addNumLineCodesUniform(prog: ProgramBuilder): void {\r\n prog.vert.addUniform(\"u_numLineCodes\", VariableType.Float, (prg) => {\r\n prg.addProgramUniform(\"u_numLineCodes\", (uniform, _params) => {\r\n // Pass the current LineCode capacity to the shader\r\n uniform.setUniform1f(LineCode.capacity());\r\n });\r\n });\r\n}\r\n\r\n/** @internal */\r\nexport const adjustWidth = `\r\nvoid adjustWidth(inout float width, vec2 d2, vec2 org) {\r\n if (u_aaSamples > 1) {\r\n if (width < 5.0)\r\n width += (5.0 - width) * 0.125;\r\n return;\r\n }\r\n\r\n // calculate slope based width adjustment for non-AA lines, widths 1 to 4\r\n vec2 d2A = abs(d2);\r\n const float s_myFltEpsilon = 0.0001; // limit test resolution to 4 digits in case 24 bit (s16e7) is used in hardware\r\n if (d2A.y > s_myFltEpsilon && width < 4.5) {\r\n float len = length(d2A);\r\n float tan = d2A.x / d2A.y;\r\n\r\n if (width < 1.5) { // width 1\r\n if (tan <= 1.0)\r\n width = d2A.y;\r\n else\r\n width = d2A.x;\r\n // width 1 requires additional adjustment plus trimming in frag shader using v_lnInfo\r\n width *= 1.01;\r\n v_lnInfo.xy = org;\r\n v_lnInfo.w = 1.0; // set flag to do trimming\r\n // set slope in v_lnInfo.z\r\n if (d2A.x - d2A.y > s_myFltEpsilon) {\r\n v_lnInfo.z = d2.y / d2.x;\r\n v_lnInfo.w += 2.0; // add in x-major flag\r\n } else\r\n v_lnInfo.z = d2.x / d2.y;\r\n\r\n } else if (width < 2.5) { // width 2\r\n if (tan <= 0.5)\r\n width = 2.0 * d2A.y;\r\n else\r\n width = (d2A.y + 2.0 * d2A.x);\r\n\r\n } else if (width < 3.5) { // width 3\r\n if (tan <= 1.0)\r\n width = (3.0 * d2A.y + d2A.x);\r\n else\r\n width = (d2A.y + 3.0 * d2A.x);\r\n\r\n } else { // if (width < 4.5) // width 4\r\n if (tan <= 0.5)\r\n width = (4.0 * d2A.y + d2A.x);\r\n else if (tan <= 2.0)\r\n width = (3.0 * d2A.y + 3.0 * d2A.x);\r\n else\r\n width = (d2A.y + 4.0 * d2A.x);\r\n }\r\n width /= len;\r\n }\r\n}\r\n`;\r\n\r\n/** @internal */\r\nexport function addAdjustWidth(vert: VertexShaderBuilder) {\r\n vert.addUniform(\"u_aaSamples\", VariableType.Int, (prog) => {\r\n prog.addGraphicUniform(\"u_aaSamples\", (attr, params) => {\r\n const numSamples = System.instance.frameBufferStack.currentFbMultisampled ? params.target.compositor.antialiasSamples : 1;\r\n attr.setUniform1i(numSamples);\r\n });\r\n });\r\n vert.addFunction(adjustWidth);\r\n}\r\n\r\n/** @internal */\r\nexport function addLineCodeTexture(frag: FragmentShaderBuilder) {\r\n frag.addUniform(\"u_lineCodeTexture\", VariableType.Sampler2D, (prog) => {\r\n prog.addProgramUniform(\"u_lineCodeTexture\", (uniform) => {\r\n const lct = System.instance.lineCodeTexture;\r\n assert(undefined !== lct);\r\n if (undefined !== lct)\r\n lct.bindSampler(uniform, TextureUnit.LineCode);\r\n });\r\n });\r\n}\r\n\r\n/** @internal */\r\nexport function addLineCode(prog: ProgramBuilder, args: string) {\r\n const vert = prog.vert;\r\n const frag = prog.frag;\r\n\r\n addLineCodeUniform(vert);\r\n addPixelsPerWorldUniform(prog);\r\n addUseCumulativeDistanceUniform(prog);\r\n addNumLineCodesUniform(prog); // Add uniform for dynamic capacity\r\n\r\n const funcCall: string = `computeLineCodeTextureCoords(${args})`;\r\n\r\n prog.addFunctionComputedVaryingWithArgs(\"v_texc\", VariableType.Vec2, funcCall, computeTextureCoord);\r\n\r\n addFrustum(prog);\r\n addLineCodeTexture(prog.frag);\r\n\r\n frag.set(FragmentShaderComponent.FinalizeBaseColor, applyLineCode);\r\n frag.set(FragmentShaderComponent.CheckForDiscard, checkForDiscard);\r\n frag.addGlobal(\"discardByLineCode\", VariableType.Boolean, \"false\");\r\n}\r\n\r\nfunction polylineAddLineCode(prog: ProgramBuilder) {\r\n addLineCode(prog, lineCodeArgs);\r\n addModelViewMatrix(prog.vert);\r\n}\r\n\r\nfunction addCommon(prog: ProgramBuilder) {\r\n const vert = prog.vert;\r\n addModelToWindowCoordinates(vert); // adds u_mvp, u_viewportTransformation\r\n addProjectionMatrix(vert);\r\n addModelViewMatrix(vert);\r\n addViewport(vert);\r\n\r\n vert.addGlobal(\"g_windowPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_prevPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_nextPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_windowDir\", VariableType.Vec2);\r\n vert.addInitializer(decodeAdjacentPositions);\r\n\r\n vert.addFunction(unquantize2d);\r\n\r\n addLineWeight(vert);\r\n\r\n vert.addGlobal(\"miterAdjust\", VariableType.Float, \"0.0\");\r\n\r\n prog.addVarying(\"v_patternDistance\", VariableType.Float);\r\n\r\n prog.addVarying(\"v_eyeSpace\", VariableType.Vec3);\r\n vert.set(VertexShaderComponent.ComputePosition, buildComputePosition(vert.positionType));\r\n prog.addVarying(\"v_lnInfo\", VariableType.Vec4);\r\n addAdjustWidth(vert);\r\n\r\n addSamplePosition(vert);\r\n vert.addFunction(decodePosition);\r\n vert.addFunction(decodeFloatFromBytes);\r\n}\r\n\r\nconst decodePosition = `\r\nvec4 decodePosition(vec3 baseIndex) {\r\n float index = decodeUInt24(baseIndex);\r\n return samplePosition(index);\r\n}\r\n`;\r\n\r\nconst decodeAdjacentPositions = `\r\n g_prevPos = decodePosition(a_prevIndex);\r\n g_nextPos = decodePosition(a_nextIndex);\r\n`;\r\n\r\nconst decodeFloatFromBytes = `\r\nfloat decodeFloatFromBytes(vec4 bytes) {\r\n uvec4 b = uvec4(bytes);\r\n uint u = b.x | (b.y << 8) | (b.z << 16) | (b.w << 24);\r\n return uintBitsToFloat(u);\r\n}\r\n`;\r\n\r\nfunction buildComputePosition(positionType: PositionType): string {\r\n const cumDistExpr = positionType === \"unquantized\"\r\n ? \"((u_vertParams.z > 5.0) ? decodeFloatFromBytes(g_vertLutData5) : 0.0)\"\r\n : \"((u_vertParams.z > 3.0) ? decodeFloatFromBytes(g_vertLutData3) : 0.0)\";\r\n\r\n return `\r\n const float kNone = 0.0,\r\n kSquare = 1.0*3.0,\r\n kMiter = 2.0*3.0,\r\n kMiterInsideOnly = 3.0*3.0,\r\n kJointBase = 4.0*3.0,\r\n kNegatePerp = 8.0*3.0,\r\n kNegateAlong = 16.0*3.0,\r\n kNoneAdjWt = 32.0*3.0;\r\n\r\n v_lnInfo = vec4(0.0, 0.0, 0.0, 0.0); // init and set flag to false\r\n\r\n vec4 next = g_nextPos;\r\n vec4 pos;\r\n g_windowPos = modelToWindowCoordinates(rawPos, next, pos, v_eyeSpace);\r\n if (g_windowPos.w == 0.0)\r\n return g_windowPos;\r\n\r\n float param = a_param;\r\n float weight = computeLineWeight();\r\n float scale = 1.0, directionScale = 1.0;\r\n\r\n if (param >= kNoneAdjWt)\r\n param -= kNoneAdjWt;\r\n\r\n bool isSegmentStart = true;\r\n if (param >= kNegateAlong) {\r\n directionScale = -directionScale;\r\n param -= kNegateAlong;\r\n isSegmentStart = false;\r\n }\r\n\r\n if (param >= kNegatePerp) {\r\n scale = -1.0;\r\n param -= kNegatePerp;\r\n }\r\n\r\n vec4 otherPos;\r\n vec3 otherMvPos;\r\n vec4 projNext = modelToWindowCoordinates(next, rawPos, otherPos, otherMvPos);\r\n g_windowDir = projNext.xy - g_windowPos.xy;\r\n\r\n if (u_useCumDist > 0.5)\r\n v_patternDistance = ${cumDistExpr};\r\n else\r\n v_patternDistance = 0.0;\r\n\r\n if (param < kJointBase) {\r\n vec2 dir = (directionScale > 0.0) ? g_windowDir : -g_windowDir;\r\n vec2 pos = (directionScale > 0.0) ? g_windowPos.xy : projNext.xy;\r\n adjustWidth(weight, dir, pos);\r\n }\r\n\r\n if (kNone != param) {\r\n vec2 delta = vec2(0.0);\r\n vec4 prev = g_prevPos;\r\n vec4 projPrev = modelToWindowCoordinates(prev, rawPos, otherPos, otherMvPos);\r\n vec2 prevDir = g_windowPos.xy - projPrev.xy;\r\n float thisLength = sqrt(g_windowDir.x * g_windowDir.x + g_windowDir.y * g_windowDir.y);\r\n const float s_minNormalizeLength = 1.0E-5; // avoid normalizing zero length vectors.\r\n float dist = weight / 2.0;\r\n\r\n if (thisLength > s_minNormalizeLength) {\r\n g_windowDir /= thisLength;\r\n\r\n float prevLength = sqrt(prevDir.x * prevDir.x + prevDir.y * prevDir.y);\r\n\r\n if (prevLength > s_minNormalizeLength) {\r\n prevDir /= prevLength;\r\n const float s_minParallelDot= -.9999, s_maxParallelDot = .9999;\r\n float prevNextDot = dot(prevDir, g_windowDir);\r\n\r\n if (prevNextDot < s_minParallelDot || prevNextDot > s_maxParallelDot) // No miter if parallel or antiparallel.\r\n param = kSquare;\r\n } else\r\n param = kSquare;\r\n } else {\r\n g_windowDir = -normalize(prevDir);\r\n param = kSquare;\r\n }\r\n\r\n vec2 perp = scale * vec2(-g_windowDir.y, g_windowDir.x);\r\n\r\n if (param == kSquare) {\r\n delta = perp;\r\n } else {\r\n vec2 bisector = normalize(prevDir - g_windowDir);\r\n float dotP = dot (bisector, perp);\r\n\r\n if (dotP != 0.0) { // Should never occur - but avoid divide by zero.\r\n const float maxMiter = 3.0;\r\n float miterDistance = 1.0/dotP;\r\n\r\n if (param == kMiter) { // Straight miter.\r\n delta = (abs(miterDistance) > maxMiter) ? perp : bisector * miterDistance;\r\n\r\n } else if (param == kMiterInsideOnly) { // Miter at inside, square at outside (to make room for joint).\r\n delta = (dotP > 0.0 || abs(miterDistance) > maxMiter) ? perp : bisector * miterDistance;\r\n\r\n } else {\r\n const float jointTriangleCount = 3.0;\r\n float ratio = (param - kJointBase) / jointTriangleCount; // 3 triangles per half-joint as defined in Graphics.cpp\r\n delta = normalize((1.0 - ratio) * bisector + (dotP < 0.0 ? -ratio : ratio) * perp); // Miter/Straight combination.\r\n }\r\n }\r\n }\r\n\r\n miterAdjust = dot(g_windowDir, delta) * dist; // Not actually used for hilite shader but meh.\r\n pos.x += dist * delta.x * 2.0 * pos.w / u_viewport.x;\r\n pos.y += dist * delta.y * 2.0 * pos.w / u_viewport.y;\r\n }\r\n\r\n return pos;\r\n`;\r\n}\r\n\r\nconst lineCodeArgs = \"g_windowDir, g_windowPos, miterAdjust, v_patternDistance\";\r\n\r\n/** @internal */\r\nexport function createPolylineBuilder(isInstanced: IsInstanced, positionType: PositionType): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Polyline, instanced);\r\n const builder = new ProgramBuilder(attrMap, { positionType, instanced });\r\n\r\n addShaderFlags(builder);\r\n\r\n addCommon(builder);\r\n\r\n polylineAddLineCode(builder);\r\n\r\n addColor(builder);\r\n addEdgeContrast(builder.vert);\r\n addWhiteOnWhiteReversal(builder.frag);\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createPolylineHiliter(isInstanced: IsInstanced, positionType: PositionType): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Polyline, instanced);\r\n const builder = new ProgramBuilder(attrMap, { positionType, instanced });\r\n\r\n addCommon(builder);\r\n addUseCumulativeDistanceUniform(builder);\r\n addFrustum(builder);\r\n addHiliter(builder, true);\r\n return builder;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImdlGraphicsCreator.d.ts","sourceRoot":"","sources":["../../../../src/internal/tile/ImdlGraphicsCreator.ts"],"names":[],"mappings":"AAIA;;GAEG;AASH,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAEnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC;AAI1F,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D;GACG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"ImdlGraphicsCreator.d.ts","sourceRoot":"","sources":["../../../../src/internal/tile/ImdlGraphicsCreator.ts"],"names":[],"mappings":"AAIA;;GAEG;AASH,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAEnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC;AAI1F,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D;GACG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAoXD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAuBvG;AAsDD,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,YAAY,GAAG,eAAe,CA+CzJ;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,YAAY,GAAG,aAAa,GAAG,SAAS,CAG3J"}
|
|
@@ -205,6 +205,7 @@ function createPrimitiveGeometry(primitive, options, viOrigin) {
|
|
|
205
205
|
indices: new VertexIndices(primitive.params.polyline.indices),
|
|
206
206
|
prevIndices: new VertexIndices(primitive.params.polyline.prevIndices),
|
|
207
207
|
},
|
|
208
|
+
hasCumulativeDistances: primitive.params.hasCumulativeDistances,
|
|
208
209
|
}, viOrigin);
|
|
209
210
|
case "mesh": {
|
|
210
211
|
const surf = primitive.params.surface;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImdlGraphicsCreator.js","sourceRoot":"","sources":["../../../../src/internal/tile/ImdlGraphicsCreator.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EACL,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAkB,oBAAoB,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,GAC1H,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAGnF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAC/H,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGpF,OAAO,EAA0B,oBAAoB,EAAE,MAAM,4DAA4D,CAAC;AAE1H,OAAO,EAA6B,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAErF,OAAO,EAAE,qBAAqB,EAA+C,MAAM,2CAA2C,CAAC;AAc/H,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAA0B,EAAE,OAA0B;IAClG,4GAA4G;IAC5G,mCAAmC;IACnC,gDAAgD;IAChD,oEAAoE;IACpE,0GAA0G;IAC1G,6GAA6G;IAC7G,oBAAoB;IAEpB,IAAI,CAAC;QACH,IAAI,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC3E,IAAI,OAAO;YACT,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;aACpC,IAAI,aAAa;YACpB,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;QAE/C,qHAAqH;QACrH,4BAA4B;QAC5B,MAAM,SAAS,GAAG,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC;QAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAEhF,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC7D,MAAM,cAAc,GAAG,CAAC,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/G,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC,CAAC,wFAAwF;YAC1H,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,UAAU;gBAClB,OAAO,SAAS,CAAC;YAEnB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;YAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QACrI,CAAC;QAED,4FAA4F;QAC5F,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAClF,OAAO,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAA0B;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;IAC1D,IAAI,CAAC,aAAa;QAChB,OAAO,MAAM,CAAC;IAEhB,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAiB,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;gBACtE,IAAI,EAAE;oBACJ,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QACrB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE9B,OAAO,MAAM,CAAC;AAChB,CAAC;AAYD,SAAS,6BAA6B,CAAC,SAAgH;IACrJ,IAAI,SAAS,KAAK,SAAS;QACzB,OAAO,SAAS,CAAC;IAEnB,MAAM,eAAe,GAAyC;QAC5D,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC;QAC3D,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;QACpJ,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC;QAC7D,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;KACnF,CAAC;IACF,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAoC,EAAE,OAAwB;IAC5F,IAAI,CAAC,IAAI;QACP,OAAO,SAAS,CAAC;IAEnB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,OAAO;QACV,OAAO,SAAS,CAAC;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC;IAEhC,MAAM,UAAU,GAA8B;QAC5C,aAAa,EAAE,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtG,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;QACzD,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QACzC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC;QACvD,cAAc,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC;QAC3D,gBAAgB,EAAE,6BAA6B,CAAC,UAAU,CAAC,iBAAiB,CAAC;KAC9E,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAE1F,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC;IAC3C,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,SAAS,CAAC;QACd,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACpE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YAClG,cAAc,CAAC,eAAe,GAAG;gBAC/B,SAAS;gBACT,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;gBAChD,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjD,cAAc,EAAE,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC;aAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,WAAW,CAAC,GAAwC,EAAE,OAAwB;IACrF,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe;QACrD,OAAO,QAAQ,CAAC;IAElB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI;QACP,OAAO,SAAS,CAAC;IAEnB,SAAS,gBAAgB,CAAC,GAA6B;QACrD,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,CAAC,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAC5B,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,CAAC,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5D,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAC7B,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEtD,MAAM,CAAC,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAC5B,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;QACrC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;IAElD,IAAI,SAAS,KAAK,IAAI,CAAC,YAAY;QACjC,MAAM,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;IAEzC,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAElD,IAAI,SAAS,KAAK,IAAI,CAAC,cAAc;QACnC,MAAM,CAAC,cAAc,GAAG,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEvF,OAAO,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC;QACzC,OAAO,EAAE,EAAC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAC;QAC7D,QAAQ,EAAE,EAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,gBAAgB,EAAC;QACnG,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;YACtC,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,OAAO;YACtC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,aAAa;YACrD,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI;YACvC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM;YAC3C,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY;YACvD,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc;YAC3D,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,iBAAiB;YAChE,eAAe,EAAE,MAAM,CAAC,cAAc,CAAC,eAAe;SACvD,CAAC,CAAC,CAAC,SAAS;KACb,CAAC,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,SAAyB;IAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;IAC/B,QAAQ,GAAG,EAAE,IAAI,EAAE,CAAC;QAClB,KAAK,WAAW;YACd,OAAO,EAAE,SAAS,EAAE,sBAAsB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9D,KAAK,uBAAuB;YAC1B,OAAO;gBACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;aACvC,CAAC;QACJ;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,SAAyB,EAAE,OAAwB,EAAE,QAA6B;IACjH,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,MAAM,CAAC,yBAAyB,CAAC;gBAC9C,GAAG,SAAS,CAAC,MAAM;gBACnB,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAClD,OAAO,EAAE,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;aACrD,EAAE,QAAQ,CAAC,CAAC;QACf,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,MAAM,CAAC,sBAAsB,CAAC;gBAC3C,GAAG,SAAS,CAAC,MAAM;gBACnB,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAClD,QAAQ,EAAE;oBACR,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ;oBAC5B,OAAO,EAAE,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAC7D,WAAW,EAAE,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;iBACtE;aACF,EAAE,QAAQ,CAAC,CAAC;QACf,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;YACtC,IAAI,QAAQ,CAAC;YACb,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO;oBACxB,QAAQ,GAAG,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;;oBAE/E,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC7B,CAAC;YAED,IAAI,cAAc,CAAC;YACnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,OAAO,CAAC;gBACZ,IAAI,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACpD,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBAC9D,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;oBACrE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBACxE,CAAC;gBAED,IAAI,OAAO;oBACT,cAAc,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;YACvF,CAAC;YAED,OAAO,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;gBACvC,GAAG,SAAS,CAAC,MAAM;gBACnB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;gBACtF,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAClD,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC9G,OAAO,EAAE;oBACP,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO;oBAC3B,QAAQ;oBACR,cAAc;oBACd,OAAO,EAAE,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;iBAC7D;gBACD,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,EAAE,QAAQ,CAAC,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAyB,EAAE,OAAwB;IACjF,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7F,CAAC;AAED,SAAS,uBAAuB,CAAC,UAA4B,EAAE,OAAwB;IACrF,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACxE,IAAI,QAAQ;YACV,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAA8B,EAAE,OAAwB;IACpF,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QACxC,OAAO,SAAS,CAAC;IAEnB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,IAAI,CAAC,UAAU;QACb,OAAO,SAAS,CAAC;IAEnB,MAAM,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxH,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAC/C,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC;QACrD,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;QACzC,cAAc,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;QACzD,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QACrC,iBAAiB,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAC7D,qBAAqB;KACtB,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO;QACV,OAAO,SAAS,CAAC;IAEnB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtE,IAAI,OAAO;YACT,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAC7H,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAe,EAAE,OAAwB;IACnE,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO;QAC5B,OAAO,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,GAAG,4BAA4B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QACvB,OAAO,QAAQ,CAAC;IAElB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IACjC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,4BAA4B,CAAC,IAAyB,EAAE,OAAwB;IACvF,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5I,IAAI,OAAO;YACT,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,MAAM;QAClB,OAAO,QAAQ,CAAC;IAElB,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACtG,QAAQ,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,CAAC;SAAM,IAAI,SAAS,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACtC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QACjC,QAAQ,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA0B;IACjE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE;QAC5C,OAAO,SAAS,CAAC;IAEnB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IACrD,MAAM,eAAe,GAAG,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAC3D,eAAe,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAE5C,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ;QACxD,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,uBAAuB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QACxB,KAAK,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC;QACzB,KAAK,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,KAA6B,EAAE,OAAkC;IAChG,IAAI,KAAK,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;QACnC,oBAAoB;QACpB,OAAO;IACT,CAAC;SAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;IACxG,CAAC;IAED,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC;IAE7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACnF,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;IACrC,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,EAAE;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5B,IAAI,EAAE,IAAI,UAAU,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;YACtB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YAExB,2GAA2G;YAC3G,MAAM,aAAa,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,GAAG,UAAU,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,UAAU,GAAG,GAAG,CAAC;QACtC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,KAAK,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAC7I,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,CAAC;IAED,IAAI,SAAS,KAAK,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;QACtD,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,KAAyB,EAAE,OAAkC,EAAE,MAAoB;IACtI,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAExC,MAAM,eAAe,GAAoB;QACvC,MAAM;QACN,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC;QAC5B,QAAQ,EAAE,IAAI,GAAG,EAAE;KACpB,CAAC;IAEF,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAErC,2FAA2F;QAC3F,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,SAAS,CAAC,CAAC;QAEtC,MAAM,IAAI,GAAG,uBAAuB,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChF,IAAI,IAAI,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,KAAuC,CAAC;IAC5C,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxF,KAAK,GAAG;YACN,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE;YAC3B,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YAC1C,YAAY;SACb,CAAC;IACJ,CAAC;IAED,IAAI,MAAyC,CAAC;IAC9C,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;IAC3F,CAAC;IAED,OAAO,qBAAqB,CAAC;QAC3B,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;QACrB,KAAK;QACL,MAAM;QACN,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAyB,EAAE,OAAkC,EAAE,MAAoB;IAC9H,MAAM,QAAQ,GAAG,oCAAoC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC,yBAAyB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AACxD,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { assert, Id64, JsonUtils } from \"@itwin/core-bentley\";\r\nimport { ClipVector, Point2d, Point3d, Range3d, Transform } from \"@itwin/core-geometry\";\r\nimport {\r\n ColorDef, Gradient, ImageSource, RenderMaterial, RenderMaterialParams, RenderTexture, RenderTextureParams, TextureMapping,\r\n} from \"@itwin/core-common\";\r\nimport { AuxChannelTable } from \"../../common/internal/render/AuxChannelTable\";\r\nimport { createSurfaceMaterial } from \"../../common/internal/render/SurfaceParams\";\r\nimport { ImdlModel as Imdl } from \"../../common/imdl/ImdlModel\";\r\nimport { ImdlColorDef, ImdlNamedTexture, ImdlTextureMapping } from \"../../common/imdl/ImdlSchema\";\r\nimport { convertFeatureTable, edgeParamsFromImdl, toMaterialParams, toVertexTable } from \"../../common/imdl/ParseImdlDocument\";\r\nimport { VertexIndices } from \"../../common/internal/render/VertexIndices\";\r\nimport type { RenderGraphic } from \"../../render/RenderGraphic\";\r\nimport { GraphicBranch } from \"../../render/GraphicBranch\";\r\nimport type { RenderSystem } from \"../../render/RenderSystem\";\r\nimport { InstancedGraphicParams } from \"../../common/render/InstancedGraphicParams\";\r\nimport type { IModelConnection } from \"../../IModelConnection\";\r\nimport { GraphicDescription } from \"../../common/render/GraphicDescriptionBuilder\";\r\nimport { GraphicDescriptionImpl, isGraphicDescription } from \"../../common/internal/render/GraphicDescriptionBuilderImpl\";\r\nimport { GraphicDescriptionContext } from \"../../common/render/GraphicDescriptionContext\";\r\nimport { _implementationProhibited, _textures } from \"../../common/internal/Symbols\";\r\nimport { RenderGeometry } from \"../../internal/render/RenderGeometry\";\r\nimport { createGraphicTemplate, GraphicTemplateBatch, GraphicTemplateBranch } from \"../../internal/render/GraphicTemplateImpl\";\r\nimport { GraphicTemplate } from \"../../render/GraphicTemplate\";\r\nimport { LayerTileData } from \"../render/webgl/MapLayerParams\";\r\n\r\n/** Options provided to [[decodeImdlContent]].\r\n */\r\nexport interface ImdlDecodeOptions {\r\n document: Imdl.Document;\r\n system: RenderSystem;\r\n iModel: IModelConnection;\r\n isCanceled?: () => boolean;\r\n tileData?: LayerTileData;\r\n}\r\n\r\nasync function loadNamedTexture(name: string, namedTex: ImdlNamedTexture, options: ImdlDecodeOptions): Promise<RenderTexture | undefined> {\r\n // Reasons a texture could be embedded in the tile content instead of requested separately from the backend:\r\n // - external textures are disabled\r\n // - the texture name is not a valid Id64 string\r\n // - the texture is below a certain backend-hardcoded size threshold\r\n // The bufferViewJson being defined signifies any of the above conditions. In that case, the image content\r\n // has been embedded in the tile contents. Otherwise, we will attempt to request the image content separately\r\n // from the backend.\r\n\r\n try {\r\n let textureType = RenderTexture.Type.Normal;\r\n const isGlyph = JsonUtils.asBool(namedTex.isGlyph);\r\n const isTileSection = !isGlyph && JsonUtils.asBool(namedTex.isTileSection);\r\n if (isGlyph)\r\n textureType = RenderTexture.Type.Glyph;\r\n else if (isTileSection)\r\n textureType = RenderTexture.Type.TileSection;\r\n\r\n // We produce unique tile sections for very large (> 8 megapixel) textures, and unique glyph atlases for raster text.\r\n // Neither should be cached.\r\n const cacheable = !isGlyph && !isTileSection;\r\n const ownership = cacheable ? { iModel: options.iModel, key: name } : undefined;\r\n\r\n const bufferViewId = JsonUtils.asString(namedTex.bufferView);\r\n const bufferViewJson = 0 !== bufferViewId.length ? options.document.json.bufferViews[bufferViewId] : undefined;\r\n\r\n if (undefined !== bufferViewJson) { // presence of bufferViewJson signifies we should read the texture from the tile content\r\n const byteOffset = JsonUtils.asInt(bufferViewJson.byteOffset);\r\n const byteLength = JsonUtils.asInt(bufferViewJson.byteLength);\r\n if (0 === byteLength)\r\n return undefined;\r\n\r\n const texBytes = options.document.binaryData.subarray(byteOffset, byteOffset + byteLength);\r\n const format = namedTex.format;\r\n const source = new ImageSource(texBytes, format);\r\n return await options.system.createTextureFromSource({ source, ownership, type: textureType, transparency: namedTex.transparency });\r\n }\r\n\r\n // bufferViewJson was undefined, so attempt to request the texture directly from the backend\r\n const params = new RenderTextureParams(cacheable ? name : undefined, textureType);\r\n return options.system.createTextureFromElement(name, options.iModel, params, namedTex.format);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nasync function loadNamedTextures(options: ImdlDecodeOptions): Promise<Map<string, RenderTexture>> {\r\n const result = new Map<string, RenderTexture>();\r\n const namedTextures = options.document.json.namedTextures;\r\n if (!namedTextures)\r\n return result;\r\n\r\n const promises = new Array<Promise<void>>();\r\n for (const [name, namedTexture] of Object.entries(namedTextures)) {\r\n const texture = options.system.findTexture(name, options.iModel);\r\n if (texture) {\r\n result.set(name, texture);\r\n continue;\r\n } else if (namedTexture) {\r\n promises.push(loadNamedTexture(name, namedTexture, options).then((tx) => {\r\n if (tx)\r\n result.set(name, tx);\r\n }));\r\n }\r\n }\r\n\r\n if (promises.length > 0)\r\n await Promise.all(promises);\r\n\r\n return result;\r\n}\r\n\r\ninterface GraphicsOptions {\r\n document?: Imdl.Document;\r\n iModel?: IModelConnection;\r\n system: RenderSystem;\r\n isCanceled?: () => boolean;\r\n textures: Map<string, RenderTexture>;\r\n patterns: Map<string, RenderGeometry[]>;\r\n tileData?: LayerTileData;\r\n}\r\n\r\nfunction constantLodParamPropsFromJson(propsJson: { repetitions?: number, offset?: number[], minDistClamp?: number, maxDistClamp?: number } | undefined): TextureMapping.ConstantLodParamProps | undefined {\r\n if (undefined === propsJson)\r\n return undefined;\r\n\r\n const constantLodPops: TextureMapping.ConstantLodParamProps = {\r\n repetitions: JsonUtils.asDouble(propsJson.repetitions, 1.0),\r\n offset: { x: propsJson.offset ? JsonUtils.asDouble(propsJson.offset[0]) : 0.0, y: propsJson.offset ? JsonUtils.asDouble(propsJson.offset[1]) : 0.0 },\r\n minDistClamp: JsonUtils.asDouble(propsJson.minDistClamp, 1.0),\r\n maxDistClamp: JsonUtils.asDouble(propsJson.maxDistClamp, 4096.0 * 1024.0 * 1024.0),\r\n };\r\n return constantLodPops;\r\n}\r\n\r\nfunction textureMappingFromJson(json: ImdlTextureMapping | undefined, options: GraphicsOptions): TextureMapping | undefined {\r\n if (!json)\r\n return undefined;\r\n\r\n const texture = options.textures.get(JsonUtils.asString(json.name));\r\n if (!texture)\r\n return undefined;\r\n\r\n const paramsJson = json.params;\r\n const tf = paramsJson.transform;\r\n\r\n const paramProps: TextureMapping.ParamProps = {\r\n textureMat2x3: new TextureMapping.Trans2x3(tf[0][0], tf[0][1], tf[0][2], tf[1][0], tf[1][1], tf[1][2]),\r\n textureWeight: JsonUtils.asDouble(paramsJson.weight, 1.0),\r\n mapMode: JsonUtils.asInt(paramsJson.mode),\r\n worldMapping: JsonUtils.asBool(paramsJson.worldMapping),\r\n useConstantLod: JsonUtils.asBool(paramsJson.useConstantLod),\r\n constantLodProps: constantLodParamPropsFromJson(paramsJson.constantLodParams),\r\n };\r\n\r\n const textureMapping = new TextureMapping(texture, new TextureMapping.Params(paramProps));\r\n\r\n const normalMapJson = json.normalMapParams;\r\n if (normalMapJson) {\r\n let normalMap;\r\n const normalTexName = JsonUtils.asString(normalMapJson.textureName);\r\n if (normalTexName.length === 0 || undefined !== (normalMap = options.textures.get(normalTexName))) {\r\n textureMapping.normalMapParams = {\r\n normalMap,\r\n greenUp: JsonUtils.asBool(normalMapJson.greenUp),\r\n scale: JsonUtils.asDouble(normalMapJson.scale, 1),\r\n useConstantLod: JsonUtils.asBool(normalMapJson.useConstantLod),\r\n };\r\n }\r\n }\r\n\r\n return textureMapping;\r\n}\r\n\r\nfunction getMaterial(mat: string | Imdl.SurfaceMaterialParams, options: GraphicsOptions): RenderMaterial | undefined {\r\n if (typeof mat !== \"string\") {\r\n const args = toMaterialParams(mat);\r\n return options.system.createRenderMaterial(args);\r\n }\r\n\r\n if (!options.iModel) {\r\n return undefined;\r\n }\r\n\r\n const material = options.system.findMaterial(mat, options.iModel);\r\n if (material || !options.document?.json.renderMaterials)\r\n return material;\r\n\r\n const json = options.document.json.renderMaterials[mat];\r\n if (!json)\r\n return undefined;\r\n\r\n function colorDefFromJson(col: ImdlColorDef | undefined): ColorDef | undefined {\r\n return col ? ColorDef.from(col[0] * 255 + 0.5, col[1] * 255 + 0.5, col[2] * 255 + 0.5) : undefined;\r\n }\r\n\r\n const params = new RenderMaterialParams(mat);\r\n params.diffuseColor = colorDefFromJson(json.diffuseColor);\r\n if (json.diffuse !== undefined)\r\n params.diffuse = JsonUtils.asDouble(json.diffuse);\r\n\r\n params.specularColor = colorDefFromJson(json.specularColor);\r\n if (json.specular !== undefined)\r\n params.specular = JsonUtils.asDouble(json.specular);\r\n\r\n params.reflectColor = colorDefFromJson(json.reflectColor);\r\n if (json.reflect !== undefined)\r\n params.reflect = JsonUtils.asDouble(json.reflect);\r\n\r\n if (json.specularExponent !== undefined)\r\n params.specularExponent = json.specularExponent;\r\n\r\n if (undefined !== json.transparency)\r\n params.alpha = 1.0 - json.transparency;\r\n\r\n params.refract = JsonUtils.asDouble(json.refract);\r\n params.shadows = JsonUtils.asBool(json.shadows);\r\n params.ambient = JsonUtils.asDouble(json.ambient);\r\n\r\n if (undefined !== json.textureMapping)\r\n params.textureMapping = textureMappingFromJson(json.textureMapping.texture, options);\r\n\r\n return options.system.createRenderMaterial({\r\n diffuse: {color: params.diffuseColor, weight: params.diffuse},\r\n specular: {color: params.specularColor, weight: params.specular, exponent: params.specularExponent},\r\n alpha: params.alpha,\r\n textureMapping: params.textureMapping ? {\r\n texture: params.textureMapping.texture,\r\n transform: params.textureMapping.params.textureMatrix,\r\n mode: params.textureMapping.params.mode,\r\n weight: params.textureMapping.params.weight,\r\n worldMapping: params.textureMapping.params.worldMapping,\r\n useConstantLod: params.textureMapping.params.useConstantLod,\r\n constantLodProps: params.textureMapping.params.constantLodParams,\r\n normalMapParams: params.textureMapping.normalMapParams,\r\n } : undefined,\r\n });\r\n}\r\n\r\nfunction getModifiers(primitive: Imdl.Primitive): { viOrigin?: Point3d, instances?: InstancedGraphicParams } {\r\n const mod = primitive.modifier;\r\n switch (mod?.type) {\r\n case \"instances\":\r\n return { instances: InstancedGraphicParams.fromProps(mod) };\r\n case \"viewIndependentOrigin\":\r\n return {\r\n viOrigin: Point3d.fromJSON(mod.origin),\r\n };\r\n default:\r\n return {};\r\n }\r\n}\r\n\r\nfunction createPrimitiveGeometry(primitive: Imdl.Primitive, options: GraphicsOptions, viOrigin: Point3d | undefined): RenderGeometry | undefined {\r\n switch (primitive.type) {\r\n case \"point\":\r\n return options.system.createPointStringGeometry({\r\n ...primitive.params,\r\n vertices: toVertexTable(primitive.params.vertices),\r\n indices: new VertexIndices(primitive.params.indices),\r\n }, viOrigin);\r\n case \"polyline\":\r\n return options.system.createPolylineGeometry({\r\n ...primitive.params,\r\n vertices: toVertexTable(primitive.params.vertices),\r\n polyline: {\r\n ...primitive.params.polyline,\r\n indices: new VertexIndices(primitive.params.polyline.indices),\r\n prevIndices: new VertexIndices(primitive.params.polyline.prevIndices),\r\n },\r\n }, viOrigin);\r\n case \"mesh\": {\r\n const surf = primitive.params.surface;\r\n let material;\r\n if (surf.material) {\r\n if (!surf.material.isAtlas)\r\n material = createSurfaceMaterial(getMaterial(surf.material.material, options));\r\n else\r\n material = surf.material;\r\n }\r\n\r\n let textureMapping;\r\n if (surf.textureMapping) {\r\n let texture;\r\n if (typeof surf.textureMapping.texture === \"string\") {\r\n texture = options.textures.get(surf.textureMapping.texture);\r\n } else {\r\n const gradient = Gradient.Symb.fromJSON(surf.textureMapping.texture);\r\n texture = options.system.getGradientTexture(gradient, options.iModel);\r\n }\r\n\r\n if (texture)\r\n textureMapping = { texture, alwaysDisplayed: surf.textureMapping.alwaysDisplayed };\r\n }\r\n\r\n return options.system.createMeshGeometry({\r\n ...primitive.params,\r\n edges: primitive.params.edges ? edgeParamsFromImdl(primitive.params.edges) : undefined,\r\n vertices: toVertexTable(primitive.params.vertices),\r\n auxChannels: primitive.params.auxChannels ? AuxChannelTable.fromJSON(primitive.params.auxChannels) : undefined,\r\n surface: {\r\n ...primitive.params.surface,\r\n material,\r\n textureMapping,\r\n indices: new VertexIndices(primitive.params.surface.indices),\r\n },\r\n tileData: options.tileData,\r\n }, viOrigin);\r\n }\r\n }\r\n}\r\n\r\nfunction createPrimitiveGraphic(primitive: Imdl.Primitive, options: GraphicsOptions): RenderGraphic | undefined {\r\n const mods = getModifiers(primitive);\r\n const geometry = createPrimitiveGeometry(primitive, options, mods.viOrigin);\r\n return geometry ? options.system.createRenderGraphic(geometry, mods.instances) : undefined;\r\n}\r\n\r\nfunction createPatternGeometries(primitives: Imdl.Primitive[], options: GraphicsOptions): RenderGeometry[] {\r\n const geometries = [];\r\n for (const primitive of primitives) {\r\n const geometry = createPrimitiveGeometry(primitive, options, undefined);\r\n if (geometry)\r\n geometries.push(geometry);\r\n }\r\n\r\n return geometries;\r\n}\r\n\r\nfunction createPatternGraphic(params: Imdl.AreaPatternParams, options: GraphicsOptions): RenderGraphic | undefined {\r\n const geometries = options.patterns.get(params.symbolName);\r\n if (!geometries || geometries.length === 0)\r\n return undefined;\r\n\r\n const clip = ClipVector.fromJSON(params.clip);\r\n const clipVolume = clip?.isValid ? options.system.createClipVolume(clip) : undefined;\r\n if (!clipVolume)\r\n return undefined;\r\n\r\n const viewIndependentOrigin = params.viewIndependentOrigin ? Point3d.fromJSON(params.viewIndependentOrigin) : undefined;\r\n const pattern = options.system.createAreaPattern({\r\n xyOffsets: params.xyOffsets,\r\n featureId: params.featureId,\r\n orgTransform: Transform.fromJSON(params.orgTransform),\r\n origin: Point2d.fromJSON(params.origin),\r\n scale: params.scale,\r\n spacing: Point2d.fromJSON(params.spacing),\r\n patternToModel: Transform.fromJSON(params.modelTransform),\r\n range: Range3d.fromJSON(params.range),\r\n symbolTranslation: Point3d.fromJSON(params.symbolTranslation),\r\n viewIndependentOrigin,\r\n });\r\n\r\n if (!pattern)\r\n return undefined;\r\n\r\n const branch = new GraphicBranch(true);\r\n for (const geometry of geometries) {\r\n const graphic = options.system.createRenderGraphic(geometry, pattern);\r\n if (graphic)\r\n branch.add(graphic);\r\n }\r\n\r\n return branch.isEmpty ? undefined : options.system.createGraphicBranch(branch, Transform.createIdentity(), { clipVolume });\r\n}\r\n\r\nfunction createNodeGraphics(node: Imdl.Node, options: GraphicsOptions): RenderGraphic[] {\r\n if (undefined === node.groupId)\r\n return createPrimitivesNodeGraphics(node, options);\r\n\r\n const graphics: RenderGraphic[] = [];\r\n for (const child of node.nodes) {\r\n graphics.push(...createPrimitivesNodeGraphics(child, options));\r\n }\r\n\r\n if (graphics.length === 0)\r\n return graphics;\r\n\r\n const branch = new GraphicBranch(true);\r\n branch.groupNodeId = node.groupId;\r\n branch.entries.push(...graphics);\r\n return [options.system.createBranch(branch, Transform.createIdentity())];\r\n}\r\n\r\nfunction createPrimitivesNodeGraphics(node: Imdl.PrimitivesNode, options: GraphicsOptions): RenderGraphic[] {\r\n let graphics = [];\r\n for (const primitive of node.primitives) {\r\n const graphic = primitive.type === \"pattern\" ? createPatternGraphic(primitive.params, options) : createPrimitiveGraphic(primitive, options);\r\n if (graphic)\r\n graphics.push(graphic);\r\n }\r\n\r\n if (!graphics.length)\r\n return graphics;\r\n\r\n if (undefined !== node.layerId) {\r\n const layerGraphic = 1 === graphics.length ? graphics[0] : options.system.createGraphicList(graphics);\r\n graphics = [options.system.createGraphicLayer(layerGraphic, node.layerId)];\r\n } else if (undefined !== node.animationNodeId) {\r\n const branch = new GraphicBranch(true);\r\n branch.animationId = node.animationId;\r\n branch.animationNodeId = node.animationNodeId;\r\n branch.entries.push(...graphics);\r\n graphics = [options.system.createBranch(branch, Transform.createIdentity())];\r\n }\r\n\r\n return graphics;\r\n}\r\n\r\nexport async function decodeImdlGraphics(options: ImdlDecodeOptions): Promise<RenderGraphic | undefined> {\r\n const textures = await loadNamedTextures(options);\r\n if (options.isCanceled && options.isCanceled())\r\n return undefined;\r\n\r\n const patterns = new Map<string, RenderGeometry[]>();\r\n const graphicsOptions = { ...options, textures, patterns };\r\n graphicsOptions.tileData = options.tileData;\r\n\r\n for (const [name, primitives] of options.document.patterns)\r\n patterns.set(name, createPatternGeometries(primitives, graphicsOptions));\r\n\r\n const system = options.system;\r\n const graphics: RenderGraphic[] = [];\r\n for (const node of options.document.nodes) {\r\n graphics.push(...createNodeGraphics(node, graphicsOptions));\r\n }\r\n\r\n switch (graphics.length) {\r\n case 0: return undefined;\r\n case 1: return graphics[0];\r\n default: return system.createGraphicList(graphics);\r\n }\r\n}\r\n\r\nfunction remapGraphicDescription(descr: GraphicDescriptionImpl, context: GraphicDescriptionContext): void {\r\n if (descr.remapContext === context) {\r\n // Already remapped.\r\n return;\r\n } else if (descr.remapContext) {\r\n throw new Error(\"You cannot create a graphic from a GraphicDescription using two different contexts\");\r\n }\r\n\r\n descr.remapContext = context;\r\n\r\n const batch = descr.batch;\r\n if (!batch) {\r\n return;\r\n }\r\n\r\n if (Id64.isTransient(batch.modelId)) {\r\n const modelLocalId = context.remapTransientLocalId(Id64.getLocalId(batch.modelId));\r\n batch.modelId = Id64.fromLocalAndBriefcaseIds(modelLocalId, 0xffffff);\r\n }\r\n\r\n const data = batch.featureTable.data;\r\n const remapId = (offset: number) => {\r\n const hi = data[offset + 1];\r\n if (hi >= 0xffffff00) {\r\n const hi8 = hi & 0xff;\r\n const lo = data[offset];\r\n\r\n // Avoid bitwise operators because they truncate at 32 bits (we need 40) and are stupid about the sign bit.\r\n const sourceLocalId = lo + (hi8 * 0xffffffff);\r\n const localId = context.remapTransientLocalId(sourceLocalId);\r\n data[offset] = localId & 0xffffffff;\r\n data[offset + 1] = 0xffffff00 + hi8;\r\n }\r\n };\r\n\r\n const subCatsOffset = 3 * batch.featureTable.numFeatures;\r\n for (let i = 0; i < subCatsOffset; i += 3) {\r\n remapId(i);\r\n }\r\n\r\n const subCatsEnd = undefined !== batch.featureTable.numSubCategories ? subCatsOffset + 2 * batch.featureTable.numSubCategories : data.length;\r\n for (let i = subCatsOffset; i < subCatsEnd; i++) {\r\n remapId(i);\r\n }\r\n\r\n if (undefined !== batch.featureTable.numSubCategories) {\r\n for (let i = subCatsEnd; i < data.length; i++) {\r\n remapId(i + 1);\r\n }\r\n }\r\n}\r\n\r\nexport function createGraphicTemplateFromDescription(descr: GraphicDescription, context: GraphicDescriptionContext, system: RenderSystem): GraphicTemplate {\r\n if (!isGraphicDescription(descr)) {\r\n throw new Error(\"Invalid GraphicDescription\");\r\n }\r\n\r\n remapGraphicDescription(descr, context);\r\n\r\n const graphicsOptions: GraphicsOptions = {\r\n system,\r\n textures: context[_textures],\r\n patterns: new Map(),\r\n };\r\n\r\n const geometry: RenderGeometry[] = [];\r\n for (const primitive of descr.primitives) {\r\n const mods = getModifiers(primitive);\r\n\r\n // GraphicDescriptionBuilder providers no way to include instances in a GraphicDescription.\r\n assert(undefined === mods?.instances);\r\n\r\n const geom = createPrimitiveGeometry(primitive, graphicsOptions, mods.viOrigin);\r\n if (geom) {\r\n geometry.push(geom);\r\n }\r\n }\r\n\r\n let batch: GraphicTemplateBatch | undefined;\r\n if (descr.batch) {\r\n const featureTable = convertFeatureTable(descr.batch.featureTable, descr.batch.modelId);\r\n batch = {\r\n options: { ...descr.batch },\r\n range: Range3d.fromJSON(descr.batch.range),\r\n featureTable,\r\n };\r\n }\r\n\r\n let branch: GraphicTemplateBranch | undefined;\r\n if (descr.translation) {\r\n branch = { transform: Transform.createTranslation(Point3d.fromJSON(descr.translation)) };\r\n }\r\n\r\n return createGraphicTemplate({\r\n nodes: [{ geometry }],\r\n batch,\r\n branch,\r\n noDispose: true,\r\n });\r\n}\r\n\r\nexport function createGraphicFromDescription(descr: GraphicDescription, context: GraphicDescriptionContext, system: RenderSystem): RenderGraphic | undefined {\r\n const template = createGraphicTemplateFromDescription(descr, context, system);\r\n return system.createGraphicFromTemplate({ template });\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"ImdlGraphicsCreator.js","sourceRoot":"","sources":["../../../../src/internal/tile/ImdlGraphicsCreator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { assert, Id64, JsonUtils } from \"@itwin/core-bentley\";\r\nimport { ClipVector, Point2d, Point3d, Range3d, Transform } from \"@itwin/core-geometry\";\r\nimport {\r\n ColorDef, Gradient, ImageSource, RenderMaterial, RenderMaterialParams, RenderTexture, RenderTextureParams, TextureMapping,\r\n} from \"@itwin/core-common\";\r\nimport { AuxChannelTable } from \"../../common/internal/render/AuxChannelTable\";\r\nimport { createSurfaceMaterial } from \"../../common/internal/render/SurfaceParams\";\r\nimport { ImdlModel as Imdl } from \"../../common/imdl/ImdlModel\";\r\nimport { ImdlColorDef, ImdlNamedTexture, ImdlTextureMapping } from \"../../common/imdl/ImdlSchema\";\r\nimport { convertFeatureTable, edgeParamsFromImdl, toMaterialParams, toVertexTable } from \"../../common/imdl/ParseImdlDocument\";\r\nimport { VertexIndices } from \"../../common/internal/render/VertexIndices\";\r\nimport type { RenderGraphic } from \"../../render/RenderGraphic\";\r\nimport { GraphicBranch } from \"../../render/GraphicBranch\";\r\nimport type { RenderSystem } from \"../../render/RenderSystem\";\r\nimport { InstancedGraphicParams } from \"../../common/render/InstancedGraphicParams\";\r\nimport type { IModelConnection } from \"../../IModelConnection\";\r\nimport { GraphicDescription } from \"../../common/render/GraphicDescriptionBuilder\";\r\nimport { GraphicDescriptionImpl, isGraphicDescription } from \"../../common/internal/render/GraphicDescriptionBuilderImpl\";\r\nimport { GraphicDescriptionContext } from \"../../common/render/GraphicDescriptionContext\";\r\nimport { _implementationProhibited, _textures } from \"../../common/internal/Symbols\";\r\nimport { RenderGeometry } from \"../../internal/render/RenderGeometry\";\r\nimport { createGraphicTemplate, GraphicTemplateBatch, GraphicTemplateBranch } from \"../../internal/render/GraphicTemplateImpl\";\r\nimport { GraphicTemplate } from \"../../render/GraphicTemplate\";\r\nimport { LayerTileData } from \"../render/webgl/MapLayerParams\";\r\n\r\n/** Options provided to [[decodeImdlContent]].\r\n */\r\nexport interface ImdlDecodeOptions {\r\n document: Imdl.Document;\r\n system: RenderSystem;\r\n iModel: IModelConnection;\r\n isCanceled?: () => boolean;\r\n tileData?: LayerTileData;\r\n}\r\n\r\nasync function loadNamedTexture(name: string, namedTex: ImdlNamedTexture, options: ImdlDecodeOptions): Promise<RenderTexture | undefined> {\r\n // Reasons a texture could be embedded in the tile content instead of requested separately from the backend:\r\n // - external textures are disabled\r\n // - the texture name is not a valid Id64 string\r\n // - the texture is below a certain backend-hardcoded size threshold\r\n // The bufferViewJson being defined signifies any of the above conditions. In that case, the image content\r\n // has been embedded in the tile contents. Otherwise, we will attempt to request the image content separately\r\n // from the backend.\r\n\r\n try {\r\n let textureType = RenderTexture.Type.Normal;\r\n const isGlyph = JsonUtils.asBool(namedTex.isGlyph);\r\n const isTileSection = !isGlyph && JsonUtils.asBool(namedTex.isTileSection);\r\n if (isGlyph)\r\n textureType = RenderTexture.Type.Glyph;\r\n else if (isTileSection)\r\n textureType = RenderTexture.Type.TileSection;\r\n\r\n // We produce unique tile sections for very large (> 8 megapixel) textures, and unique glyph atlases for raster text.\r\n // Neither should be cached.\r\n const cacheable = !isGlyph && !isTileSection;\r\n const ownership = cacheable ? { iModel: options.iModel, key: name } : undefined;\r\n\r\n const bufferViewId = JsonUtils.asString(namedTex.bufferView);\r\n const bufferViewJson = 0 !== bufferViewId.length ? options.document.json.bufferViews[bufferViewId] : undefined;\r\n\r\n if (undefined !== bufferViewJson) { // presence of bufferViewJson signifies we should read the texture from the tile content\r\n const byteOffset = JsonUtils.asInt(bufferViewJson.byteOffset);\r\n const byteLength = JsonUtils.asInt(bufferViewJson.byteLength);\r\n if (0 === byteLength)\r\n return undefined;\r\n\r\n const texBytes = options.document.binaryData.subarray(byteOffset, byteOffset + byteLength);\r\n const format = namedTex.format;\r\n const source = new ImageSource(texBytes, format);\r\n return await options.system.createTextureFromSource({ source, ownership, type: textureType, transparency: namedTex.transparency });\r\n }\r\n\r\n // bufferViewJson was undefined, so attempt to request the texture directly from the backend\r\n const params = new RenderTextureParams(cacheable ? name : undefined, textureType);\r\n return options.system.createTextureFromElement(name, options.iModel, params, namedTex.format);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nasync function loadNamedTextures(options: ImdlDecodeOptions): Promise<Map<string, RenderTexture>> {\r\n const result = new Map<string, RenderTexture>();\r\n const namedTextures = options.document.json.namedTextures;\r\n if (!namedTextures)\r\n return result;\r\n\r\n const promises = new Array<Promise<void>>();\r\n for (const [name, namedTexture] of Object.entries(namedTextures)) {\r\n const texture = options.system.findTexture(name, options.iModel);\r\n if (texture) {\r\n result.set(name, texture);\r\n continue;\r\n } else if (namedTexture) {\r\n promises.push(loadNamedTexture(name, namedTexture, options).then((tx) => {\r\n if (tx)\r\n result.set(name, tx);\r\n }));\r\n }\r\n }\r\n\r\n if (promises.length > 0)\r\n await Promise.all(promises);\r\n\r\n return result;\r\n}\r\n\r\ninterface GraphicsOptions {\r\n document?: Imdl.Document;\r\n iModel?: IModelConnection;\r\n system: RenderSystem;\r\n isCanceled?: () => boolean;\r\n textures: Map<string, RenderTexture>;\r\n patterns: Map<string, RenderGeometry[]>;\r\n tileData?: LayerTileData;\r\n}\r\n\r\nfunction constantLodParamPropsFromJson(propsJson: { repetitions?: number, offset?: number[], minDistClamp?: number, maxDistClamp?: number } | undefined): TextureMapping.ConstantLodParamProps | undefined {\r\n if (undefined === propsJson)\r\n return undefined;\r\n\r\n const constantLodPops: TextureMapping.ConstantLodParamProps = {\r\n repetitions: JsonUtils.asDouble(propsJson.repetitions, 1.0),\r\n offset: { x: propsJson.offset ? JsonUtils.asDouble(propsJson.offset[0]) : 0.0, y: propsJson.offset ? JsonUtils.asDouble(propsJson.offset[1]) : 0.0 },\r\n minDistClamp: JsonUtils.asDouble(propsJson.minDistClamp, 1.0),\r\n maxDistClamp: JsonUtils.asDouble(propsJson.maxDistClamp, 4096.0 * 1024.0 * 1024.0),\r\n };\r\n return constantLodPops;\r\n}\r\n\r\nfunction textureMappingFromJson(json: ImdlTextureMapping | undefined, options: GraphicsOptions): TextureMapping | undefined {\r\n if (!json)\r\n return undefined;\r\n\r\n const texture = options.textures.get(JsonUtils.asString(json.name));\r\n if (!texture)\r\n return undefined;\r\n\r\n const paramsJson = json.params;\r\n const tf = paramsJson.transform;\r\n\r\n const paramProps: TextureMapping.ParamProps = {\r\n textureMat2x3: new TextureMapping.Trans2x3(tf[0][0], tf[0][1], tf[0][2], tf[1][0], tf[1][1], tf[1][2]),\r\n textureWeight: JsonUtils.asDouble(paramsJson.weight, 1.0),\r\n mapMode: JsonUtils.asInt(paramsJson.mode),\r\n worldMapping: JsonUtils.asBool(paramsJson.worldMapping),\r\n useConstantLod: JsonUtils.asBool(paramsJson.useConstantLod),\r\n constantLodProps: constantLodParamPropsFromJson(paramsJson.constantLodParams),\r\n };\r\n\r\n const textureMapping = new TextureMapping(texture, new TextureMapping.Params(paramProps));\r\n\r\n const normalMapJson = json.normalMapParams;\r\n if (normalMapJson) {\r\n let normalMap;\r\n const normalTexName = JsonUtils.asString(normalMapJson.textureName);\r\n if (normalTexName.length === 0 || undefined !== (normalMap = options.textures.get(normalTexName))) {\r\n textureMapping.normalMapParams = {\r\n normalMap,\r\n greenUp: JsonUtils.asBool(normalMapJson.greenUp),\r\n scale: JsonUtils.asDouble(normalMapJson.scale, 1),\r\n useConstantLod: JsonUtils.asBool(normalMapJson.useConstantLod),\r\n };\r\n }\r\n }\r\n\r\n return textureMapping;\r\n}\r\n\r\nfunction getMaterial(mat: string | Imdl.SurfaceMaterialParams, options: GraphicsOptions): RenderMaterial | undefined {\r\n if (typeof mat !== \"string\") {\r\n const args = toMaterialParams(mat);\r\n return options.system.createRenderMaterial(args);\r\n }\r\n\r\n if (!options.iModel) {\r\n return undefined;\r\n }\r\n\r\n const material = options.system.findMaterial(mat, options.iModel);\r\n if (material || !options.document?.json.renderMaterials)\r\n return material;\r\n\r\n const json = options.document.json.renderMaterials[mat];\r\n if (!json)\r\n return undefined;\r\n\r\n function colorDefFromJson(col: ImdlColorDef | undefined): ColorDef | undefined {\r\n return col ? ColorDef.from(col[0] * 255 + 0.5, col[1] * 255 + 0.5, col[2] * 255 + 0.5) : undefined;\r\n }\r\n\r\n const params = new RenderMaterialParams(mat);\r\n params.diffuseColor = colorDefFromJson(json.diffuseColor);\r\n if (json.diffuse !== undefined)\r\n params.diffuse = JsonUtils.asDouble(json.diffuse);\r\n\r\n params.specularColor = colorDefFromJson(json.specularColor);\r\n if (json.specular !== undefined)\r\n params.specular = JsonUtils.asDouble(json.specular);\r\n\r\n params.reflectColor = colorDefFromJson(json.reflectColor);\r\n if (json.reflect !== undefined)\r\n params.reflect = JsonUtils.asDouble(json.reflect);\r\n\r\n if (json.specularExponent !== undefined)\r\n params.specularExponent = json.specularExponent;\r\n\r\n if (undefined !== json.transparency)\r\n params.alpha = 1.0 - json.transparency;\r\n\r\n params.refract = JsonUtils.asDouble(json.refract);\r\n params.shadows = JsonUtils.asBool(json.shadows);\r\n params.ambient = JsonUtils.asDouble(json.ambient);\r\n\r\n if (undefined !== json.textureMapping)\r\n params.textureMapping = textureMappingFromJson(json.textureMapping.texture, options);\r\n\r\n return options.system.createRenderMaterial({\r\n diffuse: {color: params.diffuseColor, weight: params.diffuse},\r\n specular: {color: params.specularColor, weight: params.specular, exponent: params.specularExponent},\r\n alpha: params.alpha,\r\n textureMapping: params.textureMapping ? {\r\n texture: params.textureMapping.texture,\r\n transform: params.textureMapping.params.textureMatrix,\r\n mode: params.textureMapping.params.mode,\r\n weight: params.textureMapping.params.weight,\r\n worldMapping: params.textureMapping.params.worldMapping,\r\n useConstantLod: params.textureMapping.params.useConstantLod,\r\n constantLodProps: params.textureMapping.params.constantLodParams,\r\n normalMapParams: params.textureMapping.normalMapParams,\r\n } : undefined,\r\n });\r\n}\r\n\r\nfunction getModifiers(primitive: Imdl.Primitive): { viOrigin?: Point3d, instances?: InstancedGraphicParams } {\r\n const mod = primitive.modifier;\r\n switch (mod?.type) {\r\n case \"instances\":\r\n return { instances: InstancedGraphicParams.fromProps(mod) };\r\n case \"viewIndependentOrigin\":\r\n return {\r\n viOrigin: Point3d.fromJSON(mod.origin),\r\n };\r\n default:\r\n return {};\r\n }\r\n}\r\n\r\nfunction createPrimitiveGeometry(primitive: Imdl.Primitive, options: GraphicsOptions, viOrigin: Point3d | undefined): RenderGeometry | undefined {\r\n switch (primitive.type) {\r\n case \"point\":\r\n return options.system.createPointStringGeometry({\r\n ...primitive.params,\r\n vertices: toVertexTable(primitive.params.vertices),\r\n indices: new VertexIndices(primitive.params.indices),\r\n }, viOrigin);\r\n case \"polyline\":\r\n return options.system.createPolylineGeometry({\r\n ...primitive.params,\r\n vertices: toVertexTable(primitive.params.vertices),\r\n polyline: {\r\n ...primitive.params.polyline,\r\n indices: new VertexIndices(primitive.params.polyline.indices),\r\n prevIndices: new VertexIndices(primitive.params.polyline.prevIndices),\r\n },\r\n hasCumulativeDistances: primitive.params.hasCumulativeDistances,\r\n }, viOrigin);\r\n case \"mesh\": {\r\n const surf = primitive.params.surface;\r\n let material;\r\n if (surf.material) {\r\n if (!surf.material.isAtlas)\r\n material = createSurfaceMaterial(getMaterial(surf.material.material, options));\r\n else\r\n material = surf.material;\r\n }\r\n\r\n let textureMapping;\r\n if (surf.textureMapping) {\r\n let texture;\r\n if (typeof surf.textureMapping.texture === \"string\") {\r\n texture = options.textures.get(surf.textureMapping.texture);\r\n } else {\r\n const gradient = Gradient.Symb.fromJSON(surf.textureMapping.texture);\r\n texture = options.system.getGradientTexture(gradient, options.iModel);\r\n }\r\n\r\n if (texture)\r\n textureMapping = { texture, alwaysDisplayed: surf.textureMapping.alwaysDisplayed };\r\n }\r\n\r\n return options.system.createMeshGeometry({\r\n ...primitive.params,\r\n edges: primitive.params.edges ? edgeParamsFromImdl(primitive.params.edges) : undefined,\r\n vertices: toVertexTable(primitive.params.vertices),\r\n auxChannels: primitive.params.auxChannels ? AuxChannelTable.fromJSON(primitive.params.auxChannels) : undefined,\r\n surface: {\r\n ...primitive.params.surface,\r\n material,\r\n textureMapping,\r\n indices: new VertexIndices(primitive.params.surface.indices),\r\n },\r\n tileData: options.tileData,\r\n }, viOrigin);\r\n }\r\n }\r\n}\r\n\r\nfunction createPrimitiveGraphic(primitive: Imdl.Primitive, options: GraphicsOptions): RenderGraphic | undefined {\r\n const mods = getModifiers(primitive);\r\n const geometry = createPrimitiveGeometry(primitive, options, mods.viOrigin);\r\n return geometry ? options.system.createRenderGraphic(geometry, mods.instances) : undefined;\r\n}\r\n\r\nfunction createPatternGeometries(primitives: Imdl.Primitive[], options: GraphicsOptions): RenderGeometry[] {\r\n const geometries = [];\r\n for (const primitive of primitives) {\r\n const geometry = createPrimitiveGeometry(primitive, options, undefined);\r\n if (geometry)\r\n geometries.push(geometry);\r\n }\r\n\r\n return geometries;\r\n}\r\n\r\nfunction createPatternGraphic(params: Imdl.AreaPatternParams, options: GraphicsOptions): RenderGraphic | undefined {\r\n const geometries = options.patterns.get(params.symbolName);\r\n if (!geometries || geometries.length === 0)\r\n return undefined;\r\n\r\n const clip = ClipVector.fromJSON(params.clip);\r\n const clipVolume = clip?.isValid ? options.system.createClipVolume(clip) : undefined;\r\n if (!clipVolume)\r\n return undefined;\r\n\r\n const viewIndependentOrigin = params.viewIndependentOrigin ? Point3d.fromJSON(params.viewIndependentOrigin) : undefined;\r\n const pattern = options.system.createAreaPattern({\r\n xyOffsets: params.xyOffsets,\r\n featureId: params.featureId,\r\n orgTransform: Transform.fromJSON(params.orgTransform),\r\n origin: Point2d.fromJSON(params.origin),\r\n scale: params.scale,\r\n spacing: Point2d.fromJSON(params.spacing),\r\n patternToModel: Transform.fromJSON(params.modelTransform),\r\n range: Range3d.fromJSON(params.range),\r\n symbolTranslation: Point3d.fromJSON(params.symbolTranslation),\r\n viewIndependentOrigin,\r\n });\r\n\r\n if (!pattern)\r\n return undefined;\r\n\r\n const branch = new GraphicBranch(true);\r\n for (const geometry of geometries) {\r\n const graphic = options.system.createRenderGraphic(geometry, pattern);\r\n if (graphic)\r\n branch.add(graphic);\r\n }\r\n\r\n return branch.isEmpty ? undefined : options.system.createGraphicBranch(branch, Transform.createIdentity(), { clipVolume });\r\n}\r\n\r\nfunction createNodeGraphics(node: Imdl.Node, options: GraphicsOptions): RenderGraphic[] {\r\n if (undefined === node.groupId)\r\n return createPrimitivesNodeGraphics(node, options);\r\n\r\n const graphics: RenderGraphic[] = [];\r\n for (const child of node.nodes) {\r\n graphics.push(...createPrimitivesNodeGraphics(child, options));\r\n }\r\n\r\n if (graphics.length === 0)\r\n return graphics;\r\n\r\n const branch = new GraphicBranch(true);\r\n branch.groupNodeId = node.groupId;\r\n branch.entries.push(...graphics);\r\n return [options.system.createBranch(branch, Transform.createIdentity())];\r\n}\r\n\r\nfunction createPrimitivesNodeGraphics(node: Imdl.PrimitivesNode, options: GraphicsOptions): RenderGraphic[] {\r\n let graphics = [];\r\n for (const primitive of node.primitives) {\r\n const graphic = primitive.type === \"pattern\" ? createPatternGraphic(primitive.params, options) : createPrimitiveGraphic(primitive, options);\r\n if (graphic)\r\n graphics.push(graphic);\r\n }\r\n\r\n if (!graphics.length)\r\n return graphics;\r\n\r\n if (undefined !== node.layerId) {\r\n const layerGraphic = 1 === graphics.length ? graphics[0] : options.system.createGraphicList(graphics);\r\n graphics = [options.system.createGraphicLayer(layerGraphic, node.layerId)];\r\n } else if (undefined !== node.animationNodeId) {\r\n const branch = new GraphicBranch(true);\r\n branch.animationId = node.animationId;\r\n branch.animationNodeId = node.animationNodeId;\r\n branch.entries.push(...graphics);\r\n graphics = [options.system.createBranch(branch, Transform.createIdentity())];\r\n }\r\n\r\n return graphics;\r\n}\r\n\r\nexport async function decodeImdlGraphics(options: ImdlDecodeOptions): Promise<RenderGraphic | undefined> {\r\n const textures = await loadNamedTextures(options);\r\n if (options.isCanceled && options.isCanceled())\r\n return undefined;\r\n\r\n const patterns = new Map<string, RenderGeometry[]>();\r\n const graphicsOptions = { ...options, textures, patterns };\r\n graphicsOptions.tileData = options.tileData;\r\n\r\n for (const [name, primitives] of options.document.patterns)\r\n patterns.set(name, createPatternGeometries(primitives, graphicsOptions));\r\n\r\n const system = options.system;\r\n const graphics: RenderGraphic[] = [];\r\n for (const node of options.document.nodes) {\r\n graphics.push(...createNodeGraphics(node, graphicsOptions));\r\n }\r\n\r\n switch (graphics.length) {\r\n case 0: return undefined;\r\n case 1: return graphics[0];\r\n default: return system.createGraphicList(graphics);\r\n }\r\n}\r\n\r\nfunction remapGraphicDescription(descr: GraphicDescriptionImpl, context: GraphicDescriptionContext): void {\r\n if (descr.remapContext === context) {\r\n // Already remapped.\r\n return;\r\n } else if (descr.remapContext) {\r\n throw new Error(\"You cannot create a graphic from a GraphicDescription using two different contexts\");\r\n }\r\n\r\n descr.remapContext = context;\r\n\r\n const batch = descr.batch;\r\n if (!batch) {\r\n return;\r\n }\r\n\r\n if (Id64.isTransient(batch.modelId)) {\r\n const modelLocalId = context.remapTransientLocalId(Id64.getLocalId(batch.modelId));\r\n batch.modelId = Id64.fromLocalAndBriefcaseIds(modelLocalId, 0xffffff);\r\n }\r\n\r\n const data = batch.featureTable.data;\r\n const remapId = (offset: number) => {\r\n const hi = data[offset + 1];\r\n if (hi >= 0xffffff00) {\r\n const hi8 = hi & 0xff;\r\n const lo = data[offset];\r\n\r\n // Avoid bitwise operators because they truncate at 32 bits (we need 40) and are stupid about the sign bit.\r\n const sourceLocalId = lo + (hi8 * 0xffffffff);\r\n const localId = context.remapTransientLocalId(sourceLocalId);\r\n data[offset] = localId & 0xffffffff;\r\n data[offset + 1] = 0xffffff00 + hi8;\r\n }\r\n };\r\n\r\n const subCatsOffset = 3 * batch.featureTable.numFeatures;\r\n for (let i = 0; i < subCatsOffset; i += 3) {\r\n remapId(i);\r\n }\r\n\r\n const subCatsEnd = undefined !== batch.featureTable.numSubCategories ? subCatsOffset + 2 * batch.featureTable.numSubCategories : data.length;\r\n for (let i = subCatsOffset; i < subCatsEnd; i++) {\r\n remapId(i);\r\n }\r\n\r\n if (undefined !== batch.featureTable.numSubCategories) {\r\n for (let i = subCatsEnd; i < data.length; i++) {\r\n remapId(i + 1);\r\n }\r\n }\r\n}\r\n\r\nexport function createGraphicTemplateFromDescription(descr: GraphicDescription, context: GraphicDescriptionContext, system: RenderSystem): GraphicTemplate {\r\n if (!isGraphicDescription(descr)) {\r\n throw new Error(\"Invalid GraphicDescription\");\r\n }\r\n\r\n remapGraphicDescription(descr, context);\r\n\r\n const graphicsOptions: GraphicsOptions = {\r\n system,\r\n textures: context[_textures],\r\n patterns: new Map(),\r\n };\r\n\r\n const geometry: RenderGeometry[] = [];\r\n for (const primitive of descr.primitives) {\r\n const mods = getModifiers(primitive);\r\n\r\n // GraphicDescriptionBuilder providers no way to include instances in a GraphicDescription.\r\n assert(undefined === mods?.instances);\r\n\r\n const geom = createPrimitiveGeometry(primitive, graphicsOptions, mods.viOrigin);\r\n if (geom) {\r\n geometry.push(geom);\r\n }\r\n }\r\n\r\n let batch: GraphicTemplateBatch | undefined;\r\n if (descr.batch) {\r\n const featureTable = convertFeatureTable(descr.batch.featureTable, descr.batch.modelId);\r\n batch = {\r\n options: { ...descr.batch },\r\n range: Range3d.fromJSON(descr.batch.range),\r\n featureTable,\r\n };\r\n }\r\n\r\n let branch: GraphicTemplateBranch | undefined;\r\n if (descr.translation) {\r\n branch = { transform: Transform.createTranslation(Point3d.fromJSON(descr.translation)) };\r\n }\r\n\r\n return createGraphicTemplate({\r\n nodes: [{ geometry }],\r\n batch,\r\n branch,\r\n noDispose: true,\r\n });\r\n}\r\n\r\nexport function createGraphicFromDescription(descr: GraphicDescription, context: GraphicDescriptionContext, system: RenderSystem): RenderGraphic | undefined {\r\n const template = createGraphicTemplateFromDescription(descr, context, system);\r\n return system.createGraphicFromTemplate({ template });\r\n}\r\n"]}
|
|
@@ -27,5 +27,7 @@ export interface PolylineArgs {
|
|
|
27
27
|
});
|
|
28
28
|
/** The set of polylines. Each entry in the array describes a separate line string or point string as a series of indices into [[points]]. */
|
|
29
29
|
polylines: PolylineIndices[];
|
|
30
|
+
/** Optional per-vertex cumulative distance from the start of the line string, in model/world units. */
|
|
31
|
+
cumulativeDistances?: Float32Array;
|
|
30
32
|
}
|
|
31
33
|
//# sourceMappingURL=PolylineArgs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolylineArgs.d.ts","sourceRoot":"","sources":["../../../src/render/PolylineArgs.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,gEAAgE;IAChE,QAAQ,EAAE,YAAY,CAAC;IACvB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,UAAU,EAAE,UAAU,CAAC;IACvB,sDAAsD;IACtD,KAAK,EAAE,aAAa,CAAC;IACrB;;OAEG;IACH,MAAM,EAAE,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7D,6IAA6I;IAC7I,SAAS,EAAE,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"PolylineArgs.d.ts","sourceRoot":"","sources":["../../../src/render/PolylineArgs.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,gEAAgE;IAChE,QAAQ,EAAE,YAAY,CAAC;IACvB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,UAAU,EAAE,UAAU,CAAC;IACvB,sDAAsD;IACtD,KAAK,EAAE,aAAa,CAAC;IACrB;;OAEG;IACH,MAAM,EAAE,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7D,6IAA6I;IAC7I,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,uGAAuG;IACvG,mBAAmB,CAAC,EAAE,YAAY,CAAC;CACpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolylineArgs.js","sourceRoot":"","sources":["../../../src/render/PolylineArgs.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { ColorIndex, FeatureIndex, LinePixels, PolylineFlags, PolylineIndices, QPoint3dList } from \"@itwin/core-common\";\r\nimport { Point3d, Range3d } from \"@itwin/core-geometry\";\r\n\r\n/** Arguments supplied to [[RenderSystem.createIndexedPolylines]] describing a set of \"polylines\" (i.e., line strings or point strings).\r\n * Line strings consist of two or more points, connected by segments between them with a width specified in pixels.\r\n * Point strings consist of one or more disconnected points, drawn as dots with a radius specified in pixels.\r\n * @public\r\n */\r\nexport interface PolylineArgs {\r\n /** The color(s) of the vertices. */\r\n colors: ColorIndex;\r\n /** The [Feature]($common)(s) contained in the [[polylines]]. */\r\n features: FeatureIndex;\r\n /** The width of the lines or radius of the points, in pixels. */\r\n width: number;\r\n /** The pixel pattern to apply to the line strings. */\r\n linePixels: LinePixels;\r\n /** Flags describing how to draw the [[polylines]]. */\r\n flags: PolylineFlags;\r\n /** The positions of the [[polylines]]' vertices. If the positions are not quantized, they must include\r\n * a precomputed [Range3d]($core-geometry) encompassing all of the points.\r\n */\r\n points: QPoint3dList | (Array<Point3d> & { range: Range3d });\r\n /** The set of polylines. Each entry in the array describes a separate line string or point string as a series of indices into [[points]]. */\r\n polylines: PolylineIndices[];\r\n}\r\n\r\n"]}
|
|
1
|
+
{"version":3,"file":"PolylineArgs.js","sourceRoot":"","sources":["../../../src/render/PolylineArgs.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { ColorIndex, FeatureIndex, LinePixels, PolylineFlags, PolylineIndices, QPoint3dList } from \"@itwin/core-common\";\r\nimport { Point3d, Range3d } from \"@itwin/core-geometry\";\r\n\r\n/** Arguments supplied to [[RenderSystem.createIndexedPolylines]] describing a set of \"polylines\" (i.e., line strings or point strings).\r\n * Line strings consist of two or more points, connected by segments between them with a width specified in pixels.\r\n * Point strings consist of one or more disconnected points, drawn as dots with a radius specified in pixels.\r\n * @public\r\n */\r\nexport interface PolylineArgs {\r\n /** The color(s) of the vertices. */\r\n colors: ColorIndex;\r\n /** The [Feature]($common)(s) contained in the [[polylines]]. */\r\n features: FeatureIndex;\r\n /** The width of the lines or radius of the points, in pixels. */\r\n width: number;\r\n /** The pixel pattern to apply to the line strings. */\r\n linePixels: LinePixels;\r\n /** Flags describing how to draw the [[polylines]]. */\r\n flags: PolylineFlags;\r\n /** The positions of the [[polylines]]' vertices. If the positions are not quantized, they must include\r\n * a precomputed [Range3d]($core-geometry) encompassing all of the points.\r\n */\r\n points: QPoint3dList | (Array<Point3d> & { range: Range3d });\r\n /** The set of polylines. Each entry in the array describes a separate line string or point string as a series of indices into [[points]]. */\r\n polylines: PolylineIndices[];\r\n /** Optional per-vertex cumulative distance from the start of the line string, in model/world units. */\r\n cumulativeDistances?: Float32Array;\r\n}\r\n\r\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @module Tiles
|
|
3
3
|
*/
|
|
4
4
|
import { Point3d, Range2d, Range3d, Transform, Vector3d } from "@itwin/core-geometry";
|
|
5
|
-
import { AxisAlignedBox3d, BatchType, ElementAlignedBox3d, Feature, FeatureTable, MeshPolylineList, QParams2d, QParams3d, RenderTexture, TextureMapping, TileReadStatus, ViewFlagOverrides } from "@itwin/core-common";
|
|
5
|
+
import { AxisAlignedBox3d, BatchType, ElementAlignedBox3d, Feature, FeatureTable, LinePixels, MeshPolylineList, QParams2d, QParams3d, RenderTexture, TextureMapping, TileReadStatus, ViewFlagOverrides } from "@itwin/core-common";
|
|
6
6
|
import { IModelConnection } from "../IModelConnection";
|
|
7
7
|
import { InstancedGraphicParams } from "../common/render/InstancedGraphicParams";
|
|
8
8
|
import { Mesh } from "../common/internal/render/MeshPrimitives";
|
|
@@ -95,6 +95,7 @@ export declare class GltfMeshData {
|
|
|
95
95
|
uvs?: Uint16Array;
|
|
96
96
|
uvRange?: Range2d;
|
|
97
97
|
indices?: Uint8Array | Uint16Array | Uint32Array;
|
|
98
|
+
cumulativeDistances?: Float32Array;
|
|
98
99
|
readonly type: "mesh";
|
|
99
100
|
constructor(props: Mesh);
|
|
100
101
|
}
|
|
@@ -107,6 +108,10 @@ type GltfPrimitiveData = GltfMeshData | GltfPointCloud;
|
|
|
107
108
|
* @internal
|
|
108
109
|
*/
|
|
109
110
|
export type ShouldAbortReadGltf = (reader: GltfReader) => boolean;
|
|
111
|
+
interface MaterialLineStyle {
|
|
112
|
+
width?: number;
|
|
113
|
+
linePixels?: LinePixels;
|
|
114
|
+
}
|
|
110
115
|
/** Arguments to [[GltfReader]] constructor.
|
|
111
116
|
* @internal
|
|
112
117
|
*/
|
|
@@ -244,7 +249,9 @@ export declare abstract class GltfReader {
|
|
|
244
249
|
private extractTextureId;
|
|
245
250
|
private extractNormalMapId;
|
|
246
251
|
private isMaterialTransparent;
|
|
247
|
-
|
|
252
|
+
private getMaterialLineStyle;
|
|
253
|
+
private readCumulativeDistances;
|
|
254
|
+
protected createDisplayParams(material: GltfMaterial, hasBakedLighting: boolean, isPointPrimitive?: boolean, lineStyle?: MaterialLineStyle): DisplayParams | undefined;
|
|
248
255
|
private readMeshPrimitives;
|
|
249
256
|
protected readMeshPrimitive(primitive: GltfMeshPrimitive, featureTable?: FeatureTable, pseudoRtcBias?: Vector3d): GltfPrimitiveData | undefined;
|
|
250
257
|
private getEdgeAppearance;
|