Skip to content

v0.13.3

Choose a tag to compare

@github-actions github-actions released this 14 May 08:52
· 253 commits to master since this release

Features

  • Unified picking: a single call now dispatches across all item types in the scene, controlled by a mask specifying what level of detail you want back -- whole objects, mesh faces, or individual point-like elements (vertices, cloud points, cells, voxels, splats) across all participating types at once. The renderer handles dispatch internally from the last rendered frame; no per-type dispatch is needed in host code.
    • The mask uses dimensional groups (object, point-like, edge-like, face-like) for the common cases, with individual element-type bits available when finer control is needed -- for example including mesh vertices but not volume cells.
    • Mesh face and vertex picking requires opting in to CPU data retention at upload time. This can be turned off later to free memory when picking is no longer needed.
    • Pick results can now identify individual elements in Gaussian splat sets, instanced items (glyphs, sprites, tensor glyphs), individual curve segments, and strips within multi-strip items.
  • Per-type picking extensions, adding support to item types that previously returned nothing when clicked:
    • Scalar volumes, Gaussian splat sets, and unstructured volume meshes now support both single-click and box-selection picking.
    • A helper returns the closest mesh vertex to a face-level click, for workflows that need to snap selection to vertices.
    • Selected volume mesh cells now highlight with the same edge-outline style as selected mesh faces and voxels, across tet, pyramid, wedge, and hex cell types.
    • Glyphs, tensor glyphs, and sprites now support click and box-selection picking.
    • Polylines now support click and box-selection picking for nodes, segments, and strips.
    • Streamtubes, tubes, and ribbons now support click and box-selection picking for segments and strips.
  • Selection highlight extensions:
    • Gaussian splat sets now show an object-level outline when selected. The outline traces the screen-space silhouette of the whole cloud and updates naturally as the camera moves. Color, opacity, and width follow the same per-frame outline controls that already apply to mesh outlines.
    • Selecting an individual Gaussian splat now shows a point marker at that splat's position.
    • Point clouds now show an object-level outline when selected. Set PointCloudItem::selected = true to enable it. The outline wraps the screen-space silhouette of the cloud using the same pipeline as the Gaussian splat outline.
    • Raw SceneRenderItem objects submitted outside the scene graph (e.g. the TVM boundary mesh) now support the outline highlight. Set SceneRenderItem::selected = true on the item; no renderer changes are needed since the outline pass already processes the full surface submission.
    • Volumes now show an object-level outline when selected. Set VolumeItem::selected = true; the renderer ray-marches the volume into the outline mask so the outline hugs the actual visible silhouette rather than the bounding box.
    • Volume meshes now forward their selection state automatically. Set VolumeMeshItem::selected = true and the outline pass picks it up without manually flagging the underlying SceneRenderItem.
    • Glyphs now show an object-level outline when selected. Set GlyphItem::selected = true; the outline renders the actual instanced mesh geometry (arrows, spheres) into the mask so it follows the glyph shape.
    • Polylines now show an object-level outline when selected. Set PolylineItem::selected = true.
    • Sprites now show an object-level outline when selected. Set SpriteItem::selected = true.
    • Streamtubes, tubes, and ribbons now show an object-level outline when selected. Set selected = true on any of the three item types.
    • Tensor glyphs now show an object-level outline when selected. Set TensorGlyphItem::selected = true.
  • VolumeMeshItem: a render item for opaque volume meshes that retains cell-level identity after upload. Wraps the MeshId and a face-to-cell mapping produced by upload_volume_mesh_data.

Fixes

  • Arrow glyphs had an invisible face where the cone head meets the shaft. The cone base cap was wound in the wrong direction and was culled by back-face culling.
  • The HDR rendering path appeared soft or pixelated on HiDPI and Retina displays. The render targets were sized at logical pixel resolution and then stretched to fill the physical surface. They now render at native resolution. Set CameraFrame::pixels_per_point to the given display's scale factor to enable this.
  • Clicking a polyline segment required hitting the exact midpoint to register. Segment picking now uses screen-space distance from the click to the full segment line, so a click anywhere along the segment (within half the line width plus a small slack) registers. Rectangular selection was also updated to test actual segment/rect intersection instead of checking whether the midpoint falls inside the rect.
  • Selected polyline nodes, segments, and strips showed no highlight geometry even though the pick correctly identified them. SubSelectionRef had no path to supply polyline positions to the highlight builder, so all three sub-object variants fell through silently. Added PolylineSelectionInfo, a polyline_lookup field on SubSelectionRef, and a with_polylines() builder. The highlight pass now renders node sprites for Point hits, a segment edge line for Segment hits, and all edges in the strip for Strip hits. Point hits on point clouds (which share the same SubObjectRef variant) also now render a sprite.
  • Opaque volume meshes submitted via VolumeMeshItem did not return SubObjectRef::Cell hits from renderer.pick() or renderer.pick_rect() when using the unified picking API with the POINT_LIKE or CELL mask. The stubs that were meant to implement face-to-cell conversion in the surface mesh picking loop are now wired up: the renderer builds a lookup from the face_to_cell maps retained in pick_volume_mesh_items and converts each surface Face hit to the originating Cell index. Rectangular selection deduplicates cells so each cell appears at most once even when multiple boundary triangles project into the rect.
  • Selecting a single point cloud point or Gaussian splat showed no highlight. Only whole-set object selection triggered the outline pass; a single selected element was invisible. Individual selected points and splats now show an outline disc sized to match the rendered point or splat.
  • Selecting a single glyph, tensor glyph, or sprite instance showed no highlight. Only whole-group object selection triggered the outline pass; a single selected element was invisible. Individual selected instances now show an outline matching the actual glyph or sprite shape.
  • Glyph and tensor glyph outlines rendered as circles that didn't match the actual mesh shape and shrank incorrectly when viewed across the X axis. Replaced the screen-space disc approach with instanced mesh rendering into the outline mask, so outlines now follow the actual arrow and ellipsoid geometry.
  • Selecting only glyphs or tensor glyphs (without any mesh selection) did not show the outline. The outline composite pass only checked for mesh, splat, and volume outlines when deciding whether to blit; glyph and tensor glyph indices are now included in that check.
  • Selection outlines disappeared behind volumes and other translucent scene content. The outline composite ran before scivis draw calls in the LDR path; moved it to after all scene content so outlines are always visible.
  • Selecting a glyph or tensor glyph alongside a mesh caused a crash (Buffer is bound with size 80 where the shader expects 96). The splat outline mask uniform shared a bind group layout with the mesh outline uniform but was 16 bytes smaller. Padded to 96 bytes to match.
  • Gaussian splat unified picking used a fixed 8px hit radius, requiring a click near the exact center of each splat. The radius is now derived from the uploaded splat scales so a click anywhere inside the visible disc registers.
  • Selecting a splat sub-element in point-like mode also triggered the whole-cloud object outline. Sub-element and object-level highlights are now independent.
  • Wireframe mode drew all instances of a shared mesh with the same object uniform, so objects sharing a MeshId appeared at the same position. Each item now gets its own bind group in the wireframe pass.
  • Add display_center to ClipShape::Plane overlay to allow arbitrary placement.
  • Fix clip planes as applied to VolumeItem objects. Problem was in the applied transformation matrix.
  • Point clouds, volumes, polylines, glyphs, sprites, streamtubes, ribbons, image slices, tensor glyphs, implicit surfaces, and marching cubes surfaces crashed when used alongside post-processing, transparent volume meshes, or surface LIC. All scene content now renders correctly in both the HDR and LDR paths.
  • Gaussian splats were silently invisible when post-processing was enabled. They now render in HDR frames.
  • Add STORAGE usage flag to mesh vertex and index buffers so they can be bound as read-only storage in the GPU compute filter pass.