Skip to content

WebGL viewer hover/click readout reads frame 0 regardless of active movie frame #636

@mvdoc

Description

@mvdoc

Summary

The WebGL viewer's hover and click value indicators (#mouseover_value / #picked_value) always read the first frame (verts[0] for vertex data, textures[0] for volume data) — they do not update with the currently rendered frame for movie / time-series dataviews. This affects every dataview type (1D and 2D, vertex and volume) whenever a cortex.Vertex / cortex.Volume / cortex.Vertex2D / cortex.Volume2D has more than one frame.

This is a pre-existing issue, not introduced by #635 — the original 1D handler was already hardcoded to [0]. Surfaced by Codex review on that PR (cortex/webgl/resources/js/mriview.js:762-764 is the new 2D path; the old 1D code had the same pattern).

Reproduction

  1. Build a movie dataview, e.g.
    import numpy as np, cortex
    data = np.random.randn(20, n_voxels)  # 20 frames
    v = cortex.Volume(data, 'S1', 'fullhead')
    cortex.webgl.show(v)
  2. In the viewer, advance the frame via the movie UI (or viewer.setFrame(t) with t > 0).
  3. Hover or click on the brain. The displayed value is the value at frame 0 for that vertex / voxel, not the value at the currently rendered frame.

Where it lives

In cortex/webgl/resources/js/mriview.js, both handlers index [0] directly:

  • mousemove handler (vertex branch):
    return d.verts[0][hemiIdx].array[vertex]
  • mousemove handler (volume branch):
    return d.textures[0].image.data[mouse_index]
  • pick handler: same indexing in both branches.

The renderer, by contrast, uses DataView.setFrame() which advances this.frame and dispatches frame fframe and fframe+1 (with framemix for interpolation). See dataset.js VertexData.set / VolumeData.set.

Suggested fix

Replace the hardcoded [0] indexing with a frame derived the same way DataView.setFrame() does. Roughly:

const fframe = Math.floor(this.active.frame);
// vertex branch
return d.verts[fframe][hemiIdx].array[vertex];
// volume branch
return d.textures[fframe].image.data[mouse_index];

Edge cases to handle:

  • framemix > 0 (interpolation between frames). For the hover/click readout, displaying the value at the floor frame is probably fine — picking/hovering is discrete by design — but optionally we could lerp between fframe and (fframe+1) % frames by framemix for visual consistency with the rendered colormap.
  • Static (single-frame) data: fframe = 0 works as before.
  • Bounds check: fframe < d.verts.length / fframe < d.textures.length (should always be true if setFrame was called legitimately, but defensive).

Acceptance

  • Movie data: hover/click readout matches the rendered frame as you scrub the movie slider.
  • Static (1-frame) data: behavior unchanged.
  • Both 1D and 2D, vertex and volume, RGB stays hidden as today.

🤖 Filed as a follow-up from PR #635 review.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions