function I3SLayer(dataProvider, layerData, parent) {
  this._dataProvider = dataProvider;
  this._parent = parent;

  if (!defined(layerData.href) && defined(layerData.id)) {
    // assign a default layer
    layerData.href = `layers/${layerData.id}`;
  }

  const parentUrl = this._parent.resource.getUrlComponent();

  let tilesetUrl = "";
  if (parentUrl.match(/layers\/\d/)) {
    tilesetUrl = `${parentUrl}`.replace(/\/+$/, "");
  } else {
    // Add '/' to url if needed + `${layerData.href}` if tilesetUrl not already in ../layers/[id] format
    tilesetUrl = `${parentUrl}`
      .replace(/\/?$/, "/")
      .concat(`${layerData.href}`);
  }

  this._version = layerData.store.version;
  const splitVersion = this._version.split(".");
  this._majorVersion = parseInt(splitVersion[0]);
  this._minorVersion = splitVersion.length > 1 ? parseInt(splitVersion[1]) : 0;

  this._resource = new Resource({ url: tilesetUrl });
  this._resource.setQueryParameters(
    this._dataProvider.resource.queryParameters,
  );
  this._resource.appendForwardSlash();
  this._data = layerData;
  this._rootNode = undefined;
  this._nodePages = {};
  this._nodePageFetches = {};
  this._extent = undefined;
  this._tileset = undefined;
  this._geometryDefinitions = undefined;
  this._filters = [];
  this._symbology = undefined;

  this._computeGeometryDefinitions(true);
  this._computeExtent();
}
This class implements an I3S layer. In CesiumJS each I3SLayer creates a Cesium3DTileset.
<p>
Do not construct this directly, instead access layers through {@link I3SDataProvider}.
</p>
@alias I3SLayer
@internalConstructor
@privateParam {I3SDataProvider} dataProvider The i3s data provider
@privateParam {object} layerData The layer data that is loaded from the scene layer
@privateParam {I3SDataProvider|I3SSublayer} parent The parent of that layer