Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: CesiumGS/cesium
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 99d6fffe20d9cf19f2d70de97777dc00a435bc5e
Choose a base ref
...
head repository: CesiumGS/cesium
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 4bd2acb09cdb2bc42083e810138db77ce8c97a46
Choose a head ref
Loading
Showing with 1,410 additions and 1,261 deletions.
  1. +11 −1 .idea/vcs.xml
  2. +4 −2 .markdownlint.json
  3. +10 −13 .slackbot.yml
  4. +7 −8 Apps/Sandcastle/gallery/{development → }/Voxel Picking.html
  5. BIN Apps/Sandcastle/gallery/{development → }/Voxel Picking.jpg
  6. +55 −113 Apps/Sandcastle/gallery/{development → }/Voxels.html
  7. BIN Apps/Sandcastle/gallery/{development → }/Voxels.jpg
  8. +31 −7 CHANGES.md
  9. +5 −0 CONTRIBUTORS.md
  10. +5 −5 Documentation/Contributors/ReleaseGuide/README.md
  11. +58 −0 Documentation/Contributors/TestingGuide/README.md
  12. +1 −0 ...dels/glTF-2.0/FeatureIdTextureWithTextureTransform/glTF/FeatureIdTextureWithTextureTransform.gltf
  13. +8 −1 Specs/e2e/playwright.config.js
  14. +3 −3 ThirdParty.json
  15. +14 −1 gulpfile.js
  16. +4 −4 package.json
  17. +127 −0 packages/engine/Source/Core/Check.d.ts
  18. +0 −1 packages/engine/Source/Core/Check.js
  19. +1 −1 packages/engine/Source/Core/Geometry.js
  20. +1 −1 packages/engine/Source/Core/Ion.js
  21. +1 −1 packages/engine/Source/Core/PolygonGeometry.js
  22. +2 −1 packages/engine/Source/Core/VerticalExaggeration.js
  23. +1 −1 packages/engine/Source/Scene/ArcGisMapService.js
  24. +32 −0 packages/engine/Source/Scene/Billboard.js
  25. +1 −1 packages/engine/Source/Scene/BillboardCollection.js
  26. +4 −0 packages/engine/Source/Scene/BingMapsImageryProvider.js
  27. +2 −9 packages/engine/Source/Scene/Cesium3DTilesVoxelProvider.js
  28. +4 −39 packages/engine/Source/Scene/Cesium3DTileset.js
  29. +0 −67 packages/engine/Source/Scene/Globe.js
  30. +33 −0 packages/engine/Source/Scene/Label.js
  31. +2 −1 packages/engine/Source/Scene/LabelCollection.js
  32. +0 −3 packages/engine/Source/Scene/Primitive.js
  33. +1 −1 packages/engine/Source/Scene/SensorVolumePortionToDisplay.js
  34. +0 −15 packages/engine/Source/Scene/VoxelBoxShape.js
  35. +14 −131 packages/engine/Source/Scene/VoxelCylinderShape.js
  36. +136 −227 packages/engine/Source/Scene/VoxelEllipsoidShape.js
  37. +106 −14 packages/engine/Source/Scene/VoxelPrimitive.js
  38. +9 −3 packages/engine/Source/Scene/VoxelRenderResources.js
  39. +0 −10 packages/engine/Source/Scene/VoxelShape.js
  40. +1 −0 packages/engine/Source/Scene/processVoxelProperties.js
  41. +21 −47 packages/engine/Source/Shaders/Voxels/IntersectBox.glsl
  42. +1 −1 packages/engine/Source/Shaders/Voxels/IntersectClippingPlanes.glsl
  43. +66 −96 packages/engine/Source/Shaders/Voxels/IntersectCylinder.glsl
  44. +226 −154 packages/engine/Source/Shaders/Voxels/IntersectEllipsoid.glsl
  45. +33 −11 packages/engine/Source/Shaders/Voxels/IntersectionUtils.glsl
  46. +1 −2 packages/engine/Source/Shaders/Voxels/Megatexture.glsl
  47. +14 −9 packages/engine/Source/Shaders/Voxels/Octree.glsl
  48. +93 −43 packages/engine/Source/Shaders/Voxels/VoxelFS.glsl
  49. +31 −0 packages/engine/Source/Shaders/Voxels/VoxelUtils.glsl
  50. +24 −3 packages/engine/Source/Shaders/Voxels/convertUvToBox.glsl
  51. +50 −8 packages/engine/Source/Shaders/Voxels/convertUvToCylinder.glsl
  52. +82 −53 packages/engine/Source/Shaders/Voxels/convertUvToEllipsoid.glsl
  53. +1 −1 packages/engine/Source/Workers/createGeometry.js
  54. +21 −0 packages/engine/Specs/DataSources/EntitySpec.js
  55. +7 −4 packages/engine/Specs/Scene/BingMapsImageryProviderSpec.js
  56. +0 −58 packages/engine/Specs/Scene/GlobeSurfaceTileProviderSpec.js
  57. +0 −39 packages/engine/Specs/Scene/VoxelBoxShapeSpec.js
  58. +0 −28 packages/engine/Specs/Scene/VoxelCylinderShapeSpec.js
  59. +40 −15 packages/engine/Specs/Scene/VoxelPrimitiveSpec.js
  60. +1 −0 packages/engine/Specs/Scene/processVoxelPropertiesSpec.js
  61. +2 −2 packages/engine/package.json
  62. +2 −2 packages/widgets/package.json
12 changes: 11 additions & 1 deletion .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions .markdownlint.json
Original file line number Diff line number Diff line change
@@ -8,5 +8,7 @@
"ol-prefix": {
"style": "ordered"
},
"no-inline-html": true
}
"no-inline-html": {
"allowed_elements": ["details", "summary"]
}
}
23 changes: 10 additions & 13 deletions .slackbot.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
releaseSchedule:
- ggetz, 1/2/2023
- jjhembd, 2/1/2023
- ggetz, 3/1/2023
- jjhembd, 4/3/2023
- ggetz, 5/1/2023
- jjhembd, 6/1/2023
- ggetz, 7/1/2023
- jjhembd, 8/1/2023
- ggetz, 9/1/2023
- jjhembd, 10/1/2023
- ggetz, 11/1/2023
- jjhembd, 12/1/2023
- ggetz, 1/2/2024
- jjspace, 4/1/2024
- jjhembd, 5/1/2024
- ggetz, 6/1/2024
- jjspace, 7/1/2024
- jjhembd, 8/1/2024
- ggetz, 9/1/2024
- jjspace, 10/1/2024
- jjhembd, 11/1/2024
- ggetz, 12/1/2024

Original file line number Diff line number Diff line change
@@ -102,27 +102,27 @@
const dataColor = new Float32Array(voxelCount * channelCount);

for (let z = 0; z < dimensions.z; z++) {
const indexZ = z * dimensions.y * dimensions.x;
for (let y = 0; y < dimensions.y; y++) {
const indexZY = indexZ + y * dimensions.x;
for (let x = 0; x < dimensions.x; x++) {
const lerperX = x / (dimensions.x - 1);
const lerperY = y / (dimensions.y - 1);
const lerperZ = z / (dimensions.z - 1);

//const h = hue + lerperX * 0.5 - lerperY * 0.3 + lerperZ * 0.2;
const h = Cesium.Math.nextRandomNumber();
const s = 1.0 - lerperY * 0.2;
const l = 0.5;
const color = Cesium.Color.fromHsl(h, s, l, 1.0, scratchColor);

const index =
z * dimensions.y * dimensions.x + y * dimensions.x + x;
const random2 = Cesium.Math.nextRandomNumber();
const alphaRandom = Math.floor(random2 + 0.5);

dataColor[index * channelCount + 0] = color.red;
dataColor[index * channelCount + 1] = color.green;
dataColor[index * channelCount + 2] = color.blue;
dataColor[index * channelCount + 3] = alphaRandom;
const index = (indexZY + x) * channelCount;
dataColor[index + 0] = color.red;
dataColor[index + 1] = color.green;
dataColor[index + 2] = color.blue;
dataColor[index + 3] = alphaRandom;
}
}
}
@@ -181,7 +181,6 @@
);

voxelPrimitive.nearestSampling = true;
voxelPrimitive.jitter = false;

camera.flyToBoundingSphere(voxelPrimitive.boundingSphere, {
duration: 0.0,
File renamed without changes
Original file line number Diff line number Diff line change
@@ -40,39 +40,17 @@
),
baseLayerPicker: false,
geocoder: false,
animation: false,
timeline: false,
});

viewer.extend(Cesium.viewerVoxelInspectorMixin);
viewer.scene.debugShowFramesPerSecond = true;

function getMinBounds(shape) {
if (shape === Cesium.VoxelShapeType.ELLIPSOID) {
const minBounds = Cesium.Cartesian3.clone(
Cesium.VoxelShapeType.getMinBounds(shape)
);
minBounds.z = 0.0;
return minBounds;
}

return undefined;
}

function getMaxBounds(shape) {
if (shape === Cesium.VoxelShapeType.ELLIPSOID) {
const maxBounds = Cesium.Cartesian3.clone(
Cesium.VoxelShapeType.getMaxBounds(shape)
);
maxBounds.z = 1000000.0;
return maxBounds;
}

return undefined;
}

function ProceduralSingleTileVoxelProvider(shape) {
this.shape = shape;
this.minBounds = getMinBounds(shape);
this.maxBounds = getMaxBounds(shape);
this.minBounds = Cesium.VoxelShapeType.getMinBounds(shape).clone();
this.maxBounds = Cesium.VoxelShapeType.getMaxBounds(shape).clone();
this.dimensions = new Cesium.Cartesian3(8, 8, 8);
this.names = ["color"];
this.types = [Cesium.MetadataType.VEC4];
@@ -84,12 +62,7 @@
ProceduralSingleTileVoxelProvider.prototype.requestData = function (
options
) {
const tileLevel = options.tileLevel;
const tileX = options.tileX;
const tileY = options.tileY;
const tileZ = options.tileZ;

if (tileLevel >= 1) {
if (options.tileLevel >= 1) {
return undefined;
}

@@ -99,13 +72,14 @@
const channelCount = Cesium.MetadataType.getComponentCount(type);
const dataColor = new Float32Array(voxelCount * channelCount);

const randomSeed =
tileZ * dimensions.y * dimensions.x + tileY * dimensions.x + tileX;
const randomSeed = dimensions.y * dimensions.x + dimensions.x;
Cesium.Math.setRandomNumberSeed(randomSeed);
const hue = Cesium.Math.nextRandomNumber();

for (let z = 0; z < dimensions.z; z++) {
for (let y = 0; y < dimensions.y; y++) {
const indexZY =
z * dimensions.y * dimensions.x + y * dimensions.x;
for (let x = 0; x < dimensions.x; x++) {
const lerperX = x / (dimensions.x - 1);
const lerperY = y / (dimensions.y - 1);
@@ -116,13 +90,11 @@
const v = 0.5 + 2.0 * (lerperZ - 0.5) * 0.2;
const color = Cesium.Color.fromHsl(h, s, v, 1.0, scratchColor);

const index =
z * dimensions.y * dimensions.x + y * dimensions.x + x;

dataColor[index * channelCount + 0] = color.red;
dataColor[index * channelCount + 1] = color.green;
dataColor[index * channelCount + 2] = color.blue;
dataColor[index * channelCount + 3] = 0.75;
const index = (indexZY + x) * channelCount;
dataColor[index + 0] = color.red;
dataColor[index + 1] = color.green;
dataColor[index + 2] = color.blue;
dataColor[index + 3] = 0.75;
}
}
}
@@ -132,8 +104,8 @@

function ProceduralMultiTileVoxelProvider(shape) {
this.shape = shape;
this.minBounds = getMinBounds(shape);
this.maxBounds = getMaxBounds(shape);
this.minBounds = Cesium.VoxelShapeType.getMinBounds(shape).clone();
this.maxBounds = Cesium.VoxelShapeType.getMaxBounds(shape).clone();
this.dimensions = new Cesium.Cartesian3(4, 4, 4);
this.paddingBefore = new Cesium.Cartesian3(1, 1, 1);
this.paddingAfter = new Cesium.Cartesian3(1, 1, 1);
@@ -145,58 +117,30 @@
this._allVoxelData = new Array(this._levelCount);

const allVoxelData = this._allVoxelData;
const levelCount = this._levelCount;
const channelCount = Cesium.MetadataType.getComponentCount(
this.types[0]
);
const voxelDimensions = this.dimensions;
const voxelCountX = voxelDimensions.x;
const voxelCountY = voxelDimensions.y;
const voxelCountZ = voxelDimensions.z;
const { dimensions } = this;

for (let level = 0; level < levelCount; level++) {
for (let level = 0; level < this._levelCount; level++) {
const dimAtLevel = Math.pow(2, level);
const voxelCountLevelX = voxelCountX * dimAtLevel;
const voxelCountLevelY = voxelCountY * dimAtLevel;
const voxelCountLevelZ = voxelCountZ * dimAtLevel;
const voxelsPerLevel =
voxelCountLevelX * voxelCountLevelY * voxelCountLevelZ;
const voxelCountX = dimensions.x * dimAtLevel;
const voxelCountY = dimensions.y * dimAtLevel;
const voxelCountZ = dimensions.z * dimAtLevel;
const voxelsPerLevel = voxelCountX * voxelCountY * voxelCountZ;
const levelData = (allVoxelData[level] = new Array(
voxelsPerLevel * channelCount
));

for (let x = 0; x < voxelCountLevelX; x++) {
for (let y = 0; y < voxelCountLevelY; y++) {
for (let z = 0; z < voxelCountLevelZ; z++) {
const index =
z * voxelCountLevelY * voxelCountLevelX +
y * voxelCountLevelX +
x;
const lerperX = x / (voxelCountLevelX - 1);
const lerperY = y / (voxelCountLevelY - 1);
const lerperZ = z / (voxelCountLevelZ - 1);
const repeatX = 5;
const repeatY = 5;
const repeatZ = 1;
let xLocal = lerperX * repeatX;
let yLocal = lerperY * repeatY;
let zLocal = lerperZ * repeatZ;
xLocal = xLocal - Math.floor(xLocal);
yLocal = yLocal - Math.floor(yLocal);
zLocal = zLocal - Math.floor(zLocal);
const xDiff = xLocal - 0.5;
const yDiff = yLocal - 0.5;
const zDiff = zLocal - 0.5;

const dist = Math.sqrt(
xDiff * xDiff + yDiff * yDiff + zDiff * zDiff
);
const alpha = 1.0;

levelData[index * channelCount + 0] = lerperX;
levelData[index * channelCount + 1] = lerperY;
levelData[index * channelCount + 2] = lerperZ;
levelData[index * channelCount + 3] = alpha;
for (let z = 0; z < voxelCountX; z++) {
for (let y = 0; y < voxelCountY; y++) {
const indexZY = z * voxelCountY * voxelCountX + y * voxelCountX;
for (let x = 0; x < voxelCountZ; x++) {
const index = (indexZY + x) * channelCount;
levelData[index + 0] = x / (voxelCountX - 1);
levelData[index + 1] = y / (voxelCountY - 1);
levelData[index + 2] = z / (voxelCountZ - 1);
levelData[index + 3] = 0.5;
}
}
}
@@ -206,22 +150,16 @@
ProceduralMultiTileVoxelProvider.prototype.requestData = function (
options
) {
const tileLevel = options.tileLevel;
const tileX = options.tileX;
const tileY = options.tileY;
const tileZ = options.tileZ;
const { tileLevel, tileX, tileY, tileZ } = options;

const levelCount = this._levelCount;
if (tileLevel >= levelCount) {
if (tileLevel >= this._levelCount) {
return undefined;
}

const type = this.types[0];
const channelCount = Cesium.MetadataType.getComponentCount(type);
const paddingBefore = this.paddingBefore;
const paddingAfter = this.paddingAfter;
const dimensions = this.dimensions;
const dimensionsPadding = Cesium.Cartesian3.fromElements(
const { dimensions, paddingBefore, paddingAfter } = this;
const paddedDimensions = Cesium.Cartesian3.fromElements(
dimensions.x + paddingBefore.x + paddingAfter.x,
dimensions.y + paddingBefore.y + paddingAfter.y,
dimensions.z + paddingBefore.z + paddingAfter.z
@@ -239,31 +177,27 @@
dimensionsGlobal.z - 1
);
let coordGlobal = new Cesium.Cartesian3();
let coordTile = new Cesium.Cartesian3();

const dataGlobal = this._allVoxelData;
const dataTile = new Float32Array(
dimensionsPadding.x *
dimensionsPadding.y *
dimensionsPadding.z *
paddedDimensions.x *
paddedDimensions.y *
paddedDimensions.z *
channelCount
);

for (let z = 0; z < dimensionsPadding.z; z++) {
for (let y = 0; y < dimensionsPadding.y; y++) {
for (let x = 0; x < dimensionsPadding.x; x++) {
coordTile = Cesium.Cartesian3.fromElements(x, y, z, coordTile);

const indexTile =
coordTile.z * dimensionsPadding.y * dimensionsPadding.x +
coordTile.y * dimensionsPadding.x +
coordTile.x;
for (let z = 0; z < paddedDimensions.z; z++) {
const indexZ = z * paddedDimensions.y * paddedDimensions.x;
for (let y = 0; y < paddedDimensions.y; y++) {
const indexZY = indexZ + y * paddedDimensions.x;
for (let x = 0; x < paddedDimensions.x; x++) {
const indexTile = indexZY + x;

coordGlobal = Cesium.Cartesian3.clamp(
Cesium.Cartesian3.fromElements(
tileX * dimensions.x + (coordTile.x - paddingBefore.x),
tileY * dimensions.y + (coordTile.y - paddingBefore.y),
tileZ * dimensions.z + (coordTile.z - paddingBefore.z),
tileX * dimensions.x + (x - paddingBefore.x),
tileY * dimensions.y + (y - paddingBefore.y),
tileZ * dimensions.z + (z - paddingBefore.z),
coordGlobal
),
minimumGlobalCoord,
@@ -309,7 +243,11 @@
fragmentShaderText: `void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material)
{
material.diffuse = fsInput.metadata.color.rgb;
material.alpha = 1.0;
float transparency = 1.0 - fsInput.metadata.color.a;
// To mimic light scattering, use exponential decay
float thickness = fsInput.voxel.travelDistance * 16.0;
material.alpha = 1.0 - pow(transparency, thickness);
}`,
});

@@ -336,6 +274,8 @@
const provider = new ProceduralSingleTileVoxelProvider(
Cesium.VoxelShapeType.ELLIPSOID
);
provider.minBounds.z = 0.0;
provider.maxBounds.z = 1000000.0;
const primitive = createPrimitive(
provider,
customShaderColor,
@@ -401,6 +341,8 @@
const provider = new ProceduralMultiTileVoxelProvider(
Cesium.VoxelShapeType.ELLIPSOID
);
provider.minBounds.z = 0.0;
provider.maxBounds.z = 1000000.0;
const primitive = createPrimitive(
provider,
customShaderColor,
File renamed without changes
Loading