Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/max projection volume rendering less passes #16

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
c176d7c
feat: control volume rendering mode for MPI
seankmartin Feb 1, 2024
a4d6df9
chore: remove log
seankmartin Feb 1, 2024
91daa09
Merge branch 'master' into feature/max-projection-volume-rendering
seankmartin Feb 19, 2024
9b58687
feat: new buffer for max projection mode
seankmartin Feb 19, 2024
a2b7538
Draw to max mode
seankmartin Feb 20, 2024
79d4011
Close to being right but occluding existing
seankmartin Feb 20, 2024
12ba31a
Correct opacity during max mode
seankmartin Feb 20, 2024
94c6d91
fix: max projection mode with chunk vis
seankmartin Feb 20, 2024
553685b
fix: emit intensity does not break regular VR
seankmartin Feb 26, 2024
de7322a
feat(python): Add volume rendering mode
seankmartin Feb 26, 2024
d7c86fa
debug: Add temp debugging for max projection mode
seankmartin Feb 26, 2024
1b18bde
debug: use wireframe to turn on/off max debug
seankmartin Feb 26, 2024
7bcfbd0
debug: clear color on max debug
seankmartin Feb 26, 2024
0131817
debug: max
seankmartin Feb 27, 2024
2f89492
fix: modify per chunk max handling
seankmartin Feb 29, 2024
cff0f24
feat: attempt faster max projection calc
seankmartin Mar 1, 2024
70724b9
feat: emitIntensity for known cases
seankmartin Mar 7, 2024
39d667d
chore: remove debug max projection
seankmartin Mar 7, 2024
0ee7cbd
feat: max projection buffer not clear each layer
seankmartin Mar 7, 2024
35b9859
feat: single max projection copy operation, but odd renderign
seankmartin Mar 7, 2024
4ffe123
fix: dpeth writing allowed
seankmartin Mar 7, 2024
194c053
feat: add min projection
seankmartin Mar 8, 2024
5cc1eb1
fix: init newIntensity
seankmartin Mar 8, 2024
8a3158a
fix: min and max mode interaction
seankmartin Mar 11, 2024
1d670bd
feat: first pass at picking from max projection
seankmartin Mar 11, 2024
2803548
refactor: small change for clarity
seankmartin Mar 11, 2024
861f5b4
fix: working min projection mode
seankmartin Mar 12, 2024
d0cafae
fix: no gain in max/min VR modes
seankmartin Mar 12, 2024
3b34c3c
feat: multi-colour max projection with one picking buffer
seankmartin Mar 12, 2024
b0b3c64
experimental: move axis lines render for more visibility
seankmartin Mar 12, 2024
2e9ec44
chore: format and remove unused var
seankmartin Mar 12, 2024
f42a34a
Merge branch 'master' into feature/max-projection-volume-rendering-le…
seankmartin Mar 12, 2024
b5c3a47
fix: import errors
seankmartin Mar 12, 2024
696b2a1
chore: format
seankmartin Mar 12, 2024
5d4970d
chore: lint
seankmartin Mar 12, 2024
4eb1d38
refactor: consistency
seankmartin Mar 12, 2024
aadd379
docs: add VR Readme
seankmartin Mar 14, 2024
83d95fc
fix(Python): VR gain default 0
seankmartin Mar 14, 2024
daa1f89
chore: formatting
seankmartin Mar 14, 2024
6bfba63
chore(Python): format with latest ruff for GH actions
seankmartin Mar 14, 2024
6971865
chore(Python): format with new ruff for GH actions
seankmartin Mar 14, 2024
98d5658
fix: restore VR depth samples again, was linked to gain by accident
seankmartin Mar 14, 2024
f105b2a
fix(Python): remove experimental test
seankmartin Mar 14, 2024
aa8bb34
refactor: clean code to remove one copy pass
seankmartin Mar 14, 2024
2e24830
refactor: clearer check for VR mode in panel
seankmartin Mar 14, 2024
4692c2f
docs: clearer wording for VR
seankmartin Mar 14, 2024
7a96d28
fix: wireframe mode in 3D
seankmartin Mar 14, 2024
a1afc17
Merge branch 'master' into feature/max-projection-volume-rendering-le…
seankmartin Mar 18, 2024
c076c9c
docs: add clarifying comment to non-max picking
seankmartin Mar 19, 2024
e233fa9
docs: remove unused comment
seankmartin Mar 19, 2024
f59405e
review: fix VR mode name, clearer type check, correct buffer type, re…
seankmartin Mar 25, 2024
4e2eaaf
review(feat): handle old volume rendering JSON bool
seankmartin Mar 25, 2024
35bdccc
feat: support a default intensity in emitRGBA and emitRGB that can be…
seankmartin Mar 25, 2024
6579a32
chore: format
seankmartin Mar 25, 2024
e618910
feat(Python): backward compat support of volume rendering json key
seankmartin Mar 25, 2024
3725d11
feat: heuristic of first inverlp intensity
seankmartin Mar 28, 2024
7413f8d
feat: call emitIntensity for grayscale
seankmartin Mar 28, 2024
1fbbcf2
fix: allow user to override intensity for emitGrayscale
seankmartin Mar 28, 2024
55e2693
review: keep using old VR json key and extend allowed values
seankmartin Apr 1, 2024
bcccd68
review: Add a hasMaxProjection variable to avoid creating/clearing ma…
seankmartin Apr 1, 2024
48202f0
review: move max projection intensity update outside of userMain
seankmartin Apr 1, 2024
b209322
refactor: clearer min projection shader
seankmartin Apr 1, 2024
d36044b
fix: use last called invlerp, not first called, for greater speed
seankmartin Apr 1, 2024
ac92b57
docs: update VR docs to reflect invlerp change
seankmartin Apr 1, 2024
dcd3056
refactor(experimental): Use ternary operator in shader to set intensi…
seankmartin Apr 1, 2024
d4e73b5
fix: remove comparison between intensity for speed improvement
seankmartin Apr 1, 2024
949b5bf
fix: remove accidental variable setting
seankmartin Apr 1, 2024
01ec13f
feat: grayscale emits intensity = value by default
seankmartin Apr 1, 2024
2f3c193
revert: undo emit value in grayscale by default for consitency with o…
seankmartin Apr 1, 2024
b509227
fix(Python): remove accidental cast in bool_or_string funcion
seankmartin Apr 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion python/neuroglancer/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
PlaceEllipsoidTool, # noqa: F401
BlendTool, # noqa: F401
OpacityTool, # noqa: F401
VolumeRenderingTool, # noqa: F401
VolumeRenderingModeTool, # noqa: F401
VolumeRenderingGainTool, # noqa: F401
VolumeRenderingDepthSamplesTool, # noqa: F401
CrossSectionRenderScaleTool, # noqa: F401
Expand Down
6 changes: 6 additions & 0 deletions python/neuroglancer/json_wrappers.py
Original file line number Diff line number Diff line change
Expand Up @@ -481,3 +481,9 @@ def number_or_string(value):
if not isinstance(value, numbers.Real) and not isinstance(value, str):
raise TypeError
return value


def bool_or_string(value):
if not isinstance(value, (bool, str)):
raise TypeError
return value
11 changes: 6 additions & 5 deletions python/neuroglancer/viewer_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
TypedList,
TypedStringMap,
array_wrapper,
bool_or_string,
number_or_string,
optional,
text_type,
Expand Down Expand Up @@ -164,9 +165,9 @@ class OpacityTool(Tool):


@export_tool
class VolumeRenderingTool(Tool):
class VolumeRenderingModeTool(Tool):
__slots__ = ()
TOOL_TYPE = "volumeRendering"
TOOL_TYPE = "volumeRenderingMode"


@export_tool
Expand Down Expand Up @@ -554,11 +555,11 @@ def __init__(self, *args, **kwargs):
)
opacity = wrapped_property("opacity", optional(float, 0.5))
blend = wrapped_property("blend", optional(str))
volume_rendering = volumeRendering = wrapped_property(
"volumeRendering", optional(bool, False)
volume_rendering_mode = volumeRenderingMode = VolumeRendering = volume_rendering = (
wrapped_property("volumeRendering", optional(bool_or_string, False))
)
volume_rendering_gain = volumeRenderingGain = wrapped_property(
"volumeRenderingGain", optional(float, 1)
"volumeRenderingGain", optional(float, 0)
)
volume_rendering_depth_samples = volumeRenderingDepthSamples = wrapped_property(
"volumeRenderingDepthSamples", optional(float, 64)
Expand Down
65 changes: 49 additions & 16 deletions src/layer/image/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ import {
} from "#src/sliceview/volume/image_renderlayer.js";
import { trackableAlphaValue } from "#src/trackable_alpha.js";
import { trackableBlendModeValue } from "#src/trackable_blend.js";
import { TrackableBoolean } from "#src/trackable_boolean.js";
import { trackableFiniteFloat } from "#src/trackable_finite_float.js";
import type { WatchableValueInterface } from "#src/trackable_value.js";
import {
Expand All @@ -63,6 +62,10 @@ import { setClipboard } from "#src/util/clipboard.js";
import type { Borrowed } from "#src/util/disposable.js";
import { makeValueOrError } from "#src/util/error.js";
import { verifyOptionalObjectProperty } from "#src/util/json.js";
import {
trackableShaderModeValue,
VolumeRenderingModes,
} from "#src/volume_rendering/trackable_volume_rendering_mode.js";
import {
getVolumeRenderingDepthSamplesBoundsLogScale,
VOLUME_RENDERING_DEPTH_SAMPLES_DEFAULT_VALUE,
Expand All @@ -84,7 +87,6 @@ import {
addLayerControlToOptionsTab,
registerLayerControl,
} from "#src/widget/layer_control.js";
import { checkboxLayerControl } from "#src/widget/layer_control_checkbox.js";
import { enumLayerControl } from "#src/widget/layer_control_enum.js";
import { rangeLayerControl } from "#src/widget/layer_control_range.js";
import { makeMaximizeButton } from "#src/widget/maximize_button.js";
Expand Down Expand Up @@ -149,7 +151,7 @@ export class ImageUserLayer extends Base {
this.channelCoordinateSpace,
),
);
volumeRendering = new TrackableBoolean(false, false);
volumeRenderingMode = trackableShaderModeValue();

shaderControlState = this.registerDisposer(
new ShaderControlState(
Expand Down Expand Up @@ -208,7 +210,7 @@ export class ImageUserLayer extends Base {
this.sliceViewRenderScaleTarget.changed.add(
this.specificationChanged.dispatch,
);
this.volumeRendering.changed.add(this.specificationChanged.dispatch);
this.volumeRenderingMode.changed.add(this.specificationChanged.dispatch);
this.volumeRenderingDepthSamplesTarget.changed.add(
this.specificationChanged.dispatch,
);
Expand Down Expand Up @@ -268,18 +270,19 @@ export class ImageUserLayer extends Base {
this.volumeRenderingChunkResolutionHistogram,
localPosition: this.localPosition,
channelCoordinateSpace: this.channelCoordinateSpace,
mode: this.volumeRenderingMode,
}),
);
context.registerDisposer(
loadedSubsource.messages.addChild(volumeRenderLayer.messages),
);
context.registerDisposer(
registerNested((context, volumeRendering) => {
if (!volumeRendering) return;
registerNested((context, volumeRenderingMode) => {
if (volumeRenderingMode === VolumeRenderingModes.OFF) return;
context.registerDisposer(
this.addRenderLayer(volumeRenderLayer.addRef()),
);
}, this.volumeRendering),
}, this.volumeRenderingMode),
);
this.shaderError.changed.dispatch();
});
Expand All @@ -303,12 +306,32 @@ export class ImageUserLayer extends Base {
this.channelCoordinateSpace.restoreState(
specification[CHANNEL_DIMENSIONS_JSON_KEY],
);
this.volumeRendering.restoreState(specification[VOLUME_RENDERING_JSON_KEY]);
this.volumeRenderingGain.restoreState(
specification[VOLUME_RENDERING_GAIN_JSON_KEY],
verifyOptionalObjectProperty(
specification,
VOLUME_RENDERING_JSON_KEY,
(volumeRenderingMode) => {
if (typeof volumeRenderingMode === "boolean") {
this.volumeRenderingMode.value = volumeRenderingMode
? VolumeRenderingModes.ON
: VolumeRenderingModes.OFF;
} else {
this.volumeRenderingMode.restoreState(volumeRenderingMode);
}
},
);
verifyOptionalObjectProperty(
specification,
VOLUME_RENDERING_GAIN_JSON_KEY,
(volumeRenderingGain) =>
this.volumeRenderingGain.restoreState(volumeRenderingGain),
);
this.volumeRenderingDepthSamplesTarget.restoreState(
specification[VOLUME_RENDERING_DEPTH_SAMPLES_JSON_KEY],
verifyOptionalObjectProperty(
specification,
VOLUME_RENDERING_DEPTH_SAMPLES_JSON_KEY,
(volumeRenderingDepthSamplesTarget) =>
this.volumeRenderingDepthSamplesTarget.restoreState(
volumeRenderingDepthSamplesTarget,
),
);
}
toJSON() {
Expand All @@ -320,7 +343,7 @@ export class ImageUserLayer extends Base {
x[CROSS_SECTION_RENDER_SCALE_JSON_KEY] =
this.sliceViewRenderScaleTarget.toJSON();
x[CHANNEL_DIMENSIONS_JSON_KEY] = this.channelCoordinateSpace.toJSON();
x[VOLUME_RENDERING_JSON_KEY] = this.volumeRendering.toJSON();
x[VOLUME_RENDERING_JSON_KEY] = this.volumeRenderingMode.toJSON();
x[VOLUME_RENDERING_GAIN_JSON_KEY] = this.volumeRenderingGain.toJSON();
x[VOLUME_RENDERING_DEPTH_SAMPLES_JSON_KEY] =
this.volumeRenderingDepthSamplesTarget.toJSON();
Expand Down Expand Up @@ -458,12 +481,17 @@ const LAYER_CONTROLS: LayerControlDefinition<ImageUserLayer>[] = [
{
label: "Volume rendering (experimental)",
toolJson: VOLUME_RENDERING_JSON_KEY,
...checkboxLayerControl((layer) => layer.volumeRendering),
...enumLayerControl((layer) => layer.volumeRenderingMode),
},
{
label: "Gain (3D)",
toolJson: VOLUME_RENDERING_GAIN_JSON_KEY,
isValid: (layer) => layer.volumeRendering,
isValid: (layer) =>
makeCachedDerivedWatchableValue(
(volumeRenderingMode) =>
volumeRenderingMode === VolumeRenderingModes.ON,
[layer.volumeRenderingMode],
),
...rangeLayerControl((layer) => ({
value: layer.volumeRenderingGain,
options: { min: -10.0, max: 10.0, step: 0.1 },
Expand All @@ -472,7 +500,12 @@ const LAYER_CONTROLS: LayerControlDefinition<ImageUserLayer>[] = [
{
label: "Resolution (3D)",
toolJson: VOLUME_RENDERING_DEPTH_SAMPLES_JSON_KEY,
isValid: (layer) => layer.volumeRendering,
isValid: (layer) =>
makeCachedDerivedWatchableValue(
(volumeRenderingMode) =>
volumeRenderingMode !== VolumeRenderingModes.OFF,
[layer.volumeRenderingMode],
),
...renderScaleLayerControl(
(layer) => ({
histogram: layer.volumeRenderingChunkResolutionHistogram,
Expand Down
Loading
Loading