@deck.gl-community/three 9.2.5 → 9.3.0-beta.1

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,115 @@ 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 = [
153
+ c[0],
154
+ c[1],
155
+ c[2],
156
+ Math.round((c[3] ?? 255) * 0.45)
157
+ ];
158
+ for (let i = 0; i < droppedCount; i++) {
159
+ const theta = rng() * Math.PI * 2;
160
+ // sqrt for uniform-area disk sampling
161
+ const dist = Math.sqrt(rng()) * footprintRadius;
162
+ const dx = dist * Math.cos(theta);
163
+ const dy = dist * Math.sin(theta);
164
+ out.push({
165
+ position: [lng + dx * dLng, lat + dy * DEG_PER_METER_LAT, elevation + 0.05],
166
+ color: droppedColor,
167
+ scale: cropConfig.radius
168
+ });
169
+ }
170
+ }
63
171
  const defaultProps = {
64
172
  getPosition: { type: 'accessor', value: (d) => d.position },
65
173
  getElevation: { type: 'accessor', value: (_d) => 0 },
@@ -72,6 +180,7 @@ const defaultProps = {
72
180
  getCanopyColor: { type: 'accessor', value: (_d) => null },
73
181
  getSeason: { type: 'accessor', value: (_d) => 'summer' },
74
182
  getBranchLevels: { type: 'accessor', value: (_d) => 3 },
183
+ getCrop: { type: 'accessor', value: (_d) => null },
75
184
  sizeScale: { type: 'number', value: 1, min: 0 }
76
185
  };
77
186
  // ---------------------------------------------------------------------------
@@ -93,6 +202,7 @@ const defaultProps = {
93
202
  * - Trunk and canopy radii (`getTrunkRadius`, `getCanopyRadius`)
94
203
  * - Explicit or season-driven colours (`getTrunkColor`, `getCanopyColor`, `getSeason`)
95
204
  * - Pine tier density (`getBranchLevels`)
205
+ * - Crop / fruit / flower visualisation (`getCrop`)
96
206
  * - Global scale factor (`sizeScale`)
97
207
  */
98
208
  export class TreeLayer extends CompositeLayer {
@@ -101,12 +211,14 @@ export class TreeLayer extends CompositeLayer {
101
211
  initializeState() {
102
212
  this.state = {
103
213
  grouped: { pine: [], oak: [], palm: [], birch: [], cherry: [] },
104
- pineMeshes: {}
214
+ pineMeshes: {},
215
+ liveCropPoints: [],
216
+ droppedCropPoints: []
105
217
  };
106
218
  }
107
- updateState({ props, changeFlags }) {
108
- if (changeFlags.dataChanged || changeFlags.updateTriggersChanged) {
109
- const { data, getTreeType, getBranchLevels } = props;
219
+ updateState({ props, oldProps, changeFlags }) {
220
+ if (changeFlags.dataChanged || changeFlags.propsChanged || changeFlags.updateTriggersChanged) {
221
+ const { data, getTreeType, getBranchLevels, getCrop, getPosition, getElevation, getHeight, getTrunkHeightFraction, getCanopyRadius, sizeScale } = props;
110
222
  const grouped = {
111
223
  pine: [],
112
224
  oak: [],
@@ -114,8 +226,9 @@ export class TreeLayer extends CompositeLayer {
114
226
  birch: [],
115
227
  cherry: []
116
228
  };
117
- // Build per-level pine mesh cache
118
229
  const pineMeshes = {};
230
+ const liveCropPoints = [];
231
+ const droppedCropPoints = [];
119
232
  for (const d of data) {
120
233
  const type = getTreeType(d);
121
234
  if (grouped[type])
@@ -124,36 +237,84 @@ export class TreeLayer extends CompositeLayer {
124
237
  const levels = Math.max(1, Math.min(5, Math.round(getBranchLevels(d))));
125
238
  pineMeshes[levels] ??= createPineCanopyMesh(levels);
126
239
  }
240
+ const cropConfig = getCrop(d);
241
+ if (cropConfig) {
242
+ const pos = getPosition(d);
243
+ const lng = pos[0];
244
+ const lat = pos[1];
245
+ const elev = getElevation(d) || 0;
246
+ const h = getHeight(d) * sizeScale;
247
+ const f = getTrunkHeightFraction(d);
248
+ const r = getCanopyRadius(d) * sizeScale;
249
+ // Scale crop radius in lock-step with all other dimensions
250
+ const scaledCropConfig = {
251
+ ...cropConfig,
252
+ radius: cropConfig.radius * sizeScale
253
+ };
254
+ expandLiveCropPoints({
255
+ lng,
256
+ lat,
257
+ elevation: elev,
258
+ height: h,
259
+ trunkFraction: f,
260
+ canopyRadius: r,
261
+ cropConfig: scaledCropConfig,
262
+ out: liveCropPoints
263
+ });
264
+ expandDroppedCropPoints({
265
+ lng,
266
+ lat,
267
+ elevation: elev,
268
+ canopyRadius: r,
269
+ cropConfig: scaledCropConfig,
270
+ out: droppedCropPoints
271
+ });
272
+ }
127
273
  }
128
- this.setState({ grouped, pineMeshes });
274
+ this.setState({ grouped, pineMeshes, liveCropPoints, droppedCropPoints });
129
275
  }
130
276
  }
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
- }
277
+ /**
278
+ * Build a single canopy sub-layer.
279
+ *
280
+ * Takes explicit `mesh`, `data`, and `layerId` so that pine trees can be
281
+ * split into one sub-layer per level count (each with its own mesh).
282
+ */
283
+ _buildCanopyLayer(type, mesh, data, layerId) {
284
+ const { getPosition, getElevation, getHeight, getTrunkHeightFraction, getCanopyRadius, getCanopyColor, getSeason, sizeScale } = this.props;
141
285
  return new SimpleMeshLayer(this.getSubLayerProps({
142
- id: `canopy-${type}`,
143
- data: grouped[type],
286
+ id: layerId,
287
+ data,
144
288
  mesh,
145
289
  getPosition: (d) => {
146
290
  const pos = getPosition(d);
147
291
  const elevation = getElevation(d) || 0;
148
292
  const h = getHeight(d) * sizeScale;
149
293
  const f = getTrunkHeightFraction(d);
150
- return [pos[0], pos[1], elevation + h * f];
294
+ const canopyH = h * (1 - f);
295
+ return [pos[0], pos[1], elevation + h * f - canopyH * CANOPY_TRUNK_OVERLAP];
151
296
  },
152
297
  getScale: (d) => {
298
+ const pos = getPosition(d);
153
299
  const h = getHeight(d) * sizeScale;
154
300
  const f = getTrunkHeightFraction(d);
155
301
  const r = getCanopyRadius(d) * sizeScale;
156
- return [r, r, h * (1 - f)];
302
+ // Per-tree asymmetric XY scale from position hash — no two canopies
303
+ // are the same oval, giving organic variety with zero extra draw calls.
304
+ const seed = positionSeed(pos[0], pos[1]);
305
+ const sx = 1 + ((seed & 0xffff) / 65535 - 0.5) * 0.6;
306
+ const sy = 1 + (((seed >>> 16) & 0xffff) / 65535 - 0.5) * 0.6;
307
+ return [r * sx, r * sy, h * (1 - f)];
308
+ },
309
+ getOrientation: (d) => {
310
+ // Random bearing + slight pitch per tree so spherical canopies show
311
+ // visible lean variety at typical farm viewing angles (30–60° pitch).
312
+ // pitch [0]: ±12°, yaw [1]: full 360°, roll [2]: 0
313
+ const pos = getPosition(d);
314
+ const seed = positionSeed(pos[0], pos[1]);
315
+ const yaw = (((seed ^ (seed >>> 13)) & 0xffff) / 65535) * 360;
316
+ const pitch = (((seed ^ (seed >>> 7)) & 0xff) / 255 - 0.5) * 24;
317
+ return [pitch, yaw, 0];
157
318
  },
158
319
  getColor: (d) => {
159
320
  const explicit = getCanopyColor(d);
@@ -163,12 +324,17 @@ export class TreeLayer extends CompositeLayer {
163
324
  return DEFAULT_CANOPY_COLORS[type][season];
164
325
  },
165
326
  pickable: this.props.pickable,
166
- material: { ambient: 0.4, diffuse: 0.7, shininess: 12 }
327
+ material: { ambient: 0.55, diffuse: 0.55, shininess: 0 },
328
+ updateTriggers: {
329
+ getPosition: sizeScale,
330
+ getScale: sizeScale,
331
+ getOrientation: sizeScale
332
+ }
167
333
  }));
168
334
  }
169
335
  renderLayers() {
170
- const { getPosition, getElevation, getTreeType, getHeight, getTrunkHeightFraction, getTrunkRadius, getTrunkColor, sizeScale } = this.props;
171
- const { grouped } = this.state;
336
+ const { getPosition, getElevation, getTreeType, getHeight, getTrunkHeightFraction, getTrunkRadius, getTrunkColor, getBranchLevels, sizeScale } = this.props;
337
+ const { grouped, pineMeshes, liveCropPoints, droppedCropPoints } = this.state;
172
338
  // -----------------------------------------------------------------------
173
339
  // 1. Trunk layer — one layer for ALL tree types, shared cylinder geometry
174
340
  // -----------------------------------------------------------------------
@@ -194,13 +360,55 @@ export class TreeLayer extends CompositeLayer {
194
360
  return DEFAULT_TRUNK_COLORS[type] ?? DEFAULT_TRUNK_COLORS.pine;
195
361
  },
196
362
  pickable: this.props.pickable,
197
- material: { ambient: 0.35, diffuse: 0.6, shininess: 8 }
363
+ material: { ambient: 0.45, diffuse: 0.55, shininess: 4 },
364
+ updateTriggers: { getScale: sizeScale }
198
365
  }));
199
366
  // -----------------------------------------------------------------------
200
- // 2. Canopy layers — one per tree type, only for trees of that type
367
+ // 2. Canopy layers
368
+ // Non-pine: one sub-layer per species.
369
+ // Pine: one sub-layer per branch-level count, each using its own mesh,
370
+ // so trees with 2/3/4 tiers never share a mismatched mesh.
371
+ // -----------------------------------------------------------------------
372
+ 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}`));
373
+ const pineCanopies = Object.entries(pineMeshes).flatMap(([levelStr, mesh]) => {
374
+ const levels = Number(levelStr);
375
+ const pineData = grouped.pine.filter(
376
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
377
+ (d) => Math.max(1, Math.min(5, Math.round(getBranchLevels(d)))) === levels);
378
+ return pineData.length > 0
379
+ ? [this._buildCanopyLayer('pine', mesh, pineData, `canopy-pine-${levels}`)]
380
+ : [];
381
+ });
382
+ const canopyLayers = [...nonPineCanopies, ...pineCanopies];
201
383
  // -----------------------------------------------------------------------
202
- const canopyLayers = ALL_TREE_TYPES.filter((type) => grouped[type].length > 0).map((type) => this._buildCanopyLayer(type));
203
- return [trunkLayer, ...canopyLayers];
384
+ // 3. Crop layers live (in canopy) and dropped (on ground)
385
+ // -----------------------------------------------------------------------
386
+ const cropLayers = [];
387
+ if (liveCropPoints.length > 0) {
388
+ cropLayers.push(new SimpleMeshLayer(this.getSubLayerProps({
389
+ id: 'live-crops',
390
+ data: liveCropPoints,
391
+ mesh: CROP_MESH,
392
+ getPosition: (d) => d.position,
393
+ getScale: (d) => [d.scale, d.scale, d.scale],
394
+ getColor: (d) => d.color,
395
+ pickable: false,
396
+ material: { ambient: 0.5, diffuse: 0.8, shininess: 40 }
397
+ })));
398
+ }
399
+ if (droppedCropPoints.length > 0) {
400
+ cropLayers.push(new SimpleMeshLayer(this.getSubLayerProps({
401
+ id: 'dropped-crops',
402
+ data: droppedCropPoints,
403
+ mesh: CROP_MESH,
404
+ getPosition: (d) => d.position,
405
+ getScale: (d) => [d.scale, d.scale, d.scale],
406
+ getColor: (d) => d.color,
407
+ pickable: false,
408
+ material: { ambient: 0.6, diffuse: 0.5, shininess: 10 }
409
+ })));
410
+ }
411
+ return [trunkLayer, ...canopyLayers, ...cropLayers];
204
412
  }
205
413
  }
206
414
  //# 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":"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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.3.0-beta.1",
4
4
  "description": "Three.js-powered layers for deck.gl",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -35,12 +35,12 @@
35
35
  "test-watch": "vitest"
36
36
  },
37
37
  "dependencies": {
38
- "@deck.gl/core": "~9.2.8",
39
- "@deck.gl/mesh-layers": "~9.2.8",
38
+ "@deck.gl/core": "~9.3.0",
39
+ "@deck.gl/mesh-layers": "~9.3.0",
40
40
  "three": "^0.170.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/three": "^0.170.0"
44
44
  },
45
- "gitHead": "c6b0f45b1e7f9916c1b79a43c39b839a8096c163"
45
+ "gitHead": "c64fa2c8fbc0b16ec84b56838f58ac7a4e9ec9e6"
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);