entity/label/LabelWorker.worker.jsjavascript
"use strict";

function concatTypedArrays(dest, index, source) {
    let len = source.length,
        offset = index * len;
    for (let i = 0; i < len; i++) {
        dest[offset + i] = source[i];
    }
}

function srgbToLinear(v) {
    return Math.pow(v, 2.2);
}

self.onmessage = function (e) {
    var labelData = e.data.labelData,
        id = labelData[0],
        maxLetters = labelData[1],
        isVisible = labelData[2],
        /*3, 4, 5*/ _positionHigh_x = labelData[3],
        _positionHigh_y = labelData[4],
        _positionHigh_z = labelData[5],
        /*6, 7, 8*/ _positionLow_x = labelData[6],
        _positionLow_y = labelData[7],
        _positionLow_z = labelData[8],
        /*9*/ _size = labelData[9],
        /*10, 11*/ _offset_x = labelData[10],
        _offset_y = labelData[11],
        /*12, 13, 14, 15*/ _color_x = labelData[12],
        _color_y = labelData[13],
        _color_z = labelData[14],
        _color_w = labelData[15],
        /*16*/ _rotation = labelData[16],
        /*17, 18, 19*/ _alignedAxis_x = labelData[17],
        _alignedAxis_y = labelData[18],
        _alignedAxis_z = labelData[19],
        /*20*/ _fontIndex = labelData[20],
        /*21*/ _outline = labelData[21],
        /*22, 23, 24, 25*/ _outlineColor_x = labelData[22],
        _outlineColor_y = labelData[23],
        _outlineColor_z = labelData[24],
        _outlineColor_w = labelData[25],
        /*26, 27, 28*/ _pickingColor_x = labelData[26],
        _pickingColor_y = labelData[27],
        _pickingColor_z = labelData[28];

    let _vertexArr = new Float32Array(maxLetters * 12),
        _texCoordArr = new Float32Array(maxLetters * 24),
        _gliphParamArr = new Float32Array(maxLetters * 24),
        _positionHighArr = new Float32Array(maxLetters * 18),
        _positionLowArr = new Float32Array(maxLetters * 18),
        _sizeArr = new Float32Array(maxLetters * 6),
        _offsetArr = new Float32Array(maxLetters * 12),
        _rgbaArr = new Float32Array(maxLetters * 24),
        _rotationArr = new Float32Array(maxLetters * 6),
        _alignedAxisArr = new Float32Array(maxLetters * 18),
        _fontIndexArr = new Float32Array(maxLetters * 6),
        _outlineArr = new Float32Array(maxLetters * 6),
        _outlineColorArr = new Float32Array(maxLetters * 24),
        _pickingColorArr = new Float32Array(maxLetters * 18);

    for (let i = 0; i < maxLetters; i++) {
        if (isVisible !== 0) {
            concatTypedArrays(_vertexArr, i, [0, 0, 0, -1, 1, -1, 1, -1, 1, 0, 0, 0]);
        } else {
            concatTypedArrays(_vertexArr, i, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
        }

        concatTypedArrays(
            _texCoordArr,
            i,
            [0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0]
        );
        concatTypedArrays(_gliphParamArr, i, [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0]);

        var x = _positionHigh_x,
            y = _positionHigh_y,
            z = _positionHigh_z,
            w;
        concatTypedArrays(_positionHighArr, i, [x, y, z, x, y, z, x, y, z, x, y, z, x, y, z, x, y, z]);

        x = _positionLow_x;
        y = _positionLow_y;
        z = _positionLow_z;
        concatTypedArrays(_positionLowArr, i, [x, y, z, x, y, z, x, y, z, x, y, z, x, y, z, x, y, z]);

        x = _size;
        concatTypedArrays(_sizeArr, i, [x, x, x, x, x, x]);

        x = _offset_x;
        y = _offset_y;
        concatTypedArrays(_offsetArr, i, [x, y, x, y, x, y, x, y, x, y, x, y]);

        x = srgbToLinear(_color_x);
        y = srgbToLinear(_color_y);
        z = srgbToLinear(_color_z);
        w = _color_w;
        concatTypedArrays(_rgbaArr, i, [x, y, z, w, x, y, z, w, x, y, z, w, x, y, z, w, x, y, z, w, x, y, z, w]);

        x = _rotation;
        concatTypedArrays(_rotationArr, i, [x, x, x, x, x, x]);

        x = _alignedAxis_x;
        y = _alignedAxis_y;
        z = _alignedAxis_z;
        concatTypedArrays(_alignedAxisArr, i, [x, y, z, x, y, z, x, y, z, x, y, z, x, y, z, x, y, z]);

        x = _fontIndex;
        concatTypedArrays(_fontIndexArr, i, [x, x, x, x, x, x]);

        x = _outline;
        concatTypedArrays(_outlineArr, i, [x, x, x, x, x, x]);

        x = srgbToLinear(_outlineColor_x);
        y = srgbToLinear(_outlineColor_y);
        z = srgbToLinear(_outlineColor_z);
        w = _outlineColor_w;
        concatTypedArrays(_outlineColorArr, i, [
            x,
            y,
            z,
            w,
            x,
            y,
            z,
            w,
            x,
            y,
            z,
            w,
            x,
            y,
            z,
            w,
            x,
            y,
            z,
            w,
            x,
            y,
            z,
            w
        ]);

        x = _pickingColor_x / 255;
        y = _pickingColor_y / 255;
        z = _pickingColor_z / 255;
        concatTypedArrays(_pickingColorArr, i, [x, y, z, x, y, z, x, y, z, x, y, z, x, y, z, x, y, z]);
    }

    self.postMessage(
        {
            id: id,
            vertexArr: _vertexArr,
            texCoordArr: _texCoordArr,
            gliphParamArr: _gliphParamArr,
            positionHighArr: _positionHighArr,
            positionLowArr: _positionLowArr,
            sizeArr: _sizeArr,
            offsetArr: _offsetArr,
            rgbaArr: _rgbaArr,
            rotationArr: _rotationArr,
            alignedAxisArr: _alignedAxisArr,
            fontIndexArr: _fontIndexArr,
            outlineArr: _outlineArr,
            outlineColorArr: _outlineColorArr,
            pickingColorArr: _pickingColorArr
        },
        [
            _vertexArr.buffer,
            _texCoordArr.buffer,
            _gliphParamArr.buffer,
            _positionHighArr.buffer,
            _positionLowArr.buffer,
            _sizeArr.buffer,
            _offsetArr.buffer,
            _rgbaArr.buffer,
            _rotationArr.buffer,
            _alignedAxisArr.buffer,
            _fontIndexArr.buffer,
            _outlineArr.buffer,
            _outlineColorArr.buffer,
            _pickingColorArr.buffer
        ]
    );
};