@deck.gl/geo-layers 8.8.0-alpha.5 → 8.8.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.dev.js +32562 -62596
- package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/es5/great-circle-layer/great-circle-layer.js +12 -8
- package/dist/es5/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-cluster-layer.js +5 -4
- package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-hexagon-layer.js +49 -34
- package/dist/es5/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js +1 -1
- package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
- package/dist/es5/mesh-layer/mesh-layer.js +22 -26
- package/dist/es5/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/es5/mvt-layer/mvt-layer.js +6 -3
- package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/es5/s2-layer/s2-geometry.js.map +1 -1
- package/dist/es5/s2-layer/s2-layer.js +4 -2
- package/dist/es5/s2-layer/s2-layer.js.map +1 -1
- package/dist/es5/s2-layer/s2-utils.js.map +1 -1
- package/dist/es5/tile-3d-layer/tile-3d-layer.js +31 -16
- package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/es5/tile-layer/tile-layer.js +4 -1
- package/dist/es5/tile-layer/tile-layer.js.map +1 -1
- package/dist/es5/tile-layer/tileset-2d.js.map +1 -1
- package/dist/es5/trips-layer/trips-layer.js +9 -7
- package/dist/es5/trips-layer/trips-layer.js.map +1 -1
- package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/esm/great-circle-layer/great-circle-layer.js +7 -3
- package/dist/esm/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-cluster-layer.js +6 -4
- package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-hexagon-layer.js +38 -24
- package/dist/esm/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js +1 -1
- package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer.js +15 -17
- package/dist/esm/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/esm/mvt-layer/mvt-layer.js +6 -3
- package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/esm/s2-layer/s2-geometry.js.map +1 -1
- package/dist/esm/s2-layer/s2-layer.js +5 -2
- package/dist/esm/s2-layer/s2-layer.js.map +1 -1
- package/dist/esm/s2-layer/s2-utils.js.map +1 -1
- package/dist/esm/tile-3d-layer/tile-3d-layer.js +21 -10
- package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/esm/tile-layer/tile-layer.js +4 -1
- package/dist/esm/tile-layer/tile-layer.js.map +1 -1
- package/dist/esm/tile-layer/tileset-2d.js.map +1 -1
- package/dist/esm/trips-layer/trips-layer.js +8 -5
- package/dist/esm/trips-layer/trips-layer.js.map +1 -1
- package/dist.min.js +2 -2
- package/package.json +17 -15
- package/src/geo-cell-layer/GeoCellLayer.ts +4 -3
- package/src/great-circle-layer/great-circle-layer.ts +40 -0
- package/src/h3-layers/h3-cluster-layer.ts +60 -0
- package/src/h3-layers/{h3-hexagon-layer.js → h3-hexagon-layer.ts} +110 -42
- package/src/index.ts +5 -0
- package/src/mesh-layer/{mesh-layer-fragment.glsl.js → mesh-layer-fragment.glsl.ts} +0 -0
- package/src/mesh-layer/mesh-layer-vertex.glsl.ts +80 -0
- package/src/mesh-layer/{mesh-layer.js → mesh-layer.ts} +46 -13
- package/src/mvt-layer/mvt-layer.ts +5 -3
- package/src/quadkey-layer/quadkey-layer.ts +10 -9
- package/src/s2-layer/{s2-geometry.js → s2-geometry.ts} +17 -9
- package/src/s2-layer/s2-layer.ts +59 -0
- package/src/s2-layer/{s2-utils.js → s2-utils.ts} +14 -7
- package/src/tile-3d-layer/{tile-3d-layer.js → tile-3d-layer.ts} +107 -36
- package/src/tile-layer/tile-layer.ts +8 -7
- package/src/tile-layer/tileset-2d.ts +2 -2
- package/src/trips-layer/{trips-layer.js → trips-layer.ts} +41 -10
- package/typed/geo-cell-layer/GeoCellLayer.d.ts +12 -0
- package/typed/geo-cell-layer/GeoCellLayer.d.ts.map +1 -0
- package/typed/geo-cell-layer/GeoCellLayer.js +49 -0
- package/typed/great-circle-layer/great-circle-layer.d.ts +9 -0
- package/typed/great-circle-layer/great-circle-layer.d.ts.map +1 -0
- package/{src → typed}/great-circle-layer/great-circle-layer.js +5 -7
- package/typed/h3-layers/h3-cluster-layer.d.ts +22 -0
- package/typed/h3-layers/h3-cluster-layer.d.ts.map +1 -0
- package/typed/h3-layers/h3-cluster-layer.js +33 -0
- package/typed/h3-layers/h3-hexagon-layer.d.ts +70 -0
- package/typed/h3-layers/h3-hexagon-layer.d.ts.map +1 -0
- package/typed/h3-layers/h3-hexagon-layer.js +251 -0
- package/typed/index.d.ts +23 -0
- package/typed/index.d.ts.map +1 -0
- package/typed/index.js +33 -0
- package/typed/mesh-layer/mesh-layer-fragment.glsl.d.ts +3 -0
- package/typed/mesh-layer/mesh-layer-fragment.glsl.d.ts.map +1 -0
- package/typed/mesh-layer/mesh-layer-fragment.glsl.js +55 -0
- package/typed/mesh-layer/mesh-layer-vertex.glsl.d.ts +3 -0
- package/typed/mesh-layer/mesh-layer-vertex.glsl.d.ts.map +1 -0
- package/{src → typed}/mesh-layer/mesh-layer-vertex.glsl.js +0 -0
- package/typed/mesh-layer/mesh-layer.d.ts +37 -0
- package/typed/mesh-layer/mesh-layer.d.ts.map +1 -0
- package/typed/mesh-layer/mesh-layer.js +110 -0
- package/typed/mvt-layer/coordinate-transform.d.ts +4 -0
- package/typed/mvt-layer/coordinate-transform.d.ts.map +1 -0
- package/typed/mvt-layer/coordinate-transform.js +41 -0
- package/typed/mvt-layer/find-index-binary.d.ts +12 -0
- package/typed/mvt-layer/find-index-binary.d.ts.map +1 -0
- package/typed/mvt-layer/find-index-binary.js +96 -0
- package/typed/mvt-layer/mvt-layer.d.ts +70 -0
- package/typed/mvt-layer/mvt-layer.d.ts.map +1 -0
- package/typed/mvt-layer/mvt-layer.js +297 -0
- package/typed/package.json +6 -0
- package/typed/quadkey-layer/quadkey-layer.d.ts +20 -0
- package/typed/quadkey-layer/quadkey-layer.d.ts.map +1 -0
- package/typed/quadkey-layer/quadkey-layer.js +18 -0
- package/typed/quadkey-layer/quadkey-utils.d.ts +3 -0
- package/typed/quadkey-layer/quadkey-utils.d.ts.map +1 -0
- package/typed/quadkey-layer/quadkey-utils.js +26 -0
- package/typed/s2-layer/s2-geometry.d.ts +11 -0
- package/typed/s2-layer/s2-geometry.d.ts.map +1 -0
- package/typed/s2-layer/s2-geometry.js +123 -0
- package/typed/s2-layer/s2-layer.d.ts +20 -0
- package/typed/s2-layer/s2-layer.d.ts.map +1 -0
- package/{src → typed}/s2-layer/s2-layer.js +11 -16
- package/typed/s2-layer/s2-utils.d.ts +9 -0
- package/typed/s2-layer/s2-utils.d.ts.map +1 -0
- package/typed/s2-layer/s2-utils.js +88 -0
- package/typed/terrain-layer/terrain-layer.d.ts +28 -0
- package/typed/terrain-layer/terrain-layer.d.ts.map +1 -0
- package/typed/terrain-layer/terrain-layer.js +226 -0
- package/typed/tile-3d-layer/tile-3d-layer.d.ts +60 -0
- package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +1 -0
- package/typed/tile-3d-layer/tile-3d-layer.js +294 -0
- package/typed/tile-layer/tile-2d-header.d.ts +40 -0
- package/typed/tile-layer/tile-2d-header.d.ts.map +1 -0
- package/typed/tile-layer/tile-2d-header.js +113 -0
- package/typed/tile-layer/tile-2d-traversal.d.ts +4 -0
- package/typed/tile-layer/tile-2d-traversal.d.ts.map +1 -0
- package/typed/tile-layer/tile-2d-traversal.js +181 -0
- package/typed/tile-layer/tile-layer.d.ts +118 -0
- package/typed/tile-layer/tile-layer.d.ts.map +1 -0
- package/typed/tile-layer/tile-layer.js +192 -0
- package/typed/tile-layer/tileset-2d.d.ts +88 -0
- package/typed/tile-layer/tileset-2d.d.ts.map +1 -0
- package/typed/tile-layer/tileset-2d.js +399 -0
- package/typed/tile-layer/types.d.ts +29 -0
- package/typed/tile-layer/types.d.ts.map +1 -0
- package/typed/tile-layer/types.js +1 -0
- package/typed/tile-layer/utils.d.ts +37 -0
- package/typed/tile-layer/utils.d.ts.map +1 -0
- package/typed/tile-layer/utils.js +197 -0
- package/typed/trips-layer/trips-layer.d.ts +36 -0
- package/typed/trips-layer/trips-layer.d.ts.map +1 -0
- package/typed/trips-layer/trips-layer.js +92 -0
- package/src/h3-layers/h3-cluster-layer.js +0 -43
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export default `#version 300 es
|
|
2
|
+
#define SHADER_NAME simple-mesh-layer-fs
|
|
3
|
+
|
|
4
|
+
precision highp float;
|
|
5
|
+
|
|
6
|
+
uniform bool hasTexture;
|
|
7
|
+
uniform sampler2D sampler;
|
|
8
|
+
uniform bool flatShading;
|
|
9
|
+
uniform float opacity;
|
|
10
|
+
|
|
11
|
+
in vec2 vTexCoord;
|
|
12
|
+
in vec3 cameraPosition;
|
|
13
|
+
in vec3 normals_commonspace;
|
|
14
|
+
in vec4 position_commonspace;
|
|
15
|
+
in vec4 vColor;
|
|
16
|
+
|
|
17
|
+
out vec4 fragColor;
|
|
18
|
+
|
|
19
|
+
void main(void) {
|
|
20
|
+
|
|
21
|
+
#ifdef MODULE_PBR
|
|
22
|
+
|
|
23
|
+
fragColor = vColor * pbr_filterColor(vec4(0));
|
|
24
|
+
geometry.uv = pbr_vUV;
|
|
25
|
+
fragColor.a *= opacity;
|
|
26
|
+
|
|
27
|
+
#else
|
|
28
|
+
|
|
29
|
+
geometry.uv = vTexCoord;
|
|
30
|
+
|
|
31
|
+
vec3 normal;
|
|
32
|
+
if (flatShading) {
|
|
33
|
+
|
|
34
|
+
// NOTE(Tarek): This is necessary because
|
|
35
|
+
// headless.gl reports the extension as
|
|
36
|
+
// available but does not support it in
|
|
37
|
+
// the shader.
|
|
38
|
+
#ifdef DERIVATIVES_AVAILABLE
|
|
39
|
+
normal = normalize(cross(dFdx(position_commonspace.xyz), dFdy(position_commonspace.xyz)));
|
|
40
|
+
#else
|
|
41
|
+
normal = vec3(0.0, 0.0, 1.0);
|
|
42
|
+
#endif
|
|
43
|
+
} else {
|
|
44
|
+
normal = normals_commonspace;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
vec4 color = hasTexture ? texture(sampler, vTexCoord) : vColor;
|
|
48
|
+
vec3 lightColor = lighting_getLightColor(color.rgb, cameraPosition, position_commonspace.xyz, normal);
|
|
49
|
+
fragColor = vec4(lightColor, color.a * opacity);
|
|
50
|
+
|
|
51
|
+
#endif
|
|
52
|
+
|
|
53
|
+
DECKGL_FILTER_COLOR(fragColor, geometry);
|
|
54
|
+
}
|
|
55
|
+
`;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const _default: "#version 300 es\n#define SHADER_NAME simple-mesh-layer-vs\n\n// Scale the model\nuniform float sizeScale;\nuniform bool composeModelMatrix;\nuniform bool pickFeatureIds;\n\n// Primitive attributes\nin vec3 positions;\nin vec3 normals;\nin vec3 colors;\nin vec2 texCoords;\nin vec4 uvRegions;\nin vec3 featureIdsPickingColors;\n\n// Instance attributes\nin vec4 instanceColors;\nin vec3 instancePickingColors;\nin mat3 instanceModelMatrix;\n\n// Outputs to fragment shader\nout vec2 vTexCoord;\nout vec3 cameraPosition;\nout vec3 normals_commonspace;\nout vec4 position_commonspace;\nout vec4 vColor;\n\nvec2 applyUVRegion(vec2 uv) {\n #ifdef HAS_UV_REGIONS\n // https://github.com/Esri/i3s-spec/blob/master/docs/1.7/geometryUVRegion.cmn.md\n return fract(uv) * (uvRegions.zw - uvRegions.xy) + uvRegions.xy;\n #else\n return uv;\n #endif\n}\n\nvoid main(void) {\n vec2 uv = applyUVRegion(texCoords);\n geometry.uv = uv;\n\n if (pickFeatureIds) {\n geometry.pickingColor = featureIdsPickingColors;\n } else {\n geometry.pickingColor = instancePickingColors;\n }\n\n vTexCoord = uv;\n cameraPosition = project_uCameraPosition;\n vColor = vec4(colors * instanceColors.rgb, instanceColors.a);\n\n vec3 pos = (instanceModelMatrix * positions) * sizeScale;\n vec3 projectedPosition = project_position(positions);\n position_commonspace = vec4(projectedPosition, 1.0);\n gl_Position = project_common_position_to_clipspace(position_commonspace);\n\n geometry.position = position_commonspace;\n normals_commonspace = project_normal(instanceModelMatrix * normals);\n geometry.normal = normals_commonspace;\n\n DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\n\n #ifdef MODULE_PBR\n // set PBR data\n pbr_vPosition = geometry.position.xyz;\n #ifdef HAS_NORMALS\n pbr_vNormal = geometry.normal;\n #endif\n\n #ifdef HAS_UV\n pbr_vUV = uv;\n #else\n pbr_vUV = vec2(0., 0.);\n #endif\n geometry.uv = pbr_vUV;\n #endif\n\n DECKGL_FILTER_COLOR(vColor, geometry);\n}\n";
|
|
2
|
+
export default _default;
|
|
3
|
+
//# sourceMappingURL=mesh-layer-vertex.glsl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-layer-vertex.glsl.d.ts","sourceRoot":"","sources":["../../src/mesh-layer/mesh-layer-vertex.glsl.ts"],"names":[],"mappings":";AAAA,wBA+EE"}
|
|
File without changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { NumericArray } from '@math.gl/core';
|
|
2
|
+
import { GLTFMaterialParser } from '@luma.gl/experimental';
|
|
3
|
+
import { Model } from '@luma.gl/core';
|
|
4
|
+
import type { MeshAttribute, MeshAttributes } from '@loaders.gl/schema';
|
|
5
|
+
import type { UpdateParameters, DefaultProps } from '@deck.gl/core/typed';
|
|
6
|
+
import { SimpleMeshLayer, SimpleMeshLayerProps } from '@deck.gl/mesh-layers/typed';
|
|
7
|
+
export declare type Mesh = {
|
|
8
|
+
attributes: MeshAttributes;
|
|
9
|
+
indices?: MeshAttribute;
|
|
10
|
+
};
|
|
11
|
+
/** All properties supported by MeshLayer. */
|
|
12
|
+
export declare type MeshLayerProps<DataT = any> = _MeshLayerProps<DataT> & SimpleMeshLayerProps<DataT>;
|
|
13
|
+
/** Properties added by MeshLayer. */
|
|
14
|
+
declare type _MeshLayerProps<DataT> = {
|
|
15
|
+
/**
|
|
16
|
+
* PBR material object. _lighting must be pbr for this to work
|
|
17
|
+
*/
|
|
18
|
+
pbrMaterial?: any;
|
|
19
|
+
/**
|
|
20
|
+
* List of feature ids.
|
|
21
|
+
*/
|
|
22
|
+
featureIds?: NumericArray | null;
|
|
23
|
+
};
|
|
24
|
+
export default class MeshLayer<DataT = any, ExtraProps = {}> extends SimpleMeshLayer<DataT, Required<_MeshLayerProps<DataT>> & ExtraProps> {
|
|
25
|
+
static layerName: string;
|
|
26
|
+
static defaultProps: DefaultProps<MeshLayerProps<any>>;
|
|
27
|
+
getShaders(): any;
|
|
28
|
+
initializeState(): void;
|
|
29
|
+
updateState(params: UpdateParameters<this>): void;
|
|
30
|
+
draw(opts: any): void;
|
|
31
|
+
protected getModel(mesh: Mesh): Model;
|
|
32
|
+
updatePbrMaterialUniforms(pbrMaterial: any): void;
|
|
33
|
+
parseMaterial(pbrMaterial: any, mesh: any): GLTFMaterialParser;
|
|
34
|
+
calculateFeatureIdsPickingColors(attribute: any): void;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=mesh-layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-layer.d.ts","sourceRoot":"","sources":["../../src/mesh-layer/mesh-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAChD,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAC,KAAK,EAAM,MAAM,eAAe,CAAC;AAEzC,OAAO,KAAK,EAAC,aAAa,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAC,gBAAgB,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AAClE,OAAO,EAAC,eAAe,EAAE,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AAK3E,oBAAY,IAAI,GAAG;IACjB,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAcF,6CAA6C;AAC7C,oBAAY,cAAc,CAAC,KAAK,GAAG,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;AAE/F,qCAAqC;AACrC,aAAK,eAAe,CAAC,KAAK,IAAI;IAC5B;;OAEG;IACH,WAAW,CAAC,EAAE,GAAG,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,SAAS,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE,CAAE,SAAQ,eAAe,CAClF,KAAK,EACL,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAC9C;IACC,MAAM,CAAC,SAAS,SAAe;IAC/B,MAAM,CAAC,YAAY,oCAAgB;IAEnC,UAAU;IAOV,eAAe;IAmBf,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC;IAS1C,IAAI,CAAC,IAAI,KAAA;IAeT,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK;IAqBrC,yBAAyB,CAAC,WAAW,KAAA;IASrC,aAAa,CAAC,WAAW,KAAA,EAAE,IAAI,KAAA;IAe/B,gCAAgC,CAAC,SAAS,KAAA;CAgB3C"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { GLTFMaterialParser } from '@luma.gl/experimental';
|
|
2
|
+
import { Model, pbr } from '@luma.gl/core';
|
|
3
|
+
import GL from '@luma.gl/constants';
|
|
4
|
+
import { SimpleMeshLayer } from '@deck.gl/mesh-layers';
|
|
5
|
+
import vs from './mesh-layer-vertex.glsl';
|
|
6
|
+
import fs from './mesh-layer-fragment.glsl';
|
|
7
|
+
function validateGeometryAttributes(attributes) {
|
|
8
|
+
const hasColorAttribute = attributes.COLOR_0 || attributes.colors;
|
|
9
|
+
if (!hasColorAttribute) {
|
|
10
|
+
attributes.colors = { constant: true, value: new Float32Array([1, 1, 1]) };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const defaultProps = {
|
|
14
|
+
// PBR material object. _lighting must be pbr for this to work
|
|
15
|
+
pbrMaterial: { type: 'object', value: null },
|
|
16
|
+
featureIds: { type: 'array', value: null, optional: true }
|
|
17
|
+
};
|
|
18
|
+
export default class _MeshLayer extends SimpleMeshLayer {
|
|
19
|
+
getShaders() {
|
|
20
|
+
const shaders = super.getShaders();
|
|
21
|
+
const modules = shaders.modules;
|
|
22
|
+
modules.push(pbr);
|
|
23
|
+
return { ...shaders, vs, fs };
|
|
24
|
+
}
|
|
25
|
+
initializeState() {
|
|
26
|
+
const { featureIds } = this.props;
|
|
27
|
+
super.initializeState();
|
|
28
|
+
if (featureIds) {
|
|
29
|
+
this.state.attributeManager.add({
|
|
30
|
+
featureIdsPickingColors: {
|
|
31
|
+
type: GL.UNSIGNED_BYTE,
|
|
32
|
+
size: 3,
|
|
33
|
+
noAlloc: true,
|
|
34
|
+
update: this.calculateFeatureIdsPickingColors
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
updateState({ props, oldProps, changeFlags }) {
|
|
40
|
+
super.updateState({ props, oldProps, changeFlags });
|
|
41
|
+
if (props.pbrMaterial !== oldProps.pbrMaterial) {
|
|
42
|
+
this.updatePbrMaterialUniforms(props.pbrMaterial);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
draw(opts) {
|
|
46
|
+
const { featureIds } = this.props;
|
|
47
|
+
if (!this.state.model) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.state.model.setUniforms({
|
|
51
|
+
// Needed for PBR (TODO: find better way to get it)
|
|
52
|
+
u_Camera: this.state.model.getUniforms().project_uCameraPosition,
|
|
53
|
+
u_pickFeatureIds: Boolean(featureIds)
|
|
54
|
+
});
|
|
55
|
+
super.draw(opts);
|
|
56
|
+
}
|
|
57
|
+
getModel(mesh) {
|
|
58
|
+
const { id, pbrMaterial } = this.props;
|
|
59
|
+
const materialParser = this.parseMaterial(pbrMaterial, mesh);
|
|
60
|
+
const shaders = this.getShaders();
|
|
61
|
+
validateGeometryAttributes(mesh.attributes);
|
|
62
|
+
const model = new Model(this.context.gl, {
|
|
63
|
+
...this.getShaders(),
|
|
64
|
+
id,
|
|
65
|
+
geometry: mesh,
|
|
66
|
+
defines: {
|
|
67
|
+
...shaders.defines,
|
|
68
|
+
...materialParser?.defines,
|
|
69
|
+
HAS_UV_REGIONS: mesh.attributes.uvRegions
|
|
70
|
+
},
|
|
71
|
+
parameters: materialParser?.parameters,
|
|
72
|
+
isInstanced: true
|
|
73
|
+
});
|
|
74
|
+
return model;
|
|
75
|
+
}
|
|
76
|
+
updatePbrMaterialUniforms(pbrMaterial) {
|
|
77
|
+
const { model } = this.state;
|
|
78
|
+
if (model) {
|
|
79
|
+
const { mesh } = this.props;
|
|
80
|
+
const materialParser = this.parseMaterial(pbrMaterial, mesh);
|
|
81
|
+
model.setUniforms(materialParser.uniforms);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
parseMaterial(pbrMaterial, mesh) {
|
|
85
|
+
const unlit = Boolean(pbrMaterial.pbrMetallicRoughness && pbrMaterial.pbrMetallicRoughness.baseColorTexture);
|
|
86
|
+
const materialParser = new GLTFMaterialParser(this.context.gl, {
|
|
87
|
+
attributes: { NORMAL: mesh.attributes.normals, TEXCOORD_0: mesh.attributes.texCoords },
|
|
88
|
+
material: { unlit, ...pbrMaterial },
|
|
89
|
+
pbrDebug: false,
|
|
90
|
+
imageBasedLightingEnvironment: null,
|
|
91
|
+
lights: true,
|
|
92
|
+
useTangents: false
|
|
93
|
+
});
|
|
94
|
+
return materialParser;
|
|
95
|
+
}
|
|
96
|
+
calculateFeatureIdsPickingColors(attribute) {
|
|
97
|
+
const { featureIds } = this.props;
|
|
98
|
+
const value = new Uint8ClampedArray(featureIds.length * attribute.size);
|
|
99
|
+
const pickingColor = [];
|
|
100
|
+
for (let index = 0; index < featureIds.length; index++) {
|
|
101
|
+
this.encodePickingColor(featureIds[index], pickingColor);
|
|
102
|
+
value[index * 3] = pickingColor[0];
|
|
103
|
+
value[index * 3 + 1] = pickingColor[1];
|
|
104
|
+
value[index * 3 + 2] = pickingColor[2];
|
|
105
|
+
}
|
|
106
|
+
attribute.value = value;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
_MeshLayer.layerName = '_MeshLayer';
|
|
110
|
+
_MeshLayer.defaultProps = defaultProps;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinate-transform.d.ts","sourceRoot":"","sources":["../../src/mvt-layer/coordinate-transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AA0CnD,wBAAgB,SAAS,CAAC,QAAQ,KAAA,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,OAa3E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { lerp } from '@math.gl/core';
|
|
2
|
+
const availableTransformations = {
|
|
3
|
+
Point,
|
|
4
|
+
MultiPoint,
|
|
5
|
+
LineString,
|
|
6
|
+
MultiLineString,
|
|
7
|
+
Polygon,
|
|
8
|
+
MultiPolygon
|
|
9
|
+
};
|
|
10
|
+
function Point([pointX, pointY], [nw, se], viewport) {
|
|
11
|
+
const x = lerp(nw[0], se[0], pointX);
|
|
12
|
+
const y = lerp(nw[1], se[1], pointY);
|
|
13
|
+
return viewport.unprojectFlat([x, y]);
|
|
14
|
+
}
|
|
15
|
+
function getPoints(geometry, bbox, viewport) {
|
|
16
|
+
return geometry.map(g => Point(g, bbox, viewport));
|
|
17
|
+
}
|
|
18
|
+
function MultiPoint(multiPoint, bbox, viewport) {
|
|
19
|
+
return getPoints(multiPoint, bbox, viewport);
|
|
20
|
+
}
|
|
21
|
+
function LineString(line, bbox, viewport) {
|
|
22
|
+
return getPoints(line, bbox, viewport);
|
|
23
|
+
}
|
|
24
|
+
function MultiLineString(multiLineString, bbox, viewport) {
|
|
25
|
+
return multiLineString.map(lineString => LineString(lineString, bbox, viewport));
|
|
26
|
+
}
|
|
27
|
+
function Polygon(polygon, bbox, viewport) {
|
|
28
|
+
return polygon.map(polygonRing => getPoints(polygonRing, bbox, viewport));
|
|
29
|
+
}
|
|
30
|
+
function MultiPolygon(multiPolygon, bbox, viewport) {
|
|
31
|
+
return multiPolygon.map(polygon => Polygon(polygon, bbox, viewport));
|
|
32
|
+
}
|
|
33
|
+
export function transform(geometry, bbox, viewport) {
|
|
34
|
+
const nw = viewport.projectFlat([bbox.west, bbox.north]);
|
|
35
|
+
const se = viewport.projectFlat([bbox.east, bbox.south]);
|
|
36
|
+
const projectedBbox = [nw, se];
|
|
37
|
+
return {
|
|
38
|
+
...geometry,
|
|
39
|
+
coordinates: availableTransformations[geometry.type](geometry.coordinates, projectedBbox, viewport)
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BinaryFeatures } from '@loaders.gl/schema';
|
|
2
|
+
/**
|
|
3
|
+
* Return the index of feature (numericProps or featureIds) for given feature id
|
|
4
|
+
* Example: findIndexBinary(data, 'id', 33) will return the index in the array of numericProps
|
|
5
|
+
* of the feature 33.
|
|
6
|
+
* @param {Object} data - The data in binary format
|
|
7
|
+
* @param {String} uniqueIdProperty - Name of the unique id property
|
|
8
|
+
* @param {Number|String} featureId - feature id to find
|
|
9
|
+
* @param {String} layerName - the layer to search in
|
|
10
|
+
*/
|
|
11
|
+
export default function findIndexBinary(data: BinaryFeatures, uniqueIdProperty: string, featureId: string | number, layerName: string): number;
|
|
12
|
+
//# sourceMappingURL=find-index-binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-index-binary.d.ts","sourceRoot":"","sources":["../../src/mvt-layer/find-index-binary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAIf,MAAM,oBAAoB,CAAC;AAK5B;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,IAAI,EAAE,cAAc,EACpB,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,SAAS,EAAE,MAAM,GAChB,MAAM,CASR"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
const GEOM_TYPES = ['points', 'lines', 'polygons'];
|
|
2
|
+
/**
|
|
3
|
+
* Return the index of feature (numericProps or featureIds) for given feature id
|
|
4
|
+
* Example: findIndexBinary(data, 'id', 33) will return the index in the array of numericProps
|
|
5
|
+
* of the feature 33.
|
|
6
|
+
* @param {Object} data - The data in binary format
|
|
7
|
+
* @param {String} uniqueIdProperty - Name of the unique id property
|
|
8
|
+
* @param {Number|String} featureId - feature id to find
|
|
9
|
+
* @param {String} layerName - the layer to search in
|
|
10
|
+
*/
|
|
11
|
+
export default function findIndexBinary(data, uniqueIdProperty, featureId, layerName) {
|
|
12
|
+
for (const gt of GEOM_TYPES) {
|
|
13
|
+
const index = data[gt] && findIndexByType(data[gt], uniqueIdProperty, featureId, layerName);
|
|
14
|
+
if (index >= 0) {
|
|
15
|
+
return index;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return -1;
|
|
19
|
+
}
|
|
20
|
+
function findIndexByType(geomData, uniqueIdProperty, featureId, layerName) {
|
|
21
|
+
const featureIds = geomData.featureIds.value;
|
|
22
|
+
if (!featureIds.length) {
|
|
23
|
+
return -1;
|
|
24
|
+
}
|
|
25
|
+
let startFeatureIndex = 0;
|
|
26
|
+
let endFeatureIndex = featureIds[featureIds.length - 1] + 1;
|
|
27
|
+
if (layerName) {
|
|
28
|
+
const layerRange = getLayerRange(geomData, layerName);
|
|
29
|
+
if (layerRange) {
|
|
30
|
+
startFeatureIndex = layerRange[0];
|
|
31
|
+
endFeatureIndex = layerRange[1] + 1;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return -1;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Look for the uniqueIdProperty
|
|
38
|
+
let featureIndex = -1;
|
|
39
|
+
if (uniqueIdProperty in geomData.numericProps) {
|
|
40
|
+
const vertexIndex = geomData.numericProps[uniqueIdProperty].value.findIndex((x, i) => x === featureId && featureIds[i] >= startFeatureIndex && featureIds[i] < endFeatureIndex);
|
|
41
|
+
return vertexIndex >= 0 ? geomData.globalFeatureIds.value[vertexIndex] : -1;
|
|
42
|
+
}
|
|
43
|
+
else if (uniqueIdProperty) {
|
|
44
|
+
featureIndex = findIndex(geomData.properties, elem => elem[uniqueIdProperty] === featureId, startFeatureIndex, endFeatureIndex);
|
|
45
|
+
}
|
|
46
|
+
else if (geomData.fields) {
|
|
47
|
+
featureIndex = findIndex(geomData.fields, (elem) => elem.id === featureId, startFeatureIndex, endFeatureIndex);
|
|
48
|
+
}
|
|
49
|
+
return featureIndex >= 0 ? getGlobalFeatureId(geomData, featureIndex) : -1;
|
|
50
|
+
}
|
|
51
|
+
// Returns [firstFeatureIndex, lastFeatureIndex]
|
|
52
|
+
// MVTLoader parses tiles layer-by-layer, so each layer is a continuous range
|
|
53
|
+
function getLayerRange(geomData, layerName) {
|
|
54
|
+
if (!geomData.__layers) {
|
|
55
|
+
// Cache a map from properties.layerName to index ranges
|
|
56
|
+
const layerNames = {};
|
|
57
|
+
const { properties } = geomData;
|
|
58
|
+
for (let i = 0; i < properties.length; i++) {
|
|
59
|
+
const { layerName: key } = properties[i];
|
|
60
|
+
if (!key) {
|
|
61
|
+
// ignore
|
|
62
|
+
}
|
|
63
|
+
else if (layerNames[key]) {
|
|
64
|
+
layerNames[key][1] = i;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
layerNames[key] = [i, i];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
geomData.__layers = layerNames;
|
|
71
|
+
}
|
|
72
|
+
return geomData.__layers[layerName];
|
|
73
|
+
}
|
|
74
|
+
// Returns global feature id
|
|
75
|
+
function getGlobalFeatureId(geomData, featureIndex) {
|
|
76
|
+
if (!geomData.__ids) {
|
|
77
|
+
// Cache a map from featureId to globalFeatureId
|
|
78
|
+
const result = [];
|
|
79
|
+
const featureIds = geomData.featureIds.value;
|
|
80
|
+
const globalFeatureIds = geomData.globalFeatureIds.value;
|
|
81
|
+
for (let i = 0; i < featureIds.length; i++) {
|
|
82
|
+
result[featureIds[i]] = globalFeatureIds[i];
|
|
83
|
+
}
|
|
84
|
+
geomData.__ids = result;
|
|
85
|
+
}
|
|
86
|
+
return geomData.__ids[featureIndex];
|
|
87
|
+
}
|
|
88
|
+
// Like array.findIndex, but only search within a range
|
|
89
|
+
function findIndex(array, predicate, startIndex, endIndex) {
|
|
90
|
+
for (let i = startIndex; i < endIndex; i++) {
|
|
91
|
+
if (predicate(array[i], i)) {
|
|
92
|
+
return i;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return -1;
|
|
96
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Layer, LayersList, PickingInfo, UpdateParameters, GetPickingInfoParams, DefaultProps } from '@deck.gl/core/typed';
|
|
2
|
+
import { GeoJsonLayerProps } from '@deck.gl/layers/typed';
|
|
3
|
+
import type { Loader } from '@loaders.gl/loader-utils';
|
|
4
|
+
import type { BinaryFeatures } from '@loaders.gl/schema';
|
|
5
|
+
import type { Feature } from 'geojson';
|
|
6
|
+
import TileLayer, { TiledPickingInfo, TileLayerProps } from '../tile-layer/tile-layer';
|
|
7
|
+
import { Tileset2DProps } from '../tile-layer/tileset-2d';
|
|
8
|
+
import { TileLoadProps } from '../tile-layer/types';
|
|
9
|
+
import Tile2DHeader from '../tile-layer/tile-2d-header';
|
|
10
|
+
export declare type TileJson = {
|
|
11
|
+
tilejson: string;
|
|
12
|
+
tiles: string[];
|
|
13
|
+
vector_layers: any[];
|
|
14
|
+
attribution?: string;
|
|
15
|
+
scheme?: string;
|
|
16
|
+
maxzoom?: number;
|
|
17
|
+
minzoom?: number;
|
|
18
|
+
version?: string;
|
|
19
|
+
};
|
|
20
|
+
declare type ParsedMvtTile = Feature[] | BinaryFeatures;
|
|
21
|
+
/** All props supported by the MVTLayer */
|
|
22
|
+
export declare type MVTLayerProps<DataT extends Feature = Feature> = _MVTLayerProps & GeoJsonLayerProps<DataT> & TileLayerProps<ParsedMvtTile>;
|
|
23
|
+
/** Props added by the MVTLayer */
|
|
24
|
+
export declare type _MVTLayerProps = {
|
|
25
|
+
/** Called if `data` is a TileJSON URL when it is successfully fetched. */
|
|
26
|
+
onDataLoad?: ((tilejson: TileJson | null) => void) | null;
|
|
27
|
+
/** Needed for highlighting a feature split across two or more tiles. */
|
|
28
|
+
uniqueIdProperty?: string;
|
|
29
|
+
/** A feature with ID corresponding to the supplied value will be highlighted. */
|
|
30
|
+
highlightedFeatureId?: string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Use tile data in binary format.
|
|
33
|
+
*
|
|
34
|
+
* @default true
|
|
35
|
+
*/
|
|
36
|
+
binary?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Loaders used to transform tiles into `data` property passed to `renderSubLayers`.
|
|
39
|
+
*
|
|
40
|
+
* @default [MVTWorkerLoader] from `@loaders.gl/mvt`
|
|
41
|
+
*/
|
|
42
|
+
loaders?: Loader[];
|
|
43
|
+
};
|
|
44
|
+
export default class MVTLayer<DataT extends Feature = Feature, ExtraProps = {}> extends TileLayer<ParsedMvtTile, Required<_MVTLayerProps> & ExtraProps> {
|
|
45
|
+
static layerName: string;
|
|
46
|
+
static defaultProps: DefaultProps<MVTLayerProps<Feature<import("geojson").Geometry, import("geojson").GeoJsonProperties>>>;
|
|
47
|
+
initializeState(): void;
|
|
48
|
+
get isLoaded(): boolean;
|
|
49
|
+
updateState({ props, oldProps, context, changeFlags }: UpdateParameters<this>): void;
|
|
50
|
+
private _updateTileData;
|
|
51
|
+
_getTilesetOptions(): Tileset2DProps;
|
|
52
|
+
renderLayers(): Layer | null | LayersList;
|
|
53
|
+
getTileData(loadProps: TileLoadProps): Promise<ParsedMvtTile>;
|
|
54
|
+
renderSubLayers(props: TileLayer['props'] & {
|
|
55
|
+
id: string;
|
|
56
|
+
data: ParsedMvtTile;
|
|
57
|
+
_offset: number;
|
|
58
|
+
tile: Tile2DHeader<ParsedMvtTile>;
|
|
59
|
+
}): Layer | null | LayersList;
|
|
60
|
+
protected _updateAutoHighlight(info: PickingInfo): void;
|
|
61
|
+
getPickingInfo(params: GetPickingInfoParams): TiledPickingInfo;
|
|
62
|
+
getSubLayerPropsByTile(tile: Tile2DHeader<ParsedMvtTile>): Record<string, any>;
|
|
63
|
+
private getHighlightedObjectIndex;
|
|
64
|
+
private _pickObjects;
|
|
65
|
+
/** Get the rendered features in the current viewport. */
|
|
66
|
+
getRenderedFeatures(maxFeatures?: number | null): DataT[];
|
|
67
|
+
private _setWGS84PropertyForTiles;
|
|
68
|
+
}
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=mvt-layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mvt-layer.d.ts","sourceRoot":"","sources":["../../src/mvt-layer/mvt-layer.ts"],"names":[],"mappings":"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"}
|