UNPKG

@itwin/core-frontend

Version:
95 lines 4.8 kB
"use strict"; /*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); exports.InstancedGraphicPropsBuilder = void 0; const core_geometry_1 = require("@itwin/core-geometry"); const core_common_1 = require("@itwin/core-common"); const LineCode_1 = require("./LineCode"); const core_bentley_1 = require("@itwin/core-bentley"); const invalidFeature = new core_common_1.Feature(); /** Used internally by [[RenderInstancesParamsBuilder]] to produce an InstancedGraphicProps. * Use [[add]] to append [[Instance]]s, then [[finish]] to obtain an InstancedGraphicProps. */ class InstancedGraphicPropsBuilder { _instances = []; _transformRange = new core_geometry_1.Range3d(); _haveSymbology = false; add(instance) { this._instances.push(instance); this._transformRange.extendXYZ(instance.transform.origin.x, instance.transform.origin.y, instance.transform.origin.z); if (instance.symbology) { this._haveSymbology = true; } } get length() { return this._instances.length; } finish(featureTable) { const count = this.length; if (0 === count) { throw new Error("No instances defined"); } const tfc = this._transformRange.center; const transformCenter = { x: tfc.x, y: tfc.y, z: tfc.z }; const transforms = new Float32Array(count * 12); const featureIds = featureTable ? new Uint8Array(count * 3) : undefined; const symbologyOverrides = this._haveSymbology ? new Uint8Array(count * 8) : undefined; for (let i = 0; i < count; i++) { const instance = this._instances[i]; if (featureIds) { const feature = typeof instance.feature === "string" ? new core_common_1.Feature(instance.feature) : instance.feature; (0, core_bentley_1.assert)(undefined !== featureTable); // otherwise featureIds would be undefined const featureIndex = featureTable.insert(feature ?? invalidFeature); featureIds[i * 3 + 0] = featureIndex & 0xff; featureIds[i * 3 + 1] = (featureIndex & 0xff00) >> 8; featureIds[i * 3 + 2] = (featureIndex & 0xff0000) >> 16; } const symb = instance.symbology; if (symbologyOverrides && symb) { const ovrIdx = i * 8; let flags = 0 /* OvrFlags.None */; const weight = symb.weight; if (undefined !== weight) { symbologyOverrides[ovrIdx + 1] = Math.max(1, Math.min(31, weight)); flags |= 128 /* OvrFlags.Weight */; } if (undefined !== symb.linePixels) { symbologyOverrides[ovrIdx + 2] = (0, LineCode_1.lineCodeFromLinePixels)(symb.linePixels); flags |= 64 /* OvrFlags.LineCode */; } if (undefined !== symb.color) { symbologyOverrides[ovrIdx + 4] = Math.max(0, Math.min(symb.color.r, 255)); symbologyOverrides[ovrIdx + 5] = Math.max(0, Math.min(symb.color.g, 255)); symbologyOverrides[ovrIdx + 6] = Math.max(0, Math.min(symb.color.b, 255)); flags |= 2 /* OvrFlags.Rgb */; } symbologyOverrides[ovrIdx] = flags; } const tf = instance.transform; const org = [tf.origin.x - tfc.x, tf.origin.y - tfc.y, tf.origin.z - tfc.z]; const tfIdx = i * 12; transforms[tfIdx + 0] = tf.matrix.coffs[0]; transforms[tfIdx + 1] = tf.matrix.coffs[1]; transforms[tfIdx + 2] = tf.matrix.coffs[2]; transforms[tfIdx + 3] = org[0]; transforms[tfIdx + 4] = tf.matrix.coffs[3]; transforms[tfIdx + 5] = tf.matrix.coffs[4]; transforms[tfIdx + 6] = tf.matrix.coffs[5]; transforms[tfIdx + 7] = org[1]; transforms[tfIdx + 8] = tf.matrix.coffs[6]; transforms[tfIdx + 9] = tf.matrix.coffs[7]; transforms[tfIdx + 10] = tf.matrix.coffs[8]; transforms[tfIdx + 11] = org[2]; } return { count, transforms, transformCenter, featureIds, symbologyOverrides, }; } } exports.InstancedGraphicPropsBuilder = InstancedGraphicPropsBuilder; //# sourceMappingURL=InstancedGraphicPropsBuilder.js.map