Skip to content

Commit b7edff1

Browse files
authored
Merge branch 'mapbox:main' into patch-2
2 parents 67d8fb8 + acc665f commit b7edff1

File tree

1,100 files changed

+76242
-36485
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,100 files changed

+76242
-36485
lines changed

.circleci/config.yml

+132-80
Large diffs are not rendered by default.

.eslintrc

+13-9
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
"no-eq-null": "off",
6161
"no-lonely-if": "off",
6262
"no-new": "off",
63-
"no-unused-vars": ["error", {"argsIgnorePattern": "^_$"}],
63+
"no-unused-vars": ["error", {"argsIgnorePattern": "^_"}],
6464
"no-warning-comments": "error",
6565
"no-mixed-operators": ["error", {"groups": [["&", "|", "^", "~", "<<", ">>", ">>>"], ["&&", "||"]]}],
6666
"object-curly-spacing": ["error", "never"],
@@ -129,7 +129,8 @@
129129
"jsdoc/require-property-description": "off",
130130
"jsdoc/require-property-name": "off",
131131
"jsdoc/require-property-type": "off",
132-
"jsdoc/require-returns-type": "off",
132+
"jsdoc/require-returns-type": "off"
133+
133134
}
134135
},
135136
{
@@ -143,7 +144,6 @@
143144
"src/ui/control/**",
144145
"src/ui/handler/**",
145146
"src/geo/lng_lat.js",
146-
"src/geo/lng_lat_bounds.js",
147147
"src/geo/mercator_coordinate.js",
148148
"src/source/**",
149149
],
@@ -161,7 +161,7 @@
161161
"matchingFileName": "src/fake_filename_for_jsdoc_examples",
162162
"rejectExampleCodeRegex": "<script>"
163163
}],
164-
"jsdoc/check-line-alignment": ["error", "any", {"wrapIndent": " "}],
164+
"jsdoc/check-line-alignment": ["error"],
165165
"jsdoc/check-property-names": "error",
166166
"jsdoc/check-types": "error",
167167
"jsdoc/tag-lines": ["error", "any", {"startLines": 1}],
@@ -202,16 +202,20 @@
202202
{
203203
"selector": "ClassProperty[value]",
204204
"message": "ClassProperty values are not allowed."
205+
},
206+
{
207+
"selector": "LogicalExpression[operator='??']",
208+
"message": "Nullish coalescing is not allowed."
209+
},
210+
{
211+
"selector": "ChainExpression",
212+
"message": "Optional chaining is now allowed."
205213
}
206214
]
207215
}
208216
}
209217
],
210-
"globals": {
211-
"performance": true
212-
},
213218
"env": {
214-
"es6": true,
215-
"browser": false
219+
"es6": true
216220
}
217221
}

.flowconfig

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
.*/node_modules/@mapbox/geojson-types/fixtures/.*
1010
.*/node_modules/browserify/.*
1111
.*/node_modules/nyc/.*
12-
.*/node_modules/jsdom/.*
1312
.*/node_modules/eslint.*/.*
1413
.*/node_modules/highlight.*/.*
1514
.*/node_modules/@?babel.*/.*

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*.js.map
77
*.cjs.map
88
node_modules
9-
package-lock.json
9+
yarn.lock
1010
.vscode/
1111
*.sublime-*
1212
coverage
@@ -31,3 +31,5 @@ yarn-error.log
3131
yarn-debug.log
3232
npm-debug.log
3333
.idea
34+
# https://github.com/vitejs/vite/issues/9470
35+
vitest.config.js.*

.nvmrc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
18.16.0
1+
18.20.2

.stylelintrc

-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
{
22
"extends": "stylelint-config-standard",
33
"rules": {
4-
"indentation": 4,
5-
"declaration-block-semicolon-newline-after": "always-multi-line",
6-
"block-opening-brace-space-before": "always-multi-line",
74
"declaration-block-single-line-max-declarations": 3,
85
"selector-class-pattern": "mapboxgl-[a-z-]+",
96
"at-rule-no-unknown": [true, {

3d-style/data/bucket/model_bucket.js

+45-11
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,19 @@ import EXTENT from '../../../src/style-spec/data/extent.js';
44
import {register} from '../../../src/util/web_worker_transfer.js';
55
import loadGeometry from '../../../src/data/load_geometry.js';
66
import toEvaluationFeature from '../../../src/data/evaluation_feature.js';
7-
import type {EvaluationFeature} from '../../../src/data/evaluation_feature.js';
87
import EvaluationParameters from '../../../src/style/evaluation_parameters.js';
98
import Point from '@mapbox/point-geometry';
109
import {vec3} from 'gl-matrix';
10+
import {InstanceVertexArray} from '../../../src/data/array_types.js';
11+
import assert from 'assert';
12+
import {warnOnce} from '../../../src/util/util.js';
13+
import {rotationScaleYZFlipMatrix} from '../../util/model_util.js';
14+
import {tileToMeter} from '../../../src/geo/mercator_coordinate.js';
15+
import {instanceAttributes} from '../model_attributes.js';
16+
17+
import type ModelStyleLayer from '../../style/style_layer/model_style_layer.js';
18+
import {isValidUrl} from '../../../src/style-spec/validate/validate_model.js';
19+
import type {EvaluationFeature} from '../../../src/data/evaluation_feature.js';
1120
import type {Mat4} from 'gl-matrix';
1221
import type {CanonicalTileID, OverscaledTileID} from '../../../src/source/tile_id.js';
1322
import type {
@@ -25,13 +34,6 @@ import type {SpritePositions} from '../../../src/util/image.js';
2534
import type {ProjectionSpecification} from '../../../src/style-spec/types.js';
2635
import type {TileTransform} from '../../../src/geo/projection/tile_transform.js';
2736
import type {IVectorTileLayer} from '@mapbox/vector-tile';
28-
import {InstanceVertexArray} from '../../../src/data/array_types.js';
29-
import assert from 'assert';
30-
import {warnOnce} from '../../../src/util/util.js';
31-
import ModelStyleLayer from '../../style/style_layer/model_style_layer.js';
32-
import {rotationScaleYZFlipMatrix} from '../../util/model_util.js';
33-
import {tileToMeter} from '../../../src/geo/mercator_coordinate.js';
34-
import {instanceAttributes} from '../model_attributes.js';
3537

3638
class ModelFeature {
3739
feature: EvaluationFeature;
@@ -101,8 +103,9 @@ class ModelBucket implements Bucket {
101103
terrainElevationMax: number;
102104

103105
hasZoomDependentProperties: boolean;
106+
modelUris: Array<string>;
107+
modelsRequested: boolean;
104108

105-
/* $FlowIgnore[incompatible-type-arg] Doesn't need to know about all the implementations */
106109
constructor(options: BucketParameters<ModelStyleLayer>) {
107110
this.zoom = options.zoom;
108111
this.canonical = options.canonical;
@@ -128,6 +131,9 @@ class ModelBucket implements Bucket {
128131
this.terrainElevationMin = 0;
129132
this.terrainElevationMax = 0;
130133
this.validForDEMTile = {id: null, timestamp: 0};
134+
this.modelUris = [];
135+
this.modelsRequested = false;
136+
131137
}
132138

133139
populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID, tileTransform: TileTransform) {
@@ -136,13 +142,16 @@ class ModelBucket implements Bucket {
136142
this.lookup = new Uint8Array(this.lookupDim * this.lookupDim);
137143

138144
for (const {feature, id, index, sourceLayerIndex} of features) {
145+
// use non numeric id, if in properties, too.
146+
const featureId = (id != null) ? id :
147+
(feature.properties && feature.properties.hasOwnProperty("id")) ? feature.properties["id"] : undefined;
139148
const evaluationFeature = toEvaluationFeature(feature, needGeometry);
140149

141150
// $FlowFixMe[method-unbinding]
142151
if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue;
143152

144153
const bucketFeature: BucketFeature = {
145-
id,
154+
id: featureId,
146155
sourceLayerIndex,
147156
index,
148157
geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform),
@@ -154,7 +163,11 @@ class ModelBucket implements Bucket {
154163
const modelId = this.addFeature(bucketFeature, bucketFeature.geometry, evaluationFeature);
155164

156165
if (modelId) {
157-
options.featureIndex.insert(feature, bucketFeature.geometry, index, sourceLayerIndex, this.index, this.instancesPerModel[modelId].instancedDataArray.length);
166+
// Since 3D model geometry extends over footprint or point geometry, it is important
167+
// to add some padding to envelope calculated for grid index lookup, in order to
168+
// prevent false negatives in FeatureIndex's coarse check.
169+
// Envelope padding is a half of featureIndex.grid cell size.
170+
options.featureIndex.insert(feature, bucketFeature.geometry, index, sourceLayerIndex, this.index, this.instancesPerModel[modelId].instancedDataArray.length, EXTENT / 32);
158171
}
159172
}
160173
this.lookup = null;
@@ -169,6 +182,7 @@ class ModelBucket implements Bucket {
169182
if (instances.idToFeaturesIndex.hasOwnProperty(id)) {
170183
const feature = instances.features[instances.idToFeaturesIndex[id]];
171184
this.evaluate(feature, states[id], instances, true);
185+
this.uploaded = false;
172186
}
173187
}
174188
}
@@ -244,20 +258,36 @@ class ModelBucket implements Bucket {
244258
perModelAttributes.instancedDataBuffer.destroy();
245259
}
246260
}
261+
const modelManager = this.layers[0].modelManager;
262+
if (modelManager && this.modelUris) {
263+
for (const modelUri of this.modelUris) {
264+
modelManager.removeModel(modelUri, "");
265+
}
266+
}
247267
}
248268

249269
addFeature(feature: BucketFeature, geometry: Array<Array<Point>>, evaluationFeature: EvaluationFeature): string {
250270
const layer = this.layers[0];
251271
const modelIdProperty = layer.layout.get('model-id');
252272
assert(modelIdProperty);
253273
const modelId = modelIdProperty.evaluate(evaluationFeature, {}, this.canonical);
274+
254275
if (!modelId) {
255276
warnOnce(`modelId is not evaluated for layer ${layer.id} and it is not going to get rendered.`);
256277
return modelId;
257278
}
279+
// check if it's a valid model (absolute) URL
280+
// otherwise is considered as an style defined model, and hence we don't need to
281+
// load it here.
282+
if (isValidUrl(modelId, false)) {
283+
if (!this.modelUris.includes(modelId)) {
284+
this.modelUris.push(modelId);
285+
}
286+
}
258287
if (!this.instancesPerModel[modelId]) {
259288
this.instancesPerModel[modelId] = new PerModelAttributes();
260289
}
290+
261291
const perModelVertexArray = this.instancesPerModel[modelId];
262292
const instancedDataArray = perModelVertexArray.instancedDataArray;
263293

@@ -295,6 +325,10 @@ class ModelBucket implements Bucket {
295325
return modelId;
296326
}
297327

328+
getModelUris(): Array<string> {
329+
return this.modelUris;
330+
}
331+
298332
evaluate(feature: ModelFeature, featureState: FeatureStates, perModelVertexArray: PerModelAttributes, update: boolean) {
299333
const layer = this.layers[0];
300334
const evaluationFeature = feature.feature;

0 commit comments

Comments
 (0)