diff --git a/CHANGES.md b/CHANGES.md index c0c4fe46916..690dbc14cd7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,7 +12,7 @@ #### Additions :tada: - Add `ITwinData.loadGeospatialFeatures(iTwinId, collectionId)` function to load data from the [Geospatial Features API](https://developer.bentley.com/apis/geospatial-features/operations/get-features/) [#12449](https://github.com/CesiumGS/cesium/pull/12449) -- Implemented `textureByteLength`, `visited`, and `numberOfTilesWithContentReady` in `VoxelPrimitive.statistics`. +- Implemented `texturesByteLength`, `visited`, and `numberOfTilesWithContentReady` in `VoxelPrimitive.statistics`. #### Fixes :wrench: diff --git a/packages/engine/Source/Scene/Megatexture.js b/packages/engine/Source/Scene/Megatexture.js index f91828ef0d3..66a982d22b0 100644 --- a/packages/engine/Source/Scene/Megatexture.js +++ b/packages/engine/Source/Scene/Megatexture.js @@ -116,6 +116,12 @@ function Megatexture( */ this.componentType = componentType; + /** + * @type {number} + * @readonly + */ + this.textureMemoryByteLength = textureMemoryByteLength; + /** * @type {Cartesian3} * @readonly diff --git a/packages/engine/Source/Scene/VoxelPrimitive.js b/packages/engine/Source/Scene/VoxelPrimitive.js index a23e2cbc65f..5134067b9a8 100644 --- a/packages/engine/Source/Scene/VoxelPrimitive.js +++ b/packages/engine/Source/Scene/VoxelPrimitive.js @@ -1434,6 +1434,8 @@ function initFromProvider(primitive, provider, context) { // Create the VoxelTraversal, and set related uniforms primitive._traversal = setupTraversal(primitive, provider, context); + primitive.statistics.texturesByteLength = + primitive._traversal.textureMemoryByteLength; setTraversalUniforms(primitive._traversal, uniforms); } @@ -1812,6 +1814,7 @@ VoxelPrimitive.prototype.destroy = function () { this._pickId = this._pickId && this._pickId.destroy(); this._traversal = this._traversal && this._traversal.destroy(); + this.statistics.texturesByteLength = 0; this._clippingPlanes = this._clippingPlanes && this._clippingPlanes.destroy(); return destroyObject(this); diff --git a/packages/engine/Source/Scene/VoxelTraversal.js b/packages/engine/Source/Scene/VoxelTraversal.js index 8f205853028..38ca5327bb1 100644 --- a/packages/engine/Source/Scene/VoxelTraversal.js +++ b/packages/engine/Source/Scene/VoxelTraversal.js @@ -1,5 +1,4 @@ import Cartesian2 from "../Core/Cartesian2.js"; -import Cartesian3 from "../Core/Cartesian3.js"; import CesiumMath from "../Core/Math.js"; import CullingVolume from "../Core/CullingVolume.js"; import defined from "../Core/defined.js"; @@ -50,6 +49,12 @@ function VoxelTraversal( */ this._primitive = primitive; + /** + * @type {number} + * @private + */ + this.textureMemoryByteLength = 0; + /** * @type {Megatexture[]} * @readonly @@ -69,6 +74,9 @@ function VoxelTraversal( componentType, maximumTextureMemoryByteLength, ); + + this.textureMemoryByteLength += + this.megatextures[i].textureMemoryByteLength; } const maximumTileCount = this.megatextures[0].maximumTileCount; @@ -223,8 +231,6 @@ function VoxelTraversal( this.leafNodeTexelSizeUv = new Cartesian2(); } -const scratchDimensions = new Cartesian3(); - /** * Finds a keyframe node in the traversal * @@ -382,6 +388,7 @@ VoxelTraversal.prototype.destroy = function () { for (let i = 0; i < megatextureLength; i++) { megatextures[i] = megatextures[i] && megatextures[i].destroy(); } + this.textureMemoryByteLength = 0; this.internalNodeTexture = this.internalNodeTexture && this.internalNodeTexture.destroy(); @@ -683,18 +690,6 @@ function loadAndUnload(that, frameState) { keyframeNodesInMegatexture[addNodeIndex] = highPriorityKeyframeNode; } } - - const dimensions = Cartesian3.clone( - primitive._provider.dimensions, - scratchDimensions, - ); - primitive.statistics.textureByteLength = - VoxelTraversal.getApproximateTextureMemoryByteLength( - that.megatextures[0].occupiedCount, - dimensions, - primitive._provider.types, - primitive._provider.componentTypes, - ); } /** diff --git a/packages/engine/Specs/Scene/VoxelPrimitiveSpec.js b/packages/engine/Specs/Scene/VoxelPrimitiveSpec.js index 07730c4df35..50ead9862c1 100644 --- a/packages/engine/Specs/Scene/VoxelPrimitiveSpec.js +++ b/packages/engine/Specs/Scene/VoxelPrimitiveSpec.js @@ -70,7 +70,7 @@ describe( expect(spyUpdate.calls.count()).toEqual(1); }); - it("initial tiles loaded and all tiles loaded events are raised", async function () { + it("initial tiles loaded and all tiles loaded events are raised and statistics are updates", async function () { const spyUpdate1 = jasmine.createSpy("listener"); const spyUpdate2 = jasmine.createSpy("listener"); const primitive = new VoxelPrimitive({ provider }); @@ -85,7 +85,7 @@ describe( expect(spyUpdate2.calls.count()).toEqual(1); expect(primitive.statistics.numberOfTilesWithContentReady).toEqual(1); expect(primitive.statistics.visited).toEqual(1); - expect(primitive.statistics.textureByteLength).toEqual(64); + expect(primitive.statistics.texturesByteLength).toEqual(134217728); }); it("tile load, load progress and tile visible events are raised", async function () { @@ -266,6 +266,7 @@ describe( expect(primitive.isDestroyed()).toBe(true); expect(primitive._pickId).toBeUndefined(); expect(primitive._traversal).toBeUndefined(); + expect(primitive.statistics).toBeDefined(); }); }, "WebGL", diff --git a/packages/engine/Specs/Scene/VoxelTraversalSpec.js b/packages/engine/Specs/Scene/VoxelTraversalSpec.js index d117a03c82e..74a19543178 100644 --- a/packages/engine/Specs/Scene/VoxelTraversalSpec.js +++ b/packages/engine/Specs/Scene/VoxelTraversalSpec.js @@ -147,6 +147,12 @@ describe( expect(traversal.isDestroyed()).toBe(true); }); + it("shows texture memory allocation statistic", function () { + expect(traversal.textureMemoryByteLength).toBe(textureMemory); + traversal.destroy(); + expect(traversal.textureMemoryByteLength).toBe(0); + }); + it("loads tiles into megatexture", async function () { const keyFrameLocation = 0; const recomputeBoundingVolumes = true; @@ -161,13 +167,15 @@ describe( scene.renderForSpecs(); return ( traversal.megatextures[0].occupiedCount > 0 && - traversal._primitive.statistics.textureByteLength > 0 + traversal._primitive.statistics.texturesByteLength > 0 ); }); const megatexture = traversal.megatextures[0]; expect(megatexture.occupiedCount).toBe(1); - expect(traversal._primitive.statistics.textureByteLength).toEqual(64); + expect(traversal._primitive.statistics.texturesByteLength).toEqual( + 134217728, + ); }); it("tile failed event is raised", async function () { @@ -196,7 +204,6 @@ describe( traversal._primitive.statistics.numberOfTilesWithContentReady, ).toEqual(0); expect(traversal._primitive.statistics.visited).toEqual(3); - expect(traversal._primitive.statistics.textureByteLength).toEqual(0); }); it("finds keyframe node with expected metadata values", async function () {