@itwin/core-frontend
Version:
iTwin.js frontend components
95 lines • 4.8 kB
JavaScript
;
/*---------------------------------------------------------------------------------------------
* 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