@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.
- package/README.md +127 -13
- package/dist/index.cjs +255 -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 +236 -28
- package/dist/tree-layer/tree-layer.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +1 -1
- package/src/tree-layer/tree-geometry.ts +119 -18
- package/src/tree-layer/tree-layer.ts +356 -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,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
|
-
/**
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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:
|
|
143
|
-
data
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
363
|
+
material: { ambient: 0.45, diffuse: 0.55, shininess: 4 },
|
|
364
|
+
updateTriggers: { getScale: sizeScale }
|
|
198
365
|
}));
|
|
199
366
|
// -----------------------------------------------------------------------
|
|
200
|
-
// 2. Canopy layers
|
|
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
|
-
|
|
203
|
-
|
|
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.
|
|
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.
|
|
39
|
-
"@deck.gl/mesh-layers": "~9.
|
|
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": "
|
|
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
|
-
|
|
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);
|