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[];
}