Repository navigation
0.5.3 — Round-4 parity fixes
A regression release. A workspace-wide upstream-parity audit (silx / PyDM /
adl2pydm + MEDM C) found that three of the fixes 0.5.2 shipped were wrong, and
turned up ten further divergences from the reference behaviour. All are fixed
here. VolumeRaycaster users should upgrade: the volume it rendered in 0.5.2
carried no thickness cue and lost the hue of faint voxels.
Fixed — rsplot
- Volume opacity depends on the thickness a ray crosses again. 0.5.2's
"Beer-Lambert" correction divided by the step count, an exponent carrying no
world distance, so every ray accumulated the same transmittance whatever chord
it traversed: a uniform volume rendered as a flat silhouette, and at the
default 256 steps the correction was exactly the identity. Each sample is now
corrected from a reference spacing (box_diagonal / 256, a world distance),
which keeps the step-count invariance 0.5.2 was after while restoring the
density cue. A ray crossing the full box diagonal at the default step count
renders exactly as before. - Faint voxels keep their colour. The premultiplied 3-D texture 0.5.2
introduced stored the productrgb · ain 8 bits, and the shader must divide
the coverage back out to recover the straight colour — a product that at
coveragearesolves the quotient only to steps of1/a. An authored
(255, 128, 0)voxel ata = 3/255read back as(255, 170, 0); at
a = 1/255no hue survived at all. The texture is nowRgba16Float, which
carries the straight colour exactly at every coverage while the filter still
interpolates premultiplied colour (no return of the dark fringe). This
doubles the volume texture's VRAM. VolumeRaycaster::removeno longer blanks another view. Two views sharing
aVolumeIdshare one texture, by design;removefreed it outright, so the
survivor silently rendered nothing. The texture is now claim-counted and lives
exactly as long as the views holding its id. Dropping a view releases its
claim too, so aVolumeRaycasterthat is simply dropped no longer pins its
VRAM for the app's lifetime.- Alt+Wheel zooms X only and Shift+Wheel zooms Y/Y2 only, the silx bindings
the axes menu already advertised. Plain wheel and keep-aspect are unchanged. - Middle-button drag pans in every interaction mode, as in silx. The
existing right-button pan is kept. - The Reset-Zoom toolbar button disables when neither axis autoscales, and
its tooltip names the single autoscaling axis when exactly one is on. - Programmatic
set_limitsand toolbar Zoom-In/Out repair their limits.
Inverted, degenerate or float32-overflowing ranges reached the transform
unrepaired; every view-limits commit now runs the same clamp, including the
Y2 and extra-axis paths. - The colormap dialog's histogram drops samples equal to the range maximum,
asHistogramnddoes with its default half-open last bin. ScatterBINNED_STATISTIC drops points on the max edge instead of
clamping them into the last bin, matchingscipy.stats.binned_statistic_2d
as silx calls it. A degenerate extent now admits no point rather than
collapsing every point into bin 0.
Fixed — rsdm
calc://re-evaluates when a child connects or disconnects. PyDM
re-emits on a connection-state change; rsdm only watched values.calc://no longer retriggers on a child's alarm or metadata change, only
on an actual value change, as PyDM'supdatelist specifies.- A
dialect = medmexpression reading operandIorJre-evaluates on an
alarm status / severity change. MEDM'ssetDynamicAttrMonitorFlagsadds
monitorStatusChangedandmonitorSeverityChangedexactly when the
expression uses those operands. rsdm never watched severity, so a transition
left the calc showing a stale value, and it had no alarm status to read at all
— operandIbound a constant0.0. Both are now monitored, and only when
the expression reads them.
Added — rsdm
ChannelState::statuscarries the wire alarm status — the record'sSTAT
forca://, the pvAccessalarm.statusenum forpva://. It backs the MEDM
calc operandI.
Fixed — adl2rsdm
- Embedded-display and composite-file children take the host screen's
colormap. MEDM'sparseCompositeFileparses and discards the child file's
"color map"block and resolves the children'sclr/bclragainst the
parent display's palette; adl2rsdm used the child's own. Screens on the
default palette are unaffected; those with a custom palette rendered every
embedded widget in the wrong colours. - An arc with no
pathspans 90°, not 360° — MEDM'screateDlArcdefault.
Changed — rsplot
- The volume 3-D texture is
Rgba16Floatrather thanRgba8Unorm, doubling its
VRAM. See the faint-voxel fix above for why an 8-bit texture cannot carry the
data. VolumeRaycasternow holds a clone of itsRenderState(a bundle ofArcs)
so it can release its texture claim on drop.