Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
7df3760
Add PMTiles plugin with MVT support
AlaricBaraou Feb 2, 2026
9b3176f
Merge branch 'master' into mvt-support
gkjohnson May 14, 2026
a1e1308
Add support for redraw, rearchitecture
gkjohnson May 15, 2026
b297607
Simplify
gkjohnson May 15, 2026
20d73ce
Update
gkjohnson May 15, 2026
4d14b75
Consolidate
gkjohnson May 15, 2026
4e38cee
Remove export
gkjohnson May 15, 2026
cafdcd4
Read PMTiles header
gkjohnson May 15, 2026
45a33e3
Update demo, simplify
gkjohnson May 15, 2026
8ac47cb
Remove unnecessary class
gkjohnson May 15, 2026
ebdecb7
Add export
gkjohnson May 15, 2026
0886b8d
Merge remote-tracking branch 'origin/master' into mvt-support
gkjohnson May 15, 2026
5f07ab7
Fix artifacts
gkjohnson May 15, 2026
1abf186
Move functions
gkjohnson May 15, 2026
a0984bb
Cleanup
gkjohnson May 15, 2026
c0c444c
Simplification
gkjohnson May 15, 2026
66d0d64
Updates
gkjohnson May 15, 2026
ada591f
Shift to entirely user-defined styles
gkjohnson May 15, 2026
adc9610
Updats
gkjohnson May 15, 2026
9a392f8
Remove tile styler
gkjohnson May 15, 2026
b7cc778
Simplification
gkjohnson May 15, 2026
c36147b
Update
gkjohnson May 15, 2026
c1ca1f6
Remove style
gkjohnson May 15, 2026
e45e23d
Add support for png, etc pmtiles
gkjohnson May 15, 2026
8eb8e14
Switch to dynamic imports
gkjohnson May 15, 2026
347e147
Share canvas drawing logic
gkjohnson May 16, 2026
2c12ed8
Updates
gkjohnson May 16, 2026
92883b5
Clean up
gkjohnson May 16, 2026
2a316fa
Add getStyle
gkjohnson May 16, 2026
ee1486f
Cleanup
gkjohnson May 16, 2026
32deb88
Clean up
gkjohnson May 16, 2026
3423a1c
Cleanup
gkjohnson May 16, 2026
fe8455c
Cleanup
gkjohnson May 16, 2026
10592d5
Fix naming
gkjohnson May 16, 2026
534756b
Add Path2D support
gkjohnson May 16, 2026
f9be430
Comment
gkjohnson May 16, 2026
928d010
Remove outdates docs
gkjohnson May 16, 2026
ca56554
Merge remote-tracking branch 'origin/master' into mvt-support
gkjohnson May 16, 2026
153d4d3
Switch to generated surface plugin
gkjohnson May 16, 2026
665be9d
lint fixes
gkjohnson May 16, 2026
455a1e0
Small fix ups
gkjohnson May 16, 2026
101080b
Simplification
gkjohnson May 16, 2026
e0bb385
Simplification
gkjohnson May 16, 2026
63e7418
Share "setFrame" functions
gkjohnson May 16, 2026
6052650
Updates
gkjohnson May 16, 2026
38752a4
Updates
gkjohnson May 16, 2026
b6f9d9c
Cleanup
gkjohnson May 16, 2026
f3f7015
Cleanup
gkjohnson May 16, 2026
5afa350
Fix lack of queueing
gkjohnson May 16, 2026
a67060a
simplify pmtiles image source
gkjohnson May 16, 2026
55778b4
Adjust
gkjohnson May 16, 2026
ac4a5b0
Variable updates
gkjohnson May 17, 2026
ec73aed
Cleanup
gkjohnson May 17, 2026
9a2b1cb
Update docs
gkjohnson May 17, 2026
ee289b0
Always split when zooming in
gkjohnson May 17, 2026
4687a3e
Update PMTiles
gkjohnson May 17, 2026
aa99c1f
Code style updates
gkjohnson May 17, 2026
2613f79
Update JSDoc
gkjohnson May 17, 2026
b2f0203
Docs update
gkjohnson May 17, 2026
d0b4d94
Updates to docs
gkjohnson May 17, 2026
e445cf1
Tab fix
gkjohnson May 17, 2026
1087406
update docs
gkjohnson May 17, 2026
978d52e
Updates
gkjohnson May 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions example/three/pmtiles.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

<title>PMTiles Globe Example</title>
<link rel="stylesheet" href="../styles.css">
</head>
<body>
<script type="module" src="pmtiles.js"></script>
</body>
</html>
132 changes: 132 additions & 0 deletions example/three/pmtiles.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
import { Scene, WebGLRenderer, PerspectiveCamera } from 'three';
import {
TilesRenderer,
GlobeControls,
} from '3d-tiles-renderer';
import {
UpdateOnChangePlugin,
TilesFadePlugin,
ImageOverlayPlugin,
PMTilesOverlay,
GeneratedSurfacePlugin,
} from '3d-tiles-renderer/plugins';
import GUI from 'three/addons/libs/lil-gui.module.min.js';

// Layer config for Protomaps v4 basemap — colors from the Protomaps "Light" theme
const LAYERS = {
earth: { enabled: true, fill: '#e2dfda', order: 0 },
water: { enabled: true, fill: '#80deea', order: 1 },
landcover: { enabled: true, fill: '#c4e7d2', order: 2 },
landuse: { enabled: true, fill: '#cfddd5', order: 3 },
natural: { enabled: true, fill: '#e2e0d7', order: 4 },
buildings: { enabled: true, fill: '#cccccc', order: 5 },
roads: { enabled: true, stroke: '#ebebeb', order: 6 },
transit: { enabled: true, stroke: '#a7b1b3', order: 7 },
boundaries: { enabled: true, stroke: '#adadad', order: 8 },
places: { enabled: true, fill: '#5c5c5c', order: 9 },
pois: { enabled: true, fill: '#1a8cbd', radius: 3, order: 10 },
};

let scene, renderer, camera, controls, tiles, overlay;

init();
render();

function init() {

renderer = new WebGLRenderer( { antialias: true } );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.setClearColor( 0x111111 );
renderer.setAnimationLoop( render );
document.body.appendChild( renderer.domElement );

scene = new Scene();
camera = new PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 0.001, 10000 );

// PMTiles overlay: vector tile data composited on top of the base geometry
overlay = new PMTilesOverlay( {
url: 'https://demo-bucket.protomaps.com/v4.pmtiles',
getStyle,
} );

// Base tile layer: XYZ raster tiles provide the globe geometry
tiles = new TilesRenderer();
tiles.registerPlugin( new UpdateOnChangePlugin() );
tiles.registerPlugin( new TilesFadePlugin() );
tiles.registerPlugin( new GeneratedSurfacePlugin( {
center: true,
shape: 'ellipsoid',
} ) );
tiles.registerPlugin( new ImageOverlayPlugin( {
overlays: [ overlay ],
renderer,
} ) );

tiles.setCamera( camera );
tiles.group.rotation.x = - Math.PI / 2;
tiles.group.updateMatrixWorld();
scene.add( tiles.group );

// Controls
controls = new GlobeControls( scene, camera, renderer.domElement );
controls.setEllipsoid( tiles.ellipsoid, tiles.group );
controls.enableDamping = true;
controls.camera.position.set( 0, 0, 1.5e7 );

window.addEventListener( 'resize', onWindowResize );

setupGUI();

}

function getStyle( layerName, properties ) {

if ( ! ( layerName in LAYERS ) ) return null;

const layer = LAYERS[ layerName ];
return layer.enabled ? layer : null;

}

function updateOverlay() {

overlay.redraw();

}

function setupGUI() {

const gui = new GUI();

for ( const key in LAYERS ) {

const folder = gui.addFolder( key.charAt( 0 ).toUpperCase() + key.slice( 1 ) );
folder.add( LAYERS[ key ], 'enabled' ).onChange( updateOverlay );
folder.addColor( LAYERS[ key ], LAYERS[ key ].fill !== undefined ? 'fill' : 'stroke' ).onChange( updateOverlay );
folder.close();

}

}

function onWindowResize() {

camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );

}

function render() {

controls.update();

camera.updateMatrixWorld();
tiles.setCamera( camera );
tiles.setResolutionFromRenderer( camera, renderer );
tiles.update();

renderer.render( scene, camera );

}
81 changes: 81 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
"license": "Apache-2.0",
"devDependencies": {
"@babel/preset-modules": "^0.1.6",
"@mapbox/vector-tile": "^2.0.3",
"@babel/preset-react": "^7.26.3",
"@babel/preset-typescript": "^7.26.0",
"@babylonjs/core": "^8.47.2",
Expand All @@ -107,6 +108,8 @@
"jsdoc": "^4.0.5",
"leva": "^0.10.0",
"lil-gui": "^0.21.0",
"pbf": "^4.0.1",
"pmtiles": "^4.3.2",
"postprocessing": "^6.36.4",
"three": "^0.170.0",
"typescript": "^5.6.0",
Expand All @@ -117,12 +120,18 @@
"peerDependencies": {
"@babylonjs/core": ">=8.0.0",
"@babylonjs/loaders": ">=8.0.0",
"@mapbox/vector-tile": "^2.0.3",
"@react-three/fiber": "^8.17.9 || ^9.0.0",
"pbf": "^4.0.1",
"pmtiles": "^4.3.2",
"react": "^18.3.1 || ^19.0.0",
"react-dom": "^18.3.1 || ^19.0.0",
"three": ">=0.167.0"
},
"peerDependenciesMeta": {
"@mapbox/vector-tile": {
"optional": true
},
"@react-three/fiber": {
"optional": true
},
Expand All @@ -132,6 +141,12 @@
"@babylonjs/loaders": {
"optional": true
},
"pbf": {
"optional": true
},
"pmtiles": {
"optional": true
},
"react": {
"optional": true
},
Expand Down
Loading
Loading