@deck.gl-community/three 9.2.5 → 9.2.8
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/README.md +127 -13
- package/dist/index.cjs +249 -33
- package/dist/index.cjs.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/tree-layer/tree-geometry.d.ts +19 -2
- package/dist/tree-layer/tree-geometry.d.ts.map +1 -1
- package/dist/tree-layer/tree-geometry.js +109 -18
- package/dist/tree-layer/tree-geometry.js.map +1 -1
- package/dist/tree-layer/tree-layer.d.ts +58 -4
- package/dist/tree-layer/tree-layer.d.ts.map +1 -1
- package/dist/tree-layer/tree-layer.js +231 -28
- package/dist/tree-layer/tree-layer.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +1 -1
- package/src/tree-layer/tree-geometry.ts +119 -18
- package/src/tree-layer/tree-layer.ts +351 -28
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
import { CompositeLayer } from '@deck.gl/core';
|
|
5
5
|
import { SimpleMeshLayer } from '@deck.gl/mesh-layers';
|
|
6
|
-
import { createTrunkMesh, createPineCanopyMesh, createOakCanopyMesh, createPalmCanopyMesh, createBirchCanopyMesh, createCherryCanopyMesh } from "./tree-geometry.js";
|
|
6
|
+
import { createTrunkMesh, createPineCanopyMesh, createOakCanopyMesh, createPalmCanopyMesh, createBirchCanopyMesh, createCherryCanopyMesh, createCropMesh } from "./tree-geometry.js";
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
// Default colours
|
|
9
9
|
// ---------------------------------------------------------------------------
|
|
@@ -59,7 +59,110 @@ const CANOPY_MESHES = {
|
|
|
59
59
|
birch: createBirchCanopyMesh(),
|
|
60
60
|
cherry: createCherryCanopyMesh()
|
|
61
61
|
};
|
|
62
|
+
const CROP_MESH = createCropMesh();
|
|
62
63
|
const ALL_TREE_TYPES = ['pine', 'oak', 'palm', 'birch', 'cherry'];
|
|
64
|
+
/**
|
|
65
|
+
* Fraction of canopy height by which the canopy mesh is lowered into the trunk.
|
|
66
|
+
* Hides the trunk-top disk that would otherwise peek above the canopy base.
|
|
67
|
+
* 0.22 means the canopy base sits 22% of canopy-height below the trunk top.
|
|
68
|
+
*/
|
|
69
|
+
const CANOPY_TRUNK_OVERLAP = 0.22;
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
// Crop helpers
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
/** splitmix32 — fast, high-quality seeded PRNG returning values in [0, 1). */
|
|
74
|
+
function createRng(seed) {
|
|
75
|
+
let s = seed >>> 0;
|
|
76
|
+
return () => {
|
|
77
|
+
s = (s + 0x9e3779b9) | 0;
|
|
78
|
+
let t = s ^ (s >>> 16);
|
|
79
|
+
t = Math.imul(t, 0x21f0aaad);
|
|
80
|
+
t ^= t >>> 15;
|
|
81
|
+
t = Math.imul(t, 0x735a2d97);
|
|
82
|
+
return ((t ^ (t >>> 15)) >>> 0) / 4294967296;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** Deterministic integer seed derived from a geographic position. */
|
|
86
|
+
function positionSeed(lng, lat) {
|
|
87
|
+
return ((Math.round(lng * 10000) * 92821) ^ (Math.round(lat * 10000) * 65537)) >>> 0;
|
|
88
|
+
}
|
|
89
|
+
const DEG_PER_METER_LAT = 1 / 111320;
|
|
90
|
+
function lngDegreesPerMeter(latDeg) {
|
|
91
|
+
return 1 / (111320 * Math.cos((latDeg * Math.PI) / 180));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Expand live crop positions so they straddle the canopy surface.
|
|
95
|
+
*
|
|
96
|
+
* The canopy mesh is a SphereGeometry(0.5, …) which, after SimpleMeshLayer
|
|
97
|
+
* applies getScale = [r, r, H], has a true XY radius of 0.5 * r and a true
|
|
98
|
+
* Z half-height of 0.5 * H. Crops are placed at 85–110 % of those real
|
|
99
|
+
* dimensions so most of each sphere sits just outside the canopy surface.
|
|
100
|
+
*
|
|
101
|
+
* Positions are seeded from the tree's geographic coordinates so they are
|
|
102
|
+
* stable across re-renders.
|
|
103
|
+
*/
|
|
104
|
+
function expandLiveCropPoints(opts) {
|
|
105
|
+
const { lng, lat, elevation, height, trunkFraction, canopyRadius, cropConfig, out } = opts;
|
|
106
|
+
if (cropConfig.count <= 0)
|
|
107
|
+
return;
|
|
108
|
+
// Actual canopy sphere radii after SimpleMeshLayer scaling.
|
|
109
|
+
// SphereGeometry has unit radius 0.5, so world radius = 0.5 * getScale component.
|
|
110
|
+
const rxy = canopyRadius * 0.5;
|
|
111
|
+
const canopyH = height * (1 - trunkFraction);
|
|
112
|
+
const rz = canopyH * 0.5;
|
|
113
|
+
// Canopy position is lowered by CANOPY_TRUNK_OVERLAP to hide the trunk-top disk
|
|
114
|
+
const canopyCenterZ = elevation + height * trunkFraction - canopyH * CANOPY_TRUNK_OVERLAP + rz;
|
|
115
|
+
const dLng = lngDegreesPerMeter(lat);
|
|
116
|
+
const rng = createRng(positionSeed(lng, lat));
|
|
117
|
+
for (let i = 0; i < cropConfig.count; i++) {
|
|
118
|
+
const theta = rng() * Math.PI * 2;
|
|
119
|
+
// Exclude top and bottom caps so crops never crown the canopy or hang below.
|
|
120
|
+
// cos(phi) in [-0.80, 0.80] → phi from ~37° to ~143° (equatorial band).
|
|
121
|
+
const cosPhi = -0.8 + rng() * 1.6;
|
|
122
|
+
const sinPhi = Math.sqrt(Math.max(0, 1 - cosPhi * cosPhi));
|
|
123
|
+
// 90–102 % of canopy radius: crops sit just at/inside the surface, tips barely poke out
|
|
124
|
+
const radFrac = 0.9 + rng() * 0.12;
|
|
125
|
+
const dx = rxy * radFrac * sinPhi * Math.cos(theta);
|
|
126
|
+
const dy = rxy * radFrac * sinPhi * Math.sin(theta);
|
|
127
|
+
const dz = rz * radFrac * cosPhi;
|
|
128
|
+
out.push({
|
|
129
|
+
position: [lng + dx * dLng, lat + dy * DEG_PER_METER_LAT, canopyCenterZ + dz],
|
|
130
|
+
color: cropConfig.color,
|
|
131
|
+
scale: cropConfig.radius
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Expand dropped crop positions uniformly across the ground disk within the
|
|
137
|
+
* canopy footprint. Uses a separate seed offset from live crops so that
|
|
138
|
+
* changing `count` does not affect dropped positions.
|
|
139
|
+
*/
|
|
140
|
+
function expandDroppedCropPoints(opts) {
|
|
141
|
+
const { lng, lat, elevation, canopyRadius, cropConfig, out } = opts;
|
|
142
|
+
const droppedCount = cropConfig.droppedCount ?? 0;
|
|
143
|
+
if (droppedCount <= 0)
|
|
144
|
+
return;
|
|
145
|
+
// Actual canopy footprint radius (see note in expandLiveCropPoints)
|
|
146
|
+
const footprintRadius = canopyRadius * 0.5;
|
|
147
|
+
const dLng = lngDegreesPerMeter(lat);
|
|
148
|
+
// XOR with a constant so the dropped sequence is independent of the live one
|
|
149
|
+
const rng = createRng(positionSeed(lng, lat) ^ 0x1a2b3c4d);
|
|
150
|
+
// Dropped crops are semi-transparent so they read as fallen/decaying
|
|
151
|
+
const c = cropConfig.color;
|
|
152
|
+
const droppedColor = [c[0], c[1], c[2], Math.round((c[3] ?? 255) * 0.45)];
|
|
153
|
+
for (let i = 0; i < droppedCount; i++) {
|
|
154
|
+
const theta = rng() * Math.PI * 2;
|
|
155
|
+
// sqrt for uniform-area disk sampling
|
|
156
|
+
const dist = Math.sqrt(rng()) * footprintRadius;
|
|
157
|
+
const dx = dist * Math.cos(theta);
|
|
158
|
+
const dy = dist * Math.sin(theta);
|
|
159
|
+
out.push({
|
|
160
|
+
position: [lng + dx * dLng, lat + dy * DEG_PER_METER_LAT, elevation + 0.05],
|
|
161
|
+
color: droppedColor,
|
|
162
|
+
scale: cropConfig.radius
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
63
166
|
const defaultProps = {
|
|
64
167
|
getPosition: { type: 'accessor', value: (d) => d.position },
|
|
65
168
|
getElevation: { type: 'accessor', value: (_d) => 0 },
|
|
@@ -72,6 +175,7 @@ const defaultProps = {
|
|
|
72
175
|
getCanopyColor: { type: 'accessor', value: (_d) => null },
|
|
73
176
|
getSeason: { type: 'accessor', value: (_d) => 'summer' },
|
|
74
177
|
getBranchLevels: { type: 'accessor', value: (_d) => 3 },
|
|
178
|
+
getCrop: { type: 'accessor', value: (_d) => null },
|
|
75
179
|
sizeScale: { type: 'number', value: 1, min: 0 }
|
|
76
180
|
};
|
|
77
181
|
// ---------------------------------------------------------------------------
|
|
@@ -93,6 +197,7 @@ const defaultProps = {
|
|
|
93
197
|
* - Trunk and canopy radii (`getTrunkRadius`, `getCanopyRadius`)
|
|
94
198
|
* - Explicit or season-driven colours (`getTrunkColor`, `getCanopyColor`, `getSeason`)
|
|
95
199
|
* - Pine tier density (`getBranchLevels`)
|
|
200
|
+
* - Crop / fruit / flower visualisation (`getCrop`)
|
|
96
201
|
* - Global scale factor (`sizeScale`)
|
|
97
202
|
*/
|
|
98
203
|
export class TreeLayer extends CompositeLayer {
|
|
@@ -101,12 +206,14 @@ export class TreeLayer extends CompositeLayer {
|
|
|
101
206
|
initializeState() {
|
|
102
207
|
this.state = {
|
|
103
208
|
grouped: { pine: [], oak: [], palm: [], birch: [], cherry: [] },
|
|
104
|
-
pineMeshes: {}
|
|
209
|
+
pineMeshes: {},
|
|
210
|
+
liveCropPoints: [],
|
|
211
|
+
droppedCropPoints: []
|
|
105
212
|
};
|
|
106
213
|
}
|
|
107
|
-
updateState({ props, changeFlags }) {
|
|
108
|
-
if (changeFlags.dataChanged || changeFlags.updateTriggersChanged) {
|
|
109
|
-
const { data, getTreeType, getBranchLevels } = props;
|
|
214
|
+
updateState({ props, oldProps, changeFlags }) {
|
|
215
|
+
if (changeFlags.dataChanged || changeFlags.propsChanged || changeFlags.updateTriggersChanged) {
|
|
216
|
+
const { data, getTreeType, getBranchLevels, getCrop, getPosition, getElevation, getHeight, getTrunkHeightFraction, getCanopyRadius, sizeScale } = props;
|
|
110
217
|
const grouped = {
|
|
111
218
|
pine: [],
|
|
112
219
|
oak: [],
|
|
@@ -114,8 +221,9 @@ export class TreeLayer extends CompositeLayer {
|
|
|
114
221
|
birch: [],
|
|
115
222
|
cherry: []
|
|
116
223
|
};
|
|
117
|
-
// Build per-level pine mesh cache
|
|
118
224
|
const pineMeshes = {};
|
|
225
|
+
const liveCropPoints = [];
|
|
226
|
+
const droppedCropPoints = [];
|
|
119
227
|
for (const d of data) {
|
|
120
228
|
const type = getTreeType(d);
|
|
121
229
|
if (grouped[type])
|
|
@@ -124,36 +232,84 @@ export class TreeLayer extends CompositeLayer {
|
|
|
124
232
|
const levels = Math.max(1, Math.min(5, Math.round(getBranchLevels(d))));
|
|
125
233
|
pineMeshes[levels] ??= createPineCanopyMesh(levels);
|
|
126
234
|
}
|
|
235
|
+
const cropConfig = getCrop(d);
|
|
236
|
+
if (cropConfig) {
|
|
237
|
+
const pos = getPosition(d);
|
|
238
|
+
const lng = pos[0];
|
|
239
|
+
const lat = pos[1];
|
|
240
|
+
const elev = getElevation(d) || 0;
|
|
241
|
+
const h = getHeight(d) * sizeScale;
|
|
242
|
+
const f = getTrunkHeightFraction(d);
|
|
243
|
+
const r = getCanopyRadius(d) * sizeScale;
|
|
244
|
+
// Scale crop radius in lock-step with all other dimensions
|
|
245
|
+
const scaledCropConfig = {
|
|
246
|
+
...cropConfig,
|
|
247
|
+
radius: cropConfig.radius * sizeScale
|
|
248
|
+
};
|
|
249
|
+
expandLiveCropPoints({
|
|
250
|
+
lng,
|
|
251
|
+
lat,
|
|
252
|
+
elevation: elev,
|
|
253
|
+
height: h,
|
|
254
|
+
trunkFraction: f,
|
|
255
|
+
canopyRadius: r,
|
|
256
|
+
cropConfig: scaledCropConfig,
|
|
257
|
+
out: liveCropPoints
|
|
258
|
+
});
|
|
259
|
+
expandDroppedCropPoints({
|
|
260
|
+
lng,
|
|
261
|
+
lat,
|
|
262
|
+
elevation: elev,
|
|
263
|
+
canopyRadius: r,
|
|
264
|
+
cropConfig: scaledCropConfig,
|
|
265
|
+
out: droppedCropPoints
|
|
266
|
+
});
|
|
267
|
+
}
|
|
127
268
|
}
|
|
128
|
-
this.setState({ grouped, pineMeshes });
|
|
269
|
+
this.setState({ grouped, pineMeshes, liveCropPoints, droppedCropPoints });
|
|
129
270
|
}
|
|
130
271
|
}
|
|
131
|
-
/**
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
mesh = pineMeshes[Number(firstLevel)];
|
|
140
|
-
}
|
|
272
|
+
/**
|
|
273
|
+
* Build a single canopy sub-layer.
|
|
274
|
+
*
|
|
275
|
+
* Takes explicit `mesh`, `data`, and `layerId` so that pine trees can be
|
|
276
|
+
* split into one sub-layer per level count (each with its own mesh).
|
|
277
|
+
*/
|
|
278
|
+
_buildCanopyLayer(type, mesh, data, layerId) {
|
|
279
|
+
const { getPosition, getElevation, getHeight, getTrunkHeightFraction, getCanopyRadius, getCanopyColor, getSeason, sizeScale } = this.props;
|
|
141
280
|
return new SimpleMeshLayer(this.getSubLayerProps({
|
|
142
|
-
id:
|
|
143
|
-
data
|
|
281
|
+
id: layerId,
|
|
282
|
+
data,
|
|
144
283
|
mesh,
|
|
145
284
|
getPosition: (d) => {
|
|
146
285
|
const pos = getPosition(d);
|
|
147
286
|
const elevation = getElevation(d) || 0;
|
|
148
287
|
const h = getHeight(d) * sizeScale;
|
|
149
288
|
const f = getTrunkHeightFraction(d);
|
|
150
|
-
|
|
289
|
+
const canopyH = h * (1 - f);
|
|
290
|
+
return [pos[0], pos[1], elevation + h * f - canopyH * CANOPY_TRUNK_OVERLAP];
|
|
151
291
|
},
|
|
152
292
|
getScale: (d) => {
|
|
293
|
+
const pos = getPosition(d);
|
|
153
294
|
const h = getHeight(d) * sizeScale;
|
|
154
295
|
const f = getTrunkHeightFraction(d);
|
|
155
296
|
const r = getCanopyRadius(d) * sizeScale;
|
|
156
|
-
|
|
297
|
+
// Per-tree asymmetric XY scale from position hash — no two canopies
|
|
298
|
+
// are the same oval, giving organic variety with zero extra draw calls.
|
|
299
|
+
const seed = positionSeed(pos[0], pos[1]);
|
|
300
|
+
const sx = 1 + ((seed & 0xffff) / 65535 - 0.5) * 0.3;
|
|
301
|
+
const sy = 1 + (((seed >>> 16) & 0xffff) / 65535 - 0.5) * 0.3;
|
|
302
|
+
return [r * sx, r * sy, h * (1 - f)];
|
|
303
|
+
},
|
|
304
|
+
getOrientation: (d) => {
|
|
305
|
+
// Random bearing per tree: yaw (index 1) rotates around the vertical
|
|
306
|
+
// Z axis in deck.gl's [pitch, yaw, roll] convention.
|
|
307
|
+
// Pine tiers face different compass directions; bumpy canopies present
|
|
308
|
+
// a unique silhouette from every viewing angle.
|
|
309
|
+
const pos = getPosition(d);
|
|
310
|
+
const seed = positionSeed(pos[0], pos[1]);
|
|
311
|
+
const angle = (((seed ^ (seed >>> 13)) & 0xffff) / 65535) * 360;
|
|
312
|
+
return [0, angle, 0];
|
|
157
313
|
},
|
|
158
314
|
getColor: (d) => {
|
|
159
315
|
const explicit = getCanopyColor(d);
|
|
@@ -163,12 +319,17 @@ export class TreeLayer extends CompositeLayer {
|
|
|
163
319
|
return DEFAULT_CANOPY_COLORS[type][season];
|
|
164
320
|
},
|
|
165
321
|
pickable: this.props.pickable,
|
|
166
|
-
material: { ambient: 0.
|
|
322
|
+
material: { ambient: 0.55, diffuse: 0.55, shininess: 0 },
|
|
323
|
+
updateTriggers: {
|
|
324
|
+
getPosition: sizeScale,
|
|
325
|
+
getScale: sizeScale,
|
|
326
|
+
getOrientation: sizeScale
|
|
327
|
+
}
|
|
167
328
|
}));
|
|
168
329
|
}
|
|
169
330
|
renderLayers() {
|
|
170
|
-
const { getPosition, getElevation, getTreeType, getHeight, getTrunkHeightFraction, getTrunkRadius, getTrunkColor, sizeScale } = this.props;
|
|
171
|
-
const { grouped } = this.state;
|
|
331
|
+
const { getPosition, getElevation, getTreeType, getHeight, getTrunkHeightFraction, getTrunkRadius, getTrunkColor, getBranchLevels, sizeScale } = this.props;
|
|
332
|
+
const { grouped, pineMeshes, liveCropPoints, droppedCropPoints } = this.state;
|
|
172
333
|
// -----------------------------------------------------------------------
|
|
173
334
|
// 1. Trunk layer — one layer for ALL tree types, shared cylinder geometry
|
|
174
335
|
// -----------------------------------------------------------------------
|
|
@@ -194,13 +355,55 @@ export class TreeLayer extends CompositeLayer {
|
|
|
194
355
|
return DEFAULT_TRUNK_COLORS[type] ?? DEFAULT_TRUNK_COLORS.pine;
|
|
195
356
|
},
|
|
196
357
|
pickable: this.props.pickable,
|
|
197
|
-
material: { ambient: 0.
|
|
358
|
+
material: { ambient: 0.45, diffuse: 0.55, shininess: 4 },
|
|
359
|
+
updateTriggers: { getScale: sizeScale }
|
|
198
360
|
}));
|
|
199
361
|
// -----------------------------------------------------------------------
|
|
200
|
-
// 2. Canopy layers
|
|
362
|
+
// 2. Canopy layers
|
|
363
|
+
// Non-pine: one sub-layer per species.
|
|
364
|
+
// Pine: one sub-layer per branch-level count, each using its own mesh,
|
|
365
|
+
// so trees with 2/3/4 tiers never share a mismatched mesh.
|
|
366
|
+
// -----------------------------------------------------------------------
|
|
367
|
+
const nonPineCanopies = ALL_TREE_TYPES.filter((t) => t !== 'pine' && grouped[t].length > 0).map((t) => this._buildCanopyLayer(t, CANOPY_MESHES[t], grouped[t], `canopy-${t}`));
|
|
368
|
+
const pineCanopies = Object.entries(pineMeshes).flatMap(([levelStr, mesh]) => {
|
|
369
|
+
const levels = Number(levelStr);
|
|
370
|
+
const pineData = grouped.pine.filter(
|
|
371
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
372
|
+
(d) => Math.max(1, Math.min(5, Math.round(getBranchLevels(d)))) === levels);
|
|
373
|
+
return pineData.length > 0
|
|
374
|
+
? [this._buildCanopyLayer('pine', mesh, pineData, `canopy-pine-${levels}`)]
|
|
375
|
+
: [];
|
|
376
|
+
});
|
|
377
|
+
const canopyLayers = [...nonPineCanopies, ...pineCanopies];
|
|
201
378
|
// -----------------------------------------------------------------------
|
|
202
|
-
|
|
203
|
-
|
|
379
|
+
// 3. Crop layers — live (in canopy) and dropped (on ground)
|
|
380
|
+
// -----------------------------------------------------------------------
|
|
381
|
+
const cropLayers = [];
|
|
382
|
+
if (liveCropPoints.length > 0) {
|
|
383
|
+
cropLayers.push(new SimpleMeshLayer(this.getSubLayerProps({
|
|
384
|
+
id: 'live-crops',
|
|
385
|
+
data: liveCropPoints,
|
|
386
|
+
mesh: CROP_MESH,
|
|
387
|
+
getPosition: (d) => d.position,
|
|
388
|
+
getScale: (d) => [d.scale, d.scale, d.scale],
|
|
389
|
+
getColor: (d) => d.color,
|
|
390
|
+
pickable: false,
|
|
391
|
+
material: { ambient: 0.5, diffuse: 0.8, shininess: 40 }
|
|
392
|
+
})));
|
|
393
|
+
}
|
|
394
|
+
if (droppedCropPoints.length > 0) {
|
|
395
|
+
cropLayers.push(new SimpleMeshLayer(this.getSubLayerProps({
|
|
396
|
+
id: 'dropped-crops',
|
|
397
|
+
data: droppedCropPoints,
|
|
398
|
+
mesh: CROP_MESH,
|
|
399
|
+
getPosition: (d) => d.position,
|
|
400
|
+
getScale: (d) => [d.scale, d.scale, d.scale],
|
|
401
|
+
getColor: (d) => d.color,
|
|
402
|
+
pickable: false,
|
|
403
|
+
material: { ambient: 0.6, diffuse: 0.5, shininess: 10 }
|
|
404
|
+
})));
|
|
405
|
+
}
|
|
406
|
+
return [trunkLayer, ...canopyLayers, ...cropLayers];
|
|
204
407
|
}
|
|
205
408
|
}
|
|
206
409
|
//# sourceMappingURL=tree-layer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-layer.js","sourceRoot":"","sources":["../../src/tree-layer/tree-layer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tree-layer.js","sourceRoot":"","sources":["../../src/tree-layer/tree-layer.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACf,2BAAwB;AAqCzB,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,wDAAwD;AACxD,MAAM,oBAAoB,GAA4B;IACpD,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IACvB,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IACtB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;IACzB,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,wBAAwB;IACrD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;CAC3B,CAAC;AAEF,mEAAmE;AACnE,MAAM,qBAAqB,GAA4C;IACrE,IAAI,EAAE;QACJ,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;QACvB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,+BAA+B;QACxD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;KACxB;IACD,GAAG,EAAE;QACH,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QAC3B,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,2BAA2B;KACvD;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;KAC3B;IACD,KAAK,EAAE;QACL,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAC5B,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QAC3B,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,YAAY;KACzC;IACD,MAAM,EAAE;QACN,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,eAAe;QAC7C,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,OAAO;KACnC;CACF,CAAC;AAEF,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAE9E,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC;AAErC,MAAM,aAAa,GAAyD;IAC1E,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC7B,GAAG,EAAE,mBAAmB,EAAE;IAC1B,IAAI,EAAE,oBAAoB,EAAE;IAC5B,KAAK,EAAE,qBAAqB,EAAE;IAC9B,MAAM,EAAE,sBAAsB,EAAE;CACjC,CAAC;AAEF,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;AAEnC,MAAM,cAAc,GAAe,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAE9E;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAElC,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,8EAA8E;AAC9E,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;IACnB,OAAO,GAAW,EAAE;QAClB,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACvB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC7B,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC7B,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,SAAS,YAAY,CAAC,GAAW,EAAE,GAAW;IAC5C,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC;AAErC,SAAS,kBAAkB,CAAC,MAAc;IACxC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AASD;;;;;;;;;;GAUG;AACH,SAAS,oBAAoB,CAAC,IAS7B;IACC,MAAM,EAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAC,GAAG,IAAI,CAAC;IACzF,IAAI,UAAU,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO;IAElC,4DAA4D;IAC5D,kFAAkF;IAClF,MAAM,GAAG,GAAG,YAAY,GAAG,GAAG,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,OAAO,GAAG,GAAG,CAAC;IACzB,gFAAgF;IAChF,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,oBAAoB,GAAG,EAAE,CAAC;IAE/F,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAClC,6EAA6E;QAC7E,wEAAwE;QACxE,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;QAC3D,wFAAwF;QACxF,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;QAEnC,MAAM,EAAE,GAAG,GAAG,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,GAAG,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC;QAEjC,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,iBAAiB,EAAE,aAAa,GAAG,EAAE,CAAC;YAC7E,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,KAAK,EAAE,UAAU,CAAC,MAAM;SACzB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,IAOhC;IACC,MAAM,EAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAC,GAAG,IAAI,CAAC;IAClE,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,IAAI,CAAC,CAAC;IAClD,IAAI,YAAY,IAAI,CAAC;QAAE,OAAO;IAE9B,oEAAoE;IACpE,MAAM,eAAe,GAAG,YAAY,GAAG,GAAG,CAAC;IAC3C,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,6EAA6E;IAC7E,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;IAE3D,qEAAqE;IACrE,MAAM,CAAC,GAAG,UAAU,CAAC,KAAiB,CAAC;IACvC,MAAM,YAAY,GAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAU,CAAC;IAE1F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAClC,sCAAsC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC;QAEhD,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAElC,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,iBAAiB,EAAE,SAAS,GAAG,IAAI,CAAC;YAC3E,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,UAAU,CAAC,MAAM;SACzB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAwGD,MAAM,YAAY,GAA0C;IAC1D,WAAW,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAC;IAC9D,YAAY,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,CAAC,EAAC;IACvD,WAAW,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,MAAkB,EAAC;IACvE,SAAS,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,EAAC;IACrD,sBAAsB,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,IAAI,EAAC;IACpE,cAAc,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,GAAG,EAAC;IAC3D,eAAe,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,CAAC,EAAC;IAC1D,aAAa,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,IAAI,EAAC;IAC3D,cAAc,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,IAAI,EAAC;IAC5D,SAAS,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,QAAkB,EAAC;IACrE,eAAe,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,CAAC,EAAC;IAC1D,OAAO,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,IAAI,EAAC;IACrD,SAAS,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC;CAC9C,CAAC;AAaF,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,SAAwD,SAAQ,cAE5E;IACC,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC;IAC/B,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;IAInC,eAAe;QACb,IAAI,CAAC,KAAK,GAAG;YACX,OAAO,EAAE,EAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAC;YAC7D,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;YAClB,iBAAiB,EAAE,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAC;QACxC,IAAI,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,qBAAqB,EAAE,CAAC;YAC7F,MAAM,EACJ,IAAI,EACJ,WAAW,EACX,eAAe,EACf,OAAO,EACP,WAAW,EACX,YAAY,EACZ,SAAS,EACT,sBAAsB,EACtB,eAAe,EACf,SAAS,EACV,GAAG,KAAK,CAAC;YAEV,MAAM,OAAO,GAA8B;gBACzC,IAAI,EAAE,EAAE;gBACR,GAAG,EAAE,EAAE;gBACP,IAAI,EAAE,EAAE;gBACR,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,EAAE;aACX,CAAC;YAEF,MAAM,UAAU,GAA4D,EAAE,CAAC;YAC/E,MAAM,cAAc,GAAgB,EAAE,CAAC;YACvC,MAAM,iBAAiB,GAAgB,EAAE,CAAC;YAE1C,KAAK,MAAM,CAAC,IAAI,IAAe,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAa,CAAC;gBACxC,IAAI,OAAO,CAAC,IAAI,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAEzC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;oBACpB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC;oBAClF,UAAU,CAAC,MAAM,CAAC,KAAK,oBAAoB,CAAC,MAAM,CAAC,CAAC;gBACtD,CAAC;gBAED,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;oBAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;oBACnB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;oBACnB,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAClC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;oBACnC,MAAM,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;oBACpC,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;oBAEzC,2DAA2D;oBAC3D,MAAM,gBAAgB,GAAe;wBACnC,GAAG,UAAU;wBACb,MAAM,EAAE,UAAU,CAAC,MAAM,GAAG,SAAS;qBACtC,CAAC;oBACF,oBAAoB,CAAC;wBACnB,GAAG;wBACH,GAAG;wBACH,SAAS,EAAE,IAAI;wBACf,MAAM,EAAE,CAAC;wBACT,aAAa,EAAE,CAAC;wBAChB,YAAY,EAAE,CAAC;wBACf,UAAU,EAAE,gBAAgB;wBAC5B,GAAG,EAAE,cAAc;qBACpB,CAAC,CAAC;oBACH,uBAAuB,CAAC;wBACtB,GAAG;wBACH,GAAG;wBACH,SAAS,EAAE,IAAI;wBACf,YAAY,EAAE,CAAC;wBACf,UAAU,EAAE,gBAAgB;wBAC5B,GAAG,EAAE,iBAAiB;qBACvB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAC,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,iBAAiB,CACvB,IAAc,EACd,IAAwC,EACxC,IAAe,EACf,OAAe;QAEf,MAAM,EACJ,WAAW,EACX,YAAY,EACZ,SAAS,EACT,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,SAAS,EACT,SAAS,EACV,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,OAAO,IAAI,eAAe,CACxB,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,OAAO;YACX,IAAI;YACJ,IAAI;YACJ,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;gBACjB,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACvC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACnC,MAAM,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;gBACpC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,oBAAoB,CAAC,CAAC;YAC9E,CAAC;YACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACnC,MAAM,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;gBACpC,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACzC,oEAAoE;gBACpE,wEAAwE;gBACxE,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1C,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;gBACrD,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;gBAC9D,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;gBACpB,qEAAqE;gBACrE,qDAAqD;gBACrD,uEAAuE;gBACvE,gDAAgD;gBAChD,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;gBAChE,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvB,CAAC;YACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBACnC,IAAI,QAAQ;oBAAE,OAAO,QAAQ,CAAC;gBAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;gBACxC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;YAC7C,CAAC;YACD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC7B,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAC;YACtD,cAAc,EAAE;gBACd,WAAW,EAAE,SAAS;gBACtB,QAAQ,EAAE,SAAS;gBACnB,cAAc,EAAE,SAAS;aAC1B;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,YAAY;QACV,MAAM,EACJ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,SAAS,EACT,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,eAAe,EACf,SAAS,EACV,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,MAAM,EAAC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAE5E,0EAA0E;QAC1E,0EAA0E;QAC1E,0EAA0E;QAC1E,MAAM,UAAU,GAAG,IAAI,eAAe,CACpC,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;gBACjB,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,CAAC;YACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACnC,MAAM,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;gBACpC,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACxC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,CAAC;YACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,QAAQ;oBAAE,OAAO,QAAQ,CAAC;gBAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;gBACtC,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC;YACjE,CAAC;YACD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC7B,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAC;YACtD,cAAc,EAAE,EAAC,QAAQ,EAAE,SAAS,EAAC;SACtC,CAAC,CACH,CAAC;QAEF,0EAA0E;QAC1E,mBAAmB;QACnB,0CAA0C;QAC1C,0EAA0E;QAC1E,8DAA8D;QAC9D,0EAA0E;QAC1E,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAC7F,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,CAC9E,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;YAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM;YAClC,8DAA8D;YAC9D,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAClF,CAAC;YACF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACxB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,MAAM,EAAE,CAAC,CAAC;gBAC3E,CAAC,CAAC,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,YAAY,CAAC,CAAC;QAE3D,0EAA0E;QAC1E,4DAA4D;QAC5D,0EAA0E;QAC1E,MAAM,UAAU,GAAG,EAAE,CAAC;QAEtB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CACb,IAAI,eAAe,CACjB,IAAI,CAAC,gBAAgB,CAAC;gBACpB,EAAE,EAAE,YAAY;gBAChB,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ;gBACzC,QAAQ,EAAE,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;gBACvD,QAAQ,EAAE,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK;gBACnC,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,EAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAC;aACtD,CAAC,CACH,CACF,CAAC;QACJ,CAAC;QAED,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,UAAU,CAAC,IAAI,CACb,IAAI,eAAe,CACjB,IAAI,CAAC,gBAAgB,CAAC;gBACpB,EAAE,EAAE,eAAe;gBACnB,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ;gBACzC,QAAQ,EAAE,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;gBACvD,QAAQ,EAAE,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK;gBACnC,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,EAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAC;aACtD,CAAC,CACH,CACF,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,UAAU,EAAE,GAAG,YAAY,EAAE,GAAG,UAAU,CAAC,CAAC;IACtD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deck.gl-community/three",
|
|
3
|
-
"version": "9.2.
|
|
3
|
+
"version": "9.2.8",
|
|
4
4
|
"description": "Three.js-powered layers for deck.gl",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -42,5 +42,5 @@
|
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/three": "^0.170.0"
|
|
44
44
|
},
|
|
45
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "9cb179aa3d1707f32116034150ab7130ce88b18c"
|
|
46
46
|
}
|
package/src/index.ts
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
-
export type {TreeLayerProps, TreeType, Season} from './tree-layer/tree-layer';
|
|
5
|
+
export type {TreeLayerProps, TreeType, Season, CropConfig} from './tree-layer/tree-layer';
|
|
6
6
|
export {TreeLayer} from './tree-layer/tree-layer';
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
CylinderGeometry,
|
|
9
9
|
ConeGeometry,
|
|
10
10
|
SphereGeometry,
|
|
11
|
+
IcosahedronGeometry,
|
|
11
12
|
Matrix4
|
|
12
13
|
} from 'three';
|
|
13
14
|
|
|
@@ -31,6 +32,57 @@ export type TreeMesh = {
|
|
|
31
32
|
*/
|
|
32
33
|
const Y_TO_Z_UP = new Matrix4().makeRotationX(-Math.PI / 2);
|
|
33
34
|
|
|
35
|
+
/**
|
|
36
|
+
* Perturb each vertex radially using a sum of low-frequency sinusoidal waves
|
|
37
|
+
* evaluated at the vertex's surface direction. Adjacent vertices receive
|
|
38
|
+
* smoothly-varying displacements so there are no gaps or cracks in the mesh.
|
|
39
|
+
* Applied once at module init — zero runtime cost.
|
|
40
|
+
*
|
|
41
|
+
* @param geo Three.js BufferGeometry to modify in-place (before Y_TO_Z_UP rotation)
|
|
42
|
+
* @param magnitude Fractional displacement amplitude, e.g. 0.15 = ±15 % of radius
|
|
43
|
+
* @param seed Integer seed — each species gets a distinct blob shape
|
|
44
|
+
*/
|
|
45
|
+
function jitterSmooth(geo: BufferGeometry, magnitude: number, seed: number): void {
|
|
46
|
+
let s = seed >>> 0;
|
|
47
|
+
const rng = () => {
|
|
48
|
+
s = (s + 0x9e3779b9) | 0;
|
|
49
|
+
let t = s ^ (s >>> 16);
|
|
50
|
+
t = Math.imul(t, 0x21f0aaad);
|
|
51
|
+
t ^= t >>> 15;
|
|
52
|
+
t = Math.imul(t, 0x735a2d97);
|
|
53
|
+
return ((t ^ (t >>> 15)) >>> 0) / 4294967296;
|
|
54
|
+
};
|
|
55
|
+
// 4 low-frequency waves (2–5 bumps across the sphere) — smooth, no cracks
|
|
56
|
+
const waves = Array.from({length: 4}, () => ({
|
|
57
|
+
fx: 2 + rng() * 3,
|
|
58
|
+
fy: 2 + rng() * 3,
|
|
59
|
+
fz: 2 + rng() * 3,
|
|
60
|
+
phase: rng() * Math.PI * 2
|
|
61
|
+
}));
|
|
62
|
+
|
|
63
|
+
const pos = geo.attributes.position.array as Float32Array;
|
|
64
|
+
for (let i = 0; i < pos.length; i += 3) {
|
|
65
|
+
const x = pos[i];
|
|
66
|
+
const y = pos[i + 1];
|
|
67
|
+
const z = pos[i + 2];
|
|
68
|
+
const r = Math.sqrt(x * x + y * y + z * z);
|
|
69
|
+
if (r !== 0) {
|
|
70
|
+
const nx = x / r;
|
|
71
|
+
const ny = y / r;
|
|
72
|
+
const nz = z / r;
|
|
73
|
+
let noise = 0;
|
|
74
|
+
for (const w of waves) {
|
|
75
|
+
noise += Math.sin(nx * w.fx + ny * w.fy + nz * w.fz + w.phase);
|
|
76
|
+
}
|
|
77
|
+
noise /= 4; // normalise to ~ [-1, 1]
|
|
78
|
+
const scale = 1 + noise * magnitude;
|
|
79
|
+
pos[i] = x * scale;
|
|
80
|
+
pos[i + 1] = y * scale;
|
|
81
|
+
pos[i + 2] = z * scale;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
34
86
|
/**
|
|
35
87
|
* Extract a TreeMesh from a Three.js BufferGeometry.
|
|
36
88
|
* Assumes the geometry has already been rotated to Z-up.
|
|
@@ -124,43 +176,77 @@ export function createTrunkMesh(segments = 8): TreeMesh {
|
|
|
124
176
|
*/
|
|
125
177
|
export function createPineCanopyMesh(levels = 3, segments = 8): TreeMesh {
|
|
126
178
|
const geos: BufferGeometry[] = [];
|
|
127
|
-
const tierHeight = 0.55 / levels;
|
|
128
179
|
|
|
180
|
+
// Deterministic per-levels RNG so each level count gets its own organic shape.
|
|
181
|
+
let s = (levels * 2654435761) >>> 0;
|
|
182
|
+
const rng = () => {
|
|
183
|
+
s = (s + 0x9e3779b9) | 0;
|
|
184
|
+
let t = s ^ (s >>> 16);
|
|
185
|
+
t = Math.imul(t, 0x21f0aaad);
|
|
186
|
+
t ^= t >>> 15;
|
|
187
|
+
t = Math.imul(t, 0x735a2d97);
|
|
188
|
+
return ((t ^ (t >>> 15)) >>> 0) / 4294967296;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
// Base tier height for 50 % overlap filling z = 0..0.8.
|
|
192
|
+
const tierHeight = 1.6 / (levels + 1);
|
|
193
|
+
const step = tierHeight / 2;
|
|
194
|
+
|
|
195
|
+
let zCursor = 0;
|
|
129
196
|
for (let i = 0; i < levels; i++) {
|
|
130
197
|
const t = i / (levels - 1 || 1);
|
|
131
|
-
// Bottom tiers are wider, top tiers are narrower
|
|
132
|
-
const radius = (1 - t * 0.5) * 0.85;
|
|
133
|
-
// Tiers are staggered: each one starts 60% up the previous tier
|
|
134
|
-
const zBase = t * (1 - tierHeight * 1.2);
|
|
135
198
|
|
|
136
|
-
|
|
199
|
+
// Width narrows toward the top; each tier gets ±20 % random variation.
|
|
200
|
+
const baseRadius = (1 - t * 0.5) * 0.85;
|
|
201
|
+
const radius = baseRadius * (0.8 + rng() * 0.4);
|
|
202
|
+
|
|
203
|
+
// Height varies ±15 % per tier for uneven silhouette.
|
|
204
|
+
const tierH = tierHeight * (0.85 + rng() * 0.3);
|
|
205
|
+
|
|
206
|
+
const cone = new ConeGeometry(radius, tierH, segments);
|
|
137
207
|
cone.applyMatrix4(Y_TO_Z_UP);
|
|
138
|
-
|
|
139
|
-
//
|
|
140
|
-
|
|
208
|
+
|
|
209
|
+
// Drift increases from 0 at the bottom tier to ±0.10 at the top tier.
|
|
210
|
+
// Bottom tier stays centred so it always connects cleanly to the trunk.
|
|
211
|
+
const driftScale = levels > 1 ? i / (levels - 1) : 0;
|
|
212
|
+
const driftX = (rng() - 0.5) * 0.2 * driftScale;
|
|
213
|
+
const driftY = (rng() - 0.5) * 0.2 * driftScale;
|
|
214
|
+
cone.translate(driftX, driftY, zCursor + tierH / 2);
|
|
141
215
|
geos.push(cone);
|
|
216
|
+
|
|
217
|
+
zCursor += step;
|
|
142
218
|
}
|
|
143
219
|
|
|
144
|
-
//
|
|
145
|
-
const tip = new ConeGeometry(0.
|
|
220
|
+
// Slender tip with slight lean.
|
|
221
|
+
const tip = new ConeGeometry(0.08, 0.22, 6);
|
|
146
222
|
tip.applyMatrix4(Y_TO_Z_UP);
|
|
147
|
-
tip.translate(0, 0,
|
|
223
|
+
tip.translate((rng() - 0.5) * 0.08, (rng() - 0.5) * 0.08, zCursor + 0.05);
|
|
148
224
|
geos.push(tip);
|
|
149
225
|
|
|
150
226
|
const merged = mergeGeometries(geos);
|
|
151
|
-
merged.computeVertexNormals();
|
|
152
227
|
return extractMesh(merged);
|
|
153
228
|
}
|
|
154
229
|
|
|
155
230
|
/**
|
|
156
|
-
* Unit oak canopy mesh:
|
|
157
|
-
*
|
|
231
|
+
* Unit oak canopy mesh: high-segment sphere, smooth pole, no shading stripe.
|
|
232
|
+
*
|
|
233
|
+
* IcosahedronGeometry (detail ≥ 1) always creates a single vertex at the
|
|
234
|
+
* sphere's north pole via subdivision (normalized midpoint of the top edge),
|
|
235
|
+
* giving 5 triangles meeting at the apex — the visible spike. Rotating the
|
|
236
|
+
* icosahedron only moves WHICH original vertex becomes the apex; all 12 base
|
|
237
|
+
* vertices are 5-connected, so the artifact persists.
|
|
238
|
+
*
|
|
239
|
+
* SphereGeometry(24, 16) places 24 tiny triangles at the pole instead of 5,
|
|
240
|
+
* which is invisible at normal viewing distances. The earlier "shading stripe"
|
|
241
|
+
* with the low-poly sphere (12 × 8 = 22.5° bands) was coarse Gouraud banding,
|
|
242
|
+
* not a UV-seam issue. At 24 × 16 (7.5° bands) the shading is smooth.
|
|
243
|
+
* Extends z = 0 (base) to z = 1 (top).
|
|
158
244
|
*/
|
|
159
245
|
export function createOakCanopyMesh(): TreeMesh {
|
|
160
|
-
const geo = new SphereGeometry(0.5,
|
|
161
|
-
|
|
246
|
+
const geo = new SphereGeometry(0.5, 14, 10);
|
|
247
|
+
jitterSmooth(geo, 0.18, 1);
|
|
162
248
|
geo.applyMatrix4(Y_TO_Z_UP);
|
|
163
|
-
geo.translate(0, 0, 0.5);
|
|
249
|
+
geo.translate(0, 0, 0.5);
|
|
164
250
|
return extractMesh(geo);
|
|
165
251
|
}
|
|
166
252
|
|
|
@@ -171,6 +257,7 @@ export function createOakCanopyMesh(): TreeMesh {
|
|
|
171
257
|
export function createPalmCanopyMesh(): TreeMesh {
|
|
172
258
|
// Flattened sphere acting as a spread crown
|
|
173
259
|
const geo = new SphereGeometry(0.7, 12, 5);
|
|
260
|
+
jitterSmooth(geo, 0.1, 4);
|
|
174
261
|
const flatten = new Matrix4().makeScale(1.4, 0.35, 1.4);
|
|
175
262
|
geo.applyMatrix4(flatten);
|
|
176
263
|
geo.applyMatrix4(Y_TO_Z_UP);
|
|
@@ -184,6 +271,7 @@ export function createPalmCanopyMesh(): TreeMesh {
|
|
|
184
271
|
*/
|
|
185
272
|
export function createBirchCanopyMesh(): TreeMesh {
|
|
186
273
|
const geo = new SphereGeometry(0.42, 10, 8);
|
|
274
|
+
jitterSmooth(geo, 0.14, 2);
|
|
187
275
|
// Elongate vertically (Z after rotation)
|
|
188
276
|
const elongate = new Matrix4().makeScale(1, 1.45, 1);
|
|
189
277
|
geo.applyMatrix4(elongate);
|
|
@@ -198,6 +286,19 @@ export function createBirchCanopyMesh(): TreeMesh {
|
|
|
198
286
|
*/
|
|
199
287
|
export function createCherryCanopyMesh(): TreeMesh {
|
|
200
288
|
const geo = new SphereGeometry(0.52, 12, 8);
|
|
289
|
+
jitterSmooth(geo, 0.2, 3);
|
|
290
|
+
geo.applyMatrix4(Y_TO_Z_UP);
|
|
291
|
+
geo.translate(0, 0, 0.5);
|
|
292
|
+
return extractMesh(geo);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Unit crop sphere mesh for rendering individual fruits, nuts, or flowers.
|
|
297
|
+
* Deliberately low-polygon (24 triangles) so hundreds of instances remain cheap.
|
|
298
|
+
* Scale uniformly via getScale = [r, r, r] to set the world-space radius in metres.
|
|
299
|
+
*/
|
|
300
|
+
export function createCropMesh(): TreeMesh {
|
|
301
|
+
const geo = new SphereGeometry(0.5, 6, 4);
|
|
201
302
|
geo.applyMatrix4(Y_TO_Z_UP);
|
|
202
303
|
geo.translate(0, 0, 0.5);
|
|
203
304
|
return extractMesh(geo);
|