@deck.gl-community/three 9.2.8 → 9.3.1-alpha.0
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/dist/index.cjs
CHANGED
|
@@ -316,7 +316,12 @@ function expandDroppedCropPoints(opts) {
|
|
|
316
316
|
const dLng = lngDegreesPerMeter(lat);
|
|
317
317
|
const rng = createRng(positionSeed(lng, lat) ^ 439041101);
|
|
318
318
|
const c = cropConfig.color;
|
|
319
|
-
const droppedColor = [
|
|
319
|
+
const droppedColor = [
|
|
320
|
+
c[0],
|
|
321
|
+
c[1],
|
|
322
|
+
c[2],
|
|
323
|
+
Math.round((c[3] ?? 255) * 0.45)
|
|
324
|
+
];
|
|
320
325
|
for (let i = 0; i < droppedCount; i++) {
|
|
321
326
|
const theta = rng() * Math.PI * 2;
|
|
322
327
|
const dist = Math.sqrt(rng()) * footprintRadius;
|
|
@@ -436,15 +441,16 @@ var TreeLayer = class extends import_core.CompositeLayer {
|
|
|
436
441
|
const f = getTrunkHeightFraction(d);
|
|
437
442
|
const r = getCanopyRadius(d) * sizeScale;
|
|
438
443
|
const seed = positionSeed(pos[0], pos[1]);
|
|
439
|
-
const sx = 1 + ((seed & 65535) / 65535 - 0.5) * 0.
|
|
440
|
-
const sy = 1 + ((seed >>> 16 & 65535) / 65535 - 0.5) * 0.
|
|
444
|
+
const sx = 1 + ((seed & 65535) / 65535 - 0.5) * 0.6;
|
|
445
|
+
const sy = 1 + ((seed >>> 16 & 65535) / 65535 - 0.5) * 0.6;
|
|
441
446
|
return [r * sx, r * sy, h * (1 - f)];
|
|
442
447
|
},
|
|
443
448
|
getOrientation: (d) => {
|
|
444
449
|
const pos = getPosition(d);
|
|
445
450
|
const seed = positionSeed(pos[0], pos[1]);
|
|
446
|
-
const
|
|
447
|
-
|
|
451
|
+
const yaw = ((seed ^ seed >>> 13) & 65535) / 65535 * 360;
|
|
452
|
+
const pitch = (((seed ^ seed >>> 7) & 255) / 255 - 0.5) * 24;
|
|
453
|
+
return [pitch, yaw, 0];
|
|
448
454
|
},
|
|
449
455
|
getColor: (d) => {
|
|
450
456
|
const explicit = getCanopyColor(d);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/tree-layer/tree-layer.ts", "../src/tree-layer/tree-geometry.ts"],
|
|
4
|
-
"sourcesContent": ["// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport type {TreeLayerProps, TreeType, Season, CropConfig} from './tree-layer/tree-layer';\nexport {TreeLayer} from './tree-layer/tree-layer';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {CompositeLayer} from '@deck.gl/core';\nimport type {Color, DefaultProps, LayerProps, Position} from '@deck.gl/core';\nimport {SimpleMeshLayer} from '@deck.gl/mesh-layers';\nimport {\n createTrunkMesh,\n createPineCanopyMesh,\n createOakCanopyMesh,\n createPalmCanopyMesh,\n createBirchCanopyMesh,\n createCherryCanopyMesh,\n createCropMesh\n} from './tree-geometry';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/** Tree species / silhouette variant. */\nexport type TreeType = 'pine' | 'oak' | 'palm' | 'birch' | 'cherry';\n\n/** Season that drives default canopy colour when no explicit colour is supplied. */\nexport type Season = 'spring' | 'summer' | 'autumn' | 'winter';\n\n/**\n * Crop configuration for a single tree.\n *\n * Pass this from `getCrop` to render small spherical crop points on the tree\n * and/or scattered on the ground around it. Works for fruit, nuts, or flowers\n * (flowering stage is expressed simply as a flower-coloured crop config).\n *\n * Positions are randomised deterministically from the tree's geographic\n * coordinates, so they are stable across re-renders.\n */\nexport type CropConfig = {\n /** Colour of each crop sphere [r, g, b, a]. */\n color: Color;\n /** Number of crop spheres placed in the outer canopy volume (live/in-tree crops). */\n count: number;\n /**\n * Number of crop spheres scattered on the ground within the canopy footprint\n * (dropped/fallen crops).\n * @default 0\n */\n droppedCount?: number;\n /** Radius of each individual crop sphere in metres. */\n radius: number;\n};\n\n// ---------------------------------------------------------------------------\n// Default colours\n// ---------------------------------------------------------------------------\n\n/** Default trunk colours per tree type [r, g, b, a]. */\nconst DEFAULT_TRUNK_COLORS: Record<TreeType, Color> = {\n pine: [80, 50, 20, 255],\n oak: [91, 57, 23, 255],\n palm: [140, 100, 55, 255],\n birch: [220, 215, 205, 255], // white-grey birch bark\n cherry: [100, 60, 40, 255]\n};\n\n/** Default canopy colours per (tree type, season) [r, g, b, a]. */\nconst DEFAULT_CANOPY_COLORS: Record<TreeType, Record<Season, Color>> = {\n pine: {\n spring: [34, 100, 34, 255],\n summer: [0, 64, 0, 255],\n autumn: [0, 64, 0, 255], // evergreen \u2014 no colour change\n winter: [0, 55, 0, 255]\n },\n oak: {\n spring: [100, 180, 80, 255],\n summer: [34, 120, 15, 255],\n autumn: [180, 85, 20, 255],\n winter: [100, 80, 60, 160] // sparse, semi-transparent\n },\n palm: {\n spring: [50, 160, 50, 255],\n summer: [20, 145, 20, 255],\n autumn: [55, 150, 30, 255],\n winter: [40, 130, 30, 255]\n },\n birch: {\n spring: [150, 210, 110, 255],\n summer: [80, 160, 60, 255],\n autumn: [230, 185, 40, 255],\n winter: [180, 180, 170, 90] // near-bare\n },\n cherry: {\n spring: [255, 180, 205, 255], // pink blossom\n summer: [50, 140, 50, 255],\n autumn: [200, 60, 40, 255],\n winter: [120, 90, 80, 110] // bare\n }\n};\n\n// ---------------------------------------------------------------------------\n// Pre-built unit-scale meshes (shared across all layer instances)\n// ---------------------------------------------------------------------------\n\nconst TRUNK_MESH = createTrunkMesh();\n\nconst CANOPY_MESHES: Record<TreeType, ReturnType<typeof createTrunkMesh>> = {\n pine: createPineCanopyMesh(3),\n oak: createOakCanopyMesh(),\n palm: createPalmCanopyMesh(),\n birch: createBirchCanopyMesh(),\n cherry: createCherryCanopyMesh()\n};\n\nconst CROP_MESH = createCropMesh();\n\nconst ALL_TREE_TYPES: TreeType[] = ['pine', 'oak', 'palm', 'birch', 'cherry'];\n\n/**\n * Fraction of canopy height by which the canopy mesh is lowered into the trunk.\n * Hides the trunk-top disk that would otherwise peek above the canopy base.\n * 0.22 means the canopy base sits 22% of canopy-height below the trunk top.\n */\nconst CANOPY_TRUNK_OVERLAP = 0.22;\n\n// ---------------------------------------------------------------------------\n// Crop helpers\n// ---------------------------------------------------------------------------\n\n/** splitmix32 \u2014 fast, high-quality seeded PRNG returning values in [0, 1). */\nfunction createRng(seed: number): () => number {\n let s = seed >>> 0;\n return (): number => {\n s = (s + 0x9e3779b9) | 0;\n let t = s ^ (s >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t ^= t >>> 15;\n t = Math.imul(t, 0x735a2d97);\n return ((t ^ (t >>> 15)) >>> 0) / 4294967296;\n };\n}\n\n/** Deterministic integer seed derived from a geographic position. */\nfunction positionSeed(lng: number, lat: number): number {\n return ((Math.round(lng * 10000) * 92821) ^ (Math.round(lat * 10000) * 65537)) >>> 0;\n}\n\nconst DEG_PER_METER_LAT = 1 / 111320;\n\nfunction lngDegreesPerMeter(latDeg: number): number {\n return 1 / (111320 * Math.cos((latDeg * Math.PI) / 180));\n}\n\n/** Internal flat record for a single rendered crop sphere. */\ntype CropPoint = {\n position: [number, number, number];\n color: Color;\n scale: number;\n};\n\n/**\n * Expand live crop positions so they straddle the canopy surface.\n *\n * The canopy mesh is a SphereGeometry(0.5, \u2026) which, after SimpleMeshLayer\n * applies getScale = [r, r, H], has a true XY radius of 0.5 * r and a true\n * Z half-height of 0.5 * H. Crops are placed at 85\u2013110 % of those real\n * dimensions so most of each sphere sits just outside the canopy surface.\n *\n * Positions are seeded from the tree's geographic coordinates so they are\n * stable across re-renders.\n */\nfunction expandLiveCropPoints(opts: {\n lng: number;\n lat: number;\n elevation: number;\n height: number;\n trunkFraction: number;\n canopyRadius: number;\n cropConfig: CropConfig;\n out: CropPoint[];\n}): void {\n const {lng, lat, elevation, height, trunkFraction, canopyRadius, cropConfig, out} = opts;\n if (cropConfig.count <= 0) return;\n\n // Actual canopy sphere radii after SimpleMeshLayer scaling.\n // SphereGeometry has unit radius 0.5, so world radius = 0.5 * getScale component.\n const rxy = canopyRadius * 0.5;\n const canopyH = height * (1 - trunkFraction);\n const rz = canopyH * 0.5;\n // Canopy position is lowered by CANOPY_TRUNK_OVERLAP to hide the trunk-top disk\n const canopyCenterZ = elevation + height * trunkFraction - canopyH * CANOPY_TRUNK_OVERLAP + rz;\n\n const dLng = lngDegreesPerMeter(lat);\n const rng = createRng(positionSeed(lng, lat));\n\n for (let i = 0; i < cropConfig.count; i++) {\n const theta = rng() * Math.PI * 2;\n // Exclude top and bottom caps so crops never crown the canopy or hang below.\n // cos(phi) in [-0.80, 0.80] \u2192 phi from ~37\u00B0 to ~143\u00B0 (equatorial band).\n const cosPhi = -0.8 + rng() * 1.6;\n const sinPhi = Math.sqrt(Math.max(0, 1 - cosPhi * cosPhi));\n // 90\u2013102 % of canopy radius: crops sit just at/inside the surface, tips barely poke out\n const radFrac = 0.9 + rng() * 0.12;\n\n const dx = rxy * radFrac * sinPhi * Math.cos(theta);\n const dy = rxy * radFrac * sinPhi * Math.sin(theta);\n const dz = rz * radFrac * cosPhi;\n\n out.push({\n position: [lng + dx * dLng, lat + dy * DEG_PER_METER_LAT, canopyCenterZ + dz],\n color: cropConfig.color,\n scale: cropConfig.radius\n });\n }\n}\n\n/**\n * Expand dropped crop positions uniformly across the ground disk within the\n * canopy footprint. Uses a separate seed offset from live crops so that\n * changing `count` does not affect dropped positions.\n */\nfunction expandDroppedCropPoints(opts: {\n lng: number;\n lat: number;\n elevation: number;\n canopyRadius: number;\n cropConfig: CropConfig;\n out: CropPoint[];\n}): void {\n const {lng, lat, elevation, canopyRadius, cropConfig, out} = opts;\n const droppedCount = cropConfig.droppedCount ?? 0;\n if (droppedCount <= 0) return;\n\n // Actual canopy footprint radius (see note in expandLiveCropPoints)\n const footprintRadius = canopyRadius * 0.5;\n const dLng = lngDegreesPerMeter(lat);\n // XOR with a constant so the dropped sequence is independent of the live one\n const rng = createRng(positionSeed(lng, lat) ^ 0x1a2b3c4d);\n\n // Dropped crops are semi-transparent so they read as fallen/decaying\n const c = cropConfig.color as number[];\n const droppedColor: Color = [c[0], c[1], c[2], Math.round((c[3] ?? 255) * 0.45)] as Color;\n\n for (let i = 0; i < droppedCount; i++) {\n const theta = rng() * Math.PI * 2;\n // sqrt for uniform-area disk sampling\n const dist = Math.sqrt(rng()) * footprintRadius;\n\n const dx = dist * Math.cos(theta);\n const dy = dist * Math.sin(theta);\n\n out.push({\n position: [lng + dx * dLng, lat + dy * DEG_PER_METER_LAT, elevation + 0.05],\n color: droppedColor,\n scale: cropConfig.radius\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\ntype _TreeLayerProps<DataT> = {\n /** Source data. */\n data: DataT[];\n\n /** Longitude/latitude position of the tree base. */\n getPosition?: (d: DataT) => Position;\n\n /** Base elevation (metres above sea level). @default 0 */\n getElevation?: (d: DataT) => number;\n\n /**\n * Silhouette / species variant.\n * 'pine' \u2013 layered conical tiers (evergreen)\n * 'oak' \u2013 wide spherical canopy\n * 'palm' \u2013 tall thin trunk with flat crown\n * 'birch' \u2013 narrow oval canopy, pale bark\n * 'cherry' \u2013 round lush canopy, seasonal blossom\n * @default 'pine'\n */\n getTreeType?: (d: DataT) => TreeType;\n\n /**\n * Total tree height in metres.\n * @default 10\n */\n getHeight?: (d: DataT) => number;\n\n /**\n * Fraction of total height occupied by the trunk (0\u20131).\n * @default 0.35\n */\n getTrunkHeightFraction?: (d: DataT) => number;\n\n /**\n * Trunk base radius in metres.\n * @default 0.5\n */\n getTrunkRadius?: (d: DataT) => number;\n\n /**\n * Horizontal radius of the canopy in metres.\n * @default 3\n */\n getCanopyRadius?: (d: DataT) => number;\n\n /**\n * Explicit trunk colour [r, g, b, a].\n * When null the species default is used.\n * @default null\n */\n getTrunkColor?: (d: DataT) => Color | null;\n\n /**\n * Explicit canopy colour [r, g, b, a].\n * When null the species \u00D7 season default is used.\n * @default null\n */\n getCanopyColor?: (d: DataT) => Color | null;\n\n /**\n * Season used to pick the default canopy colour when no explicit colour is provided.\n * @default 'summer'\n */\n getSeason?: (d: DataT) => Season;\n\n /**\n * Number of cone tiers for pine trees (1\u20135).\n * Higher values produce a denser layered silhouette.\n * @default 3\n */\n getBranchLevels?: (d: DataT) => number;\n\n /**\n * Optional crop configuration for this tree.\n *\n * Return a `CropConfig` to render small spherical crop points in the outer\n * canopy volume (live crops) and/or scattered on the ground around the trunk\n * (dropped crops). Return `null` to show no crops for this tree.\n *\n * The same accessor can express fruit, nuts, or flowering stage \u2014 pass\n * flower-coloured points (e.g. `[255, 200, 220, 255]`) for a blossom effect.\n *\n * Crop positions are randomised deterministically from the tree's geographic\n * coordinates; they are stable across re-renders.\n *\n * @default null (no crops)\n */\n getCrop?: (d: DataT) => CropConfig | null;\n\n /**\n * Global size multiplier applied to all dimensions.\n * @default 1\n */\n sizeScale?: number;\n};\n\nexport type TreeLayerProps<DataT = unknown> = _TreeLayerProps<DataT> & LayerProps;\n\nconst defaultProps: DefaultProps<TreeLayerProps<unknown>> = {\n getPosition: {type: 'accessor', value: (d: any) => d.position},\n getElevation: {type: 'accessor', value: (_d: any) => 0},\n getTreeType: {type: 'accessor', value: (_d: any) => 'pine' as TreeType},\n getHeight: {type: 'accessor', value: (_d: any) => 10},\n getTrunkHeightFraction: {type: 'accessor', value: (_d: any) => 0.35},\n getTrunkRadius: {type: 'accessor', value: (_d: any) => 0.5},\n getCanopyRadius: {type: 'accessor', value: (_d: any) => 3},\n getTrunkColor: {type: 'accessor', value: (_d: any) => null},\n getCanopyColor: {type: 'accessor', value: (_d: any) => null},\n getSeason: {type: 'accessor', value: (_d: any) => 'summer' as Season},\n getBranchLevels: {type: 'accessor', value: (_d: any) => 3},\n getCrop: {type: 'accessor', value: (_d: any) => null},\n sizeScale: {type: 'number', value: 1, min: 0}\n};\n\n// ---------------------------------------------------------------------------\n// State\n// ---------------------------------------------------------------------------\n\ntype TreeLayerState = {\n grouped: Record<TreeType, unknown[]>;\n pineMeshes: Record<number, ReturnType<typeof createPineCanopyMesh>>;\n liveCropPoints: CropPoint[];\n droppedCropPoints: CropPoint[];\n};\n\n// ---------------------------------------------------------------------------\n// Layer\n// ---------------------------------------------------------------------------\n\n/**\n * **TreeLayer** \u2014 A parametric, Three.js-powered deck.gl layer that renders\n * richly configurable 3D trees at geographic positions.\n *\n * Each tree is composed of two `SimpleMeshLayer` instances: one for the trunk\n * (a tapered cylinder) and one for the canopy (silhouette depends on `getTreeType`).\n * All geometry is generated procedurally using Three.js `BufferGeometry` primitives\n * and converted to the `@loaders.gl/schema` `MeshGeometry` format accepted by\n * `SimpleMeshLayer`.\n *\n * Parametric controls include:\n * - Species / silhouette (`getTreeType`)\n * - Total height (`getHeight`) and trunk-to-canopy proportion (`getTrunkHeightFraction`)\n * - Trunk and canopy radii (`getTrunkRadius`, `getCanopyRadius`)\n * - Explicit or season-driven colours (`getTrunkColor`, `getCanopyColor`, `getSeason`)\n * - Pine tier density (`getBranchLevels`)\n * - Crop / fruit / flower visualisation (`getCrop`)\n * - Global scale factor (`sizeScale`)\n */\nexport class TreeLayer<DataT = unknown, ExtraPropsT extends {} = {}> extends CompositeLayer<\n ExtraPropsT & Required<_TreeLayerProps<DataT>>\n> {\n static layerName = 'TreeLayer';\n static defaultProps = defaultProps;\n\n declare state: TreeLayerState;\n\n initializeState() {\n this.state = {\n grouped: {pine: [], oak: [], palm: [], birch: [], cherry: []},\n pineMeshes: {},\n liveCropPoints: [],\n droppedCropPoints: []\n };\n }\n\n updateState({props, oldProps, changeFlags}) {\n if (changeFlags.dataChanged || changeFlags.propsChanged || changeFlags.updateTriggersChanged) {\n const {\n data,\n getTreeType,\n getBranchLevels,\n getCrop,\n getPosition,\n getElevation,\n getHeight,\n getTrunkHeightFraction,\n getCanopyRadius,\n sizeScale\n } = props;\n\n const grouped: Record<TreeType, DataT[]> = {\n pine: [],\n oak: [],\n palm: [],\n birch: [],\n cherry: []\n };\n\n const pineMeshes: Record<number, ReturnType<typeof createPineCanopyMesh>> = {};\n const liveCropPoints: CropPoint[] = [];\n const droppedCropPoints: CropPoint[] = [];\n\n for (const d of data as DataT[]) {\n const type = getTreeType(d) as TreeType;\n if (grouped[type]) grouped[type].push(d);\n\n if (type === 'pine') {\n const levels = Math.max(1, Math.min(5, Math.round(getBranchLevels(d) as number)));\n pineMeshes[levels] ??= createPineCanopyMesh(levels);\n }\n\n const cropConfig = getCrop(d);\n if (cropConfig) {\n const pos = getPosition(d);\n const lng = pos[0];\n const lat = pos[1];\n const elev = getElevation(d) || 0;\n const h = getHeight(d) * sizeScale;\n const f = getTrunkHeightFraction(d);\n const r = getCanopyRadius(d) * sizeScale;\n\n // Scale crop radius in lock-step with all other dimensions\n const scaledCropConfig: CropConfig = {\n ...cropConfig,\n radius: cropConfig.radius * sizeScale\n };\n expandLiveCropPoints({\n lng,\n lat,\n elevation: elev,\n height: h,\n trunkFraction: f,\n canopyRadius: r,\n cropConfig: scaledCropConfig,\n out: liveCropPoints\n });\n expandDroppedCropPoints({\n lng,\n lat,\n elevation: elev,\n canopyRadius: r,\n cropConfig: scaledCropConfig,\n out: droppedCropPoints\n });\n }\n }\n\n this.setState({grouped, pineMeshes, liveCropPoints, droppedCropPoints});\n }\n }\n\n /**\n * Build a single canopy sub-layer.\n *\n * Takes explicit `mesh`, `data`, and `layerId` so that pine trees can be\n * split into one sub-layer per level count (each with its own mesh).\n */\n private _buildCanopyLayer(\n type: TreeType,\n mesh: ReturnType<typeof createTrunkMesh>,\n data: unknown[],\n layerId: string\n ): SimpleMeshLayer {\n const {\n getPosition,\n getElevation,\n getHeight,\n getTrunkHeightFraction,\n getCanopyRadius,\n getCanopyColor,\n getSeason,\n sizeScale\n } = this.props;\n\n return new SimpleMeshLayer(\n this.getSubLayerProps({\n id: layerId,\n data,\n mesh,\n getPosition: (d) => {\n const pos = getPosition(d);\n const elevation = getElevation(d) || 0;\n const h = getHeight(d) * sizeScale;\n const f = getTrunkHeightFraction(d);\n const canopyH = h * (1 - f);\n return [pos[0], pos[1], elevation + h * f - canopyH * CANOPY_TRUNK_OVERLAP];\n },\n getScale: (d) => {\n const pos = getPosition(d);\n const h = getHeight(d) * sizeScale;\n const f = getTrunkHeightFraction(d);\n const r = getCanopyRadius(d) * sizeScale;\n // Per-tree asymmetric XY scale from position hash \u2014 no two canopies\n // are the same oval, giving organic variety with zero extra draw calls.\n const seed = positionSeed(pos[0], pos[1]);\n const sx = 1 + ((seed & 0xffff) / 65535 - 0.5) * 0.3;\n const sy = 1 + (((seed >>> 16) & 0xffff) / 65535 - 0.5) * 0.3;\n return [r * sx, r * sy, h * (1 - f)];\n },\n getOrientation: (d) => {\n // Random bearing per tree: yaw (index 1) rotates around the vertical\n // Z axis in deck.gl's [pitch, yaw, roll] convention.\n // Pine tiers face different compass directions; bumpy canopies present\n // a unique silhouette from every viewing angle.\n const pos = getPosition(d);\n const seed = positionSeed(pos[0], pos[1]);\n const angle = (((seed ^ (seed >>> 13)) & 0xffff) / 65535) * 360;\n return [0, angle, 0];\n },\n getColor: (d) => {\n const explicit = getCanopyColor(d);\n if (explicit) return explicit;\n const season = getSeason(d) || 'summer';\n return DEFAULT_CANOPY_COLORS[type][season];\n },\n pickable: this.props.pickable,\n material: {ambient: 0.55, diffuse: 0.55, shininess: 0},\n updateTriggers: {\n getPosition: sizeScale,\n getScale: sizeScale,\n getOrientation: sizeScale\n }\n })\n );\n }\n\n renderLayers() {\n const {\n getPosition,\n getElevation,\n getTreeType,\n getHeight,\n getTrunkHeightFraction,\n getTrunkRadius,\n getTrunkColor,\n getBranchLevels,\n sizeScale\n } = this.props;\n\n const {grouped, pineMeshes, liveCropPoints, droppedCropPoints} = this.state;\n\n // -----------------------------------------------------------------------\n // 1. Trunk layer \u2014 one layer for ALL tree types, shared cylinder geometry\n // -----------------------------------------------------------------------\n const trunkLayer = new SimpleMeshLayer(\n this.getSubLayerProps({\n id: 'trunks',\n data: this.props.data,\n mesh: TRUNK_MESH,\n getPosition: (d) => {\n const pos = getPosition(d);\n return [pos[0], pos[1], getElevation(d) || 0];\n },\n getScale: (d) => {\n const h = getHeight(d) * sizeScale;\n const f = getTrunkHeightFraction(d);\n const r = getTrunkRadius(d) * sizeScale;\n return [r, r, h * f];\n },\n getColor: (d) => {\n const explicit = getTrunkColor(d);\n if (explicit) return explicit;\n const type = getTreeType(d) || 'pine';\n return DEFAULT_TRUNK_COLORS[type] ?? DEFAULT_TRUNK_COLORS.pine;\n },\n pickable: this.props.pickable,\n material: {ambient: 0.45, diffuse: 0.55, shininess: 4},\n updateTriggers: {getScale: sizeScale}\n })\n );\n\n // -----------------------------------------------------------------------\n // 2. Canopy layers\n // Non-pine: one sub-layer per species.\n // Pine: one sub-layer per branch-level count, each using its own mesh,\n // so trees with 2/3/4 tiers never share a mismatched mesh.\n // -----------------------------------------------------------------------\n const nonPineCanopies = ALL_TREE_TYPES.filter((t) => t !== 'pine' && grouped[t].length > 0).map(\n (t) => this._buildCanopyLayer(t, CANOPY_MESHES[t], grouped[t], `canopy-${t}`)\n );\n\n const pineCanopies = Object.entries(pineMeshes).flatMap(([levelStr, mesh]) => {\n const levels = Number(levelStr);\n const pineData = grouped.pine.filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (d) => Math.max(1, Math.min(5, Math.round(getBranchLevels(d as any)))) === levels\n );\n return pineData.length > 0\n ? [this._buildCanopyLayer('pine', mesh, pineData, `canopy-pine-${levels}`)]\n : [];\n });\n\n const canopyLayers = [...nonPineCanopies, ...pineCanopies];\n\n // -----------------------------------------------------------------------\n // 3. Crop layers \u2014 live (in canopy) and dropped (on ground)\n // -----------------------------------------------------------------------\n const cropLayers = [];\n\n if (liveCropPoints.length > 0) {\n cropLayers.push(\n new SimpleMeshLayer(\n this.getSubLayerProps({\n id: 'live-crops',\n data: liveCropPoints,\n mesh: CROP_MESH,\n getPosition: (d: CropPoint) => d.position,\n getScale: (d: CropPoint) => [d.scale, d.scale, d.scale],\n getColor: (d: CropPoint) => d.color,\n pickable: false,\n material: {ambient: 0.5, diffuse: 0.8, shininess: 40}\n })\n )\n );\n }\n\n if (droppedCropPoints.length > 0) {\n cropLayers.push(\n new SimpleMeshLayer(\n this.getSubLayerProps({\n id: 'dropped-crops',\n data: droppedCropPoints,\n mesh: CROP_MESH,\n getPosition: (d: CropPoint) => d.position,\n getScale: (d: CropPoint) => [d.scale, d.scale, d.scale],\n getColor: (d: CropPoint) => d.color,\n pickable: false,\n material: {ambient: 0.6, diffuse: 0.5, shininess: 10}\n })\n )\n );\n }\n\n return [trunkLayer, ...canopyLayers, ...cropLayers];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n BufferGeometry,\n BufferAttribute,\n CylinderGeometry,\n ConeGeometry,\n SphereGeometry,\n IcosahedronGeometry,\n Matrix4\n} from 'three';\n\n/**\n * Mesh format compatible with deck.gl SimpleMeshLayer.\n * All geometries are Z-up (deck.gl convention), unit scale (0..1 in Z = bottom to top).\n */\nexport type TreeMesh = {\n attributes: {\n POSITION: {value: Float32Array; size: 3};\n NORMAL: {value: Float32Array; size: 3};\n };\n indices: {value: Uint32Array; size: 1};\n topology: 'triangle-list';\n mode: 4;\n};\n\n/**\n * Rotation matrix that converts from Three.js Y-up to deck.gl Z-up.\n * Rotates -90 degrees around the X axis: Y -> Z, Z -> -Y.\n */\nconst Y_TO_Z_UP = new Matrix4().makeRotationX(-Math.PI / 2);\n\n/**\n * Perturb each vertex radially using a sum of low-frequency sinusoidal waves\n * evaluated at the vertex's surface direction. Adjacent vertices receive\n * smoothly-varying displacements so there are no gaps or cracks in the mesh.\n * Applied once at module init \u2014 zero runtime cost.\n *\n * @param geo Three.js BufferGeometry to modify in-place (before Y_TO_Z_UP rotation)\n * @param magnitude Fractional displacement amplitude, e.g. 0.15 = \u00B115 % of radius\n * @param seed Integer seed \u2014 each species gets a distinct blob shape\n */\nfunction jitterSmooth(geo: BufferGeometry, magnitude: number, seed: number): void {\n let s = seed >>> 0;\n const rng = () => {\n s = (s + 0x9e3779b9) | 0;\n let t = s ^ (s >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t ^= t >>> 15;\n t = Math.imul(t, 0x735a2d97);\n return ((t ^ (t >>> 15)) >>> 0) / 4294967296;\n };\n // 4 low-frequency waves (2\u20135 bumps across the sphere) \u2014 smooth, no cracks\n const waves = Array.from({length: 4}, () => ({\n fx: 2 + rng() * 3,\n fy: 2 + rng() * 3,\n fz: 2 + rng() * 3,\n phase: rng() * Math.PI * 2\n }));\n\n const pos = geo.attributes.position.array as Float32Array;\n for (let i = 0; i < pos.length; i += 3) {\n const x = pos[i];\n const y = pos[i + 1];\n const z = pos[i + 2];\n const r = Math.sqrt(x * x + y * y + z * z);\n if (r !== 0) {\n const nx = x / r;\n const ny = y / r;\n const nz = z / r;\n let noise = 0;\n for (const w of waves) {\n noise += Math.sin(nx * w.fx + ny * w.fy + nz * w.fz + w.phase);\n }\n noise /= 4; // normalise to ~ [-1, 1]\n const scale = 1 + noise * magnitude;\n pos[i] = x * scale;\n pos[i + 1] = y * scale;\n pos[i + 2] = z * scale;\n }\n }\n}\n\n/**\n * Extract a TreeMesh from a Three.js BufferGeometry.\n * Assumes the geometry has already been rotated to Z-up.\n */\nfunction extractMesh(geo: BufferGeometry): TreeMesh {\n geo.computeVertexNormals();\n const posAttr = geo.attributes.position as BufferAttribute;\n const norAttr = geo.attributes.normal as BufferAttribute;\n const idx = geo.index;\n\n return {\n attributes: {\n POSITION: {value: new Float32Array(posAttr.array), size: 3},\n NORMAL: {value: new Float32Array(norAttr.array), size: 3}\n },\n indices: {value: new Uint32Array(idx ? idx.array : new Uint32Array(0)), size: 1},\n topology: 'triangle-list',\n mode: 4\n };\n}\n\n/** Copy indices for one geometry slice, offsetting by the current vertex base. */\nfunction copyIndices(\n out: Uint32Array,\n outOffset: number,\n geo: BufferGeometry,\n vertexBase: number\n): number {\n if (geo.index) {\n const src = geo.index.array;\n for (let i = 0; i < src.length; i++) out[outOffset + i] = src[i] + vertexBase;\n return src.length;\n }\n const count = geo.attributes.position.count;\n for (let i = 0; i < count; i++) out[outOffset + i] = vertexBase + i;\n return count;\n}\n\n/**\n * Merge multiple Three.js BufferGeometries into a single geometry.\n * All input geometries must be indexed.\n */\nfunction mergeGeometries(geos: BufferGeometry[]): BufferGeometry {\n let totalVertices = 0;\n let totalIndices = 0;\n for (const geo of geos) {\n totalVertices += geo.attributes.position.count;\n totalIndices += geo.index ? geo.index.count : geo.attributes.position.count;\n }\n\n const positions = new Float32Array(totalVertices * 3);\n const normals = new Float32Array(totalVertices * 3);\n const indices = new Uint32Array(totalIndices);\n let vOffset = 0;\n let iOffset = 0;\n\n for (const geo of geos) {\n const count = geo.attributes.position.count;\n const srcNor = geo.attributes.normal ? (geo.attributes.normal.array as Float32Array) : null;\n positions.set(geo.attributes.position.array as Float32Array, vOffset * 3);\n if (srcNor) normals.set(srcNor, vOffset * 3);\n iOffset += copyIndices(indices, iOffset, geo, vOffset);\n vOffset += count;\n }\n\n const merged = new BufferGeometry();\n merged.setAttribute('position', new BufferAttribute(positions, 3));\n merged.setAttribute('normal', new BufferAttribute(normals, 3));\n merged.setIndex(new BufferAttribute(indices, 1));\n return merged;\n}\n\n/**\n * Unit trunk cylinder mesh: from z=0 (base) to z=1 (top), radius tapers from 1 to 0.7.\n * Scale via `getScale = [trunkRadius, trunkRadius, trunkHeight]`.\n */\nexport function createTrunkMesh(segments = 8): TreeMesh {\n const geo = new CylinderGeometry(0.7, 1.0, 1.0, segments);\n // Three.js CylinderGeometry is centered at origin, extends from y=-0.5 to y=0.5\n geo.applyMatrix4(Y_TO_Z_UP); // Rotate to Z-up: now z=-0.5 to z=0.5\n geo.translate(0, 0, 0.5); // Shift so base is at z=0, top at z=1\n return extractMesh(geo);\n}\n\n/**\n * Unit pine canopy mesh: multiple tiered cones creating a Christmas tree silhouette.\n * Extends from z=0 (base of canopy) to z=1 (tip).\n *\n * @param levels - number of cone tiers (1-5)\n * @param segments - polygon segments per cone\n */\nexport function createPineCanopyMesh(levels = 3, segments = 8): TreeMesh {\n const geos: BufferGeometry[] = [];\n\n // Deterministic per-levels RNG so each level count gets its own organic shape.\n let s = (levels * 2654435761) >>> 0;\n const rng = () => {\n s = (s + 0x9e3779b9) | 0;\n let t = s ^ (s >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t ^= t >>> 15;\n t = Math.imul(t, 0x735a2d97);\n return ((t ^ (t >>> 15)) >>> 0) / 4294967296;\n };\n\n // Base tier height for 50 % overlap filling z = 0..0.8.\n const tierHeight = 1.6 / (levels + 1);\n const step = tierHeight / 2;\n\n let zCursor = 0;\n for (let i = 0; i < levels; i++) {\n const t = i / (levels - 1 || 1);\n\n // Width narrows toward the top; each tier gets \u00B120 % random variation.\n const baseRadius = (1 - t * 0.5) * 0.85;\n const radius = baseRadius * (0.8 + rng() * 0.4);\n\n // Height varies \u00B115 % per tier for uneven silhouette.\n const tierH = tierHeight * (0.85 + rng() * 0.3);\n\n const cone = new ConeGeometry(radius, tierH, segments);\n cone.applyMatrix4(Y_TO_Z_UP);\n\n // Drift increases from 0 at the bottom tier to \u00B10.10 at the top tier.\n // Bottom tier stays centred so it always connects cleanly to the trunk.\n const driftScale = levels > 1 ? i / (levels - 1) : 0;\n const driftX = (rng() - 0.5) * 0.2 * driftScale;\n const driftY = (rng() - 0.5) * 0.2 * driftScale;\n cone.translate(driftX, driftY, zCursor + tierH / 2);\n geos.push(cone);\n\n zCursor += step;\n }\n\n // Slender tip with slight lean.\n const tip = new ConeGeometry(0.08, 0.22, 6);\n tip.applyMatrix4(Y_TO_Z_UP);\n tip.translate((rng() - 0.5) * 0.08, (rng() - 0.5) * 0.08, zCursor + 0.05);\n geos.push(tip);\n\n const merged = mergeGeometries(geos);\n return extractMesh(merged);\n}\n\n/**\n * Unit oak canopy mesh: high-segment sphere, smooth pole, no shading stripe.\n *\n * IcosahedronGeometry (detail \u2265 1) always creates a single vertex at the\n * sphere's north pole via subdivision (normalized midpoint of the top edge),\n * giving 5 triangles meeting at the apex \u2014 the visible spike. Rotating the\n * icosahedron only moves WHICH original vertex becomes the apex; all 12 base\n * vertices are 5-connected, so the artifact persists.\n *\n * SphereGeometry(24, 16) places 24 tiny triangles at the pole instead of 5,\n * which is invisible at normal viewing distances. The earlier \"shading stripe\"\n * with the low-poly sphere (12 \u00D7 8 = 22.5\u00B0 bands) was coarse Gouraud banding,\n * not a UV-seam issue. At 24 \u00D7 16 (7.5\u00B0 bands) the shading is smooth.\n * Extends z = 0 (base) to z = 1 (top).\n */\nexport function createOakCanopyMesh(): TreeMesh {\n const geo = new SphereGeometry(0.5, 14, 10);\n jitterSmooth(geo, 0.18, 1);\n geo.applyMatrix4(Y_TO_Z_UP);\n geo.translate(0, 0, 0.5);\n return extractMesh(geo);\n}\n\n/**\n * Unit palm canopy mesh: a flat, wide disk crown typical of palm trees.\n * Extends from z=0 to z=0.35, radius=1.\n */\nexport function createPalmCanopyMesh(): TreeMesh {\n // Flattened sphere acting as a spread crown\n const geo = new SphereGeometry(0.7, 12, 5);\n jitterSmooth(geo, 0.1, 4);\n const flatten = new Matrix4().makeScale(1.4, 0.35, 1.4);\n geo.applyMatrix4(flatten);\n geo.applyMatrix4(Y_TO_Z_UP);\n geo.translate(0, 0, 0.18);\n return extractMesh(geo);\n}\n\n/**\n * Unit birch canopy mesh: a narrow oval / diamond shape.\n * Extends from z=0 to z=1, narrower than an oak.\n */\nexport function createBirchCanopyMesh(): TreeMesh {\n const geo = new SphereGeometry(0.42, 10, 8);\n jitterSmooth(geo, 0.14, 2);\n // Elongate vertically (Z after rotation)\n const elongate = new Matrix4().makeScale(1, 1.45, 1);\n geo.applyMatrix4(elongate);\n geo.applyMatrix4(Y_TO_Z_UP);\n geo.translate(0, 0, 0.5);\n return extractMesh(geo);\n}\n\n/**\n * Unit cherry canopy mesh: a full, round sphere slightly larger than oak.\n * Extends from z=0 to z=1.1 (slightly wider than tall for a lush look).\n */\nexport function createCherryCanopyMesh(): TreeMesh {\n const geo = new SphereGeometry(0.52, 12, 8);\n jitterSmooth(geo, 0.2, 3);\n geo.applyMatrix4(Y_TO_Z_UP);\n geo.translate(0, 0, 0.5);\n return extractMesh(geo);\n}\n\n/**\n * Unit crop sphere mesh for rendering individual fruits, nuts, or flowers.\n * Deliberately low-polygon (24 triangles) so hundreds of instances remain cheap.\n * Scale uniformly via getScale = [r, r, r] to set the world-space radius in metres.\n */\nexport function createCropMesh(): TreeMesh {\n const geo = new SphereGeometry(0.5, 6, 4);\n geo.applyMatrix4(Y_TO_Z_UP);\n geo.translate(0, 0, 0.5);\n return extractMesh(geo);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport type {TreeLayerProps, TreeType, Season, CropConfig} from './tree-layer/tree-layer';\nexport {TreeLayer} from './tree-layer/tree-layer';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {CompositeLayer} from '@deck.gl/core';\nimport type {Color, DefaultProps, LayerProps, Position} from '@deck.gl/core';\nimport {SimpleMeshLayer} from '@deck.gl/mesh-layers';\nimport {\n createTrunkMesh,\n createPineCanopyMesh,\n createOakCanopyMesh,\n createPalmCanopyMesh,\n createBirchCanopyMesh,\n createCherryCanopyMesh,\n createCropMesh\n} from './tree-geometry';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/** Tree species / silhouette variant. */\nexport type TreeType = 'pine' | 'oak' | 'palm' | 'birch' | 'cherry';\n\n/** Season that drives default canopy colour when no explicit colour is supplied. */\nexport type Season = 'spring' | 'summer' | 'autumn' | 'winter';\n\n/**\n * Crop configuration for a single tree.\n *\n * Pass this from `getCrop` to render small spherical crop points on the tree\n * and/or scattered on the ground around it. Works for fruit, nuts, or flowers\n * (flowering stage is expressed simply as a flower-coloured crop config).\n *\n * Positions are randomised deterministically from the tree's geographic\n * coordinates, so they are stable across re-renders.\n */\nexport type CropConfig = {\n /** Colour of each crop sphere [r, g, b, a]. */\n color: Color;\n /** Number of crop spheres placed in the outer canopy volume (live/in-tree crops). */\n count: number;\n /**\n * Number of crop spheres scattered on the ground within the canopy footprint\n * (dropped/fallen crops).\n * @default 0\n */\n droppedCount?: number;\n /** Radius of each individual crop sphere in metres. */\n radius: number;\n};\n\n// ---------------------------------------------------------------------------\n// Default colours\n// ---------------------------------------------------------------------------\n\n/** Default trunk colours per tree type [r, g, b, a]. */\nconst DEFAULT_TRUNK_COLORS: Record<TreeType, Color> = {\n pine: [80, 50, 20, 255],\n oak: [91, 57, 23, 255],\n palm: [140, 100, 55, 255],\n birch: [220, 215, 205, 255], // white-grey birch bark\n cherry: [100, 60, 40, 255]\n};\n\n/** Default canopy colours per (tree type, season) [r, g, b, a]. */\nconst DEFAULT_CANOPY_COLORS: Record<TreeType, Record<Season, Color>> = {\n pine: {\n spring: [34, 100, 34, 255],\n summer: [0, 64, 0, 255],\n autumn: [0, 64, 0, 255], // evergreen \u2014 no colour change\n winter: [0, 55, 0, 255]\n },\n oak: {\n spring: [100, 180, 80, 255],\n summer: [34, 120, 15, 255],\n autumn: [180, 85, 20, 255],\n winter: [100, 80, 60, 160] // sparse, semi-transparent\n },\n palm: {\n spring: [50, 160, 50, 255],\n summer: [20, 145, 20, 255],\n autumn: [55, 150, 30, 255],\n winter: [40, 130, 30, 255]\n },\n birch: {\n spring: [150, 210, 110, 255],\n summer: [80, 160, 60, 255],\n autumn: [230, 185, 40, 255],\n winter: [180, 180, 170, 90] // near-bare\n },\n cherry: {\n spring: [255, 180, 205, 255], // pink blossom\n summer: [50, 140, 50, 255],\n autumn: [200, 60, 40, 255],\n winter: [120, 90, 80, 110] // bare\n }\n};\n\n// ---------------------------------------------------------------------------\n// Pre-built unit-scale meshes (shared across all layer instances)\n// ---------------------------------------------------------------------------\n\nconst TRUNK_MESH = createTrunkMesh();\n\nconst CANOPY_MESHES: Record<TreeType, ReturnType<typeof createTrunkMesh>> = {\n pine: createPineCanopyMesh(3),\n oak: createOakCanopyMesh(),\n palm: createPalmCanopyMesh(),\n birch: createBirchCanopyMesh(),\n cherry: createCherryCanopyMesh()\n};\n\nconst CROP_MESH = createCropMesh();\n\nconst ALL_TREE_TYPES: TreeType[] = ['pine', 'oak', 'palm', 'birch', 'cherry'];\n\n/**\n * Fraction of canopy height by which the canopy mesh is lowered into the trunk.\n * Hides the trunk-top disk that would otherwise peek above the canopy base.\n * 0.22 means the canopy base sits 22% of canopy-height below the trunk top.\n */\nconst CANOPY_TRUNK_OVERLAP = 0.22;\n\n// ---------------------------------------------------------------------------\n// Crop helpers\n// ---------------------------------------------------------------------------\n\n/** splitmix32 \u2014 fast, high-quality seeded PRNG returning values in [0, 1). */\nfunction createRng(seed: number): () => number {\n let s = seed >>> 0;\n return (): number => {\n s = (s + 0x9e3779b9) | 0;\n let t = s ^ (s >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t ^= t >>> 15;\n t = Math.imul(t, 0x735a2d97);\n return ((t ^ (t >>> 15)) >>> 0) / 4294967296;\n };\n}\n\n/** Deterministic integer seed derived from a geographic position. */\nfunction positionSeed(lng: number, lat: number): number {\n return ((Math.round(lng * 10000) * 92821) ^ (Math.round(lat * 10000) * 65537)) >>> 0;\n}\n\nconst DEG_PER_METER_LAT = 1 / 111320;\n\nfunction lngDegreesPerMeter(latDeg: number): number {\n return 1 / (111320 * Math.cos((latDeg * Math.PI) / 180));\n}\n\n/** Internal flat record for a single rendered crop sphere. */\ntype CropPoint = {\n position: [number, number, number];\n color: Color;\n scale: number;\n};\n\n/**\n * Expand live crop positions so they straddle the canopy surface.\n *\n * The canopy mesh is a SphereGeometry(0.5, \u2026) which, after SimpleMeshLayer\n * applies getScale = [r, r, H], has a true XY radius of 0.5 * r and a true\n * Z half-height of 0.5 * H. Crops are placed at 85\u2013110 % of those real\n * dimensions so most of each sphere sits just outside the canopy surface.\n *\n * Positions are seeded from the tree's geographic coordinates so they are\n * stable across re-renders.\n */\nfunction expandLiveCropPoints(opts: {\n lng: number;\n lat: number;\n elevation: number;\n height: number;\n trunkFraction: number;\n canopyRadius: number;\n cropConfig: CropConfig;\n out: CropPoint[];\n}): void {\n const {lng, lat, elevation, height, trunkFraction, canopyRadius, cropConfig, out} = opts;\n if (cropConfig.count <= 0) return;\n\n // Actual canopy sphere radii after SimpleMeshLayer scaling.\n // SphereGeometry has unit radius 0.5, so world radius = 0.5 * getScale component.\n const rxy = canopyRadius * 0.5;\n const canopyH = height * (1 - trunkFraction);\n const rz = canopyH * 0.5;\n // Canopy position is lowered by CANOPY_TRUNK_OVERLAP to hide the trunk-top disk\n const canopyCenterZ = elevation + height * trunkFraction - canopyH * CANOPY_TRUNK_OVERLAP + rz;\n\n const dLng = lngDegreesPerMeter(lat);\n const rng = createRng(positionSeed(lng, lat));\n\n for (let i = 0; i < cropConfig.count; i++) {\n const theta = rng() * Math.PI * 2;\n // Exclude top and bottom caps so crops never crown the canopy or hang below.\n // cos(phi) in [-0.80, 0.80] \u2192 phi from ~37\u00B0 to ~143\u00B0 (equatorial band).\n const cosPhi = -0.8 + rng() * 1.6;\n const sinPhi = Math.sqrt(Math.max(0, 1 - cosPhi * cosPhi));\n // 90\u2013102 % of canopy radius: crops sit just at/inside the surface, tips barely poke out\n const radFrac = 0.9 + rng() * 0.12;\n\n const dx = rxy * radFrac * sinPhi * Math.cos(theta);\n const dy = rxy * radFrac * sinPhi * Math.sin(theta);\n const dz = rz * radFrac * cosPhi;\n\n out.push({\n position: [lng + dx * dLng, lat + dy * DEG_PER_METER_LAT, canopyCenterZ + dz],\n color: cropConfig.color,\n scale: cropConfig.radius\n });\n }\n}\n\n/**\n * Expand dropped crop positions uniformly across the ground disk within the\n * canopy footprint. Uses a separate seed offset from live crops so that\n * changing `count` does not affect dropped positions.\n */\nfunction expandDroppedCropPoints(opts: {\n lng: number;\n lat: number;\n elevation: number;\n canopyRadius: number;\n cropConfig: CropConfig;\n out: CropPoint[];\n}): void {\n const {lng, lat, elevation, canopyRadius, cropConfig, out} = opts;\n const droppedCount = cropConfig.droppedCount ?? 0;\n if (droppedCount <= 0) return;\n\n // Actual canopy footprint radius (see note in expandLiveCropPoints)\n const footprintRadius = canopyRadius * 0.5;\n const dLng = lngDegreesPerMeter(lat);\n // XOR with a constant so the dropped sequence is independent of the live one\n const rng = createRng(positionSeed(lng, lat) ^ 0x1a2b3c4d);\n\n // Dropped crops are semi-transparent so they read as fallen/decaying\n const c = cropConfig.color as unknown as number[];\n const droppedColor: Color = [\n c[0],\n c[1],\n c[2],\n Math.round((c[3] ?? 255) * 0.45)\n ] as unknown as Color;\n\n for (let i = 0; i < droppedCount; i++) {\n const theta = rng() * Math.PI * 2;\n // sqrt for uniform-area disk sampling\n const dist = Math.sqrt(rng()) * footprintRadius;\n\n const dx = dist * Math.cos(theta);\n const dy = dist * Math.sin(theta);\n\n out.push({\n position: [lng + dx * dLng, lat + dy * DEG_PER_METER_LAT, elevation + 0.05],\n color: droppedColor,\n scale: cropConfig.radius\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\ntype _TreeLayerProps<DataT> = {\n /** Source data. */\n data: DataT[];\n\n /** Longitude/latitude position of the tree base. */\n getPosition?: (d: DataT) => Position;\n\n /** Base elevation (metres above sea level). @default 0 */\n getElevation?: (d: DataT) => number;\n\n /**\n * Silhouette / species variant.\n * 'pine' \u2013 layered conical tiers (evergreen)\n * 'oak' \u2013 wide spherical canopy\n * 'palm' \u2013 tall thin trunk with flat crown\n * 'birch' \u2013 narrow oval canopy, pale bark\n * 'cherry' \u2013 round lush canopy, seasonal blossom\n * @default 'pine'\n */\n getTreeType?: (d: DataT) => TreeType;\n\n /**\n * Total tree height in metres.\n * @default 10\n */\n getHeight?: (d: DataT) => number;\n\n /**\n * Fraction of total height occupied by the trunk (0\u20131).\n * @default 0.35\n */\n getTrunkHeightFraction?: (d: DataT) => number;\n\n /**\n * Trunk base radius in metres.\n * @default 0.5\n */\n getTrunkRadius?: (d: DataT) => number;\n\n /**\n * Horizontal radius of the canopy in metres.\n * @default 3\n */\n getCanopyRadius?: (d: DataT) => number;\n\n /**\n * Explicit trunk colour [r, g, b, a].\n * When null the species default is used.\n * @default null\n */\n getTrunkColor?: (d: DataT) => Color | null;\n\n /**\n * Explicit canopy colour [r, g, b, a].\n * When null the species \u00D7 season default is used.\n * @default null\n */\n getCanopyColor?: (d: DataT) => Color | null;\n\n /**\n * Season used to pick the default canopy colour when no explicit colour is provided.\n * @default 'summer'\n */\n getSeason?: (d: DataT) => Season;\n\n /**\n * Number of cone tiers for pine trees (1\u20135).\n * Higher values produce a denser layered silhouette.\n * @default 3\n */\n getBranchLevels?: (d: DataT) => number;\n\n /**\n * Optional crop configuration for this tree.\n *\n * Return a `CropConfig` to render small spherical crop points in the outer\n * canopy volume (live crops) and/or scattered on the ground around the trunk\n * (dropped crops). Return `null` to show no crops for this tree.\n *\n * The same accessor can express fruit, nuts, or flowering stage \u2014 pass\n * flower-coloured points (e.g. `[255, 200, 220, 255]`) for a blossom effect.\n *\n * Crop positions are randomised deterministically from the tree's geographic\n * coordinates; they are stable across re-renders.\n *\n * @default null (no crops)\n */\n getCrop?: (d: DataT) => CropConfig | null;\n\n /**\n * Global size multiplier applied to all dimensions.\n * @default 1\n */\n sizeScale?: number;\n};\n\nexport type TreeLayerProps<DataT = unknown> = _TreeLayerProps<DataT> & LayerProps;\n\nconst defaultProps: DefaultProps<TreeLayerProps<unknown>> = {\n getPosition: {type: 'accessor', value: (d: any) => d.position},\n getElevation: {type: 'accessor', value: (_d: any) => 0},\n getTreeType: {type: 'accessor', value: (_d: any) => 'pine' as TreeType},\n getHeight: {type: 'accessor', value: (_d: any) => 10},\n getTrunkHeightFraction: {type: 'accessor', value: (_d: any) => 0.35},\n getTrunkRadius: {type: 'accessor', value: (_d: any) => 0.5},\n getCanopyRadius: {type: 'accessor', value: (_d: any) => 3},\n getTrunkColor: {type: 'accessor', value: (_d: any) => null},\n getCanopyColor: {type: 'accessor', value: (_d: any) => null},\n getSeason: {type: 'accessor', value: (_d: any) => 'summer' as Season},\n getBranchLevels: {type: 'accessor', value: (_d: any) => 3},\n getCrop: {type: 'accessor', value: (_d: any) => null},\n sizeScale: {type: 'number', value: 1, min: 0}\n};\n\n// ---------------------------------------------------------------------------\n// State\n// ---------------------------------------------------------------------------\n\ntype TreeLayerState = {\n grouped: Record<TreeType, unknown[]>;\n pineMeshes: Record<number, ReturnType<typeof createPineCanopyMesh>>;\n liveCropPoints: CropPoint[];\n droppedCropPoints: CropPoint[];\n};\n\n// ---------------------------------------------------------------------------\n// Layer\n// ---------------------------------------------------------------------------\n\n/**\n * **TreeLayer** \u2014 A parametric, Three.js-powered deck.gl layer that renders\n * richly configurable 3D trees at geographic positions.\n *\n * Each tree is composed of two `SimpleMeshLayer` instances: one for the trunk\n * (a tapered cylinder) and one for the canopy (silhouette depends on `getTreeType`).\n * All geometry is generated procedurally using Three.js `BufferGeometry` primitives\n * and converted to the `@loaders.gl/schema` `MeshGeometry` format accepted by\n * `SimpleMeshLayer`.\n *\n * Parametric controls include:\n * - Species / silhouette (`getTreeType`)\n * - Total height (`getHeight`) and trunk-to-canopy proportion (`getTrunkHeightFraction`)\n * - Trunk and canopy radii (`getTrunkRadius`, `getCanopyRadius`)\n * - Explicit or season-driven colours (`getTrunkColor`, `getCanopyColor`, `getSeason`)\n * - Pine tier density (`getBranchLevels`)\n * - Crop / fruit / flower visualisation (`getCrop`)\n * - Global scale factor (`sizeScale`)\n */\nexport class TreeLayer<DataT = unknown, ExtraPropsT extends {} = {}> extends CompositeLayer<\n ExtraPropsT & Required<_TreeLayerProps<DataT>>\n> {\n static layerName = 'TreeLayer';\n static defaultProps = defaultProps;\n\n declare state: TreeLayerState;\n\n initializeState() {\n this.state = {\n grouped: {pine: [], oak: [], palm: [], birch: [], cherry: []},\n pineMeshes: {},\n liveCropPoints: [],\n droppedCropPoints: []\n };\n }\n\n updateState({props, oldProps, changeFlags}) {\n if (changeFlags.dataChanged || changeFlags.propsChanged || changeFlags.updateTriggersChanged) {\n const {\n data,\n getTreeType,\n getBranchLevels,\n getCrop,\n getPosition,\n getElevation,\n getHeight,\n getTrunkHeightFraction,\n getCanopyRadius,\n sizeScale\n } = props;\n\n const grouped: Record<TreeType, DataT[]> = {\n pine: [],\n oak: [],\n palm: [],\n birch: [],\n cherry: []\n };\n\n const pineMeshes: Record<number, ReturnType<typeof createPineCanopyMesh>> = {};\n const liveCropPoints: CropPoint[] = [];\n const droppedCropPoints: CropPoint[] = [];\n\n for (const d of data as DataT[]) {\n const type = getTreeType(d) as TreeType;\n if (grouped[type]) grouped[type].push(d);\n\n if (type === 'pine') {\n const levels = Math.max(1, Math.min(5, Math.round(getBranchLevels(d) as number)));\n pineMeshes[levels] ??= createPineCanopyMesh(levels);\n }\n\n const cropConfig = getCrop(d);\n if (cropConfig) {\n const pos = getPosition(d);\n const lng = pos[0];\n const lat = pos[1];\n const elev = getElevation(d) || 0;\n const h = getHeight(d) * sizeScale;\n const f = getTrunkHeightFraction(d);\n const r = getCanopyRadius(d) * sizeScale;\n\n // Scale crop radius in lock-step with all other dimensions\n const scaledCropConfig: CropConfig = {\n ...cropConfig,\n radius: cropConfig.radius * sizeScale\n };\n expandLiveCropPoints({\n lng,\n lat,\n elevation: elev,\n height: h,\n trunkFraction: f,\n canopyRadius: r,\n cropConfig: scaledCropConfig,\n out: liveCropPoints\n });\n expandDroppedCropPoints({\n lng,\n lat,\n elevation: elev,\n canopyRadius: r,\n cropConfig: scaledCropConfig,\n out: droppedCropPoints\n });\n }\n }\n\n this.setState({grouped, pineMeshes, liveCropPoints, droppedCropPoints});\n }\n }\n\n /**\n * Build a single canopy sub-layer.\n *\n * Takes explicit `mesh`, `data`, and `layerId` so that pine trees can be\n * split into one sub-layer per level count (each with its own mesh).\n */\n private _buildCanopyLayer(\n type: TreeType,\n mesh: ReturnType<typeof createTrunkMesh>,\n data: unknown[],\n layerId: string\n ): SimpleMeshLayer {\n const {\n getPosition,\n getElevation,\n getHeight,\n getTrunkHeightFraction,\n getCanopyRadius,\n getCanopyColor,\n getSeason,\n sizeScale\n } = this.props;\n\n return new SimpleMeshLayer(\n this.getSubLayerProps({\n id: layerId,\n data,\n mesh,\n getPosition: (d) => {\n const pos = getPosition(d);\n const elevation = getElevation(d) || 0;\n const h = getHeight(d) * sizeScale;\n const f = getTrunkHeightFraction(d);\n const canopyH = h * (1 - f);\n return [pos[0], pos[1], elevation + h * f - canopyH * CANOPY_TRUNK_OVERLAP];\n },\n getScale: (d) => {\n const pos = getPosition(d);\n const h = getHeight(d) * sizeScale;\n const f = getTrunkHeightFraction(d);\n const r = getCanopyRadius(d) * sizeScale;\n // Per-tree asymmetric XY scale from position hash \u2014 no two canopies\n // are the same oval, giving organic variety with zero extra draw calls.\n const seed = positionSeed(pos[0], pos[1]);\n const sx = 1 + ((seed & 0xffff) / 65535 - 0.5) * 0.6;\n const sy = 1 + (((seed >>> 16) & 0xffff) / 65535 - 0.5) * 0.6;\n return [r * sx, r * sy, h * (1 - f)];\n },\n getOrientation: (d) => {\n // Random bearing + slight pitch per tree so spherical canopies show\n // visible lean variety at typical farm viewing angles (30\u201360\u00B0 pitch).\n // pitch [0]: \u00B112\u00B0, yaw [1]: full 360\u00B0, roll [2]: 0\n const pos = getPosition(d);\n const seed = positionSeed(pos[0], pos[1]);\n const yaw = (((seed ^ (seed >>> 13)) & 0xffff) / 65535) * 360;\n const pitch = (((seed ^ (seed >>> 7)) & 0xff) / 255 - 0.5) * 24;\n return [pitch, yaw, 0];\n },\n getColor: (d) => {\n const explicit = getCanopyColor(d);\n if (explicit) return explicit;\n const season = getSeason(d) || 'summer';\n return DEFAULT_CANOPY_COLORS[type][season];\n },\n pickable: this.props.pickable,\n material: {ambient: 0.55, diffuse: 0.55, shininess: 0},\n updateTriggers: {\n getPosition: sizeScale,\n getScale: sizeScale,\n getOrientation: sizeScale\n }\n })\n );\n }\n\n renderLayers() {\n const {\n getPosition,\n getElevation,\n getTreeType,\n getHeight,\n getTrunkHeightFraction,\n getTrunkRadius,\n getTrunkColor,\n getBranchLevels,\n sizeScale\n } = this.props;\n\n const {grouped, pineMeshes, liveCropPoints, droppedCropPoints} = this.state;\n\n // -----------------------------------------------------------------------\n // 1. Trunk layer \u2014 one layer for ALL tree types, shared cylinder geometry\n // -----------------------------------------------------------------------\n const trunkLayer = new SimpleMeshLayer(\n this.getSubLayerProps({\n id: 'trunks',\n data: this.props.data,\n mesh: TRUNK_MESH,\n getPosition: (d) => {\n const pos = getPosition(d);\n return [pos[0], pos[1], getElevation(d) || 0];\n },\n getScale: (d) => {\n const h = getHeight(d) * sizeScale;\n const f = getTrunkHeightFraction(d);\n const r = getTrunkRadius(d) * sizeScale;\n return [r, r, h * f];\n },\n getColor: (d) => {\n const explicit = getTrunkColor(d);\n if (explicit) return explicit;\n const type = getTreeType(d) || 'pine';\n return DEFAULT_TRUNK_COLORS[type] ?? DEFAULT_TRUNK_COLORS.pine;\n },\n pickable: this.props.pickable,\n material: {ambient: 0.45, diffuse: 0.55, shininess: 4},\n updateTriggers: {getScale: sizeScale}\n })\n );\n\n // -----------------------------------------------------------------------\n // 2. Canopy layers\n // Non-pine: one sub-layer per species.\n // Pine: one sub-layer per branch-level count, each using its own mesh,\n // so trees with 2/3/4 tiers never share a mismatched mesh.\n // -----------------------------------------------------------------------\n const nonPineCanopies = ALL_TREE_TYPES.filter((t) => t !== 'pine' && grouped[t].length > 0).map(\n (t) => this._buildCanopyLayer(t, CANOPY_MESHES[t], grouped[t], `canopy-${t}`)\n );\n\n const pineCanopies = Object.entries(pineMeshes).flatMap(([levelStr, mesh]) => {\n const levels = Number(levelStr);\n const pineData = grouped.pine.filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (d) => Math.max(1, Math.min(5, Math.round(getBranchLevels(d as any)))) === levels\n );\n return pineData.length > 0\n ? [this._buildCanopyLayer('pine', mesh, pineData, `canopy-pine-${levels}`)]\n : [];\n });\n\n const canopyLayers = [...nonPineCanopies, ...pineCanopies];\n\n // -----------------------------------------------------------------------\n // 3. Crop layers \u2014 live (in canopy) and dropped (on ground)\n // -----------------------------------------------------------------------\n const cropLayers = [];\n\n if (liveCropPoints.length > 0) {\n cropLayers.push(\n new SimpleMeshLayer(\n this.getSubLayerProps({\n id: 'live-crops',\n data: liveCropPoints,\n mesh: CROP_MESH,\n getPosition: (d: CropPoint) => d.position,\n getScale: (d: CropPoint) => [d.scale, d.scale, d.scale],\n getColor: (d: CropPoint) => d.color,\n pickable: false,\n material: {ambient: 0.5, diffuse: 0.8, shininess: 40}\n })\n )\n );\n }\n\n if (droppedCropPoints.length > 0) {\n cropLayers.push(\n new SimpleMeshLayer(\n this.getSubLayerProps({\n id: 'dropped-crops',\n data: droppedCropPoints,\n mesh: CROP_MESH,\n getPosition: (d: CropPoint) => d.position,\n getScale: (d: CropPoint) => [d.scale, d.scale, d.scale],\n getColor: (d: CropPoint) => d.color,\n pickable: false,\n material: {ambient: 0.6, diffuse: 0.5, shininess: 10}\n })\n )\n );\n }\n\n return [trunkLayer, ...canopyLayers, ...cropLayers];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n BufferGeometry,\n BufferAttribute,\n CylinderGeometry,\n ConeGeometry,\n SphereGeometry,\n IcosahedronGeometry,\n Matrix4\n} from 'three';\n\n/**\n * Mesh format compatible with deck.gl SimpleMeshLayer.\n * All geometries are Z-up (deck.gl convention), unit scale (0..1 in Z = bottom to top).\n */\nexport type TreeMesh = {\n attributes: {\n POSITION: {value: Float32Array; size: 3};\n NORMAL: {value: Float32Array; size: 3};\n };\n indices: {value: Uint32Array; size: 1};\n topology: 'triangle-list';\n mode: 4;\n};\n\n/**\n * Rotation matrix that converts from Three.js Y-up to deck.gl Z-up.\n * Rotates -90 degrees around the X axis: Y -> Z, Z -> -Y.\n */\nconst Y_TO_Z_UP = new Matrix4().makeRotationX(-Math.PI / 2);\n\n/**\n * Perturb each vertex radially using a sum of low-frequency sinusoidal waves\n * evaluated at the vertex's surface direction. Adjacent vertices receive\n * smoothly-varying displacements so there are no gaps or cracks in the mesh.\n * Applied once at module init \u2014 zero runtime cost.\n *\n * @param geo Three.js BufferGeometry to modify in-place (before Y_TO_Z_UP rotation)\n * @param magnitude Fractional displacement amplitude, e.g. 0.15 = \u00B115 % of radius\n * @param seed Integer seed \u2014 each species gets a distinct blob shape\n */\nfunction jitterSmooth(geo: BufferGeometry, magnitude: number, seed: number): void {\n let s = seed >>> 0;\n const rng = () => {\n s = (s + 0x9e3779b9) | 0;\n let t = s ^ (s >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t ^= t >>> 15;\n t = Math.imul(t, 0x735a2d97);\n return ((t ^ (t >>> 15)) >>> 0) / 4294967296;\n };\n // 4 low-frequency waves (2\u20135 bumps across the sphere) \u2014 smooth, no cracks\n const waves = Array.from({length: 4}, () => ({\n fx: 2 + rng() * 3,\n fy: 2 + rng() * 3,\n fz: 2 + rng() * 3,\n phase: rng() * Math.PI * 2\n }));\n\n const pos = geo.attributes.position.array as Float32Array;\n for (let i = 0; i < pos.length; i += 3) {\n const x = pos[i];\n const y = pos[i + 1];\n const z = pos[i + 2];\n const r = Math.sqrt(x * x + y * y + z * z);\n if (r !== 0) {\n const nx = x / r;\n const ny = y / r;\n const nz = z / r;\n let noise = 0;\n for (const w of waves) {\n noise += Math.sin(nx * w.fx + ny * w.fy + nz * w.fz + w.phase);\n }\n noise /= 4; // normalise to ~ [-1, 1]\n const scale = 1 + noise * magnitude;\n pos[i] = x * scale;\n pos[i + 1] = y * scale;\n pos[i + 2] = z * scale;\n }\n }\n}\n\n/**\n * Extract a TreeMesh from a Three.js BufferGeometry.\n * Assumes the geometry has already been rotated to Z-up.\n */\nfunction extractMesh(geo: BufferGeometry): TreeMesh {\n geo.computeVertexNormals();\n const posAttr = geo.attributes.position as BufferAttribute;\n const norAttr = geo.attributes.normal as BufferAttribute;\n const idx = geo.index;\n\n return {\n attributes: {\n POSITION: {value: new Float32Array(posAttr.array), size: 3},\n NORMAL: {value: new Float32Array(norAttr.array), size: 3}\n },\n indices: {value: new Uint32Array(idx ? idx.array : new Uint32Array(0)), size: 1},\n topology: 'triangle-list',\n mode: 4\n };\n}\n\n/** Copy indices for one geometry slice, offsetting by the current vertex base. */\nfunction copyIndices(\n out: Uint32Array,\n outOffset: number,\n geo: BufferGeometry,\n vertexBase: number\n): number {\n if (geo.index) {\n const src = geo.index.array;\n for (let i = 0; i < src.length; i++) out[outOffset + i] = src[i] + vertexBase;\n return src.length;\n }\n const count = geo.attributes.position.count;\n for (let i = 0; i < count; i++) out[outOffset + i] = vertexBase + i;\n return count;\n}\n\n/**\n * Merge multiple Three.js BufferGeometries into a single geometry.\n * All input geometries must be indexed.\n */\nfunction mergeGeometries(geos: BufferGeometry[]): BufferGeometry {\n let totalVertices = 0;\n let totalIndices = 0;\n for (const geo of geos) {\n totalVertices += geo.attributes.position.count;\n totalIndices += geo.index ? geo.index.count : geo.attributes.position.count;\n }\n\n const positions = new Float32Array(totalVertices * 3);\n const normals = new Float32Array(totalVertices * 3);\n const indices = new Uint32Array(totalIndices);\n let vOffset = 0;\n let iOffset = 0;\n\n for (const geo of geos) {\n const count = geo.attributes.position.count;\n const srcNor = geo.attributes.normal ? (geo.attributes.normal.array as Float32Array) : null;\n positions.set(geo.attributes.position.array as Float32Array, vOffset * 3);\n if (srcNor) normals.set(srcNor, vOffset * 3);\n iOffset += copyIndices(indices, iOffset, geo, vOffset);\n vOffset += count;\n }\n\n const merged = new BufferGeometry();\n merged.setAttribute('position', new BufferAttribute(positions, 3));\n merged.setAttribute('normal', new BufferAttribute(normals, 3));\n merged.setIndex(new BufferAttribute(indices, 1));\n return merged;\n}\n\n/**\n * Unit trunk cylinder mesh: from z=0 (base) to z=1 (top), radius tapers from 1 to 0.7.\n * Scale via `getScale = [trunkRadius, trunkRadius, trunkHeight]`.\n */\nexport function createTrunkMesh(segments = 8): TreeMesh {\n const geo = new CylinderGeometry(0.7, 1.0, 1.0, segments);\n // Three.js CylinderGeometry is centered at origin, extends from y=-0.5 to y=0.5\n geo.applyMatrix4(Y_TO_Z_UP); // Rotate to Z-up: now z=-0.5 to z=0.5\n geo.translate(0, 0, 0.5); // Shift so base is at z=0, top at z=1\n return extractMesh(geo);\n}\n\n/**\n * Unit pine canopy mesh: multiple tiered cones creating a Christmas tree silhouette.\n * Extends from z=0 (base of canopy) to z=1 (tip).\n *\n * @param levels - number of cone tiers (1-5)\n * @param segments - polygon segments per cone\n */\nexport function createPineCanopyMesh(levels = 3, segments = 8): TreeMesh {\n const geos: BufferGeometry[] = [];\n\n // Deterministic per-levels RNG so each level count gets its own organic shape.\n let s = (levels * 2654435761) >>> 0;\n const rng = () => {\n s = (s + 0x9e3779b9) | 0;\n let t = s ^ (s >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t ^= t >>> 15;\n t = Math.imul(t, 0x735a2d97);\n return ((t ^ (t >>> 15)) >>> 0) / 4294967296;\n };\n\n // Base tier height for 50 % overlap filling z = 0..0.8.\n const tierHeight = 1.6 / (levels + 1);\n const step = tierHeight / 2;\n\n let zCursor = 0;\n for (let i = 0; i < levels; i++) {\n const t = i / (levels - 1 || 1);\n\n // Width narrows toward the top; each tier gets \u00B120 % random variation.\n const baseRadius = (1 - t * 0.5) * 0.85;\n const radius = baseRadius * (0.8 + rng() * 0.4);\n\n // Height varies \u00B115 % per tier for uneven silhouette.\n const tierH = tierHeight * (0.85 + rng() * 0.3);\n\n const cone = new ConeGeometry(radius, tierH, segments);\n cone.applyMatrix4(Y_TO_Z_UP);\n\n // Drift increases from 0 at the bottom tier to \u00B10.10 at the top tier.\n // Bottom tier stays centred so it always connects cleanly to the trunk.\n const driftScale = levels > 1 ? i / (levels - 1) : 0;\n const driftX = (rng() - 0.5) * 0.2 * driftScale;\n const driftY = (rng() - 0.5) * 0.2 * driftScale;\n cone.translate(driftX, driftY, zCursor + tierH / 2);\n geos.push(cone);\n\n zCursor += step;\n }\n\n // Slender tip with slight lean.\n const tip = new ConeGeometry(0.08, 0.22, 6);\n tip.applyMatrix4(Y_TO_Z_UP);\n tip.translate((rng() - 0.5) * 0.08, (rng() - 0.5) * 0.08, zCursor + 0.05);\n geos.push(tip);\n\n const merged = mergeGeometries(geos);\n return extractMesh(merged);\n}\n\n/**\n * Unit oak canopy mesh: high-segment sphere, smooth pole, no shading stripe.\n *\n * IcosahedronGeometry (detail \u2265 1) always creates a single vertex at the\n * sphere's north pole via subdivision (normalized midpoint of the top edge),\n * giving 5 triangles meeting at the apex \u2014 the visible spike. Rotating the\n * icosahedron only moves WHICH original vertex becomes the apex; all 12 base\n * vertices are 5-connected, so the artifact persists.\n *\n * SphereGeometry(24, 16) places 24 tiny triangles at the pole instead of 5,\n * which is invisible at normal viewing distances. The earlier \"shading stripe\"\n * with the low-poly sphere (12 \u00D7 8 = 22.5\u00B0 bands) was coarse Gouraud banding,\n * not a UV-seam issue. At 24 \u00D7 16 (7.5\u00B0 bands) the shading is smooth.\n * Extends z = 0 (base) to z = 1 (top).\n */\nexport function createOakCanopyMesh(): TreeMesh {\n const geo = new SphereGeometry(0.5, 14, 10);\n jitterSmooth(geo, 0.18, 1);\n geo.applyMatrix4(Y_TO_Z_UP);\n geo.translate(0, 0, 0.5);\n return extractMesh(geo);\n}\n\n/**\n * Unit palm canopy mesh: a flat, wide disk crown typical of palm trees.\n * Extends from z=0 to z=0.35, radius=1.\n */\nexport function createPalmCanopyMesh(): TreeMesh {\n // Flattened sphere acting as a spread crown\n const geo = new SphereGeometry(0.7, 12, 5);\n jitterSmooth(geo, 0.1, 4);\n const flatten = new Matrix4().makeScale(1.4, 0.35, 1.4);\n geo.applyMatrix4(flatten);\n geo.applyMatrix4(Y_TO_Z_UP);\n geo.translate(0, 0, 0.18);\n return extractMesh(geo);\n}\n\n/**\n * Unit birch canopy mesh: a narrow oval / diamond shape.\n * Extends from z=0 to z=1, narrower than an oak.\n */\nexport function createBirchCanopyMesh(): TreeMesh {\n const geo = new SphereGeometry(0.42, 10, 8);\n jitterSmooth(geo, 0.14, 2);\n // Elongate vertically (Z after rotation)\n const elongate = new Matrix4().makeScale(1, 1.45, 1);\n geo.applyMatrix4(elongate);\n geo.applyMatrix4(Y_TO_Z_UP);\n geo.translate(0, 0, 0.5);\n return extractMesh(geo);\n}\n\n/**\n * Unit cherry canopy mesh: a full, round sphere slightly larger than oak.\n * Extends from z=0 to z=1.1 (slightly wider than tall for a lush look).\n */\nexport function createCherryCanopyMesh(): TreeMesh {\n const geo = new SphereGeometry(0.52, 12, 8);\n jitterSmooth(geo, 0.2, 3);\n geo.applyMatrix4(Y_TO_Z_UP);\n geo.translate(0, 0, 0.5);\n return extractMesh(geo);\n}\n\n/**\n * Unit crop sphere mesh for rendering individual fruits, nuts, or flowers.\n * Deliberately low-polygon (24 triangles) so hundreds of instances remain cheap.\n * Scale uniformly via getScale = [r, r, r] to set the world-space radius in metres.\n */\nexport function createCropMesh(): TreeMesh {\n const geo = new SphereGeometry(0.5, 6, 4);\n geo.applyMatrix4(Y_TO_Z_UP);\n geo.translate(0, 0, 0.5);\n return extractMesh(geo);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-layer.d.ts","sourceRoot":"","sources":["../../src/tree-layer/tree-layer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAE7E,OAAO,EAEL,oBAAoB,EAMrB,2BAAwB;AAMzB,yCAAyC;AACzC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpE,oFAAoF;AACpF,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/D;;;;;;;;;GASG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,+CAA+C;IAC/C,KAAK,EAAE,KAAK,CAAC;IACb,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAsGF,8DAA8D;AAC9D,KAAK,SAAS,GAAG;IACf,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;
|
|
1
|
+
{"version":3,"file":"tree-layer.d.ts","sourceRoot":"","sources":["../../src/tree-layer/tree-layer.ts"],"names":[],"mappings":"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"}
|
|
@@ -149,7 +149,12 @@ function expandDroppedCropPoints(opts) {
|
|
|
149
149
|
const rng = createRng(positionSeed(lng, lat) ^ 0x1a2b3c4d);
|
|
150
150
|
// Dropped crops are semi-transparent so they read as fallen/decaying
|
|
151
151
|
const c = cropConfig.color;
|
|
152
|
-
const droppedColor = [
|
|
152
|
+
const droppedColor = [
|
|
153
|
+
c[0],
|
|
154
|
+
c[1],
|
|
155
|
+
c[2],
|
|
156
|
+
Math.round((c[3] ?? 255) * 0.45)
|
|
157
|
+
];
|
|
153
158
|
for (let i = 0; i < droppedCount; i++) {
|
|
154
159
|
const theta = rng() * Math.PI * 2;
|
|
155
160
|
// sqrt for uniform-area disk sampling
|
|
@@ -297,19 +302,19 @@ export class TreeLayer extends CompositeLayer {
|
|
|
297
302
|
// Per-tree asymmetric XY scale from position hash — no two canopies
|
|
298
303
|
// are the same oval, giving organic variety with zero extra draw calls.
|
|
299
304
|
const seed = positionSeed(pos[0], pos[1]);
|
|
300
|
-
const sx = 1 + ((seed & 0xffff) / 65535 - 0.5) * 0.
|
|
301
|
-
const sy = 1 + (((seed >>> 16) & 0xffff) / 65535 - 0.5) * 0.
|
|
305
|
+
const sx = 1 + ((seed & 0xffff) / 65535 - 0.5) * 0.6;
|
|
306
|
+
const sy = 1 + (((seed >>> 16) & 0xffff) / 65535 - 0.5) * 0.6;
|
|
302
307
|
return [r * sx, r * sy, h * (1 - f)];
|
|
303
308
|
},
|
|
304
309
|
getOrientation: (d) => {
|
|
305
|
-
// Random bearing
|
|
306
|
-
//
|
|
307
|
-
//
|
|
308
|
-
// a unique silhouette from every viewing angle.
|
|
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
|
|
309
313
|
const pos = getPosition(d);
|
|
310
314
|
const seed = positionSeed(pos[0], pos[1]);
|
|
311
|
-
const
|
|
312
|
-
|
|
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];
|
|
313
318
|
},
|
|
314
319
|
getColor: (d) => {
|
|
315
320
|
const explicit = getCanopyColor(d);
|
|
@@ -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.1-alpha.0",
|
|
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": "dd572a3491cb15a6ff2f0008e93ae1dc38962b06"
|
|
46
46
|
}
|
|
@@ -237,8 +237,13 @@ function expandDroppedCropPoints(opts: {
|
|
|
237
237
|
const rng = createRng(positionSeed(lng, lat) ^ 0x1a2b3c4d);
|
|
238
238
|
|
|
239
239
|
// Dropped crops are semi-transparent so they read as fallen/decaying
|
|
240
|
-
const c = cropConfig.color as number[];
|
|
241
|
-
const droppedColor: Color = [
|
|
240
|
+
const c = cropConfig.color as unknown as number[];
|
|
241
|
+
const droppedColor: Color = [
|
|
242
|
+
c[0],
|
|
243
|
+
c[1],
|
|
244
|
+
c[2],
|
|
245
|
+
Math.round((c[3] ?? 255) * 0.45)
|
|
246
|
+
] as unknown as Color;
|
|
242
247
|
|
|
243
248
|
for (let i = 0; i < droppedCount; i++) {
|
|
244
249
|
const theta = rng() * Math.PI * 2;
|
|
@@ -545,19 +550,19 @@ export class TreeLayer<DataT = unknown, ExtraPropsT extends {} = {}> extends Com
|
|
|
545
550
|
// Per-tree asymmetric XY scale from position hash — no two canopies
|
|
546
551
|
// are the same oval, giving organic variety with zero extra draw calls.
|
|
547
552
|
const seed = positionSeed(pos[0], pos[1]);
|
|
548
|
-
const sx = 1 + ((seed & 0xffff) / 65535 - 0.5) * 0.
|
|
549
|
-
const sy = 1 + (((seed >>> 16) & 0xffff) / 65535 - 0.5) * 0.
|
|
553
|
+
const sx = 1 + ((seed & 0xffff) / 65535 - 0.5) * 0.6;
|
|
554
|
+
const sy = 1 + (((seed >>> 16) & 0xffff) / 65535 - 0.5) * 0.6;
|
|
550
555
|
return [r * sx, r * sy, h * (1 - f)];
|
|
551
556
|
},
|
|
552
557
|
getOrientation: (d) => {
|
|
553
|
-
// Random bearing
|
|
554
|
-
//
|
|
555
|
-
//
|
|
556
|
-
// a unique silhouette from every viewing angle.
|
|
558
|
+
// Random bearing + slight pitch per tree so spherical canopies show
|
|
559
|
+
// visible lean variety at typical farm viewing angles (30–60° pitch).
|
|
560
|
+
// pitch [0]: ±12°, yaw [1]: full 360°, roll [2]: 0
|
|
557
561
|
const pos = getPosition(d);
|
|
558
562
|
const seed = positionSeed(pos[0], pos[1]);
|
|
559
|
-
const
|
|
560
|
-
|
|
563
|
+
const yaw = (((seed ^ (seed >>> 13)) & 0xffff) / 65535) * 360;
|
|
564
|
+
const pitch = (((seed ^ (seed >>> 7)) & 0xff) / 255 - 0.5) * 24;
|
|
565
|
+
return [pitch, yaw, 0];
|
|
561
566
|
},
|
|
562
567
|
getColor: (d) => {
|
|
563
568
|
const explicit = getCanopyColor(d);
|