|
@@ -11,6 +11,7 @@ import { WebGLContext } from '../../mol-gl/webgl/context';
|
|
|
import { GraphicsRenderVariant } from '../../mol-gl/webgl/render-item';
|
|
|
import { RenderTarget } from '../../mol-gl/webgl/render-target';
|
|
|
import { Vec3 } from '../../mol-math/linear-algebra';
|
|
|
+import { spiral2d } from '../../mol-math/misc';
|
|
|
import { decodeFloatRGB, unpackRGBAToDepth } from '../../mol-util/float-packing';
|
|
|
import { Camera, ICamera } from '../camera';
|
|
|
import { StereoCamera } from '../camera/stereo';
|
|
@@ -88,6 +89,7 @@ export class PickPass {
|
|
|
|
|
|
this.groupPickTarget.bind();
|
|
|
this.renderVariant(renderer, camera, scene, helper, 'pickGroup');
|
|
|
+ // printTexture(this.webgl, this.groupPickTarget.texture, { id: 'group' })
|
|
|
|
|
|
this.depthPickTarget.bind();
|
|
|
this.renderVariant(renderer, camera, scene, helper, 'depth');
|
|
@@ -111,6 +113,8 @@ export class PickHelper {
|
|
|
private pickHeight: number
|
|
|
private halfPickWidth: number
|
|
|
|
|
|
+ private spiral: [number, number][]
|
|
|
+
|
|
|
private setupBuffers() {
|
|
|
const bufferSize = this.pickWidth * this.pickHeight * 4;
|
|
|
if (!this.objectBuffer || this.objectBuffer.length !== bufferSize) {
|
|
@@ -138,6 +142,9 @@ export class PickHelper {
|
|
|
|
|
|
this.setupBuffers();
|
|
|
}
|
|
|
+
|
|
|
+ // TODO: make spiral size configurable
|
|
|
+ this.spiral = spiral2d(Math.ceil(this.pickScale * 5));
|
|
|
}
|
|
|
|
|
|
private syncBuffers() {
|
|
@@ -193,7 +200,7 @@ export class PickHelper {
|
|
|
this.dirty = false;
|
|
|
}
|
|
|
|
|
|
- identify(x: number, y: number, camera: Camera | StereoCamera): PickData | undefined {
|
|
|
+ private identifyInternal(x: number, y: number, camera: Camera | StereoCamera): PickData | undefined {
|
|
|
const { webgl, pickScale } = this;
|
|
|
if (webgl.isContextLost) return;
|
|
|
|
|
@@ -252,6 +259,13 @@ export class PickHelper {
|
|
|
return { id: { objectId, instanceId, groupId }, position };
|
|
|
}
|
|
|
|
|
|
+ identify(x: number, y: number, camera: Camera | StereoCamera): PickData | undefined {
|
|
|
+ for (const d of this.spiral) {
|
|
|
+ const pickData = this.identifyInternal(x + d[0], y + d[1], camera);
|
|
|
+ if (pickData) return pickData;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
constructor(private webgl: WebGLContext, private renderer: Renderer, private scene: Scene, private helper: Helper, private pickPass: PickPass, viewport: Viewport) {
|
|
|
this.setViewport(viewport.x, viewport.y, viewport.width, viewport.height);
|
|
|
}
|