From 31c45f4b05ea529f3c9be5b38b5cee1032c351e8 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alexander.rose@weirdbyte.de> Date: Sat, 20 Apr 2019 17:40:45 -0700 Subject: [PATCH] sync picking --- src/mol-canvas3d/canvas3d.ts | 22 ++++++++----------- src/mol-canvas3d/helper/interaction-events.ts | 4 ++-- src/tests/browser/render-shape.ts | 4 ++-- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 358c5d390..4b306554c 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -57,7 +57,7 @@ interface Canvas3D { requestDraw: (force?: boolean) => void animate: () => void pick: () => void - identify: (x: number, y: number) => Promise<PickingId | undefined> + identify: (x: number, y: number) => PickingId | undefined mark: (loci: Representation.Loci, action: MarkerAction) => void getLoci: (pickingId: PickingId) => Representation.Loci @@ -263,7 +263,8 @@ namespace Canvas3D { } } - async function identify(x: number, y: number): Promise<PickingId | undefined> { + const readBuffer = new Uint8Array(4) + function identify(x: number, y: number): PickingId | undefined { if (isIdentifying) return pick() // must be called before setting `isIdentifying = true` @@ -273,27 +274,22 @@ namespace Canvas3D { y *= webgl.pixelRatio y = canvas.height - y // flip y - const buffer = new Uint8Array(4) const xp = Math.round(x * pickScale) const yp = Math.round(y * pickScale) objectPickTarget.bind() - // TODO slow in Chrome, ok in FF; doesn't play well with gpu surface calc - // await webgl.readPixelsAsync(xp, yp, 1, 1, buffer) - webgl.readPixels(xp, yp, 1, 1, buffer) - const objectId = decodeFloatRGB(buffer[0], buffer[1], buffer[2]) + webgl.readPixels(xp, yp, 1, 1, readBuffer) + const objectId = decodeFloatRGB(readBuffer[0], readBuffer[1], readBuffer[2]) if (objectId === -1) { isIdentifying = false; return; } instancePickTarget.bind() - // await webgl.readPixelsAsync(xp, yp, 1, 1, buffer) - webgl.readPixels(xp, yp, 1, 1, buffer) - const instanceId = decodeFloatRGB(buffer[0], buffer[1], buffer[2]) + webgl.readPixels(xp, yp, 1, 1, readBuffer) + const instanceId = decodeFloatRGB(readBuffer[0], readBuffer[1], readBuffer[2]) if (instanceId === -1) { isIdentifying = false; return; } groupPickTarget.bind() - // await webgl.readPixelsAsync(xp, yp, 1, 1, buffer) - webgl.readPixels(xp, yp, 1, 1, buffer) - const groupId = decodeFloatRGB(buffer[0], buffer[1], buffer[2]) + webgl.readPixels(xp, yp, 1, 1, readBuffer) + const groupId = decodeFloatRGB(readBuffer[0], readBuffer[1], readBuffer[2]) if (groupId === -1) { isIdentifying = false; return; } isIdentifying = false diff --git a/src/mol-canvas3d/helper/interaction-events.ts b/src/mol-canvas3d/helper/interaction-events.ts index 4267ecf0a..394b6b9f7 100644 --- a/src/mol-canvas3d/helper/interaction-events.ts +++ b/src/mol-canvas3d/helper/interaction-events.ts @@ -38,9 +38,9 @@ export class Canvas3dInteractionHelper { private buttons: ButtonsType = ButtonsType.create(0); private modifiers: ModifiersKeys = ModifiersKeys.None; - private async identify(isClick: boolean, t: number) { + private identify(isClick: boolean, t: number) { if (this.lastX !== this.cX && this.lastY !== this.cY) { - this.id = await this.canvasIdentify(this.cX, this.cY); + this.id = this.canvasIdentify(this.cX, this.cY); this.lastX = this.cX; this.lastY = this.cY; } diff --git a/src/tests/browser/render-shape.ts b/src/tests/browser/render-shape.ts index adc6c9eae..124831af9 100644 --- a/src/tests/browser/render-shape.ts +++ b/src/tests/browser/render-shape.ts @@ -40,8 +40,8 @@ parent.appendChild(info) let prevReprLoci = Representation.Loci.Empty const canvas3d = Canvas3D.create(canvas, parent) canvas3d.animate() -canvas3d.input.move.subscribe(async ({x, y}) => { - const pickingId = await canvas3d.identify(x, y) +canvas3d.input.move.subscribe(({x, y}) => { + const pickingId = canvas3d.identify(x, y) let label = '' if (pickingId) { const reprLoci = canvas3d.getLoci(pickingId) -- GitLab