entity_billboard_BillboardHandler.ts

import { BaseBillboardHandler } from "./BaseBillboardHandler";
import { Billboard } from "./Billboard";
import { concatTypedArrays } from "../../utils/shared";
import { EntityCollection } from "../EntityCollection";

/**
 * @class BillboardHandler
 */
class BillboardHandler extends BaseBillboardHandler {
    protected override _billboards: Billboard[];

    constructor(props: EntityCollection) {
        super(props);

        this._billboards = [];
    }

    public override add(billboard: Billboard) {
        if (billboard._handlerIndex == -1) {
            super.add(billboard);

            this._addBillboardToArrays(billboard);
            this._insertBillboardByOpacity(billboard._handlerIndex, this._isBillboardOpaque(billboard));
            this.refresh();
            let src = billboard.getSrc() || (billboard.getImage() && billboard.getImage()!.src);
            if (src) {
                billboard.setSrc(src);
            }
        }
    }

    protected _addBillboardToArrays(billboard: Billboard) {
        if (billboard.getVisibility()) {
            this._vertexArr = concatTypedArrays(
                this._vertexArr,
                [-0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5]
            ) as Float32Array;
        } else {
            this._vertexArr = concatTypedArrays(this._vertexArr, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) as Float32Array;
        }

        this._texCoordArr = concatTypedArrays(this._texCoordArr, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) as Float32Array;

        let x = billboard._positionHigh.x,
            y = billboard._positionHigh.y,
            z = billboard._positionHigh.z,
            w;
        this._positionHighArr = concatTypedArrays(this._positionHighArr, [
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z
        ]) as Float32Array;

        x = billboard._positionLow.x;
        y = billboard._positionLow.y;
        z = billboard._positionLow.z;
        this._positionLowArr = concatTypedArrays(this._positionLowArr, [
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z
        ]) as Float32Array;

        x = billboard._width;
        y = billboard._height;
        this._sizeArr = concatTypedArrays(this._sizeArr, [x, y, x, y, x, y, x, y, x, y, x, y]) as Float32Array;

        x = billboard._offset.x;
        y = billboard._offset.y;
        this._offsetArr = concatTypedArrays(this._offsetArr, [x, y, x, y, x, y, x, y, x, y, x, y]) as Float32Array;

        x = billboard._color.x;
        y = billboard._color.y;
        z = billboard._color.z;
        w = billboard._color.w;
        this._rgbaArr = concatTypedArrays(this._rgbaArr, [
            x,
            y,
            z,
            w,
            x,
            y,
            z,
            w,
            x,
            y,
            z,
            w,
            x,
            y,
            z,
            w,
            x,
            y,
            z,
            w,
            x,
            y,
            z,
            w
        ]) as Float32Array;

        x = billboard._rotation;
        this._rotationArr = concatTypedArrays(this._rotationArr, [x, x, x, x, x, x]) as Float32Array;

        x = billboard._entity!._pickingColor.x / 255;
        y = billboard._entity!._pickingColor.y / 255;
        z = billboard._entity!._pickingColor.z / 255;
        this._pickingColorArr = concatTypedArrays(this._pickingColorArr, [
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z,
            x,
            y,
            z
        ]) as Float32Array;
    }

    public get billboards(): Billboard[] {
        return this._billboards;
    }

    public override refreshTexCoordsArr() {
        let bc = this._entityCollection;
        if (bc && this._renderer) {
            let ta = this._renderer.billboardsTextureAtlas;
            for (let i = 0; i < this._billboards.length; i++) {
                let bi = this._billboards[i];
                let img = bi.getImage();
                if (img) {
                    let imageNode = ta.get(img.__nodeIndex!);
                    if (imageNode) {
                        this.setTexCoordArr(bi._handlerIndex, imageNode.texCoords);
                    }
                }
            }
        }
    }
}

export { BillboardHandler };