Skip to content

Commit d503ccc

Browse files
authored
Merge pull request #12544 from CesiumGS/ellipsoid-voxel-order
Fix glTF voxel ordering for ellipsoid shapes
2 parents 145e2f2 + 7c9caa8 commit d503ccc

File tree

15 files changed

+115
-121
lines changed

15 files changed

+115
-121
lines changed

Apps/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/schema.json

-14
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
{
22
"tileAvailability": {
3-
"availableCount": 1,
43
"constant": 1
54
},
6-
"contentAvailability": {
7-
"availableCount": 1,
5+
"contentAvailability": [{
86
"constant": 1
9-
},
7+
}],
108
"childSubtreeAvailability": {
11-
"availableCount": 0,
129
"constant": 0
1310
}
1411
}

Apps/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tiles/0/0/0/0.gltf

+52-47
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,40 @@
22
"asset": {
33
"version": "2.0"
44
},
5+
"extensionsUsed": [
6+
"EXT_primitive_voxels",
7+
"EXT_structural_metadata"
8+
],
9+
"extensionsRequired": [
10+
"EXT_primitive_voxels",
11+
"EXT_structural_metadata"
12+
],
13+
"extensions": {
14+
"EXT_structural_metadata": {
15+
"schema": {
16+
"classes": {
17+
"voxel": {
18+
"properties": {
19+
"a": {
20+
"type": "VEC4",
21+
"componentType": "FLOAT32"
22+
}
23+
}
24+
}
25+
}
26+
},
27+
"propertyAttributes": [
28+
{
29+
"class": "voxel",
30+
"properties": {
31+
"a": {
32+
"attribute": "_DATA"
33+
}
34+
}
35+
}
36+
]
37+
}
38+
},
539
"scene": 0,
640
"scenes": [
741
{
@@ -19,82 +53,53 @@
1953
{
2054
"primitives": [
2155
{
22-
"mode": 2147483649,
2356
"attributes": {
24-
"_a": 0
57+
"_DATA": 0
2558
},
59+
"mode": 2147483647,
2660
"extensions": {
2761
"EXT_primitive_voxels": {
62+
"shape": 0,
2863
"dimensions": [
2964
2,
3065
2,
3166
2
32-
],
33-
"bounds": {
34-
"min": [
35-
0.0,
36-
0.0,
37-
-1.0
38-
],
39-
"max": [
40-
1.0,
41-
1.0,
42-
0.0
43-
]
44-
}
67+
]
68+
},
69+
"EXT_structural_metadata": {
70+
"propertyAttributes": [0]
4571
}
4672
}
4773
}
4874
]
4975
}
5076
],
51-
"extensionsUsed": [
52-
"EXT_primitive_voxels",
53-
"EXT_structural_metadata"
54-
],
55-
"extensionsRequired": [
56-
"EXT_primitive_voxels",
57-
"EXT_structural_metadata"
58-
],
59-
"extensions": {
60-
"EXT_structural_metadata": {
61-
"schemaUri": "../../../../schema.json",
62-
"propertyAttributes": [
63-
{
64-
"class": "voxel",
65-
"properties": {
66-
"a": {
67-
"attribute": "_a"
68-
}
69-
}
70-
}
71-
]
72-
}
73-
},
7477
"accessors": [
7578
{
7679
"bufferView": 0,
77-
"type": "SCALAR",
80+
"byteOffset": 0,
7881
"componentType": 5126,
79-
"min": [
80-
0.0
81-
],
82+
"count": 8,
8283
"max": [
83-
1.0
84+
1.0, 1.0, 1.0, 1.0
85+
],
86+
"min": [
87+
0.0, 0.0, 0.0, 0.0
8488
],
85-
"count": 8
89+
"type": "VEC4"
8690
}
8791
],
8892
"bufferViews": [
8993
{
9094
"buffer": 0,
91-
"byteLength": 32
95+
"byteOffset": 0,
96+
"byteLength": 128
9297
}
9398
],
9499
"buffers": [
95100
{
96101
"uri": "a.bin",
97-
"byteLength": 32
102+
"byteLength": 128
98103
}
99104
]
100-
}
105+
}
Binary file not shown.

Apps/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tileset.json

+15-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,19 @@
22
"asset": {
33
"version": "1.1"
44
},
5-
"schemaUri": "schema.json",
5+
"schema": {
6+
"id": "voxel",
7+
"classes": {
8+
"voxel": {
9+
"properties": {
10+
"a": {
11+
"type": "VEC4",
12+
"componentType": "FLOAT32"
13+
}
14+
}
15+
}
16+
}
17+
},
618
"statistics": {
719
"classes": {
820
"voxel": {
@@ -28,7 +40,7 @@
2840
500000.0
2941
]
3042
},
31-
"geometricError": 0.0,
43+
"geometricError": 16.0,
3244
"refine": "REPLACE",
3345
"content": {
3446
"uri": "tiles/{level}/{x}/{y}/{z}.gltf",
@@ -45,7 +57,7 @@
4557
},
4658
"implicitTiling": {
4759
"subdivisionScheme": "OCTREE",
48-
"subtreeLevels": 3,
60+
"subtreeLevels": 1,
4961
"availableLevels": 1,
5062
"subtrees": {
5163
"uri": "subtrees/{level}/{x}/{y}/{z}.json"

Apps/Sandcastle/gallery/Voxels in 3D Tiles.html

+5-13
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,6 @@
4444
viewer.extend(Cesium.viewerVoxelInspectorMixin);
4545
viewer.scene.debugShowFramesPerSecond = true;
4646

47-
const customShaderWhite = new Cesium.CustomShader({
48-
fragmentShaderText: `void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material)
49-
{
50-
material.diffuse = vec3(1.0);
51-
material.alpha = 1.0;
52-
}`,
53-
});
54-
5547
const customShaderColor = new Cesium.CustomShader({
5648
fragmentShaderText: `void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material)
5749
{
@@ -60,13 +52,13 @@
6052
}`,
6153
});
6254

63-
function createPrimitive(provider, customShader) {
55+
function createPrimitive(provider) {
6456
viewer.scene.primitives.removeAll();
6557

6658
const voxelPrimitive = viewer.scene.primitives.add(
6759
new Cesium.VoxelPrimitive({
6860
provider: provider,
69-
customShader: customShader,
61+
customShader: customShaderColor,
7062
}),
7163
);
7264

@@ -87,7 +79,7 @@
8779
const provider = await Cesium.Cesium3DTilesVoxelProvider.fromUrl(
8880
"../../SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tileset.json",
8981
);
90-
const primitive = createPrimitive(provider, customShaderColor);
82+
const primitive = createPrimitive(provider);
9183
},
9284
},
9385
{
@@ -96,7 +88,7 @@
9688
const provider = await Cesium.Cesium3DTilesVoxelProvider.fromUrl(
9789
"../../SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tileset.json",
9890
);
99-
const primitive = createPrimitive(provider, customShaderColor);
91+
const primitive = createPrimitive(provider);
10092
},
10193
},
10294
{
@@ -105,7 +97,7 @@
10597
const provider = await Cesium.Cesium3DTilesVoxelProvider.fromUrl(
10698
"../../SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tileset.json",
10799
);
108-
const primitive = createPrimitive(provider, customShaderWhite);
100+
const primitive = createPrimitive(provider);
109101
},
110102
},
111103
]);
10.2 KB
Loading

CHANGES.md

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#### Breaking Changes :mega:
88

99
- `Camera.getPickRay` was erroneously returning a result in camera coordinates. It is now returned in world coordinates as stated in the documentation. The result can be transformed using `Camera.inverseViewMatrix` to achieve the previous behavior.
10+
- `VoxelMetadataOrder` has been made private, and the `metadataOrder` property has been removed from the `VoxelProvider` interface.
1011

1112
#### Additions :tada:
1213

@@ -23,6 +24,7 @@
2324
- Fixed camera zooming in 3D orthographic mode when pixelRatio is not 1. [#12487](https://github.com/CesiumGS/cesium/pull/12487)
2425
- Fixed VaryingType.MAT3: "mat2" significant typo. [#12524](https://github.com/CesiumGS/cesium/issues/12524)
2526
- Fixed shape bounds and transforms for cylinder-shaped voxels. [#12522](https://github.com/CesiumGS/cesium/pull/12522)
27+
- Fixed metadata ordering for ellipsoid voxel tilesets. [#12544](https://github.com/CesiumGS/cesium/pull/12544)
2628
- Fixed an issue where clamped entities' height updates could stall when using high-resolution terrain due to a growing queue of tiles in `updateHeights` in `QuadtreePrimitive`. [#12476](https://github.com/CesiumGS/cesium/issues/12476)
2729

2830
## 1.127 - 2025-03-03

packages/engine/Source/Scene/Cesium3DTilesVoxelProvider.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,10 @@ function Cesium3DTilesVoxelProvider(options) {
110110
this._names = names;
111111
this._types = types;
112112
this._componentTypes = componentTypes;
113-
this._metadataOrder = VoxelMetadataOrder.GLTF;
113+
this._metadataOrder =
114+
shape === VoxelShapeType.ELLIPSOID
115+
? VoxelMetadataOrder.Z_UP
116+
: VoxelMetadataOrder.Y_UP;
114117
this._minimumValues = minimumValues;
115118
this._maximumValues = maximumValues;
116119
this._maximumTileCount = maximumTileCount;
@@ -288,6 +291,7 @@ Object.defineProperties(Cesium3DTilesVoxelProvider.prototype, {
288291
* @memberof Cesium3DTilesVoxelProvider.prototype
289292
* @type {VoxelMetadataOrder}
290293
* @readonly
294+
* @private
291295
*/
292296
metadataOrder: {
293297
get: function () {

packages/engine/Source/Scene/VoxelMetadataOrder.js

+14-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,22 @@
33
* In all cases, x data is contiguous in strides along the y axis,
44
* and each group of y strides represents a z slice.
55
* However, the orientation of the axes follows different conventions.
6+
*
67
* @enum {number}
8+
* @private
79
*/
810
const VoxelMetadataOrder = {
9-
XYZ: 0, // Default ordering following the 3D Tiles convention. Z-axis points upward.
10-
GLTF: 1, // Ordering following the glTF convention. Y-axis points upward.
11+
/**
12+
* The default ordering following the 3D Tiles convention. Z-axis points upward.
13+
* @type {number}
14+
* @constant
15+
*/
16+
Z_UP: 0,
17+
/**
18+
* The ordering following the glTF convention. Y-axis points upward.
19+
* @type {number}
20+
* @constant
21+
*/
22+
Y_UP: 1,
1123
};
1224
export default Object.freeze(VoxelMetadataOrder);

packages/engine/Source/Scene/VoxelPrimitive.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,7 @@ function initFromProvider(primitive, provider, context) {
15021502
primitive._paddingAfter,
15031503
primitive._inputDimensions,
15041504
);
1505-
if (provider.metadataOrder === VoxelMetadataOrder.GLTF) {
1505+
if (provider.metadataOrder === VoxelMetadataOrder.Y_UP) {
15061506
const inputDimensionsY = primitive._inputDimensions.y;
15071507
primitive._inputDimensions.y = primitive._inputDimensions.z;
15081508
primitive._inputDimensions.z = inputDimensionsY;

packages/engine/Source/Scene/VoxelProvider.js

-12
Original file line numberDiff line numberDiff line change
@@ -145,18 +145,6 @@ Object.defineProperties(VoxelProvider.prototype, {
145145
get: DeveloperError.throwInstantiationError,
146146
},
147147

148-
/**
149-
* Gets the ordering of the metadata in the buffers.
150-
*
151-
* @memberof VoxelProvider.prototype
152-
* @type {VoxelMetadataOrder}
153-
* @default VoxelMetadataOrder.XYZ
154-
* @readonly
155-
*/
156-
metadataOrder: {
157-
get: DeveloperError.throwInstantiationError,
158-
},
159-
160148
/**
161149
* Gets the metadata minimum values.
162150
*

0 commit comments

Comments
 (0)