@@ -79,24 +79,29 @@ class LabelVolumeBrickMaterial(gfx.VolumeBasicMaterial):
7979 Colormap mode (baked into shader; frozen after construction).
8080 salt : int
8181 Hash seed for random mode.
82- render_mode : "iso_categorical" | "flat_categorical" | "gradient_debug" \
83- | "smooth_iso"
84- 3D render mode. ``gradient_debug`` renders abs(normalize(gradient))
85- as RGB (R=|X|, G=|Y|, B=|Z|); flat regions with no gradient show as
86- solid blue. Use to diagnose brick-boundary normal discontinuities.
87- ``smooth_iso`` uses a soft trilinear density field for bisection and
88- a 3x3x3 Sobel normal kernel for smooth curved shading.
82+ render_mode : str
83+ 3D render mode (``MultiscaleLabelsAppearance.render_mode``).
84+ ``gradient_debug`` renders abs(normalize(gradient)) as RGB (R=|X|,
85+ G=|Y|, B=|Z|); flat regions with no gradient show as solid blue.
86+ Use to diagnose brick-boundary normal discontinuities.
87+ ``smooth_iso`` shades the voxel-face surface with a smooth normal;
88+ ``smooth_geometry`` draws a smooth surface per label (both in
89+ ``cellier.label_smooth.wgsl``).
8990 ray_steps_per_voxel : float
9091 Ray-march samples per voxel of the drawn level, measured along the
9192 ray. Default is ``1.0``.
9293 render_planes_buffer : Buffer or None
9394 The visual's ``u_render_planes`` buffer, read in ``"plane"`` render
9495 mode. ``None`` gives the material one of its own with no plane.
96+ smooth_level : float
97+ ``MultiscaleLabelsAppearance.smooth_geometry_level``: where the
98+ ``smooth_geometry`` surface sits. Default ``0.5``.
9599 """
96100
97101 uniform_type : ClassVar [dict ] = dict (
98102 gfx .VolumeBasicMaterial .uniform_type ,
99103 ray_steps_per_voxel = "f4" ,
104+ smooth_level = "f4" ,
100105 )
101106
102107 def __init__ (
@@ -117,10 +122,12 @@ def __init__(
117122 outline_selection_texture : gfx .Texture | None = None ,
118123 ray_steps_per_voxel : float = 1.0 ,
119124 render_planes_buffer : Buffer | None = None ,
125+ smooth_level : float = 0.5 ,
120126 ** kwargs ,
121127 ) -> None :
122128 super ().__init__ (** kwargs )
123129 self .uniform_buffer .data ["ray_steps_per_voxel" ] = float (ray_steps_per_voxel )
130+ self .uniform_buffer .data ["smooth_level" ] = float (smooth_level )
124131 self .uniform_buffer .update_full ()
125132 self .render_planes_buffer = (
126133 render_planes_buffer
@@ -169,6 +176,19 @@ def ray_steps_per_voxel(self, value: float) -> None:
169176 self .uniform_buffer .data ["ray_steps_per_voxel" ] = float (value )
170177 self .uniform_buffer .update_full ()
171178
179+ @property
180+ def smooth_level (self ) -> float :
181+ """The field level of the ``smooth_geometry`` surface.
182+
183+ A uniform, so a change does not rebuild the shader.
184+ """
185+ return float (self .uniform_buffer .data ["smooth_level" ])
186+
187+ @smooth_level .setter
188+ def smooth_level (self , value : float ) -> None :
189+ self .uniform_buffer .data ["smooth_level" ] = float (value )
190+ self .uniform_buffer .update_full ()
191+
172192
173193# ---------------------------------------------------------------------------
174194# 3D shader
0 commit comments