@deck.gl-community/three 9.2.5

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.
@@ -0,0 +1,163 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { BufferGeometry, BufferAttribute, CylinderGeometry, ConeGeometry, SphereGeometry, Matrix4 } from 'three';
5
+ /**
6
+ * Rotation matrix that converts from Three.js Y-up to deck.gl Z-up.
7
+ * Rotates -90 degrees around the X axis: Y -> Z, Z -> -Y.
8
+ */
9
+ const Y_TO_Z_UP = new Matrix4().makeRotationX(-Math.PI / 2);
10
+ /**
11
+ * Extract a TreeMesh from a Three.js BufferGeometry.
12
+ * Assumes the geometry has already been rotated to Z-up.
13
+ */
14
+ function extractMesh(geo) {
15
+ geo.computeVertexNormals();
16
+ const posAttr = geo.attributes.position;
17
+ const norAttr = geo.attributes.normal;
18
+ const idx = geo.index;
19
+ return {
20
+ attributes: {
21
+ POSITION: { value: new Float32Array(posAttr.array), size: 3 },
22
+ NORMAL: { value: new Float32Array(norAttr.array), size: 3 }
23
+ },
24
+ indices: { value: new Uint32Array(idx ? idx.array : new Uint32Array(0)), size: 1 },
25
+ topology: 'triangle-list',
26
+ mode: 4
27
+ };
28
+ }
29
+ /** Copy indices for one geometry slice, offsetting by the current vertex base. */
30
+ function copyIndices(out, outOffset, geo, vertexBase) {
31
+ if (geo.index) {
32
+ const src = geo.index.array;
33
+ for (let i = 0; i < src.length; i++)
34
+ out[outOffset + i] = src[i] + vertexBase;
35
+ return src.length;
36
+ }
37
+ const count = geo.attributes.position.count;
38
+ for (let i = 0; i < count; i++)
39
+ out[outOffset + i] = vertexBase + i;
40
+ return count;
41
+ }
42
+ /**
43
+ * Merge multiple Three.js BufferGeometries into a single geometry.
44
+ * All input geometries must be indexed.
45
+ */
46
+ function mergeGeometries(geos) {
47
+ let totalVertices = 0;
48
+ let totalIndices = 0;
49
+ for (const geo of geos) {
50
+ totalVertices += geo.attributes.position.count;
51
+ totalIndices += geo.index ? geo.index.count : geo.attributes.position.count;
52
+ }
53
+ const positions = new Float32Array(totalVertices * 3);
54
+ const normals = new Float32Array(totalVertices * 3);
55
+ const indices = new Uint32Array(totalIndices);
56
+ let vOffset = 0;
57
+ let iOffset = 0;
58
+ for (const geo of geos) {
59
+ const count = geo.attributes.position.count;
60
+ const srcNor = geo.attributes.normal ? geo.attributes.normal.array : null;
61
+ positions.set(geo.attributes.position.array, vOffset * 3);
62
+ if (srcNor)
63
+ normals.set(srcNor, vOffset * 3);
64
+ iOffset += copyIndices(indices, iOffset, geo, vOffset);
65
+ vOffset += count;
66
+ }
67
+ const merged = new BufferGeometry();
68
+ merged.setAttribute('position', new BufferAttribute(positions, 3));
69
+ merged.setAttribute('normal', new BufferAttribute(normals, 3));
70
+ merged.setIndex(new BufferAttribute(indices, 1));
71
+ return merged;
72
+ }
73
+ /**
74
+ * Unit trunk cylinder mesh: from z=0 (base) to z=1 (top), radius tapers from 1 to 0.7.
75
+ * Scale via `getScale = [trunkRadius, trunkRadius, trunkHeight]`.
76
+ */
77
+ export function createTrunkMesh(segments = 8) {
78
+ const geo = new CylinderGeometry(0.7, 1.0, 1.0, segments);
79
+ // Three.js CylinderGeometry is centered at origin, extends from y=-0.5 to y=0.5
80
+ geo.applyMatrix4(Y_TO_Z_UP); // Rotate to Z-up: now z=-0.5 to z=0.5
81
+ geo.translate(0, 0, 0.5); // Shift so base is at z=0, top at z=1
82
+ return extractMesh(geo);
83
+ }
84
+ /**
85
+ * Unit pine canopy mesh: multiple tiered cones creating a Christmas tree silhouette.
86
+ * Extends from z=0 (base of canopy) to z=1 (tip).
87
+ *
88
+ * @param levels - number of cone tiers (1-5)
89
+ * @param segments - polygon segments per cone
90
+ */
91
+ export function createPineCanopyMesh(levels = 3, segments = 8) {
92
+ const geos = [];
93
+ const tierHeight = 0.55 / levels;
94
+ for (let i = 0; i < levels; i++) {
95
+ const t = i / (levels - 1 || 1);
96
+ // Bottom tiers are wider, top tiers are narrower
97
+ const radius = (1 - t * 0.5) * 0.85;
98
+ // Tiers are staggered: each one starts 60% up the previous tier
99
+ const zBase = t * (1 - tierHeight * 1.2);
100
+ const cone = new ConeGeometry(radius, tierHeight, segments);
101
+ cone.applyMatrix4(Y_TO_Z_UP);
102
+ // ConeGeometry apex is at y=+height/2 -> z=+height/2 after rotation
103
+ // Translate so apex points upward and base is at zBase
104
+ cone.translate(0, 0, zBase + tierHeight);
105
+ geos.push(cone);
106
+ }
107
+ // Sharp tip at top
108
+ const tip = new ConeGeometry(0.12, 0.18, 6);
109
+ tip.applyMatrix4(Y_TO_Z_UP);
110
+ tip.translate(0, 0, 1.0);
111
+ geos.push(tip);
112
+ const merged = mergeGeometries(geos);
113
+ merged.computeVertexNormals();
114
+ return extractMesh(merged);
115
+ }
116
+ /**
117
+ * Unit oak canopy mesh: a large sphere.
118
+ * Extends from z=0 to z=1, center at z=0.5.
119
+ */
120
+ export function createOakCanopyMesh() {
121
+ const geo = new SphereGeometry(0.5, 12, 8);
122
+ // SphereGeometry is centered at origin, radius=0.5
123
+ geo.applyMatrix4(Y_TO_Z_UP);
124
+ geo.translate(0, 0, 0.5); // center at z=0.5, extends z=0 to z=1
125
+ return extractMesh(geo);
126
+ }
127
+ /**
128
+ * Unit palm canopy mesh: a flat, wide disk crown typical of palm trees.
129
+ * Extends from z=0 to z=0.35, radius=1.
130
+ */
131
+ export function createPalmCanopyMesh() {
132
+ // Flattened sphere acting as a spread crown
133
+ const geo = new SphereGeometry(0.7, 12, 5);
134
+ const flatten = new Matrix4().makeScale(1.4, 0.35, 1.4);
135
+ geo.applyMatrix4(flatten);
136
+ geo.applyMatrix4(Y_TO_Z_UP);
137
+ geo.translate(0, 0, 0.18);
138
+ return extractMesh(geo);
139
+ }
140
+ /**
141
+ * Unit birch canopy mesh: a narrow oval / diamond shape.
142
+ * Extends from z=0 to z=1, narrower than an oak.
143
+ */
144
+ export function createBirchCanopyMesh() {
145
+ const geo = new SphereGeometry(0.42, 10, 8);
146
+ // Elongate vertically (Z after rotation)
147
+ const elongate = new Matrix4().makeScale(1, 1.45, 1);
148
+ geo.applyMatrix4(elongate);
149
+ geo.applyMatrix4(Y_TO_Z_UP);
150
+ geo.translate(0, 0, 0.5);
151
+ return extractMesh(geo);
152
+ }
153
+ /**
154
+ * Unit cherry canopy mesh: a full, round sphere slightly larger than oak.
155
+ * Extends from z=0 to z=1.1 (slightly wider than tall for a lush look).
156
+ */
157
+ export function createCherryCanopyMesh() {
158
+ const geo = new SphereGeometry(0.52, 12, 8);
159
+ geo.applyMatrix4(Y_TO_Z_UP);
160
+ geo.translate(0, 0, 0.5);
161
+ return extractMesh(geo);
162
+ }
163
+ //# sourceMappingURL=tree-geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-geometry.js","sourceRoot":"","sources":["../../src/tree-layer/tree-geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { CompositeLayer } from '@deck.gl/core';
2
+ import type { Color, DefaultProps, LayerProps, Position } from '@deck.gl/core';
3
+ import { SimpleMeshLayer } from '@deck.gl/mesh-layers';
4
+ import { createPineCanopyMesh } from "./tree-geometry.js";
5
+ /** Tree species / silhouette variant. */
6
+ export type TreeType = 'pine' | 'oak' | 'palm' | 'birch' | 'cherry';
7
+ /** Season that drives default canopy colour when no explicit colour is supplied. */
8
+ export type Season = 'spring' | 'summer' | 'autumn' | 'winter';
9
+ type _TreeLayerProps<DataT> = {
10
+ /** Source data. */
11
+ data: DataT[];
12
+ /** Longitude/latitude position of the tree base. */
13
+ getPosition?: (d: DataT) => Position;
14
+ /** Base elevation (metres above sea level). @default 0 */
15
+ getElevation?: (d: DataT) => number;
16
+ /**
17
+ * Silhouette / species variant.
18
+ * 'pine' – layered conical tiers (evergreen)
19
+ * 'oak' – wide spherical canopy
20
+ * 'palm' – tall thin trunk with flat crown
21
+ * 'birch' – narrow oval canopy, pale bark
22
+ * 'cherry' – round lush canopy, seasonal blossom
23
+ * @default 'pine'
24
+ */
25
+ getTreeType?: (d: DataT) => TreeType;
26
+ /**
27
+ * Total tree height in metres.
28
+ * @default 10
29
+ */
30
+ getHeight?: (d: DataT) => number;
31
+ /**
32
+ * Fraction of total height occupied by the trunk (0–1).
33
+ * @default 0.35
34
+ */
35
+ getTrunkHeightFraction?: (d: DataT) => number;
36
+ /**
37
+ * Trunk base radius in metres.
38
+ * @default 0.5
39
+ */
40
+ getTrunkRadius?: (d: DataT) => number;
41
+ /**
42
+ * Horizontal radius of the canopy in metres.
43
+ * @default 3
44
+ */
45
+ getCanopyRadius?: (d: DataT) => number;
46
+ /**
47
+ * Explicit trunk colour [r, g, b, a].
48
+ * When null the species default is used.
49
+ * @default null
50
+ */
51
+ getTrunkColor?: (d: DataT) => Color | null;
52
+ /**
53
+ * Explicit canopy colour [r, g, b, a].
54
+ * When null the species × season default is used.
55
+ * @default null
56
+ */
57
+ getCanopyColor?: (d: DataT) => Color | null;
58
+ /**
59
+ * Season used to pick the default canopy colour when no explicit colour is provided.
60
+ * @default 'summer'
61
+ */
62
+ getSeason?: (d: DataT) => Season;
63
+ /**
64
+ * Number of cone tiers for pine trees (1–5).
65
+ * Higher values produce a denser layered silhouette.
66
+ * @default 3
67
+ */
68
+ getBranchLevels?: (d: DataT) => number;
69
+ /**
70
+ * Global size multiplier applied to all dimensions.
71
+ * @default 1
72
+ */
73
+ sizeScale?: number;
74
+ };
75
+ export type TreeLayerProps<DataT = unknown> = _TreeLayerProps<DataT> & LayerProps;
76
+ type TreeLayerState = {
77
+ grouped: Record<TreeType, unknown[]>;
78
+ pineMeshes: Record<number, ReturnType<typeof createPineCanopyMesh>>;
79
+ };
80
+ /**
81
+ * **TreeLayer** — A parametric, Three.js-powered deck.gl layer that renders
82
+ * richly configurable 3D trees at geographic positions.
83
+ *
84
+ * Each tree is composed of two `SimpleMeshLayer` instances: one for the trunk
85
+ * (a tapered cylinder) and one for the canopy (silhouette depends on `getTreeType`).
86
+ * All geometry is generated procedurally using Three.js `BufferGeometry` primitives
87
+ * and converted to the `@loaders.gl/schema` `MeshGeometry` format accepted by
88
+ * `SimpleMeshLayer`.
89
+ *
90
+ * Parametric controls include:
91
+ * - Species / silhouette (`getTreeType`)
92
+ * - Total height (`getHeight`) and trunk-to-canopy proportion (`getTrunkHeightFraction`)
93
+ * - Trunk and canopy radii (`getTrunkRadius`, `getCanopyRadius`)
94
+ * - Explicit or season-driven colours (`getTrunkColor`, `getCanopyColor`, `getSeason`)
95
+ * - Pine tier density (`getBranchLevels`)
96
+ * - Global scale factor (`sizeScale`)
97
+ */
98
+ export declare class TreeLayer<DataT = unknown, ExtraPropsT extends {} = {}> extends CompositeLayer<ExtraPropsT & Required<_TreeLayerProps<DataT>>> {
99
+ static layerName: string;
100
+ static defaultProps: DefaultProps<TreeLayerProps<unknown>>;
101
+ state: TreeLayerState;
102
+ initializeState(): void;
103
+ updateState({ props, changeFlags }: {
104
+ props: any;
105
+ changeFlags: any;
106
+ }): void;
107
+ /** Build a single canopy sub-layer for one tree type. */
108
+ private _buildCanopyLayer;
109
+ renderLayers(): SimpleMeshLayer<any, {}>[];
110
+ }
111
+ export {};
112
+ //# sourceMappingURL=tree-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-layer.d.ts","sourceRoot":"","sources":["../../src/tree-layer/tree-layer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAEL,oBAAoB,EAKrB,2BAAwB;AAMzB,yCAAyC;AACzC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpE,oFAAoF;AACpF,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAqE/D,KAAK,eAAe,CAAC,KAAK,IAAI;IAC5B,mBAAmB;IACnB,IAAI,EAAE,KAAK,EAAE,CAAC;IAEd,oDAAoD;IACpD,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,QAAQ,CAAC;IAErC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC;IAEpC;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,QAAQ,CAAC;IAErC;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC;IAEjC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC;IAE9C;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC;IAEtC;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC;IAEvC;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,GAAG,IAAI,CAAC;IAE3C;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,GAAG,IAAI,CAAC;IAE5C;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC;IAEjC;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC;IAEvC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,KAAK,GAAG,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;AAqBlF,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC;CACrE,CAAC;AAMF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,SAAS,CAAC,KAAK,GAAG,OAAO,EAAE,WAAW,SAAS,EAAE,GAAG,EAAE,CAAE,SAAQ,cAAc,CACzF,WAAW,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAC/C;IACC,MAAM,CAAC,SAAS,SAAe;IAC/B,MAAM,CAAC,YAAY,wCAAgB;IAE3B,KAAK,EAAE,cAAc,CAAC;IAE9B,eAAe;IAOf,WAAW,CAAC,EAAC,KAAK,EAAE,WAAW,EAAC;;;KAAA;IA2BhC,yDAAyD;IACzD,OAAO,CAAC,iBAAiB;IAiDzB,YAAY;CAoDb"}
@@ -0,0 +1,206 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer } from '@deck.gl/core';
5
+ import { SimpleMeshLayer } from '@deck.gl/mesh-layers';
6
+ import { createTrunkMesh, createPineCanopyMesh, createOakCanopyMesh, createPalmCanopyMesh, createBirchCanopyMesh, createCherryCanopyMesh } from "./tree-geometry.js";
7
+ // ---------------------------------------------------------------------------
8
+ // Default colours
9
+ // ---------------------------------------------------------------------------
10
+ /** Default trunk colours per tree type [r, g, b, a]. */
11
+ const DEFAULT_TRUNK_COLORS = {
12
+ pine: [80, 50, 20, 255],
13
+ oak: [91, 57, 23, 255],
14
+ palm: [140, 100, 55, 255],
15
+ birch: [220, 215, 205, 255], // white-grey birch bark
16
+ cherry: [100, 60, 40, 255]
17
+ };
18
+ /** Default canopy colours per (tree type, season) [r, g, b, a]. */
19
+ const DEFAULT_CANOPY_COLORS = {
20
+ pine: {
21
+ spring: [34, 100, 34, 255],
22
+ summer: [0, 64, 0, 255],
23
+ autumn: [0, 64, 0, 255], // evergreen — no colour change
24
+ winter: [0, 55, 0, 255]
25
+ },
26
+ oak: {
27
+ spring: [100, 180, 80, 255],
28
+ summer: [34, 120, 15, 255],
29
+ autumn: [180, 85, 20, 255],
30
+ winter: [100, 80, 60, 160] // sparse, semi-transparent
31
+ },
32
+ palm: {
33
+ spring: [50, 160, 50, 255],
34
+ summer: [20, 145, 20, 255],
35
+ autumn: [55, 150, 30, 255],
36
+ winter: [40, 130, 30, 255]
37
+ },
38
+ birch: {
39
+ spring: [150, 210, 110, 255],
40
+ summer: [80, 160, 60, 255],
41
+ autumn: [230, 185, 40, 255],
42
+ winter: [180, 180, 170, 90] // near-bare
43
+ },
44
+ cherry: {
45
+ spring: [255, 180, 205, 255], // pink blossom
46
+ summer: [50, 140, 50, 255],
47
+ autumn: [200, 60, 40, 255],
48
+ winter: [120, 90, 80, 110] // bare
49
+ }
50
+ };
51
+ // ---------------------------------------------------------------------------
52
+ // Pre-built unit-scale meshes (shared across all layer instances)
53
+ // ---------------------------------------------------------------------------
54
+ const TRUNK_MESH = createTrunkMesh();
55
+ const CANOPY_MESHES = {
56
+ pine: createPineCanopyMesh(3),
57
+ oak: createOakCanopyMesh(),
58
+ palm: createPalmCanopyMesh(),
59
+ birch: createBirchCanopyMesh(),
60
+ cherry: createCherryCanopyMesh()
61
+ };
62
+ const ALL_TREE_TYPES = ['pine', 'oak', 'palm', 'birch', 'cherry'];
63
+ const defaultProps = {
64
+ getPosition: { type: 'accessor', value: (d) => d.position },
65
+ getElevation: { type: 'accessor', value: (_d) => 0 },
66
+ getTreeType: { type: 'accessor', value: (_d) => 'pine' },
67
+ getHeight: { type: 'accessor', value: (_d) => 10 },
68
+ getTrunkHeightFraction: { type: 'accessor', value: (_d) => 0.35 },
69
+ getTrunkRadius: { type: 'accessor', value: (_d) => 0.5 },
70
+ getCanopyRadius: { type: 'accessor', value: (_d) => 3 },
71
+ getTrunkColor: { type: 'accessor', value: (_d) => null },
72
+ getCanopyColor: { type: 'accessor', value: (_d) => null },
73
+ getSeason: { type: 'accessor', value: (_d) => 'summer' },
74
+ getBranchLevels: { type: 'accessor', value: (_d) => 3 },
75
+ sizeScale: { type: 'number', value: 1, min: 0 }
76
+ };
77
+ // ---------------------------------------------------------------------------
78
+ // Layer
79
+ // ---------------------------------------------------------------------------
80
+ /**
81
+ * **TreeLayer** — A parametric, Three.js-powered deck.gl layer that renders
82
+ * richly configurable 3D trees at geographic positions.
83
+ *
84
+ * Each tree is composed of two `SimpleMeshLayer` instances: one for the trunk
85
+ * (a tapered cylinder) and one for the canopy (silhouette depends on `getTreeType`).
86
+ * All geometry is generated procedurally using Three.js `BufferGeometry` primitives
87
+ * and converted to the `@loaders.gl/schema` `MeshGeometry` format accepted by
88
+ * `SimpleMeshLayer`.
89
+ *
90
+ * Parametric controls include:
91
+ * - Species / silhouette (`getTreeType`)
92
+ * - Total height (`getHeight`) and trunk-to-canopy proportion (`getTrunkHeightFraction`)
93
+ * - Trunk and canopy radii (`getTrunkRadius`, `getCanopyRadius`)
94
+ * - Explicit or season-driven colours (`getTrunkColor`, `getCanopyColor`, `getSeason`)
95
+ * - Pine tier density (`getBranchLevels`)
96
+ * - Global scale factor (`sizeScale`)
97
+ */
98
+ export class TreeLayer extends CompositeLayer {
99
+ static layerName = 'TreeLayer';
100
+ static defaultProps = defaultProps;
101
+ initializeState() {
102
+ this.state = {
103
+ grouped: { pine: [], oak: [], palm: [], birch: [], cherry: [] },
104
+ pineMeshes: {}
105
+ };
106
+ }
107
+ updateState({ props, changeFlags }) {
108
+ if (changeFlags.dataChanged || changeFlags.updateTriggersChanged) {
109
+ const { data, getTreeType, getBranchLevels } = props;
110
+ const grouped = {
111
+ pine: [],
112
+ oak: [],
113
+ palm: [],
114
+ birch: [],
115
+ cherry: []
116
+ };
117
+ // Build per-level pine mesh cache
118
+ const pineMeshes = {};
119
+ for (const d of data) {
120
+ const type = getTreeType(d);
121
+ if (grouped[type])
122
+ grouped[type].push(d);
123
+ if (type === 'pine') {
124
+ const levels = Math.max(1, Math.min(5, Math.round(getBranchLevels(d))));
125
+ pineMeshes[levels] ??= createPineCanopyMesh(levels);
126
+ }
127
+ }
128
+ this.setState({ grouped, pineMeshes });
129
+ }
130
+ }
131
+ /** Build a single canopy sub-layer for one tree type. */
132
+ _buildCanopyLayer(type) {
133
+ const { getPosition, getElevation, getHeight, getTrunkHeightFraction, getCanopyRadius, getCanopyColor, getSeason, sizeScale } = this.props; // eslint-disable-line max-len
134
+ const { grouped, pineMeshes } = this.state;
135
+ let mesh = CANOPY_MESHES[type];
136
+ if (type === 'pine') {
137
+ const firstLevel = Object.keys(pineMeshes)[0];
138
+ if (firstLevel)
139
+ mesh = pineMeshes[Number(firstLevel)];
140
+ }
141
+ return new SimpleMeshLayer(this.getSubLayerProps({
142
+ id: `canopy-${type}`,
143
+ data: grouped[type],
144
+ mesh,
145
+ getPosition: (d) => {
146
+ const pos = getPosition(d);
147
+ const elevation = getElevation(d) || 0;
148
+ const h = getHeight(d) * sizeScale;
149
+ const f = getTrunkHeightFraction(d);
150
+ return [pos[0], pos[1], elevation + h * f];
151
+ },
152
+ getScale: (d) => {
153
+ const h = getHeight(d) * sizeScale;
154
+ const f = getTrunkHeightFraction(d);
155
+ const r = getCanopyRadius(d) * sizeScale;
156
+ return [r, r, h * (1 - f)];
157
+ },
158
+ getColor: (d) => {
159
+ const explicit = getCanopyColor(d);
160
+ if (explicit)
161
+ return explicit;
162
+ const season = getSeason(d) || 'summer';
163
+ return DEFAULT_CANOPY_COLORS[type][season];
164
+ },
165
+ pickable: this.props.pickable,
166
+ material: { ambient: 0.4, diffuse: 0.7, shininess: 12 }
167
+ }));
168
+ }
169
+ renderLayers() {
170
+ const { getPosition, getElevation, getTreeType, getHeight, getTrunkHeightFraction, getTrunkRadius, getTrunkColor, sizeScale } = this.props;
171
+ const { grouped } = this.state;
172
+ // -----------------------------------------------------------------------
173
+ // 1. Trunk layer — one layer for ALL tree types, shared cylinder geometry
174
+ // -----------------------------------------------------------------------
175
+ const trunkLayer = new SimpleMeshLayer(this.getSubLayerProps({
176
+ id: 'trunks',
177
+ data: this.props.data,
178
+ mesh: TRUNK_MESH,
179
+ getPosition: (d) => {
180
+ const pos = getPosition(d);
181
+ return [pos[0], pos[1], getElevation(d) || 0];
182
+ },
183
+ getScale: (d) => {
184
+ const h = getHeight(d) * sizeScale;
185
+ const f = getTrunkHeightFraction(d);
186
+ const r = getTrunkRadius(d) * sizeScale;
187
+ return [r, r, h * f];
188
+ },
189
+ getColor: (d) => {
190
+ const explicit = getTrunkColor(d);
191
+ if (explicit)
192
+ return explicit;
193
+ const type = getTreeType(d) || 'pine';
194
+ return DEFAULT_TRUNK_COLORS[type] ?? DEFAULT_TRUNK_COLORS.pine;
195
+ },
196
+ pickable: this.props.pickable,
197
+ material: { ambient: 0.35, diffuse: 0.6, shininess: 8 }
198
+ }));
199
+ // -----------------------------------------------------------------------
200
+ // 2. Canopy layers — one per tree type, only for trees of that type
201
+ // -----------------------------------------------------------------------
202
+ const canopyLayers = ALL_TREE_TYPES.filter((type) => grouped[type].length > 0).map((type) => this._buildCanopyLayer(type));
203
+ return [trunkLayer, ...canopyLayers];
204
+ }
205
+ }
206
+ //# sourceMappingURL=tree-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-layer.js","sourceRoot":"","sources":["../../src/tree-layer/tree-layer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@deck.gl-community/three",
3
+ "version": "9.2.5",
4
+ "description": "Three.js-powered layers for deck.gl",
5
+ "license": "MIT",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "keywords": [
10
+ "layers",
11
+ "visualization",
12
+ "3d",
13
+ "threejs",
14
+ "trees",
15
+ "deck.gl"
16
+ ],
17
+ "type": "module",
18
+ "sideEffects": false,
19
+ "types": "./dist/index.d.ts",
20
+ "main": "./dist/index.cjs",
21
+ "module": "./dist/index.js",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "require": "./dist/index.cjs",
26
+ "import": "./dist/index.js"
27
+ }
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "src"
32
+ ],
33
+ "scripts": {
34
+ "test": "vitest run",
35
+ "test-watch": "vitest"
36
+ },
37
+ "dependencies": {
38
+ "@deck.gl/core": "~9.2.8",
39
+ "@deck.gl/mesh-layers": "~9.2.8",
40
+ "three": "^0.170.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/three": "^0.170.0"
44
+ },
45
+ "gitHead": "c6b0f45b1e7f9916c1b79a43c39b839a8096c163"
46
+ }
package/src/index.ts ADDED
@@ -0,0 +1,6 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ export type {TreeLayerProps, TreeType, Season} from './tree-layer/tree-layer';
6
+ export {TreeLayer} from './tree-layer/tree-layer';