@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.
@@ -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
- /** 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
- }
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: `canopy-${type}`,
143
- data: grouped[type],
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
- return [pos[0], pos[1], elevation + h * f];
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
- return [r, r, h * (1 - f)];
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.4, diffuse: 0.7, shininess: 12 }
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.35, diffuse: 0.6, shininess: 8 }
358
+ material: { ambient: 0.45, diffuse: 0.55, shininess: 4 },
359
+ updateTriggers: { getScale: sizeScale }
198
360
  }));
199
361
  // -----------------------------------------------------------------------
200
- // 2. Canopy layers — one per tree type, only for trees of that type
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
- const canopyLayers = ALL_TREE_TYPES.filter((type) => grouped[type].length > 0).map((type) => this._buildCanopyLayer(type));
203
- return [trunkLayer, ...canopyLayers];
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":"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,EACvB,2BAAwB;AAYzB,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,cAAc,GAAe,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAuF9E,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,SAAS,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC;CAC9C,CAAC;AAWF,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;GAiBG;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;SACf,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,EAAC,KAAK,EAAE,WAAW,EAAC;QAC9B,IAAI,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,qBAAqB,EAAE,CAAC;YACjE,MAAM,EAAC,IAAI,EAAE,WAAW,EAAE,eAAe,EAAC,GAAG,KAAK,CAAC;YACnD,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,kCAAkC;YAClC,MAAM,UAAU,GAA4D,EAAE,CAAC;YAE/E,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;gBACzC,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;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAC,OAAO,EAAE,UAAU,EAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,yDAAyD;IACjD,iBAAiB,CAAC,IAAc;QACtC,MAAM,EACJ,WAAW,EACX,YAAY,EACZ,SAAS,EACT,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,SAAS,EACT,SAAS,EACV,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,8BAA8B;QAC9C,MAAM,EAAC,OAAO,EAAE,UAAU,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzC,IAAI,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,UAAU;gBAAE,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,IAAI,eAAe,CACxB,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,UAAU,IAAI,EAAE;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;YACnB,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,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7C,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,eAAe,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACzC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7B,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,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAC;SACtD,CAAC,CACH,CAAC;IACJ,CAAC;IAED,YAAY;QACV,MAAM,EACJ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,SAAS,EACT,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,SAAS,EACV,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAE7B,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,GAAG,EAAE,SAAS,EAAE,CAAC,EAAC;SACtD,CAAC,CACH,CAAC;QAEF,0EAA0E;QAC1E,oEAAoE;QACpE,0EAA0E;QAC1E,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1F,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAC7B,CAAC;QAEF,OAAO,CAAC,UAAU,EAAE,GAAG,YAAY,CAAC,CAAC;IACvC,CAAC"}
1
+ {"version":3,"file":"tree-layer.js","sourceRoot":"","sources":["../../src/tree-layer/tree-layer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deck.gl-community/three",
3
- "version": "9.2.5",
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": "c6b0f45b1e7f9916c1b79a43c39b839a8096c163"
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
- const cone = new ConeGeometry(radius, tierHeight, segments);
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
- // ConeGeometry apex is at y=+height/2 -> z=+height/2 after rotation
139
- // Translate so apex points upward and base is at zBase
140
- cone.translate(0, 0, zBase + tierHeight);
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
- // Sharp tip at top
145
- const tip = new ConeGeometry(0.12, 0.18, 6);
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, 1.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: a large sphere.
157
- * Extends from z=0 to z=1, center at z=0.5.
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, 12, 8);
161
- // SphereGeometry is centered at origin, radius=0.5
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); // center at z=0.5, extends z=0 to z=1
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);