Skip to content

feat: Cornerstone3D 5.0 - #2748

Merged
wayfarer3130 merged 38 commits into
mainfrom
beta
Jun 8, 2026
Merged

feat: Cornerstone3D 5.0#2748
wayfarer3130 merged 38 commits into
mainfrom
beta

Conversation

@wayfarer3130

@wayfarer3130 wayfarer3130 commented May 31, 2026

Copy link
Copy Markdown
Collaborator

OHIF_REF: ohifohifupdateplaywightimgaes

Context

This PR merges the beta branch into main to ship Cornerstone3D 5.0. The branch has been baking for months as the 5.x line; merging here promotes it to a tagged GA release on the main line.

Merge — do not squash. History/merges from main must be preserved.

The CircleCI TEST_AND_RELEASE workflow now has a manual approval gate (HOLD_FOR_APPROVAL) between BUILD and NPM_PUBLISH, so the computed release version (5.0.0) can be reviewed in the CircleCI UI before anything is published to npm.

What's in 5.0

Rendering & viewports

Tools

Core / infra

CI hardening (in this PR's tail commits)

  • fix: resolve CI failures from audit and CodeQL alerts — bumps vitest / @vitest/browser-playwright to 4.1.8 to clear GHSA-2h32-95rg-cppp, switches example RNGs to crypto.getRandomValues / crypto.randomUUID, guards FrameOfReferenceSpecificAnnotationManager.addAnnotation against __proto__ / constructor / prototype keys, and replaces shell.exec in the example runner with spawnSync + args array.
  • ci: add manual approval gate before npm publish — new HOLD_FOR_APPROVAL job in .circleci/config.yml so 5.0.0 only ships once explicitly approved.

Release version

Per version.mjs, merging into main with current packages/core/package.json at 5.0.0-beta.3 resolves to 5.0.0 (both semver.inc(..., 'patch') and semver.inc(..., 'minor') collapse a prerelease to its base release). The approval gate above guards this.

Docs

Testing

  • Unit, Playwright (legacy + compatibility + next), CodeQL, format check, codemod registry, and docusaurus build are all expected green on the head commit.
  • OHIF downstream validation runs against this PR head and may stay marked as an informational signal — it is not a blocker for the merge.
  • After approving HOLD_FOR_APPROVAL, verify the v5.0.0 tag and that @cornerstonejs/* packages publish at 5.0.0 on npm.

Checklist

  • PR title follows semantic-release conventions (the merge commit will be a regular merge, not a squash).
  • CI green except for OHIF downstream (informational).
  • CircleCI release is gated behind manual approval.

sedghi and others added 30 commits February 27, 2026 13:22
* bump version

* bump version [BUMP BETA MAJOR]
Update beta 20260317
The ohif downstream only has the specific issues that are known to occur on that backend, so merging
* feat: Add metadata module to single-source metadata

* Revert some of hte changes to dicom image loader in favour of deprecation

* Undo change

* Move unit tests to metadata package

* Revert changes to adapters

* Revert unneeded changes

* Update metadata module to use AsyncDicomListener format

* fix: Add unit test

* Add metadata provider and init for the new metadata function

* Split module lists

* update metadata versoin

* Move audit to end so build steps are viewable

* fix: Audit last

* fix lock file mismatch

* fix: metadata reference

* fix: Link to metadata

* fix: Move audit to a single build to allow overall PR status

Previously the audit happened early and multiple times, causing issues
when the audit failures were unrelated to other changes.

* fix: Unused components, add ecg module

* Remove subdirectory import

* fix: ecg module

* Remove unused lower camel case reader

* Switch new/old flag to be useLegacyMetadataProvider

* Add metadata module for github builds

* useLegacyMetadataProvider for the karma tests needing it

* Add legacy module name

* PR comments

* fix: Wado URI test

* Update version

* Missing PR rename issue

* Fix init/register options to allow registering new provider

    This explains the differences between the legacy/default metadata
        provider and the data loaders themselves, which still need
	    registering.

* Add rebuild:canvas command to fix missing canvas

* fix: Update way that loadImage functions with naturalized data

* Cleaner listener design/setup and pas (more) tests

* fix: loadImage with metadata module

* fix: Transfer syntax return as string

* fix: Wrong load image was getting used

* Update the register to clear data

* Store worker log to loglevel

* fix: Various karma tests

* fix: Remaining karma issues

* fix: Scaling data unit tests weren't running correctly

* Use fixed page size to make tests run consistently.

* Set size for consistency

* docusaurus build issues

* Build fixes

* Version fix

* Update to include metadata module

* Include metadata module in circleci config

* fix: Build when linked

* fix: workspace dependency to allow yarn 1.x

* Update package module for adapters build

* Try to fix adapters build issue

* Export suv scaling factor

* Update bun version to push an update

* Link suv module specifically

* fix: Merge issues

* bun lock

* Make node directory if it doesn't exist

* fix: Add migration guide and remove prebuild:esm

* Rename natural to naturalizedMetadata

* More renames natural => naturalized

* PR review comments

* Push test versoin

* Run against master instead of beta

* Rerun tests

* fix: Allow lower ohif_ref for reference

* Invalid image position for PT and some positions with parent position

* Kick updated build

* PR comments to use a separate pipeline for the add handling

* fix: Aspect ratio - merge had gone bad and undo missed changes

* fix: Unintended merge

* Only remove imageId prefix if there are at least two schemes

* PR review comment fixes

* Create @corenrstonejs/utils package with initial contents

* fix: install

* Use load local instead of upload

* Fix karma tests

* fix: Build issues

* fix: Types on toNumber

* fix: ohif-downstream to use build:esm

* toNumber

* Force retest

* Change to allow 120 minutes for CS3D playwright tests

* Update retries to match OHIF

* Upload playwright results on failure

* fix: Add utils path

* Rename addPart10Instance

* Remove cache warm up in utils

* Fix function rename

* PR comments - use enum values instead of literals.
- Keep beta version 5.0.0-beta.2 for all package versions
- Incorporate 4.22.8 (security) and 4.22.9 (angle tool fix) changelog entries
- Update @babel/preset-env to 7.29.5 from main security update
- Retain @babel/plugin-transform-typescript 7.28.6 from beta

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…60526

Update/beta from main 20260526
Still has a couple of playwright bugs to resolve, but these will be done in the viewports pr
sedghi and others added 2 commits May 27, 2026 17:06
* feat: pnpm 11 build/install for cs3d

* Format check runs at root level rather than in each package

* Enable corepack detection of pnpm version

* Fix audit issue

* ohif-downstream build issue

* Update to beta.3 for pnpm

* Update beta 3 in pnpm lock

* Re-run test on updated OHIF

* Fix pnpm build based on merge commit

* Fix link/unlik

* Fixes for linking

* fix cs3d link with ohif

* ci: pin Node 24 and bump pnpm to 11.4.0

playwright.yml's matrix had regressed to Node 20 during the beta merge, but
pnpm 11 requires Node >=22.13 (uses node:sqlite), so installs crashed with
ERR_UNKNOWN_BUILTIN_MODULE. Restore Node 24 everywhere and move pnpm 11.1.1 ->
11.4.0 across all workflows and packageManager.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: drop exact packageManager pin, rely on engines pnpm>=11

The packageManager: pnpm@11.4.0 pin forced pnpm's precise-version auto-switch,
which broke commits for anyone whose local pnpm couldn't fetch that exact build.
engines.pnpm ">=11" is sufficient; CI still pins 11.4.0 via pnpm/action-setup.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: restore packageManager pnpm pin for nested-repo corepack

CS3D lives inside the OHIF repo, whose package.json pins packageManager: yarn.
With corepack enabled, dropping CS3D's own packageManager field makes corepack
walk up and resolve yarn for CS3D, breaking the pnpm-based husky hook. Pin pnpm
here so corepack uses (and auto-fetches) pnpm for this workspace.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(ohif-downstream): install OHIF with bun, not pnpm

OHIF is a bun/yarn project checked out inside this pnpm workspace. Installing
it with pnpm walks up to this repo's pnpm-workspace.yaml (node-linker: hoisted)
and produces a mixed node_modules where OHIF's jest and CS3D's jest copies get
tangled, so jest-runner resolves to a different instance than @jest/core ->
"Cannot read properties of undefined (reading 'leakDetector')".

Install/run the OHIF side with bun (its native package manager) so it gets a
self-contained node_modules. Adds a Set up Bun step; CS3D's own install/build
stay on pnpm.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Update bun lock

* frozen workfiles

* Move frozen lockfile flag to pnpm-workspace.yaml

* lock

* Rerun build, resetting ohif-downstream to default

* fix: unit test run

* Fix chrome headless run for karma tests

* Update tmp 0.2.6 to resolve the high severity issue

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Joe Boccanfuso <joe.boccanfuso@radicalimaging.com>
@wayfarer3130
wayfarer3130 requested a review from sedghi May 31, 2026 13:54

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.

Tip: disable this comment in your organization's Code Review settings.

@coderabbitai

coderabbitai Bot commented May 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 296 files, which is 146 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 8ec522f7-002c-41ea-8cc8-cf35305af3fa

📥 Commits

Reviewing files that changed from the base of the PR and between 6f7ce81 and 4cbe59d.

⛔ Files ignored due to path filters (4)
  • bun.lock is excluded by !**/*.lock
  • karma-baselines/compat/imageURI_64_64_0_20_1_1_0_scrolled.png is excluded by !**/*.png
  • karma-baselines/compat/imageURI_64_64_10_5_3_2_0.png is excluded by !**/*.png
  • karma-baselines/compat/volumeURI_100_100_10_1_1_1_0_scrolled.png is excluded by !**/*.png
📒 Files selected for processing (296)
  • .agents/skills/metadata-migration.md
  • .circleci/config.yml
  • .github/workflows/build-docs.yml
  • .github/workflows/docusaurus-build.yml
  • .github/workflows/format-check.yml
  • .github/workflows/ohif-downstream.yml
  • .github/workflows/playwright.yml
  • .github/workflows/publish-codemod-registry.yml
  • .github/workflows/test.yml
  • .github/workflows/validate-codemod-registry.yml
  • .gitignore
  • .husky/pre-commit
  • .npmrc
  • CHANGELOG.md
  • README.md
  • VOLUME_TEST_SLICE_LIMIT_PLAN.md
  • addOns/externals/dicom-microscopy-viewer/package.json
  • bunfig.toml
  • bunfig.update-lockfile.toml
  • commit.txt
  • docs/OHIF_DOWNSTREAM_FAILURE_INVESTIGATION.md
  • jest.config.base.js
  • karma-baselines/.gitkeep
  • karma.conf.js
  • lerna.json
  • nx.json
  • package.json
  • packages/adapters/CHANGELOG.md
  • packages/adapters/examples/segmentationExport/index.ts
  • packages/adapters/examples/segmentationStack/index.ts
  • packages/adapters/examples/segmentationVolume/index.ts
  • packages/adapters/jest.config.js
  • packages/adapters/package.json
  • packages/adapters/src/version.ts
  • packages/ai/CHANGELOG.md
  • packages/ai/package.json
  • packages/ai/src/version.ts
  • packages/codemods/README.md
  • packages/codemods/package.json
  • packages/codemods/registry/cornerstone3d/5/README.md
  • packages/codemods/registry/cornerstone3d/5/codemod.yaml
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/README.md
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/codemod.yaml
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/scripts/rendering-engine-viewport-accessors.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/tests/edge-existing-utilities-import/expected.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/tests/edge-existing-utilities-import/input.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/tests/negative-no-matching-accessors/expected.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/tests/negative-no-matching-accessors/input.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/tests/nested-stack-viewport/expected.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/tests/nested-stack-viewport/input.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/tests/positive-viewport-accessors/expected.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/tests/positive-viewport-accessors/input.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/tests/viewport-accessors/expected.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/tests/viewport-accessors/input.ts
  • packages/codemods/registry/cornerstone3d/5/generic-viewport/workflow.yaml
  • packages/codemods/registry/cornerstone3d/5/workflow.yaml
  • packages/codemods/scripts/validate-registry-packages.mjs
  • packages/core/CHANGELOG.md
  • packages/core/examples/dicomLoader/imageDropArea.ts
  • packages/core/examples/dicomLoader/index.ts
  • packages/core/examples/dicomLoader/logArea.ts
  • packages/core/examples/dynamicVolume/index.ts
  • packages/core/examples/ecg/index.ts
  • packages/core/examples/genericEcg/index.ts
  • packages/core/examples/genericMultiVolumeAPI/index.ts
  • packages/core/examples/genericStackAPI/index.ts
  • packages/core/examples/genericStackPosition/index.ts
  • packages/core/examples/genericVideo/index.ts
  • packages/core/examples/genericViewportScale/index.ts
  • packages/core/examples/genericWsi/index.ts
  • packages/core/examples/multiVolumeAPI/index.ts
  • packages/core/examples/multiVolumeCanvasToWorld/index.ts
  • packages/core/examples/polyDataActorAPI/index.ts
  • packages/core/examples/programaticPanZoom/index.ts
  • packages/core/examples/stackAPI/index.ts
  • packages/core/examples/stackBasic/index.ts
  • packages/core/examples/stackCanvasToWorld/index.ts
  • packages/core/examples/stackEvents/index.ts
  • packages/core/examples/stackPosition/index.ts
  • packages/core/examples/stackProperties/index.ts
  • packages/core/examples/stackToVolumeFusion/index.ts
  • packages/core/examples/stackVoiSigmoid/index.ts
  • packages/core/examples/stacktovolume/index.ts
  • packages/core/examples/video/index.ts
  • packages/core/examples/viewportProjection/index.ts
  • packages/core/examples/volumeAPI/index.ts
  • packages/core/examples/volumeBasic/index.ts
  • packages/core/examples/volumeBasicWadoUri/index.ts
  • packages/core/examples/volumeEvents/index.ts
  • packages/core/examples/volumeLarge/index.ts
  • packages/core/examples/volumePosition/index.ts
  • packages/core/examples/volumePriorityLoading/index.ts
  • packages/core/examples/volumeViewport3D/index.ts
  • packages/core/examples/volumeVoiSigmoid/index.ts
  • packages/core/examples/wadouri/index.ts
  • packages/core/examples/webGLContextPooling/index.ts
  • packages/core/examples/webLoader/index.ts
  • packages/core/examples/wsi/index.ts
  • packages/core/jest.config.js
  • packages/core/package.json
  • packages/core/src/RenderingEngine/BaseRenderingEngine.ts
  • packages/core/src/RenderingEngine/BaseVolumeViewport.ts
  • packages/core/src/RenderingEngine/CanvasActor/CanvasMapper.ts
  • packages/core/src/RenderingEngine/CanvasActor/CanvasProperties.ts
  • packages/core/src/RenderingEngine/CanvasActor/index.ts
  • packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts
  • packages/core/src/RenderingEngine/ECGViewport.ts
  • packages/core/src/RenderingEngine/GenericViewport/DefaultRenderPathResolver.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/CanvasECGRenderPath.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/DefaultECGDataProvider.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/ECGProjectionTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/ECGRenderPathResolver.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/ECGResolvedView.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/ECGViewport.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/ECGViewportLegacyAdapter.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/ECGViewportTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/ecgProjectionAdapter.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/ecgProjectionPresentation.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/ecgProjectionSnapshot.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/ecgViewportCamera.ts
  • packages/core/src/RenderingEngine/GenericViewport/ECG/index.ts
  • packages/core/src/RenderingEngine/GenericViewport/GenericViewport.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/CpuImageSliceRenderPath.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/CpuVolumeSliceRenderPath.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/DefaultPlanarDataProvider.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarCPUScalarViewportSampler.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarCPUVolumeSampler.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarLegacyCompatibilityController.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarMountedData.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarProjectionTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarRenderPathDecisionService.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarRenderPathResolver.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarResolvedView.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarViewReferenceController.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarViewport.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarViewportLegacyAdapter.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/PlanarViewportTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/VtkImageMapperRenderPath.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/VtkVolumeSliceRenderPath.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/buildPlanarActorEntry.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/index.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarActorCompatibility.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarAdapterCoordinateTransforms.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarCPUVolumeSamplingUtils.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarCameraScale.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarCpuImageTransforms.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarCpuViewportMath.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarImageEvents.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarLegacyCompatibility.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarMath.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarOrientationVectors.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarProjectionAdapter.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarProjectionFallback.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarProjectionPresentation.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarProjectionSnapshot.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarRenderCamera.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarRenderPathProjection.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarRenderPathSelector.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarRuntimeTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarSliceBasis.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarViewPresentation.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarViewReference.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarViewState.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarVolumePresentation.ts
  • packages/core/src/RenderingEngine/GenericViewport/Planar/planarVolumeSliceBlendMode.ts
  • packages/core/src/RenderingEngine/GenericViewport/ResolvedViewportView.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/DefaultVideoDataProvider.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/HtmlVideoRenderPath.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/VideoProjectionTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/VideoRenderPathResolver.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/VideoResolvedView.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/VideoViewport.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/VideoViewportLegacyAdapter.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/VideoViewportTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/index.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/videoProjectionAdapter.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/videoProjectionPresentation.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/videoProjectionSnapshot.ts
  • packages/core/src/RenderingEngine/GenericViewport/Video/videoViewportCamera.ts
  • packages/core/src/RenderingEngine/GenericViewport/ViewportArchitectureTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/ViewportCameraTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/ViewportProjectionTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/DefaultVolume3DDataProvider.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/Volume3DProjectionTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/Volume3DRenderPathResolver.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/Volume3DResolvedView.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/VolumeViewport3DLegacyAdapter.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/VtkGeometry3DRenderPath.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/VtkVolume3DRenderPath.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/applyVolume3DCamera.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/index.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/viewport3D.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/viewport3DTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/volume3DProjectionAdapter.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/volume3DProjectionCamera.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/volume3DProjectionPresentation.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/volume3DProjectionSnapshot.ts
  • packages/core/src/RenderingEngine/GenericViewport/Volume3D/vtkVolume3DInitialCamera.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/DefaultWSIDataProvider.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/DicomMicroscopyRenderPath.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/WSIProjectionTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/WSIRenderPathResolver.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/WSIResolvedView.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/WSIViewport.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/WSIViewportLegacyAdapter.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/WSIViewportTypes.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/index.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/wsiProjectionAdapter.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/wsiProjectionPresentation.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/wsiProjectionSnapshot.ts
  • packages/core/src/RenderingEngine/GenericViewport/WSI/wsiTransformUtils.ts
  • packages/core/src/RenderingEngine/GenericViewport/genericViewportDataSetAccess.ts
  • packages/core/src/RenderingEngine/GenericViewport/genericViewportReferenceCompatibility.ts
  • packages/core/src/RenderingEngine/GenericViewport/index.ts
  • packages/core/src/RenderingEngine/GenericViewport/setVtkCameraClippingRange.ts
  • packages/core/src/RenderingEngine/GenericViewport/viewportProjection.ts
  • packages/core/src/RenderingEngine/RenderingEngine.ts
  • packages/core/src/RenderingEngine/StackViewport.ts
  • packages/core/src/RenderingEngine/TiledRenderingEngine.ts
  • packages/core/src/RenderingEngine/VideoViewport.ts
  • packages/core/src/RenderingEngine/Viewport.ts
  • packages/core/src/RenderingEngine/VolumeViewport.ts
  • packages/core/src/RenderingEngine/WSIViewport.ts
  • packages/core/src/RenderingEngine/helpers/addVolumesToViewports.ts
  • packages/core/src/RenderingEngine/helpers/cpuFallback/colors/colormap.ts
  • packages/core/src/RenderingEngine/helpers/cpuFallback/colors/index.ts
  • packages/core/src/RenderingEngine/helpers/cpuFallback/rendering/calculateTransform.ts
  • packages/core/src/RenderingEngine/helpers/cpuFallback/rendering/renderPseudoColorImage.ts
  • packages/core/src/RenderingEngine/helpers/createVolumeSliceActor.ts
  • packages/core/src/RenderingEngine/helpers/getCameraVectors.ts
  • packages/core/src/RenderingEngine/helpers/planarImageRendering.ts
  • packages/core/src/RenderingEngine/helpers/planarVolumeRendering.ts
  • packages/core/src/RenderingEngine/helpers/resolveViewportVolumeId.ts
  • packages/core/src/RenderingEngine/helpers/setDefaultVolumeVOI.ts
  • packages/core/src/RenderingEngine/helpers/setVolumesForViewports.ts
  • packages/core/src/RenderingEngine/helpers/stats/RenderModesPanel.ts
  • packages/core/src/RenderingEngine/helpers/stats/StatsOverlay.ts
  • packages/core/src/RenderingEngine/helpers/stats/constants.ts
  • packages/core/src/RenderingEngine/helpers/stats/enums.ts
  • packages/core/src/RenderingEngine/helpers/stats/types.ts
  • packages/core/src/RenderingEngine/helpers/supportsVolumeCompatibilityApi.ts
  • packages/core/src/RenderingEngine/helpers/viewportTypeToViewportClass.ts
  • packages/core/src/RenderingEngine/helpers/viewportTypeUsesCustomRenderingPipeline.ts
  • packages/core/src/RenderingEngine/helpers/vtkCanvasCoordinateTransforms.ts
  • packages/core/src/RenderingEngine/index.ts
  • packages/core/src/RenderingEngine/vtkClasses/index.js
  • packages/core/src/RenderingEngine/vtkClasses/vtkSharedImageResliceMapper.js
  • packages/core/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLImageResliceMapper.js
  • packages/core/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLViewNodeFactory.js
  • packages/core/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js
  • packages/core/src/cache/cache.ts
  • packages/core/src/cache/classes/BaseStreamingImageVolume.ts
  • packages/core/src/cache/classes/ImageVolume.ts
  • packages/core/src/enums/CalibrationTypes.ts
  • packages/core/src/enums/MetadataModules.ts
  • packages/core/src/enums/ViewportType.ts
  • packages/core/src/getEnabledElement.ts
  • packages/core/src/index.ts
  • packages/core/src/init.ts
  • packages/core/src/loaders/ProgressiveRetrieveImages.ts
  • packages/core/src/loaders/cornerstoneMeshLoader.ts
  • packages/core/src/loaders/imageLoader.ts
  • packages/core/src/loaders/volumeLoader.ts
  • packages/core/src/metaData.ts
  • packages/core/src/types/Cornerstone3DConfig.ts
  • packages/core/src/types/EventTypes.ts
  • packages/core/src/types/IActor.ts
  • packages/core/src/types/ICamera.ts
  • packages/core/src/types/IEnabledElement.ts
  • packages/core/src/types/IImageCalibration.ts
  • packages/core/src/types/IViewport.ts
  • packages/core/src/types/IWSIViewport.ts
  • packages/core/src/types/ImagePlaneModule.ts
  • packages/core/src/types/MetadataModuleTypes.ts
  • packages/core/src/types/ViewportInputOptions.ts
  • packages/core/src/types/index.ts
  • packages/core/src/utilities/ECGUtilities.ts
  • packages/core/src/utilities/RLEVoxelMap.ts
  • packages/core/src/utilities/VideoUtilities.ts
  • packages/core/src/utilities/VoxelManager.ts
  • packages/core/src/utilities/WSIUtilities.ts
  • packages/core/src/utilities/buildMetadata.ts
  • packages/core/src/utilities/calculateSpacingBetweenImageIds.ts
  • packages/core/src/utilities/calibratedPixelSpacingMetadataProvider.ts
  • packages/core/src/utilities/clonePoint3.ts
  • packages/core/src/utilities/colormap.ts
  • packages/core/src/utilities/deepClone.ts
  • packages/core/src/utilities/genericMetadataProvider.ts
  • packages/core/src/utilities/genericViewportDataSetMetadataProvider.ts
  • packages/core/src/utilities/getAcquisitionPlaneOrientation.ts
  • packages/core/src/utilities/getClosestImageId.ts
  • packages/core/src/utilities/getClosestStackImageIndexForPoint.ts
  • packages/core/src/utilities/getPixelSpacingInformation.ts
  • packages/core/src/utilities/getScalingParameters.ts
  • packages/core/src/utilities/getVOIRangeFromWindowLevel.ts
  • packages/core/src/utilities/getViewportImageIds.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch beta

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread .github/workflows/playwright.yml Fixed
@wayfarer3130

Copy link
Copy Markdown
Collaborator Author

This also needs:
#2747
OHIF/Viewers#6043
and 7 integration tests still failing to be merged.

Comment thread utils/ExampleRunner/build-all-examples-cli.js Fixed
sedghi and others added 5 commits June 1, 2026 10:58
Bump vitest and @vitest/browser-playwright to 4.1.8 to clear the
critical GHSA-2h32-95rg-cppp advisory blocking the CircleCI checkout
job's security audit. Also address CodeQL findings introduced by the
viewport refactor diff: switch example RNGs to crypto APIs, guard the
annotation manager against prototype-polluting keys, and run rspack
via spawnSync with an args array instead of a shell-interpolated
string.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Insert a HOLD_FOR_APPROVAL job between BUILD and NPM_PUBLISH in the
TEST_AND_RELEASE workflow so the computed version can be reviewed and
approved in the CircleCI UI before any release is published.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sedghi sedghi changed the title Beta feat: Cornerstone3D 5.0 Jun 4, 2026
@wayfarer3130
wayfarer3130 merged commit aa68c90 into main Jun 8, 2026
16 checks passed
sedghi added a commit that referenced this pull request Jun 22, 2026
The GenericViewport (compat, ?type=next) render path produces a
deterministic sub-pixel resampling shift in the oblique reformat
viewport (~1% of pixels, visually identical) versus the baselines
captured in the 5.0 merge (#2748). Regenerate the three compat MPR
baselines to match current GenericViewport output. Legacy and next
suites are unaffected.
pedrokohler added a commit to pedrokohler/cornerstone3D that referenced this pull request Jun 25, 2026
…eate

Ported onto the Cornerstone3D 5.0 generic-viewport rearchitecture (cornerstonejs#2748),
which moved the stack labelmap sync into syncStackLabelmapActors.

Each scroll on a StackViewport with segmentations removed every labelmap
actor for the previous slice and created fresh VTK objects (vtkImageData +
backing TypedArray) for the new slice. vtk.js internal caches retain the
discarded objects, so the heap grows linearly while scrolling (~3.9 MB per
scroll with many segmentations) and is never reclaimed.

For the legacy StackViewport (which renders directly from each actor's
vtkImageData and does not track actors through the generic-viewport data
registry), reuse the existing actors on scroll: when no actor exactly
matches a slice's derived image id, swap a stale actor's underlying labelmap
image and origin in place via setDerivedImage /
updateVTKImageDataWithCornerstoneImage. Stale actors form a reuse pool that
is consumed at most once per derived image, so overlapping segments
(multiple labelmap groups on the same slice) cannot steal one another's
actor. Pooled actors not reused are removed, and brand-new actors are only
created when the pool is exhausted.

Registry-backed viewports (PlanarViewport and its legacy adapter, detected
via the presence of removeData) own their actors by dataId, so their
existing remove/recreate flow is preserved to avoid desyncing that state.

Also destructure callback out of addImages in StackViewport before the
spread, so the callback closure (which can reference a large vtkImageData)
is not persisted on the long-lived actor entry in the _actors map.

Made-with: Cursor
pedrokohler added a commit to pedrokohler/cornerstone3D that referenced this pull request Jun 25, 2026
Rewritten against the Cornerstone3D 5.0 labelmap rendering. The original
_needsTransferFunctionUpdate guard (and its segmentsHidden reference-equality
check) was removed in the 5.0 rearchitecture (cornerstonejs#2748), so the labelmap transfer
functions are now rebuilt unconditionally on every segmentation render.

setLabelmapColorAndOpacity runs for every labelmap actor on every render
(e.g. every scroll) and rebuilds the vtk color/opacity transfer functions and
invalidates the actor + mapper each time, even when nothing changed. With many
segmentations this produces hundreds of redundant transfer-function updates and
re-renders per scroll.

Compute the desired style first (color/opacity nodes, outline thickness,
visibility, image-slice flags) and compare a signature of it against the last
style applied to that actor. When identical, skip the vtk rebuild and the
actor/mapper invalidation entirely. Any change to colors, per-segment style,
segment visibility, outline config, or active/visibility state changes the
signature and forces a rebuild, so rendered output is unchanged. preLoad
consumers run a custom apply path and always rebuild.

Made-with: Cursor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants