WIP - the goal is to only build octrees on tiles
that are picked against. Beyond saving memory and worker time,
this allows us to conservatively rebuild octrees when
vertical exaggeration changes.
TODO: build the octree in a worker task, and fallback to
the default pick strategy while it's being built.
Fixes issue where show was true, but no tiles were selected, the old draw command would still be submitted.
Since splats are projected in view space, they still appeared whereever the camera was.
Rectifies some issues with orientation as the old spz-loader forced a rotation around the X axis. Related PrimitiveLoadPlan code removed, no longer needed.
Behavior ideally stays the same, but now we also call the loader
immediately on construction instead of waiting for the Update. This is
a prerequisite for an async Material factory constructor method.
Non-trivial logic reordering, but the core behavior should be the same.
Now we can call the image loader on construction, though, and store its promise,
which will be useful in the next commit for an async factory constructor.
Fixes handling of modelMatrix scaling. Needs more testing with data that has scales applied at the glTF and tileset transform levels.
Scaling was removed to fix issues with splat scales when a quantized asset had an embedded scale in the glTF node transform.
Removes old u_splatScale. Old uniform scale factor applied to splats independent of the model scale
- fixed testing urls to work with latest cesium
- fixed analyze-results to catch timing events properly
- eslintignored these testing scripts
- note: still requires shelljs and puppeteer to be manually installed
for me, not sure if worth adding for these scripts that i imagine
will be removed before merging
Fixed the PointCloudShading.normalShading parameter. Now it disables shading using normals if point cloud contains normals, but the parameter is set to false.
I can also just grab terrain exaggeration from the encoding because that is mutated on the fly.
That means I don't need FrameState anymore all the way at the top
much faster for arcgis at least. It was so easy as well haha, should've done that months ago
* hacked in a window flag to disable default pick strategy to feel performance with only octree picking, it's actually good.
saw the different results ~4 times (undefined from octree vs a result from the triangle searcher) while moving around a lot... not sure yet.
otherwise, ArcGIS terrain is working ok.
fixed all the position index look ups - it actually seems to somewhat work
moved to float 64 array - however it isn't accurate enough I don't think - so attempting to convert to position decoding
* updated sandcastle for manual testing with ArcGIS
* updated parse trace script to only print the latest result
* inlined addNodeTriangleToChildren and converted to using a bitmask rather than 8-ifs (not sure if this is faster yet)
* increased triangles per node to 100 and small overlap count to 3. This means - each node will store upto 100 triangles in it - and only triangles which are complete(?) contained within the node.. so we should end up with a small tree - which less duplication of triangles spread in the tree.
- put that into a log file
- runs with the TerrainMesh sandcastle in full-screen mode
- outputs the timings + all the opts/de-opts for relevant functions
"description": "Acidalia Planitia is a plain on Mars, between the Tharsis volcanic province and Arabia Terra to the north of Valles Marineris, centered at 49.8°N 339.3°E. Most of this region is found in the Mare Acidalium quadrangle, but a small part is in the Ismenius Lacus quadrangle. The plain contains the famous Cydonia region at the contact with the heavily cratered highland terrain.",
"description": "Alba Mons is a volcano located in the northern Tharsis region of the planet Mars. It is the biggest volcano on Mars in terms of surface area, with volcanic flow fields that extend for at least 1,350 km (840 mi) from its summit. Although the volcano has a span comparable to that of the United States, it reaches an elevation of only 6.8 km (22,000 ft) at its highest point.[6] This is about one-third the height of Olympus Mons, the tallest volcano on the planet.",
"description": "Arabia Terra is a large upland region in the north of Mars that lies mostly in the Arabia quadrangle, but a small part is in the Mare Acidalium quadrangle. It is densely cratered and heavily eroded. This battered topography indicates great age, and Arabia Terra is presumed to be one of the oldest terrains on the planet. It covers as much as 4,500 km (2,800 mi) at its longest extent, centered roughly at 21°N 6°E with its eastern and southern regions rising 4 km (13,000 ft) above the north-west. Alongside its many craters, canyons wind through the Arabia Terra, many emptying into the large northern lowlands of the planet, which borders Arabia Terra to the north.",
"description": "Elysium, located in the Elysium and Cebrenia quadrangles, is the second largest volcanic region on Mars, after Tharsis. The region includes the volcanoes (from north to south) Hecates Tholus, Elysium Mons and Albor Tholus. The province is centered roughly on Elysium Mons at 24.7°N 150°E. Elysium Planitia is a broad plain to the south of Elysium, centered at 3.0°N 154.7°E. Another large volcano, Apollinaris Mons, lies south of Elysium Planitia and is not part of the province. Besides having large volcanoes, Elysium has several areas with long trenches, called fossa or fossae (plural) on Mars.",
"description": "Curiosity is a car-sized Mars rover that is exploring Gale crater and Mount Sharp on Mars as part of NASA's Mars Science Laboratory (MSL) mission. Launched in 2011 and landed the following year, the rover continues to operate more than a decade after its original two-year mission. Mission goals include an investigation of the Martian climate and geology, an assessment of whether the selected field site inside Gale has ever offered environmental conditions favorable for microbial life (including investigation of the role of water), and planetary habitability studies in preparation for human exploration.",
"description": "Perseverance is a car-sized Mars rover designed to explore the Jezero crater on Mars as part of NASA's Mars 2020 mission. Perseverance has a similar design to its predecessor rover, Curiosity, although it was moderately upgraded. It carries seven primary payload instruments, nineteen cameras, and two microphones. The rover also carried the mini-helicopter Ingenuity to Mars, an experimental technology testbed that made the first powered aircraft flight on another planet on April 19, 2021.",
"description": "In the best-selling novel \"The Martian\" and the movie based on it, stranded astronaut Mark Watney's adventures take him to the rim of Mawrth Crater. The crater rim is not very distinct, and from the Martian surface it would be quite difficult to tell that you are even on the rim of a crater. The terrain is hummocky and rolling, punctuated by smaller impact craters and wind-blown drifts of sand or dust.",
"description": "Mawrth Vallis (Mawrth means \"Mars\" in Welsh) is a valley on Mars, located in the Oxia Palus quadrangle at 22.3°N, 343.5°E with an elevation approximately two kilometers below datum. Situated between the southern highlands and northern lowlands, the valley is a channel formed by massive flooding which occurred in Mars' ancient past. It is an ancient water outflow channel with light-colored clay-rich rocks.",
"description": "Olympus Mons is a large shield volcano on Mars. It is over 21.9 km high as measured by the Mars Orbiter Laser Altimeter (MOLA), about 2.5 times the elevation of Mount Everest above sea level. It is Mars's tallest volcano, its tallest planetary mountain, and is approximately tied with Rheasilvia on Vesta as the tallest mountain currently discovered in the Solar System. It is associated with the volcanic region of Tharsis Montes. It last erupted 25 million years ago.",
"description": "Opportunity, also known as MER-B (Mars Exploration Rover - B) or MER-1, and nicknamed Oppy, is a robotic rover that was active on Mars from 2004 until 2018. Opportunity was operational on Mars for 5111 sols (14 years, 138 days on Earth). Launched on July 7, 2003, as part of NASA's Mars Exploration Rover program, it landed in Meridiani Planum on January 25, 2004, three weeks after its twin, Spirit (MER-A), touched down on the other side of the planet. With a planned 90-sol duration of activity (slightly less than 92.5 Earth days), Spirit functioned until it got stuck in 2009 and ceased communications in 2010, while Opportunity was able to stay operational for 5111 sols after landing, maintaining its power and key systems through continual recharging of its batteries using solar power, and hibernating during events such as dust storms to save power. This careful operation allowed Opportunity to operate for 57 times its designed lifespan, exceeding the initial plan by 14 years, 47 days (in Earth time). By June 10, 2018, when it last contacted NASA, the rover had traveled a distance of 45.16 kilometers (28.06 miles).",
"description": "Schiaparelli is an impact crater on Mars, located near the planet's equator at latitude 3° south and longitude 344° in the Sinus Sabaeus quadrangle. It measures approximately 459 kilometers (285-miles) in diameter and was named after Italian astronomer Giovanni Schiaparelli. A crater within Schiaparelli shows many layers that may have formed by the wind, volcanoes, or deposition under water.",
"description": "The robotic Sojourner rover reached Mars on July 4, 1997 as part of the Mars Pathfinder mission. Sojourner was operational on Mars for 92 sols (95 Earth days), and was the first wheeled vehicle to operate on an astronomical object other than the Earth or Moon. The landing site was in the Ares Vallis channel in the Chryse Planitia region of the Oxia Palus quadrangle.",
"description": "Spirit, also known as MER-A (Mars Exploration Rover - A) or MER-2, is a Mars robotic rover, active from 2004 to 2010. Spirit was operational on Mars for 2208 sols or 3.3 Martian years (2269 days; 6 years, 77 days). It was one of two rovers of NASA's Mars Exploration Rover Mission managed by the Jet Propulsion Laboratory (JPL). Spirit landed successfully within the impact crater Gusev on Mars at 04:35 Ground UTC on January 4, 2004, three weeks before its twin, Opportunity (MER-B), which landed on the other side of the planet. Its name was chosen through a NASA-sponsored student essay competition. The rover got stuck in a \"sand trap\" in late 2009 at an angle that hampered recharging of its batteries; its last communication with Earth was on March 22, 2010.",
"description": "Terra Meridiani is a large plain straddling the equator of Mars. The plain sits on top of an enormous body of sediments that contains bound water. The iron oxide in the spherules is crystalline (grey) hematite (Fe2O3). The Meridiani Planum is one of the most thoroughly investigated regions of Mars. Many studies were carried out by the scientists involved with NASA's Mars Exploration Rover (MER) Opportunity.",
"description": "(Spoilers!) In the novel and movie The Martian, \"The Hab\" is a habitat on Mars, in Acidalia Planitia, where astronaut Mark Watney lives and works after being stranded there alone following a dust storm on Sol 18 of the Ares III mission.",
"description": "Valles Marineris (Latin for Mariner Valleys, named after the Mariner 9 Mars orbiter of 1971-72 which discovered it) is a system of canyons that runs along the Martian surface east of the Tharsis region. At more than 4,000 km (2,500 mi) long, 200 km (120 mi) wide and up to 7 km (23,000 ft) deep, Valles Marineris is the largest canyon in the Solar System.",
"description": "(Spoilers!) In the novel and movie The Martian, the \"Watney Triangle\" is a region of treacherous craters (Trouvelot, Becquerel, and Marth) that astronaut Mark Watney must traverse on his way to the Ares 4 landing site at Schiaparelli Crater.",
- Fixes Gaussian splats incorrectly rendering when `Cesium3DTileset.show` is `false`. [#12748](https://github.com/CesiumGS/cesium/pull/12748)
- Fixed depth testing bug with billboards and labels clipping through models [#13012](https://github.com/CesiumGS/cesium/issues/13012)
- Billboards using `imageSubRegion` now render as expected. [#12585](https://github.com/CesiumGS/cesium/issues/12585)
- Improved scaling of SVGs in billboards [#13020](https://github.com/CesiumGS/cesium/issues/13020)
- Fixed unexpected outline artifacts around billboards [#13038](https://github.com/CesiumGS/cesium/issues/13038)
## 1.131.1-ion.0 - 2025-07-17
#### Additions :tada:
- Added `scene.pickAsync` for non GPU blocking picking using WebGL2 [#12983](https://github.com/CesiumGS/cesium/pull/12983)
- Improves performance of terrain picks via new terrain picking quadtrees [#8481](https://github.com/CesiumGS/cesium/issues/8481)
## 1.135 - 2025-11-03
### @cesium/engine
#### Breaking Changes :mega:
- Removed support for the `KHR_spz_gaussian_splats_compression` extension in favor of the latest 3D Gaussian splatting extensions for glTF, `KHR_gaussian_splatting` and `KHR_gaussian_splatting_compression_spz_2`. Please re-tile existing Gaussian splatting 3D Tiles [#12837](https://github.com/CesiumGS/cesium/issues/12837)
- `scene.drillPick` now uses a breadth-first search strategy instead of depth-first. This may change which entities are picked when using large values of `width` and `height` when providing a `limit`, prioritizing entities closer to the camera. [#12916](https://github.com/CesiumGS/cesium/pull/12916)
#### Additions :tada:
- Added experimental support for loading 3D Tiles as terrain, via `Cesium3DTilesTerrainProvider`. See [the PR](https://github.com/CesiumGS/cesium/pull/12963) for limitations on the types of 3D Tiles that can be used. [#12296](https://github.com/CesiumGS/cesium/issues/12296)
- Added support for [EXT_mesh_primitive_edge_visibility](https://github.com/KhronosGroup/glTF/pull/2479) glTF extension. [#12765](https://github.com/CesiumGS/cesium/issues/12765)
#### Fixes :wrench:
- Improved performance of `scene.drillPick`. [#12916](https://github.com/CesiumGS/cesium/pull/12916)
- Improved performance when removing primitives. [#3018](https://github.com/CesiumGS/cesium/pull/3018)
- Improved performance of terrain Quadtree handling of custom data [#12907](https://github.com/CesiumGS/cesium/pull/12907)
- Fixed vertical exaggeration of ellipsoid-shaped voxels. [#12811](https://github.com/CesiumGS/cesium/issues/12811)
- Fixed parsing content bounding volumes contained in 3D Tiles 1.1 subtree files. [#12972](https://github.com/CesiumGS/cesium/pull/12972)
- Fixes an event bug following recent changes, where adding a new listener during an event callback caused an infinite loop. [#12955](https://github.com/CesiumGS/cesium/pull/12955)
- Fix issues with label background when updating properties while `label.show` is `false`. [#12138](https://github.com/CesiumGS/cesium/issues/12138)
- Fixed picking of `GroundPrimitive` with multiple `PolygonGeometry` instances selecting the wrong instance. [#12978](https://github.com/CesiumGS/cesium/pull/12978)
- Fixed a bug where the removal of draped imagery layers did not update the rendered state [#12923](https://github.com/CesiumGS/cesium/issues/12923)
- Fixed precision issues with Gaussian splat tilesets where the root tile does not have a world transform. [#12925](https://github.com/CesiumGS/cesium/issues/12925)
- Fixed infinite recursion that would happen if user append post-render callbacks within existing callbacks [#12983](https://github.com/CesiumGS/cesium/pull/12983)
## 1.134.1 - 2025-10-10
### @cesium/engine
#### Fixes :wrench:
- Fixed an event bug following recent changes, where adding a new listener during an event callback caused an infinite loop. [#12955](https://github.com/CesiumGS/cesium/pull/12955)
## 1.134 - 2025-10-01
- [Sandcastle](https://sandcastle.cesium.com/) has been updated at `https://sandcastle.cesium.com`! The [legacy Sandcastle app](https://cesium.com/downloads/cesiumjs/releases/1.134/Apps/Sandcastle/index.html) will remain available through November 3, 2025.
### @cesium/engine
#### Breaking Changes :mega:
- Voxel rendering now requires a WebGL2 context, which is [enabled by default since 1.101](https://github.com/CesiumGS/cesium/pull/10894). Make sure the `requestWebGl1` flag in `contextOptions` is NOT set to true.
- The `defaultValue` function has been removed. Instead, use the [nullish coalescing (`??`)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing) operator. See the [Coding Guide](https://github.com/CesiumGS/cesium/tree/main/Documentation/Contributors/CodingGuide#default-parameter-values) for usage information and examples.
- `defaultValue.EMPTY_OBJECT` has been removed. Instead, use `Frozen.EMPTY_OBJECT`. See the [Coding Guide](https://github.com/CesiumGS/cesium/tree/main/Documentation/Contributors/CodingGuide#default-parameter-values) for usage information and examples.
#### Additions :tada:
- Added Google2DImageryProvider to load imagery from [Google Maps](https://developers.google.com/maps/documentation/tile/2d-tiles-overview) [#12913](https://github.com/CesiumGS/cesium/pull/12913)
- Added an async factory method for the Material class that allows callers to wait on resource loading. [#10566](https://github.com/CesiumGS/cesium/issues/10566)
#### Fixes :wrench:
- Fixed vertical misalignment of glyphs in labels with small fonts [#8474](https://github.com/CesiumGS/cesium/issues/8474)
- Converted voxel raymarching to eye coordinates to fix precision issues in large datasets. [#12061](https://github.com/CesiumGS/cesium/issues/12061)
- Fixed flickering artifact in Gaussian splat models caused by incorrect sorting results. [#12662](https://github.com/CesiumGS/cesium/issues/12662)
- Fixed issue where multiple instances of a Gaussian splat tileset would transform tile positions incorrectly and render out of position. [#12795](https://github.com/CesiumGS/cesium/issues/12795)
- Fixed rendering for geometry entities when `requestRenderMode` is enabled. [#12841](https://github.com/CesiumGS/cesium/pull/12841)
- Improved performance and reduced memory usage of `Event` class. [#12896](https://github.com/CesiumGS/cesium/pull/12896)
- Improved performance of clamped labels. [#12905](https://github.com/CesiumGS/cesium/pull/12905)
- Materials loaded from type now respect submaterials present in the referenced material type. [#10566](https://github.com/CesiumGS/cesium/issues/10566)
- Prevent runtime errors for certain forms of invalid PNTS files [#12872](https://github.com/CesiumGS/cesium/issues/12872)
- Revert `createImageBitmap` options update to continue support for older browsers [#12846](https://github.com/CesiumGS/cesium/issues/12846)
## 1.133.1 - 2025-09-08
This is an npm-only release to fix a dependency issue published in 1.133.0
## 1.133 - 2025-09-02
- Give the [new version of Sandcastle](https://dev-sandcastle.cesium.com/) a try today!
### @cesium/engine
#### Breaking Changes :mega:
- Removed the argument fallback in `ITwinData.*` functions. Instead, use the new options argument signature. [#12778](https://github.com/CesiumGS/cesium/issues/12778)
#### Additions :tada:
- Added support for the [EXT_mesh_primitive_restart](https://github.com/KhronosGroup/glTF/pull/2478) glTF extension. [#12764](https://github.com/CesiumGS/cesium/issues/12764)
- Added spherical harmonics support for Gaussian splats, supported with the SPZ compression format. [#12790](https://github.com/CesiumGS/cesium/pull/12790)
- Added `Ellipsoid.MARS` for use with Mars terrain and imagery. [#12828](https://github.com/CesiumGS/cesium/pull/12828)
- Allow passing `Cesium3DTileset` constructor options to the tileset that is created with `ITwinData.createTilesetForRealityDataId`. [#12709](https://github.com/CesiumGS/cesium/issues/12709)
#### Fixes :wrench:
- Fixed issue where a Gaussian splat tileset would be rendered even if out of current camera view. [#12840](https://github.com/CesiumGS/cesium/pull/12840)
- Removes the minimum tile threshold of four for WMTS. [#4372](https://github.com/CesiumGS/cesium/issues/4372)
- Fixed a crash when loading PNTS (point cloud) data that contained a batch table without a binary part. [#11166](https://github.com/CesiumGS/cesium/issues/11166)
- Fixed an error picking an area hidden by a `ClippingPolygon`. [#12725](https://github.com/CesiumGS/cesium/issues/12725)
#### Deprecated :hourglass_flowing_sand:
- Deprecated support for the `KHR_spz_gaussian_splats_compression` extension in favor of the latest 3D Gaussian splatting extensions for glTF, `KHR_gaussian_splatting` and `KHR_gaussian_splatting_compression_spz_2`. The deprecated extension will be removed in version 1.135. To ensure support in CesiumJS 1.135 and beyond, Please re-tile existing Gaussian splatting 3D Tiles before November 1, 2025. [#12837](https://github.com/CesiumGS/cesium/issues/12837)
## 1.132 - 2025-08-01
### @cesium/engine
#### Fixes :wrench:
- Fixes incorrect polygon culling in 2D scene mode. [#1552](https://github.com/CesiumGS/cesium/issues/1552)
- Fixes material flashing when changing properties. [#1640](https://github.com/CesiumGS/cesium/issues/1640), [#12716](https://github.com/CesiumGS/cesium/issues/12716)
- Fixed an issue where draped imagery on tilesets was not updated based on the visibility of the imagery layer. [#12742](https://github.com/CesiumGS/cesium/issues/12742)
- Fixes an exception when removing a Gaussian splat tileset from the scene primitives when it has more than one tile. [#12726](https://github.com/CesiumGS/cesium/pull/12726)
- Fixes rendering of Gaussian splats when they are scaled by the glTF transform, tileset transform, or model matrix. [#12721](https://github.com/CesiumGS/cesium/issues/12721), [#12718](https://github.com/CesiumGS/cesium/issues/12718)
- Updated the type of many properties and functions of `Scene` to clarify that they may be `undefined`. For the full list check PR: [#12736](https://github.com/CesiumGS/cesium/pull/12736)
- Fixes Gaussian splats incorrectly rendering when `Cesium3DTileset.show` is `false`. [#12748](https://github.com/CesiumGS/cesium/pull/12748)
- Fixed the PointCloudShading.normalShading parameter, to disable normal shading when set to false, even if the point cloud contains normals. [#11196](https://github.com/CesiumGS/cesium/issues/11196)
- Updated GPU vertex transformations to reduce precision errors. [#4250](https://github.com/CesiumGS/cesium/issues/4250)
- Fixes Gaussian splats orientation with respect to glTF up-axis by updating `spz-loader` to version `0.3.0`. [#12737](https://github.com/CesiumGS/cesium/issues/12737), [#12749](https://github.com/CesiumGS/cesium/issues/12749)
#### Additions :tada:
- Expand the CustomShader Sample to support real-time modification of CustomShader. [#12702](https://github.com/CesiumGS/cesium/pull/12702)
- Add wrapR property to Sampler and Texture3D, to support the newly added third dimension wrap.[#12701](https://github.com/CesiumGS/cesium/pull/12701)
- Added the ability to load a specific changeset for iTwin Mesh Exports using `ITwinData.createTilesetFromIModelId` [#12778](https://github.com/CesiumGS/cesium/issues/12778)
#### Deprecated :hourglass_flowing_sand:
- Updated all of the `ITwinData.*` functions to accept an `options` parameter instead of individual arguments to avoid confusion with multiple optional arguments. There is a fallback to the old signature that will be removed in 1.133 [#12778](https://github.com/CesiumGS/cesium/issues/12778)
## 1.131 - 2025-07-01
@ -2437,11 +2562,13 @@ _This is an npm-only release to fix a publishing issue_.
- Clipping planes on tilesets now use the root tile's transform, or the root tile's bounding sphere if a transform is not defined. [#7034](https://github.com/CesiumGS/cesium/pull/7034)
- This is to make clipping planes' coordinates always relative to the object they're attached to. So if you were positioning the clipping planes as in the example below, this is no longer necessary:
5. Navigate to : [`http://localhost:8080/`](http://localhost:8080)
---
## Get the Code
- [Setup Git](https://help.github.com/articles/set-up-git/#platform-all) if it isn't already.
@ -45,6 +39,7 @@
- Double-check your settings for name and email: `git config --get-regexp user.*`.
- Recommended Git settings:
- `git config --global fetch.prune true` - when fetching remote changes, remove any remote branches that no longer exist on the remote.
- `git config blame.ignoreRevsFile .git-blame-ignore-revs` - uses the ignore file to skip certain noisy revisions (like formatting) when running git blame. Alternatively, for VSCode users, install the GitLens extension, which will automatically use the ignore file.
- Have [commit access](https://github.com/CesiumGS/cesium/blob/main/Documentation/Contributors/CommittersGuide/README.md) to CesiumJS?
Then browse to [http://localhost:8080/](http://localhost:8080/). The landing page includes apps and tools commonly used during development, including:
- **Hello World** : an example for how to create a 3D globe. [Tutorial here](https://cesium.com/learn/cesiumjs-learn/cesiumjs-quickstart/)
- **Sandcastle** : an app for viewing and creating [code examples](https://sandcastle.cesium.com?src=Hello%20World.html&label=Showcases), complete with a live preview
- **Sandcastle** : an app for viewing and creating [code examples](https://sandcastle.cesium.com), complete with a live preview
- **Test Suites** : tests using [Jasmine](https://jasmine.github.io/). [Testing guide here.](https://github.com/CesiumGS/cesium/blob/main/Documentation/Contributors/TestingGuide/README.md#testing-guide)
- **Documentation** : reference documentation built from source. [Documentation guide here.](https://github.com/CesiumGS/cesium/blob/main/Documentation/Contributors/DocumentationGuide/README.md#documentation-guide)
@ -161,52 +156,3 @@ Here's the full set of scripts and what they do.
- **Deployment scripts**
- `deploy-status` - Sets the deployment statuses in GitHub, for use in CI
- `deploy-set-version` - Sets the version of `package.json`, for use in CI
## Continuous Integration
Cesium uses [GitHub Actions](https://docs.github.com/en/actions) for continuous integration. Reusable actions are defined in `/.github/actions/` and workflows in `.github/workflows/`.
(Although outdated, the blog post [Cesium Continuous Integration](http://cesium.com/blog/2016/04/07/Cesium-Continuous-Integration/) contains background on the CesiumJS CI process.)
A workflow is triggered whenever someone pushes code to the Cesium repository, or an external contributor opens a pull request. After the build has completed, at the bottom of the pull request page the status of the build is shown. In the dropdown menu, individual checks are displayed. Logs and deployed artifacts can be accessed by clicking the "Details" link.

The build of any branch of CesiumJS can be accessed under the [Branches](https://github.com/CesiumGS/cesium/branches/all) page, and clicking the icon next to the branch name.

Additional set up is required for deployment if you do not have commit access to Cesium.
### Configure a Different S3 Bucket
It is possible to configure your development branch of CesiumJS to deploy build artifacts to a different [AWS S3 Bucket](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html). If you are using the cesium-public-builds bucket and have valid credentials, skip to [Configure S3 Credentials](#configure-s3-credentials)
- In `.gtihub/workflows/dev.yml`, in the following lines, replace "cesium-public-builds" with the name of your S3 bucket.
```yml
aws s3 sync ./Build/Coverage s3://cesium-public-builds/cesium/$BRANCH/Build/Coverage --delete --color on
CesiumJS uses [GitHub Actions](https://docs.github.com/en/actions) for continuous integration (CI).
- [**CI for CesiumJS: A Deep Dive into Our GitHub Actions Workflow** (2024)](https://cesium.com/blog/2024/08/12/ci-for-cesiumjs-github-actions-workflow/)
Reusable actions are defined in `/.github/actions/` and workflows in `.github/workflows/`.
A workflow is triggered whenever someone pushes code to the CesiumJS repository, or an external contributor opens a pull request. After the build has completed, at the bottom of the pull request page the status of the build is shown. In the dropdown menu, individual checks are displayed. Logs and deployed artifacts can be accessed by clicking the "Details" link.

The workflow checks for any CesiumJS branch are accessible under the [Branches](https://github.com/CesiumGS/cesium/branches/all) page by clicking the icon next to the branch name.

## Continuous deployment
Automated deployments make recent code changes available for testing and review without needing to fetch and build locally. We deploy each of the following on a per-branch basis.
Additional set up is required for deployment if you do not have commit access to CesiumJS.
### Configure a different S3 bucket
It is possible to configure your development branch of CesiumJS to deploy build artifacts to a different [AWS S3 Bucket](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html). If you are using the cesium-public-builds bucket and have valid credentials, skip to [Configure S3 Credentials](#configure-s3-credentials)
- In `.gtihub/workflows/dev.yml`, in the following lines, replace "cesium-public-builds" with the name of your S3 bucket.
```sh
aws s3 sync ./Build/Coverage s3://cesium-public-builds/cesium/$BRANCH/Build/Coverage --delete --color on
- [CONTRIBUTING.md](../../CONTRIBUTING.md) - Start here. How to find something to work on, submit issues, and open pull requests.
- [Build Guide](BuildGuide/README.md) - How to build and run CesiumJS locally.
- [Continuous Integration Guide](ContinuousIntegration/README.md) - How we use GitHub Actions for continuous integration (CI) and continuous deployment (CD).
- **IDEs** - use any IDE you want for CesiumJS development. Most contributors use WebStorm (commercial) or VSCode (open source).
- [VSCode Guide](VSCodeGuide/README.md) - How to set up VSCode.
- [Coding Guide](CodingGuide/README.md) - JavaScript and GLSL coding conventions and best practices for design, maintainability, and performance.
@ -12,3 +13,5 @@
- [Presenter's Guide](PresentersGuide/README.md) - Tips for giving talks.
- [Committer's Guide](CommittersGuide/README.md) - What to do with commit access to the main CesiumJS repo.
- [Release Guide](ReleaseGuide/README.md) - How to ship a CesiumJS release.
- [Release Schedule](ReleaseGuide//ReleaseSchedule.md) - The upcoming monthly release schedule and the developer responsible for managing each release
- [Prelease Guide](ReleaseGuide/Prereleases/README.md) - If and how to publish a prerelease version ahead of the typical monthly release
Occasionally, we need to release versions of CesiumJS prior to our typical [monthly train releases](../README.md). This can arise because of a critical regression or compatibility issue with the published dependency versions. When this is necessary, we publish a **patch** release[^1]. Tools like npm which use Semantic Versioning will usually use this new version of the package the next time a user runs `npm install` without the user needing to opt-in.
[^1]: See ["About semantic versioning" on docs.npmjs.com](https://docs.npmjs.com/about-semantic-versioning)
## Publishing a patch version
This process is based on an abbreviated version of the [monthly release guide](../README.md). Familiarity with our typical release process is recommended, but not required.
### 1. Create a new branch from the base tag
If no additional commits (besides the intended patch fix) have been merged into `main` since the monthly release, you may create a new branch from `main` and skip step 2. Otherwise, proceed with the steps below.
- Checkout a git tag for the base branch– i.e., use `1.123` in place of `<git-tag>` for the previous monthly release, or `1.123.1` for a subsequent patches applied in the same month.
- From this branch, create a new branch with any unique `<branch-name>`.
#### Commands
```sh
git checkout <git-tag>
git checkout -b <branch-name>
```
### 2. Cherry pick relevant commits
- Use [`git-cherry-pick`](https://git-scm.com/docs/git-cherry-pick) one or more times to apply select commits to the current branch
- As necessary, resolve any merge conflicts, add, and continue.
#### Commands
```sh
git cherry-pick <commit-hash>
```
### 3. Bump the release version
Use [npm `version` with the `patch` command](https://docs.npmjs.com/cli/v11/commands/npm-version) to bump the version of each workspace and the root package– e.g., `npm version patch --no-git-tag-version`
#### Commands
```sh
npm version patch --ws --no-git-tag-version
npm version patch --no-git-tag-version
```
### 4. Update `CHANGES.md`
- In [`CHANGES.md`](../../../CHANGES.md), create a new header with the version string of root package from the previous step and the date of the release— e.g., if the version string from the previous step is `1.123.1`, `CHANGES.md` should read:
```md
# Change Log
## 1.123.1 - 2025-07-15
### @cesium/engine
...
```
- Move any relevant items in the list to the new header in `CHANGES.md`.
- Delete any empty headers.
- Ensure each change is nested in the section for the relevant workspace.
- Commit any staged changes and push to your branch.
### 5. Release build and sanity test
While the full extent of typical release testing is not required, at minimum, create a release build and run the release tests.
- Make sure the repository is clean `git clean -d -x -f --exclude="/Specs/e2e/*-snapshots/"`. **This will delete all files not already in the repository, excluding end to end testing snapshots.**
- Run `npm install`.
- Make sure `ThirdParty.json` is up to date by running `npm run build-third-party`. If there are any changes, verify and commit them.
- Create the release zip `npm run make-zip`.
- Run tests against the release `npm run test -- --failTaskOnError --release`.
- Run [Sandcastle](http://localhost:8080/Apps/Sandcastle/index.html) and verify functionality from the patch is working as expected.
### 6. Push and tag the release commit
- Push your commits to the _current_ branch.
- Create and push a [tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging), e.g., if the version string from previous steps is `1.123.1`, run:
- `git tag -a 1.123.1 -m "1.123.1 release"`
- `git push origin 1.123.1` (this assumes origin is the primary cesium repository; do not use `git push --tags` as it pushes all tags from all remotes you have on your system)
#### Commands
```sh
git push
git tag -a <version-tag> -m "<release-description>"
git push origin <version-tag>
```
### 7. Publish
#### a. Publish to npm
Continue with the normal `publish` command; There is no need to tag this differently than a typical release version.
- Use `npm publish --ws` in the repository root to publish the workspaces.
- Use `npm publish` to publish the root package.
#### b. Publish to the website
**_Often, as is the case with issues arising from published dependency versions, a patch release only needs to be published to npm and does not need to be deployed to cesium.com. If that is the case, skip step 7b and proceed to step 8._**
- Check out the `cesium.com` branch.
- Merge the new release tag into the `cesium.com` branch with `git merge origin <tag-name> --ff-only`.
- Push the branch with `git push`. CI will deploy the hosted release, Sandcastle, and the updated doc.
### 8. Port the updates back to `main`
It's important that the latest version info goes back into the `main` branch to streamline future releases.
- Checkout `main` and pull the latest updates:
- `git checkout main`
- `git pull`
- Checkout your patch release branch:
- `git checkout <release-branch>`
- [Optional] Create a new branch to perform the merge:
- `git checkout -b <branch-name>`
- Merge `main`, resolving any conflicts, particularly in `CHANGES.md`. Ensure the patch release _is_ included in the release notes, and ensure the specific patch fix descriptions are only listed once under the patch release.
- `git merge main`
- `git add .`
- `git diff main`
- Commit and push your changes:
- `git commit -m "sync version info"`
- `git push --set-upstream origin <branch-name>`
- Open a new PR with the **priority - next release** label
### 9. Announce the release
Once the packages have been successfully published to npm, notify the interested developers that the release has been completed. This may include adding a comment to relevant GitHub issues that a fix has been published.
Occasionally, we need to release incremental, opt-in versions of CesiumJS to npm prior to our typical [monthly train releases](../README.md) for early testing or internal use. When this is necessary, we publish a tagged **prerelease**[^1]. Prereleases are not guaranteed as stable and may not be compatable with official numbered releases.
[^1]: See ["Adding dist-tags to packages" on docs.npmjs.com](https://docs.npmjs.com/adding-dist-tags-to-packages)
## Installing a prerelease
Use a prerelease tag—e.g. `ion`—to install a published prerelease.
```sh
npm install cesium@<tag>
npm install @cesium/engine@<tag>
npm install @cesium/widgets@<tag>
```
For example, if the prerelease tag is `ion`, run the following command to install the latest ion prerelease of the top-level `cesium` npm package.
```sh
npm install cesium@ion
```
## Do we need a prelease?
A prerelease of CesiumJS typically _will not have the level of validation_ that the official monthly numbered release receives. Additionally, [cherry picking commits](https://www.atlassian.com/git/tutorials/cherry-pick) for hot fixes can _complicate commit history and introduce bugs_. Consider if a prerelease is the ideal solution or if [continuous deployment artifacts](../../ContinuousIntegration/README.md#continuous-deployment) will suffice.
## Publishing a prelease
This process is based on an abbreviated version of the [monthly release guide](../README.md). Familiarity with our typical release process is recommended, but not required.
### 1. Create a new branch from the base tag
- Checkout a git tag for the base branch– i.e., use `1.123` in place of `<git-tag>` for the previous monthly release, or `1.123.1-ion.0` for a subsequent prerelease.
- From this branch, create a new branch with any unique `<branch-name>`.
#### Commands
```sh
git checkout <git-tag>
git checkout -b <branch-name>
```
### 2. Cherry pick relevant commits
- Use [`git-cherry-pick`](https://git-scm.com/docs/git-cherry-pick) one or more times to apply select commits to the current branch.
- As necessary, resolve any merge conflicts, add, and continue.
#### Commands
```sh
git cherry-pick <commit-hash>
```
### 3. Bump the prerelease version
Use [npm `version` with the `preid` argument](https://docs.npmjs.com/cli/v11/commands/npm-version#preid) to bump the version of each workspace and the root package– e.g., `npm version prerelease --preid ion --no-git-tag-version`
#### Commands
```sh
npm version prerelease --preid <tag> --ws --no-git-tag-version
npm version prerelease --preid <tag> --no-git-tag-version
```
### 4. Update `CHANGES.md`
- In [`CHANGES.md`](../../../CHANGES.md), create a new header with the version string of root package from the previous step and the date of the release— e.g., if the version string from the previous step is `1.123.1-ion.0`, `CHANGES.md` should read:
```md
# Change Log
## 1.123.1-ion.0 - 2025-07-15
### @cesium/engine
...
```
- Move any relevant items in the list to the new header in `CHANGES.md`.
- Delete any empty headers.
- Ensure each change is nested in the section for the relevant workspace.
- Commit any staged changes and push to your branch.
### 5. Release build and sanity test
While the full extent of typical release testing is not required, at minimum, create a release build and run the release tests.
- Make sure the repository is clean `git clean -d -x -f --exclude="/Specs/e2e/*-snapshots/"`. **This will delete all files not already in the repository, excluding end to end testing snapshots.**
- Run `npm install`.
- Make sure `ThirdParty.json` is up to date by running `npm run build-third-party`. If there are any changes, verify and commit them.
- Create the release zip `npm run make-zip`.
- Run tests against the release `npm run test -- --failTaskOnError --release`.
- Run [Sandcastle](http://localhost:8080/Apps/Sandcastle/index.html) and verify functionality from this prerelease is working as expected.
### 6. Push and tag the release commit
- Push your commits to the _current_ branch.
- Create and push a [tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging), e.g., if the version string from previous steps is `1.123.1-ion.0`, run:
- `git tag -a 1.123.1-ion.0 -m "1.123.1 ion prerelease"`
- `git push origin 1.123.1-ion.0` (this assumes origin is the primary cesium repository; do not use `git push --tags` as it pushes all tags from all remotes you have on your system)
#### Commands
```sh
git push
git tag -a <version-tag> -m "<prerelease-description>"
git push origin <version-tag>
```
### 7. Publish to npm
Ensure the prerelease version of each package is not tagged as the `latest` version by [including the `tag` flag](https://docs.npmjs.com/cli/v11/commands/npm-publish#tag)— Ideally the `<tag>` specified here should match the prerelease tag from the version info. For instance, if the version is `1.123.1-ion.0`, use the `ion` tag.
- Use `npm publish --ws --tag <tag>` in the repository root to publish the workspaces.
- Use `npm publish --tag <tag>` to publish the root package.
#### Commands
```sh
npm publish --ws --tag <tag>
npm publish --tag <tag>
```
### 8. Port the updates back to `main`
It's important that the latest version info goes back into the `main` branch to streamline future releases.
- Checkout `main` and pull the latest updates:
- `git checkout main`
- `git pull`
- Checkout your prerelease branch:
- `git checkout <prerelease-branch>`
- [Optional] Create a new branch to perform the merge:
- `git checkout -b <branch-name>`
- Merge `main`, resolving any conflicts, particularly in `CHANGES.md`. The prerelease section can be removed, and relevant changes moved to the next monthly release. To confirm the merge, do a diff against main. Ideally, only the version info should show as updated.
- `git merge main`
- `git add .`
- `git diff main`
- Commit and push your changes:
- `git commit -m "sync version info"`
- `git push --set-upstream origin <branch-name>`
- Open a new PR with the **priority - next release** label
### 9. Announce the prerelease
Once the packages have been successfully published to npm, notify the interested developers that the release has been completed.
We release Cesium on the first work day of every month. The [Release Schedule](./ReleaseSchedule.md) outlines the release schedule and the developer responsible for each month's release.
We release CesiumJS on the first work day of every month.
There is no release manager; instead, our community shares the responsibility. Any committer can create the release for a given month, and at any point, they can pass the responsibility to someone else, or someone else can ask for it. This spreads knowledge, avoids stratification, avoids a single point of failure, and is beautifully unstructured ([more info](https://community.cesium.com/t/cesium-releases/45)).
- [**Release Schedule**](./ReleaseSchedule.md): The upcoming monthly release schedule and the developer responsible for managing each release
- [**Patch Release Guide**](./PatchReleases/README.md): If and how to publish a patch release[^1] ahead of the regular monthly release, typically used in the case of a significant regression or an issue with published dependency versions.
- [**Prerelease Guide**](./Prereleases/README.md): If and how to publish a tagged prerelease[^2] ahead of the regular monthly release, typically used for internal testing.
[^1]: See ["About semantic versioning" on docs.npmjs.com](https://docs.npmjs.com/about-semantic-versioning)
[^2]: See ["Adding dist-tags to packages" on docs.npmjs.com](https://docs.npmjs.com/adding-dist-tags-to-packages)
## Motivation
There is no one release manager; instead, [our community shares the responsibility](https://community.cesium.com/t/cesium-releases/45). Any committer can create the release for a given month, and at any point, they can pass the responsibility to someone else, or someone else can ask for it. This spreads knowledge, avoids stratification, avoids a single point of failure, and is beautifully unstructured.
## One week before release
@ -10,8 +20,10 @@ There is no release manager; instead, our community shares the responsibility. A
2. If one or more dependencies are outdated, checkout a new branch and run `npm install <packagename>@latest` for each package to increment the version.
- If `prettier` needs updated you _should_ still update it but keep the version pinned. If you run `npm install prettier@latest` you must remove the `^` in `package.json`. If the number of changes when running `npm run prettier` is large it may be worth opening a separate PR for only those.
3. Verify each update. If an update can be resolved, open a PR with your changes. If an update is incompatible, open an issue. Check the [`dependencies` label](https://github.com/CesiumGS/cesium/issues?q=is%3Aissue+is%3Aopen+label%3Adependencies) for any open issues pinning versions.
4. Check the [`priority - next release` issues and PRs](https://github.com/CesiumGS/cesium/labels/priority%20-%20next%20release). If there are any outstanding items, post a message to the `#cesiumjs` channel in Slack to figure out what needs to be addressed before we can release.
5. Ensure you've generated valid [end to end testing snapshots](../TestingGuide/README.md) against a previous release tag with `npm run test-e2e-update`.
4. Check the [`priority - next release` issues and PRs](https://github.com/CesiumGS/cesium/labels/priority%20-%20next%20release). If there are any outstanding items, post a message to the `CesiumJS` channel in Teams to figure out what needs to be addressed before we can release.
5. Check the [`remove in [this version number]` issues](https://github.com/CesiumGS/cesium/labels?q=remove) and open PRs to address any deprecations.
6. Ensure you've generated valid [end to end testing snapshots](../TestingGuide/README.md) against a previous release tag with `npm run test-e2e-update`.
7. Start thinking ahead for a good image for the release blog post in case you need to prepare any data, assets or examples.
## Release testing and packaging
@ -22,9 +34,9 @@ There is no release manager; instead, our community shares the responsibility. A
3. Make sure you are using the latest drivers for your video card.
4. Ensure you've generated valid [end to end testing snapshots](../TestingGuide/README.md) against a previous release tag with `npm run test-e2e-update`.
5. Pull down the latest `main` branch and run `npm install`.
6. Update the Cesium ion demo token in `Ion.js` with a new token from the CesiumJS ion team account with read and geocode permissions. These tokens are named like this: `1.85 Release - Delete on November 1st, 2021`. Delete the token from 2 releases ago.
6. Update the Cesium ion demo token in `Ion.js` with a new token from the CesiumJS ion team account with `read` and `geocode` permissions. These tokens are named like this: `1.85 Release - Delete on November 1st, 2021`. Delete the token from 2 releases ago.
7. Update the ArcGIS Developer API key in `ArcGisMapService.js` with a new API key from the [CesiumJS ArcGIS Developer](https://links.esri.com/agol-sign-in) account. These API keys are named like this: `1.85 Release - Delete on November 1st, 2021`. Delete the API key from the last release.
1. Sign in with LastPass
1. Sign in with Bitwarden
2. Go to Content at the top
3. Click "New Item" -> Developer Credentials -> API Key credentials
4. Set the expiration date to the day after the next release (no referrer URLs)
@ -49,7 +61,7 @@ There is no release manager; instead, our community shares the responsibility. A
20. Verify that the [documentation](http://localhost:8080/Build/Documentation/index.html) built correctly
21. Make sure [Hello World](http://localhost:8080/Apps/HelloWorld.html) loads.
22. Make sure [Cesium Viewer](http://localhost:8080/Apps/CesiumViewer/index.html) loads.
23. Run [Sandcastle](http://localhost:8080/Apps/Sandcastle/index.html) on the browser of your choice (or multiple browsers if you are up for it). Switch to the `All` tab and spot test more complicated demos. Actually play with each of the buttons and sliders on each demo to ensure everything works as expected.
23. Run [Sandcastle](http://localhost:8080/Apps/Sandcastle2/index.html) on the browser of your choice (or multiple browsers if you are up for it). Remove the `Showcases` filter and spot test the more complicated demos. Actually play with each of the buttons and sliders on each demo to ensure everything works as expected.
24. If any of the above steps fail, post a message to the `CesiumJS` channel in Teams to figure out what needs to be fixed before we can release. **Do NOT proceed to the next step until issues are resolved.**
25. Push your commits to main
- `git push`
@ -68,7 +80,7 @@ There is no release manager; instead, our community shares the responsibility. A
- `npm publish -w @cesium/engine`
- `npm publish -w @cesium/widgets`
29. Publish the top-level `cesium` package to npm by running `npm publish` in the repository root (not the unzipped file directory) (the first time you do this, you will need to authorize the machine using `npm adduser`).
30. Check out the `cesium.com` branch. Merge the new release tag into the `cesium.com` branch `git merge origin <tag-name>`. CI will deploy the hosted release, Sandcastle, and the updated doc when you push the branch up.
31. After the `cesium.com` branch is live on cesium.com, comment in the `#comms-chat` slack channel to notify comms that the release is done so they can add these highlights and publish the monthly blog post
30. Check out the `cesium.com` branch. Merge the new release tag into the `cesium.com` branch `git merge origin <tag-name> --ff-only`. CI will deploy the hosted release, Sandcastle, and the updated doc when you push the branch up.
31. After the `cesium.com` branch is live on cesium.com, comment in the `Communications` channel in Teams to notify comms that the release is done so they can add these highlights and publish the monthly blog post
- Note, it may take a little while for the new version of CesiumJS to be live on cesium.com (~30 minutes after the branch builds). You can check the version of Cesium in [sandcastle](https://sandcastle.cesium.com/) by looking at the tab above the cesium pane.
32. Continue to the [Cesium Analytics release](https://github.com/CesiumGS/cesium-analytics/tree/main/Documentation/ReleaseGuide)
- [Debugging Tests in the Browser or IDE](#debugging-tests-in-the-browser-or-ide)
- [Running the Tests in the Browser](#running-the-tests-in-the-browser)
- [Run All Tests](#run-all-tests)
- [Run with WebGL validation](#run-with-webgl-validation)
@ -122,13 +122,13 @@ Alternatively, test suites can be run from the command line with the `includeNam
`npm run test -- --includeName Cartesian2`
#### Using Browser Debugging Tools
#### Debugging Tests in the Browser or IDE
If it is helpful to step through a unit test in a browser debugger, run the tests with the `debug` flag:
If it is helpful to step through a unit test in a browser debugger or your IDE, run the tests with the `debug` flag:
`npm run test -- --debug`
The `--debug` flag will prevent the Karma browser from closing after running the tests, and clicking the "Debug" button will open a new tab that can be used for placing breakpoints and stepping through the code.
The `--debug` flag will prevent the Karma browser from closing after running the tests, and clicking the "Debug" button will open a new tab that can be used for placing breakpoints and stepping through the code. Alternatively, run the "Launch Test Suite and Debug in VSCode" launch configuration (which opens chrome, attaches VSCode, and prepares the test suite of the current file), set breakpoints directly in the Spec file, and then click "Debug" in Chrome to run the tests. Similar behavior may be possible in other IDEs by attaching to port 9333 (Karma's configured remote debugging port) after running the npm test command above.
@ -77,3 +77,5 @@ you quit VSCode, so should be restarted manually on next launch.
## Debugging CesiumJS
To debug CesiumJS using the VSCode Chrome debugger, run the `"Launch Server"` configuration. If the server was already started in the terminal using `npm start`, use the `"Launch in Chrome"` configuration.
To debug a specific unit test suite, run the "Launch Test Suite and Debug in VSCode" configuration. This will start the server, launch chrome, and prepare to run the tests in the currently open file. Set one or more breakpoints in VSCode and then click "Debug" in the browser. If the server is already started, use the "Attach to Karma" configuration and then continue setting breakpoints.
> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> BY DOWNLOADING THE SOFTWARE AND OTHER AVAILABLE MATERIALS, YOU ("DEVELOPER") AGREE TO BE BOUND BY THE FOLLOWING TERMS AND CONDITIONS
> Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
>
> The materials available for download to Developers may include software in both sample source ("Source Code") and object code ("Object Code") versions, documentation ("Documentation"), certain art work ("Art Assets") and other materials (collectively, these materials referred to herein as "Materials"). Except as expressly indicated herein, all terms and conditions of this Agreement apply to all of the Materials.
> Redistribution and use in source and binary forms, with or without
> modification, are permitted provided that the following conditions
> are met:
> * Redistributions of source code must retain the above copyright
> notice, this list of conditions and the following disclaimer.
> * Redistributions in binary form must reproduce the above copyright
> notice, this list of conditions and the following disclaimer in the
> documentation and/or other materials provided with the distribution.
> * Neither the name of NVIDIA CORPORATION nor the names of its
> contributors may be used to endorse or promote products derived
> from this software without specific prior written permission.
>
> Except as expressly set forth herein, NVIDIA owns all of the Materials and makes them available to Developer only under the terms and conditions set forth in this Agreement.
>
> License: Subject to the terms of this Agreement, NVIDIA hereby grants to Developer a royalty-free, non-exclusive license to possess and to use the Materials. The following terms apply to the specified type of Material:
>
> Source Code: Developer shall have the right to modify and create derivative works with the Source Code. Developer shall own any derivative works ("Derivatives") it creates to the Source Code, provided that Developer uses the Materials in accordance with the terms of this Agreement. Developer may distribute the Derivatives, provided that all NVIDIA copyright notices and trademarks are used properly and the Derivatives include the following statement: "This software contains source code provided by NVIDIA Corporation."
>
> Object Code: Developer agrees not to disassemble, decompile or reverse engineer the Object Code versions of any of the Materials. Developer acknowledges that certain of the Materials provided in Object Code version may contain third party components that may be subject to restrictions, and expressly agrees not to attempt to modify or distribute such Materials without first receiving consent from NVIDIA.
>
> Art Assets: Developer shall have the right to modify and create Derivatives of the Art Assets, but may not distribute any of the Art Assets or Derivatives created therefrom without NVIDIA's prior written consent.
>
> Government End Users: If you are acquiring the Software on behalf of any unit or agency of the United States Government, the following provisions apply. The Government agrees the Software and documentation were developed at private expense and are provided with "RESTRICTED RIGHTS". Use, duplication, or disclosure by the Government is subject to restrictions as set forth in DFARS 227.7202-1(a) and 227.7202-3(a) (1995), DFARS 252.227-7013(c)(1)(ii) (Oct 1988), FAR 12.212(a)(1995), FAR 52.227-19, (June 1987) or FAR 52.227-14(ALT III) (June 1987),as amended from time to time. In the event that this License, or any part thereof, is deemed inconsistent with the minimum rights identified in the Restricted Rights provisions, the minimum rights shall prevail.
> No Other License. No rights or licenses are granted by NVIDIA under this License, expressly or by implication, with respect to any proprietary information or patent, copyright, trade secret or other intellectual property right owned or controlled by NVIDIA, except as expressly provided in this License.
> Term: This License is effective until terminated. NVIDIA may terminate this Agreement (and with it, all of Developer's right to the Materials) immediately upon written notice (which may include email) to Developer, with or without cause.
>
> Support: NVIDIA has no obligation to support or to continue providing or updating any of the Materials.
>
> No Warranty: THE SOFTWARE AND ANY OTHER MATERIALS PROVIDED BY NVIDIA TO DEVELOPER HEREUNDER ARE PROVIDED "AS IS." NVIDIA DISCLAIMS ALL WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
>
> LIMITATION OF LIABILITY: NVIDIA SHALL NOT BE LIABLE TO DEVELOPER, DEVELOPER'S CUSTOMERS, OR ANY OTHER PERSON OR ENTITY CLAIMING THROUGH OR UNDER DEVELOPER FOR ANY LOSS OF PROFITS, INCOME, SAVINGS, OR ANY OTHER CONSEQUENTIAL, INCIDENTAL, SPECIAL, PUNITIVE, DIRECT OR INDIRECT DAMAGES (WHETHER IN AN ACTION IN CONTRACT, TORT OR BASED ON A WARRANTY), EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF THE ESSENTIAL PURPOSE OF ANY LIMITED REMEDY. IN NO EVENT SHALL NVIDIA'S AGGREGATE LIABILITY TO DEVELOPER OR ANY OTHER PERSON OR ENTITY CLAIMING THROUGH OR UNDER DEVELOPER EXCEED THE AMOUNT OF MONEY ACTUALLY PAID BY DEVELOPER TO NVIDIA FOR THE SOFTWARE OR ANY OTHER MATERIALS.
> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
> EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
> CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
> EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
> PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
> PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
> OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.