diff --git a/extensions/3DTILES_implicit_tiling/README.md b/extensions/3DTILES_implicit_tiling/README.md
new file mode 100644
index 000000000..c1ef65772
--- /dev/null
+++ b/extensions/3DTILES_implicit_tiling/README.md
@@ -0,0 +1,1129 @@
+# 3DTILES_implicit_tiling Extension
+
+## Contributors
+
+- Sam Suhag, Cesium
+- Sean Lilley, Cesium
+- Josh Lawrence, Cesium
+- Patrick Cozzi, Cesium
+
+## Contents
+
+* [Overview](#overview)
+* [Dependencies](#dependencies)
+* [Concepts](#concepts)
+ * [Tiling Scheme](#tiling-scheme)
+ * [Root Tiles](#root-tiles)
+ * [Levels](#levels)
+ * [Tile Location](#tile-location)
+ * [Tile States](#tile-states)
+ * [Subdivision](#subdivision)
+ * [Content](#content)
+ * [Metadata](#metadata)
+ * [Bitstream Layout](#bitstream-layout)
+* [Properties Reference](#properties-reference)
+* [Appendix](#appendix)
+ * [Algorithms](#algorithms)
+ * [Jump Buffer Construction](#jump-buffer-construction)
+ * [Tile Index Lookup](#tile-index-lookup)
+ * [Examples](#examples)
+
+## Overview
+
+This extension enables 3D Tiles to support tilesets with implied subdivision schemes. This improves interoperability with existing geospatial data formats that use implicit tiling schemes, such as [CDB](https://www.ogc.org/standards/cdb) and [WMTS](https://www.ogc.org/standards/wmts). When subdivision is implied, it enables simplification at every stage of the tileset's lifetime: querying tree structure from the server, data storage on the client, as well as simplification and optimization of algorithms involved with the structure of the tree such as traversal, visibility, arbitrary selection of tiles in a region, ray casting, analysis, etc.
+
+## Dependencies
+
+This extension depends on [3DTILES_binary_buffers](https://github.com/CesiumGS/3d-tiles/blob/3DTILES_binary_buffers/extensions/3DTILES_binary_buffers/README.md) for storage of the binary data and [3DTILES_tile_metadata](https://github.com/CesiumGS/3d-tiles/blob/3DTILES_tile_metadata/extensions/3DTILES_tile_metadata/README.md) for tile metadata.
+
+## Concepts
+
+### Tiling Scheme
+
+Tiling schemes specify how each tile in a level will subdivide in the next level. The tiling scheme remains consistent in a tileset, however, tiling schemes can be combined by using external tilesets.
+
+#### Quadtree
+
+
+
+When a tile subdivides into a [quadtree](https://en.wikipedia.org/wiki/Quadtree), it produces 4 children tiles that occupy the same area as the parent tile. The tile is split on the XY plane at the midpoint of the bounds along the X and Y axes. The following diagrams illustrate quadtree subdivision for the various bounding volume types in 3D Tiles:
+
+#### Octree
+
+
+
+When a tile subdivides into an [octree](https://en.wikipedia.org/wiki/Octree), it produces 8 equally size children tiles that occupy the same volume as the parent tile. The tile is split at the midpoint of the bounds along the X, Y and Z axes.
+
+#### Bounding Volumes
+
+The following diagrams illustrate the subdivision in the bounding volume types supported by 3D Tiles:
+
+##### Box
+
+| Root | Quadtree | Octree |
+|:---:|:--:|:--:|
+|  |  |  |
+
+##### Region
+
+| Region | Quadtree | Octree |
+|:---:|:--:|:--:|
+|  |  |  |
+
+### Root Tiles
+
+Existing formats that use implicit tiling schemes often use data structures such as double-headed quadtrees, in the case of [TMS](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification) and [quantized-mesh](https://github.com/CesiumGS/quantized-mesh), and six-headed quadtrees in tiling schemes such as [S2geometry](https://s2geometry.io/). To represent such hierarchies, a "base" or parent tileset may be used to combine multiple tilesets that use this extension, where each tileset serves as the "head" or the root of subdivision. The [examples](#examples) section includes some templates for representation of such data structures using this extension.
+
+When a tileset is using the `3DTILES_implicit_tiling` extension, the runtime should ignore the `root` property of the `tileset.json`.
+
+### Levels
+
+
+
+Every level of the tree can be thought of as a fixed grid of tiles, where the level occupies the same space as the previous level but with double the amount of tiles along each axis that gets split (2 in case of [quadtree](https://en.wikipedia.org/wiki/Quadtree) and 3 in case of [octree](https://en.wikipedia.org/wiki/Octree)).
+
+### Tile Location
+
+#### Location in space
+
+
+
+Level grids are indexed from the bottom left, using a right handed coordinate system, with +Z pointing in the up direction.
+
+Tiles in a level are indexed by applying the [Morton/Z-order](https://en.wikipedia.org/wiki/Z-order_curve) curve to the grid at that level. Using the Morton order serves two primary purposes:
+
+- Efficient tile location decomposition: The Morton order allows efficient encoding and decoding of locations of a tile in the level grid to its location in the tile state bitstreams.
+- Efficient traversal: The binary representation of tile locations in the grid allow for easy traversal of the tileset.
+
+*The following section is non-normative*
+
+The figure below shows the tile location decomposition of the tile `3/5/1` (Level: 3, X: 5, Y: 1). We first convert the tile location to its Morton index, which is `19`. At Level 3 of a Quadtree, we'll use 6 bits to represent the binary value of the Morton index: `010011`.
+
+
+
+#### Location on disk
+
+Tiles are located in the file system according to their level in the tileset hierarchy in the following order: `Level/X/Y/Z`. In the case of a quadtree, the `Z` parameter is omitted.
+
+### Tile States
+
+Information about the state of each tile in the tileset is present in 2 categories. The first category is related to **structure** of the spatial hierarchy of the tileset, and if/how a tile subdivides into external tilesets. The second category is related to **availability**, of content and metadata, for each tile.
+
+State information for the tileset is stored in the following bitstreams:
+
+
+| Bitstream | Description | Size (bits) |
+|------|-------------------|---|
+| subdivision | Encodes subdivision of each tile | 2 |
+| content | Encodes availability of content for each tile | 1 |
+| metadata | Encodes availability of metadata for each tile | 1 |
+
+#### Subdivision
+
+The subdivision state for each tile determines if and how it subdivides into children tiles, as per the `tilingScheme`. The subdivision state is encoded in 2 bits. The buffer will use the `BIT` component type and associated layout rules, as defined in the [3DTILES_binary_buffers](https://github.com/CesiumGS/3d-tiles/blob/3DTILES_binary_buffers/extensions/3DTILES_binary_buffers/README.md#3dtiles_binary_buffersubdivisionBufferviews) extension. A tile can have one of the following subdivision states:
+
+| Bitcode | Description |
+|------|--------------------------------------------------------|
+| `00` | Does not subdivide. |
+| `01` | Subdivides into external tileset at implicit location. |
+| `10` | Subdivides into external tileset at explicit location. |
+| `11` | Subdivides internally. |
+
+When a tile subdivides externally, the content and metadata for the root tile are obtained from the external tileset. Only leaf nodes may subdivide externally; the root tile of a tileset using this extension may only subdivide internally.
+
+##### External Tileset at Implicit Location
+
+An external tileset may exist within the file structure of its parent tileset, with the `tileset.json` of the external tileset being present at the implicit location of the tile with subdivision state `01`. All tiles in that belong to this tileset belong are located according to the parent tileset's file structure.
+
+**The following section is non-normative**
+
+The following diagrams illustrate how external subdivision at implicit location works. In this tileset, all tiles at level 1 have the subdivision bitcode `01`.
+
+
+
+The directory structure for this tileset would look as follows, with all tiles at level 1 and 2 belonging to their respective parent tiles at level 1; however, the tiles are still following the file layout of the base tileset.
+
+```
+.
+└── MainArchive/
+ ├── tileset.json
+ ├── 0/
+ │ └── 0/
+ │ └── 0.glb
+ ├── 1/
+ │ ├── 0/
+ │ │ ├── 0.json
+ │ │ └── 1.json
+ │ └── 1/
+ │ ├── 0.json
+ │ └── 1.json
+ └── 2/
+ ├── 0/
+ │ ├── 0.glb
+ │ ├── 1.glb
+ │ ├── 2.glb
+ │ └── 3.glb
+ ├── 1/
+ │ ├── 0.glb
+ │ ├── 1.glb
+ │ ├── 2.glb
+ │ └── 3.glb
+ ├── 2/
+ │ ├── 0.glb
+ │ ├── 1.glb
+ │ ├── 2.glb
+ │ └── 3.glb
+ └── 3/
+ ├── 0.glb
+ ├── 1.glb
+ ├── 2.glb
+ └── 3.glb
+```
+
+##### External Tileset at Explicit Location
+
+An external tileset may exist outside the file structure of its parent tileset, with the location of the external tileset being present in the `tile.json` at the implicit location of the tile with subdivision state `10`. All tiles in that belong to this tileset belong are located according to its own file structure.
+
+The following diagrams illustrate how external subdivision at implicit location works. In this tileset, all tiles at level 1 have the subdivision bitcode `10`.
+
+
+
+The directory structure for this tileset would look as follows, with all tiles at level 2 belonging to their respective parent tiles at level 1. Each tile at level follows an independent file layout.
+
+```
+.
+├── MainArchive/
+│ ├── tileset.json
+│ ├── 0/
+│ │ └── 0/
+│ │ └── 0.glb
+│ └── 1/
+│ ├── 0/
+│ │ ├── 0.json
+│ │ └── 1.json
+│ └── 1/
+│ ├── 0.json
+│ └── 1.json
+└── ExternalArchive/
+ ├── 0/
+ │ ├── tileset.json
+ │ ├── 0/
+ │ │ └── 0.glb
+ │ └── 1/
+ │ ├── 0/
+ │ │ ├── 0.glb
+ │ │ └── 1.glb
+ │ └── 1/
+ │ ├── 0.glb
+ │ └── 1.glb
+ ├── 1/
+ │ ├── tileset.json
+ │ ├── 0/
+ │ │ └── 0.glb
+ │ └── 1/
+ │ ├── 0/
+ │ │ ├── 0.glb
+ │ │ └── 1.glb
+ │ └── 1/
+ │ ├── 0.glb
+ │ └── 1.glb
+ ├── 2/
+ │ ├── tileset.json
+ │ ├── 0/
+ │ │ └── 0.glb
+ │ └── 1/
+ │ ├── 0/
+ │ │ ├── 0.glb
+ │ │ └── 1.glb
+ │ └── 1/
+ │ ├── 0.glb
+ │ └── 1.glb
+ └── 3/
+ ├── tileset.json
+ ├── 0/
+ │ └── 0.glb
+ └── 1/
+ ├── 0/
+ │ ├── 0.glb
+ │ └── 1.glb
+ └── 1/
+ ├── 0.glb
+ └── 1.glb
+```
+
+
+##### Complete Depth
+
+For tilesets that have uniform subdivision for each tile up to a certain level, it is redundant to store the tile subdivision state information. The `completeDepth` property is used to indicate how many levels within the tileset are complete; levels are considered complete if all tiles subdivide implicitly and internally (using the bitcode `11`).
+
+##### Maximum Depth
+
+The maximum depth property describes the highest level of subdivision in the tileset.
+
+#### Content
+
+This is a one bit representation of whether or not a tile has content associated with it.
+
+| Code | Description |
+|------|-------------------|
+| `0` | No content |
+| `1` | Has content |
+
+When the tile has content, the content payload can be found implicitly by combining the tile location with the content extension.
+
+#### Metadata
+
+This is a one bit representation of whether or not a tile has metadata associated with it.
+
+| Code | Description |
+|------|-------------------|
+| `0` | No metadata |
+| `1` | Has metadata |
+
+
+When the tile has metadata, the index of of the tile's properties in the `3DTILES_tile_metadata` buffers is the number of tiles containing metadata preceding this tile.
+
+#### Fill Offset
+
+In the content and metadata objects, a fill offset may be specified to apply the fill value to each tile in all levels up to and including the fill offset.
+
+#### Fill Value
+
+The fill value is the state value that will apply to each tile in a all levels up to and including the fill offset.
+
+### Bitstream Storage
+
+Bitstreams are stored in `bufferView`s, which are typed views into a binary buffer. The value of any `bufferView` property used in this extension is an index into the `bufferViews` array of the `3DTILES_binary_buffers` extension.
+
+### Bitstream Layout
+
+Each bitstream encodes tile state information using an adaptive linear quadtree or octree (depending on the `tilingScheme`) representation of the hierarchy. Tile states are packed in increasing order of level and Morton index of tiles within that level. Only tiles that subdivide internally will have information about their children present at the next level. This allows for a space efficient representation of sparse hierarchies.
+
+*The following section is non-normative.*
+
+The following example illustrates the usage of these buffers in a sparse quadtree that extends to 2 levels.
+
+```json
+{
+ "tilingScheme": "QUADTREE",
+ "subdivision": {
+ "bufferView": 0,
+ "maximumDepth": 2
+ },
+ "content": {
+ "fillOffset": 2,
+ "fillValue": 1,
+ "bufferView": 1
+ },
+ "metadata": {
+ "fillOffset": 2,
+ "fillValue": 0,
+ "bufferView": 0
+ }
+}
+```
+
+Only the information with bold text is present in the bitstream.
+
+
+
+## Properties Reference
+
+---------------------------------------
+### 3DTILES_implicit_tiling Tileset JSON extension
+
+Specifies the properties for the 3DTILES_implicit_tiling object.
+
+**Properties**
+
+| |Type|Description|Required|
+|---|----|-----------|--------|
+|**boundingVolume**|`object`|A bounding volume that encloses the tileset.|☑️ Yes|
+|**tilingScheme**|`string`|A string describing the tiling scheme used within the tileset.|☑️ Yes|
+|**geometricError**|`number`|The error, in meters, introduced if this tile is rendered and its children are not. At runtime, the geometric error is used to compute screen space error (SSE), i.e., the error measured in pixels.|☑️ Yes|
+|**refine**|`string`|A string to indicate if additive or replacement refinement is used when traversing the tileset for rendering. This property applies to all tiles in the tileset.|☑️ Yes|
+|**subdivision**|`object`|An object containing high level information about the subdivision buffer|☑️ Yes|
+|**transform**|`number` `[16]`|A floating-point 4x4 affine transformation matrix, stored in column-major order, that transforms the tile's content--i.e., its features as well as content.boundingVolume, boundingVolume, and viewerRequestVolume--from the tile's local coordinate system to the parent tile's coordinate system, or, in the case of a root tile, from the tile's local coordinate system to the tileset's coordinate system. transform does not apply to geometricError, nor does it apply any volume property when the volume is a region or a cell, defined in EPSG:4979 coordinates.|No|
+|**content**|`object`|An object containing high level information about the content buffer. This may be omitted if no tiles in the tileset contain content.|No|
+|**metadata**|`object`|An object containing high level information about the metadata buffer. This may be omitted if no tiles in the tileset contain metadata.|No|
+|**contentExtension**|`string`|The extension used to query tile content.|No|
+|**tilesetExtension**|`string`|The extension used to query implicit external tilesets.|No|
+
+Additional properties are not allowed.
+
+---
+
+
+### boundingVolume
+
+A bounding volume that encloses the tileset. Exactly one `box`, `region` or `geodesicQuad` property is required.
+
+**Properties**
+
+| |Type|Description|Required|
+|---|----|-----------|--------|
+|**box**|`number` `[12]`|An array of 12 numbers that define an oriented bounding box. The first three elements define the x, y, and z values for the center of the box. The next three elements (with indices 3, 4, and 5) define the x axis direction and half-length. The next three elements (indices 6, 7, and 8) define the y axis direction and half-length. The last three elements (indices 9, 10, and 11) define the z axis direction and half-length.|No|
+|**region**|`number` `[6]`|An array of six numbers that define a bounding geographic region in EPSG:4979 coordinates with the order [west, south, east, north, minimum height, maximum height]. Longitudes and latitudes are in radians, and heights are in meters above (or below) the WGS84 ellipsoid.|No|
+|**geodesicQuad**|`number` `[10]`|An array of 10 numbers that defines a geodesic quadrilateral. The first 8 elements are 4 pairs of EPSG:4979 coordinates in radians, and the last 2 elements are heights in meters above the WGS84 ellipsoid.|No|
+
+Additional properties are not allowed.
+
+#### boundingVolume.box
+
+An array of 12 numbers that define an oriented bounding box. The first three elements define the x, y, and z values for the center of the box. The next three elements (with indices 3, 4, and 5) define the x axis direction and half-length.
+The next three elements (indices 6, 7, and 8) define the y axis direction and half-length. The last three elements (indices 9, 10, and 11) define the z axis direction and half-length.
+
+When using the quadtree tiling scheme, the split axes are defined on the X-Z plane at `Y * 0.5` and the Y-Z plane at `X * 0.5`. When using the octree tiling scheme, an additional split axis is defined on the X-Y plane at `Z * 0.5`.
+
+* **Type**: `number` `[12]`
+* **Required**: No
+
+#### boundingVolume.region
+
+An array of six numbers that define a bounding geographic region in EPSG:4979 coordinates with the order [west, south, east, north, minimum height, maximum height]. Longitudes and latitudes are in radians, and heights are in meters above (or below) the WGS84 ellipsoid.
+
+When using the quadtree tiling scheme, the split axes are defined on the X-Z plane at `(west - east) * 0.5` and the Y-Z plane at `(south - north) * 0.5`. When using the octree tiling scheme, an additional split axis is defined on the X-Y plane at `(maxHeight - minHeight) * 0.5`.
+
+* **Type**: `number` `[6]`
+* **Required**: No
+
+#### boundingVolume.geodesicQuad
+
+An array of 10 numbers that defines a geodesic quadrilateral. The first 8 elements are 4 pairs of EPSG:4979 coordinates in degrees in counterclockwise order, and the last 2 elements are heights in meters above the WGS84 ellipsoid.
+
+When using the quadtree tiling scheme, the first split axis is defined through the midpoint of the geodesic between the first and second point and the midpoint of the geodesic between the third and the fourth point. The second split axis is defined through the midpoint of the geodesic between the second and third point and the midpoint of the geodesic between the fourth and the first point. When using the octree tiling scheme, an additional split axis is defined at `(maxHeight - minHeight) * 0.5`.
+
+* **Type**: `number` `[10]`
+* **Required**: No
+
+---
+
+### tilingScheme
+
+Describes the tiling scheme used in the tileset.
+
+ - **Type**: string
+ - **Required**: No
+ - **Allowed Values**:
+ - "QUADTREE"
+ - "OCTREE"
+
+---
+
+### geometricError
+
+The error, in meters, introduced if this tile is rendered and its children are not. At runtime, the geometric error is used to compute screen space error (SSE), i.e., the error measured in pixels. The geometric error is halved for each level of subdivision within an implicit tileset.
+
+- **Type**: number
+- **Required**: Yes
+- **Minimum**: >= 0
+
+---
+
+### refine
+
+Specifies if additive or replacement refinement is used when traversing the tileset for rendering. This property applies to all tiles in the tileset.
+
+ - **Type**: string
+ - **Required**: Yes
+ - **Allowed Values**:
+ - "ADD"
+ - "REPLACE"
+
+---
+
+### transform
+
+A floating-point 4x4 affine transformation matrix, stored in column-major order, that transforms the tile's content--i.e., its features as well as content.boundingVolume, boundingVolume, and viewerRequestVolume--from the tile's local coordinate system to the parent tile's coordinate system, or, in the case of a root tile, from the tile's local coordinate system to the tileset's coordinate system. transform does not apply to geometricError, nor does it apply any volume property when the volume is a region, defined in EPSG:4979 coordinates.
+
+- **Type**: number [16]
+- **Required**: No, default: [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]
+
+---
+
+### subdivision
+
+Provides information about the spatial hierarchy of the tileset. The structure of the tileset may be specified through the `completeDepth` property for tilesets that subdivide completely to a certain level. For all levels between the `completeDepth` and the `maximumDepth`, the subdivision bitstream is available in the `bufferView`. If a tileset is complete, the `bufferView` may be omitted.
+
+**Properties**
+
+| |Type|Description|Required|
+|---|----|-----------|--------|
+|**completeDepth**|`number`|An integer describing how many levels subdivide internally. The default value for the subdivision state for all tiles on complete levels is `11`.|No, the default value is 0.|
+|**maximumDepth**|`number`|An integer describing the highest level of internal subdivision.|Yes|
+|**bufferView**|`number`|An index to the buffer view containing the subdivision buffer.|No|
+
+---
+
+### content
+
+Provides information about the content of the tileset. The content bitstream can be read from the associated `bufferView`. For tilesets that have uniform content states up to some level `n`, a `fillOffset` may be specified, which enables the runtime to assume that the provided `fillValue` is the content state value for all tiles in levels up to and including the `fillOffset`. For all levels between the `fillOffset` and the `maximumDepth`, the content bitstream is available in the associated `bufferView`.
+
+**Properties**
+
+| |Type|Description|Required|
+|---|----|-----------|--------|
+|**fillOffset**|`number`|An integer describing which level the content bitstream, if provided, starts at|No|
+|**fillValue**|`number`|An integer describing the state value for the content bit for all levels up to and including the `fillOffset`. The default value is `0`. |No|
+|**bufferView**|`number`|An index to the buffer view containing the content buffer.|No|
+
+---
+
+### metadata
+
+Provides information about the metadata of the tileset. For tilesets that have uniform metadata states up to some level `n`, a `fillOffset` may be specified, which enables the runtime to assume that the provided `fillValue` is the metadata state value for all tiles in levels up to and including the `fillOffset`. For all levels between the `fillOffset` and the `maximumDepth`, the metadata bitstream can be read from the associated `bufferView`.
+
+**Properties**
+
+| |Type|Description|Required|
+|---|----|-----------|--------|
+|**fillOffset**|`number`|An integer describing which level the metadata bitstream, if provided, starts at|No|
+|**fillValue**|`number`|An integer describing the state value for the metadata bit for all levels up to and including the `fillOffset`. The default value is `0`. |No|
+|**bufferView**|`number`|An index to the buffer view containing the metadata buffer.|No|
+
+## Appendix
+
+### Algorithms
+
+#### Jump Buffer Construction
+
+The jump buffer is a buffer created at runtime to allow efficient traversal and tile lookup functions. The jump buffer is a bijection between a tile's Morton index and its index in the level.
+
+```javascript
+function createJumpBuffer(subdivisionBuffer) {
+ let jumpBuffer = [];
+ let subdivisionBufferIndex = 1;
+ let currentLevel = 0;
+ while (subdivisionBufferIndex != subdivisionBuffer.length) {
+ currentLevel++;
+ jumpBuffer.push([]);
+ // Get maximum number of elements in this level, based on number of tiles in the level above that will subdivide.
+ let currentLevelMax = jumpBuffer[currentLevel - 1].length * tilingScheme;
+ jumpBufferSize += currentLevelMax;
+ for (let i = 0; i < currentLevelMax; i++) {
+ if (subdivisionBuffer[subdivisionBufferIndex++] === 1) {
+ jumpBuffer[currentLevel].push(jumpBuffer[currentLevel - 1][Math.floor(i / tilingScheme)] * tilingScheme + (i % tilingScheme));
+ }
+ }
+ }
+ return jumpBuffer;
+}
+```
+
+#### Tile Index Lookup
+
+For all tile lookups in complete levels, the tile index in the content and subdivision buffers can be found by directly calculating the Morton index and adding to it the number of tiles in all levels before search level:
+
+```
+(TILING_SCHEME ** (LEVEL + 1)) - 1) / (TILING_SCHEME - 1) + MORTON(X, Y, Z)
+```
+
+where `TILING_SCHEME` is 4 for quadtree and 8 for octree.
+
+For sparse trees, the tile lookups can be performed using the following algorithm:
+
+```javascript
+Input:
+ 1. L - Tile level
+ 2. X - X coordinate of tile at level L
+ 3. Y - Y coordinate of tile at level L
+ 4. Z - Z coordinate of tile at level L
+
+Algorithm:
+ M = morton(X, Y, Z)
+ if (L < completeLevels):
+ else
+ while (currentLevel <= L)
+ // Index of the parent tile (Check the most significant LEVEL + 1 bits)
+ parentTileMorton = M >> (2 ^ (L - currentLevel + 1))
+ // Get the index of the current tile in the parent tile
+ currentTileOffset = morton % TILING_SCHEME
+ currentTileLocation = fillOffset + jumpBuffer[currentLevel - 1].indexOf(parentTileMorton) + currentTileOffset
+
+---------------------
+
+function getIndex(level, x, y, z) {
+ const mortonIndex = morton(x, y, z);
+ if (level === 1) {
+ return 1 + mortonIndex;
+ }
+ // Level 1 Search
+ const levelOneCellMorton = mortonIndex >> 2;
+ if (subdivisionBuffer[1 + levelOneCellMorton] === 1) {
+ // Level 2... Search
+ return traverse(level, mortonIndex, 2, 5);
+ }
+ return -1;
+}
+
+function traverse(targetLevel, morton, currentLevel, fillOffset) {
+ const parentTileMorton = morton >> (2 ^ (targetLevel - currentLevel + 1));
+ const currentTileOffset = morton % 4;
+ const currentTileBufferOffset = fillOffset + jumpBuffer[currentLevel - 1].indexOf(parentTileMorton) + currentTileOffset;
+
+ if (targetLevel === currentLevel) {
+ return currentTileBufferOffset;
+ }
+
+ if (subdivisionBuffer[currentTileBufferOffset] === 1) {
+ return traverse(targetLevel, morton, currentLevel + 1, fillOffset + (jumpBuffer[currentLevel].length * tilingScheme));
+ } else {
+ return -1;
+ }
+}
+```
+
+### Examples
+
+#### Complete Octree
+
+##### Root Tileset - tileset.json
+
+```json
+{
+ "asset": {
+ "version": "1.0"
+ },
+ "geometricError": 10000,
+ "extensions": {
+ "3DTILES_implicit_tiling": {
+ "boundingVolume": {
+ "box": [
+ 0, 0, 0,
+ 5, 0, 0,
+ 0, 5, 0,
+ 0, 0, 5
+ ]
+ },
+ "tilingScheme": "OCTREE",
+ "geometricError": 5000,
+ "refine": "REPLACE",
+ "contentExtension": ".glb",
+ "tilesetExtension": ".json",
+ "subdivision": {
+ "completeDepth": 3,
+ "maximumDepth": 3
+ },
+ "content": {
+ "fillOffset": 4,
+ "fillValue": 1
+ }
+ }
+ }
+}
+```
+
+##### Directory Structure
+
+```
+.
+└── tileset.json/
+ ├── L0/
+ │ └── 0/
+ │ └── 0/
+ │ └── 0.glb
+ ├── L1/
+ │ ├── 0/
+ │ │ ├── 0/
+ │ │ │ ├── 0.glb
+ │ │ │ └── 1.glb
+ │ │ └── 1/
+ │ │ ├── 0.glb
+ │ │ └── 1.glb
+ │ └── 1/
+ │ ├── 0/
+ │ │ ├── 0.glb
+ │ │ └── 1.glb
+ │ └── 1/
+ │ ├── 0.glb
+ │ └── 1.glb
+ └── L2/
+ ├── 0/
+ │ └── 0/
+ │ ├── 0.glb
+ │ └── 1.glb
+ └── ...
+
+#### Double Headed Quadtree (as 2 separate tilesets)
+
+##### Root 0 Tileset - tileset.json
+
+```json
+{
+ "asset": {
+ "version": "1.0"
+ },
+ "geometricError": 500,
+ "extensions": {
+ "3DTILES_implicit_tiling": {
+ "boundingVolume": {
+ "box": [
+ 0, 0, 0,
+ 5, 0, 0,
+ 0, 5, 0,
+ 0, 0, 5
+ ]
+ },
+ "tilingScheme": "QUADTREE",
+ "geometricError": 5000,
+ "refine": "REPLACE",
+ "contentExtension": ".glb",
+ "tilesetExtension": ".json",
+ "subdivision": {
+ "bufferView": 0,
+ "maximumDepth": 4
+ },
+ "content": {
+ "bufferView": 1
+ }
+ }
+ }
+}
+```
+
+##### Root 1 Tileset - tileset.json
+
+```json
+{
+ "asset": {
+ "version": "1.0"
+ },
+ "geometricError": 500,
+ "extensions": {
+ "3DTILES_implicit_tiling": {
+ "boundingVolume": {
+ "box": [
+ 10, 0, 0,
+ 5, 0, 0,
+ 0, 5, 0,
+ 0, 0, 5
+ ]
+ },
+ "tilingScheme": "QUADTREE",
+ "geometricError": 5000,
+ "refine": "REPLACE",
+ "contentExtension": ".glb",
+ "tilesetExtension": ".json",
+ "subdivision": {
+ "bufferView": 0,
+ "maximumDepth": 4
+ },
+ "content": {
+ "bufferView": 1
+ }
+ }
+ }
+}
+```
+
+##### Directory Structure
+
+```
+.
+├── Tileset 0/
+│ └── tileset.json/
+│ ├── L0/
+│ │ └── 0/
+│ │ └── 0.glb
+│ ├── L1/
+│ │ ├── 0/
+│ │ │ ├── 0.glb
+│ │ │ └── 1.glb
+│ │ └── 1/
+│ │ ├── 0.glb
+│ │ └── 1.glb
+│ └── L2/
+│ ├── 0/
+│ │ └── 0.glb
+│ └── ...
+└── Tileset 1/
+ └── tileset.json/
+ ├── L0/
+ │ └── 0/
+ │ └── 0.glb
+ ├── L1/
+ │ ├── 0/
+ │ │ ├── 0.glb
+ │ │ └── 1.glb
+ │ └── 1/
+ │ ├── 0.glb
+ │ └── 1.glb
+ └── L2/
+ └── 0/
+ └── 0.glb
+
+```
+
+#### Double Headed Quadtree (combined using a base tileset)
+
+##### Base Tileset
+
+```json
+{
+ "asset": {
+ "version": "1.0"
+ },
+ "geometricError": 10000,
+ "root": {
+ "boundingVolume": {
+ "box": [
+ 5, 0, 0,
+ 10, 0, 0,
+ 0, 5, 0,
+ 0, 0, 5
+ ]
+ },
+ "geometricError": 1000,
+ "children": [
+ {
+ "boundingVolume": {
+ "box": [
+ 0, 0, 0,
+ 5, 0, 0,
+ 0, 5, 0,
+ 0, 0, 5
+ ]
+ },
+ "geometricError": 500,
+ "content": {
+ "uri": "./R0/tileset.json"
+ }
+ },
+ {
+ "boundingVolume": {
+ "box": [
+ 10, 0, 0,
+ 5, 0, 0,
+ 0, 5, 0,
+ 0, 0, 5
+ ]
+ },
+ "geometricError": 500,
+ "content": {
+ "uri": "./R1/tileset.json"
+ }
+ }
+ ]
+ }
+}
+```
+
+##### Root 0 Tileset - tileset.json
+
+```json
+{
+ "asset": {
+ "version": "1.0"
+ },
+ "geometricError": 500,
+ "extensions": {
+ "3DTILES_implicit_tiling": {
+ "boundingVolume": {
+ "box": [
+ 0, 0, 0,
+ 5, 0, 0,
+ 0, 5, 0,
+ 0, 0, 5
+ ]
+ },
+ "tilingScheme": "QUADTREE",
+ "geometricError": 500,
+ "refine": "REPLACE",
+ "contentExtension": ".glb",
+ "tilesetExtension": ".json",
+ "subdivision": {
+ "bufferView": 0,
+ "maximumDepth": 4
+ },
+ "content": {
+ "bufferView": 1
+ }
+ }
+ }
+}
+```
+
+##### Root 1 Tileset - tileset.json
+
+```json
+{
+ "asset": {
+ "version": "1.0"
+ },
+ "geometricError": 500,
+ "extensions": {
+ "3DTILES_implicit_tiling": {
+ "boundingVolume": {
+ "box": [
+ 10, 0, 0,
+ 5, 0, 0,
+ 0, 5, 0,
+ 0, 0, 5
+ ]
+ },
+ "tilingScheme": "QUADTREE",
+ "geometricError": 500,
+ "refine": "REPLACE",
+ "contentExtension": ".glb",
+ "tilesetExtension": ".json",
+ "subdivision": {
+ "bufferView": 0,
+ "maximumDepth": 4
+ },
+ "content": {
+ "bufferView": 1
+ }
+ }
+ }
+}
+```
+
+##### Directory Structure
+
+```
+.
+└── tileset.json/
+ ├── R0/
+ │ └── tileset.json/
+ │ ├── L0/
+ │ │ └── 0/
+ │ │ └── 0.glb
+ │ ├── L1/
+ │ │ ├── 0/
+ │ │ │ ├── 0.glb
+ │ │ │ └── 1.glb
+ │ │ └── 1/
+ │ │ ├── 0.glb
+ │ │ └── 1.glb
+ │ └── L2/
+ │ ├── 0/
+ │ │ └── 0.glb
+ │ └── ...
+ └── R1/
+ └── tileset.json/
+ ├── L0/
+ │ └── 0/
+ │ └── 0.glb
+ ├── L1/
+ │ ├── 0/
+ │ │ ├── 0.glb
+ │ │ └── 0.glb
+ │ └── 1/
+ │ ├── 0.glb
+ │ └── 1.glb
+ └── L2/
+ └── 0/
+ └── 0.glb
+```
+
+#### Six-headed Global Geodesic Quads (combined using a base tileset)
+
+
+
+##### Base Tileset - tileset.json
+
+```json
+{
+ "asset": {
+ "version": "1.0"
+ },
+ "geometricError": 1000,
+ "root": {
+ "boundingVolume": {
+ "sphere": [
+ 0,
+ 0,
+ 0,
+ 6378000
+ ]
+ },
+ "geometricError": 10000,
+ "children": [
+ {
+ "boundingVolume": {
+ "region": [
+ -90, 30,
+ 0, 30,
+ 90, 30,
+ 180, 30
+ 0,
+ 100000
+ ]
+ },
+ "geometricError": 1000,
+ "content": {
+ "uri": "./RO/tileset.json"
+ }
+ },
+ {
+ "boundingVolume": {
+ "region": [
+ -90, -30,
+ 0, -30,
+ 90, -30,
+ 180, -30
+ 0,
+ 100000
+ ]
+ },
+ "geometricError": 1000,
+ "content": {
+ "uri": "./R1/tileset.json"
+ }
+ },
+ {
+ "boundingVolume": {
+ "region": [
+ -90, 30,
+ 0, 30,
+ 0, -30,
+ -90, -30
+ 0,
+ 100000
+ ]
+ },
+ "geometricError": 1000,
+ "content": {
+ "uri": "./R2/tileset.json"
+ }
+ },
+ {
+ "boundingVolume": {
+ "region": [
+ 0, 30,
+ 90, 30,
+ 90, -30,
+ 0, -30
+ 0,
+ 10000
+ ]
+ },
+ "geometricError": 1000,
+ "content": {
+ "uri": "./R3/tileset.json"
+ }
+ },
+ {
+ "boundingVolume": {
+ "region": [
+ 90, 30,
+ 180, 30,
+ 180, -30,
+ 90, -30
+ 0,
+ 10000
+ ]
+ },
+ "geometricError": 1000,
+ "content": {
+ "uri": "./R4/tileset.json"
+ }
+ },
+ {
+ "boundingVolume": {
+ "region": [
+ 180, 30,
+ -90, 30,
+ -90, -30,
+ 180, -30
+ 0,
+ 10000
+ ]
+ },
+ "geometricError": 1000,
+ "content": {
+ "uri": "./R5/tileset.json"
+ }
+ }
+ ]
+ }
+}
+```
+
+##### Root 0 Tileset - tileset.json
+
+```json
+{
+ "asset": {
+ "version": "1.0"
+ },
+ "geometricError": 1000,
+ "extensions": {
+ "3DTILES_implicit_tiling": {
+ "boundingVolume": {
+ "geodesicQuad": [
+ -90,30,
+ 0, 30,
+ 90,30,
+ 180,30,
+ 0,
+ 100000
+ ]
+ },
+ "tilingScheme": "QUADTREE",
+ "geometricError": 1000,
+ "refine": "ADD",
+ "contentExtension": ".glb",
+ "tilesetExtension": ".json",
+ "subdivision": {
+ "completeDepth": 3,
+ "maximumDepth": 8
+ },
+ "content": {
+ "fillOffset": 4,
+ "fillValue": 1
+ }
+ }
+ }
+
+}
+```
+
+#### Directory Structure
+
+```json
+.
+└── tileset.json/
+ ├── R0/
+ │ └── tileset.json/
+ │ ├── L0/
+ │ │ └── 0/
+ │ │ └── 0.glb
+ │ ├── L1/
+ │ │ ├── 0/
+ │ │ │ ├── 0.glb
+ │ │ │ └── 1.glb
+ │ │ └── 1/
+ │ │ ├── 0.glb
+ │ │ └── 1.glb
+ │ └── L2/
+ │ ├── 0/
+ │ │ └── 0.glb
+ │ └── ...
+ ├── R1/
+ │ └── tileset.json/
+ │ ├── L0/
+ │ │ └── 0/
+ │ │ └── 0.glb
+ │ ├── L1/
+ │ │ ├── 0/
+ │ │ │ ├── 0.glb
+ │ │ │ └── 1.glb
+ │ │ └── 1/
+ │ │ ├── 0.glb
+ │ │ └── 1.glb
+ │ ├── L2/
+ │ │ └── 0/
+ │ │ └── 0.glb
+ │ └── ...
+ ├── R2/
+ │ └── ...
+ ├── R3/
+ │ └── ...
+ ├── R4/
+ │ └── ...
+ └── R5/
+ └── ...
+```
+
+*Note: This example is not complete for brevity. The diagram above contains 6 tilesets.*
diff --git a/extensions/3DTILES_implicit_tiling/figures/box.png b/extensions/3DTILES_implicit_tiling/figures/box.png
new file mode 100644
index 000000000..fc1e3a347
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/box.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/box_octree.png b/extensions/3DTILES_implicit_tiling/figures/box_octree.png
new file mode 100644
index 000000000..bf1e15afc
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/box_octree.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/box_octree_one.png b/extensions/3DTILES_implicit_tiling/figures/box_octree_one.png
new file mode 100644
index 000000000..961bfd0fb
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/box_octree_one.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/box_octree_xyz.png b/extensions/3DTILES_implicit_tiling/figures/box_octree_xyz.png
new file mode 100644
index 000000000..ae379a632
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/box_octree_xyz.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/box_one.png b/extensions/3DTILES_implicit_tiling/figures/box_one.png
new file mode 100644
index 000000000..bf7df70be
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/box_one.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/box_quadtree.png b/extensions/3DTILES_implicit_tiling/figures/box_quadtree.png
new file mode 100644
index 000000000..2070c58dc
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/box_quadtree.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/box_quadtree_one.png b/extensions/3DTILES_implicit_tiling/figures/box_quadtree_one.png
new file mode 100644
index 000000000..4a0b0d061
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/box_quadtree_one.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/box_quadtree_xyz.png b/extensions/3DTILES_implicit_tiling/figures/box_quadtree_xyz.png
new file mode 100644
index 000000000..5512aa5fd
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/box_quadtree_xyz.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/box_xyz.png b/extensions/3DTILES_implicit_tiling/figures/box_xyz.png
new file mode 100644
index 000000000..809d60bb5
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/box_xyz.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/cell.png b/extensions/3DTILES_implicit_tiling/figures/cell.png
new file mode 100644
index 000000000..0965e5fbc
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/cell.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/cell_global.png b/extensions/3DTILES_implicit_tiling/figures/cell_global.png
new file mode 100644
index 000000000..ec0f30d19
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/cell_global.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/cell_octree.png b/extensions/3DTILES_implicit_tiling/figures/cell_octree.png
new file mode 100644
index 000000000..9be1f6c1f
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/cell_octree.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/cell_quadtree.png b/extensions/3DTILES_implicit_tiling/figures/cell_quadtree.png
new file mode 100644
index 000000000..d07de751a
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/cell_quadtree.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/cell_t.png b/extensions/3DTILES_implicit_tiling/figures/cell_t.png
new file mode 100644
index 000000000..54fa6fde8
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/cell_t.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/implicit-tiling-subtree-concept.png b/extensions/3DTILES_implicit_tiling/figures/implicit-tiling-subtree-concept.png
new file mode 100644
index 000000000..ebe8adaeb
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/implicit-tiling-subtree-concept.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/implicit-tiling-subtree-concept.svg b/extensions/3DTILES_implicit_tiling/figures/implicit-tiling-subtree-concept.svg
new file mode 100644
index 000000000..1b3ac5335
--- /dev/null
+++ b/extensions/3DTILES_implicit_tiling/figures/implicit-tiling-subtree-concept.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/extensions/3DTILES_implicit_tiling/figures/levels.png b/extensions/3DTILES_implicit_tiling/figures/levels.png
new file mode 100644
index 000000000..9b29bd752
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/levels.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/morton.png b/extensions/3DTILES_implicit_tiling/figures/morton.png
new file mode 100644
index 000000000..f4eabfa7e
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/morton.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/octree.png b/extensions/3DTILES_implicit_tiling/figures/octree.png
new file mode 100644
index 000000000..850cba60e
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/octree.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/quadtree.png b/extensions/3DTILES_implicit_tiling/figures/quadtree.png
new file mode 100644
index 000000000..c29dba52b
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/quadtree.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/quadtree_with_explicit_external_quadtree.png b/extensions/3DTILES_implicit_tiling/figures/quadtree_with_explicit_external_quadtree.png
new file mode 100644
index 000000000..7ae945937
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/quadtree_with_explicit_external_quadtree.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/quadtree_with_implicit_external_quadtree.png b/extensions/3DTILES_implicit_tiling/figures/quadtree_with_implicit_external_quadtree.png
new file mode 100644
index 000000000..d8e4189b4
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/quadtree_with_implicit_external_quadtree.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/region.png b/extensions/3DTILES_implicit_tiling/figures/region.png
new file mode 100644
index 000000000..9f7f80251
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/region.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/region_octree.png b/extensions/3DTILES_implicit_tiling/figures/region_octree.png
new file mode 100644
index 000000000..21b12b71e
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/region_octree.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/region_octree_xyz.png b/extensions/3DTILES_implicit_tiling/figures/region_octree_xyz.png
new file mode 100644
index 000000000..974688da9
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/region_octree_xyz.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/region_quadtree.png b/extensions/3DTILES_implicit_tiling/figures/region_quadtree.png
new file mode 100644
index 000000000..769322d68
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/region_quadtree.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/region_quadtree_xyz.png b/extensions/3DTILES_implicit_tiling/figures/region_quadtree_xyz.png
new file mode 100644
index 000000000..8d8306d3c
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/region_quadtree_xyz.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/region_xyz.png b/extensions/3DTILES_implicit_tiling/figures/region_xyz.png
new file mode 100644
index 000000000..361ffee38
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/region_xyz.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/states.png b/extensions/3DTILES_implicit_tiling/figures/states.png
new file mode 100644
index 000000000..7ab00641a
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/states.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/subdivision.png b/extensions/3DTILES_implicit_tiling/figures/subdivision.png
new file mode 100644
index 000000000..c8b07335c
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/subdivision.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/tile_location.dot b/extensions/3DTILES_implicit_tiling/figures/tile_location.dot
new file mode 100644
index 000000000..8ff6cfc48
--- /dev/null
+++ b/extensions/3DTILES_implicit_tiling/figures/tile_location.dot
@@ -0,0 +1,222 @@
+digraph {
+
+ graph [nodesep=0.5, compound=true]
+ node [shape=record, fontsize=18]
+ labeljust = "r"
+ labelloc = "b"
+ rankdir=TB
+ splines=false
+ ranksep=0
+
+ {
+ subgraph cluster_L3 {
+ subgraph cluster_L2 {
+ subgraph cluster_L1 {
+ {
+ L10 [style=invis]
+ B0 [label="0"]
+ B1 [label="1"]
+ L10 -> B0 [style=invis]
+ L10 -> B1 [style=invis]
+ }
+ label = "Level 1"
+ }
+ {
+ L20 [style=invis]
+ B2 [label="0"]
+ B3 [label="0"]
+ L20 -> B2 [style=invis]
+ L20 -> B3 [style=invis]
+ }
+ label = "Level 2"
+ }
+ {
+ L30 [style=invis]
+ B4 [label="1"]
+ B5 [label="1"]
+ L30 -> B4 [style=invis]
+ L30 -> B5 [style=invis]
+ }
+ label = "Level 3"
+ }
+
+ }
+
+ {
+ L1 [shape=none, margin=0, label=<
+
+
+
1
+
10
+
11
+
+
+
0
+
00
+
01
+
+
+
Y↑,X→
+
0
+
1
+
+
+ >
+ ]
+
+ L2 [shape=none, margin=0, label=<
+
+
+
3
+
1010
+
1011
+
1110
+
1111
+
+
+
2
+
1000
+
1001
+
1100
+
1101
+
+
+
1
+
0010
+
0011
+
0110
+
0111
+
+
+
0
+
0000
+
0001
+
0100
+
0101
+
+
+
Y↑,X→
+
0
+
1
+
2
+
3
+
+
+ >
+ ]
+
+ L3 [shape=none, margin=0, label=<
+
+
+
7
+
101010
+
101011
+
101110
+
101111
+
111010
+
111011
+
111110
+
111111
+
+
+
6
+
101000
+
101001
+
101100
+
101101
+
111000
+
111001
+
111100
+
111101
+
+
+
5
+
100010
+
100011
+
100110
+
100111
+
110010
+
110011
+
110110
+
110111
+
+
+
4
+
100000
+
100001
+
100100
+
100101
+
110000
+
110001
+
110100
+
110101
+
+
+
3
+
001010
+
001011
+
001110
+
001111
+
011010
+
011011
+
011110
+
011111
+
+
+
2
+
001000
+
001001
+
001100
+
001101
+
011000
+
011001
+
011100
+
011101
+
+
+
1
+
000010
+
000011
+
000110
+
000111
+
010010
+
010011
+
010110
+
010111
+
+
+
0
+
00000
+
000001
+
000100
+
000101
+
010000
+
010001
+
010100
+
010101
+
+
+
Y↑,X→
+
0
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
+
+ >
+ ]
+
+ rank=same;
+ }
+
+ L1 -> L2 [style=invis]
+ L2 -> L3 [style=invis]
+
+ B1 -> L1 [ltail=cluster_L1, minlen=16]
+ B3 -> L2 [ltail=cluster_L2, minlen=16]
+ B5 -> L3 [ltail=cluster_L3, minlen=16]
+}
\ No newline at end of file
diff --git a/extensions/3DTILES_implicit_tiling/figures/tile_location.png b/extensions/3DTILES_implicit_tiling/figures/tile_location.png
new file mode 100644
index 000000000..65ae0388f
Binary files /dev/null and b/extensions/3DTILES_implicit_tiling/figures/tile_location.png differ
diff --git a/extensions/3DTILES_implicit_tiling/figures/tile_location.svg b/extensions/3DTILES_implicit_tiling/figures/tile_location.svg
new file mode 100644
index 000000000..c409a771b
--- /dev/null
+++ b/extensions/3DTILES_implicit_tiling/figures/tile_location.svg
@@ -0,0 +1,305 @@
+
+
+
+
+
diff --git a/extensions/3DTILES_implicit_tiling/schema/3DTILES_implicit_tiling.schema.json b/extensions/3DTILES_implicit_tiling/schema/3DTILES_implicit_tiling.schema.json
new file mode 100644
index 000000000..2db43c28d
--- /dev/null
+++ b/extensions/3DTILES_implicit_tiling/schema/3DTILES_implicit_tiling.schema.json
@@ -0,0 +1,89 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema",
+ "title": "3DTILES_implicit_tiling",
+ "type": "object",
+ "description": "The root object for the 3DTILES_implicit_tiling extension.",
+ "properties": {
+ "boundingVolume": {
+ "type": "object",
+ "description": "The bounding volume that encloses the root tile."
+ },
+ "tilingScheme": {
+ "type": "string",
+ "description": "The tiling scheme used within the tileset."
+ },
+ "geometricError": {
+ "type": "number",
+ "description": "The error, in meters, introduced if this tile is rendered and its children are not. At runtime, the geometric error is used to compute screen space error (SSE), i.e., the error measured in pixels."
+ },
+ "refine": {
+ "type": "string",
+ "description": "The type of replacement - additive or replacement - to use when traversing this tileset for rendering."
+ },
+ "subdivision": {
+ "type": "object",
+ "description": "An object containing information about subdivision buffer.",
+ "properties": {
+ "bufferView": {
+ "type": "integer",
+ "description": "The index of the bufferView containing the subdivision buffer."
+ },
+ "completeDepth": {
+ "type": "integer",
+ "description": "The number of levels in the tileset that are complete."
+ },
+ "maximumDepth": {
+ "type": "integer",
+ "description": "The last level of subdivision in this tileset."
+ }
+ }
+ },
+ "content": {
+ "type": "object",
+ "description": "An object containing information about content buffer.",
+ "properties": {
+ "bufferView": {
+ "type": "integer",
+ "description": "The index of the bufferView containing the content buffer."
+ },
+ "fillOffset": {
+ "type": "integer",
+ "description": "The level for which the content state information is present in the content buffer.",
+ "default": 0
+ },
+ "fillValue": {
+ "type": "integer",
+ "description": "The state applied to each tile in all levels before the levelOffset."
+ }
+ }
+ },
+ "metadata": {
+ "type": "object",
+ "description": "An object containing information about metadata buffer.",
+ "properties": {
+ "bufferView": {
+ "type": "integer",
+ "description": "The index of the bufferView containing the metadata buffer."
+ },
+ "levelOffset": {
+ "type": "integer",
+ "description": "The level for which the metadata state information is present in the content buffer.",
+ "default": 0
+ },
+ "levelOffsetFill": {
+ "type": "integer",
+ "description": "The state applied to each tile in all levels before the levelOffset."
+ }
+ }
+ },
+ "contentExtension": {
+ "type": "string",
+ "description": "The file extension used for tile content."
+ },
+ "tilesetExtension": {
+ "type": "string",
+ "description": "The file extension used for external tilesets."
+ }
+ },
+ "required": [ "tilingScheme", "boundingVolue", "geometricError", "refine", "subdivision" ]
+}
\ No newline at end of file