Implement color picking

The previous topic: GPU picking demo

To start a discussion about it I suggest to write the next classes:

class Picker {
    private _renderTarget: BABYLON.RenderTargetTexture;
    private _selector: Selector;

    constructor() {}

    get selector(): Selector {
        return this._selector;
    }

    set selector(selector: Selector) {
        this._selector = selector;
    }

    public render(scene: BABYLON.Scene, camera: BABYLON.Camera): void {
        // code to render objects with unique colors
    }

    public pick(): BABYLON.PickingInfo[] {
        // code to select object using the selector class

        return selector.pick(this._renderTarget);
    }

    public createRenderTarget(): void {
        // code to create a render target

        // this._renderTarget = new BABYLON.RenderTargetTexture("picker", 1);
    }

    public removeRenderTarget(): void {
        this._renderTarget.dispose();
    }

    public resize(width: number, height: number): void {
        // code to resize the render target

        // this._renderTarget.resize(width, height);
    }
}

class RectSelector extends Selector {
    private _x: number;
    private _y: number;
    private _width: number;
    private _height: number;

    constructor(x?: number, y?: number, width?: number, height?: number) {
        super();
        // code to set the rect
    }

    public pick(renderTarget: BABYLON.RenderTargetTexture): BABYLON.PickingInfo[] {
        // code to pick objects using the rect
        return []
    }
}

class MaskSelector extends Selector {
    private _mask: BABYLON.Texture;

    constructor(mask: BABYLON.Texture) {
        super();
        this._mask = mask;
    }

    public set mask(mask: BABYLON.Texture) {
        this._mask = mask;
    }

    public pick(renderTarget: BABYLON.RenderTargetTexture): BABYLON.PickingInfo[] {
        // code to pick objects using the mask
        return []
    }
}

abstract class Selector {
    public abstract pick(renderTarget: BABYLON.RenderTargetTexture): BABYLON.PickingInfo[];
}
1 Like

I like the idea :slight_smile: