import Color from "../Core/Color.js"; import defined from "../Core/defined.js"; import destroyObject from "../Core/destroyObject.js"; import RequestType from "../Core/RequestType.js"; import Pass from "../Renderer/Pass.js"; import Axis from "./Axis.js"; import Model from "./Model.js"; import ModelAnimationLoop from "./ModelAnimationLoop.js"; /** * Represents the contents of a glTF or glb tile in a {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification|3D Tiles} tileset using the {@link https://github.com/CesiumGS/3d-tiles/tree/3d-tiles-next/extensions/3DTILES_content_gltf/|3DTILES_content_gltf} extension. *
* Implements the {@link Cesium3DTileContent} interface. *
* * @alias Gltf3DTileContent * @constructor * * @private * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. */ function Gltf3DTileContent(tileset, tile, resource, gltf) { this._tileset = tileset; this._tile = tile; this._resource = resource; this._model = undefined; this.featurePropertiesDirty = false; this._groupMetadata = undefined; initialize(this, gltf); } Object.defineProperties(Gltf3DTileContent.prototype, { featuresLength: { get: function () { return 0; }, }, pointsLength: { get: function () { return this._model.pointsLength; }, }, trianglesLength: { get: function () { return this._model.trianglesLength; }, }, geometryByteLength: { get: function () { return this._model.geometryByteLength; }, }, texturesByteLength: { get: function () { return this._model.texturesByteLength; }, }, batchTableByteLength: { get: function () { return 0; }, }, innerContents: { get: function () { return undefined; }, }, readyPromise: { get: function () { return this._model.readyPromise; }, }, tileset: { get: function () { return this._tileset; }, }, tile: { get: function () { return this._tile; }, }, url: { get: function () { return this._resource.getUrlComponent(true); }, }, batchTable: { get: function () { return undefined; }, }, groupMetadata: { get: function () { return this._groupMetadata; }, set: function (value) { this._groupMetadata = value; }, }, }); function initialize(content, gltf) { var tileset = content._tileset; var tile = content._tile; var resource = content._resource; var pickObject = { content: content, primitive: tileset, }; content._model = new Model({ gltf: gltf, cull: false, // The model is already culled by 3D Tiles releaseGltfJson: true, // Models are unique and will not benefit from caching so save memory opaquePass: Pass.CESIUM_3D_TILE, // Draw opaque portions of the model during the 3D Tiles pass basePath: resource, requestType: RequestType.TILES3D, modelMatrix: tile.computedTransform, upAxis: tileset._gltfUpAxis, forwardAxis: Axis.X, shadows: tileset.shadows, debugWireframe: tileset.debugWireframe, incrementallyLoadTextures: false, addBatchIdToGeneratedShaders: false, pickObject: pickObject, imageBasedLightingFactor: tileset.imageBasedLightingFactor, lightColor: tileset.lightColor, luminanceAtZenith: tileset.luminanceAtZenith, sphericalHarmonicCoefficients: tileset.sphericalHarmonicCoefficients, specularEnvironmentMaps: tileset.specularEnvironmentMaps, backFaceCulling: tileset.backFaceCulling, showOutline: tileset.showOutline, }); content._model.readyPromise.then(function (model) { model.activeAnimations.addAll({ loop: ModelAnimationLoop.REPEAT, }); }); } Gltf3DTileContent.prototype.hasProperty = function (batchId, name) { return false; }; Gltf3DTileContent.prototype.getFeature = function (batchId) { return undefined; }; Gltf3DTileContent.prototype.applyDebugSettings = function (enabled, color) { color = enabled ? color : Color.WHITE; this._model.color = color; }; Gltf3DTileContent.prototype.applyStyle = function (style) { var hasColorStyle = defined(style) && defined(style.color); var hasShowStyle = defined(style) && defined(style.show); this._model.color = hasColorStyle ? style.color.evaluateColor(undefined, this._model.color) : Color.clone(Color.WHITE, this._model.color); this._model.show = hasShowStyle ? style.show.evaluate(undefined) : true; }; Gltf3DTileContent.prototype.update = function (tileset, frameState) { var model = this._model; var tile = this._tile; model.modelMatrix = tile.computedTransform; model.shadows = tileset.shadows; model.imageBasedLightingFactor = tileset.imageBasedLightingFactor; model.lightColor = tileset.lightColor; model.luminanceAtZenith = tileset.luminanceAtZenith; model.sphericalHarmonicCoefficients = tileset.sphericalHarmonicCoefficients; model.specularEnvironmentMaps = tileset.specularEnvironmentMaps; model.backFaceCulling = tileset.backFaceCulling; model.debugWireframe = tileset.debugWireframe; // Update clipping planes var tilesetClippingPlanes = tileset.clippingPlanes; model.referenceMatrix = tileset.clippingPlanesOriginMatrix; if (defined(tilesetClippingPlanes) && tile.clippingPlanesDirty) { // Dereference the clipping planes from the model if they are irrelevant. // Link/Dereference directly to avoid ownership checks. // This will also trigger synchronous shader regeneration to remove or add the clipping plane and color blending code. model._clippingPlanes = tilesetClippingPlanes.enabled && tile._isClipped ? tilesetClippingPlanes : undefined; } // If the model references a different ClippingPlaneCollection due to the tileset's collection being replaced with a // ClippingPlaneCollection that gives this tile the same clipping status, update the model to use the new ClippingPlaneCollection. if ( defined(tilesetClippingPlanes) && defined(model._clippingPlanes) && model._clippingPlanes !== tilesetClippingPlanes ) { model._clippingPlanes = tilesetClippingPlanes; } model.update(frameState); }; Gltf3DTileContent.prototype.isDestroyed = function () { return false; }; Gltf3DTileContent.prototype.destroy = function () { this._model = this._model && this._model.destroy(); return destroyObject(this); }; export default Gltf3DTileContent;