@itwin/core-backend 5.0.0-dev.113 → 5.0.0-dev.115
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/BriefcaseManager.d.ts +10 -2
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +12 -0
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/ExportGraphics.d.ts +54 -8
- package/lib/cjs/ExportGraphics.d.ts.map +1 -1
- package/lib/cjs/ExportGraphics.js +158 -59
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +3 -0
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts +10 -2
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +12 -0
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/ExportGraphics.d.ts +54 -8
- package/lib/esm/ExportGraphics.d.ts.map +1 -1
- package/lib/esm/ExportGraphics.js +156 -58
- package/lib/esm/ExportGraphics.js.map +1 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +3 -0
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +53 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.d.ts +2 -0
- package/lib/esm/test/standalone/IModelLimits.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/IModelLimits.test.js +103 -0
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -0
- package/lib/esm/test/standalone/SnapshotDb.test.js +19 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportGraphics.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ExportGraphics.test.ts"],"names":[],"mappings":"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AAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;YACtI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG;YACpH,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YACjH,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC3H,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;SAC1C,CAAC,CAAC;QACH,O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,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/R,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3Q,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACtU,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,E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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert } from \"chai\";\nimport * as fs from \"fs\";\nimport { DbResult, Id64, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport {\n Code, ColorDef, FillDisplay, GeometryClass, GeometryParams, GeometryPartProps, GeometryStreamBuilder, GeometryStreamProps,\n ImageSourceFormat, IModel, LineStyle, PhysicalElementProps, Point2dProps, TextureMapProps, TextureMapUnits,\n} from \"@itwin/core-common\";\nimport {\n Angle, Box, GeometryQuery, GrowableXYArray, GrowableXYZArray, LineSegment3d, LineString3d, Loop, Point3d, PolyfaceBuilder, Range3d, Sphere, StrokeOptions, Vector3d,\n} from \"@itwin/core-geometry\";\nimport {\n ExportGraphics, ExportGraphicsInfo, ExportGraphicsMeshVisitor, ExportGraphicsOptions, GeometricElement, LineStyleDefinition, PhysicalObject,\n RenderMaterialElement, SnapshotDb, Texture,\n} from \"../../core-backend\";\nimport { GeometryPart } from \"../../Element\";\nimport { ExportGraphicsFunction, ExportLinesInfo, ExportPartInfo, ExportPartInstanceInfo, ExportPartLinesInfo } from \"../../ExportGraphics\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\n\ndescribe(\"exportGraphics\", () => {\n let iModel: SnapshotDb;\n let seedModel: Id64String;\n let seedCategory: Id64String;\n\n function insertPhysicalElement(geometryStream: GeometryStreamProps): Id64String {\n const elementProps: PhysicalElementProps = {\n classFullName: PhysicalObject.classFullName,\n model: seedModel,\n category: seedCategory,\n code: Code.createEmpty(),\n geom: geometryStream,\n };\n return iModel.elements.insertElement(elementProps);\n }\n\n function insertRenderMaterialWithTexture(name: string, textureId: Id64String, patternScale?: Point2dProps, patternScaleMode?: TextureMapUnits): Id64String {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const props: TextureMapProps = { TextureId: textureId, pattern_offset: [0.0, 0.0] };\n if (patternScale)\n props.pattern_scale = patternScale;\n if (patternScaleMode)\n props.pattern_scalemode = patternScaleMode;\n return RenderMaterialElement.insert(iModel, IModel.dictionaryId, name, { paletteName: \"test-palette\", patternMap: props });\n }\n\n function insertRenderMaterial(name: string, colorDef: ColorDef): Id64String {\n const colors = colorDef.colors;\n return RenderMaterialElement.insert(iModel, IModel.dictionaryId, name, {\n paletteName: \"test-palette\",\n color: [colors.r / 255, colors.g / 255, colors.b / 255],\n transmit: colors.t / 255,\n });\n }\n\n before(() => {\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"ExportGraphics\", \"ExportGraphicsTest.bim\");\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n\n // Get known model/category from seed element a la GeometryStream.test.ts\n const seedElement = iModel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n seedModel = seedElement.model;\n seedCategory = seedElement.category;\n });\n\n after(() => {\n iModel.close();\n });\n\n it(\"resolves element color correctly\", () => {\n const elementColor = ColorDef.fromString(\"cadetBlue\");\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.lineColor = elementColor;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const geometricElementId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geometricElementId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].elementId, geometricElementId);\n assert.strictEqual(infos[0].color, elementColor.tbgr);\n });\n\n it(\"resolves material color and transparency correctly\", () => {\n const materialColor = ColorDef.fromString(\"honeydew\").withTransparency(80);\n const materialId = insertRenderMaterial(\"test-material\", materialColor);\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.lineColor = ColorDef.fromString(\"rebeccaPurple\"); // line color should be superceded by material color\n geometryParams.materialId = materialId;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const geometricElementId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geometricElementId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].elementId, geometricElementId);\n assert.strictEqual(infos[0].materialId, materialId);\n assert.strictEqual(infos[0].color, materialColor.tbgr);\n assert.isUndefined(infos[0].textureId);\n });\n\n it(\"resolves color face symbology correctly\", () => {\n const color0 = ColorDef.fromString(\"sienna\");\n const color1 = ColorDef.fromString(\"plum\");\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.lineColor = ColorDef.fromString(\"peachPuff\"); // line color should be superceded by face color\n builder.appendGeometryParamsChange(geometryParams);\n // Cube with one material attached to two faces and another material attached to other four faces\n const testBrepData: string = JSON.parse(\n fs.readFileSync(IModelTestUtils.resolveAssetFile(\"brep-face-symb.json\"), { encoding: \"utf8\" }),\n ).data;\n builder.appendBRepData({\n data: testBrepData,\n faceSymbology: [\n { color: color0.toJSON() },\n { color: color1.toJSON() },\n ],\n });\n const geometricElementId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geometricElementId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n // 4 faces of slab have color1, 2 faces have color0.\n // Triangulated, should split into info with 24 indices and info with 12 indices.\n assert.strictEqual(infos.length, 2);\n assert.strictEqual(infos[0].elementId, geometricElementId);\n assert.strictEqual(infos[0].mesh.indices.length, 24);\n assert.strictEqual(infos[0].color, color1.tbgr);\n assert.strictEqual(infos[1].elementId, geometricElementId);\n assert.strictEqual(infos[1].mesh.indices.length, 12);\n assert.strictEqual(infos[1].color, color0.tbgr);\n });\n\n it(\"resolves material face symbology correctly\", () => {\n const materialColor0 = ColorDef.fromString(\"honeydew\").withTransparency(80);\n const materialId0 = insertRenderMaterial(\"test-material-0\", materialColor0);\n\n const materialColor1 = ColorDef.fromString(\"wheat\").withTransparency(240);\n const materialId1 = insertRenderMaterial(\"test-material-1\", materialColor1);\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.lineColor = ColorDef.fromString(\"peachPuff\"); // line color should be superceded by material color\n builder.appendGeometryParamsChange(geometryParams);\n const testBrepData: string = JSON.parse(\n fs.readFileSync(IModelTestUtils.resolveAssetFile(\"brep-face-symb.json\"), { encoding: \"utf8\" }),\n ).data;\n builder.appendBRepData({\n // Cube with one material attached to two faces and another material attached to other four faces\n data: testBrepData,\n faceSymbology: [\n { materialId: materialId0 },\n { materialId: materialId1 },\n ],\n });\n const geometricElementId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geometricElementId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 2);\n // 4 faces of slab have material1, 2 faces have material0.\n // Triangulated, should split into info with 24 indices and info with 12 indices.\n assert.strictEqual(infos.length, 2);\n assert.strictEqual(infos[0].elementId, geometricElementId);\n assert.strictEqual(infos[0].mesh.indices.length, 24);\n assert.strictEqual(infos[0].color, materialColor1.tbgr);\n assert.strictEqual(infos[1].elementId, geometricElementId);\n assert.strictEqual(infos[1].mesh.indices.length, 12);\n assert.strictEqual(infos[1].color, materialColor0.tbgr);\n });\n\n let textureIdString: undefined | string;\n function getTextureId(): string {\n if (textureIdString !== undefined)\n return textureIdString;\n // This is an encoded png containing a 3x3 square with white in top left pixel, blue in middle pixel, and green in\n // bottom right pixel. The rest of the square is red.\n const pngData = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 3, 0, 0, 0, 3, 8, 2, 0, 0, 0, 217,\n 74, 34, 232, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, 177, 143, 11, 252,\n 97, 5, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 14, 195, 0, 0, 14, 195, 1, 199, 111, 168, 100, 0, 0, 0, 24, 73, 68, 65,\n 84, 24, 87, 99, 248, 15, 4, 12, 12, 64, 4, 198, 64, 46, 132, 5, 162, 254, 51, 0, 0, 195, 90, 10, 246, 127, 175, 154, 145, 0,\n 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130,\n ]);\n return textureIdString = Texture.insertTexture(iModel, IModel.dictionaryId, \"test-texture\", ImageSourceFormat.Png, pngData);\n }\n\n it(\"handles materials with textures\", () => {\n const textureId = getTextureId();\n const materialId = insertRenderMaterialWithTexture(\"test-material-2\", textureId);\n const elementColor = ColorDef.fromString(\"aquamarine\");\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.materialId = materialId;\n geometryParams.lineColor = elementColor; // element color should still come through with no material color set\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const geometricElementId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geometricElementId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].elementId, geometricElementId);\n assert.strictEqual(infos[0].materialId, materialId);\n assert.strictEqual(infos[0].textureId, textureId);\n assert.strictEqual(infos[0].color, elementColor.tbgr);\n });\n\n it(\"creates meshes with expected parameters\", () => {\n const makeTriangle = (data: Float32Array, i0: number, i1: number, i2: number, dim: 2 | 3): number[] => {\n const tri: number[] = [];\n for (const i of [i0, i1, i2])\n for (let j = 0; j < dim; ++j)\n tri.push(data[dim * i + j]);\n return tri;\n };\n\n const makeFacet = (builder: PolyfaceBuilder, xyz: Float32Array, normals: Float32Array, uv: Float32Array, i0: number, i1: number, i2: number) => {\n builder.addFacetFromGrowableArrays(\n GrowableXYZArray.create(makeTriangle(xyz, i0, i1, i2, 3)),\n GrowableXYZArray.create(makeTriangle(normals, i0, i1, i2, 3)),\n GrowableXYArray.create(makeTriangle(uv, i0, i1, i2, 2)),\n undefined, // no colors\n );\n };\n\n const negateV = (param: number, index: number): number => {\n return (index % 2) ? 1 - param : param;\n };\n\n const unNegateV = (param: number, index: number): number => {\n return (index % 2) ? 2 - param : param;\n };\n\n /** return 2x2 array of uvParams: [vNegate][meters] given raw uv and the [1][1] entry */\n const mutateUV = (uvRaw: Float32Array, uvVNegatedMeters: Float32Array): Float32Array[][] => {\n const uvArray: Float32Array[][] = [[],[]];\n uvArray[1].push(Float32Array.from(uvRaw, negateV));\n uvArray[1].push(uvVNegatedMeters);\n for (let i = 0; i < 2; ++i)\n uvArray[0].push(Float32Array.from(uvArray[1][i], unNegateV));\n return uvArray;\n };\n\n const materials: Id64String[][] = [[\"\",\"\"], [\"\",\"\"]];\n const getMaterial = (vNegate: boolean, meters: boolean): Id64String => {\n const i = vNegate ? 1 : 0;\n const j = meters ? 1 : 0;\n if (materials[i][j] !== \"\")\n return materials[i][j];\n const matName = `test-material-${vNegate ? `vScaleMinus1` : `vScale1`}-${meters ? `meters` : `relative`}`;\n const matScale = vNegate ? [1, -1] : [1, 1];\n const matUnits = meters ? TextureMapUnits.Meters : TextureMapUnits.Relative;\n return materials[i][j] = insertRenderMaterialWithTexture(matName, getTextureId(), matScale, matUnits);\n };\n\n const triangleBuilder = PolyfaceBuilder.create();\n triangleBuilder.options.needParams = triangleBuilder.options.needNormals = true;\n const triangleIndices = new Int32Array([0, 1, 2]);\n const triangleXYZ = new Float32Array([1, 0, 1, 0, 0, -1, -1, 0, 1]);\n const triangleNormals = new Float32Array([0, 1, 0, 0, 1, 0, 0, 1, 0]);\n const triangleUV = new Float32Array([1, 1, 0, 0, 0, 1]);\n const triangleUVScaled = new Float32Array([2, 1 - Math.sqrt(5), 0, 1, 0, 1 - Math.sqrt(5)]);\n for (let i = 0; i < triangleIndices.length; i += 3)\n makeFacet(triangleBuilder, triangleXYZ, triangleNormals, triangleUV, triangleIndices[i], triangleIndices[i + 1], triangleIndices[i + 2]);\n const triangle = triangleBuilder.claimPolyface();\n const triangleParams = mutateUV(triangleUV, triangleUVScaled);\n\n const cubeBuilder = PolyfaceBuilder.create();\n cubeBuilder.options.needParams = cubeBuilder.options.needNormals = true;\n const cubeIndices = new Int32Array([0, 1, 2, 2, 1, 3, 4, 5, 6, 6, 5, 7, 8, 9, 10, 10, 9, 11, 12, 13, 14, 14, 13, 15, 16, 17, 18, 18, 17, 19, 20, 21, 22, 22, 21, 23]);\n const cubeXYZ = new Float32Array([-1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1]);\n const cubeNormals = new Float32Array([0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]);\n const cubeUV = new Float32Array([0.875, 0.5, 0.875, 0.25, 0.625, 0.5, 0.625, 0.25, 0.625, 0.25, 0.625, 0, 0.375, 0.25, 0.375, 0, 0.625, 1, 0.625, 0.75, 0.375, 1, 0.375, 0.75, 0.375, 0.5, 0.375, 0.25, 0.125, 0.5, 0.125, 0.25, 0.625, 0.5, 0.625, 0.25, 0.375, 0.5, 0.375, 0.25, 0.625, 0.75, 0.625, 0.5, 0.375, 0.75, 0.375, 0.5]);\n const cubeUVScaled = new Float32Array([5.25, -3, 5.25, -1, 3.75, -3, 3.75, -1, 3.75, -1, 3.75, 1, 2.25, -1, 2.25, 1, 3.75, -7, 3.75, -5, 2.25, -7, 2.25, -5, 2.25, -3, 2.25, -1, 0.75, -3, 0.75, -1, 3.75, -3, 3.75, -1, 2.25, -3, 2.25, -1, 3.75, -5, 3.75, -3, 2.25, -5, 2.25, -3]);\n for (let i = 0; i < cubeIndices.length; i += 3)\n makeFacet(cubeBuilder, cubeXYZ, cubeNormals, cubeUV, cubeIndices[i], cubeIndices[i + 1], cubeIndices[i + 2]);\n const cube = cubeBuilder.claimPolyface();\n const cubeParams = mutateUV(cubeUV, cubeUVScaled);\n\n const testUVParamExport = (geomId: Id64String, expectedParams: Float32Array) => {\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geomId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].mesh.params.length, expectedParams.length);\n assert.deepStrictEqual(infos[0].mesh.params, expectedParams, \"exported params as expected\");\n };\n\n const testMeshWithTexture = (geom: GeometryQuery, expectedUV: Float32Array, material: string) => {\n const streamBuilder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.materialId = material;\n streamBuilder.appendGeometryParamsChange(geometryParams);\n streamBuilder.appendGeometry(geom);\n const geomId = insertPhysicalElement(streamBuilder.geometryStream);\n testUVParamExport(geomId, expectedUV);\n };\n\n const testMesh = (geom: GeometryQuery, expectedParams: Float32Array[][]) => {\n for (const vNegate of [false, true])\n for (const meters of [false, true])\n testMeshWithTexture(geom, expectedParams[vNegate ? 1 : 0][meters ? 1 : 0], getMaterial(vNegate, meters));\n };\n\n testMesh(triangle, triangleParams);\n testMesh(cube, cubeParams);\n });\n\n it(\"verifies export of 3d linestyle as parts\", () => {\n const resolvedBimFile = IModelTestUtils.resolveAssetFile(\"3dLinestyle.bim\");\n assert.isNotEmpty(resolvedBimFile);\n const myIModel = SnapshotDb.openFile(resolvedBimFile);\n\n const elementIdArray: Id64Array = [\"0x5a\"];\n const infos: ExportGraphicsInfo[] = [];\n const partInstanceArray: ExportPartInstanceInfo[] = [];\n const onGraphics: ExportGraphicsFunction = info => infos.push(info);\n const countPartIds = (partId: string) => partInstanceArray.reduce((sum, instance) => sum + (instance.partId === partId ? 1 : 0), 0);\n\n // exportGraphics populates partInstanceArray with any part instances found; onGraphics gets non-part meshes\n assert.strictEqual(DbResult.BE_SQLITE_OK, myIModel.exportGraphics({elementIdArray, onGraphics, partInstanceArray}), \"export with instancing successful\");\n assert.strictEqual(infos.length, 2); // TODO: infos looks like the part 0x4c transformed. Why isn't this geometry instanced and infos empty?\n assert.strictEqual(partInstanceArray.length, 144, \"export with instancing returned expected # part instances\");\n assert.strictEqual(142, countPartIds('0x4c'), \"guardrail geometry has expected # post assembly instances\");\n assert.strictEqual(1, countPartIds('0x4d'), \"guardrail geometry has expected # start assembly instances\");\n assert.strictEqual(1, countPartIds('0x4e'), \"guardrail geometry has expected # end assembly instances\");\n // TODO: why do parts 0x4d and 0x4e look identical?\n\n myIModel.close();\n });\n\n it(\"creates meshes with vertices shared as expected\", () => {\n const builder = new GeometryStreamBuilder();\n // 1, 1, 1 box\n const box = Box.createDgnBox(Point3d.createZero(), Vector3d.create(1, 0, 0), Vector3d.create(0, 1, 0), Point3d.create(0, 0, 1), 1, 1, 1, 1, true);\n assert.isDefined(box);\n builder.appendGeometry(box!);\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n // exportGraphics is expected to compress vertices to share them where point, normal and param are all equal.\n // So, given a triangulated box, the two vertices along the diagonal should be shared inside the face (where the normal matches)\n // but not across any of the neighboring perpendicular faces.\n // For a box, 6 faces with 4 unique vertices each made up of 3 (xyz) values means we should expect points.length === 72\n // Without compression, we'd expect to see points.length === 108\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n const numUniqueVertices = 24;\n assert.strictEqual(infos[0].mesh.points.length, numUniqueVertices * 3);\n assert.strictEqual(infos[0].mesh.normals.length, numUniqueVertices * 3);\n assert.strictEqual(infos[0].mesh.params.length, numUniqueVertices * 2);\n });\n\n it(\"creates line graphics as expected\", () => {\n const elementColor = ColorDef.fromString(\"blanchedAlmond\");\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.lineColor = elementColor;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(LineString3d.createPoints([Point3d.createZero(), Point3d.create(1, 0, 0)]));\n\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const lineInfos: ExportLinesInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n onLineGraphics: (lineInfo: ExportLinesInfo) => lineInfos.push(lineInfo),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(lineInfos.length, 1);\n assert.strictEqual(lineInfos[0].color, elementColor.tbgr);\n assert.deepStrictEqual(Array.from(lineInfos[0].lines.indices), [0, 1]);\n assert.deepStrictEqual(Array.from(lineInfos[0].lines.points), [0, 0, 0, 1, 0, 0]);\n });\n\n it(\"process multiple elements in one call\", () => {\n const builder0 = new GeometryStreamBuilder();\n builder0.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));\n const id0 = insertPhysicalElement(builder0.geometryStream);\n\n const builder1 = new GeometryStreamBuilder();\n builder1.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(-1, 0, 0), Point3d.create(-1, -1, 0), Point3d.create(0, -1, 0)]));\n const id1 = insertPhysicalElement(builder1.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [id0, id1],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 2);\n // Sorting since output order is arbitrary\n assert.deepStrictEqual([infos[0].elementId, infos[1].elementId].sort(), [id0, id1].sort());\n });\n\n it(\"produces expected indices, points, normals, params in smoketest\", () => {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n\n // The ordering of these values is arbitrary, but should be consistent between runs.\n // Baselines may need to be updated if native GeomLibs is refactored, but:\n // * Lengths of all fields should remain the same\n // * Actual point, normal and param values should remain the same\n assert.strictEqual(infos[0].mesh.indices.length, 6);\n assert.strictEqual(infos[0].mesh.points.length, 12);\n assert.strictEqual(infos[0].mesh.normals.length, 12);\n assert.strictEqual(infos[0].mesh.params.length, 8);\n\n assert.deepStrictEqual(Array.from(infos[0].mesh.indices), [0, 1, 2, 1, 0, 3]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.points), [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.normals), [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.params), [1, 0, 0, 1, 0, 0, 1, 1]);\n });\n\n it(\"sets two-sided flag correctly for closed geometry\", () => {\n const builder = new GeometryStreamBuilder();\n const box = Box.createDgnBox(Point3d.createZero(), Vector3d.create(1, 0, 0), Vector3d.create(0, 1, 0), Point3d.create(0, 0, 1), 1, 1, 1, 1, true);\n assert.isDefined(box);\n builder.appendGeometry(box!);\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.isFalse(infos[0].mesh.isTwoSided);\n });\n\n it(\"sets two-sided flag correctly for open geometry\", () => {\n const builder = new GeometryStreamBuilder();\n const quad = Loop.createPolygon([Point3d.createZero(), Point3d.create(2, 0, 0), Point3d.create(2, 2, 0), Point3d.create(0, 2, 0)]);\n builder.appendGeometry(quad);\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.isTrue(infos[0].mesh.isTwoSided);\n });\n\n it(\"applies chordTol\", () => {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const coarseInfos: ExportGraphicsInfo[] = [];\n iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => coarseInfos.push(info),\n chordTol: 1,\n });\n\n const fineInfos: ExportGraphicsInfo[] = [];\n iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => fineInfos.push(info),\n chordTol: 0.001,\n });\n\n assert.strictEqual(coarseInfos.length, 1);\n assert.strictEqual(fineInfos.length, 1);\n assert.isTrue(coarseInfos[0].mesh.indices.length < fineInfos[0].mesh.indices.length);\n });\n\n it(\"applies angleTol\", () => {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const coarseInfos: ExportGraphicsInfo[] = [];\n iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => coarseInfos.push(info),\n angleTol: 30 * Angle.radiansPerDegree,\n });\n\n const fineInfos: ExportGraphicsInfo[] = [];\n iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => fineInfos.push(info),\n angleTol: 15 * Angle.radiansPerDegree,\n });\n\n assert.strictEqual(coarseInfos.length, 1);\n assert.strictEqual(fineInfos.length, 1);\n assert.isTrue(coarseInfos[0].mesh.indices.length < fineInfos[0].mesh.indices.length);\n });\n\n it(\"applies decimationTol\", () => {\n const strokeOptions = StrokeOptions.createForCurves();\n strokeOptions.chordTol = 0.001;\n const polyfaceBuilder = PolyfaceBuilder.create(strokeOptions);\n polyfaceBuilder.addSphere(Sphere.createCenterRadius(Point3d.createZero(), 1));\n\n const gsBuilder = new GeometryStreamBuilder();\n gsBuilder.appendGeometry(polyfaceBuilder.claimPolyface());\n const newId = insertPhysicalElement(gsBuilder.geometryStream);\n\n const noDecimationInfos: ExportGraphicsInfo[] = [];\n const noDecimationStatus = iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => noDecimationInfos.push(info),\n });\n\n assert.strictEqual(noDecimationStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(noDecimationInfos.length, 1);\n\n const decimationInfos: ExportGraphicsInfo[] = [];\n const decimationStatus = iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => decimationInfos.push(info),\n decimationTol: 0.1,\n });\n\n assert.strictEqual(decimationStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(decimationInfos.length, 1);\n assert.isTrue(decimationInfos[0].mesh.indices < noDecimationInfos[0].mesh.indices);\n });\n\n it(\"applies maxEdgeLength\", () => {\n const builder = new GeometryStreamBuilder();\n const quad = Loop.createPolygon([Point3d.createZero(), Point3d.create(2, 0, 0), Point3d.create(2, 2, 0), Point3d.create(0, 2, 0)]);\n builder.appendGeometry(quad);\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n maxEdgeLength: 1,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.isTrue(infos[0].mesh.indices.length > 6); // not validating particulars of subdivision, just that the option is applied\n });\n\n it(\"applies minBRepFeatureSize\", () => {\n const builder = new GeometryStreamBuilder();\n // 4x4x4m slab with a ~1x1x1cm slab cut out of it.\n const testBrep: { data: string } = JSON.parse(\n fs.readFileSync(IModelTestUtils.resolveAssetFile(\"brep-small-feature.json\"), { encoding: \"utf8\" }),\n );\n builder.appendBRepData(testBrep);\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const noMinSizeInfos: ExportGraphicsInfo[] = [];\n const noMinSizeStatus = iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => noMinSizeInfos.push(info),\n });\n assert.strictEqual(noMinSizeStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(noMinSizeInfos.length, 1);\n\n const minSizeInfos: ExportGraphicsInfo[] = [];\n const minSizeStatus = iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => minSizeInfos.push(info),\n minBRepFeatureSize: 0.1,\n });\n assert.strictEqual(minSizeStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(minSizeInfos.length, 1);\n\n assert.strictEqual(minSizeInfos[0].mesh.indices.length, 36); // should be a simple cube\n assert.isTrue(minSizeInfos[0].mesh.indices.length < noMinSizeInfos[0].mesh.indices.length);\n });\n\n it(\"applies minLineStyleComponentSize\", () => {\n const partBuilder = new GeometryStreamBuilder();\n const partParams = new GeometryParams(Id64.invalid); // category won't be used\n\n // Create line style with small component - logic copied from line style tests in GeometryStream.test.ts\n partParams.fillDisplay = FillDisplay.Always;\n partBuilder.appendGeometryParamsChange(partParams);\n partBuilder.appendGeometry(Loop.create(LineString3d.create(Point3d.create(0.1, 0, 0), Point3d.create(0, -0.05, 0), Point3d.create(0, 0.05, 0), Point3d.create(0.1, 0, 0))));\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const geomPartId = iModel.elements.insertElement(partProps);\n\n const pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(iModel, { geomPartId }); // base and size will be set automatically...\n assert.isTrue(undefined !== pointSymbolData);\n\n const strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(iModel, { descr: \"TestArrowHead\", lcId: 0, lcType: LineStyleDefinition.ComponentType.Internal, symbols: [{ symId: pointSymbolData!.compId, strokeNum: -1, mod1: LineStyleDefinition.SymbolOptions.CurveEnd }] });\n assert.isTrue(undefined !== strokePointData);\n\n const compoundData = LineStyleDefinition.Utils.createCompoundComponent(iModel, { comps: [{ id: strokePointData.compId, type: strokePointData.compType }, { id: 0, type: LineStyleDefinition.ComponentType.Internal }] });\n assert.isTrue(undefined !== compoundData);\n\n const styleId = LineStyleDefinition.Utils.createStyle(iModel, IModel.dictionaryId, \"TestArrowStyle\", compoundData);\n assert.isTrue(Id64.isValidId64(styleId));\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.styleInfo = new LineStyle.Info(styleId);\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(LineSegment3d.create(Point3d.createZero(), Point3d.create(10, 10, 0)));\n const elementId = insertPhysicalElement(builder.geometryStream);\n\n // Should include everything with no minimum component size\n const noMinInfos: ExportGraphicsInfo[] = [];\n const noMinLineInfos: ExportLinesInfo[] = [];\n let exportStatus = iModel.exportGraphics({\n elementIdArray: [elementId],\n onGraphics: (info: ExportGraphicsInfo) => noMinInfos.push(info),\n onLineGraphics: (lineInfo: ExportLinesInfo) => noMinLineInfos.push(lineInfo),\n });\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(noMinInfos.length, 1);\n assert.strictEqual(noMinLineInfos.length, 1);\n assert.strictEqual(noMinInfos[0].mesh.indices.length, 3);\n assert.strictEqual(noMinLineInfos[0].lines.indices.length, 2);\n\n // Should filter out arrow shape with large minimum component size\n const largeMinInfos: ExportGraphicsInfo[] = [];\n const largeMinLineInfos: ExportLinesInfo[] = [];\n exportStatus = iModel.exportGraphics({\n elementIdArray: [elementId],\n onGraphics: (info: ExportGraphicsInfo) => largeMinInfos.push(info),\n onLineGraphics: (lineInfo: ExportLinesInfo) => largeMinLineInfos.push(lineInfo),\n minLineStyleComponentSize: 0.5,\n });\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(largeMinInfos.length, 0);\n assert.strictEqual(largeMinLineInfos.length, 1);\n assert.strictEqual(largeMinLineInfos[0].lines.indices.length, 2);\n\n // Should include arrow shape with small minimum component size\n const smallMinInfos: ExportGraphicsInfo[] = [];\n const smallMinLineInfos: ExportLinesInfo[] = [];\n exportStatus = iModel.exportGraphics({\n elementIdArray: [elementId],\n onGraphics: (info: ExportGraphicsInfo) => smallMinInfos.push(info),\n onLineGraphics: (lineInfo: ExportLinesInfo) => smallMinLineInfos.push(lineInfo),\n minLineStyleComponentSize: 0.01,\n });\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(smallMinInfos.length, 1);\n assert.strictEqual(smallMinLineInfos.length, 1);\n assert.strictEqual(smallMinInfos[0].mesh.indices.length, 3);\n assert.strictEqual(smallMinLineInfos[0].lines.indices.length, 2);\n });\n\n it(\"applies GeometryPart transforms as expected\", () => {\n const partBuilder = new GeometryStreamBuilder();\n partBuilder.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const partId = iModel.elements.insertElement(partProps);\n\n const partInstanceBuilder = new GeometryStreamBuilder();\n partInstanceBuilder.appendGeometryPart3d(partId, Point3d.create(7, 8, 9));\n const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [partInstanceId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n\n // The ordering of these values is arbitrary, but should be consistent between runs.\n // Baselines may need to be updated if native GeomLibs is refactored, but:\n // * Lengths of all fields should remain the same\n // * Actual point, normal and param values should remain the same\n assert.strictEqual(infos[0].mesh.indices.length, 6);\n assert.strictEqual(infos[0].mesh.points.length, 12);\n assert.strictEqual(infos[0].mesh.normals.length, 12);\n assert.strictEqual(infos[0].mesh.params.length, 8);\n\n assert.deepStrictEqual(Array.from(infos[0].mesh.indices), [0, 1, 2, 1, 0, 3]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.points), [8, 8, 9, 7, 9, 9, 7, 8, 9, 8, 9, 9]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.normals), [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.params), [1, 0, 0, 1, 0, 0, 1, 1]);\n });\n\n it(\"exposes instances through partInstanceArray and exportPartGraphics\", () => {\n const partBuilder = new GeometryStreamBuilder();\n partBuilder.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const partId = iModel.elements.insertElement(partProps);\n\n const partInstanceBuilder = new GeometryStreamBuilder();\n partInstanceBuilder.appendGeometryPart3d(partId, Point3d.create(7, 8, 9));\n const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const partInstanceArray: ExportPartInstanceInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [partInstanceId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n partInstanceArray,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(partInstanceArray.length, 1);\n\n assert.strictEqual(partInstanceArray[0].partId, partId);\n assert.strictEqual(partInstanceArray[0].partInstanceId, partInstanceId);\n assert.isDefined(partInstanceArray[0].transform);\n assert.deepStrictEqual(Array.from(partInstanceArray[0].transform!), [1, 0, 0, 7, 0, 1, 0, 8, 0, 0, 1, 9]);\n\n const partInfos: ExportPartInfo[] = [];\n const exportPartStatus = iModel.exportPartGraphics({\n elementId: partInstanceArray[0].partId,\n displayProps: partInstanceArray[0].displayProps,\n onPartGraphics: (partInfo) => partInfos.push(partInfo),\n });\n\n assert.strictEqual(exportPartStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(partInfos.length, 1);\n\n // The ordering of these values is arbitrary, but should be consistent between runs.\n // Baselines may need to be updated if native GeomLibs is refactored, but:\n // * Lengths of all fields should remain the same\n // * Actual point, normal and param values should remain the same\n assert.strictEqual(partInfos[0].mesh.indices.length, 6);\n assert.strictEqual(partInfos[0].mesh.points.length, 12);\n assert.strictEqual(partInfos[0].mesh.normals.length, 12);\n assert.strictEqual(partInfos[0].mesh.params.length, 8);\n\n assert.deepStrictEqual(Array.from(partInfos[0].mesh.indices), [0, 1, 2, 1, 0, 3]);\n assert.deepStrictEqual(Array.from(partInfos[0].mesh.points), [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0]);\n assert.deepStrictEqual(Array.from(partInfos[0].mesh.normals), [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);\n assert.deepStrictEqual(Array.from(partInfos[0].mesh.params), [1, 0, 0, 1, 0, 0, 1, 1]);\n });\n\n it(\"handles single geometryClass in GeometryStream\", () => {\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.geometryClass = GeometryClass.Construction;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].geometryClass, GeometryClass.Construction);\n });\n\n it(\"handles multiple geometryClass in GeometryStream\", () => {\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n\n geometryParams.geometryClass = GeometryClass.Construction;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n\n geometryParams.geometryClass = GeometryClass.Primary;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(1.0, 1.0, 1.0)), true)!);\n\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n chordTol: 0.01,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 2);\n\n // Sphere is construction, box is primary. Output order is arbitrary, use mesh size to figure out which is which.\n if (infos[0].mesh.indices.length > 36) {\n assert.strictEqual(infos[0].geometryClass, GeometryClass.Construction);\n assert.strictEqual(infos[1].geometryClass, GeometryClass.Primary);\n } else {\n assert.strictEqual(infos[0].geometryClass, GeometryClass.Primary);\n assert.strictEqual(infos[1].geometryClass, GeometryClass.Construction);\n }\n });\n\n it(\"handles geometryClass in lines\", () => {\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n\n geometryParams.geometryClass = GeometryClass.Construction;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(LineString3d.createPoints([Point3d.createZero(), Point3d.create(1, 0, 0)]));\n\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const lineInfos: ExportLinesInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n onLineGraphics: (lineInfo: ExportLinesInfo) => lineInfos.push(lineInfo),\n chordTol: 0.01,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(lineInfos.length, 1);\n assert.strictEqual(lineInfos[0].geometryClass, GeometryClass.Construction);\n });\n\n it(\"handles geometryClass defined in parts\", () => {\n const partBuilder = new GeometryStreamBuilder();\n const partGeometryParams = new GeometryParams(Id64.invalid); // category unused for GeometryPart\n partGeometryParams.geometryClass = GeometryClass.Construction;\n partBuilder.appendGeometryParamsChange(partGeometryParams);\n partBuilder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const partId = iModel.elements.insertElement(partProps);\n\n const partInstanceBuilder = new GeometryStreamBuilder();\n partInstanceBuilder.appendGeometryPart3d(partId);\n const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const partInstanceArray: ExportPartInstanceInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [partInstanceId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n partInstanceArray,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(partInstanceArray.length, 1);\n\n const partInfos: ExportPartInfo[] = [];\n const exportPartStatus = iModel.exportPartGraphics({\n elementId: partInstanceArray[0].partId,\n displayProps: partInstanceArray[0].displayProps,\n onPartGraphics: (info: ExportPartInfo) => partInfos.push(info),\n });\n assert.strictEqual(exportPartStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(partInfos.length, 1);\n assert.strictEqual(partInfos[0].geometryClass, GeometryClass.Construction);\n });\n\n it(\"handles geometryClass defined outside parts\", () => {\n const partBuilder = new GeometryStreamBuilder();\n partBuilder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const partId = iModel.elements.insertElement(partProps);\n\n const partInstanceBuilder = new GeometryStreamBuilder();\n const partInstanceGeometryParams = new GeometryParams(seedCategory);\n partInstanceGeometryParams.geometryClass = GeometryClass.Construction;\n partInstanceBuilder.appendGeometryParamsChange(partInstanceGeometryParams);\n partInstanceBuilder.appendGeometryPart3d(partId);\n const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const partInstanceArray: ExportPartInstanceInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [partInstanceId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n partInstanceArray,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(partInstanceArray.length, 1);\n assert.strictEqual(partInstanceArray[0].displayProps.geometryClass, GeometryClass.Construction);\n\n const partInfos: ExportPartInfo[] = [];\n const exportPartStatus = iModel.exportPartGraphics({\n elementId: partInstanceArray[0].partId,\n displayProps: partInstanceArray[0].displayProps,\n onPartGraphics: (info: ExportPartInfo) => partInfos.push(info),\n });\n assert.strictEqual(exportPartStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(partInfos.length, 1);\n assert.strictEqual(partInfos[0].geometryClass, GeometryClass.Construction);\n });\n\n it(\"handles geometryClass for lines in parts\", () => {\n const partBuilder = new GeometryStreamBuilder();\n const partGeometryParams = new GeometryParams(Id64.invalid); // category unused for GeometryPart\n partGeometryParams.geometryClass = GeometryClass.Construction;\n partBuilder.appendGeometryParamsChange(partGeometryParams);\n partBuilder.appendGeometry(LineString3d.createPoints([Point3d.createZero(), Point3d.create(1, 0, 0)]));\n\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const partId = iModel.elements.insertElement(partProps);\n\n const partInstanceBuilder = new GeometryStreamBuilder();\n partInstanceBuilder.appendGeometryPart3d(partId);\n const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const partInstanceArray: ExportPartInstanceInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [partInstanceId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n partInstanceArray,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(partInstanceArray.length, 1);\n\n const partInfos: ExportPartInfo[] = [];\n const partLineInfos: ExportPartLinesInfo[] = [];\n const exportPartStatus = iModel.exportPartGraphics({\n elementId: partInstanceArray[0].partId,\n displayProps: partInstanceArray[0].displayProps,\n onPartGraphics: (info: ExportPartInfo) => partInfos.push(info),\n onPartLineGraphics: (info: ExportPartLinesInfo) => partLineInfos.push(info),\n });\n assert.strictEqual(exportPartStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(partInfos.length, 0);\n assert.strictEqual(partLineInfos.length, 1);\n assert.strictEqual(partLineInfos[0].geometryClass, GeometryClass.Construction);\n });\n\n it(\"converts to IndexedPolyface\", () => {\n const box = Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(1.0, 1.0, 1.0)), true);\n assert.isFalse(undefined === box);\n\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(box!);\n\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const onGraphics = (info: ExportGraphicsInfo) => {\n infos.push(info);\n };\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].color, ColorDef.white.tbgr);\n assert.strictEqual(infos[0].mesh.indices.length, 36);\n assert.strictEqual(infos[0].elementId, newId);\n assert.strictEqual(infos[0].geometryClass, GeometryClass.Primary);\n const polyface = ExportGraphics.convertToIndexedPolyface(infos[0].mesh);\n assert.strictEqual(polyface.facetCount, 12);\n assert.strictEqual(polyface.data.pointCount, 24);\n assert.strictEqual(polyface.data.normalCount, 24);\n assert.strictEqual(polyface.data.paramCount, 24);\n });\n\n //\n //\n // 2---3 6\n // | \\ | | \\\n // 0---1 4---5\n //\n it(\"ExportMeshGraphicsVisitor\", () => {\n const numPoints = 7;\n const numFacets = 3;\n const pointData = [0, 0, 0, 1, 0, 0, 0, 2, 0, 1, 2, 0, 2, 0, 0, 4, 0, 0, 3, 2, 0];\n const paramData = [0, 0, 1, 0, 0, 2, 1, 2, 2, 0, 4, 0, 3, 2];\n const normalData = new Float32Array(pointData.length);\n const a0 = 2.0;\n const a1 = 3.0;\n const b0 = -2.0;\n const b1 = 5.0;\n // make normals functionally related to point coordinates . . . not good normals, but good for tests\n let paramCursor = 0;\n for (let i = 0; i < pointData.length; i++) {\n normalData[i] = a1 * pointData[i] + a0;\n if ((i + 1) % 3 !== 0)\n paramData[paramCursor++] = b0 + b1 * pointData[i];\n }\n const smallMesh = {\n points: new Float64Array(pointData),\n params: new Float32Array(paramData),\n // normals have one-based index as z ..\n normals: new Float32Array(normalData),\n indices: new Int32Array([0, 1, 2, 2, 1, 3, 4, 5, 6]),\n isTwoSided: true,\n };\n const knownArea = 4.0;\n assert.isTrue(smallMesh.points.length === 3 * numPoints);\n assert.isTrue(smallMesh.normals.length === 3 * numPoints);\n assert.isTrue(smallMesh.params.length === 2 * numPoints);\n assert.isTrue(smallMesh.indices.length === 3 * numFacets);\n const visitor = ExportGraphicsMeshVisitor.create(smallMesh, 0);\n assert.isDefined(visitor.paramIndex, \"paramIndex defined\");\n assert.isDefined(visitor.paramIndex, \"paramIndex defined\");\n let numFacetsA = 0;\n let indexCursor = 0;\n let areaSum = 0.0;\n while (visitor.moveToNextFacet()) {\n numFacetsA++;\n assert.isTrue(visitor.point.length === 3);\n assert.isTrue(smallMesh.indices[indexCursor] === visitor.pointIndex[0]);\n assert.isTrue(smallMesh.indices[indexCursor + 1] === visitor.pointIndex[1]);\n assert.isTrue(smallMesh.indices[indexCursor + 2] === visitor.pointIndex[2]);\n const areaVector = visitor.point.crossProductIndexIndexIndex(0, 1, 2)!;\n areaSum += areaVector.magnitude() * 0.5;\n assert.isTrue(smallMesh.indices[indexCursor] === visitor.paramIndex![0]);\n assert.isTrue(smallMesh.indices[indexCursor + 1] === visitor.paramIndex![1]);\n assert.isTrue(smallMesh.indices[indexCursor + 2] === visitor.paramIndex![2]);\n assert.isTrue(smallMesh.indices[indexCursor] === visitor.normalIndex![0]);\n assert.isTrue(smallMesh.indices[indexCursor + 1] === visitor.normalIndex![1]);\n assert.isTrue(smallMesh.indices[indexCursor + 2] === visitor.normalIndex![2]);\n for (let k = 0; k < 3; k++) {\n const point = visitor.point.getPoint3dAtUncheckedPointIndex(k);\n const normal = visitor.normal!.getPoint3dAtUncheckedPointIndex(k);\n const param = visitor.param!.getPoint2dAtUncheckedPointIndex(k);\n for (let j = 0; j < 3; j++) {\n assert.isTrue(a0 + a1 * point.at(j) === normal.at(j));\n }\n for (let j = 0; j < 2; j++) {\n assert.isTrue(b0 + b1 * point.at(j) === (j === 0 ? param.x : param.y));\n }\n }\n indexCursor += 3;\n }\n assert.isTrue(Math.abs(knownArea - areaSum) < 1.0e-13);\n assert.isTrue(numFacetsA === numFacets, \"facet count\");\n });\n\n it(\"creates output for mesh without zero blocking\", () => {\n const meshWithoutBlocking: GeometryStreamProps = JSON.parse(`[{\n \"indexedMesh\": {\n \"numPerFace\": 3,\n \"expectedClosure\": 0,\n \"point\": [\n [0, 0, 0],\n [1, 0, 0],\n [1, 1, 0],\n [0, 1, 0]\n ],\n \"pointIndex\": [1, 2, 3, 1, 3, 4],\n \"normal\": [[0, 0, 1]],\n \"normalIndex\": [1, 1, 1, 1, 1, 1]\n }\n }]`);\n const newId = insertPhysicalElement(meshWithoutBlocking);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].elementId, newId);\n assert.strictEqual(infos[0].mesh.indices.length, 6);\n });\n\n});\n"]}
|
|
1
|
+
{"version":3,"file":"ExportGraphics.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ExportGraphics.test.ts"],"names":[],"mappings":"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,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;YACtI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG;YACpH,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YACjH,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC3H,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,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AC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/R,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3Q,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACtU,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert } from \"chai\";\nimport * as fs from \"fs\";\nimport { DbResult, Id64, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport {\n Code, ColorDef, FillDisplay, GeometryClass, GeometryParams, GeometryPartProps, GeometryStreamBuilder, GeometryStreamProps, ImageSourceFormat,\n IModel, LineStyle, PhysicalElementProps, Point2dProps, TextureMapProps, TextureMapUnits,\n} from \"@itwin/core-common\";\nimport {\n Angle, Box, Geometry, GeometryQuery, GrowableXYArray, GrowableXYZArray, LineSegment3d, LineString3d, Loop, NumberArray, Point2dArray, Point3d,\n Point3dArray, PolyfaceBuilder, Range3d, Sphere, StrokeOptions, Vector3d, Vector3dArray,\n} from \"@itwin/core-geometry\";\nimport {\n ExportGraphics, ExportGraphicsInfo, ExportGraphicsMeshVisitor, ExportGraphicsOptions, GeometricElement, LineStyleDefinition, PhysicalObject,\n RenderMaterialElement, SnapshotDb, Texture,\n} from \"../../core-backend\";\nimport { GeometryPart } from \"../../Element\";\nimport {\n ExportGraphicsFunction, ExportGraphicsMesh, ExportLinesInfo, ExportPartInfo, ExportPartInstanceInfo, ExportPartLinesInfo,\n} from \"../../ExportGraphics\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\n\ndescribe(\"exportGraphics\", () => {\n let iModel: SnapshotDb;\n let seedModel: Id64String;\n let seedCategory: Id64String;\n\n function insertPhysicalElement(geometryStream: GeometryStreamProps): Id64String {\n const elementProps: PhysicalElementProps = {\n classFullName: PhysicalObject.classFullName,\n model: seedModel,\n category: seedCategory,\n code: Code.createEmpty(),\n geom: geometryStream,\n };\n return iModel.elements.insertElement(elementProps);\n }\n\n function insertRenderMaterialWithTexture(name: string, textureId: Id64String, patternScale?: Point2dProps, patternScaleMode?: TextureMapUnits): Id64String {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const props: TextureMapProps = { TextureId: textureId, pattern_offset: [0.0, 0.0] };\n if (patternScale)\n props.pattern_scale = patternScale;\n if (patternScaleMode)\n props.pattern_scalemode = patternScaleMode;\n return RenderMaterialElement.insert(iModel, IModel.dictionaryId, name, { paletteName: \"test-palette\", patternMap: props });\n }\n\n function insertRenderMaterial(name: string, colorDef: ColorDef): Id64String {\n const colors = colorDef.colors;\n return RenderMaterialElement.insert(iModel, IModel.dictionaryId, name, {\n paletteName: \"test-palette\",\n color: [colors.r / 255, colors.g / 255, colors.b / 255],\n transmit: colors.t / 255,\n });\n }\n\n before(() => {\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"ExportGraphics\", \"ExportGraphicsTest.bim\");\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n\n // Get known model/category from seed element a la GeometryStream.test.ts\n const seedElement = iModel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n seedModel = seedElement.model;\n seedCategory = seedElement.category;\n });\n\n after(() => {\n iModel.close();\n });\n\n it(\"resolves element color correctly\", () => {\n const elementColor = ColorDef.fromString(\"cadetBlue\");\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.lineColor = elementColor;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const geometricElementId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geometricElementId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].elementId, geometricElementId);\n assert.strictEqual(infos[0].color, elementColor.tbgr);\n });\n\n it(\"resolves material color and transparency correctly\", () => {\n const materialColor = ColorDef.fromString(\"honeydew\").withTransparency(80);\n const materialId = insertRenderMaterial(\"test-material\", materialColor);\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.lineColor = ColorDef.fromString(\"rebeccaPurple\"); // line color should be superceded by material color\n geometryParams.materialId = materialId;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const geometricElementId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geometricElementId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].elementId, geometricElementId);\n assert.strictEqual(infos[0].materialId, materialId);\n assert.strictEqual(infos[0].color, materialColor.tbgr);\n assert.isUndefined(infos[0].textureId);\n });\n\n it(\"resolves color face symbology correctly\", () => {\n const color0 = ColorDef.fromString(\"sienna\");\n const color1 = ColorDef.fromString(\"plum\");\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.lineColor = ColorDef.fromString(\"peachPuff\"); // line color should be superceded by face color\n builder.appendGeometryParamsChange(geometryParams);\n // Cube with one material attached to two faces and another material attached to other four faces\n const testBrepData: string = JSON.parse(\n fs.readFileSync(IModelTestUtils.resolveAssetFile(\"brep-face-symb.json\"), { encoding: \"utf8\" }),\n ).data;\n builder.appendBRepData({\n data: testBrepData,\n faceSymbology: [\n { color: color0.toJSON() },\n { color: color1.toJSON() },\n ],\n });\n const geometricElementId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geometricElementId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n // 4 faces of slab have color1, 2 faces have color0.\n // Triangulated, should split into info with 24 indices and info with 12 indices.\n assert.strictEqual(infos.length, 2);\n assert.strictEqual(infos[0].elementId, geometricElementId);\n assert.strictEqual(infos[0].mesh.indices.length, 24);\n assert.strictEqual(infos[0].color, color1.tbgr);\n assert.strictEqual(infos[1].elementId, geometricElementId);\n assert.strictEqual(infos[1].mesh.indices.length, 12);\n assert.strictEqual(infos[1].color, color0.tbgr);\n });\n\n it(\"resolves material face symbology correctly\", () => {\n const materialColor0 = ColorDef.fromString(\"honeydew\").withTransparency(80);\n const materialId0 = insertRenderMaterial(\"test-material-0\", materialColor0);\n\n const materialColor1 = ColorDef.fromString(\"wheat\").withTransparency(240);\n const materialId1 = insertRenderMaterial(\"test-material-1\", materialColor1);\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.lineColor = ColorDef.fromString(\"peachPuff\"); // line color should be superceded by material color\n builder.appendGeometryParamsChange(geometryParams);\n const testBrepData: string = JSON.parse(\n fs.readFileSync(IModelTestUtils.resolveAssetFile(\"brep-face-symb.json\"), { encoding: \"utf8\" }),\n ).data;\n builder.appendBRepData({\n // Cube with one material attached to two faces and another material attached to other four faces\n data: testBrepData,\n faceSymbology: [\n { materialId: materialId0 },\n { materialId: materialId1 },\n ],\n });\n const geometricElementId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geometricElementId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 2);\n // 4 faces of slab have material1, 2 faces have material0.\n // Triangulated, should split into info with 24 indices and info with 12 indices.\n assert.strictEqual(infos.length, 2);\n assert.strictEqual(infos[0].elementId, geometricElementId);\n assert.strictEqual(infos[0].mesh.indices.length, 24);\n assert.strictEqual(infos[0].color, materialColor1.tbgr);\n assert.strictEqual(infos[1].elementId, geometricElementId);\n assert.strictEqual(infos[1].mesh.indices.length, 12);\n assert.strictEqual(infos[1].color, materialColor0.tbgr);\n });\n\n let textureIdString: undefined | string;\n function getTextureId(): string {\n if (textureIdString !== undefined)\n return textureIdString;\n // This is an encoded png containing a 3x3 square with white in top left pixel, blue in middle pixel, and green in\n // bottom right pixel. The rest of the square is red.\n const pngData = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 3, 0, 0, 0, 3, 8, 2, 0, 0, 0, 217,\n 74, 34, 232, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, 177, 143, 11, 252,\n 97, 5, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 14, 195, 0, 0, 14, 195, 1, 199, 111, 168, 100, 0, 0, 0, 24, 73, 68, 65,\n 84, 24, 87, 99, 248, 15, 4, 12, 12, 64, 4, 198, 64, 46, 132, 5, 162, 254, 51, 0, 0, 195, 90, 10, 246, 127, 175, 154, 145, 0,\n 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130,\n ]);\n return textureIdString = Texture.insertTexture(iModel, IModel.dictionaryId, \"test-texture\", ImageSourceFormat.Png, pngData);\n }\n\n it(\"handles materials with textures\", () => {\n const textureId = getTextureId();\n const materialId = insertRenderMaterialWithTexture(\"test-material-2\", textureId);\n const elementColor = ColorDef.fromString(\"aquamarine\");\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.materialId = materialId;\n geometryParams.lineColor = elementColor; // element color should still come through with no material color set\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const geometricElementId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geometricElementId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].elementId, geometricElementId);\n assert.strictEqual(infos[0].materialId, materialId);\n assert.strictEqual(infos[0].textureId, textureId);\n assert.strictEqual(infos[0].color, elementColor.tbgr);\n });\n\n it(\"creates meshes with expected parameters\", () => {\n const makeTriangle = (data: Float32Array, i0: number, i1: number, i2: number, dim: 2 | 3): number[] => {\n const tri: number[] = [];\n for (const i of [i0, i1, i2])\n for (let j = 0; j < dim; ++j)\n tri.push(data[dim * i + j]);\n return tri;\n };\n\n const makeFacet = (builder: PolyfaceBuilder, xyz: Float32Array, normals: Float32Array, uv: Float32Array, i0: number, i1: number, i2: number) => {\n builder.addFacetFromGrowableArrays(\n GrowableXYZArray.create(makeTriangle(xyz, i0, i1, i2, 3)),\n GrowableXYZArray.create(makeTriangle(normals, i0, i1, i2, 3)),\n GrowableXYArray.create(makeTriangle(uv, i0, i1, i2, 2)),\n undefined, // no colors\n );\n };\n\n const negateV = (param: number, index: number): number => {\n return (index % 2) ? 1 - param : param;\n };\n\n const unNegateV = (param: number, index: number): number => {\n return (index % 2) ? 2 - param : param;\n };\n\n /** return 2x2 array of uvParams: [vNegate][meters] given raw uv and the [1][1] entry */\n const mutateUV = (uvRaw: Float32Array, uvVNegatedMeters: Float32Array): Float32Array[][] => {\n const uvArray: Float32Array[][] = [[],[]];\n uvArray[1].push(Float32Array.from(uvRaw, negateV));\n uvArray[1].push(uvVNegatedMeters);\n for (let i = 0; i < 2; ++i)\n uvArray[0].push(Float32Array.from(uvArray[1][i], unNegateV));\n return uvArray;\n };\n\n const materials: Id64String[][] = [[\"\",\"\"], [\"\",\"\"]];\n const getMaterial = (vNegate: boolean, meters: boolean): Id64String => {\n const i = vNegate ? 1 : 0;\n const j = meters ? 1 : 0;\n if (materials[i][j] !== \"\")\n return materials[i][j];\n const matName = `test-material-${vNegate ? `vScaleMinus1` : `vScale1`}-${meters ? `meters` : `relative`}`;\n const matScale = vNegate ? [1, -1] : [1, 1];\n const matUnits = meters ? TextureMapUnits.Meters : TextureMapUnits.Relative;\n return materials[i][j] = insertRenderMaterialWithTexture(matName, getTextureId(), matScale, matUnits);\n };\n\n const triangleBuilder = PolyfaceBuilder.create();\n triangleBuilder.options.needParams = triangleBuilder.options.needNormals = true;\n const triangleIndices = new Int32Array([0, 1, 2]);\n const triangleXYZ = new Float32Array([1, 0, 1, 0, 0, -1, -1, 0, 1]);\n const triangleNormals = new Float32Array([0, 1, 0, 0, 1, 0, 0, 1, 0]);\n const triangleUV = new Float32Array([1, 1, 0, 0, 0, 1]);\n const triangleUVScaled = new Float32Array([2, 1 - Math.sqrt(5), 0, 1, 0, 1 - Math.sqrt(5)]);\n for (let i = 0; i < triangleIndices.length; i += 3)\n makeFacet(triangleBuilder, triangleXYZ, triangleNormals, triangleUV, triangleIndices[i], triangleIndices[i + 1], triangleIndices[i + 2]);\n const triangle = triangleBuilder.claimPolyface();\n const triangleParams = mutateUV(triangleUV, triangleUVScaled);\n\n const cubeBuilder = PolyfaceBuilder.create();\n cubeBuilder.options.needParams = cubeBuilder.options.needNormals = true;\n const cubeIndices = new Int32Array([0, 1, 2, 2, 1, 3, 4, 5, 6, 6, 5, 7, 8, 9, 10, 10, 9, 11, 12, 13, 14, 14, 13, 15, 16, 17, 18, 18, 17, 19, 20, 21, 22, 22, 21, 23]);\n const cubeXYZ = new Float32Array([-1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1]);\n const cubeNormals = new Float32Array([0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]);\n const cubeUV = new Float32Array([0.875, 0.5, 0.875, 0.25, 0.625, 0.5, 0.625, 0.25, 0.625, 0.25, 0.625, 0, 0.375, 0.25, 0.375, 0, 0.625, 1, 0.625, 0.75, 0.375, 1, 0.375, 0.75, 0.375, 0.5, 0.375, 0.25, 0.125, 0.5, 0.125, 0.25, 0.625, 0.5, 0.625, 0.25, 0.375, 0.5, 0.375, 0.25, 0.625, 0.75, 0.625, 0.5, 0.375, 0.75, 0.375, 0.5]);\n const cubeUVScaled = new Float32Array([5.25, -3, 5.25, -1, 3.75, -3, 3.75, -1, 3.75, -1, 3.75, 1, 2.25, -1, 2.25, 1, 3.75, -7, 3.75, -5, 2.25, -7, 2.25, -5, 2.25, -3, 2.25, -1, 0.75, -3, 0.75, -1, 3.75, -3, 3.75, -1, 2.25, -3, 2.25, -1, 3.75, -5, 3.75, -3, 2.25, -5, 2.25, -3]);\n for (let i = 0; i < cubeIndices.length; i += 3)\n makeFacet(cubeBuilder, cubeXYZ, cubeNormals, cubeUV, cubeIndices[i], cubeIndices[i + 1], cubeIndices[i + 2]);\n const cube = cubeBuilder.claimPolyface();\n const cubeParams = mutateUV(cubeUV, cubeUVScaled);\n\n const testUVParamExport = (geomId: Id64String, expectedParams: Float32Array) => {\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [geomId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].mesh.params.length, expectedParams.length);\n assert.deepStrictEqual(infos[0].mesh.params, expectedParams, \"exported params as expected\");\n };\n\n const testMeshWithTexture = (geom: GeometryQuery, expectedUV: Float32Array, material: string) => {\n const streamBuilder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.materialId = material;\n streamBuilder.appendGeometryParamsChange(geometryParams);\n streamBuilder.appendGeometry(geom);\n const geomId = insertPhysicalElement(streamBuilder.geometryStream);\n testUVParamExport(geomId, expectedUV);\n };\n\n const testMesh = (geom: GeometryQuery, expectedParams: Float32Array[][]) => {\n for (const vNegate of [false, true])\n for (const meters of [false, true])\n testMeshWithTexture(geom, expectedParams[vNegate ? 1 : 0][meters ? 1 : 0], getMaterial(vNegate, meters));\n };\n\n testMesh(triangle, triangleParams);\n testMesh(cube, cubeParams);\n });\n\n it(\"verifies export of 3d linestyle as parts\", () => {\n const resolvedBimFile = IModelTestUtils.resolveAssetFile(\"3dLinestyle.bim\");\n assert.isNotEmpty(resolvedBimFile);\n const myIModel = SnapshotDb.openFile(resolvedBimFile);\n\n const elementIdArray: Id64Array = [\"0x5a\"];\n const infos: ExportGraphicsInfo[] = [];\n const partInstanceArray: ExportPartInstanceInfo[] = [];\n const onGraphics: ExportGraphicsFunction = info => infos.push(info);\n const countPartIds = (partId: string) => partInstanceArray.reduce((sum, instance) => sum + (instance.partId === partId ? 1 : 0), 0);\n\n // exportGraphics populates partInstanceArray with any part instances found; onGraphics gets non-part meshes\n assert.strictEqual(DbResult.BE_SQLITE_OK, myIModel.exportGraphics({elementIdArray, onGraphics, partInstanceArray}), \"export with instancing successful\");\n assert.strictEqual(infos.length, 2); // TODO: infos looks like the part 0x4c transformed. Why isn't this geometry instanced and infos empty?\n assert.strictEqual(partInstanceArray.length, 144, \"export with instancing returned expected # part instances\");\n assert.strictEqual(142, countPartIds('0x4c'), \"guardrail geometry has expected # post assembly instances\");\n assert.strictEqual(1, countPartIds('0x4d'), \"guardrail geometry has expected # start assembly instances\");\n assert.strictEqual(1, countPartIds('0x4e'), \"guardrail geometry has expected # end assembly instances\");\n // TODO: why do parts 0x4d and 0x4e look identical?\n\n myIModel.close();\n });\n\n it(\"creates meshes with vertices shared as expected\", () => {\n const builder = new GeometryStreamBuilder();\n // 1, 1, 1 box\n const box = Box.createDgnBox(Point3d.createZero(), Vector3d.create(1, 0, 0), Vector3d.create(0, 1, 0), Point3d.create(0, 0, 1), 1, 1, 1, 1, true);\n assert.isDefined(box);\n builder.appendGeometry(box!);\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n // exportGraphics is expected to compress vertices to share them where point, normal and param are all equal.\n // So, given a triangulated box, the two vertices along the diagonal should be shared inside the face (where the normal matches)\n // but not across any of the neighboring perpendicular faces.\n // For a box, 6 faces with 4 unique vertices each made up of 3 (xyz) values means we should expect points.length === 72\n // Without compression, we'd expect to see points.length === 108\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n const numUniqueVertices = 24;\n assert.strictEqual(infos[0].mesh.points.length, numUniqueVertices * 3);\n assert.strictEqual(infos[0].mesh.normals.length, numUniqueVertices * 3);\n assert.strictEqual(infos[0].mesh.params.length, numUniqueVertices * 2);\n });\n\n it(\"creates line graphics as expected\", () => {\n const elementColor = ColorDef.fromString(\"blanchedAlmond\");\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.lineColor = elementColor;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(LineString3d.createPoints([Point3d.createZero(), Point3d.create(1, 0, 0)]));\n\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const lineInfos: ExportLinesInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n onLineGraphics: (lineInfo: ExportLinesInfo) => lineInfos.push(lineInfo),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(lineInfos.length, 1);\n assert.strictEqual(lineInfos[0].color, elementColor.tbgr);\n assert.deepStrictEqual(Array.from(lineInfos[0].lines.indices), [0, 1]);\n assert.deepStrictEqual(Array.from(lineInfos[0].lines.points), [0, 0, 0, 1, 0, 0]);\n });\n\n it(\"process multiple elements in one call\", () => {\n const builder0 = new GeometryStreamBuilder();\n builder0.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));\n const id0 = insertPhysicalElement(builder0.geometryStream);\n\n const builder1 = new GeometryStreamBuilder();\n builder1.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(-1, 0, 0), Point3d.create(-1, -1, 0), Point3d.create(0, -1, 0)]));\n const id1 = insertPhysicalElement(builder1.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [id0, id1],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 2);\n // Sorting since output order is arbitrary\n assert.deepStrictEqual([infos[0].elementId, infos[1].elementId].sort(), [id0, id1].sort());\n });\n\n it(\"produces expected indices, points, normals, params in smoketest\", () => {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n\n // The ordering of these values is arbitrary, but should be consistent between runs.\n // Baselines may need to be updated if native GeomLibs is refactored, but:\n // * Lengths of all fields should remain the same\n // * Actual point, normal and param values should remain the same\n assert.strictEqual(infos[0].mesh.indices.length, 6);\n assert.strictEqual(infos[0].mesh.points.length, 12);\n assert.strictEqual(infos[0].mesh.normals.length, 12);\n assert.strictEqual(infos[0].mesh.params.length, 8);\n\n assert.deepStrictEqual(Array.from(infos[0].mesh.indices), [0, 1, 2, 1, 0, 3]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.points), [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.normals), [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.params), [1, 0, 0, 1, 0, 0, 1, 1]);\n });\n\n it(\"sets two-sided flag correctly for closed geometry\", () => {\n const builder = new GeometryStreamBuilder();\n const box = Box.createDgnBox(Point3d.createZero(), Vector3d.create(1, 0, 0), Vector3d.create(0, 1, 0), Point3d.create(0, 0, 1), 1, 1, 1, 1, true);\n assert.isDefined(box);\n builder.appendGeometry(box!);\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.isFalse(infos[0].mesh.isTwoSided);\n });\n\n it(\"sets two-sided flag correctly for open geometry\", () => {\n const builder = new GeometryStreamBuilder();\n const quad = Loop.createPolygon([Point3d.createZero(), Point3d.create(2, 0, 0), Point3d.create(2, 2, 0), Point3d.create(0, 2, 0)]);\n builder.appendGeometry(quad);\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.isTrue(infos[0].mesh.isTwoSided);\n });\n\n it(\"applies chordTol\", () => {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const coarseInfos: ExportGraphicsInfo[] = [];\n iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => coarseInfos.push(info),\n chordTol: 1,\n });\n\n const fineInfos: ExportGraphicsInfo[] = [];\n iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => fineInfos.push(info),\n chordTol: 0.001,\n });\n\n assert.strictEqual(coarseInfos.length, 1);\n assert.strictEqual(fineInfos.length, 1);\n assert.isTrue(coarseInfos[0].mesh.indices.length < fineInfos[0].mesh.indices.length);\n });\n\n it(\"applies angleTol\", () => {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const coarseInfos: ExportGraphicsInfo[] = [];\n iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => coarseInfos.push(info),\n angleTol: 30 * Angle.radiansPerDegree,\n });\n\n const fineInfos: ExportGraphicsInfo[] = [];\n iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => fineInfos.push(info),\n angleTol: 15 * Angle.radiansPerDegree,\n });\n\n assert.strictEqual(coarseInfos.length, 1);\n assert.strictEqual(fineInfos.length, 1);\n assert.isTrue(coarseInfos[0].mesh.indices.length < fineInfos[0].mesh.indices.length);\n });\n\n it(\"applies decimationTol\", () => {\n const strokeOptions = StrokeOptions.createForCurves();\n strokeOptions.chordTol = 0.001;\n const polyfaceBuilder = PolyfaceBuilder.create(strokeOptions);\n polyfaceBuilder.addSphere(Sphere.createCenterRadius(Point3d.createZero(), 1));\n\n const gsBuilder = new GeometryStreamBuilder();\n gsBuilder.appendGeometry(polyfaceBuilder.claimPolyface());\n const newId = insertPhysicalElement(gsBuilder.geometryStream);\n\n const noDecimationInfos: ExportGraphicsInfo[] = [];\n const noDecimationStatus = iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => noDecimationInfos.push(info),\n });\n\n assert.strictEqual(noDecimationStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(noDecimationInfos.length, 1);\n\n const decimationInfos: ExportGraphicsInfo[] = [];\n const decimationStatus = iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => decimationInfos.push(info),\n decimationTol: 0.1,\n });\n\n assert.strictEqual(decimationStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(decimationInfos.length, 1);\n assert.isTrue(decimationInfos[0].mesh.indices < noDecimationInfos[0].mesh.indices);\n });\n\n it(\"applies maxEdgeLength\", () => {\n const builder = new GeometryStreamBuilder();\n const quad = Loop.createPolygon([Point3d.createZero(), Point3d.create(2, 0, 0), Point3d.create(2, 2, 0), Point3d.create(0, 2, 0)]);\n builder.appendGeometry(quad);\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n maxEdgeLength: 1,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.isTrue(infos[0].mesh.indices.length > 6); // not validating particulars of subdivision, just that the option is applied\n });\n\n it(\"applies minBRepFeatureSize\", () => {\n const builder = new GeometryStreamBuilder();\n // 4x4x4m slab with a ~1x1x1cm slab cut out of it.\n const testBrep: { data: string } = JSON.parse(\n fs.readFileSync(IModelTestUtils.resolveAssetFile(\"brep-small-feature.json\"), { encoding: \"utf8\" }),\n );\n builder.appendBRepData(testBrep);\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const noMinSizeInfos: ExportGraphicsInfo[] = [];\n const noMinSizeStatus = iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => noMinSizeInfos.push(info),\n });\n assert.strictEqual(noMinSizeStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(noMinSizeInfos.length, 1);\n\n const minSizeInfos: ExportGraphicsInfo[] = [];\n const minSizeStatus = iModel.exportGraphics({\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => minSizeInfos.push(info),\n minBRepFeatureSize: 0.1,\n });\n assert.strictEqual(minSizeStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(minSizeInfos.length, 1);\n\n assert.strictEqual(minSizeInfos[0].mesh.indices.length, 36); // should be a simple cube\n assert.isTrue(minSizeInfos[0].mesh.indices.length < noMinSizeInfos[0].mesh.indices.length);\n });\n\n it(\"applies minLineStyleComponentSize\", () => {\n const partBuilder = new GeometryStreamBuilder();\n const partParams = new GeometryParams(Id64.invalid); // category won't be used\n\n // Create line style with small component - logic copied from line style tests in GeometryStream.test.ts\n partParams.fillDisplay = FillDisplay.Always;\n partBuilder.appendGeometryParamsChange(partParams);\n partBuilder.appendGeometry(Loop.create(LineString3d.create(Point3d.create(0.1, 0, 0), Point3d.create(0, -0.05, 0), Point3d.create(0, 0.05, 0), Point3d.create(0.1, 0, 0))));\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const geomPartId = iModel.elements.insertElement(partProps);\n\n const pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(iModel, { geomPartId }); // base and size will be set automatically...\n assert.isTrue(undefined !== pointSymbolData);\n\n const strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(iModel, { descr: \"TestArrowHead\", lcId: 0, lcType: LineStyleDefinition.ComponentType.Internal, symbols: [{ symId: pointSymbolData!.compId, strokeNum: -1, mod1: LineStyleDefinition.SymbolOptions.CurveEnd }] });\n assert.isTrue(undefined !== strokePointData);\n\n const compoundData = LineStyleDefinition.Utils.createCompoundComponent(iModel, { comps: [{ id: strokePointData.compId, type: strokePointData.compType }, { id: 0, type: LineStyleDefinition.ComponentType.Internal }] });\n assert.isTrue(undefined !== compoundData);\n\n const styleId = LineStyleDefinition.Utils.createStyle(iModel, IModel.dictionaryId, \"TestArrowStyle\", compoundData);\n assert.isTrue(Id64.isValidId64(styleId));\n\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.styleInfo = new LineStyle.Info(styleId);\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(LineSegment3d.create(Point3d.createZero(), Point3d.create(10, 10, 0)));\n const elementId = insertPhysicalElement(builder.geometryStream);\n\n // Should include everything with no minimum component size\n const noMinInfos: ExportGraphicsInfo[] = [];\n const noMinLineInfos: ExportLinesInfo[] = [];\n let exportStatus = iModel.exportGraphics({\n elementIdArray: [elementId],\n onGraphics: (info: ExportGraphicsInfo) => noMinInfos.push(info),\n onLineGraphics: (lineInfo: ExportLinesInfo) => noMinLineInfos.push(lineInfo),\n });\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(noMinInfos.length, 1);\n assert.strictEqual(noMinLineInfos.length, 1);\n assert.strictEqual(noMinInfos[0].mesh.indices.length, 3);\n assert.strictEqual(noMinLineInfos[0].lines.indices.length, 2);\n\n // Should filter out arrow shape with large minimum component size\n const largeMinInfos: ExportGraphicsInfo[] = [];\n const largeMinLineInfos: ExportLinesInfo[] = [];\n exportStatus = iModel.exportGraphics({\n elementIdArray: [elementId],\n onGraphics: (info: ExportGraphicsInfo) => largeMinInfos.push(info),\n onLineGraphics: (lineInfo: ExportLinesInfo) => largeMinLineInfos.push(lineInfo),\n minLineStyleComponentSize: 0.5,\n });\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(largeMinInfos.length, 0);\n assert.strictEqual(largeMinLineInfos.length, 1);\n assert.strictEqual(largeMinLineInfos[0].lines.indices.length, 2);\n\n // Should include arrow shape with small minimum component size\n const smallMinInfos: ExportGraphicsInfo[] = [];\n const smallMinLineInfos: ExportLinesInfo[] = [];\n exportStatus = iModel.exportGraphics({\n elementIdArray: [elementId],\n onGraphics: (info: ExportGraphicsInfo) => smallMinInfos.push(info),\n onLineGraphics: (lineInfo: ExportLinesInfo) => smallMinLineInfos.push(lineInfo),\n minLineStyleComponentSize: 0.01,\n });\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(smallMinInfos.length, 1);\n assert.strictEqual(smallMinLineInfos.length, 1);\n assert.strictEqual(smallMinInfos[0].mesh.indices.length, 3);\n assert.strictEqual(smallMinLineInfos[0].lines.indices.length, 2);\n });\n\n it(\"applies GeometryPart transforms as expected\", () => {\n const partBuilder = new GeometryStreamBuilder();\n partBuilder.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const partId = iModel.elements.insertElement(partProps);\n\n const partInstanceBuilder = new GeometryStreamBuilder();\n partInstanceBuilder.appendGeometryPart3d(partId, Point3d.create(7, 8, 9));\n const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [partInstanceId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n\n // The ordering of these values is arbitrary, but should be consistent between runs.\n // Baselines may need to be updated if native GeomLibs is refactored, but:\n // * Lengths of all fields should remain the same\n // * Actual point, normal and param values should remain the same\n assert.strictEqual(infos[0].mesh.indices.length, 6);\n assert.strictEqual(infos[0].mesh.points.length, 12);\n assert.strictEqual(infos[0].mesh.normals.length, 12);\n assert.strictEqual(infos[0].mesh.params.length, 8);\n\n assert.deepStrictEqual(Array.from(infos[0].mesh.indices), [0, 1, 2, 1, 0, 3]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.points), [8, 8, 9, 7, 9, 9, 7, 8, 9, 8, 9, 9]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.normals), [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);\n assert.deepStrictEqual(Array.from(infos[0].mesh.params), [1, 0, 0, 1, 0, 0, 1, 1]);\n });\n\n it(\"exposes instances through partInstanceArray and exportPartGraphics\", () => {\n const partBuilder = new GeometryStreamBuilder();\n partBuilder.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const partId = iModel.elements.insertElement(partProps);\n\n const partInstanceBuilder = new GeometryStreamBuilder();\n partInstanceBuilder.appendGeometryPart3d(partId, Point3d.create(7, 8, 9));\n const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const partInstanceArray: ExportPartInstanceInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [partInstanceId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n partInstanceArray,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(partInstanceArray.length, 1);\n\n assert.strictEqual(partInstanceArray[0].partId, partId);\n assert.strictEqual(partInstanceArray[0].partInstanceId, partInstanceId);\n assert.isDefined(partInstanceArray[0].transform);\n assert.deepStrictEqual(Array.from(partInstanceArray[0].transform!), [1, 0, 0, 7, 0, 1, 0, 8, 0, 0, 1, 9]);\n\n const partInfos: ExportPartInfo[] = [];\n const exportPartStatus = iModel.exportPartGraphics({\n elementId: partInstanceArray[0].partId,\n displayProps: partInstanceArray[0].displayProps,\n onPartGraphics: (partInfo) => partInfos.push(partInfo),\n });\n\n assert.strictEqual(exportPartStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(partInfos.length, 1);\n\n // The ordering of these values is arbitrary, but should be consistent between runs.\n // Baselines may need to be updated if native GeomLibs is refactored, but:\n // * Lengths of all fields should remain the same\n // * Actual point, normal and param values should remain the same\n assert.strictEqual(partInfos[0].mesh.indices.length, 6);\n assert.strictEqual(partInfos[0].mesh.points.length, 12);\n assert.strictEqual(partInfos[0].mesh.normals.length, 12);\n assert.strictEqual(partInfos[0].mesh.params.length, 8);\n\n assert.deepStrictEqual(Array.from(partInfos[0].mesh.indices), [0, 1, 2, 1, 0, 3]);\n assert.deepStrictEqual(Array.from(partInfos[0].mesh.points), [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0]);\n assert.deepStrictEqual(Array.from(partInfos[0].mesh.normals), [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);\n assert.deepStrictEqual(Array.from(partInfos[0].mesh.params), [1, 0, 0, 1, 0, 0, 1, 1]);\n });\n\n it(\"handles single geometryClass in GeometryStream\", () => {\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n geometryParams.geometryClass = GeometryClass.Construction;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].geometryClass, GeometryClass.Construction);\n });\n\n it(\"handles multiple geometryClass in GeometryStream\", () => {\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n\n geometryParams.geometryClass = GeometryClass.Construction;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n\n geometryParams.geometryClass = GeometryClass.Primary;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(1.0, 1.0, 1.0)), true)!);\n\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n chordTol: 0.01,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 2);\n\n // Sphere is construction, box is primary. Output order is arbitrary, use mesh size to figure out which is which.\n if (infos[0].mesh.indices.length > 36) {\n assert.strictEqual(infos[0].geometryClass, GeometryClass.Construction);\n assert.strictEqual(infos[1].geometryClass, GeometryClass.Primary);\n } else {\n assert.strictEqual(infos[0].geometryClass, GeometryClass.Primary);\n assert.strictEqual(infos[1].geometryClass, GeometryClass.Construction);\n }\n });\n\n it(\"handles geometryClass in lines\", () => {\n const builder = new GeometryStreamBuilder();\n const geometryParams = new GeometryParams(seedCategory);\n\n geometryParams.geometryClass = GeometryClass.Construction;\n builder.appendGeometryParamsChange(geometryParams);\n builder.appendGeometry(LineString3d.createPoints([Point3d.createZero(), Point3d.create(1, 0, 0)]));\n\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const lineInfos: ExportLinesInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n onLineGraphics: (lineInfo: ExportLinesInfo) => lineInfos.push(lineInfo),\n chordTol: 0.01,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(lineInfos.length, 1);\n assert.strictEqual(lineInfos[0].geometryClass, GeometryClass.Construction);\n });\n\n it(\"handles geometryClass defined in parts\", () => {\n const partBuilder = new GeometryStreamBuilder();\n const partGeometryParams = new GeometryParams(Id64.invalid); // category unused for GeometryPart\n partGeometryParams.geometryClass = GeometryClass.Construction;\n partBuilder.appendGeometryParamsChange(partGeometryParams);\n partBuilder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const partId = iModel.elements.insertElement(partProps);\n\n const partInstanceBuilder = new GeometryStreamBuilder();\n partInstanceBuilder.appendGeometryPart3d(partId);\n const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const partInstanceArray: ExportPartInstanceInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [partInstanceId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n partInstanceArray,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(partInstanceArray.length, 1);\n\n const partInfos: ExportPartInfo[] = [];\n const exportPartStatus = iModel.exportPartGraphics({\n elementId: partInstanceArray[0].partId,\n displayProps: partInstanceArray[0].displayProps,\n onPartGraphics: (info: ExportPartInfo) => partInfos.push(info),\n });\n assert.strictEqual(exportPartStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(partInfos.length, 1);\n assert.strictEqual(partInfos[0].geometryClass, GeometryClass.Construction);\n });\n\n it(\"handles geometryClass defined outside parts\", () => {\n const partBuilder = new GeometryStreamBuilder();\n partBuilder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), 1));\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const partId = iModel.elements.insertElement(partProps);\n\n const partInstanceBuilder = new GeometryStreamBuilder();\n const partInstanceGeometryParams = new GeometryParams(seedCategory);\n partInstanceGeometryParams.geometryClass = GeometryClass.Construction;\n partInstanceBuilder.appendGeometryParamsChange(partInstanceGeometryParams);\n partInstanceBuilder.appendGeometryPart3d(partId);\n const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const partInstanceArray: ExportPartInstanceInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [partInstanceId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n partInstanceArray,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(partInstanceArray.length, 1);\n assert.strictEqual(partInstanceArray[0].displayProps.geometryClass, GeometryClass.Construction);\n\n const partInfos: ExportPartInfo[] = [];\n const exportPartStatus = iModel.exportPartGraphics({\n elementId: partInstanceArray[0].partId,\n displayProps: partInstanceArray[0].displayProps,\n onPartGraphics: (info: ExportPartInfo) => partInfos.push(info),\n });\n assert.strictEqual(exportPartStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(partInfos.length, 1);\n assert.strictEqual(partInfos[0].geometryClass, GeometryClass.Construction);\n });\n\n it(\"handles geometryClass for lines in parts\", () => {\n const partBuilder = new GeometryStreamBuilder();\n const partGeometryParams = new GeometryParams(Id64.invalid); // category unused for GeometryPart\n partGeometryParams.geometryClass = GeometryClass.Construction;\n partBuilder.appendGeometryParamsChange(partGeometryParams);\n partBuilder.appendGeometry(LineString3d.createPoints([Point3d.createZero(), Point3d.create(1, 0, 0)]));\n\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n geom: partBuilder.geometryStream,\n };\n const partId = iModel.elements.insertElement(partProps);\n\n const partInstanceBuilder = new GeometryStreamBuilder();\n partInstanceBuilder.appendGeometryPart3d(partId);\n const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const partInstanceArray: ExportPartInstanceInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [partInstanceId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n partInstanceArray,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 0);\n assert.strictEqual(partInstanceArray.length, 1);\n\n const partInfos: ExportPartInfo[] = [];\n const partLineInfos: ExportPartLinesInfo[] = [];\n const exportPartStatus = iModel.exportPartGraphics({\n elementId: partInstanceArray[0].partId,\n displayProps: partInstanceArray[0].displayProps,\n onPartGraphics: (info: ExportPartInfo) => partInfos.push(info),\n onPartLineGraphics: (info: ExportPartLinesInfo) => partLineInfos.push(info),\n });\n assert.strictEqual(exportPartStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(partInfos.length, 0);\n assert.strictEqual(partLineInfos.length, 1);\n assert.strictEqual(partLineInfos[0].geometryClass, GeometryClass.Construction);\n });\n\n it(\"converts to IndexedPolyface\", () => {\n const box = Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(1.0, 1.0, 1.0)), true);\n assert.isFalse(undefined === box);\n\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(box!);\n\n const newId = insertPhysicalElement(builder.geometryStream);\n\n const infos: ExportGraphicsInfo[] = [];\n const onGraphics = (info: ExportGraphicsInfo) => {\n infos.push(info);\n };\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics,\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].color, ColorDef.white.tbgr);\n assert.strictEqual(infos[0].mesh.indices.length, 36);\n assert.strictEqual(infos[0].elementId, newId);\n assert.strictEqual(infos[0].geometryClass, GeometryClass.Primary);\n const polyface = ExportGraphics.convertToIndexedPolyface(infos[0].mesh);\n assert.strictEqual(polyface.facetCount, 12);\n assert.strictEqual(polyface.data.pointCount, 24);\n assert.strictEqual(polyface.data.normalCount, 24);\n assert.strictEqual(polyface.data.paramCount, 24);\n });\n\n //\n //\n // 2---3 6\n // | \\ | | \\\n // 0---1 4---5\n //\n it(\"ExportMeshGraphicsVisitor\", () => {\n const numPoints = 7;\n const numFacets = 3;\n const pointData = [0, 0, 0, 1, 0, 0, 0, 2, 0, 1, 2, 0, 2, 0, 0, 4, 0, 0, 3, 2, 0];\n const paramData = [0, 0, 1, 0, 0, 2, 1, 2, 2, 0, 4, 0, 3, 2];\n const normalData = new Float32Array(pointData.length);\n const a0 = 2.0;\n const a1 = 3.0;\n const b0 = -2.0;\n const b1 = 5.0;\n // make normals functionally related to point coordinates . . . not good normals, but good for tests\n let paramCursor = 0;\n for (let i = 0; i < pointData.length; i++) {\n normalData[i] = a1 * pointData[i] + a0;\n if ((i + 1) % 3 !== 0)\n paramData[paramCursor++] = b0 + b1 * pointData[i];\n }\n const smallMesh = {\n points: new Float64Array(pointData),\n params: new Float32Array(paramData),\n // normals have one-based index as z ..\n normals: new Float32Array(normalData),\n indices: new Int32Array([0, 1, 2, 2, 1, 3, 4, 5, 6]),\n isTwoSided: true,\n };\n const knownArea = 4.0;\n assert.isTrue(smallMesh.points.length === 3 * numPoints);\n assert.isTrue(smallMesh.normals.length === 3 * numPoints);\n assert.isTrue(smallMesh.params.length === 2 * numPoints);\n assert.isTrue(smallMesh.indices.length === 3 * numFacets);\n const visitor = ExportGraphicsMeshVisitor.create(smallMesh, 0);\n assert.isDefined(visitor.paramIndex, \"paramIndex defined\");\n assert.isDefined(visitor.paramIndex, \"paramIndex defined\");\n let numFacetsA = 0;\n let indexCursor = 0;\n let areaSum = 0.0;\n while (visitor.moveToNextFacet()) {\n numFacetsA++;\n assert.isTrue(visitor.point.length === 3);\n assert.isTrue(smallMesh.indices[indexCursor] === visitor.pointIndex[0]);\n assert.isTrue(smallMesh.indices[indexCursor + 1] === visitor.pointIndex[1]);\n assert.isTrue(smallMesh.indices[indexCursor + 2] === visitor.pointIndex[2]);\n const areaVector = visitor.point.crossProductIndexIndexIndex(0, 1, 2)!;\n areaSum += areaVector.magnitude() * 0.5;\n assert.isTrue(smallMesh.indices[indexCursor] === visitor.paramIndex![0]);\n assert.isTrue(smallMesh.indices[indexCursor + 1] === visitor.paramIndex![1]);\n assert.isTrue(smallMesh.indices[indexCursor + 2] === visitor.paramIndex![2]);\n assert.isTrue(smallMesh.indices[indexCursor] === visitor.normalIndex![0]);\n assert.isTrue(smallMesh.indices[indexCursor + 1] === visitor.normalIndex![1]);\n assert.isTrue(smallMesh.indices[indexCursor + 2] === visitor.normalIndex![2]);\n for (let k = 0; k < 3; k++) {\n const point = visitor.point.getPoint3dAtUncheckedPointIndex(k);\n const normal = visitor.normal!.getPoint3dAtUncheckedPointIndex(k);\n const param = visitor.param!.getPoint2dAtUncheckedPointIndex(k);\n for (let j = 0; j < 3; j++) {\n assert.isTrue(a0 + a1 * point.at(j) === normal.at(j));\n }\n for (let j = 0; j < 2; j++) {\n assert.isTrue(b0 + b1 * point.at(j) === (j === 0 ? param.x : param.y));\n }\n }\n indexCursor += 3;\n }\n assert.isTrue(Math.abs(knownArea - areaSum) < 1.0e-13);\n assert.isTrue(numFacetsA === numFacets, \"facet count\");\n });\n\n it(\"creates output for mesh without zero blocking\", () => {\n const meshWithoutBlocking: GeometryStreamProps = JSON.parse(`[{\n \"indexedMesh\": {\n \"numPerFace\": 3,\n \"expectedClosure\": 0,\n \"point\": [\n [0, 0, 0],\n [1, 0, 0],\n [1, 1, 0],\n [0, 1, 0]\n ],\n \"pointIndex\": [1, 2, 3, 1, 3, 4],\n \"normal\": [[0, 0, 1]],\n \"normalIndex\": [1, 1, 1, 1, 1, 1]\n }\n }]`);\n const newId = insertPhysicalElement(meshWithoutBlocking);\n\n const infos: ExportGraphicsInfo[] = [];\n const exportGraphicsOptions: ExportGraphicsOptions = {\n elementIdArray: [newId],\n onGraphics: (info: ExportGraphicsInfo) => infos.push(info),\n };\n\n const exportStatus = iModel.exportGraphics(exportGraphicsOptions);\n assert.strictEqual(exportStatus, DbResult.BE_SQLITE_OK);\n assert.strictEqual(infos.length, 1);\n assert.strictEqual(infos[0].elementId, newId);\n assert.strictEqual(infos[0].mesh.indices.length, 6);\n });\n\n it(\"verifies subset visitor\", () => {\n const options = StrokeOptions.createForFacets();\n options.needNormals = options.needParams = options.shouldTriangulate = true;\n const builder = PolyfaceBuilder.create(options);\n builder.addSphere(Sphere.createCenterRadius(Point3d.createZero(), 1), 5);\n const polyface = builder.claimPolyface();\n assert.isDefined(polyface.data.param);\n assert.isDefined(polyface.data.paramIndex);\n assert.strictEqual(polyface.data.paramIndex!.length, polyface.data.pointIndex.length);\n assert.isDefined(polyface.data.normal);\n assert.isDefined(polyface.data.normalIndex);\n assert.strictEqual(polyface.data.normalIndex!.length, polyface.data.pointIndex.length);\n // compress by-sector uv/normals to by-vertex; last datum wins\n const paramData = Array<number>(2 * polyface.data.point.length);\n const normalData = Array<number>(3 * polyface.data.point.length);\n for (let i = 0; i < polyface.data.pointIndex.length; i++) {\n const pointIndex = polyface.data.pointIndex[i];\n const param = polyface.data.getParam(polyface.data.paramIndex![i]);\n if (param) {\n paramData[2 * pointIndex] = param.x;\n paramData[2 * pointIndex + 1] = param.y;\n }\n const normal = polyface.data.getNormal(polyface.data.normalIndex![i]);\n if (normal) {\n normalData[3 * pointIndex] = normal.x;\n normalData[3 * pointIndex + 1] = normal.y;\n normalData[3 * pointIndex + 2] = normal.z;\n }\n }\n const mesh: ExportGraphicsMesh = {\n points: polyface.data.point.float64Data(),\n params: new Float32Array(paramData),\n normals: new Float32Array(normalData),\n indices: new Int32Array(polyface.data.pointIndex),\n isTwoSided: false,\n };\n const visitor = ExportGraphicsMeshVisitor.create(mesh);\n const numFacets = polyface.facetCount;\n const numSubset = Math.floor(numFacets / 2);\n const subset = Array<number>(numSubset).fill(0).map((_v: number, i: number) => Math.floor(numFacets * Math.log2(1 + i / numSubset)));\n const subVisitor = visitor.createSubsetVisitor(subset);\n while (subVisitor.moveToNextFacet()) {\n const facetIndex = subVisitor.parentFacetIndex();\n assert.isDefined(facetIndex);\n const result = visitor.moveToReadIndex(facetIndex!);\n assert.isTrue(result);\n assert.isTrue(NumberArray.isAlmostEqual(subVisitor.pointIndex, visitor.pointIndex, Geometry.smallFloatingPoint));\n assert.isTrue(Point3dArray.isAlmostEqual(subVisitor.point.float64Data(), visitor.point.float64Data(), Geometry.smallFloatingPoint));\n assert.isTrue(Point2dArray.isAlmostEqual(subVisitor.param?.getPoint2dArray(), visitor.param?.getPoint2dArray(), Geometry.smallFloatingPoint));\n assert.isTrue(Vector3dArray.isAlmostEqual(subVisitor.normal?.float64Data(), visitor.normal?.float64Data(), Geometry.smallFloatingPoint));\n }\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelLimits.test.d.ts","sourceRoot":"","sources":["../../../../src/test/standalone/IModelLimits.test.ts"],"names":[],"mappings":""}
|